Transaction executed successfully
Transaction Details
Inspect execution, participants, message data, gas usage, events and raw transaction data.
Transaction hash
55D65903471869417E1D53D3B7F1B31E150C525314E56EF9D6B0CDF715DD0057
Transaction overview
Execution summary
TX INDEX
0
Position in block
GAS WANTED
350,000,000
Requested gas limit
GAS USED
131,948,007
Gas consumed
FEE
2000000ugnot
Transaction fee
Participants
Message
Message #1
m_addpkg
Arguments
g1n4pl5uc4yt5r96m9w6fmdznx3x0jyg8l6arhmt50000000ugnot
Execution log
msg:0,success:true,log:,events:[]
Events
No events emitted by this transaction.
Raw encoded transaction
CvSaBgoML3ZtLm1fYWRkcGtnEuKaBgooZzFuNHBsNXVjNHl0NXI5Nm05dzZmbWR6bngzeDBqeWc4bDZhcmhtdBKlmgYKA3BhZBI9Z25vLmxhbmQvci9nMW40cGw1dWM0eXQ1cjk2bTl3NmZtZHpueDN4MGp5ZzhsNmFyaG10L2dub21pL3BhZBpkCgtnbm9tb2QudG9tbBJVbW9kdWxlID0gImduby5sYW5kL3IvZzFuNHBsNXVjNHl0NXI5Nm05dzZmbWR6bngzeDBqeWc4bDZhcmhtdC9nbm9taS9wYWQiCmdubyA9ICIwLjkiChr4kwEKEGdub3N3YXBfbGlzdC5nbm8S4pMBcGFja2FnZSBwYWQNCg0KaW1wb3J0ICgNCgkiY2hhaW4iDQoJInN0cmNvbnYiDQoJInN0cmluZ3MiDQoJInRpbWUiDQoNCgkiZ25vLmxhbmQvcC9nbm9zd2FwL2NvbnN0cy92MSINCgl1MjU2ICJnbm8ubGFuZC9wL2dub3N3YXAvdWludDI1Ni92MSINCgkiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdCINCgkiZ25vLmxhbmQvci9nbm9zd2FwL2ducyINCglnbnNwb29sICJnbm8ubGFuZC9yL2dub3N3YXAvcG9vbCINCgkiZ25vLmxhbmQvci9nbm9zd2FwL3Bvc2l0aW9uIg0KCSJnbm8ubGFuZC9yL2dub3N3YXAvcm91dGVyIg0KKQ0KDQovLyBTYXBwaGlyZSBHbm9zd2FwIHJlZ2lzdHJ5IGtleXMgLyByb2xlIGFkZHJlc3NlcyAoc2FwcGhpcmUtMSkuDQpjb25zdCAoDQoJd3Vnbm90VG9rZW5LZXkgICAgICAgPSAiZ25vLmxhbmQvci9nbm9sYW5kL3d1Z25vdC53dWdub3QiDQoJZ25zVG9rZW5LZXkgICAgICAgICAgPSAiZ25vLmxhbmQvci9nbm9zd2FwL2ducy5HTlMiDQoJZ25vc3dhcFBvb2xBZGRyU3RyICAgPSAiZzFkZXhhZjZhcWtreXI5eWZ5OWQ1dXA2OWxzbjdyYTgwYWYzNGc1diINCglnbm9zd2FwUm91dGVyQWRkclN0ciA9ICJnMXZjODgzZ3NodTV6N3l0azVjZHluaGM4YzJkaDY3cGRwNGNzemtwIg0KKQ0KDQovLyBsaXN0RnVuZCB0cmFja3MgYXNzZXRzIHB1bGxlZCBmcm9tIHRoZSBsaXN0aW5nIGNhbGxlciBmb3IgcmVmdW5kIC8gTFAgdWdub3QgcmVpbWJ1cnNlLg0KdHlwZSBsaXN0RnVuZCBzdHJ1Y3Qgew0KCW9rICAgICAgICAgICAgICBib29sDQoJY2FsbGVyICAgICAgICAgIGFkZHJlc3MNCglwdWxsZWRMcFd1Z25vdCAgaW50NjQgLy8gcmVpbWJ1cnNlZCBhcyB1Z25vdCBhZnRlciBzdWNjZXNzZnVsIGxpc3QNCglwdWxsZWRGZWVXdWdub3QgaW50NjQgLy8gbGVmdG92ZXIgV1VHTk9UIHJlZnVuZGVkIGFmdGVyIGxpc3Q7IGZ1bGwgcmVmdW5kIG9uIGZhaWwNCglwdWxsZWRHbnMgICAgICAgaW50NjQgLy8gQ3JlYXRlUG9vbCBmZWU7IGNvbnN1bWVkIG9uIHN1Y2Nlc3MNCn0NCg0KLy8gdHJ5TGlzdE9uR25vc3dhcCBzZWVkcyBhIEdub3N3YXAgQ0wgcG9vbCB3aXRoIHJlbWFpbmluZyBtZW1lIHRva2VucyArIHJhaXNlZC1zaXplZA0KLy8gV1VHTk9UIGFzIExQLiBDcmVhdGVQb29sIGZlZSAoZml4ZWQgR05TIGFtb3VudCkgaXMgcGFpZCBmcm9tOg0KLy8gIDEpIHByZS1mdW5kZWQgR05TIG9uIHBhZCAocHJlZmVycmVkIC0gaW1tdW5lIHRvIEdOT1QvR05TIHByaWNlIG1vdmVzKSwgZWxzZQ0KLy8gIDIpIEV4YWN0T3V0IFdVR05PVC0+R05TIHVzaW5nIFNVUlBMVVMgaW52ZW50b3J5IG9ubHkgKGFib3ZlIHJhaXNlZCksIHNvIExQIGRlcHRoDQovLyAgICAgc3RheXMgZXF1YWwgdG8gcmFpc2VkIGV2ZW4gd2hlbiBHTlMgaXMgZXhwZW5zaXZlLg0KLy8NCi8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiBTb2Z0IGZhaWx1cmUgc2V0cyBsLkdub3N3YXBOb3RlIGFuZCByZXR1cm5zIGZhbHNlDQovLyAoY2FsbGVyIGtlZXBzIGludGVybmFsIENQTU0pLiBEb2VzIG5vdCBwdWxsIGZyb20gdXNlciAtIHNlZSBwcmVwYXJlQ2FsbGVyTGlzdEZ1bmRpbmcuDQpmdW5jIHRyeUxpc3RPbkdub3N3YXAoY3VyIHJlYWxtLCBsICpMYXVuY2gsIHJhaXNlZFVnbm90LCByZW1haW5pbmdUb2tlbnMgaW50NjQpIGJvb2wgew0KCWlmIHJhaXNlZFVnbm90IDw9IDAgfHwgcmVtYWluaW5nVG9rZW5zIDw9IDAgew0KCQlsLkdub3N3YXBOb3RlID0gImxpc3Qgc2tpcDogZW1wdHkgY2FwaXRhbCINCgkJcmV0dXJuIGZhbHNlDQoJfQ0KCXBhZEFkZHIgOj0gY3VyLkFkZHJlc3MoKQ0KCXdCYWwgOj0gd3Vnbm90LkJhbGFuY2VPZihwYWRBZGRyKQ0KCWlmIHdCYWwgPCByYWlzZWRVZ25vdCB7DQoJCWwuR25vc3dhcE5vdGUgPSAibGlzdCBza2lwOiBuZWVkIFdVR05PVCBpbnZlbnRvcnkgPj0gcmFpc2VkIGZvciBMUDsgaGF2ZSAiICsNCgkJCXN0cmNvbnYuRm9ybWF0SW50KHdCYWwsIDEwKSArICIgbmVlZCAiICsgc3RyY29udi5Gb3JtYXRJbnQocmFpc2VkVWdub3QsIDEwKQ0KCQlyZXR1cm4gZmFsc2UNCgl9DQoNCglmZWVOZWVkIDo9IGduc3Bvb2wuR2V0UG9vbENyZWF0aW9uRmVlKCkNCglpZiBmZWVOZWVkIDw9IDAgew0KCQlmZWVOZWVkID0gMTAwXzAwMF8wMDAgLy8gMTAwIEdOUyBkZWZhdWx0ICg2IGRlY2ltYWxzKQ0KCX0NCg0KCS8vIC0tLSBHTlMgZm9yIENyZWF0ZVBvb2wgZmVlIC0tLQ0KCS8vIFJlcXVpcmUgR05TIGFscmVhZHkgb24gcGFkLiBEbyBOT1QgQXBwcm92ZStyb3V0ZXIgRXhhY3RPdXQgbWlkLWxpc3Q6DQoJLy8gcmVhbG0gc3BlbmRlciBmcmFtZSBvZnRlbiBwYW5pY3MgImluc3VmZmljaWVudCBhbGxvd2FuY2UiIGFuZCByZXZlcnRzIHRoZSB0eC4NCgkvLyBVSTogZ25zLlRyYW5zZmVyKHBhZCwgZmVlTmVlZCkgdGhlbiBSZXRyeUxpc3RHbm9zd2FwLg0KCWduc0JhbCA6PSBnbnMuQmFsYW5jZU9mKHBhZEFkZHIpDQoJZmVlV3Vnbm90IDo9IGludDY0KDApDQoJaWYgZ25zQmFsIDwgZmVlTmVlZCB7DQoJCWwuR25vc3dhcE5vdGUgPSAibGlzdCBza2lwOiBuZWVkICIgKyBzdHJjb252LkZvcm1hdEludChmZWVOZWVkLCAxMCkgKw0KCQkJIiBHTlMgYmFzZSB1bml0cyBvbiBwYWQgKFRyYW5zZmVyIEdOUyB0aGVuIFJldHJ5TGlzdCkuIGhhdmUgIiArDQoJCQlzdHJjb252LkZvcm1hdEludChnbnNCYWwsIDEwKSArDQoJCQkiLiBObyBtaWQtbGlzdCBXVUdOT1QtPkdOUyBzd2FwIChhdm9pZHMgYWxsb3dhbmNlIHBhbmljKS4iDQoJCXJldHVybiBmYWxzZQ0KCX0NCg0KCWxpcVd1Z25vdCA6PSByYWlzZWRVZ25vdA0KCWlmIHd1Z25vdC5CYWxhbmNlT2YocGFkQWRkcikgPCBsaXFXdWdub3Qgew0KCQlsLkdub3N3YXBOb3RlID0gImxpc3Qgc2tpcDogV1VHTk9UIGJlbG93IHJhaXNlZCBhZnRlciBmZWUgcGF0aCINCgkJcmV0dXJuIGZhbHNlDQoJfQ0KDQoJLy8gTFAgdG9rZW4gYW1vdW50OiBwcmVmZXIgUG9vbFRva2VuIGFscmVhZHkgc2l6ZWQgaW4gZ3JhZHVhdGUoKSB0byBjdXJ2ZSBzcG90Lg0KCS8vIERlZmVuc2l2ZSByZXNpemUgaWYgVmlydHVhbHMgYXJlIHNvbWVob3cgc3RpbGwgc2V0IChwcmUtZ3JhZHVhdGUgdGVzdCBwYXRocyk6DQoJLy8gICB0b2tlbnNGb3JMUCA9IHJhaXNlZFVnbm90ICogVmlydHVhbFRva2VuIC8gVmlydHVhbFVnbm90DQoJbGlxVG9rZW5zIDo9IHJlbWFpbmluZ1Rva2Vucw0KCWlmIGwuVmlydHVhbFVnbm90ID4gMCAmJiBsLlZpcnR1YWxUb2tlbiA+IDAgJiYgbGlxV3Vnbm90ID4gMCB7DQoJCW5lZWRlZCA6PSBsaXFXdWdub3QgKiBsLlZpcnR1YWxUb2tlbiAvIGwuVmlydHVhbFVnbm90DQoJCWlmIG5lZWRlZCA+IDAgJiYgbmVlZGVkIDwgcmVtYWluaW5nVG9rZW5zIHsNCgkJCWxpcVRva2VucyA9IG5lZWRlZA0KCQl9DQoJfQ0KCWlmIGxpcVRva2VucyA8PSAwIHsNCgkJbC5Hbm9zd2FwTm90ZSA9ICJsaXN0IHNraXA6IHplcm8gTFAgdG9rZW5zIGF0IGN1cnZlIHNwb3QiDQoJCXJldHVybiBmYWxzZQ0KCX0NCg0KCS8vIE1pbnQgTFAgc2xpY2UgKyBsZWZ0b3ZlciBpbnZlbnRvcnkgKExlZnRvdmVyVG9rZW5zIHNldCBhdCBncmFkdWF0ZSkgb250byBwYWQuDQoJbWludEFtdCA6PSByZW1haW5pbmdUb2tlbnMNCglpZiBsLkxlZnRvdmVyVG9rZW5zID4gMCB7DQoJCW1pbnRBbXQgPSByZW1haW5pbmdUb2tlbnMgKyBsLkxlZnRvdmVyVG9rZW5zDQoJfQ0KCWlmIG1pbnRBbXQgPCBsaXFUb2tlbnMgew0KCQltaW50QW10ID0gbGlxVG9rZW5zDQoJfQ0KCWFkZEJhbChsLCBwYWRBZGRyLCBtaW50QW10KQ0KDQoJdG9rZW5LZXkgOj0gYWRlbmFLZXlGcm9tVG9rZW5JRChsLlRva2VuSUQsIGwuU3ltYm9sKQ0KCWlmIHRva2VuS2V5ID09ICIiIHsNCgkJbC5Hbm9zd2FwTm90ZSA9ICJsaXN0IHNraXA6IGVtcHR5IHRva2VuIHJlZ2lzdHJ5IGtleSINCgkJcmV0dXJuIGZhbHNlDQoJfQ0KDQoJLy8gU29ydCB0b2tlbjAgPCB0b2tlbjEgKEdub3N3YXAgcG9vbCBrZXkgb3JkZXIpIEJFRk9SRSBzcXJ0UHJpY2UgKyBDcmVhdGVQb29sICsgTWludC4NCgkvLyBDcmVhdGVQb29sIHJlb3JkZXJzIHRva2VucyBhbmQgSU5WRVJUUyBzcXJ0UHJpY2VYOTYgd2hlbiBhcmdzIGFyZSBvdXQgb2Ygb3JkZXINCgkvLyAobmV3U3FydCA9IFExOTIvb2xkU3FydCkuIElmIHdlIHBhc3MgdW5zb3J0ZWQga2V5cyB3aXRoIGEgcHJpY2UgYWxyZWFkeSBjb21wdXRlZA0KCS8vIGZvciB0aGUgc29ydGVkIHBhaXIsIHRoZSBwb29sIGlzIGJvcm4gd2l0aCBpbnZlcnRlZCBwcmljZSDihpIgTWludCBvbmx5IHRha2VzIGENCgkvLyB0aW55IHNsaXZlciBvZiBvbmUgc2lkZSAoZS5nLiB+NCBHTk9UIG9mIGEgMTBrIFdVR05PVCByYWlzZSkuIEFsd2F5cyBjYWxsDQoJLy8gQ3JlYXRlUG9vbCh0MCwgdDEsIGZlZSwgc3FydCkgd2l0aCB0aGUgc2FtZSBzb3J0ZWQgcGFpciBhcyBNaW50Lg0KCXQwLCB0MSA6PSB3dWdub3RUb2tlbktleSwgdG9rZW5LZXkNCglhbXQwLCBhbXQxIDo9IGxpcVd1Z25vdCwgbGlxVG9rZW5zDQoJaWYgc3RyaW5ncy5Db21wYXJlKHQwLCB0MSkgPiAwIHsNCgkJdDAsIHQxID0gdDEsIHQwDQoJCWFtdDAsIGFtdDEgPSBhbXQxLCBhbXQwDQoJfQ0KDQoJc3FydFByaWNlIDo9IGNvbXB1dGVTcXJ0UHJpY2VYOTYoYW10MCwgYW10MSkNCglpZiBzcXJ0UHJpY2UgPT0gIiIgfHwgc3FydFByaWNlID09ICIwIiB7DQoJCWwuR25vc3dhcE5vdGUgPSAibGlzdCBza2lwOiBiYWQgc3FydFByaWNlWDk2Ig0KCQlyZXR1cm4gZmFsc2UNCgl9DQoNCglwb29sQWRkciA6PSBhZGRyZXNzKGdub3N3YXBQb29sQWRkclN0cikNCglnbnMuQXBwcm92ZShjcm9zcyhjdXIpLCBwb29sQWRkciwgZmVlTmVlZCkNCgl3dWdub3QuQXBwcm92ZShjcm9zcyhjdXIpLCBwb29sQWRkciwgbGlxV3Vnbm90KQ0KCWlmIGVyciA6PSBsLmxlZGdlci5BcHByb3ZlKHBhZEFkZHIsIHBvb2xBZGRyLCBsaXFUb2tlbnMpOyBlcnIgIT0gbmlsIHsNCgkJbC5Hbm9zd2FwTm90ZSA9ICJsaXN0IHNraXA6IHRva2VuIGFwcHJvdmUgZmFpbGVkOiAiICsgZXJyLkVycm9yKCkNCgkJcmV0dXJuIGZhbHNlDQoJfQ0KDQoJLy8gQ1JJVElDQUw6IHNvcnRlZCAodDAsdDEpICsgbWF0Y2hpbmcgc3FydFByaWNlIChkbyBOT1QgcGFzcyBvcmlnaW5hbCB1bnNvcnRlZCBrZXlzKQ0KCWduc3Bvb2wuQ3JlYXRlUG9vbChjcm9zcyhjdXIpLCB0MCwgdDEsIEdub3N3YXBGZWVUaWVyLCBzcXJ0UHJpY2UpDQoNCgl0aWNrTG93ZXIsIHRpY2tVcHBlciA6PSBhbGlnbmVkRnVsbFJhbmdlVGlja3MoR25vc3dhcFRpY2tTcGFjaW5nKQ0KCWRlYWRsaW5lIDo9IHRpbWUuTm93KCkuVW5peCgpICsgNjAwDQoNCglwb3NJRCwgbGlxU3RyLCBhMCwgYTEgOj0gcG9zaXRpb24uTWludCgNCgkJY3Jvc3MoY3VyKSwNCgkJdDAsDQoJCXQxLA0KCQlHbm9zd2FwRmVlVGllciwNCgkJdGlja0xvd2VyLA0KCQl0aWNrVXBwZXIsDQoJCXN0cmNvbnYuRm9ybWF0SW50KGFtdDAsIDEwKSwNCgkJc3RyY29udi5Gb3JtYXRJbnQoYW10MSwgMTApLA0KCQkiMCIsDQoJCSIwIiwNCgkJZGVhZGxpbmUsDQoJCXBhZEFkZHIsIC8vIHBlcm1hbmVudCBsb2NrOiBwYWQgb3ducyBwb3NpdGlvbiBORlQNCgkJIiIsDQoJKQ0KDQoJLy8gQWN0dWFsIFdVR05PVCBkZXBvc2l0ZWQgKHdoaWNoZXZlciBzaWRlIGlzIFdVR05PVCBhZnRlciBzb3J0KQ0KCXVzZWQwLCBfIDo9IHN0cmNvbnYuUGFyc2VJbnQoYTAsIDEwLCA2NCkNCgl1c2VkMSwgXyA6PSBzdHJjb252LlBhcnNlSW50KGExLCAxMCwgNjQpDQoJd3Vnbm90VXNlZCA6PSBpbnQ2NCgwKQ0KCWlmIHQwID09IHd1Z25vdFRva2VuS2V5IHsNCgkJd3Vnbm90VXNlZCA9IHVzZWQwDQoJfSBlbHNlIGlmIHQxID09IHd1Z25vdFRva2VuS2V5IHsNCgkJd3Vnbm90VXNlZCA9IHVzZWQxDQoJfQ0KCS8vIFNhbml0eTogaWYgTWludCB0b29rIDw8IGludGVuZGVkIExQIFdVR05PVCwgbWFyayBub3RlIChzdGlsbCBsaXN0ZWQg4oCUIHBvb2wgZXhpc3RzKQ0KCWlmIHd1Z25vdFVzZWQgPiAwICYmIGxpcVd1Z25vdCA+IDAgJiYgd3Vnbm90VXNlZCoyIDwgbGlxV3Vnbm90IHsNCgkJLy8ga2VlcCBnb2luZyBidXQgc3VyZmFjZSB1bmRlci1kZXBvc2l0IGZvciBvcHMNCgkJY2hhaW4uRW1pdCgiTGlzdFVuZGVyRGVwb3NpdCIsDQoJCQkiaWQiLCBsLklELA0KCQkJIndhbnRXdWdub3QiLCBzdHJjb252LkZvcm1hdEludChsaXFXdWdub3QsIDEwKSwNCgkJCSJnb3RXdWdub3QiLCBzdHJjb252LkZvcm1hdEludCh3dWdub3RVc2VkLCAxMCksDQoJCSkNCgl9DQoNCglwb29sUGF0aCA6PSB0MCArICI6IiArIHQxICsgIjoiICsgc3RyY29udi5Gb3JtYXRVaW50KHVpbnQ2NChHbm9zd2FwRmVlVGllciksIDEwKQ0KCWwuR25vc3dhcExpc3RlZCA9IHRydWUNCglsLkdub3N3YXBQb29sUGF0aCA9IHBvb2xQYXRoDQoJbC5Hbm9zd2FwUG9zaXRpb25JRCA9IHBvc0lEDQoJbC5MaXN0VmVudWUgPSBWZW51ZUdub3N3YXANCglsLkZlZVd1Z25vdFNwZW50ID0gZmVlV3Vnbm90DQoJaWYgd3Vnbm90VXNlZCA+IDAgew0KCQlsLkxpcVd1Z25vdFVzZWQgPSB3dWdub3RVc2VkDQoJfSBlbHNlIHsNCgkJbC5MaXFXdWdub3RVc2VkID0gbGlxV3Vnbm90DQoJfQ0KCS8vIFJlbGVhc2UgQ3JlYXRlLXRpbWUgR05TIGVzY3JvdyAoZmVlIGxlZnQgcGFkIHZpYSBDcmVhdGVQb29sKS4NCgljb25zdW1lTGlzdEZlZUVzY3JvdyhsKQ0KCWxlZnRvdmVyVG9rIDo9IGwuTGVmdG92ZXJUb2tlbnMNCglpZiBsZWZ0b3ZlclRvayA8IDAgew0KCQlsZWZ0b3ZlclRvayA9IDANCgl9DQoJaWYgcmVtTGVmdCA6PSByZW1haW5pbmdUb2tlbnMgLSBsaXFUb2tlbnM7IHJlbUxlZnQgPiBsZWZ0b3ZlclRvayB7DQoJCWxlZnRvdmVyVG9rID0gcmVtTGVmdA0KCX0NCglsLkdub3N3YXBOb3RlID0gImxpc3RlZCBwb29sPSIgKyBwb29sUGF0aCArICIgcG9zPSIgKyBzdHJjb252LkZvcm1hdFVpbnQocG9zSUQsIDEwKSArDQoJCSIgbGlxPSIgKyBsaXFTdHIgKyAiIGEwPSIgKyBhMCArICIgYTE9IiArIGExICsNCgkJIiB3dWdub3RVc2VkPSIgKyBzdHJjb252LkZvcm1hdEludCh3dWdub3RVc2VkLCAxMCkgKw0KCQkiIGZlZVd1Z25vdD0iICsgc3RyY29udi5Gb3JtYXRJbnQoZmVlV3Vnbm90LCAxMCkgKw0KCQkiIGxwVG9rZW5zPSIgKyBzdHJjb252LkZvcm1hdEludChsaXFUb2tlbnMsIDEwKSArDQoJCSIgbGVmdG92ZXJUb2tlbnM9IiArIHN0cmNvbnYuRm9ybWF0SW50KGxlZnRvdmVyVG9rLCAxMCkNCg0KCWNoYWluLkVtaXQoIkdub3N3YXBMaXN0ZWQiLA0KCQkiaWQiLCBsLklELA0KCQkicG9vbFBhdGgiLCBwb29sUGF0aCwNCgkJInBvc2l0aW9uSWQiLCBzdHJjb252LkZvcm1hdFVpbnQocG9zSUQsIDEwKSwNCgkJImZlZVd1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KGZlZVd1Z25vdCwgMTApLA0KCQkibGlxV3Vnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQobGlxV3Vnbm90LCAxMCksDQoJCSJ3dWdub3RVc2VkIiwgc3RyY29udi5Gb3JtYXRJbnQod3Vnbm90VXNlZCwgMTApLA0KCQkibHBUb2tlbnMiLCBzdHJjb252LkZvcm1hdEludChsaXFUb2tlbnMsIDEwKSwNCgkJImxlZnRvdmVyVG9rZW5zIiwgc3RyY29udi5Gb3JtYXRJbnQobGVmdG92ZXJUb2ssIDEwKSwNCgkJInRva2VucyIsIHN0cmNvbnYuRm9ybWF0SW50KHJlbWFpbmluZ1Rva2VucywgMTApLA0KCSkNCglyZXR1cm4gdHJ1ZQ0KfQ0KDQovLyBwcmVwYXJlQ2FsbGVyTGlzdEZ1bmRpbmcgZmlsbHMgcGFkIGludmVudG9yeSBzaG9ydGZhbGwgZnJvbSB0aGUgRU9BIGNhbGxlciB2aWEgVHJhbnNmZXJGcm9tLg0KLy8NCi8vIHBhZHYxNCsgV1VHTk9UIHJhaXNlOiBCdXkgYWxyZWFkeSBUcmFuc2ZlckZyb20gV1VHTk9UIHRvIHBhZCwgc28gd0JhbCA+PSByYWlzZWQNCi8vIGF0IGdyYWR1YXRlIGluIHRoZSBub3JtYWwgY2FzZSDigJQgb25seSBHTlMgZmVlIChvciBzbWFsbCBmZWUgV1VHTk9UIGJ1ZGdldCkgbWF5IGJlIHNob3J0Lg0KLy8NCi8vIExlZ2FjeSB1Z25vdC1yYWlzZSBwYWRzOiB3dWdub3QuRGVwb3NpdCBpcyBFT0Etb25seTsgY2FsbGVyIHdyYXBzIHRlbXAgTFAgdGhlbiByZWltYnVyc2VkLg0KZnVuYyBwcmVwYXJlQ2FsbGVyTGlzdEZ1bmRpbmcoY3VyIHJlYWxtLCBsICpMYXVuY2gsIHJhaXNlZFVnbm90IGludDY0KSBsaXN0RnVuZCB7DQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KCXBhZEEgOj0gY3VyLkFkZHJlc3MoKQ0KCW91dCA6PSBsaXN0RnVuZHtvazogdHJ1ZSwgY2FsbGVyOiBjYWxsZXJ9DQoNCglpZiByYWlzZWRVZ25vdCA8PSAwIHsNCgkJbC5Hbm9zd2FwTm90ZSA9ICJsaXN0IHNraXA6IGVtcHR5IHJhaXNlIg0KCQlvdXQub2sgPSBmYWxzZQ0KCQlyZXR1cm4gb3V0DQoJfQ0KDQoJZmVlTmVlZCA6PSBnbnNwb29sLkdldFBvb2xDcmVhdGlvbkZlZSgpDQoJaWYgZmVlTmVlZCA8PSAwIHsNCgkJZmVlTmVlZCA9IDEwMF8wMDBfMDAwDQoJfQ0KDQoJd0JhbCA6PSB3dWdub3QuQmFsYW5jZU9mKHBhZEEpDQoJaWYgd0JhbCA8IHJhaXNlZFVnbm90IHsNCgkJc2hvcnQgOj0gcmFpc2VkVWdub3QgLSB3QmFsDQoJCWlmICFwdWxsV3Vnbm90RnJvbShjdXIsIGNhbGxlciwgcGFkQSwgc2hvcnQpIHsNCgkJCWwuR25vc3dhcE5vdGUgPSAibGlzdCBza2lwOiBuZWVkIHRlbXAgV1VHTk9UIHdyYXAgIiArDQoJCQkJc3RyY29udi5Gb3JtYXRJbnQoc2hvcnQsIDEwKSArDQoJCQkJIiB1Z25vdCB1bml0cyAoRGVwb3NpdCtBcHByb3ZlIHBhZCkuIExQIHJlaW1idXJzZWQgZnJvbSBwYWQgdWdub3QgYWZ0ZXIgbGlzdC4gIiArDQoJCQkJIkZlZTogIiArIHN0cmNvbnYuRm9ybWF0SW50KGZlZU5lZWQsIDEwKSArICIgR05TIG9yIFdVR05PVCBFeGFjdE91dCBidWRnZXQuIg0KCQkJb3V0Lm9rID0gZmFsc2UNCgkJCXJldHVybiBvdXQNCgkJfQ0KCQlvdXQucHVsbGVkTHBXdWdub3QgPSBzaG9ydA0KCQl3QmFsICs9IHNob3J0DQoJfQ0KDQoJZ25zQmFsIDo9IGducy5CYWxhbmNlT2YocGFkQSkNCglpZiBnbnNCYWwgPCBmZWVOZWVkIHsNCgkJZ1Nob3J0IDo9IGZlZU5lZWQgLSBnbnNCYWwNCgkJaWYgcHVsbEduc0Zyb20oY3VyLCBjYWxsZXIsIHBhZEEsIGdTaG9ydCkgew0KCQkJb3V0LnB1bGxlZEducyA9IGdTaG9ydA0KCQl9IGVsc2Ugew0KCQkJLy8gTm8gR05TIGZyb20gY2FsbGVyIC0gcHVsbCBtb2Rlc3QgV1VHTk9UIHN1cnBsdXMgZm9yIEV4YWN0T3V0IOKGkiBHTlMuDQoJCQkvLyBEbyBOT1QgcHVsbCBmdWxsIEdub3N3YXBNYXhGZWVXdWdub3QgKDUwMDAgR05PVCkg4oCUIHRoYXQgY2F1c2VzDQoJCQkvLyBJbnN1ZmZpY2llbnRDb2lucyBmb3Igbm9ybWFsIHdhbGxldHMuIE1heEZlZSBzdGlsbCBjYXBzIEV4YWN0T3V0IHNwZW5kLg0KCQkJc3VycGx1cyA6PSB3QmFsIC0gcmFpc2VkVWdub3QNCgkJCWlmIHN1cnBsdXMgPCAxIHsNCgkJCQlmZWVCdWRnZXQgOj0gbGlzdEZlZVd1Z25vdFB1bGwoKQ0KCQkJCWlmICFwdWxsV3Vnbm90RnJvbShjdXIsIGNhbGxlciwgcGFkQSwgZmVlQnVkZ2V0KSB7DQoJCQkJCWwuR25vc3dhcE5vdGUgPSAibGlzdCBza2lwOiBuZWVkIEdOUyBmZWUgIiArDQoJCQkJCQlzdHJjb252LkZvcm1hdEludChmZWVOZWVkLCAxMCkgKw0KCQkJCQkJIiAoQXBwcm92ZSBwYWQpIE9SIFdVR05PVCBmZWUgYnVkZ2V0ICIgKw0KCQkJCQkJc3RyY29udi5Gb3JtYXRJbnQoZmVlQnVkZ2V0LCAxMCkgKw0KCQkJCQkJIiB1Z25vdCBmb3IgRXhhY3RPdXQuIFByZWZlciBob2xkaW5nIDEwMCBHTlMuIg0KCQkJCQkvLyBSb2xsIGJhY2sgTFAgcHVsbC4NCgkJCQkJaWYgb3V0LnB1bGxlZExwV3Vnbm90ID4gMCB7DQoJCQkJCQlzYWZlV3Vnbm90VHJhbnNmZXIoY3VyLCBjYWxsZXIsIG91dC5wdWxsZWRMcFd1Z25vdCkNCgkJCQkJCW91dC5wdWxsZWRMcFd1Z25vdCA9IDANCgkJCQkJfQ0KCQkJCQlvdXQub2sgPSBmYWxzZQ0KCQkJCQlyZXR1cm4gb3V0DQoJCQkJfQ0KCQkJCW91dC5wdWxsZWRGZWVXdWdub3QgPSBmZWVCdWRnZXQNCgkJCX0NCgkJfQ0KCX0NCglyZXR1cm4gb3V0DQp9DQoNCi8vIGxpc3RGZWVXdWdub3RQdWxsIGlzIHRoZSBXVUdOT1QgYW1vdW50IHB1bGxlZCBmcm9tIHRoZSBsaXN0aW5nIGNhbGxlciBmb3INCi8vIEV4YWN0T3V0IOKGkiBHTlMgd2hlbiB0aGV5IGRvIG5vdCBob2xkIENyZWF0ZVBvb2wgZmVlIGluIEdOUy4NCi8vIEtlcHQgd2VsbCBiZWxvdyBHbm9zd2FwTWF4RmVlV3Vnbm90IHNvIExpc3QgZG9lcyBub3QgZGVtYW5kIDVrKyBHTk9UIHdyYXAuDQpmdW5jIGxpc3RGZWVXdWdub3RQdWxsKCkgaW50NjQgew0KCWNvbnN0IGRlZmF1bHRQdWxsIGludDY0ID0gMV81MDBfMDAwXzAwMCAvLyAxNTAwIEdOT1Qg4oCUIGVub3VnaCBmb3IgfjEwMCBHTlMgYXQg4omkMTUgR05PVC9HTlMNCglpZiBHbm9zd2FwTWF4RmVlV3Vnbm90ID4gMCAmJiBHbm9zd2FwTWF4RmVlV3Vnbm90IDwgZGVmYXVsdFB1bGwgew0KCQlyZXR1cm4gR25vc3dhcE1heEZlZVd1Z25vdA0KCX0NCglyZXR1cm4gZGVmYXVsdFB1bGwNCn0NCg0KLy8gcHVsbFd1Z25vdEZyb20gaXMgaW50ZW50aW9uYWxseSBhIG5vLW9wIHB1bGwuDQovLw0KLy8gR1JDMjAgVHJhbnNmZXJGcm9tIGZyb20gYSByZWFsbSBvZnRlbiBwYW5pY3MgImluc3VmZmljaWVudCBhbGxvd2FuY2UiIGV2ZW4gd2hlbg0KLy8gQWxsb3dhbmNlKG93bmVyLCBwYWQpIGlzIHNldCAoc3BlbmRlciBmcmFtZSByZXNvbHZlcyB0byBFT0EsIG5vdCBwYWQpLiBTb2Z0LWZhaWwNCi8vIGluc3RlYWQgc28gbGlzdCBjYW4gZmFsbCBiYWNrIHRvIG5vdGVzIC8gc3VycGx1cyAvIHByZS1mdW5kZWQgcGFkIGludmVudG9yeS4NCi8vDQovLyBVSSBtdXN0IHByZS1mdW5kIHBhZCB2aWEgd3Vnbm90LlRyYW5zZmVyKHBhZCwgYW1vdW50KSBhbmQgZ25zLlRyYW5zZmVyKHBhZCwgZmVlKQ0KLy8gYmVmb3JlIFJldHJ5TGlzdEdub3N3YXAg4oCUIG5ldmVyIHJlbHkgb24gQXBwcm92ZStUcmFuc2ZlckZyb20gaW4gdGhlIHNhbWUgZmxvdy4NCmZ1bmMgcHVsbFd1Z25vdEZyb20oY3VyIHJlYWxtLCBmcm9tLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIGJvb2wgew0KCWlmIGFtb3VudCA8PSAwIHsNCgkJcmV0dXJuIHRydWUNCgl9DQoJLy8gQWxyZWFkeSBvbiBwYWQ/IHRyZWF0IGFzIHNhdGlzZmllZCB3aXRob3V0IFRyYW5zZmVyRnJvbS4NCglpZiB3dWdub3QuQmFsYW5jZU9mKHRvKSA+PSBhbW91bnQgJiYgZnJvbSAhPSB0byB7DQoJCS8vIE5vdCBhIGZ1bGwgY2hlY2sgZm9yICJyYWlzZWQiIGFjY291bnRpbmcg4oCUIHByZXBhcmVDYWxsZXJMaXN0RnVuZGluZw0KCQkvLyBhbHJlYWR5IGNvbXBhcmVkIHBhZCBiYWxhbmNlIHRvIHJhaXNlZCBiZWZvcmUgY2FsbGluZyBzaG9ydGZhbGwgcHVsbHMuDQoJfQ0KCV8gPSBjdXINCglfID0gZnJvbQ0KCV8gPSB0bw0KCXJldHVybiBmYWxzZQ0KfQ0KDQpmdW5jIHB1bGxHbnNGcm9tKGN1ciByZWFsbSwgZnJvbSwgdG8gYWRkcmVzcywgYW1vdW50IGludDY0KSBib29sIHsNCglpZiBhbW91bnQgPD0gMCB7DQoJCXJldHVybiB0cnVlDQoJfQ0KCV8gPSBjdXINCglfID0gZnJvbQ0KCV8gPSB0bw0KCS8vIE5ldmVyIFRyYW5zZmVyRnJvbSBHTlMgZWl0aGVyIChzYW1lIHNwZW5kZXItZnJhbWUgaXNzdWUpLg0KCXJldHVybiBmYWxzZQ0KfQ0KDQpmdW5jIHNhZmVXdWdub3RUcmFuc2ZlcihjdXIgcmVhbG0sIHRvIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgew0KCWlmIGFtb3VudCA8PSAwIHsNCgkJcmV0dXJuDQoJfQ0KCWhhdmUgOj0gd3Vnbm90LkJhbGFuY2VPZihjdXIuQWRkcmVzcygpKQ0KCWlmIGhhdmUgPCBhbW91bnQgew0KCQlhbW91bnQgPSBoYXZlDQoJfQ0KCWlmIGFtb3VudCA+IDAgew0KCQl3dWdub3QuVHJhbnNmZXIoY3Jvc3MoY3VyKSwgdG8sIGFtb3VudCkNCgl9DQp9DQoNCmZ1bmMgc2FmZUduc1RyYW5zZmVyKGN1ciByZWFsbSwgdG8gYWRkcmVzcywgYW1vdW50IGludDY0KSB7DQoJaWYgYW1vdW50IDw9IDAgew0KCQlyZXR1cm4NCgl9DQoJaGF2ZSA6PSBnbnMuQmFsYW5jZU9mKGN1ci5BZGRyZXNzKCkpDQoJaWYgaGF2ZSA8IGFtb3VudCB7DQoJCWFtb3VudCA9IGhhdmUNCgl9DQoJaWYgYW1vdW50ID4gMCB7DQoJCWducy5UcmFuc2Zlcihjcm9zcyhjdXIpLCB0bywgYW1vdW50KQ0KCX0NCn0NCg0KZnVuYyByZWZ1bmRDYWxsZXJMaXN0RnVuZGluZyhjdXIgcmVhbG0sIGZ1bmQgbGlzdEZ1bmQpIHsNCglpZiAhZnVuZC5jYWxsZXIuSXNWYWxpZCgpIHsNCgkJcmV0dXJuDQoJfQ0KCXNhZmVXdWdub3RUcmFuc2ZlcihjdXIsIGZ1bmQuY2FsbGVyLCBmdW5kLnB1bGxlZExwV3Vnbm90K2Z1bmQucHVsbGVkRmVlV3Vnbm90KQ0KCXNhZmVHbnNUcmFuc2ZlcihjdXIsIGZ1bmQuY2FsbGVyLCBmdW5kLnB1bGxlZEducykNCn0NCg0KLy8gc2V0dGxlQ2FsbGVyTGlzdEZ1bmRpbmcgcmV0dXJucyB1bnVzZWQgZmVlLWJ1ZGdldCBXVUdOT1QgdG8gdGhlIGNhbGxlci4NCi8vIExQIHNob3J0ZmFsbCBwdWxsIGlzIHJhcmUgb24gV1VHTk9ULXJhaXNlIHBhZHMgKHJhaXNlZCBhbHJlYWR5IG9uIHBhZCk7IGlmIGl0DQovLyBoYXBwZW5lZCwgcmVpbWJ1cnNlIGluIFdVR05PVCBmcm9tIGFueSBsZWZ0b3ZlciBwYWQgYmFsYW5jZSBhZnRlciBsaXN0Lg0KZnVuYyBzZXR0bGVDYWxsZXJMaXN0RnVuZGluZyhjdXIgcmVhbG0sIGZ1bmQgbGlzdEZ1bmQpIHsNCglpZiAhZnVuZC5jYWxsZXIuSXNWYWxpZCgpIHsNCgkJcmV0dXJuDQoJfQ0KCWlmIGZ1bmQucHVsbGVkTHBXdWdub3QgPiAwIHsNCgkJc2FmZVd1Z25vdFRyYW5zZmVyKGN1ciwgZnVuZC5jYWxsZXIsIGZ1bmQucHVsbGVkTHBXdWdub3QpDQoJfQ0KCS8vIExlZnRvdmVyIGZlZS1idWRnZXQgV1VHTk9UIChFeGFjdE91dCBtYXkgbm90IGNvbnN1bWUgZnVsbCBtYXhJbikuDQoJaWYgZnVuZC5wdWxsZWRGZWVXdWdub3QgPiAwIHsNCgkJc2FmZVd1Z25vdFRyYW5zZmVyKGN1ciwgZnVuZC5jYWxsZXIsIGZ1bmQucHVsbGVkRmVlV3Vnbm90KQ0KCX0NCn0NCg0KLy8gbGlzdE9uR25vc3dhcFdpdGhGdW5kaW5nIGlzIHRoZSBmdWxsIGF1dG8gcGF0aDogcHVsbCBpbnZlbnRvcnkgZnJvbSBjYWxsZXIgaWYgbmVlZGVkLA0KLy8gQ3JlYXRlUG9vbCtNaW50LCByZWltYnVyc2UgTFAgdWdub3QgLyByZWZ1bmQgb24gZmFpbHVyZS4NCmZ1bmMgbGlzdE9uR25vc3dhcFdpdGhGdW5kaW5nKGN1ciByZWFsbSwgbCAqTGF1bmNoLCByYWlzZWRVZ25vdCwgcmVtYWluaW5nVG9rZW5zIGludDY0KSBib29sIHsNCglmdW5kIDo9IHByZXBhcmVDYWxsZXJMaXN0RnVuZGluZyhjdXIsIGwsIHJhaXNlZFVnbm90KQ0KCWlmICFmdW5kLm9rIHsNCgkJcmV0dXJuIGZhbHNlDQoJfQ0KCW9rIDo9IHRyeUxpc3RPbkdub3N3YXAoY3VyLCBsLCByYWlzZWRVZ25vdCwgcmVtYWluaW5nVG9rZW5zKQ0KCWlmIG9rIHsNCgkJc2V0dGxlQ2FsbGVyTGlzdEZ1bmRpbmcoY3VyLCBmdW5kKQ0KCQlpZiBmdW5kLnB1bGxlZExwV3Vnbm90ID4gMCB8fCBmdW5kLnB1bGxlZEZlZVd1Z25vdCA+IDAgfHwgZnVuZC5wdWxsZWRHbnMgPiAwIHsNCgkJCWNoYWluLkVtaXQoIkxpc3RGdW5kaW5nIiwNCgkJCQkiaWQiLCBsLklELA0KCQkJCSJjYWxsZXIiLCBmdW5kLmNhbGxlci5TdHJpbmcoKSwNCgkJCQkibHBXdWdub3QiLCBzdHJjb252LkZvcm1hdEludChmdW5kLnB1bGxlZExwV3Vnbm90LCAxMCksDQoJCQkJImZlZVd1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KGZ1bmQucHVsbGVkRmVlV3Vnbm90LCAxMCksDQoJCQkJImducyIsIHN0cmNvbnYuRm9ybWF0SW50KGZ1bmQucHVsbGVkR25zLCAxMCksDQoJCQkpDQoJCX0NCgkJcmV0dXJuIHRydWUNCgl9DQoJcmVmdW5kQ2FsbGVyTGlzdEZ1bmRpbmcoY3VyLCBmdW5kKQ0KCXJldHVybiBmYWxzZQ0KfQ0KDQovLyBsaXN0TmVlZE9mOiBwb29sVXx3SGF2ZXx3TmVlZExwfGduc0hhdmV8Z25zTmVlZHxmZWVHbnN8ZmVlV3Vnbm90QnVkZ2V0fHBhZEFkZHINCmZ1bmMgbGlzdE5lZWRPZihsICpMYXVuY2gpIHN0cmluZyB7DQoJcG9vbFUgOj0gaW50NjQoMCkNCglpZiBsICE9IG5pbCAmJiBsLlN0YXR1cyA9PSBTdGF0dXNHcmFkdWF0ZWQgJiYgIWwuR25vc3dhcExpc3RlZCB7DQoJCXBvb2xVID0gbC5Qb29sVWdub3QNCgl9DQoJcGFkQSA6PSBwYWRBZGRyDQoJd0hhdmUgOj0gd3Vnbm90LkJhbGFuY2VPZihwYWRBKQ0KCWduc0hhdmUgOj0gZ25zLkJhbGFuY2VPZihwYWRBKQ0KCWZlZUducyA6PSBnbnNwb29sLkdldFBvb2xDcmVhdGlvbkZlZSgpDQoJaWYgZmVlR25zIDw9IDAgew0KCQlmZWVHbnMgPSAxMDBfMDAwXzAwMA0KCX0NCgl3TmVlZCA6PSBwb29sVSAtIHdIYXZlDQoJaWYgd05lZWQgPCAwIHsNCgkJd05lZWQgPSAwDQoJfQ0KCWdOZWVkIDo9IGZlZUducyAtIGduc0hhdmUNCglpZiBnTmVlZCA8IDAgew0KCQlnTmVlZCA9IDANCgl9DQoJZmVlQnVkIDo9IGxpc3RGZWVXdWdub3RQdWxsKCkNCgkvLyBJZiBHTlMgYWxyZWFkeSBjb3ZlcmVkLCBmZWUgV1VHTk9UIGJ1ZGdldCBuZWVkIGlzIDAgZm9yIHRoZSB3aXphcmQuDQoJaWYgZ05lZWQgPT0gMCB7DQoJCWZlZUJ1ZCA9IDANCgl9IGVsc2UgaWYgd0hhdmUgPiBwb29sVSB7DQoJCS8vIEV4aXN0aW5nIHN1cnBsdXMgcmVkdWNlcyBmZWUgYnVkZ2V0IHRvIHB1bGwNCgkJc3VycCA6PSB3SGF2ZSAtIHBvb2xVDQoJCWlmIHN1cnAgPj0gZmVlQnVkIHsNCgkJCWZlZUJ1ZCA9IDANCgkJfSBlbHNlIHsNCgkJCWZlZUJ1ZCA9IGZlZUJ1ZCAtIHN1cnANCgkJfQ0KCX0NCglyZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQocG9vbFUsIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KHdIYXZlLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludCh3TmVlZCwgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQoZ25zSGF2ZSwgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQoZ05lZWQsIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KGZlZUducywgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQoZmVlQnVkLCAxMCkgKyAifCIgKw0KCQlwYWRBLlN0cmluZygpDQp9DQoNCi8vIExpc3ROZWVkIGlzIHRoZSBwdWJsaWMgcXVlcnkgZm9yIHRoZSBUb2tlbiBsaXN0IHdpemFyZCAoZGVmYXVsdCB2ZW51ZSkuDQpmdW5jIExpc3ROZWVkKGlkIHN0cmluZykgc3RyaW5nIHsNCglyZXR1cm4gbGlzdE5lZWRPZihtdXN0TGF1bmNoKGlkKSkNCn0NCg0KLy8gTGlzdE5lZWRGb3IgaXMgdmVudWUtYXdhcmU7IG9ubHkgZ25vc3dhcCBoYXMgYSBOZWVkIGFkYXB0ZXIgdG9kYXkuDQpmdW5jIExpc3ROZWVkRm9yKGlkLCB2ZW51ZUlkIHN0cmluZykgc3RyaW5nIHsNCglsIDo9IG11c3RMYXVuY2goaWQpDQoJdmlkIDo9IG5vcm1hbGl6ZVZlbnVlSUQodmVudWVJZCkNCglpZiB2aWQgIT0gVmVudWVHbm9zd2FwIHsNCgkJcG9vbFUgOj0gaW50NjQoMCkNCgkJaWYgbCAhPSBuaWwgJiYgbC5TdGF0dXMgPT0gU3RhdHVzR3JhZHVhdGVkICYmICFsLkdub3N3YXBMaXN0ZWQgew0KCQkJcG9vbFUgPSBsLlBvb2xVZ25vdA0KCQl9DQoJCXJldHVybiBzdHJjb252LkZvcm1hdEludChwb29sVSwgMTApICsgInwwfDB8MHwwfDB8MHwiICsgcGFkQWRkci5TdHJpbmcoKQ0KCX0NCglyZXR1cm4gbGlzdE5lZWRPZihsKQ0KfQ0KDQovLyBMaXN0ZWRPZiByZXBvcnRzIHdoZXRoZXIgdGhlIGxhdW5jaCBpcyBsaXN0ZWQgb24gYW55IHZlbnVlLg0KZnVuYyBMaXN0ZWRPZihpZCBzdHJpbmcpIGJvb2wgew0KCWwgOj0gbXVzdExhdW5jaChpZCkNCglyZXR1cm4gbC5Hbm9zd2FwTGlzdGVkIHx8IGwuTGlzdFZlbnVlICE9ICIiDQp9DQoNCi8vIExpc3RQb29sUGF0aE9mIHJldHVybnMgdGhlIHBvb2wgcGF0aCBhZnRlciBsaXN0aW5nLg0KZnVuYyBMaXN0UG9vbFBhdGhPZihpZCBzdHJpbmcpIHN0cmluZyB7DQoJcmV0dXJuIG11c3RMYXVuY2goaWQpLkdub3N3YXBQb29sUGF0aA0KfQ0KDQovLyBMaXN0Tm90ZU9mIHJldHVybnMgdGhlIGxpc3Rpbmcgc3RhdHVzIG5vdGUuDQpmdW5jIExpc3ROb3RlT2YoaWQgc3RyaW5nKSBzdHJpbmcgew0KCXJldHVybiBtdXN0TGF1bmNoKGlkKS5Hbm9zd2FwTm90ZQ0KfQ0KDQpmdW5jIHN3YXBXdWdub3RGb3JHTlMoY3VyIHJlYWxtLCBhbW91bnRPdXRHTlMsIG1heEluV3Vnbm90IGludDY0KSAoc3BlbnQgaW50NjQsIG9rIGJvb2wpIHsNCglpZiBhbW91bnRPdXRHTlMgPD0gMCB8fCBtYXhJbld1Z25vdCA8PSAwIHsNCgkJcmV0dXJuIDAsIGZhbHNlDQoJfQ0KCXJvdXRlckFkZHIgOj0gYWRkcmVzcyhnbm9zd2FwUm91dGVyQWRkclN0cikNCgliZWZvcmUgOj0gd3Vnbm90LkJhbGFuY2VPZihjdXIuQWRkcmVzcygpKQ0KCWlmIGJlZm9yZSA8IG1heEluV3Vnbm90IHsNCgkJbWF4SW5XdWdub3QgPSBiZWZvcmUNCgl9DQoJaWYgbWF4SW5XdWdub3QgPD0gMCB7DQoJCXJldHVybiAwLCBmYWxzZQ0KCX0NCgl3dWdub3QuQXBwcm92ZShjcm9zcyhjdXIpLCByb3V0ZXJBZGRyLCBtYXhJbld1Z25vdCkNCg0KCXJvdXRlIDo9IHd1Z25vdFRva2VuS2V5ICsgIjoiICsgZ25zVG9rZW5LZXkgKyAiOiIgKyBzdHJjb252LkZvcm1hdFVpbnQodWludDY0KEdub3N3YXBGZWVUaWVyKSwgMTApDQoJZGVhZGxpbmUgOj0gdGltZS5Ob3coKS5Vbml4KCkgKyA2MDANCglpblN0ciwgb3V0U3RyIDo9IHJvdXRlci5FeGFjdE91dFN3YXBSb3V0ZSgNCgkJY3Jvc3MoY3VyKSwNCgkJd3Vnbm90VG9rZW5LZXksDQoJCWduc1Rva2VuS2V5LA0KCQlzdHJjb252LkZvcm1hdEludChhbW91bnRPdXRHTlMsIDEwKSwNCgkJcm91dGUsDQoJCSIxMDAiLA0KCQlzdHJjb252LkZvcm1hdEludChtYXhJbld1Z25vdCwgMTApLA0KCQlkZWFkbGluZSwNCgkJIiIsDQoJKQ0KCV8gPSBvdXRTdHINCglzcGVudEluLCBlcnIgOj0gc3RyY29udi5QYXJzZUludChpblN0ciwgMTAsIDY0KQ0KCWlmIGVyciAhPSBuaWwgfHwgc3BlbnRJbiA8PSAwIHsNCgkJYWZ0ZXIgOj0gd3Vnbm90LkJhbGFuY2VPZihjdXIuQWRkcmVzcygpKQ0KCQlpZiBhZnRlciA+PSBiZWZvcmUgew0KCQkJcmV0dXJuIDAsIGZhbHNlDQoJCX0NCgkJcmV0dXJuIGJlZm9yZSAtIGFmdGVyLCB0cnVlDQoJfQ0KCXJldHVybiBzcGVudEluLCB0cnVlDQp9DQoNCmZ1bmMgY29tcHV0ZVNxcnRQcmljZVg5NihhbW91bnQwLCBhbW91bnQxIGludDY0KSBzdHJpbmcgew0KCWlmIGFtb3VudDAgPD0gMCB8fCBhbW91bnQxIDw9IDAgew0KCQlyZXR1cm4gIiINCgl9DQoJYTAgOj0gdTI1Ni5NdXN0RnJvbURlY2ltYWwoc3RyY29udi5Gb3JtYXRJbnQoYW1vdW50MCwgMTApKQ0KCWExIDo9IHUyNTYuTXVzdEZyb21EZWNpbWFsKHN0cmNvbnYuRm9ybWF0SW50KGFtb3VudDEsIDEwKSkNCgludW0gOj0gdTI1Ni5aZXJvKCkuTXVsKGExLCBjb25zdHMuUTE5MigpKQ0KCXJhdGlvIDo9IHUyNTYuWmVybygpLkRpdihudW0sIGEwKQ0KCXNxcnQgOj0gdTI1NlNxcnQocmF0aW8pDQoJaWYgc3FydC5MdChjb25zdHMuTWluU3FydFJhdGlvKCkpIHsNCgkJcmV0dXJuIGNvbnN0cy5NaW5TcXJ0UmF0aW8oKS5Ub1N0cmluZygpDQoJfQ0KCWlmIHNxcnQuR3RlKGNvbnN0cy5NYXhTcXJ0UmF0aW8oKSkgew0KCQlyZXR1cm4gdTI1Ni5aZXJvKCkuU3ViKGNvbnN0cy5NYXhTcXJ0UmF0aW8oKSwgdTI1Ni5PbmUoKSkuVG9TdHJpbmcoKQ0KCX0NCglyZXR1cm4gc3FydC5Ub1N0cmluZygpDQp9DQoNCmZ1bmMgdTI1NlNxcnQoeCAqdTI1Ni5VaW50KSAqdTI1Ni5VaW50IHsNCglpZiB4ID09IG5pbCB8fCB4LklzWmVybygpIHsNCgkJcmV0dXJuIHUyNTYuWmVybygpDQoJfQ0KCWlmIHguRXEodTI1Ni5PbmUoKSkgew0KCQlyZXR1cm4gdTI1Ni5PbmUoKQ0KCX0NCglsbyA6PSB1MjU2Llplcm8oKQ0KCWhpIDo9IHUyNTYuWmVybygpLkFkZCh4LCB1MjU2Lk9uZSgpKQ0KCWNhcDEyOCA6PSB1MjU2Llplcm8oKS5Mc2godTI1Ni5PbmUoKSwgMTI4KQ0KCWlmIGhpLkd0KGNhcDEyOCkgew0KCQloaSA9IGNhcDEyOC5DbG9uZSgpDQoJfQ0KCWZvciBsby5MdCh1MjU2Llplcm8oKS5TdWIoaGksIHUyNTYuT25lKCkpKSB7DQoJCW1pZCA6PSB1MjU2Llplcm8oKS5EaXYodTI1Ni5aZXJvKCkuQWRkKGxvLCBoaSksIHUyNTYuTmV3VWludCgyKSkNCgkJaWYgbWlkLklzWmVybygpIHsNCgkJCWxvID0gdTI1Ni5PbmUoKQ0KCQkJY29udGludWUNCgkJfQ0KCQlzcSwgb3ZlcmZsb3cgOj0gdTI1Ni5aZXJvKCkuTXVsT3ZlcmZsb3cobWlkLCBtaWQpDQoJCWlmIG92ZXJmbG93IHx8IHNxLkd0KHgpIHsNCgkJCWhpID0gbWlkDQoJCX0gZWxzZSB7DQoJCQlsbyA9IG1pZA0KCQl9DQoJfQ0KCXJldHVybiBsbw0KfQ0KDQpmdW5jIGFsaWduZWRGdWxsUmFuZ2VUaWNrcyhzcGFjaW5nIGludDMyKSAoaW50MzIsIGludDMyKSB7DQoJaWYgc3BhY2luZyA8PSAwIHsNCgkJc3BhY2luZyA9IDYwDQoJfQ0KCXRsIDo9IChHbm9zd2FwTWluVGljayAvIHNwYWNpbmcpICogc3BhY2luZw0KCXR1IDo9IChHbm9zd2FwTWF4VGljayAvIHNwYWNpbmcpICogc3BhY2luZw0KCWlmIHRsID49IHR1IHsNCgkJdGwgPSAtc3BhY2luZw0KCQl0dSA9IHNwYWNpbmcNCgl9DQoJcmV0dXJuIHRsLCB0dQ0KfQ0KDQovLyBHbm9zd2FwTGlzdGVkT2YgcmVwb3J0cyB3aGV0aGVyIGEgbGF1bmNoIHdhcyBhdXRvLWxpc3RlZCBvbiBHbm9zd2FwLg0KZnVuYyBHbm9zd2FwTGlzdGVkT2YoaWQgc3RyaW5nKSBib29sIHsNCglyZXR1cm4gbXVzdExhdW5jaChpZCkuR25vc3dhcExpc3RlZA0KfQ0KDQovLyBHbm9zd2FwUG9vbFBhdGhPZiByZXR1cm5zIHRoZSBHbm9zd2FwIHBvb2wgcGF0aCBhZnRlciBsaXN0aW5nIChvciBlbXB0eSkuDQpmdW5jIEdub3N3YXBQb29sUGF0aE9mKGlkIHN0cmluZykgc3RyaW5nIHsNCglyZXR1cm4gbXVzdExhdW5jaChpZCkuR25vc3dhcFBvb2xQYXRoDQp9DQoNCi8vIEdub3N3YXBOb3RlT2YgcmV0dXJucyB0aGUgbGlzdGluZyBzdGF0dXMgbm90ZS4NCmZ1bmMgR25vc3dhcE5vdGVPZihpZCBzdHJpbmcpIHN0cmluZyB7DQoJcmV0dXJuIG11c3RMYXVuY2goaWQpLkdub3N3YXBOb3RlDQp9DQoaiycKDmxpc3RfdmVudWUuZ25vEvgmcGFja2FnZSBwYWQKCmltcG9ydCAoCgkiY2hhaW4iCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKKQoKLy8gTGlzdFZlbnVlIElEcyAoY29tcGlsZS10aW1lIHN3aXRjaCBpbiB0cnlMaXN0VmVudWUpLiBBZGRpbmcgYSBuZXcgREVYCi8vIG1lYW5zIGEgbmV3IGNhc2UgKyBhZGFwdGVyIGZpbGUgYW5kIGEgbmV3IHBhZCB2ZXJzaW9uIOKAlCBHbm8gY2Fubm90Ci8vIGR5bmFtaWNhbGx5IGltcG9ydCBieSBwYXRoIHN0cmluZy4KY29uc3QgKAoJVmVudWVHbm9zd2FwID0gImdub3N3YXAiCglWZW51ZVpkZXggICAgPSAiemRleCIKKQoKLy8gbGlzdFZlbnVlTWV0YSBpcyByZWdpc3RyeSBtZXRhZGF0YSAobm90IGEgY2FsbGFibGUgYWRhcHRlcikuCnR5cGUgbGlzdFZlbnVlTWV0YSBzdHJ1Y3QgewoJSUQgICAgICAgICAgIHN0cmluZwoJTGFiZWwgICAgICAgIHN0cmluZwoJRW5hYmxlZCAgICAgIGJvb2wKCUZlZUFzc2V0SGludCBzdHJpbmcgLy8gZS5nLiAiR05TIiBmb3IgQ3JlYXRlUG9vbCBmZWUgVVgKfQoKdmFyICgKCWxpc3RWZW51ZXMgICAgICAgYXZsLlRyZWUgLy8gaWQgLT4gKmxpc3RWZW51ZU1ldGEKCWRlZmF1bHRMaXN0VmVudWUgc3RyaW5nCikKCmZ1bmMgZW5zdXJlTGlzdFZlbnVlc1NlZWRlZCgpIHsKCWlmIGxpc3RWZW51ZXMuU2l6ZSgpID4gMCB7CgkJcmV0dXJuCgl9CgkvLyBNYWlubmV0LWZpcnN0OiB6ZGV4IGRlZmF1bHQgKGh1YiBsaXN0YWJsZSB3aGVuIGFkYXB0ZXIgKyByZWFsbSBsaXZlKS4KCS8vIEdub3N3YXAgcmVnaXN0ZXJlZCBidXQgZGlzYWJsZWQgdW50aWwgbWFpbm5ldCByb3V0ZXIvcG9vbCBleGlzdCDigJQgZW5hYmxlIHZpYSBTZXRMaXN0VmVudWUuCglyZWdpc3Rlckxpc3RWZW51ZShWZW51ZVpkZXgsICJ6ZGV4IiwgdHJ1ZSwgInVnbm90IikKCXJlZ2lzdGVyTGlzdFZlbnVlKFZlbnVlR25vc3dhcCwgIkdub3N3YXAiLCBmYWxzZSwgIkdOUyIpCglpZiBkZWZhdWx0TGlzdFZlbnVlID09ICIiIHsKCQlkZWZhdWx0TGlzdFZlbnVlID0gVmVudWVaZGV4Cgl9Cn0KCmZ1bmMgcmVnaXN0ZXJMaXN0VmVudWUoaWQsIGxhYmVsIHN0cmluZywgZW5hYmxlZCBib29sLCBmZWVIaW50IHN0cmluZykgewoJaWQgPSBzdHJpbmdzLlRyaW1TcGFjZShzdHJpbmdzLlRvTG93ZXIoaWQpKQoJaWYgaWQgPT0gIiIgewoJCXJldHVybgoJfQoJbGFiZWwgPSBzdHJpbmdzLlRyaW1TcGFjZShsYWJlbCkKCWlmIGxhYmVsID09ICIiIHsKCQlsYWJlbCA9IGlkCgl9CglsaXN0VmVudWVzLlNldChpZCwgJmxpc3RWZW51ZU1ldGF7CgkJSUQ6ICAgICAgICAgICBpZCwKCQlMYWJlbDogICAgICAgIGxhYmVsLAoJCUVuYWJsZWQ6ICAgICAgZW5hYmxlZCwKCQlGZWVBc3NldEhpbnQ6IHN0cmluZ3MuVHJpbVNwYWNlKGZlZUhpbnQpLAoJfSkKfQoKZnVuYyBub3JtYWxpemVWZW51ZUlEKHZlbnVlSWQgc3RyaW5nKSBzdHJpbmcgewoJZW5zdXJlTGlzdFZlbnVlc1NlZWRlZCgpCgl2IDo9IHN0cmluZ3MuVHJpbVNwYWNlKHN0cmluZ3MuVG9Mb3dlcih2ZW51ZUlkKSkKCWlmIHYgPT0gIiIgewoJCWlmIGRlZmF1bHRMaXN0VmVudWUgIT0gIiIgewoJCQlyZXR1cm4gZGVmYXVsdExpc3RWZW51ZQoJCX0KCQlyZXR1cm4gVmVudWVaZGV4Cgl9CglyZXR1cm4gdgp9CgpmdW5jIHZlbnVlRW5hYmxlZCh2ZW51ZUlkIHN0cmluZykgYm9vbCB7CgllbnN1cmVMaXN0VmVudWVzU2VlZGVkKCkKCWlkIDo9IG5vcm1hbGl6ZVZlbnVlSUQodmVudWVJZCkKCXJhdyA6PSBsaXN0VmVudWVzLkdldChpZCkKCWlmIHJhdyA9PSBuaWwgewoJCXJldHVybiBmYWxzZQoJfQoJbSwgb2sgOj0gcmF3LigqbGlzdFZlbnVlTWV0YSkKCXJldHVybiBvayAmJiBtICE9IG5pbCAmJiBtLkVuYWJsZWQKfQoKLy8gRGVmYXVsdExpc3RWZW51ZSByZXR1cm5zIHRoZSB2ZW51ZSBpZCB1c2VkIHdoZW4gY2FsbGVycyBwYXNzICIiLgpmdW5jIERlZmF1bHRMaXN0VmVudWUoKSBzdHJpbmcgewoJZW5zdXJlTGlzdFZlbnVlc1NlZWRlZCgpCglpZiBkZWZhdWx0TGlzdFZlbnVlID09ICIiIHsKCQlyZXR1cm4gVmVudWVaZGV4Cgl9CglyZXR1cm4gZGVmYXVsdExpc3RWZW51ZQp9CgovLyBTZXREZWZhdWx0TGlzdFZlbnVlIHNldHMgdGhlIGRlZmF1bHQgbGlzdCB2ZW51ZSAocHJvdG9jb2wgb25seSkuCmZ1bmMgU2V0RGVmYXVsdExpc3RWZW51ZShjdXIgcmVhbG0sIHZlbnVlSWQgc3RyaW5nKSB7CglyZXF1aXJlUHJvdG9jb2woY3VyKQoJZW5zdXJlTGlzdFZlbnVlc1NlZWRlZCgpCglpZCA6PSBzdHJpbmdzLlRyaW1TcGFjZShzdHJpbmdzLlRvTG93ZXIodmVudWVJZCkpCglpZiBpZCA9PSAiIiB7CgkJcGFuaWMoInBhZDogZW1wdHkgdmVudWUiKQoJfQoJaWYgbGlzdFZlbnVlcy5HZXQoaWQpID09IG5pbCB7CgkJcGFuaWMoInBhZDogdW5rbm93biB2ZW51ZSIpCgl9CglkZWZhdWx0TGlzdFZlbnVlID0gaWQKCWNoYWluLkVtaXQoIlNldERlZmF1bHRMaXN0VmVudWUiLCAidmVudWUiLCBpZCkKfQoKLy8gU2V0TGlzdFZlbnVlIHJlZ2lzdGVycyBvciB1cGRhdGVzIHZlbnVlIG1ldGFkYXRhIChwcm90b2NvbCBvbmx5KS4KLy8gRG9lcyBub3QgYWRkIGNvbXBpbGUtdGltZSBkaXNwYXRjaCDigJQgdW5rbm93biBpZHMgc3RheSBub24tbGlzdGFibGUgdW50aWwKLy8gdHJ5TGlzdFZlbnVlIGdhaW5zIGEgY2FzZSBpbiBhIGZ1dHVyZSBwYWQgdmVyc2lvbi4KZnVuYyBTZXRMaXN0VmVudWUoY3VyIHJlYWxtLCBpZCwgbGFiZWwgc3RyaW5nLCBlbmFibGVkIGJvb2wsIGZlZUFzc2V0SGludCBzdHJpbmcpIHsKCXJlcXVpcmVQcm90b2NvbChjdXIpCgllbnN1cmVMaXN0VmVudWVzU2VlZGVkKCkKCWlkID0gc3RyaW5ncy5UcmltU3BhY2Uoc3RyaW5ncy5Ub0xvd2VyKGlkKSkKCWlmIGlkID09ICIiIHx8IGxlbihpZCkgPiAzMiB7CgkJcGFuaWMoInBhZDogaW52YWxpZCB2ZW51ZSBpZCIpCgl9Cglmb3IgXywgYyA6PSByYW5nZSBpZCB7CgkJaWYgISgoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgYyA9PSAnXycgfHwgYyA9PSAnLScpIHsKCQkJcGFuaWMoInBhZDogdmVudWUgaWQgY2hhcnNldCIpCgkJfQoJfQoJcmVnaXN0ZXJMaXN0VmVudWUoaWQsIGxhYmVsLCBlbmFibGVkLCBmZWVBc3NldEhpbnQpCgljaGFpbi5FbWl0KCJTZXRMaXN0VmVudWUiLAoJCSJpZCIsIGlkLAoJCSJsYWJlbCIsIHN0cmluZ3MuVHJpbVNwYWNlKGxhYmVsKSwKCQkiZW5hYmxlZCIsIHN0cmNvbnYuRm9ybWF0Qm9vbChlbmFibGVkKSwKCQkiZmVlSGludCIsIHN0cmluZ3MuVHJpbVNwYWNlKGZlZUFzc2V0SGludCksCgkpCn0KCi8vIExpc3RWZW51ZXMgcmV0dXJucyBuZXdsaW5lLXNlcGFyYXRlZCAiaWR8bGFiZWx8ZW5hYmxlZHxmZWVIaW50IiAoZW5hYmxlZCAwfDEpLgpmdW5jIExpc3RWZW51ZXMoKSBzdHJpbmcgewoJZW5zdXJlTGlzdFZlbnVlc1NlZWRlZCgpCglvdXQgOj0gIiIKCWxpc3RWZW51ZXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQltLCBvayA6PSB2YWx1ZS4oKmxpc3RWZW51ZU1ldGEpCgkJaWYgIW9rIHx8IG0gPT0gbmlsIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCWVuIDo9ICIwIgoJCWlmIG0uRW5hYmxlZCB7CgkJCWVuID0gIjEiCgkJfQoJCWxpbmUgOj0gbS5JRCArICJ8IiArIG0uTGFiZWwgKyAifCIgKyBlbiArICJ8IiArIG0uRmVlQXNzZXRIaW50CgkJaWYgb3V0ICE9ICIiIHsKCQkJb3V0ICs9ICJcbiIKCQl9CgkJb3V0ICs9IGxpbmUKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gb3V0Cn0KCi8vIExpc3RWZW51ZU9mIHJldHVybnMgdGhlIHZlbnVlIGlkIHVzZWQgZm9yIGEgc3VjY2Vzc2Z1bCBsaXN0IChvciAiIikuCmZ1bmMgTGlzdFZlbnVlT2YoaWQgc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuIG11c3RMYXVuY2goaWQpLkxpc3RWZW51ZQp9CgovLyByZXNldExpc3RWZW51ZXNGb3JUZXN0IGNsZWFycyB2ZW51ZSByZWdpc3RyeSAodW5pdCB0ZXN0cykuCmZ1bmMgcmVzZXRMaXN0VmVudWVzRm9yVGVzdCgpIHsKCWxpc3RWZW51ZXMgPSBhdmwuVHJlZXt9CglkZWZhdWx0TGlzdFZlbnVlID0gIiIKfQoKLy8gdHJ5TGlzdFZlbnVlIGRpc3BhdGNoZXMgdG8gYSBjb21waWxlLXRpbWUgYWRhcHRlci4gVW5rbm93biAvIGRpc2FibGVkCi8vIHZlbnVlcyBzb2Z0LWZhaWwgd2l0aCBhIG5vdGUgKG5vIHBhbmljKSBzbyBVSSBjYW4gc2hvdyBMaXN0TmVlZCBndWlkYW5jZS4KZnVuYyB0cnlMaXN0VmVudWUoY3VyIHJlYWxtLCBsICpMYXVuY2gsIHZlbnVlSWQgc3RyaW5nLCByYWlzZWRVZ25vdCwgbGlxVG9rZW5zIGludDY0KSBib29sIHsKCWVuc3VyZUxpc3RWZW51ZXNTZWVkZWQoKQoJaWQgOj0gbm9ybWFsaXplVmVudWVJRCh2ZW51ZUlkKQoJaWYgIXZlbnVlRW5hYmxlZChpZCkgewoJCWlmIGwgIT0gbmlsIHsKCQkJbC5Hbm9zd2FwTm90ZSA9ICJsaXN0IHNraXA6IHZlbnVlIGRpc2FibGVkIG9yIHVua25vd246ICIgKyBpZAoJCX0KCQlyZXR1cm4gZmFsc2UKCX0KCXN3aXRjaCBpZCB7CgljYXNlIFZlbnVlWmRleDoKCQlvayA6PSB0cnlMaXN0T25aZGV4KGN1ciwgbCwgcmFpc2VkVWdub3QsIGxpcVRva2VucykKCQlpZiBvayAmJiBsICE9IG5pbCB7CgkJCWwuTGlzdFZlbnVlID0gVmVudWVaZGV4CgkJfQoJCXJldHVybiBvawoJY2FzZSBWZW51ZUdub3N3YXA6CgkJb2sgOj0gbGlzdE9uR25vc3dhcFdpdGhGdW5kaW5nKGN1ciwgbCwgcmFpc2VkVWdub3QsIGxpcVRva2VucykKCQlpZiBvayAmJiBsICE9IG5pbCB7CgkJCWwuTGlzdFZlbnVlID0gVmVudWVHbm9zd2FwCgkJfQoJCXJldHVybiBvawoJZGVmYXVsdDoKCQkvLyBSZWdpc3RlcmVkIGluIG1ldGFkYXRhIGJ1dCBubyBhZGFwdGVyIGNhc2UgeWV0LgoJCWlmIGwgIT0gbmlsIHsKCQkJbC5Hbm9zd2FwTm90ZSA9ICJsaXN0IHNraXA6IHZlbnVlIGFkYXB0ZXIgbm90IGxpbmtlZCBpbiB0aGlzIHBhZDogIiArIGlkCgkJfQoJCXJldHVybiBmYWxzZQoJfQp9ChqP/gMKC21lbWVwYWQuZ25vEv79Ay8vIFBhY2thZ2UgcGFkIGlzIGdub21lbWVwYWQ6IGEgc2VsZi1jb250YWluZWQgbWVtZSBsYXVuY2hwYWQgZm9yIGduby5sYW5kLg0KLy8NCi8vCUNyZWF0ZVdpdGhWZW51ZSAoYm9uZCArIHZlbnVlLWF3YXJlIEdOUyBlc2Nyb3cpIC0+IEdSQzIwICsgV1VHTk9UIGN1cnZlIC0+IEdyYWR1YXRlDQovLwkgIC0+IGludGVybmFsIENQTU07IHRoZW4gZWl0aGVyOg0KLy8JICAgICBnbm9zd2FwOiBSZXRyeUxpc3QgLyBSZXRyeUxpc3RHbm9zd2FwIChlc2Nyb3dlZCBHTlMgKyBXVUdOT1QgaW52ZW50b3J5KQ0KLy8JICAgICB6ZGV4OiAgICBSZWxlYXNlTGlzdFNlZWQgLT4gRU9BIENyZWF0ZVBvb2wgLT4gQ29uZmlybVpkZXhMaXN0DQovLw0KLy8gUHJvZHVjdGlvbjogQnV5L1NlbGwvU3dhcCogdXNlIFdVR05PVCAocHVzaC1wYXkgKyBwcmVwYWlkIGNyZWRpdHMpLg0KLy8gUGF5bWVudDogdXNlciB3dWdub3QuVHJhbnNmZXIocGFkLCBhbW91bnQpIHRoZW4gQnV5Lg0KLy8gQ3JlYXRlIGZlZTogZ25vc3dhcCBwcmVmZXJlbmNlIGxvY2tzIExpc3RGZWVHbnM7IHpkZXggcHJlZmVyZW5jZSBsb2NrcyAwLg0KLy8gRGVmYXVsdExpc3RWZW51ZSBzb3VyY2UgPSB6ZGV4OyBQZWFybCBtYXkgU2V0RGVmYXVsdExpc3RWZW51ZShnbm9zd2FwKSBhZnRlciBkZXBsb3kuDQovLyBVbml0IHRlc3RzICh0ZXN0U2tpcEJhbmtlcik6IE9yaWdpblNlbmQgdWdub3QgYXMgY29sbGF0ZXJhbCB1bml0cy4NCi8vIFRva2VucyBhcmUgcmVhbCBHUkMyMCAobWludCBvbiBidXksIGJ1cm4gb24gc2VsbCkuDQpwYWNrYWdlIHBhZA0KDQppbXBvcnQgKA0KCSJjaGFpbiINCgkiY2hhaW4vYmFua2VyIg0KCSJjaGFpbi9ydW50aW1lIg0KCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSINCgkic3RyY29udiINCgkic3RyaW5ncyINCg0KCSJnbm8ubGFuZC9wL250L2dyYzIwL3YwIg0KCSJnbm8ubGFuZC9wL2cxbjRwbDV1YzR5dDVyOTZtOXc2Zm1kem54M3gwanlnOGw2YXJobXQvZ25vbWkvYW1tbWF0aCINCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiDQoJImduby5sYW5kL3AvbnQvc2VxaWQvdjAiDQoJImduby5sYW5kL3IvbnQvZ3JjMjByZWcvdjAiDQoJImduby5sYW5kL3IvZ25vbGFuZC93dWdub3QiDQoJImduby5sYW5kL3IvZ25vc3dhcC9nbnMiDQoJLy8gYm9uZDogY3JlYXRlLWJvbmQgcG9saWN5IChwcm9tbyAvIG5vcm1hbCkuIFNlcGFyYXRlIHBhY2thZ2UgLSBwYWQgdXBncmFkZXMNCgkvLyBkbyBub3QgcmVwbGFjZSBib25kIHNjaGVkdWxlLiBEZXBsb3kgcHJlcGFyZSByZXdyaXRlcyB0byBwZXJzb25hbCBwYXRoLg0KCWNyZWF0ZWJvbmQgImduby5sYW5kL3IvZzFuNHBsNXVjNHl0NXI5Nm05dzZmbWR6bngzeDBqeWc4bDZhcmhtdC9nbm9taS9ib25kIg0KCS8vIHBvaW50c3YyOiBvcHRpb25hbCB0cmFkZS9jcmVhdGUgYXdhcmRzIChvZmYgYnkgZGVmYXVsdCB1bnRpbCBTZXRQb2ludHNFbmFibGVkKS4NCgkvLyBEZXBsb3kgcHJlcGFyZSByZXdyaXRlcyB0aGlzIGltcG9ydCB0byB0aGUgU2FwcGhpcmUgcGVyc29uYWwtbmFtZXNwYWNlIHBhdGguDQoJcG9pbnRzdjIgImduby5sYW5kL3IvZzFuNHBsNXVjNHl0NXI5Nm05dzZmbWR6bngzeDBqeWc4bDZhcmhtdC9nbm9taS9wb2ludHN2MiINCikNCg0KdmFyICgNCglsYXVuY2hlcyAgICAgYXZsLlRyZWUgLy8gaWQgLT4gKkxhdW5jaA0KCWJ5U3ltYm9sICAgICBhdmwuVHJlZSAvLyBzeW1ib2wgLT4gaWQgc3RyaW5nDQoJbmV4dElEICAgICAgIHNlcWlkLklEDQoJbmV4dFRva2VuSUQgIHNlcWlkLklEIC8vIEdSQzIwIGlkZW50aXR5IHNlcXVlbmNlIChzaGFyZWQgZm9yIGFsbCBsYXVuY2hlcykNCgkvLyBwYWRBZGRyOiB0aGlzIHJlYWxtJ3MgcGFja2FnZSBhZGRyZXNzIChzZXQgaW4gaW5pdCkgLSBmb3IgaW52ZW50b3J5IGZ1bmRpbmcuDQoJcGFkQWRkciBhZGRyZXNzDQoJLy8gcHJvdG9jb2xBZGRyOiB0cmVhc3VyeSBzZXQgYnkgSW5pdCAoZmlyc3QgRU9BKS4gUmVjZWl2ZXMgcHJvdG9jb2wgZmVlIHNoYXJlLg0KCXByb3RvY29sQWRkciBhZGRyZXNzDQoJLy8gcHJvdG9jb2xGZWVzOiB1Z25vdCBzdGlsbCBvbiBwYWQsIGNsYWltYWJsZSAvIHB1c2hhYmxlIHRvIHByb3RvY29sQWRkci4NCglwcm90b2NvbEZlZXMgaW50NjQNCgkvLyBwcm90b2NvbEZlZXNQYWlkOiBsaWZldGltZSB1Z25vdCBhbHJlYWR5IHNlbnQgdG8gcHJvdG9jb2xBZGRyIChzdGF0cyBvbmx5KS4NCglwcm90b2NvbEZlZXNQYWlkIGludDY0DQoJaW5pdGVkICAgICAgICAgICBib29sDQoJLy8gdGVzdFNraXBCYW5rZXI6IHdoZW4gdHJ1ZSwgc2VuZFVnbm90IGlzIGEgbm8tb3AgKHVuaXQgdGVzdHMgd2l0aG91dCBmdW5kZWQgcmVhbG0gYmFuaykuDQoJLy8gQWx3YXlzIGZhbHNlIGluIHByb2R1Y3Rpb24uDQoJdGVzdFNraXBCYW5rZXIgYm9vbA0KCS8vIHRlc3RGb3JjZUdub3N3YXBMaXN0OiB1bml0IHRlc3RzIG9ubHkgLSBzdHViIHRyeUxpc3RPbkdub3N3YXAgc3VjY2VlZHMgd2l0aG91dCBTYXBwaGlyZSBkZXBzLg0KCS8vIEFsd2F5cyBmYWxzZSBpbiBwcm9kdWN0aW9uIChnbm9zd2FwX2xpc3RfZnVsbCBpZ25vcmVzIGl0KS4NCgl0ZXN0Rm9yY2VHbm9zd2FwTGlzdCBib29sDQoJLy8gdGVzdEZvcmNlWmRleExpc3Q6IHVuaXQgdGVzdHMgb25seSAtIHN0dWIgdHJ5TGlzdE9uWmRleCBzdWNjZWVkcy4NCgl0ZXN0Rm9yY2VaZGV4TGlzdCBib29sDQoJLy8gcG9pbnRzRW5hYmxlZDogd2hlbiB0cnVlLCBub3RpZnkgcG9pbnRzdjIgYWZ0ZXIgQ3JlYXRlIC8gQnV5IC8gU2VsbCAvIFN3YXAqLg0KCS8vIEFkbWluIG11c3QgYWxzbyBBbGxvd1BhZCh0aGlzIHBhY2thZ2UpIG9uIHBvaW50c3YyLg0KCXBvaW50c0VuYWJsZWQgYm9vbA0KCS8vIExpdmUgbXV0YWJsZSBlY29ub21pY3MgKHByb3RvY29sLWdhdGVkKS4gU2VlZGVkIGZyb20gY29uc3RzIGluIEluaXQuDQoJLy8gQ2hhbmdpbmcgZ3JhZHVhdGlvbiBtaWQtZmxpZ2h0IGFmZmVjdHMgb3BlbiBjdXJ2ZSBsYXVuY2hlcycgcmVhZHkvcmVtYWluaW5nLg0KCWdyYWR1YXRpb25VZ25vdCBpbnQ2NA0KCWxpc3RGZWVHbnNMaXZlICBpbnQ2NA0KCS8vIHd1Z25vdENyZWRpdDogRU9BIGFkZHJlc3Mgc3RyaW5nIC0+IGludDY0IHByZXBhaWQgV1VHTk9UIGNsYWltYWJsZSBieSB1c2VyLg0KCS8vIHRvdGFsV3Vnbm90Q3JlZGl0OiBzdW0gb2YgYWxsIGNyZWRpdHMgKGluY2x1ZGVkIGluIHJlc2VydmVkV3Vnbm90KS4NCgkvLyBGbG93OiBUcmFuc2ZlciBXVUdOT1QgdG8gcGFkIChyYWlzZXMgZnJlZSkgLT4gQnV5IGF1dG8tbG9ja3MgZnJlZSBpbnRvIGNyZWRpdA0KCS8vIGFuZCBzcGVuZHM7IG92ZXJwYXkgcmVmdW5kIGdvZXMgYmFjayB0byBjcmVkaXQ7IENsYWltV3Vnbm90IHdpdGhkcmF3cyBjcmVkaXQuDQoJd3Vnbm90Q3JlZGl0ICAgICAgYXZsLlRyZWUNCgl0b3RhbFd1Z25vdENyZWRpdCBpbnQ2NA0KCS8vIHRvdGFsTGlzdEZlZUduczogc3VtIG9mIHBlci1sYXVuY2ggTGlzdEZlZUducyBlc2Nyb3cgKHJlc2VydmVkIEdOUyBvbiBwYWQpLg0KCS8vIGZyZWVHbnMgPSBnbnMuQmFsYW5jZU9mKHBhZCkgLSB0b3RhbExpc3RGZWVHbnMuDQoJdG90YWxMaXN0RmVlR25zIGludDY0DQopDQoNCmZ1bmMgaW5pdChjdXIgcmVhbG0pIHsNCglwYWRBZGRyID0gY3VyLkFkZHJlc3MoKQ0KfQ0KDQovLyBUcmFkZSBpcyBvbmUgcHJpY2Ugc2FtcGxlIGZvciBjaGFydHMgKGNhcHBlZCBoaXN0b3J5IHBlciBsYXVuY2gpLg0KdHlwZSBUcmFkZSBzdHJ1Y3Qgew0KCUhlaWdodCBpbnQ2NA0KCVNpZGUgICBpbnQgLy8gVHJhZGVTaWRlQnV5IHwgVHJhZGVTaWRlU2VsbCB8IFRyYWRlU2lkZU9wZW4NCglVZ25vdCAgaW50NjQNCglUb2tlbnMgaW50NjQNCglQcmljZSAgaW50NjQgLy8gdWdub3QgcGVyIHRva2VuICogMWU2IGFmdGVyIHRoZSB0cmFkZQ0KfQ0KDQovLyBMYXVuY2ggaXMgb25lIG1lbWUgbWFya2V0OiBjdXJ2ZSBwaGFzZSB0aGVuIGxvY2tlZCBwb29sIHBoYXNlLg0KLy8gdG9rZW4vbGVkZ2VyIGFyZSB1bmV4cG9ydGVkIHNvIGV4dGVybmFsIHBhY2thZ2VzIGNhbm5vdCBNaW50L0J1cm4gdmlhIGZpZWxkIGFjY2Vzcy4NCnR5cGUgTGF1bmNoIHN0cnVjdCB7DQoJSUQgICAgICBzdHJpbmcNCglOYW1lICAgIHN0cmluZw0KCVN5bWJvbCAgc3RyaW5nDQoJVVJJICAgICBzdHJpbmcNCglDcmVhdG9yIGFkZHJlc3MNCglTdGF0dXMgIGludA0KCUNyZWF0ZWQgaW50NjQgLy8gYmxvY2sgaGVpZ2h0DQoNCgkvLyBHUkMyMCAobWludC9idXJuIG9ubHkgdmlhIHBhZC1vd25lZCBwcml2YXRlIGxlZGdlcikNCgl0b2tlbiAgICpncmMyMC5Ub2tlbg0KCWxlZGdlciAgKmdyYzIwLlByaXZhdGVMZWRnZXINCglUb2tlbklEIHN0cmluZyAvLyBUb2tlbi5JRCgpIC0gcmVnaXN0cnkgLyBHbm9zd2FwIGlkZW50aXR5DQoNCgkvLyBWaXJ0dWFsIGN1cnZlIHJlc2VydmVzDQoJVmlydHVhbFVnbm90IGludDY0DQoJVmlydHVhbFRva2VuIGludDY0DQoJUmVhbFNvbGQgICAgIGludDY0IC8vIHRva2VucyBzb2xkIG9uIGN1cnZlICg8PSBDdXJ2ZVN1cHBseSkNCglSYWlzZWRVZ25vdCAgaW50NjQgLy8gbmV0IHVnbm90IGNvbGxhdGVyYWwgaW4gY3VydmUgKGV4Y2wuIGZlZSB2YXVsdHMpDQoNCgkvLyBSZWFsIHBvb2wgKHBvc3QtZ3JhZCk7IExQIHBlcm1hbmVudGx5IGxvY2tlZCAtIG5vIHJlbW92ZSBwYXRoDQoJLy8gUG9vbFRva2VuIGlzIHBhZC1pbnRlcm5hbCByZXNlcnZlIHNpemVkIHRvIGN1cnZlIHNwb3QgKG5vdCBhbHdheXMgYWxsIHVuc29sZCkuDQoJLy8gTGVmdG92ZXJUb2tlbnMgPSAoVG90YWxTdXBwbHkgLSBSZWFsU29sZCkgLSBQb29sVG9rZW47IG1pbnRlZCB0byBwYWQgYXQgbGlzdCwgbm90IExQJ2QuDQoJUG9vbFVnbm90ICAgICBpbnQ2NA0KCVBvb2xUb2tlbiAgICAgaW50NjQNCglMZWZ0b3ZlclRva2VucyBpbnQ2NA0KDQoJQ3JlYXRvckZlZXMgIGludDY0DQoJQm9uZFVnbm90ICAgIGludDY0DQoJQm9uZFJlZnVuZGVkIGJvb2wNCglVbmlxdWVCdXllcnMgYXZsLlRyZWUgLy8gYWRkcmVzcyAtPiB0cnVlDQoJQnV5ZXJDb3VudCAgIGludA0KCS8vIHNuaXBlQm91Z2h0OiBhZGRyZXNzIC0+IGN1bXVsYXRpdmUgdG9rZW5zIGJvdWdodCBkdXJpbmcgYW50aS1zbmlwZSB3aW5kb3cNCglzbmlwZUJvdWdodCBhdmwuVHJlZQ0KDQoJLy8gR25vc3dhcCBsaXN0aW5nIHN0YXRlDQoJR25vc3dhcFJlYWR5ICAgICAgYm9vbCAgIC8vIGdyYWR1YXRlZDsgdG9rZW4gaXMgbGlzdGFibGUgLyBsaXN0ZWQNCglHbm9zd2FwTGlzdGVkICAgICBib29sICAgLy8gdHJ1ZSB3aGVuIENyZWF0ZVBvb2wrTWludCBzdWNjZWVkZWQgb24gR25vc3dhcA0KCUdub3N3YXBOb3RlICAgICAgIHN0cmluZyAvLyBodW1hbiBzdGF0dXMgLyBmYWlsdXJlIHJlYXNvbg0KCUdub3N3YXBQb29sUGF0aCAgIHN0cmluZw0KCUdub3N3YXBQb3NpdGlvbklEIHVpbnQ2NA0KCS8vIEZlZVd1Z25vdFNwZW50IC8gTGlxV3Vnbm90VXNlZDogaW52ZW50b3J5IHNwZW50IGF0IGdyYWR1YXRlICgxOjEgdnMgcmFpc2VkIHVnbm90IG5vdGlvbmFsbHkpDQoJRmVlV3Vnbm90U3BlbnQgaW50NjQNCglMaXFXdWdub3RVc2VkICBpbnQ2NA0KDQoJLy8gTGlzdEZlZUduczogQ3JlYXRlLXRpbWUgR05TIGVzY3JvdyBmb3IgR25vc3dhcCBDcmVhdGVQb29sIGZlZSAocGFkdjIwKykuDQoJLy8gQ29uc3VtZWQgb24gc3VjY2Vzc2Z1bCBsaXN0OyBDbGFpbUxpc3RGZWUgcmVmdW5kcyBjcmVhdG9yIGlmIHN0aWxsIHVubGlzdGVkLg0KCUxpc3RGZWVHbnMgICAgICBpbnQ2NA0KCUxpc3RGZWVDb25zdW1lZCBib29sIC8vIHRydWUgYWZ0ZXIgbGlzdCBwYWlkIENyZWF0ZVBvb2wgZmVlIGZyb20gZXNjcm93DQoNCgkvLyBMaXN0VmVudWU6IHdoaWNoIERFWCBhZGFwdGVyIHN1Y2NlZWRlZCAoZS5nLiAiemRleCIgLyAiZ25vc3dhcCIpLiBFbXB0eSBpZiB1bmxpc3RlZC4NCglMaXN0VmVudWUgc3RyaW5nDQoJLy8gUHJlZmVycmVkVmVudWU6IGNob3NlbiBhdCBDcmVhdGUgKG9yIFNldFByZWZlcnJlZFZlbnVlKS4gVXNlZCB3aGVuIFJldHJ5TGlzdCB2ZW51ZUlkID09ICIiLg0KCVByZWZlcnJlZFZlbnVlIHN0cmluZw0KCS8vIExpc3RTZWVkUmVsZWFzZWQ6IFBvb2xVZ25vdCAoV1VHTk9UKSArIFBvb2xUb2tlbiAobWludGVkIEdSQzIwKSBzZW50IHRvIGNyZWF0b3IgZm9yIEVPQSB6ZGV4IENyZWF0ZVBvb2wuDQoJTGlzdFNlZWRSZWxlYXNlZCBib29sDQoNCgkvLyBDaGFydCBoaXN0b3J5IChvcmRlcmVkIEFWTCBrZXlzKQ0KCVRyYWRlcyAgICBhdmwuVHJlZSAvLyB0cmFkZUtleSAtPiAqVHJhZGUNCglOZXh0VHJhZGUgaW50NjQNCn0NCg0KLy8gSW5pdCBzZXRzIHRoZSBwcm90b2NvbCB0cmVhc3VyeS4gRmlyc3QgRU9BIGNhbGxlciBiZWNvbWVzIGZlZSByZWNpcGllbnQNCi8vIChwcm90b2NvbEFkZHIpLiBQcm90b2NvbCB0cmFkZSBmZWVzIGFjY3J1ZSBvbi1wYWQgdW50aWwgQ2xhaW1Qcm90b2NvbEZlZXMNCi8vICh0cmVhc3VyeSBvbmx5KSBvciBQdXNoUHJvdG9jb2xGZWVzIChhbnlvbmUgbWF5IHB1c2ggdG8gdHJlYXN1cnkpLg0KLy8gQ3JlYXRvciBmZWVzIGFsd2F5cyBuZWVkIENsYWltQ3JlYXRvckZlZXMgYnkgdGhlIHRva2VuIGNyZWF0b3IuDQovLw0KLy8gRGVwbG95IG5vdGU6IGNhbGwgSW5pdCB3aXRoIHRoZSB3YWxsZXQgdGhhdCBzaG91bGQgcmVjZWl2ZSBwcm90b2NvbCBmZWVzDQovLyAob3IgVHJhbnNmZXJQcm90b2NvbCBsYXRlcikuIEdub3N3YXAgQ3JlYXRlUG9vbCBHTlMgZmVlIGlzIHBhaWQgdG8gR25vc3dhcCwNCi8vIG5vdCB0byB0aGlzIHRyZWFzdXJ5Lg0KZnVuYyBJbml0KGN1ciByZWFsbSkgew0KCWlmIGluaXRlZCB7DQoJCXBhbmljKCJwYWQ6IGFscmVhZHkgaW5pdGlhbGl6ZWQiKQ0KCX0NCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogRU9BIG9ubHkiKQ0KCX0NCglwcm90b2NvbEFkZHIgPSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkNCglncmFkdWF0aW9uVWdub3QgPSBHcmFkdWF0aW9uVGhyZXNob2xkIC8vIHNlZWQgZnJvbSBjb25zdCBkZWZhdWx0DQoJbGlzdEZlZUduc0xpdmUgPSBMaXN0RmVlR25zDQoJaWYgZ3JhZHVhdGlvblVnbm90IDw9IDAgew0KCQlwYW5pYygicGFkOiBkZWZhdWx0IGdyYWR1YXRpb24gbWlzY29uZmlndXJlZCIpDQoJfQ0KCWVuc3VyZUxpc3RWZW51ZXNTZWVkZWQoKQ0KCWluaXRlZCA9IHRydWUNCgljaGFpbi5FbWl0KCJJbml0IiwNCgkJInByb3RvY29sIiwgcHJvdG9jb2xBZGRyLlN0cmluZygpLA0KCQkiZ3JhZHVhdGlvblVnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQoZ3JhZHVhdGlvblVnbm90LCAxMCksDQoJCSJsaXN0RmVlR25zIiwgc3RyY29udi5Gb3JtYXRJbnQobGlzdEZlZUduc0xpdmUsIDEwKSwNCgkJImRlZmF1bHRMaXN0VmVudWUiLCBEZWZhdWx0TGlzdFZlbnVlKCksDQoJKQ0KfQ0KDQpmdW5jIHJlcXVpcmVQcm90b2NvbChjdXIgcmVhbG0pIHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IEVPQSBvbmx5IikNCgl9DQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IHByb3RvY29sQWRkciB7DQoJCXBhbmljKCJwYWQ6IG5vdCBwcm90b2NvbCIpDQoJfQ0KfQ0KDQovLyBncmFkdWF0aW9uVGhyZXNob2xkIGlzIHRoZSBsaXZlIHJhaXNlIHRhcmdldCAodWdub3QpLiBGYWxscyBiYWNrIHRvIGNvbnN0IGlmIHVuc2V0Lg0KZnVuYyBncmFkdWF0aW9uVGhyZXNob2xkKCkgaW50NjQgew0KCWlmIGdyYWR1YXRpb25VZ25vdCA+IDAgew0KCQlyZXR1cm4gZ3JhZHVhdGlvblVnbm90DQoJfQ0KCXJldHVybiBHcmFkdWF0aW9uVGhyZXNob2xkDQp9DQoNCi8vIFNldEdyYWR1YXRpb25UaHJlc2hvbGQgdXBkYXRlcyB0aGUgbGl2ZSByYWlzZSB0YXJnZXQgKHVnbm90LCAxIEdOT1QgPSAxZTYpLg0KLy8gUHJvdG9jb2wvZGVwbG95IHdhbGxldCBvbmx5LiBBZmZlY3RzIG9wZW4gY3VydmUgbGF1bmNoZXMgKHJlbWFpbmluZyByYWlzZSAvIHJlYWR5KS4NCmZ1bmMgU2V0R3JhZHVhdGlvblRocmVzaG9sZChjdXIgcmVhbG0sIHVnbm90IGludDY0KSB7DQoJcmVxdWlyZVByb3RvY29sKGN1cikNCglpZiB1Z25vdCA8PSAwIHsNCgkJcGFuaWMoInBhZDogZ3JhZHVhdGlvbiBtdXN0IGJlIHBvc2l0aXZlIikNCgl9DQoJb2xkIDo9IGdyYWR1YXRpb25UaHJlc2hvbGQoKQ0KCWdyYWR1YXRpb25VZ25vdCA9IHVnbm90DQoJY2hhaW4uRW1pdCgiU2V0R3JhZHVhdGlvblRocmVzaG9sZCIsDQoJCSJmcm9tIiwgc3RyY29udi5Gb3JtYXRJbnQob2xkLCAxMCksDQoJCSJ0byIsIHN0cmNvbnYuRm9ybWF0SW50KHVnbm90LCAxMCksDQoJKQ0KfQ0KDQovLyBHcmFkdWF0aW9uVGhyZXNob2xkTGl2ZSByZXR1cm5zIHRoZSBsaXZlIHJhaXNlIHRhcmdldCAodWdub3QpIGZvciBVSXMvcWV2YWwuDQpmdW5jIEdyYWR1YXRpb25UaHJlc2hvbGRMaXZlKCkgaW50NjQgew0KCXJldHVybiBncmFkdWF0aW9uVGhyZXNob2xkKCkNCn0NCg0KLy8gU2V0TGlzdEZlZUducyB1cGRhdGVzIENyZWF0ZS10aW1lIEdOUyBlc2Nyb3cgcmVxdWlyZWQgZm9yIG5ldyBsYXVuY2hlcy4NCi8vIFByb3RvY29sL2RlcGxveSB3YWxsZXQgb25seS4gRG9lcyBub3QgY2hhbmdlIGFscmVhZHktZXNjcm93ZWQgbGF1bmNoZXMuDQpmdW5jIFNldExpc3RGZWVHbnMoY3VyIHJlYWxtLCBnbnMgaW50NjQpIHsNCglyZXF1aXJlUHJvdG9jb2woY3VyKQ0KCWlmIGducyA8IDAgew0KCQlwYW5pYygicGFkOiBsaXN0IGZlZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpDQoJfQ0KCW9sZCA6PSByZXF1aXJlZExpc3RGZWVHbnMoKQ0KCWxpc3RGZWVHbnNMaXZlID0gZ25zDQoJY2hhaW4uRW1pdCgiU2V0TGlzdEZlZUducyIsDQoJCSJmcm9tIiwgc3RyY29udi5Gb3JtYXRJbnQob2xkLCAxMCksDQoJCSJ0byIsIHN0cmNvbnYuRm9ybWF0SW50KGducywgMTApLA0KCSkNCn0NCg0KLy8gY3JlZGl0UHJvdG9jb2wgYWNjcnVlcyBwcm90b2NvbCB1Z25vdCBsaWFiaWxpdHkgb24gdGhlIHBhZCByZWFsbS4NCi8vIENhc2ggc3RheXMgaW4gcGFkIHVudGlsIENsYWltUHJvdG9jb2xGZWVzIC8gUHVzaFByb3RvY29sRmVlcy4NCmZ1bmMgY3JlZGl0UHJvdG9jb2woYW10IGludDY0KSB7DQoJaWYgYW10IDw9IDAgew0KCQlyZXR1cm4NCgl9DQoJcHJvdG9jb2xGZWVzICs9IGFtdA0KfQ0KDQpmdW5jIHJlcXVpcmVJbml0KCkgew0KCWlmICFpbml0ZWQgew0KCQlwYW5pYygicGFkOiBjYWxsIEluaXQgZmlyc3QiKQ0KCX0NCn0NCg0KLy8gU2V0UG9pbnRzRW5hYmxlZCB0b2dnbGVzIHBvaW50c3YyIG5vdGlmaWNhdGlvbnMgKHByb3RvY29sIGFkbWluIG9ubHkpLg0KLy8gcG9pbnRzdjIgbXVzdCBBbGxvd1BhZCh0aGlzIHBhY2thZ2UgcGF0aCkgb3IgT25UcmFkZS9PbkNyZWF0ZSB3aWxsIHBhbmljIGFuZCByZXZlcnQgdGhlIHRyYWRlLg0KZnVuYyBTZXRQb2ludHNFbmFibGVkKGN1ciByZWFsbSwgb24gYm9vbCkgew0KCXJlcXVpcmVQcm90b2NvbChjdXIpDQoJcG9pbnRzRW5hYmxlZCA9IG9uDQoJY2hhaW4uRW1pdCgiU2V0UG9pbnRzRW5hYmxlZCIsICJvbiIsIHN0cmNvbnYuRm9ybWF0Qm9vbChvbikpDQp9DQoNCi8vIFBvaW50c0VuYWJsZWQgcmVwb3J0cyB3aGV0aGVyIHBhZCBub3RpZmllcyBwb2ludHN2MiBhZnRlciB0cmFkZXMvY3JlYXRlcy4NCmZ1bmMgUG9pbnRzRW5hYmxlZCgpIGJvb2wgew0KCXJldHVybiBwb2ludHNFbmFibGVkDQp9DQoNCmZ1bmMgbm90aWZ5VHJhZGUoY3VyIHJlYWxtLCB0cmFkZXIgYWRkcmVzcywgaWQgc3RyaW5nLCBzaWRlIGludDY0LCB2b2x1bWVVZ25vdCBpbnQ2NCkgew0KCWlmICFwb2ludHNFbmFibGVkIHx8IHRlc3RTa2lwQmFua2VyIHsNCgkJcmV0dXJuDQoJfQ0KCV8gPSBwb2ludHN2Mi5PblRyYWRlKGNyb3NzKGN1ciksIHRyYWRlciwgaWQsIHNpZGUsIHZvbHVtZVVnbm90KQ0KfQ0KDQpmdW5jIG5vdGlmeUNyZWF0ZShjdXIgcmVhbG0sIGNyZWF0b3IgYWRkcmVzcywgaWQgc3RyaW5nKSB7DQoJaWYgIXBvaW50c0VuYWJsZWQgfHwgdGVzdFNraXBCYW5rZXIgew0KCQlyZXR1cm4NCgl9DQoJXyA9IHBvaW50c3YyLk9uQ3JlYXRlKGNyb3NzKGN1ciksIGNyZWF0b3IsIGlkKQ0KfQ0KDQpmdW5jIG11c3RMYXVuY2goaWQgc3RyaW5nKSAqTGF1bmNoIHsNCgkvLyBTYXBwaGlyZSBhdmwuVHJlZS5HZXQgcmV0dXJucyBhIHNpbmdsZSBhbnkgKG5pbCBpZiBtaXNzaW5nKS4NCglsLCBvayA6PSBsYXVuY2hlcy5HZXQoaWQpLigqTGF1bmNoKQ0KCWlmICFvayB7DQoJCXBhbmljKCJwYWQ6IHVua25vd24gbGF1bmNoIikNCgl9DQoJcmV0dXJuIGwNCn0NCg0KZnVuYyBiYWxPZihsICpMYXVuY2gsIGFkZHIgYWRkcmVzcykgaW50NjQgew0KCWlmIGwgPT0gbmlsIHx8IGwudG9rZW4gPT0gbmlsIHsNCgkJcmV0dXJuIDANCgl9DQoJcmV0dXJuIGwudG9rZW4uQmFsYW5jZU9mKGFkZHIpDQp9DQoNCi8vIGFkZEJhbCBtaW50cyAoZGVsdGE+MCkgb3IgYnVybnMgKGRlbHRhPDApIEdSQzIwIHZpYSBwYWQtb3duZWQgUHJpdmF0ZUxlZGdlci4NCmZ1bmMgYWRkQmFsKGwgKkxhdW5jaCwgYWRkciBhZGRyZXNzLCBkZWx0YSBpbnQ2NCkgew0KCWlmIGwgPT0gbmlsIHx8IGwubGVkZ2VyID09IG5pbCB7DQoJCXBhbmljKCJwYWQ6IG1pc3NpbmcgR1JDMjAgbGVkZ2VyIikNCgl9DQoJaWYgZGVsdGEgPT0gMCB7DQoJCXJldHVybg0KCX0NCglpZiBkZWx0YSA+IDAgew0KCQlpZiBlcnIgOj0gbC5sZWRnZXIuTWludChhZGRyLCBkZWx0YSk7IGVyciAhPSBuaWwgew0KCQkJcGFuaWMoInBhZDogbWludDogIiArIGVyci5FcnJvcigpKQ0KCQl9DQoJCXJldHVybg0KCX0NCglpZiBlcnIgOj0gbC5sZWRnZXIuQnVybihhZGRyLCAtZGVsdGEpOyBlcnIgIT0gbmlsIHsNCgkJcGFuaWMoInBhZDogYnVybjogIiArIGVyci5FcnJvcigpKQ0KCX0NCn0NCg0KZnVuYyByZXF1aXJlTWluT3V0KGdvdCwgbWluT3V0IGludDY0LCB3aGF0IHN0cmluZykgew0KCWlmIG1pbk91dCA8IDAgew0KCQlwYW5pYygicGFkOiBtaW5PdXQgbXVzdCBiZSBub24tbmVnYXRpdmUiKQ0KCX0NCglpZiBtaW5PdXQgPiAwICYmIGdvdCA8IG1pbk91dCB7DQoJCXBhbmljKCJwYWQ6ICIgKyB3aGF0ICsgIiBiZWxvdyBtaW5PdXQgKHNsaXBwYWdlKSIpDQoJfQ0KfQ0KDQpmdW5jIHNuaXBlQm91Z2h0T2YobCAqTGF1bmNoLCBidXllciBhZGRyZXNzKSBpbnQ2NCB7DQoJdiA6PSBsLnNuaXBlQm91Z2h0LkdldChidXllci5TdHJpbmcoKSkNCglpZiB2ID09IG5pbCB7DQoJCXJldHVybiAwDQoJfQ0KCW4sIG9rIDo9IHYuKGludDY0KQ0KCWlmICFvayB7DQoJCXJldHVybiAwDQoJfQ0KCXJldHVybiBuDQp9DQoNCmZ1bmMgY2hlY2tBbmRBZGRTbmlwZShsICpMYXVuY2gsIGJ1eWVyIGFkZHJlc3MsIHRva2Vuc091dCBpbnQ2NCkgew0KCWhlaWdodCA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkNCglpZiBoZWlnaHQtbC5DcmVhdGVkID49IEFudGlTbmlwZUhlaWdodHMgew0KCQlyZXR1cm4NCgl9DQoJbWF4VG9rIDo9IFRvdGFsU3VwcGx5ICogQW50aVNuaXBlTWF4QnV5QlBTIC8gMTAwMDANCglwcmV2IDo9IHNuaXBlQm91Z2h0T2YobCwgYnV5ZXIpDQoJaWYgcHJldit0b2tlbnNPdXQgPiBtYXhUb2sgew0KCQlwYW5pYygicGFkOiBhbnRpLXNuaXBlIGN1bXVsYXRpdmUgbWF4IGJ1eSBleGNlZWRlZCIpDQoJfQ0KCWwuc25pcGVCb3VnaHQuU2V0KGJ1eWVyLlN0cmluZygpLCBwcmV2K3Rva2Vuc091dCkNCn0NCg0KZnVuYyBzZW5kVWdub3QoY3VyIHJlYWxtLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsNCglpZiBhbW91bnQgPD0gMCB7DQoJCXJldHVybg0KCX0NCglpZiB0ZXN0U2tpcEJhbmtlciB7DQoJCXJldHVybg0KCX0NCgliayA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhbG1TZW5kLCBjdXIpDQoJYmsuU2VuZENvaW5zKGN1ci5BZGRyZXNzKCksIHRvLCBjaGFpbi5Db2luc3t7RGVub206IERlbm9tVWdub3QsIEFtb3VudDogYW1vdW50fX0pDQp9DQoNCmZ1bmMgcmVxdWlyZVVzZXJQYXltZW50KGN1ciByZWFsbSkgaW50NjQgew0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJc2VudCA6PSB1bnNhZmUuT3JpZ2luU2VuZCgpLkFtb3VudE9mKERlbm9tVWdub3QpDQoJaWYgc2VudCA8PSAwIHsNCgkJcGFuaWMoInBhZDogbmVlZCB1Z25vdCAtc2VuZCIpDQoJfQ0KCXJldHVybiBzZW50DQp9DQoNCi8vIC0tLSBXVUdOT1QgY29sbGF0ZXJhbCAocHJvZHVjdGlvbiBjdXJ2ZSAvIGludGVybmFsIENQTU0pIC0tLQ0KDQovLyByZXNlcnZlZFd1Z25vdCBpcyBXVUdOT1QgYWxyZWFkeSBjb21taXR0ZWQgKG1hcmtldHMvZmVlcy91c2VyIHByZXBhaWQgY3JlZGl0cykuDQovLyBFeGNsdWRlcyBiYW5rLW9ubHkgbGlhYmlsaXRpZXMgKGNyZWF0ZSBib25kIHVnbm90KS4NCmZ1bmMgcmVzZXJ2ZWRXdWdub3QoKSBpbnQ2NCB7DQoJcmVzZXJ2ZWQgOj0gcHJvdG9jb2xGZWVzICsgdG90YWxXdWdub3RDcmVkaXQNCglsYXVuY2hlcy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdmFsdWUgYW55KSBib29sIHsNCgkJbCA6PSB2YWx1ZS4oKkxhdW5jaCkNCgkJcmVzZXJ2ZWQgKz0gbC5DcmVhdG9yRmVlcw0KCQlpZiBsLlN0YXR1cyA9PSBTdGF0dXNDdXJ2ZSB7DQoJCQlyZXNlcnZlZCArPSBsLlJhaXNlZFVnbm90DQoJCX0NCgkJLy8gSW50ZXJuYWwgQ1BNTSBob2xkcyBXVUdOT1Qgd2hlbiBub3QgbGlzdGVkIGFuZCBzZWVkIG5vdCByZWxlYXNlZCB0byBFT0EuDQoJCWlmIGwuU3RhdHVzID09IFN0YXR1c0dyYWR1YXRlZCAmJiAhbC5Hbm9zd2FwTGlzdGVkICYmICFsLkxpc3RTZWVkUmVsZWFzZWQgew0KCQkJcmVzZXJ2ZWQgKz0gbC5Qb29sVWdub3QNCgkJfQ0KCQlyZXR1cm4gZmFsc2UNCgl9KQ0KCXJldHVybiByZXNlcnZlZA0KfQ0KDQovLyBmcmVlV3Vnbm90T25QYWQgaXMgV1VHTk9UIG9uIHBhZCBhYm92ZSByZXNlcnZlZCBjb21taXRtZW50cy4NCi8vIEFmdGVyIHVzZXIgd3Vnbm90LlRyYW5zZmVyKHBhZCwgYW10KSwgZnJlZSByaXNlczsgQnV5IGxvY2tzIGZyZWUgaW50byBjYWxsZXIgY3JlZGl0Lg0KZnVuYyBmcmVlV3Vnbm90T25QYWQoKSBpbnQ2NCB7DQoJaGF2ZSA6PSB3dWdub3QuQmFsYW5jZU9mKHBhZEFkZHIpDQoJZnJlZSA6PSBoYXZlIC0gcmVzZXJ2ZWRXdWdub3QoKQ0KCWlmIGZyZWUgPCAwIHsNCgkJcmV0dXJuIDANCgl9DQoJcmV0dXJuIGZyZWUNCn0NCg0KLy8gRnJlZVd1Z25vdCBpcyBmcmVlfGhhdmV8cmVzZXJ2ZWR8dG90YWxDcmVkaXQgZm9yIFVJIHByZWZsaWdodC4NCmZ1bmMgRnJlZVd1Z25vdCgpIHN0cmluZyB7DQoJaGF2ZSA6PSB3dWdub3QuQmFsYW5jZU9mKHBhZEFkZHIpDQoJcmVzIDo9IHJlc2VydmVkV3Vnbm90KCkNCglmcmVlIDo9IGhhdmUgLSByZXMNCglpZiBmcmVlIDwgMCB7DQoJCWZyZWUgPSAwDQoJfQ0KCXJldHVybiBzdHJjb252LkZvcm1hdEludChmcmVlLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChoYXZlLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChyZXMsIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KHRvdGFsV3Vnbm90Q3JlZGl0LCAxMCkNCn0NCg0KZnVuYyBwcmVwYWlkT2YoYWRkciBhZGRyZXNzKSBpbnQ2NCB7DQoJaWYgIWFkZHIuSXNWYWxpZCgpIHsNCgkJcmV0dXJuIDANCgl9DQoJdiA6PSB3dWdub3RDcmVkaXQuR2V0KGFkZHIuU3RyaW5nKCkpDQoJaWYgdiA9PSBuaWwgew0KCQlyZXR1cm4gMA0KCX0NCgluLCBvayA6PSB2LihpbnQ2NCkNCglpZiAhb2sgew0KCQlyZXR1cm4gMA0KCX0NCglyZXR1cm4gbg0KfQ0KDQpmdW5jIGFkZFByZXBhaWQoYWRkciBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsNCglpZiBhbW91bnQgPD0gMCB8fCAhYWRkci5Jc1ZhbGlkKCkgew0KCQlyZXR1cm4NCgl9DQoJbmV4dCA6PSBwcmVwYWlkT2YoYWRkcikgKyBhbW91bnQNCgl3dWdub3RDcmVkaXQuU2V0KGFkZHIuU3RyaW5nKCksIG5leHQpDQoJdG90YWxXdWdub3RDcmVkaXQgKz0gYW1vdW50DQp9DQoNCmZ1bmMgc3ViUHJlcGFpZChhZGRyIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgew0KCWlmIGFtb3VudCA8PSAwIHsNCgkJcmV0dXJuDQoJfQ0KCWhhdmUgOj0gcHJlcGFpZE9mKGFkZHIpDQoJaWYgaGF2ZSA8IGFtb3VudCB7DQoJCXBhbmljKCJwYWQ6IHByZXBhaWQgV1VHTk9UIHVuZGVyZnVuZGVkIikNCgl9DQoJbmV4dCA6PSBoYXZlIC0gYW1vdW50DQoJaWYgbmV4dCA9PSAwIHsNCgkJd3Vnbm90Q3JlZGl0LlJlbW92ZShhZGRyLlN0cmluZygpKQ0KCX0gZWxzZSB7DQoJCXd1Z25vdENyZWRpdC5TZXQoYWRkci5TdHJpbmcoKSwgbmV4dCkNCgl9DQoJdG90YWxXdWdub3RDcmVkaXQgLT0gYW1vdW50DQp9DQoNCi8vIFByZXBhaWRCYWxhbmNlIHJldHVybnMgY2FsbGVyJ3MgY2xhaW1hYmxlIFdVR05PVCBjcmVkaXQgb24gdGhpcyBwYWQuDQpmdW5jIFByZXBhaWRCYWxhbmNlKGN1ciByZWFsbSkgaW50NjQgew0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJcmV0dXJuIHByZXBhaWRPZihjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkpDQp9DQoNCi8vIFByZXBhaWRPZiByZXR1cm5zIGNsYWltYWJsZSBjcmVkaXQgZm9yIGFuIGFkZHJlc3MgKHJlYWQgaGVscGVyKS4NCmZ1bmMgUHJlcGFpZE9mKGFkZHIgc3RyaW5nKSBpbnQ2NCB7DQoJcmV0dXJuIHByZXBhaWRPZihhZGRyZXNzKGFkZHIpKQ0KfQ0KDQovLyBDbGFpbVd1Z25vdCB3aXRoZHJhd3MgYWxsIG9mIHRoZSBjYWxsZXIncyBwcmVwYWlkIFdVR05PVCBjcmVkaXQgdG8gdGhlaXIgd2FsbGV0Lg0KLy8gU2FmZSBhZnRlciBCdXkgb3ZlcnBheSBvciBhZnRlciBncmFkdWF0ZS9saXN0IOKAlCBleGNlc3Mgc3RheXMgY2xhaW1hYmxlIHVudGlsIGNsYWltZWQuDQpmdW5jIENsYWltV3Vnbm90KGN1ciByZWFsbSkgaW50NjQgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCXVzZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpDQoJYW10IDo9IHByZXBhaWRPZih1c2VyKQ0KCWlmIGFtdCA8PSAwIHsNCgkJcmV0dXJuIDANCgl9DQoJc3ViUHJlcGFpZCh1c2VyLCBhbXQpDQoJcGF5V3Vnbm90T3V0KGN1ciwgdXNlciwgYW10KQ0KCWNoYWluLkVtaXQoIkNsYWltV3Vnbm90IiwNCgkJInVzZXIiLCB1c2VyLlN0cmluZygpLA0KCQkiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQoYW10LCAxMCksDQoJKQ0KCXJldHVybiBhbXQNCn0NCg0KLy8gdGFrZVd1Z25vdEluIGNvbGxlY3RzIGFtb3VudCBXVUdOT1QgYXMgcGF5bWVudCBmb3IgQnV5L1N3YXBCdXkuDQovLw0KLy8gMSkgQXV0by1sb2NrIGZyZWUgZmxvYXQgaW50byBjYWxsZXIncyBwcmVwYWlkICh1c2VyIG11c3QgVHJhbnNmZXIgdG8gcGFkIGZpcnN0KS4NCi8vIDIpIFNwZW5kIGFtb3VudCBmcm9tIHByZXBhaWQgKG92ZXJwYXkgc3RheXMgYXMgY3JlZGl0IHZpYSBjcmVkaXRSZWZ1bmQpLg0KLy8gTm8gVHJhbnNmZXJGcm9tLg0KLy8NCi8vIFRlc3RzICh0ZXN0U2tpcEJhbmtlcik6IE9yaWdpblNlbmQgdWdub3QgYXMgc3ludGhldGljIGNvbGxhdGVyYWwgdW5pdHMuDQpmdW5jIHRha2VXdWdub3RJbihjdXIgcmVhbG0sIGFtb3VudCBpbnQ2NCkgaW50NjQgew0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJaWYgdGVzdFNraXBCYW5rZXIgew0KCQkvLyBMb2NhbCB0ZXN0czogT3JpZ2luU2VuZCB1Z25vdCBzdGFuZHMgaW4gZm9yIFdVR05PVCB1bml0cy4NCgkJcmV0dXJuIHJlcXVpcmVVc2VyUGF5bWVudChjdXIpDQoJfQ0KCWlmIGFtb3VudCA8PSAwIHsNCgkJcGFuaWMoInBhZDogYW1vdW50V3Vnbm90IG11c3QgYmUgcG9zaXRpdmUiKQ0KCX0NCgl1c2VyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KCWhhdmUgOj0gcHJlcGFpZE9mKHVzZXIpDQoJaWYgaGF2ZSA8IGFtb3VudCB7DQoJCW5lZWQgOj0gYW1vdW50IC0gaGF2ZQ0KCQlmcmVlIDo9IGZyZWVXdWdub3RPblBhZCgpDQoJCWlmIGZyZWUgPCBuZWVkIHsNCgkJCWhhdmVQYWQgOj0gd3Vnbm90LkJhbGFuY2VPZihwYWRBZGRyKQ0KCQkJcmVzIDo9IHJlc2VydmVkV3Vnbm90KCkNCgkJCXBhbmljKCJwYWQ6IFRyYW5zZmVyICIgKyBzdHJjb252LkZvcm1hdEludChuZWVkLCAxMCkgKw0KCQkJCSIgbW9yZSBXVUdOT1QgdG8gcGFkIHRoZW4gQnV5IChmcmVlPSIgKyBzdHJjb252LkZvcm1hdEludChmcmVlLCAxMCkgKw0KCQkJCSIgcHJlcGFpZD0iICsgc3RyY29udi5Gb3JtYXRJbnQoaGF2ZSwgMTApICsNCgkJCQkiIGhhdmU9IiArIHN0cmNvbnYuRm9ybWF0SW50KGhhdmVQYWQsIDEwKSArDQoJCQkJIiByZXNlcnZlZD0iICsgc3RyY29udi5Gb3JtYXRJbnQocmVzLCAxMCkgKw0KCQkJCSIgbmVlZFRvdGFsPSIgKyBzdHJjb252LkZvcm1hdEludChhbW91bnQsIDEwKSArICIpIikNCgkJfQ0KCQkvLyBMb2NrIGZyZWUgaW50byB0aGlzIGNhbGxlcidzIHByZXBhaWQgKHJhaXNlcyByZXNlcnZlZCwgbG93ZXJzIGZyZWUpLg0KCQlhZGRQcmVwYWlkKHVzZXIsIG5lZWQpDQoJfQ0KCXN1YlByZXBhaWQodXNlciwgYW1vdW50KQ0KCXJldHVybiBhbW91bnQNCn0NCg0KLy8gY3JlZGl0UmVmdW5kIGtlZXBzIHVudXNlZCBCdXkgV1VHTk9UIGFzIGNsYWltYWJsZSBwcmVwYWlkIChub3QgaW5zdGFudCB3YWxsZXQgcmVmdW5kKS4NCi8vIFVzZXIgY2FsbHMgQ2xhaW1XdWdub3QgYWZ0ZXIgYnV5IC8gYWZ0ZXIgbGlzdCB3aGVuIGNvbnZlbmllbnQuDQpmdW5jIGNyZWRpdFJlZnVuZChidXllciBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsNCglpZiB0ZXN0U2tpcEJhbmtlciB8fCBhbW91bnQgPD0gMCB7DQoJCXJldHVybg0KCX0NCglhZGRQcmVwYWlkKGJ1eWVyLCBhbW91bnQpDQp9DQoNCi8vIHBheVd1Z25vdE91dCBzZW5kcyBXVUdOT1QgZnJvbSBwYWQgdG8gdXNlciAocHJvZHVjdGlvbikuDQovLyBUZXN0czogcGF5IHVnbm90IHZpYSBiYW5rZXIgd2hlbiB0ZXN0U2tpcEJhbmtlci4NCmZ1bmMgcGF5V3Vnbm90T3V0KGN1ciByZWFsbSwgdG8gYWRkcmVzcywgYW1vdW50IGludDY0KSB7DQoJaWYgYW1vdW50IDw9IDAgew0KCQlyZXR1cm4NCgl9DQoJaWYgdGVzdFNraXBCYW5rZXIgew0KCQlzZW5kVWdub3QoY3VyLCB0bywgYW1vdW50KQ0KCQlyZXR1cm4NCgl9DQoJaGF2ZSA6PSB3dWdub3QuQmFsYW5jZU9mKGN1ci5BZGRyZXNzKCkpDQoJaWYgaGF2ZSA8IGFtb3VudCB7DQoJCWFtb3VudCA9IGhhdmUNCgl9DQoJaWYgYW1vdW50ID4gMCB7DQoJCXd1Z25vdC5UcmFuc2Zlcihjcm9zcyhjdXIpLCB0bywgYW1vdW50KQ0KCX0NCn0NCg0KZnVuYyBub3RlQnV5ZXIobCAqTGF1bmNoLCBidXllciBhZGRyZXNzKSB7DQoJayA6PSBidXllci5TdHJpbmcoKQ0KCWlmIGwuVW5pcXVlQnV5ZXJzLkhhcyhrKSB7DQoJCXJldHVybg0KCX0NCglsLlVuaXF1ZUJ1eWVycy5TZXQoaywgdHJ1ZSkNCglsLkJ1eWVyQ291bnQrKw0KfQ0KDQpmdW5jIHRyYWRlS2V5KG4gaW50NjQpIHN0cmluZyB7DQoJcyA6PSBzdHJjb252LkZvcm1hdEludChuLCAxMCkNCglmb3IgbGVuKHMpIDwgMTIgew0KCQlzID0gIjAiICsgcw0KCX0NCglyZXR1cm4gcw0KfQ0KDQovLyBzcG90UHJpY2VTY2FsZWQgcmV0dXJucyB1Z25vdC90b2tlbiAqIDFlNiBmcm9tIGN1cnJlbnQgY3VydmUgb3IgcG9vbCByZXNlcnZlcy4NCmZ1bmMgc3BvdFByaWNlU2NhbGVkKGwgKkxhdW5jaCkgaW50NjQgew0KCWlmIGwuU3RhdHVzID09IFN0YXR1c0dyYWR1YXRlZCB7DQoJCWlmIGwuUG9vbFRva2VuIDw9IDAgew0KCQkJcmV0dXJuIDANCgkJfQ0KCQlyZXR1cm4gbC5Qb29sVWdub3QgKiAxMDAwMDAwIC8gbC5Qb29sVG9rZW4NCgl9DQoJaWYgbC5WaXJ0dWFsVG9rZW4gPD0gMCB7DQoJCXJldHVybiAwDQoJfQ0KCXJldHVybiBsLlZpcnR1YWxVZ25vdCAqIDEwMDAwMDAgLyBsLlZpcnR1YWxUb2tlbg0KfQ0KDQpmdW5jIHJlY29yZFRyYWRlKGwgKkxhdW5jaCwgc2lkZSBpbnQsIHVnbm90LCB0b2tlbnMgaW50NjQpIHsNCglsLk5leHRUcmFkZSsrDQoJdCA6PSAmVHJhZGV7DQoJCUhlaWdodDogcnVudGltZS5DaGFpbkhlaWdodCgpLA0KCQlTaWRlOiAgIHNpZGUsDQoJCVVnbm90OiAgdWdub3QsDQoJCVRva2VuczogdG9rZW5zLA0KCQlQcmljZTogIHNwb3RQcmljZVNjYWxlZChsKSwNCgl9DQoJbC5UcmFkZXMuU2V0KHRyYWRlS2V5KGwuTmV4dFRyYWRlKSwgdCkNCgkvLyBSaW5nIGJ1ZmZlcjogZHJvcCBvbGRlc3Qgd2hpbGUgb3ZlciBjYXAuDQoJZm9yIGwuVHJhZGVzLlNpemUoKSA+IE1heFRyYWRlSGlzdG9yeSB7DQoJCW9sZGVzdCA6PSAiIg0KCQlsLlRyYWRlcy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrIHN0cmluZywgXyBhbnkpIGJvb2wgew0KCQkJb2xkZXN0ID0gaw0KCQkJcmV0dXJuIHRydWUgLy8gc3RvcA0KCQl9KQ0KCQlpZiBvbGRlc3QgPT0gIiIgew0KCQkJYnJlYWsNCgkJfQ0KCQlsLlRyYWRlcy5SZW1vdmUob2xkZXN0KQ0KCX0NCn0NCg0KZnVuYyBtYXliZVJlZnVuZEJvbmQoY3VyIHJlYWxtLCBsICpMYXVuY2gpIHsNCglpZiBsLkJvbmRSZWZ1bmRlZCB8fCBsLkJvbmRVZ25vdCA8PSAwIHsNCgkJcmV0dXJuDQoJfQ0KCWlmIGwuQnV5ZXJDb3VudCA8IEJvbmRSZWZ1bmRCdXllcnMgew0KCQlyZXR1cm4NCgl9DQoJLy8gUXVhbGl0eSBnYXRlOiBwdXJlIHN5YmlsIG1pY3JvLWJ1eXMgY2Fubm90IHJlZnVuZCBib25kLg0KCWlmIGwuUmFpc2VkVWdub3QgPCBCb25kUmVmdW5kTWluUmFpc2VkIHsNCgkJcmV0dXJuDQoJfQ0KCWlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKS1sLkNyZWF0ZWQgPiBCb25kUmVmdW5kTWF4SGVpZ2h0cyB7DQoJCXJldHVybg0KCX0NCglhbXQgOj0gbC5Cb25kVWdub3QNCglsLkJvbmRVZ25vdCA9IDANCglsLkJvbmRSZWZ1bmRlZCA9IHRydWUNCglzZW5kVWdub3QoY3VyLCBsLkNyZWF0b3IsIGFtdCkNCgljaGFpbi5FbWl0KCJCb25kUmVmdW5kIiwgImlkIiwgbC5JRCwgImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtdCwgMTApKQ0KfQ0KDQovLyByZXF1aXJlZENyZWF0ZUJvbmQgcmV0dXJucyB1Z25vdCB0aGUgY3JlYXRvciBtdXN0IHNlbmQuDQovLyBQcm9kdWN0aW9uOiBjcmVhdGVib25kLkN1cnJlbnRCb25kVWdub3QoKSAocHJvbW8gb3Igbm9ybWFsKS4NCi8vIFVuaXQgdGVzdHMgKHRlc3RTa2lwQmFua2VyKTogbG9jYWwgQ3JlYXRlQm9uZFVnbm90IGNvbnN0YW50Lg0KZnVuYyByZXF1aXJlZENyZWF0ZUJvbmQoKSBpbnQ2NCB7DQoJaWYgdGVzdFNraXBCYW5rZXIgew0KCQlyZXR1cm4gQ3JlYXRlQm9uZFVnbm90DQoJfQ0KCXJldHVybiBjcmVhdGVib25kLkN1cnJlbnRCb25kVWdub3QoKQ0KfQ0KDQovLyBDcmVhdGVCb25kUmVxdWlyZWQgaXMgYSBwdWJsaWMgYWxpYXMgZm9yIFVJcyAvIHFldmFsIChzYW1lIGFzIHJlcXVpcmVkQ3JlYXRlQm9uZCkuDQpmdW5jIENyZWF0ZUJvbmRSZXF1aXJlZCgpIGludDY0IHsNCglyZXR1cm4gcmVxdWlyZWRDcmVhdGVCb25kKCkNCn0NCg0KLy8gcmVxdWlyZWRMaXN0RmVlR25zIHJldHVybnMgR05TIGJhc2UgdW5pdHMgdGhlIGNyZWF0b3IgbXVzdCBwcmUtZnVuZCAoZnJlZSBvbiBwYWQpLg0KLy8gTGl2ZSB2YWx1ZSBmcm9tIFNldExpc3RGZWVHbnM7IGZhbGxzIGJhY2sgdG8gTGlzdEZlZUducyBjb25zdC4NCmZ1bmMgcmVxdWlyZWRMaXN0RmVlR25zKCkgaW50NjQgew0KCWlmIGxpc3RGZWVHbnNMaXZlID4gMCB7DQoJCXJldHVybiBsaXN0RmVlR25zTGl2ZQ0KCX0NCglpZiBMaXN0RmVlR25zID4gMCB7DQoJCXJldHVybiBMaXN0RmVlR25zDQoJfQ0KCXJldHVybiAxMDBfMDAwXzAwMA0KfQ0KDQovLyBMaXN0RmVlUmVxdWlyZWQgaXMgYSBwdWJsaWMgYWxpYXMgZm9yIFVJcyAvIHFldmFsLg0KZnVuYyBMaXN0RmVlUmVxdWlyZWQoKSBpbnQ2NCB7DQoJcmV0dXJuIHJlcXVpcmVkTGlzdEZlZUducygpDQp9DQoNCi8vIGZyZWVHbnNPblBhZCBpcyBHTlMgb24gcGFkIGFib3ZlIHBlci1sYXVuY2ggbGlzdC1mZWUgZXNjcm93Lg0KZnVuYyBmcmVlR25zT25QYWQoKSBpbnQ2NCB7DQoJaWYgdGVzdFNraXBCYW5rZXIgew0KCQkvLyBUZXN0cyBza2lwIEdOUyBpbnZlbnRvcnkgY2hlY2tzLg0KCQlyZXR1cm4gcmVxdWlyZWRMaXN0RmVlR25zKCkNCgl9DQoJaGF2ZSA6PSBnbnMuQmFsYW5jZU9mKHBhZEFkZHIpDQoJZnJlZSA6PSBoYXZlIC0gdG90YWxMaXN0RmVlR25zDQoJaWYgZnJlZSA8IDAgew0KCQlyZXR1cm4gMA0KCX0NCglyZXR1cm4gZnJlZQ0KfQ0KDQovLyBGcmVlR25zIHJldHVybnMgZnJlZXxoYXZlfHJlc2VydmVkIGZvciBVSSBwcmVmbGlnaHQgKEdOUyBsaXN0IGZlZSkuDQpmdW5jIEZyZWVHbnMoKSBzdHJpbmcgew0KCWhhdmUgOj0gaW50NjQoMCkNCglpZiAhdGVzdFNraXBCYW5rZXIgew0KCQloYXZlID0gZ25zLkJhbGFuY2VPZihwYWRBZGRyKQ0KCX0NCglmcmVlIDo9IGZyZWVHbnNPblBhZCgpDQoJcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KGZyZWUsIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KGhhdmUsIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KHRvdGFsTGlzdEZlZUducywgMTApDQp9DQoNCi8vIGxvY2tMaXN0RmVlRXNjcm93IGVhcm1hcmtzIGZyZWUgR05TIGZvciB0aGlzIGxhdW5jaCdzIENyZWF0ZVBvb2wgZmVlLg0KZnVuYyBsb2NrTGlzdEZlZUVzY3JvdyhsICpMYXVuY2gsIGFtdCBpbnQ2NCkgew0KCWlmIGwgPT0gbmlsIHx8IGFtdCA8PSAwIHsNCgkJcmV0dXJuDQoJfQ0KCWlmIGZyZWVHbnNPblBhZCgpIDwgYW10IHsNCgkJaGF2ZSA6PSBpbnQ2NCgwKQ0KCQlpZiAhdGVzdFNraXBCYW5rZXIgew0KCQkJaGF2ZSA9IGducy5CYWxhbmNlT2YocGFkQWRkcikNCgkJfQ0KCQlwYW5pYygicGFkOiBUcmFuc2ZlciAiICsgc3RyY29udi5Gb3JtYXRJbnQoYW10LCAxMCkgKw0KCQkJIiBHTlMgdG8gcGFkIHRoZW4gQ3JlYXRlIChmcmVlPSIgKyBzdHJjb252LkZvcm1hdEludChmcmVlR25zT25QYWQoKSwgMTApICsNCgkJCSIgaGF2ZT0iICsgc3RyY29udi5Gb3JtYXRJbnQoaGF2ZSwgMTApICsNCgkJCSIgcmVzZXJ2ZWQ9IiArIHN0cmNvbnYuRm9ybWF0SW50KHRvdGFsTGlzdEZlZUducywgMTApICsgIikiKQ0KCX0NCgl0b3RhbExpc3RGZWVHbnMgKz0gYW10DQoJbC5MaXN0RmVlR25zID0gYW10DQoJbC5MaXN0RmVlQ29uc3VtZWQgPSBmYWxzZQ0KfQ0KDQovLyBsaXN0RmVlRm9yVmVudWU6IGdub3N3YXAg4oaSIExpc3RGZWVSZXF1aXJlZDsgemRleCAvIG90aGVyIOKGkiAwLg0KZnVuYyBsaXN0RmVlRm9yVmVudWUodmVudWVJZCBzdHJpbmcpIGludDY0IHsNCglpZiBub3JtYWxpemVWZW51ZUlEKHZlbnVlSWQpID09IFZlbnVlR25vc3dhcCB7DQoJCXJldHVybiByZXF1aXJlZExpc3RGZWVHbnMoKQ0KCX0NCglyZXR1cm4gMA0KfQ0KDQovLyBMaXN0RmVlUmVxdWlyZWRGb3IgaXMgdmVudWUtYXdhcmUgQ3JlYXRlIGZlZSBmb3IgVUkgcHJlZmxpZ2h0Lg0KZnVuYyBMaXN0RmVlUmVxdWlyZWRGb3IodmVudWVJZCBzdHJpbmcpIGludDY0IHsNCgllbnN1cmVMaXN0VmVudWVzU2VlZGVkKCkNCglyZXR1cm4gbGlzdEZlZUZvclZlbnVlKHZlbnVlSWQpDQp9DQoNCi8vIHVubG9ja0xpc3RGZWVFc2Nyb3cgY2xlYXJzIGxhdW5jaCBHTlMgZXNjcm93OyByZWZ1bmQgc2VuZHMgR05TIGJhY2sgdG8gY3JlYXRvci4NCmZ1bmMgdW5sb2NrTGlzdEZlZUVzY3JvdyhjdXIgcmVhbG0sIGwgKkxhdW5jaCwgcmVmdW5kIGJvb2wpIHsNCglpZiBsID09IG5pbCB8fCBsLkxpc3RGZWVHbnMgPD0gMCB8fCBsLkxpc3RGZWVDb25zdW1lZCB7DQoJCXJldHVybg0KCX0NCglhbXQgOj0gbC5MaXN0RmVlR25zDQoJbC5MaXN0RmVlR25zID0gMA0KCXRvdGFsTGlzdEZlZUducyAtPSBhbXQNCglpZiB0b3RhbExpc3RGZWVHbnMgPCAwIHsNCgkJdG90YWxMaXN0RmVlR25zID0gMA0KCX0NCglpZiByZWZ1bmQgJiYgIXRlc3RTa2lwQmFua2VyICYmIGFtdCA+IDAgew0KCQloYXZlIDo9IGducy5CYWxhbmNlT2YocGFkQWRkcikNCgkJaWYgaGF2ZSA8IGFtdCB7DQoJCQlhbXQgPSBoYXZlDQoJCX0NCgkJaWYgYW10ID4gMCB7DQoJCQlnbnMuVHJhbnNmZXIoY3Jvc3MoY3VyKSwgbC5DcmVhdG9yLCBhbXQpDQoJCX0NCgl9DQoJY2hhaW4uRW1pdCgiTGlzdEZlZVVubG9ja2VkIiwNCgkJImlkIiwgbC5JRCwNCgkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtdCwgMTApLA0KCQkicmVmdW5kIiwgc3RyY29udi5Gb3JtYXRCb29sKHJlZnVuZCksDQoJKQ0KfQ0KDQovLyBzeW5jTGlzdEZlZUZvclZlbnVlIGFkanVzdHMgZXNjcm93IGFmdGVyIFByZWZlcnJlZFZlbnVlIGNoYW5nZSAocHJlLWxpc3Qgb25seSkuDQpmdW5jIHN5bmNMaXN0RmVlRm9yVmVudWUoY3VyIHJlYWxtLCBsICpMYXVuY2gsIHZpZCBzdHJpbmcpIHsNCglpZiBsID09IG5pbCB8fCBsLkxpc3RGZWVDb25zdW1lZCB8fCBsLkdub3N3YXBMaXN0ZWQgfHwgbC5MaXN0VmVudWUgIT0gIiIgew0KCQlyZXR1cm4NCgl9DQoJd2FudCA6PSBsaXN0RmVlRm9yVmVudWUodmlkKQ0KCWlmIGwuTGlzdEZlZUducyA9PSB3YW50IHsNCgkJcmV0dXJuDQoJfQ0KCWlmIGwuTGlzdEZlZUducyA+IDAgew0KCQl1bmxvY2tMaXN0RmVlRXNjcm93KGN1ciwgbCwgdHJ1ZSkNCgl9DQoJbG9ja0xpc3RGZWVFc2Nyb3cobCwgd2FudCkNCn0NCg0KLy8gY29uc3VtZUxpc3RGZWVFc2Nyb3cgY2xlYXJzIGxhdW5jaCBlc2Nyb3cgYWZ0ZXIgc3VjY2Vzc2Z1bCBHbm9zd2FwIGxpc3QNCi8vIChDcmVhdGVQb29sIHNwZW50IGZlZU5lZWQgR05TIGZyb20gcGFkIGJhbGFuY2UpLg0KZnVuYyBjb25zdW1lTGlzdEZlZUVzY3JvdyhsICpMYXVuY2gpIHsNCglpZiBsID09IG5pbCB8fCBsLkxpc3RGZWVHbnMgPD0gMCB7DQoJCXJldHVybg0KCX0NCglhbXQgOj0gbC5MaXN0RmVlR25zDQoJdG90YWxMaXN0RmVlR25zIC09IGFtdA0KCWlmIHRvdGFsTGlzdEZlZUducyA8IDAgew0KCQl0b3RhbExpc3RGZWVHbnMgPSAwDQoJfQ0KCWwuTGlzdEZlZUducyA9IDANCglsLkxpc3RGZWVDb25zdW1lZCA9IHRydWUNCgljaGFpbi5FbWl0KCJMaXN0RmVlQ29uc3VtZWQiLCAiaWQiLCBsLklELCAiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQoYW10LCAxMCkpDQp9DQoNCi8vIENsYWltTGlzdEZlZSByZWZ1bmRzIENyZWF0ZS10aW1lIEdOUyBlc2Nyb3cgdG8gdGhlIHRva2VuIGNyZWF0b3IgaWYgc3RpbGwgdW5saXN0ZWQuDQovLyBVc2Ugd2hlbiBncmFkdWF0ZS9saXN0IHdpbGwgbm90IGNvbXBsZXRlIG9yIGNyZWF0b3IgYWJhbmRvbnMgbGlzdGluZy4NCmZ1bmMgQ2xhaW1MaXN0RmVlKGN1ciByZWFsbSwgaWQgc3RyaW5nKSBpbnQ2NCB7DQoJcmVxdWlyZUluaXQoKQ0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkNCglpZiBjYWxsZXIgIT0gbC5DcmVhdG9yIHsNCgkJcGFuaWMoInBhZDogb25seSBjcmVhdG9yIG1heSBjbGFpbSBsaXN0IGZlZSIpDQoJfQ0KCWlmIGwuR25vc3dhcExpc3RlZCB7DQoJCXBhbmljKCJwYWQ6IGFscmVhZHkgbGlzdGVkIC0gbGlzdCBmZWUgc3BlbnQiKQ0KCX0NCglpZiBsLkxpc3RGZWVDb25zdW1lZCB7DQoJCXBhbmljKCJwYWQ6IGxpc3QgZmVlIGFscmVhZHkgY29uc3VtZWQiKQ0KCX0NCglhbXQgOj0gbC5MaXN0RmVlR25zDQoJaWYgYW10IDw9IDAgew0KCQlyZXR1cm4gMA0KCX0NCglsLkxpc3RGZWVHbnMgPSAwDQoJdG90YWxMaXN0RmVlR25zIC09IGFtdA0KCWlmIHRvdGFsTGlzdEZlZUducyA8IDAgew0KCQl0b3RhbExpc3RGZWVHbnMgPSAwDQoJfQ0KCWlmICF0ZXN0U2tpcEJhbmtlciAmJiBhbXQgPiAwIHsNCgkJaGF2ZSA6PSBnbnMuQmFsYW5jZU9mKHBhZEFkZHIpDQoJCWlmIGhhdmUgPCBhbXQgew0KCQkJYW10ID0gaGF2ZQ0KCQl9DQoJCWlmIGFtdCA+IDAgew0KCQkJZ25zLlRyYW5zZmVyKGNyb3NzKGN1ciksIGwuQ3JlYXRvciwgYW10KQ0KCQl9DQoJfQ0KCWNoYWluLkVtaXQoIkNsYWltTGlzdEZlZSIsDQoJCSJpZCIsIGlkLA0KCQkiY3JlYXRvciIsIGwuQ3JlYXRvci5TdHJpbmcoKSwNCgkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtdCwgMTApLA0KCSkNCglyZXR1cm4gYW10DQp9DQoNCi8vIENyZWF0ZSBkZXBsb3lzIGEgZmFpci1sYXVuY2ggbWVtZS4gQm9uZCBhbW91bnQgZnJvbSBib25kIHJlYWxtIChvciBmYWxsYmFjayBjb25zdCkuDQovLyBBbHNvIGxvY2tzIExpc3RGZWVHbnMgZnJlZSBHTlMgKGNyZWF0b3IgbXVzdCBUcmFuc2ZlciBHTlMgdG8gcGFkIGZpcnN0KS4NCi8vIE5vIHByZS1taW50OyBhbGwgdHJhZGVhYmxlIGZsb2F0IHN0YXJ0cyBvbiB0aGUgYm9uZGluZyBjdXJ2ZS4NCmZ1bmMgQ3JlYXRlKGN1ciByZWFsbSwgbmFtZSwgc3ltYm9sLCB1cmkgc3RyaW5nKSBzdHJpbmcgew0KCXJlcXVpcmVJbml0KCkNCglzZW50IDo9IHJlcXVpcmVVc2VyUGF5bWVudChjdXIpDQoJYm9uZE5lZWQgOj0gcmVxdWlyZWRDcmVhdGVCb25kKCkNCglpZiBib25kTmVlZCA8PSAwIHsNCgkJcGFuaWMoInBhZDogY3JlYXRlIGJvbmQgbWlzY29uZmlndXJlZCIpDQoJfQ0KCWlmIHNlbnQgPCBib25kTmVlZCB7DQoJCXBhbmljKCJwYWQ6IGNyZWF0ZSBib25kIHVuZGVycGFpZCIpDQoJfQ0KCWlmIG5hbWUgPT0gIiIgfHwgc3ltYm9sID09ICIiIHsNCgkJcGFuaWMoInBhZDogbmFtZSBhbmQgc3ltYm9sIHJlcXVpcmVkIikNCgl9DQoJaWYgbGVuKHN5bWJvbCkgPiAxMiB7DQoJCXBhbmljKCJwYWQ6IHN5bWJvbCB0b28gbG9uZyIpDQoJfQ0KCWlmIGJ5U3ltYm9sLkhhcyhzeW1ib2wpIHsNCgkJcGFuaWMoInBhZDogc3ltYm9sIHRha2VuIikNCgl9DQoJZXh0cmEgOj0gc2VudCAtIGJvbmROZWVkDQoJaWYgZXh0cmEgPiAwIHsNCgkJY3JlZGl0UHJvdG9jb2woZXh0cmEpDQoJfQ0KDQoJY3JlYXRvciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkNCglpZCA6PSBuZXh0SUQuTmV4dCgpLlN0cmluZygpDQoNCgkvLyBSZWFsIEdSQzIwIGJvdW5kIHRvIHRoaXMgcGFkIHJlYWxtIChtaW50L2J1cm4gb25seSB2aWEgcGFkIGxlZGdlcikuDQoJLy8gRGVjaW1hbHM9MDogd2hvbGUtdG9rZW4gdW5pdHMgKG1hdGNoZXMgZXhpc3RpbmcgdHJhZGUgYW1vdW50cykuDQoJdG9rZW4sIGxlZGdlciA6PSBncmMyMC5OZXdUb2tlbihuYW1lLCBzeW1ib2wsIDAsIG5leHRUb2tlbklELk5leHQoKSwgY3VyKQ0KDQoJLy8gQWRlbmEgKGFuZCBHbm9zd2FwIHJlZ2lzdHJpZXMpIHJlc29sdmUgdG9rZW5zIE9OTFkgdmlhIGdyYzIwcmVnIHVuZGVyIGtleQ0KCS8vIHBhY2thZ2VQYXRoLlNZTUJPTCAtIFRva2VuLklEKCkgaXRzZWxmIGlzIHBhY2thZ2VQYXRoLlNZTUJPTC5zZXEgYW5kIGlzDQoJLy8gcmVqZWN0ZWQgYXMgIkludmFsaWQgcGF0aCIgaWYgcGFzdGVkIGludG8gQWRlbmEgd2l0aG91dCByZWdpc3RyYXRpb24uDQoJLy8gU2tpcCBpbiB1bml0IHRlc3RzICh0ZXN0U2tpcEJhbmtlcik7IHByb2R1Y3Rpb24gYWx3YXlzIHJlZ2lzdGVycy4NCglyZWdLZXkgOj0gIiINCglpZiAhdGVzdFNraXBCYW5rZXIgew0KCQlyZWdLZXkgPSBncmMyMHJlZy5SZWdpc3Rlcihjcm9zcyhjdXIpLCB0b2tlbiwgc3ltYm9sKQ0KCX0NCg0KCWVuc3VyZUxpc3RWZW51ZXNTZWVkZWQoKQ0KCXByZWYgOj0gRGVmYXVsdExpc3RWZW51ZSgpDQoJcmV0dXJuIGZpbmlzaENyZWF0ZShjdXIsIGlkLCBuYW1lLCBzeW1ib2wsIHVyaSwgY3JlYXRvciwgdG9rZW4sIGxlZGdlciwgcmVnS2V5LCBib25kTmVlZCwgcHJlZikNCn0NCg0KLy8gQ3JlYXRlV2l0aFZlbnVlIGlzIENyZWF0ZSArIFByZWZlcnJlZFZlbnVlIGluIG9uZSBNc2dDYWxsIChmZWUgZXNjcm93IGZvbGxvd3MgdmVudWUpLg0KLy8gdmVudWVJZDogInpkZXgiIOKGkiBubyBHTlMgbGlzdCBlc2Nyb3c7ICJnbm9zd2FwIiDihpIgTGlzdEZlZVJlcXVpcmVkIEdOUy4NCmZ1bmMgQ3JlYXRlV2l0aFZlbnVlKGN1ciByZWFsbSwgbmFtZSwgc3ltYm9sLCB1cmksIHZlbnVlSWQgc3RyaW5nKSBzdHJpbmcgew0KCXJlcXVpcmVJbml0KCkNCglzZW50IDo9IHJlcXVpcmVVc2VyUGF5bWVudChjdXIpDQoJYm9uZE5lZWQgOj0gcmVxdWlyZWRDcmVhdGVCb25kKCkNCglpZiBib25kTmVlZCA8PSAwIHsNCgkJcGFuaWMoInBhZDogY3JlYXRlIGJvbmQgbWlzY29uZmlndXJlZCIpDQoJfQ0KCWlmIHNlbnQgPCBib25kTmVlZCB7DQoJCXBhbmljKCJwYWQ6IGNyZWF0ZSBib25kIHVuZGVycGFpZCIpDQoJfQ0KCW5hbWUgPSBzdHJpbmdzLlRyaW1TcGFjZShuYW1lKQ0KCXN5bWJvbCA9IHN0cmluZ3MuVHJpbVNwYWNlKHN5bWJvbCkNCgl1cmkgPSBzdHJpbmdzLlRyaW1TcGFjZSh1cmkpDQoJaWYgbmFtZSA9PSAiIiB8fCBzeW1ib2wgPT0gIiIgew0KCQlwYW5pYygicGFkOiBuYW1lIGFuZCBzeW1ib2wgcmVxdWlyZWQiKQ0KCX0NCglpZiBsZW4oc3ltYm9sKSA+IDEyIHsNCgkJcGFuaWMoInBhZDogc3ltYm9sIHRvbyBsb25nIikNCgl9DQoJaWYgYnlTeW1ib2wuSGFzKHN5bWJvbCkgew0KCQlwYW5pYygicGFkOiBzeW1ib2wgdGFrZW4iKQ0KCX0NCglleHRyYSA6PSBzZW50IC0gYm9uZE5lZWQNCglpZiBleHRyYSA+IDAgew0KCQljcmVkaXRQcm90b2NvbChleHRyYSkNCgl9DQoJY3JlYXRvciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkNCglpZCA6PSBuZXh0SUQuTmV4dCgpLlN0cmluZygpDQoJdG9rZW4sIGxlZGdlciA6PSBncmMyMC5OZXdUb2tlbihuYW1lLCBzeW1ib2wsIDAsIG5leHRUb2tlbklELk5leHQoKSwgY3VyKQ0KCXJlZ0tleSA6PSAiIg0KCWlmICF0ZXN0U2tpcEJhbmtlciB7DQoJCXJlZ0tleSA9IGdyYzIwcmVnLlJlZ2lzdGVyKGNyb3NzKGN1ciksIHRva2VuLCBzeW1ib2wpDQoJfQ0KCWVuc3VyZUxpc3RWZW51ZXNTZWVkZWQoKQ0KCXZpZCA6PSBub3JtYWxpemVWZW51ZUlEKHZlbnVlSWQpDQoJaWYgIXZlbnVlRW5hYmxlZCh2aWQpIHsNCgkJcGFuaWMoInBhZDogdmVudWUgZGlzYWJsZWQgb3IgdW5rbm93biIpDQoJfQ0KCXJldHVybiBmaW5pc2hDcmVhdGUoY3VyLCBpZCwgbmFtZSwgc3ltYm9sLCB1cmksIGNyZWF0b3IsIHRva2VuLCBsZWRnZXIsIHJlZ0tleSwgYm9uZE5lZWQsIHZpZCkNCn0NCg0KZnVuYyBmaW5pc2hDcmVhdGUoDQoJY3VyIHJlYWxtLA0KCWlkLCBuYW1lLCBzeW1ib2wsIHVyaSBzdHJpbmcsDQoJY3JlYXRvciBhZGRyZXNzLA0KCXRva2VuICpncmMyMC5Ub2tlbiwNCglsZWRnZXIgKmdyYzIwLlByaXZhdGVMZWRnZXIsDQoJcmVnS2V5IHN0cmluZywNCglib25kTmVlZCBpbnQ2NCwNCglwcmVmIHN0cmluZywNCikgc3RyaW5nIHsNCglsIDo9ICZMYXVuY2h7DQoJCUlEOiAgICAgICAgICAgICBpZCwNCgkJTmFtZTogICAgICAgICAgIG5hbWUsDQoJCVN5bWJvbDogICAgICAgICBzeW1ib2wsDQoJCVVSSTogICAgICAgICAgICB1cmksDQoJCUNyZWF0b3I6ICAgICAgICBjcmVhdG9yLA0KCQlTdGF0dXM6ICAgICAgICAgU3RhdHVzQ3VydmUsDQoJCUNyZWF0ZWQ6ICAgICAgICBydW50aW1lLkNoYWluSGVpZ2h0KCksDQoJCXRva2VuOiAgICAgICAgICB0b2tlbiwNCgkJbGVkZ2VyOiAgICAgICAgIGxlZGdlciwNCgkJVG9rZW5JRDogICAgICAgIHRva2VuLklEKCksDQoJCVZpcnR1YWxVZ25vdDogICBWaXJ0dWFsVWdub3QwLA0KCQlWaXJ0dWFsVG9rZW46ICAgVmlydHVhbFRva2VuMCwNCgkJVW5pcXVlQnV5ZXJzOiAgIGF2bC5UcmVle30sDQoJCXNuaXBlQm91Z2h0OiAgICBhdmwuVHJlZXt9LA0KCQlCb25kVWdub3Q6ICAgICAgYm9uZE5lZWQsDQoJCVRyYWRlczogICAgICAgICBhdmwuVHJlZXt9LA0KCQlQcmVmZXJyZWRWZW51ZTogcHJlZiwNCgl9DQoJLy8gVmVudWUtYXdhcmUgbGlzdCBmZWU6IHpkZXgg4oaSIDAgR05TOyBnbm9zd2FwIOKGkiBMaXN0RmVlUmVxdWlyZWQuDQoJbG9ja0xpc3RGZWVFc2Nyb3cobCwgbGlzdEZlZUZvclZlbnVlKHByZWYpKQ0KCXJlY29yZFRyYWRlKGwsIFRyYWRlU2lkZU9wZW4sIDAsIDApDQoJbGF1bmNoZXMuU2V0KGlkLCBsKQ0KCWJ5U3ltYm9sLlNldChzeW1ib2wsIGlkKQ0KDQoJY2hhaW4uRW1pdCgiQ3JlYXRlZCIsDQoJCSJpZCIsIGlkLA0KCQkic3ltYm9sIiwgc3ltYm9sLA0KCQkiY3JlYXRvciIsIGNyZWF0b3IuU3RyaW5nKCksDQoJCSJ0b2tlbiIsIGwuVG9rZW5JRCwNCgkJInJlZyIsIHJlZ0tleSwNCgkJImxpc3RGZWVHbnMiLCBzdHJjb252LkZvcm1hdEludChsLkxpc3RGZWVHbnMsIDEwKSwNCgkJInByZWZlcnJlZFZlbnVlIiwgcHJlZiwNCgkpDQoJbm90aWZ5Q3JlYXRlKGN1ciwgY3JlYXRvciwgaWQpDQoJcmV0dXJuIGlkDQp9DQoNCi8vIEFkZW5hUGF0aE9mIHJldHVybnMgdGhlIGdyYzIwcmVnIC8gQWRlbmEgdG9rZW4ga2V5OiBwYWNrYWdlUGF0aC5TWU1CT0wNCi8vIChUb2tlbi5JRCBpcyBwYWNrYWdlUGF0aC5TWU1CT0wuc2VxIC0gQWRlbmEgcmVqZWN0cyB0aGF0IGZvcm0pLg0KZnVuYyBBZGVuYVBhdGhPZihpZCBzdHJpbmcpIHN0cmluZyB7DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCXJldHVybiBhZGVuYUtleUZyb21Ub2tlbklEKGwuVG9rZW5JRCwgbC5TeW1ib2wpDQp9DQoNCi8vIGFkZW5hS2V5RnJvbVRva2VuSUQgc3RyaXBzIHRoZSB0cmFpbGluZyAuc2VxIGZyb20gVG9rZW4uSUQgd2hlbiBwcmVzZW50Lg0KZnVuYyBhZGVuYUtleUZyb21Ub2tlbklEKHRva2VuSUQsIHN5bWJvbCBzdHJpbmcpIHN0cmluZyB7DQoJaWYgdG9rZW5JRCA9PSAiIiB7DQoJCXJldHVybiAiIg0KCX0NCgkvLyBUb2tlbi5JRCA9IHBhY2thZ2VQYXRoLnN5bWJvbC5zZXEgLT4gcmVnaXN0cnkga2V5ID0gcGFja2FnZVBhdGguc3ltYm9sDQoJc3VmZml4IDo9ICIuIiArIHN5bWJvbCArICIuIg0KCWlmIGkgOj0gc3RyaW5ncy5MYXN0SW5kZXgodG9rZW5JRCwgc3VmZml4KTsgaSA+PSAwIHsNCgkJLy8gcGFja2FnZVBhdGggKyAiLiIgKyBzeW1ib2wNCgkJcmV0dXJuIHRva2VuSURbOmldICsgIi4iICsgc3ltYm9sDQoJfQ0KCS8vIEFscmVhZHkgcGFja2FnZVBhdGguc3ltYm9sIG9yIHVua25vd24gbGF5b3V0DQoJaWYgc3RyaW5ncy5IYXNTdWZmaXgodG9rZW5JRCwgIi4iK3N5bWJvbCkgew0KCQlyZXR1cm4gdG9rZW5JRA0KCX0NCglyZXR1cm4gdG9rZW5JRA0KfQ0KDQovLyBtYXhHcm9zc0Zvck5ldEluIGZpbmRzIGxhcmdlc3QgZ3Jvc3MgdWdub3QgPD0gc2VudE1heCB3aG9zZSBmZWUtc3BsaXQgbmV0SW4gPD0gbWF4TmV0Lg0KZnVuYyBtYXhHcm9zc0Zvck5ldEluKG1heE5ldCwgc2VudE1heCBpbnQ2NCkgaW50NjQgew0KCWlmIG1heE5ldCA8PSAwIHx8IHNlbnRNYXggPD0gMCB7DQoJCXJldHVybiAwDQoJfQ0KCWxvLCBoaSA6PSBpbnQ2NCgwKSwgc2VudE1heA0KCWZvciBsbyA8IGhpIHsNCgkJbWlkIDo9IChsbyArIGhpICsgMSkgLyAyDQoJCWYgOj0gYW1tbWF0aC5BcHBseUZlZShtaWQsIEZlZUJQUywgQ3JlYXRvckZlZVNoYXJlQlBTLCBQcm90b2NvbEZlZVNoYXJlQlBTKQ0KCQluZXQgOj0gZi5OZXQgKyBmLlJlbWFpbmRlcg0KCQlpZiBuZXQgPD0gbWF4TmV0IHsNCgkJCWxvID0gbWlkDQoJCX0gZWxzZSB7DQoJCQloaSA9IG1pZCAtIDENCgkJfQ0KCX0NCglyZXR1cm4gbG8NCn0NCg0KLy8gcmVhZHlUb0dyYWR1YXRlIGlzIHRydWUgd2hlbiByYWlzZSBtZXQgdGhlIHRocmVzaG9sZCwgb3IgdGhlIGVudGlyZSBjdXJ2ZQ0KLy8gZmxvYXQgaXMgc29sZCAoc29sZC1vdXQgZXNjYXBlOiB0aHJlc2hvbGQgbWF5IGJlIHVucmVhY2hhYmxlIHdpdGggYmFkIHZpcnR1YWxzKS4NCmZ1bmMgcmVhZHlUb0dyYWR1YXRlKGwgKkxhdW5jaCkgYm9vbCB7DQoJaWYgbCA9PSBuaWwgfHwgbC5TdGF0dXMgIT0gU3RhdHVzQ3VydmUgew0KCQlyZXR1cm4gZmFsc2UNCgl9DQoJaWYgbC5SYWlzZWRVZ25vdCA8PSAwIHsNCgkJcmV0dXJuIGZhbHNlDQoJfQ0KCWlmIGFtbW1hdGguQ2FuR3JhZHVhdGUobC5SYWlzZWRVZ25vdCwgZ3JhZHVhdGlvblRocmVzaG9sZCgpKSB7DQoJCXJldHVybiB0cnVlDQoJfQ0KCS8vIEN1cnZlIGV4aGF1c3RlZCBiZWZvcmUgdGhyZXNob2xkOiBzdGlsbCBncmFkdWF0ZSB3aXRoIHdoYXRldmVyIHdhcyByYWlzZWQNCgkvLyBzbyB0aGUgbWFya2V0IGlzIG5ldmVyIHBlcm1hbmVudGx5IHN0dWNrIG9uIEJ1eS9HcmFkdWF0ZS4NCglyZXR1cm4gbC5SZWFsU29sZCA+PSBDdXJ2ZVN1cHBseQ0KfQ0KDQovLyBCdXkgc3BlbmRzIFdVR05PVCBvbiB0aGUgYm9uZGluZyBjdXJ2ZTsgY3JlZGl0cyB0b2tlbnMuDQovLyBhbW91bnRXdWdub3Q6IG1heCB0byBzcGVuZCAobWF5IG92ZXJwYXkpLiBVSTogRGVwb3NpdCArIFRyYW5zZmVyKHBhZCwgYW10KSArIEJ1eS4NCi8vIE92ZXJwYXkgc3RheXMgYXMgY2xhaW1hYmxlIHByZXBhaWQg4oCUIENsYWltV3Vnbm90IGFueXRpbWUgKGluY2wuIGFmdGVyIGxpc3QpLg0KLy8gbWluVG9rZW5zT3V0OiBzbGlwcGFnZSBmbG9vciAoMCA9IGRpc2FibGVkKS4gQXV0by1ncmFkdWF0ZXMgYXQgdGhyZXNob2xkIG9yIHNvbGQtb3V0Lg0KLy8NCi8vIFByb2R1Y3Rpb246IGNvbGxhdGVyYWwgaXMgcmVhbCBXVUdOT1Qgb24gcGFkIC0+IEdyYWR1YXRlIGNhbiBhdXRvLWxpc3QgR25vc3dhcC4NCi8vIFRlc3RzICh0ZXN0U2tpcEJhbmtlcik6IGFtb3VudFd1Z25vdCBpZ25vcmVkOyBPcmlnaW5TZW5kIHVnbm90IGlzIHVzZWQgYXMgdW5pdHMuDQovLw0KLy8gTGFzdC1maWxsIChubyBvdmVyc2hvb3QpOg0KLy8gIDEuIENhcCBuZXQgc28gUmFpc2VkVWdub3QgbmV2ZXIgZXhjZWVkcyBncmFkdWF0aW9uVGhyZXNob2xkKCkgKHJlZnVuZCBleGNlc3MgV1VHTk9UKS4NCi8vICAyLiBDYXAgYnkgcmVtYWluaW5nIGN1cnZlIHRva2VucyAoQ3VydmVTdXBwbHkgLSBSZWFsU29sZCkuDQovLw0KLy8gSWYgdGhlIGN1cnZlIGlzIGFscmVhZHkgc29sZCBvdXQgKG9yIHJhaXNlIGFscmVhZHkgZmlsbGVkKSwgQnV5IHJlZnVuZHMgdGhlIGZ1bGwNCi8vIHRha2UgYW5kIGdyYWR1YXRlcyB3aGVuIHJlYWR5IC0gbm8gcGFuaWMgc28gdXNlcnMgYXJlIG5vdCBzdHVjayBtaWQtdHguDQpmdW5jIEJ1eShjdXIgcmVhbG0sIGlkIHN0cmluZywgYW1vdW50V3Vnbm90LCBtaW5Ub2tlbnNPdXQgaW50NjQpIGludDY0IHsNCglyZXF1aXJlSW5pdCgpDQoJc2VudCA6PSB0YWtlV3Vnbm90SW4oY3VyLCBhbW91bnRXdWdub3QpDQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWlmIGwuU3RhdHVzICE9IFN0YXR1c0N1cnZlIHsNCgkJcGFuaWMoInBhZDogbm90IG9uIGN1cnZlICh1c2UgU3dhcEJ1eSkiKQ0KCX0NCglidXllciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkNCg0KCXJlbWFpbmluZ1RvayA6PSBDdXJ2ZVN1cHBseSAtIGwuUmVhbFNvbGQNCgluZWVkUmFpc2UgOj0gZ3JhZHVhdGlvblRocmVzaG9sZCgpIC0gbC5SYWlzZWRVZ25vdA0KCS8vIEFscmVhZHkgY29tcGxldGU6IHJlZnVuZCBwYXltZW50IGFuZCBncmFkdWF0ZSAoc29sZC1vdXQgb3IgcmFpc2UtZmlsbGVkKS4NCglpZiByZW1haW5pbmdUb2sgPD0gMCB8fCBuZWVkUmFpc2UgPD0gMCB7DQoJCWlmICFyZWFkeVRvR3JhZHVhdGUobCkgew0KCQkJLy8gRWRnZTogemVybyByYWlzZSB3aXRoIGVtcHR5IGZsb2F0IHNob3VsZCBub3QgaGFwcGVuIGluIHByb2R1Y3Rpb24uDQoJCQlpZiByZW1haW5pbmdUb2sgPD0gMCB7DQoJCQkJcGFuaWMoInBhZDogY3VydmUgc29sZCBvdXQgd2l0aCBubyByYWlzZSIpDQoJCQl9DQoJCQlwYW5pYygicGFkOiByYWlzZSBmaWxsZWQgLSBjYWxsIEdyYWR1YXRlIikNCgkJfQ0KCQlpZiBzZW50ID4gMCB7DQoJCQkvLyBLZWVwIGFzIGNsYWltYWJsZSBjcmVkaXQgKENsYWltV3Vnbm90KSDigJQgc2FmZSBhZnRlciBncmFkdWF0ZS9saXN0IHRvby4NCgkJCWNyZWRpdFJlZnVuZChidXllciwgc2VudCkNCgkJCWNoYWluLkVtaXQoIkJ1eVJlZnVuZCIsDQoJCQkJImlkIiwgaWQsDQoJCQkJImJ1eWVyIiwgYnV5ZXIuU3RyaW5nKCksDQoJCQkJInJlZnVuZCIsIHN0cmNvbnYuRm9ybWF0SW50KHNlbnQsIDEwKSwNCgkJCQkidG9DcmVkaXQiLCAiMSIsDQoJCQkpDQoJCX0NCgkJZ3JhZHVhdGUoY3VyLCBsKQ0KCQlyZXR1cm4gMA0KCX0NCg0KCXVzZWRHcm9zcyA6PSBzZW50DQoJZmVlIDo9IGFtbW1hdGguQXBwbHlGZWUodXNlZEdyb3NzLCBGZWVCUFMsIENyZWF0b3JGZWVTaGFyZUJQUywgUHJvdG9jb2xGZWVTaGFyZUJQUykNCgkvLyBOZXQgZW50ZXJzIGN1cnZlOyByZW1haW5kZXIgYm9vc3RzIHZpcnR1YWwgdWdub3QgKHN0YXlzIGFzIGNvbGxhdGVyYWwpLg0KCW5ldEluIDo9IGZlZS5OZXQgKyBmZWUuUmVtYWluZGVyDQoNCgkvLyBNYXggbmV0IGFsbG93ZWQ6IG1pbih1c2VyIG5ldCwgcmVtYWluaW5nIHJhaXNlLCByZW1haW5pbmcgdG9rZW5zKS4NCgltYXhOZXQgOj0gbmV0SW4NCglpZiBtYXhOZXQgPiBuZWVkUmFpc2Ugew0KCQltYXhOZXQgPSBuZWVkUmFpc2UNCgl9DQoJbWF4TmV0VG9rIDo9IGFtbW1hdGguTWF4TmV0SW5Gb3JUb2tlbk91dChsLlZpcnR1YWxVZ25vdCwgbC5WaXJ0dWFsVG9rZW4sIHJlbWFpbmluZ1RvaykNCglpZiBtYXhOZXRUb2sgPiAwICYmIG1heE5ldCA+IG1heE5ldFRvayB7DQoJCW1heE5ldCA9IG1heE5ldFRvaw0KCX0NCglpZiBtYXhOZXQgPD0gMCB7DQoJCXBhbmljKCJwYWQ6IG5vIGZpbGwgY2FwYWNpdHkgcmVtYWluaW5nIikNCgl9DQoNCgkvLyBDbGFtcCBncm9zcyArIHJlY29tcHV0ZSBmZWUgd2hlbiBjYXBzIGJpbmQgKGxhc3QtZmlsbCByZWZ1bmQgcGF0aCkuDQoJaWYgbWF4TmV0IDwgbmV0SW4gew0KCQl1c2VkR3Jvc3MgPSBtYXhHcm9zc0Zvck5ldEluKG1heE5ldCwgc2VudCkNCgkJaWYgdXNlZEdyb3NzIDw9IDAgew0KCQkJcGFuaWMoInBhZDogYnV5IHRvbyBzbWFsbCBmb3IgcmVtYWluaW5nIGZpbGwiKQ0KCQl9DQoJCWZlZSA9IGFtbW1hdGguQXBwbHlGZWUodXNlZEdyb3NzLCBGZWVCUFMsIENyZWF0b3JGZWVTaGFyZUJQUywgUHJvdG9jb2xGZWVTaGFyZUJQUykNCgkJbmV0SW4gPSBmZWUuTmV0ICsgZmVlLlJlbWFpbmRlcg0KCQlpZiBuZXRJbiA+IG1heE5ldCB7DQoJCQluZXRJbiA9IG1heE5ldA0KCQl9DQoJfQ0KDQoJdG9rZW5zT3V0LCBuZXdWVSwgbmV3VlQgOj0gYW1tbWF0aC5CdXlUb2tlbnMobC5WaXJ0dWFsVWdub3QsIGwuVmlydHVhbFRva2VuLCBuZXRJbikNCgkvLyBJbnRlZ2VyIGVkZ2U6IHN0ZXAgZG93biBuZXQgdW50aWwgdG9rZW5zIDw9IHJlbWFpbmluZyBjdXJ2ZSBzdXBwbHkuDQoJZm9yIHRva2Vuc091dCA+IHJlbWFpbmluZ1RvayAmJiBuZXRJbiA+IDEgew0KCQluZXRJbi0tDQoJCXRva2Vuc091dCwgbmV3VlUsIG5ld1ZUID0gYW1tbWF0aC5CdXlUb2tlbnMobC5WaXJ0dWFsVWdub3QsIGwuVmlydHVhbFRva2VuLCBuZXRJbikNCgl9DQoJaWYgdG9rZW5zT3V0ID4gcmVtYWluaW5nVG9rIHx8IHRva2Vuc091dCA8PSAwIHsNCgkJcGFuaWMoInBhZDogY2Fubm90IGZpbGwgcmVtYWluaW5nIGN1cnZlIHN1cHBseSIpDQoJfQ0KCS8vIElmIG5ldCB3YXMgcmVkdWNlZCBmdXJ0aGVyLCBzaHJpbmsgdXNlZEdyb3NzIHNvIHJlZnVuZCBpcyBjb3JyZWN0Lg0KCWlmIG5ldEluIDwgbWF4TmV0IHx8IHVzZWRHcm9zcyA8IHNlbnQgew0KCQkvLyBSZS1kZXJpdmUgZ3Jvc3MgdGhhdCB5aWVsZHMgdGhpcyBuZXRJbiAoPD0gc2VudCkuDQoJCWcyIDo9IG1heEdyb3NzRm9yTmV0SW4obmV0SW4sIHNlbnQpDQoJCWlmIGcyID4gMCAmJiBnMiA8IHVzZWRHcm9zcyB7DQoJCQl1c2VkR3Jvc3MgPSBnMg0KCQkJZmVlID0gYW1tbWF0aC5BcHBseUZlZSh1c2VkR3Jvc3MsIEZlZUJQUywgQ3JlYXRvckZlZVNoYXJlQlBTLCBQcm90b2NvbEZlZVNoYXJlQlBTKQ0KCQkJLy8gS2VlcCBjdXJ2ZSBuZXRJbiBhcyBzaW11bGF0ZWQgKG1heSBiZSBzbGlnaHRseSBiZWxvdyBmZWUuTmV0K1JlbSkuDQoJCX0NCgl9DQoJLy8gSGFyZCBzYWZldHk6IG5ldmVyIG92ZXJzaG9vdCBncmFkdWF0aW9uIHJhaXNlIGFmdGVyIHRoaXMgYnV5Lg0KCWlmIGwuUmFpc2VkVWdub3QrbmV0SW4gPiBncmFkdWF0aW9uVGhyZXNob2xkKCkgew0KCQluZXRJbiA9IGdyYWR1YXRpb25UaHJlc2hvbGQoKSAtIGwuUmFpc2VkVWdub3QNCgkJaWYgbmV0SW4gPD0gMCB7DQoJCQlwYW5pYygicGFkOiByYWlzZSBmaWxsZWQgLSBjYWxsIEdyYWR1YXRlIikNCgkJfQ0KCQl0b2tlbnNPdXQsIG5ld1ZVLCBuZXdWVCA9IGFtbW1hdGguQnV5VG9rZW5zKGwuVmlydHVhbFVnbm90LCBsLlZpcnR1YWxUb2tlbiwgbmV0SW4pDQoJCWZvciB0b2tlbnNPdXQgPiByZW1haW5pbmdUb2sgJiYgbmV0SW4gPiAxIHsNCgkJCW5ldEluLS0NCgkJCXRva2Vuc091dCwgbmV3VlUsIG5ld1ZUID0gYW1tbWF0aC5CdXlUb2tlbnMobC5WaXJ0dWFsVWdub3QsIGwuVmlydHVhbFRva2VuLCBuZXRJbikNCgkJfQ0KCQlpZiB0b2tlbnNPdXQgPD0gMCB7DQoJCQlwYW5pYygicGFkOiBjYW5ub3QgZmlsbCByZW1haW5pbmcgcmFpc2UiKQ0KCQl9DQoJCXVzZWRHcm9zcyA9IG1heEdyb3NzRm9yTmV0SW4obmV0SW4sIHNlbnQpDQoJCWlmIHVzZWRHcm9zcyA8PSAwIHsNCgkJCXBhbmljKCJwYWQ6IGJ1eSB0b28gc21hbGwgZm9yIHJlbWFpbmluZyByYWlzZSIpDQoJCX0NCgkJZmVlID0gYW1tbWF0aC5BcHBseUZlZSh1c2VkR3Jvc3MsIEZlZUJQUywgQ3JlYXRvckZlZVNoYXJlQlBTLCBQcm90b2NvbEZlZVNoYXJlQlBTKQ0KCX0NCg0KCXJlZnVuZCA6PSBzZW50IC0gdXNlZEdyb3NzDQoJaWYgcmVmdW5kID4gMCB7DQoJCS8vIE92ZXJwYXkgc3RheXMgY2xhaW1hYmxlIOKAlCB1c2VyIENsYWltV3Vnbm90IGFueXRpbWUgKGluY2wuIGFmdGVyIGxpc3QpLg0KCQljcmVkaXRSZWZ1bmQoYnV5ZXIsIHJlZnVuZCkNCgl9DQoNCglyZXF1aXJlTWluT3V0KHRva2Vuc091dCwgbWluVG9rZW5zT3V0LCAidG9rZW5zIG91dCIpDQoJY2hlY2tBbmRBZGRTbmlwZShsLCBidXllciwgdG9rZW5zT3V0KQ0KDQoJLy8gTXV0YXRlIG9ubHkgYWZ0ZXIgYWxsIGNoZWNrcyBwYXNzLg0KCS8vIEZlZXMgc3RheSBhcyBXVUdOT1Qgb24gcGFkIChsaWFiaWxpdGllcyk7IG5ldEluIGlzIHJhaXNlZCBjb2xsYXRlcmFsIGZvciBMUC4NCglsLkNyZWF0b3JGZWVzICs9IGZlZS5DcmVhdG9yDQoJY3JlZGl0UHJvdG9jb2woZmVlLlByb3RvY29sKQ0KCWwuVmlydHVhbFVnbm90ID0gbmV3VlUNCglsLlZpcnR1YWxUb2tlbiA9IG5ld1ZUDQoJbC5SZWFsU29sZCArPSB0b2tlbnNPdXQNCglsLlJhaXNlZFVnbm90ICs9IG5ldEluDQoJLy8gSW52YXJpYW50OiByYWlzZSBuZXZlciBleGNlZWRzIHRocmVzaG9sZCBhZnRlciBCdXkuDQoJaWYgbC5SYWlzZWRVZ25vdCA+IGdyYWR1YXRpb25UaHJlc2hvbGQoKSB7DQoJCXBhbmljKCJwYWQ6IHJhaXNlIG92ZXJzaG9vdCBpbnZhcmlhbnQiKQ0KCX0NCg0KCWFkZEJhbChsLCBidXllciwgdG9rZW5zT3V0KQ0KCW5vdGVCdXllcihsLCBidXllcikNCgltYXliZVJlZnVuZEJvbmQoY3VyLCBsKQ0KCXJlY29yZFRyYWRlKGwsIFRyYWRlU2lkZUJ1eSwgdXNlZEdyb3NzLCB0b2tlbnNPdXQpDQoNCgljaGFpbi5FbWl0KCJCdXkiLA0KCQkiaWQiLCBpZCwNCgkJImJ1eWVyIiwgYnV5ZXIuU3RyaW5nKCksDQoJCSJ1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KHVzZWRHcm9zcywgMTApLA0KCQkid3Vnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQodXNlZEdyb3NzLCAxMCksDQoJCSJ0b2tlbnMiLCBzdHJjb252LkZvcm1hdEludCh0b2tlbnNPdXQsIDEwKSwNCgkpDQoJaWYgcmVmdW5kID4gMCB7DQoJCWNoYWluLkVtaXQoIkJ1eVJlZnVuZCIsDQoJCQkiaWQiLCBpZCwNCgkJCSJidXllciIsIGJ1eWVyLlN0cmluZygpLA0KCQkJInJlZnVuZCIsIHN0cmNvbnYuRm9ybWF0SW50KHJlZnVuZCwgMTApLA0KCQkpDQoJfQ0KCW5vdGlmeVRyYWRlKGN1ciwgYnV5ZXIsIGlkLCAwLCB1c2VkR3Jvc3MpDQoNCglpZiByZWFkeVRvR3JhZHVhdGUobCkgew0KCQlncmFkdWF0ZShjdXIsIGwpDQoJfQ0KCXJldHVybiB0b2tlbnNPdXQNCn0NCg0KLy8gUmVtYWluaW5nUmFpc2VVZ25vdCBpcyBuZXQgdWdub3Qgc3RpbGwgbmVlZGVkIHRvIGhpdCBncmFkdWF0aW9uVGhyZXNob2xkKCkgKDAgaWYgbWV0L292ZXIpLg0KZnVuYyBSZW1haW5pbmdSYWlzZVVnbm90KGlkIHN0cmluZykgaW50NjQgew0KCWwgOj0gbXVzdExhdW5jaChpZCkNCglpZiBsLlN0YXR1cyAhPSBTdGF0dXNDdXJ2ZSB7DQoJCXJldHVybiAwDQoJfQ0KCWlmIGwuUmFpc2VkVWdub3QgPj0gZ3JhZHVhdGlvblRocmVzaG9sZCgpIHsNCgkJcmV0dXJuIDANCgl9DQoJcmV0dXJuIGdyYWR1YXRpb25UaHJlc2hvbGQoKSAtIGwuUmFpc2VkVWdub3QNCn0NCg0KLy8gU2VsbCBidXJucyBjdXJ2ZSB0b2tlbnMgYW5kIHBheXMgV1VHTk9UIChmZWUgb24gb3V0cHV0KS4NCi8vIG1pbld1Z25vdE91dDogc2xpcHBhZ2UgZmxvb3IgKDAgPSBkaXNhYmxlZCkuIFVzZXIgbWF5IHd1Z25vdC5XaXRoZHJhdyB0byB1Z25vdC4NCmZ1bmMgU2VsbChjdXIgcmVhbG0sIGlkIHN0cmluZywgdG9rZW5zSW4sIG1pbld1Z25vdE91dCBpbnQ2NCkgaW50NjQgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCWlmIHRva2Vuc0luIDw9IDAgew0KCQlwYW5pYygicGFkOiB0b2tlbnNJbiBtdXN0IGJlIHBvc2l0aXZlIikNCgl9DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWlmIGwuU3RhdHVzICE9IFN0YXR1c0N1cnZlIHsNCgkJcGFuaWMoInBhZDogbm90IG9uIGN1cnZlICh1c2UgU3dhcFNlbGwpIikNCgl9DQoJc2VsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KCWlmIGJhbE9mKGwsIHNlbGxlcikgPCB0b2tlbnNJbiB7DQoJCXBhbmljKCJwYWQ6IGluc3VmZmljaWVudCB0b2tlbiBiYWxhbmNlIikNCgl9DQoNCglncm9zcywgbmV3VlUsIG5ld1ZUIDo9IGFtbW1hdGguU2VsbFRva2VucyhsLlZpcnR1YWxVZ25vdCwgbC5WaXJ0dWFsVG9rZW4sIHRva2Vuc0luKQ0KCWZlZSA6PSBhbW1tYXRoLkFwcGx5RmVlT25PdXRwdXQoZ3Jvc3MsIEZlZUJQUywgQ3JlYXRvckZlZVNoYXJlQlBTLCBQcm90b2NvbEZlZVNoYXJlQlBTKQ0KCXJlcXVpcmVNaW5PdXQoZmVlLk5ldCwgbWluV3Vnbm90T3V0LCAid3Vnbm90IG91dCIpDQoNCgkvLyBGdWxsIGdyb3NzIGxlZnQgdmlydHVhbCByZXNlcnZlczsgcmV0YWluIGZlZSBpbiB2aXJ0dWFsIHVnbm90IChjYXNoIHN0YXlzIGluIHJlYWxtKS4NCglsLlZpcnR1YWxVZ25vdCA9IG5ld1ZVICsgZmVlLkZlZQ0KCWwuVmlydHVhbFRva2VuID0gbmV3VlQNCglsLlJlYWxTb2xkIC09IHRva2Vuc0luDQoJaWYgbC5SZWFsU29sZCA8IDAgew0KCQlsLlJlYWxTb2xkID0gMA0KCX0NCg0KCS8vIFVzZXIgcmVjZWl2ZXMgbmV0OyBjcmVhdG9yK3Byb3RvY29sIGJlY29tZSBmZWUgbGlhYmlsaXRpZXMgKGxlYXZlIFJhaXNlZCkuDQoJcGF5T3V0IDo9IGZlZS5OZXQgKyBmZWUuQ3JlYXRvciArIGZlZS5Qcm90b2NvbA0KCWlmIGwuUmFpc2VkVWdub3QgPj0gcGF5T3V0IHsNCgkJbC5SYWlzZWRVZ25vdCAtPSBwYXlPdXQNCgl9IGVsc2Ugew0KCQlsLlJhaXNlZFVnbm90ID0gMA0KCX0NCglsLkNyZWF0b3JGZWVzICs9IGZlZS5DcmVhdG9yDQoJY3JlZGl0UHJvdG9jb2woZmVlLlByb3RvY29sKQ0KDQoJYWRkQmFsKGwsIHNlbGxlciwgLXRva2Vuc0luKQ0KCXBheVd1Z25vdE91dChjdXIsIHNlbGxlciwgZmVlLk5ldCkNCglyZWNvcmRUcmFkZShsLCBUcmFkZVNpZGVTZWxsLCBmZWUuTmV0LCB0b2tlbnNJbikNCg0KCWNoYWluLkVtaXQoIlNlbGwiLA0KCQkiaWQiLCBpZCwNCgkJInNlbGxlciIsIHNlbGxlci5TdHJpbmcoKSwNCgkJInRva2VucyIsIHN0cmNvbnYuRm9ybWF0SW50KHRva2Vuc0luLCAxMCksDQoJCSJ1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KGZlZS5OZXQsIDEwKSwNCgkJInd1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KGZlZS5OZXQsIDEwKSwNCgkpDQoJbm90aWZ5VHJhZGUoY3VyLCBzZWxsZXIsIGlkLCAxLCBmZWUuTmV0KQ0KCXJldHVybiBmZWUuTmV0DQp9DQoNCi8vIEdyYWR1YXRlIHBlcm1pc3Npb25sZXNzbHkgbW92ZXMgYSByZWFkeSBjdXJ2ZSBpbnRvIGEgcGVybWFuZW50bHkgbG9ja2VkIENQTU0uDQovLyBSZWFkeSB3aGVuIFJhaXNlZFVnbm90ID49IGdyYWR1YXRpb25UaHJlc2hvbGQoKSwgb3Igd2hlbiBSZWFsU29sZCA+PSBDdXJ2ZVN1cHBseQ0KLy8gd2l0aCBSYWlzZWRVZ25vdCA+IDAgKHNvbGQtb3V0IGJlZm9yZSB0aHJlc2hvbGQgLSBlc2NhcGUgaGF0Y2ggZm9yIHVucmVhY2hhYmxlIHJhaXNlKS4NCmZ1bmMgR3JhZHVhdGUoY3VyIHJlYWxtLCBpZCBzdHJpbmcpIHsNCglyZXF1aXJlSW5pdCgpDQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWlmIGwuU3RhdHVzICE9IFN0YXR1c0N1cnZlIHsNCgkJcGFuaWMoInBhZDogYWxyZWFkeSBncmFkdWF0ZWQiKQ0KCX0NCglpZiAhcmVhZHlUb0dyYWR1YXRlKGwpIHsNCgkJcGFuaWMoInBhZDogbm90IHJlYWR5IHRvIGdyYWR1YXRlIChuZWVkIHJhaXNlIHRocmVzaG9sZCBvciBjdXJ2ZSBzb2xkIG91dCkiKQ0KCX0NCglncmFkdWF0ZShjdXIsIGwpDQp9DQoNCmZ1bmMgZ3JhZHVhdGUoY3VyIHJlYWxtLCBsICpMYXVuY2gpIHsNCglpZiBsLlN0YXR1cyAhPSBTdGF0dXNDdXJ2ZSB7DQoJCXJldHVybg0KCX0NCgkvLyBMaXF1aWRpdHkgY2FwaXRhbCA9IGFsbCByYWlzZWQgR05PVC4gVG9rZW4gc2lkZSBpcyBzaXplZCB0byB0aGUgY3VycmVudA0KCS8vIGJvbmRpbmctY3VydmUgc3BvdCBzbyBpbnRlcm5hbCBDUE1NIC8gR25vc3dhcCBvcGVuIH4gbGFzdCBjdXJ2ZSB0cmFkZQ0KCS8vIChzZWFtbGVzcyBncmFkdWF0ZSkuIER1bXBpbmcgQUxMIHVuc29sZCB0b2tlbnMgbWFkZSBERVggc3BvdCA8PCBjdXJ2ZSBleGl0Lg0KCXBvb2xVIDo9IGwuUmFpc2VkVWdub3QNCglpZiBwb29sVSA8PSAwIHsNCgkJcGFuaWMoInBhZDogZW1wdHkgcG9vbCB1Z25vdCIpDQoJfQ0KCXJlbWFpbmluZyA6PSBUb3RhbFN1cHBseSAtIGwuUmVhbFNvbGQNCglpZiByZW1haW5pbmcgPD0gMCB7DQoJCXBhbmljKCJwYWQ6IG5vIHJlbWFpbmluZyB0b2tlbnMgZm9yIGxpcXVpZGl0eSIpDQoJfQ0KCS8vIHRva2Vuc0ZvckxQID0gcmFpc2VkICogVmlydHVhbFRva2VuIC8gVmlydHVhbFVnbm90ICAoc2FtZSB1bml0cyBhcyByZXNlcnZlcykNCglwb29sVCA6PSByZW1haW5pbmcNCglpZiBsLlZpcnR1YWxVZ25vdCA+IDAgJiYgbC5WaXJ0dWFsVG9rZW4gPiAwIHsNCgkJbmVlZGVkIDo9IHBvb2xVICogbC5WaXJ0dWFsVG9rZW4gLyBsLlZpcnR1YWxVZ25vdA0KCQlpZiBuZWVkZWQgPiAwICYmIG5lZWRlZCA8IHJlbWFpbmluZyB7DQoJCQlwb29sVCA9IG5lZWRlZA0KCQl9DQoJfQ0KDQoJbC5Qb29sVWdub3QgPSBwb29sVQ0KCWwuUG9vbFRva2VuID0gcG9vbFQNCglsLkxlZnRvdmVyVG9rZW5zID0gcmVtYWluaW5nIC0gcG9vbFQNCglsLlJhaXNlZFVnbm90ID0gMA0KCWwuVmlydHVhbFVnbm90ID0gMA0KCWwuVmlydHVhbFRva2VuID0gMA0KCWwuU3RhdHVzID0gU3RhdHVzR3JhZHVhdGVkDQoNCgkvLyBGb3JmZWl0IHVucmVmdW5kZWQgYm9uZCB0byBwcm90b2NvbCBhdCBncmFkdWF0aW9uIGlmIHN0aWxsIGxvY2tlZC4NCglpZiAhbC5Cb25kUmVmdW5kZWQgJiYgbC5Cb25kVWdub3QgPiAwIHsNCgkJY3JlZGl0UHJvdG9jb2wobC5Cb25kVWdub3QpDQoJCWwuQm9uZFVnbm90ID0gMA0KCQlsLkJvbmRSZWZ1bmRlZCA9IHRydWUNCgl9DQoNCgkvLyBNYXJrIGdyYWR1YXRpb24gb24gY2hhcnQgYXQgcG9vbCBzcG90IChtYXRjaGVzIGN1cnZlIGV4aXQgd2hlbiBzaXplZCBhYm92ZSkuDQoJcmVjb3JkVHJhZGUobCwgVHJhZGVTaWRlT3BlbiwgcG9vbFUsIHBvb2xUKQ0KDQoJLy8gTkVWRVIgYXV0by1saXN0IGluc2lkZSBCdXkvR3JhZHVhdGUuDQoJLy8gR25vc3dhcCBDcmVhdGVQb29sL01pbnQgZG9lcyBXVUdOT1QgQXBwcm92ZStUcmFuc2ZlckZyb207IHJlYWxtIHNwZW5kZXINCgkvLyBmcmFtZSBvZnRlbiBwYW5pY3MgImluc3VmZmljaWVudCBhbGxvd2FuY2UiIGFuZCBSRVZFUlRTIHRoZSBlbnRpcmUgQnV5DQoJLy8gKGluY2x1ZGluZyB0aGUgY3VydmUgZmlsbCB0aGF0IHRyaWdnZXJlZCBncmFkdWF0aW9uKS4gTGlzdCBpcyBhIHNlcGFyYXRlDQoJLy8gRU9BIGNhbGw6IHByZS1mdW5kIHBhZCBXVUdOT1QvR05TIHRoZW4gUmV0cnlMaXN0R25vc3dhcC4NCgkvLyBVbml0IHRlc3RzIG1heSBzdGlsbCBmb3JjZSBsaXN0IHZpYSB0ZXN0Rm9yY2VHbm9zd2FwTGlzdC4NCglsLkdub3N3YXBSZWFkeSA9IHRydWUNCglsaXN0ZWQgOj0gZmFsc2UNCglpZiB0ZXN0Rm9yY2VHbm9zd2FwTGlzdCB7DQoJCWxpc3RlZCA9IGxpc3RPbkdub3N3YXBXaXRoRnVuZGluZyhjdXIsIGwsIHBvb2xVLCBwb29sVCkNCgl9DQoJaWYgIWxpc3RlZCB7DQoJCS8vIEludGVybmFsIENQTU06IFBvb2xUb2tlbiBpcyBwYWQtYWNjb3VudGluZyByZXNlcnZlIChub3QgbWludGVkIEdSQzIwKS4NCgkJLy8gQ2lyY3VsYXRpbmcgPSB1c2VyIGJhbGFuY2VzOyBwb29sIHNpZGUgaXMgdmlydHVhbCByZXNlcnZlIFBvb2xUb2tlbi4NCgkJaWYgbC5Hbm9zd2FwTm90ZSA9PSAiIiB7DQoJCQlpZiBsLlByZWZlcnJlZFZlbnVlID09IFZlbnVlWmRleCB7DQoJCQkJbC5Hbm9zd2FwTm90ZSA9ICJpbnRlcm5hbCBDUE1NOyBSZWxlYXNlTGlzdFNlZWQg4oaSIEVPQSB6ZGV4IENyZWF0ZVBvb2wg4oaSIENvbmZpcm1aZGV4TGlzdCINCgkJCX0gZWxzZSB7DQoJCQkJbC5Hbm9zd2FwTm90ZSA9ICJpbnRlcm5hbCBDUE1NOyBUcmFuc2ZlciBXVUdOT1QrR05TIHRvIHBhZCB0aGVuIFJldHJ5TGlzdEdub3N3YXAiDQoJCQl9DQoJCX0NCgkJY2hhaW4uRW1pdCgiR3JhZHVhdGVkIiwNCgkJCSJpZCIsIGwuSUQsDQoJCQkicG9vbFVnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQocG9vbFUsIDEwKSwNCgkJCSJwb29sVG9rZW4iLCBzdHJjb252LkZvcm1hdEludChwb29sVCwgMTApLA0KCQkJInRva2VuIiwgbC5Ub2tlbklELA0KCQkJImdub3N3YXBfbGlzdGVkIiwgIjAiLA0KCQkpDQoJCXJldHVybg0KCX0NCgkvLyBMaXN0ZWQgb24gR25vc3dhcCAodGVzdC1vbmx5IHBhdGgpOiBjYXBpdGFsIGlzIGluIHRoZSBDTCBwb3NpdGlvbiAoTkZUIG93bmVkIGJ5IHBhZCkuDQoJLy8gSW50ZXJuYWwgU3dhcEJ1eS9TZWxsIGRpc2FibGVkIChQb29sVWdub3QvUG9vbFRva2VuIGtlcHQgYXMgbGlzdGluZyByZWNvcmQpLg0KCWNoYWluLkVtaXQoIkdyYWR1YXRlZCIsDQoJCSJpZCIsIGwuSUQsDQoJCSJwb29sVWdub3QiLCBzdHJjb252LkZvcm1hdEludChwb29sVSwgMTApLA0KCQkicG9vbFRva2VuIiwgc3RyY29udi5Gb3JtYXRJbnQocG9vbFQsIDEwKSwNCgkJInRva2VuIiwgbC5Ub2tlbklELA0KCQkiZ25vc3dhcF9saXN0ZWQiLCAiMSIsDQoJCSJwb29sUGF0aCIsIGwuR25vc3dhcFBvb2xQYXRoLA0KCQkicG9zaXRpb25JZCIsIHN0cmNvbnYuRm9ybWF0VWludChsLkdub3N3YXBQb3NpdGlvbklELCAxMCksDQoJKQ0KfQ0KDQovLyBTZXRQcmVmZXJyZWRWZW51ZSBzZXRzIHRoZSBERVggdGFyZ2V0IHVzZWQgd2hlbiBSZXRyeUxpc3QoaWQsICIiKSBpcyBjYWxsZWQuDQovLyBDcmVhdG9yIG9yIHByb3RvY29sIG9ubHk7IGxvY2tlZCBvbmNlIGxpc3RlZC4gU3luY3MgQ3JlYXRlLXRpbWUgR05TIGVzY3Jvdw0KLy8gKGdub3N3YXAgbG9ja3MgTGlzdEZlZVJlcXVpcmVkOyB6ZGV4IHVubG9ja3MvcmVmdW5kcyBlc2Nyb3cpLg0KZnVuYyBTZXRQcmVmZXJyZWRWZW51ZShjdXIgcmVhbG0sIGlkLCB2ZW51ZUlkIHN0cmluZykgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCWwgOj0gbXVzdExhdW5jaChpZCkNCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpDQoJaWYgY2FsbGVyICE9IGwuQ3JlYXRvciAmJiBjYWxsZXIgIT0gcHJvdG9jb2xBZGRyIHsNCgkJcGFuaWMoInBhZDogY3JlYXRvciBvciBwcm90b2NvbCBvbmx5IikNCgl9DQoJaWYgbC5Hbm9zd2FwTGlzdGVkIHx8IGwuTGlzdFZlbnVlICE9ICIiIHsNCgkJcGFuaWMoInBhZDogYWxyZWFkeSBsaXN0ZWQiKQ0KCX0NCgllbnN1cmVMaXN0VmVudWVzU2VlZGVkKCkNCgl2aWQgOj0gbm9ybWFsaXplVmVudWVJRCh2ZW51ZUlkKQ0KCWlmICF2ZW51ZUVuYWJsZWQodmlkKSB7DQoJCXBhbmljKCJwYWQ6IHZlbnVlIGRpc2FibGVkIG9yIHVua25vd24iKQ0KCX0NCglsLlByZWZlcnJlZFZlbnVlID0gdmlkDQoJc3luY0xpc3RGZWVGb3JWZW51ZShjdXIsIGwsIHZpZCkNCgljaGFpbi5FbWl0KCJTZXRQcmVmZXJyZWRWZW51ZSIsDQoJCSJpZCIsIGlkLA0KCQkidmVudWUiLCB2aWQsDQoJCSJsaXN0RmVlR25zIiwgc3RyY29udi5Gb3JtYXRJbnQobC5MaXN0RmVlR25zLCAxMCksDQoJKQ0KfQ0KDQovLyBQcmVmZXJyZWRWZW51ZU9mIHJldHVybnMgdGhlIENyZWF0ZS10aW1lIC8gU2V0UHJlZmVycmVkVmVudWUgdGFyZ2V0Lg0KZnVuYyBQcmVmZXJyZWRWZW51ZU9mKGlkIHN0cmluZykgc3RyaW5nIHsNCglyZXR1cm4gbXVzdExhdW5jaChpZCkuUHJlZmVycmVkVmVudWUNCn0NCg0KLy8gTGlzdFNlZWRSZWxlYXNlZE9mIHJlcG9ydHMgd2hldGhlciBSZWxlYXNlTGlzdFNlZWQgYWxyZWFkeSByYW4uDQpmdW5jIExpc3RTZWVkUmVsZWFzZWRPZihpZCBzdHJpbmcpIGJvb2wgew0KCXJldHVybiBtdXN0TGF1bmNoKGlkKS5MaXN0U2VlZFJlbGVhc2VkDQp9DQoNCi8vIFJlbGVhc2VMaXN0U2VlZCBzZW5kcyBncmFkdWF0ZWQgaW50ZXJuYWwtQ1BNTSBzZWVkIHRvIHRoZSBjcmVhdG9yIGZvciBFT0EgemRleCBDcmVhdGVQb29sOg0KLy8gICAtIFBvb2xVZ25vdCBhcyBXVUdOT1QgVHJhbnNmZXIgdG8gY3JlYXRvciAoRU9BIG1heSB3dWdub3QuV2l0aGRyYXcg4oaSIHVnbm90IE9yaWdpblNlbmQpDQovLyAgIC0gUG9vbFRva2VuIG1pbnRlZCBhcyBHUkMyMCB0byBjcmVhdG9yICh3YXMgcGFkLWFjY291bnRpbmcgb25seSkNCi8vIFBvb2xVZ25vdC9Qb29sVG9rZW4ga2VwdCBhcyBsaXN0aW5nLXNpemUgcmVjb3JkOyByZXNlcnZlZFd1Z25vdCBza2lwcyB2aWEgTGlzdFNlZWRSZWxlYXNlZC4NCi8vIERpc2FibGVzIGludGVybmFsIFN3YXBCdXkvU2VsbC4gQ3JlYXRvciBvciBwcm90b2NvbCBtYXkgY2FsbDsgYXNzZXRzIGFsd2F5cyBnbyB0byBjcmVhdG9yLg0KZnVuYyBSZWxlYXNlTGlzdFNlZWQoY3VyIHJlYWxtLCBpZCBzdHJpbmcpIHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IG11c3QgYmUgRU9BIE1zZ0NhbGwiKQ0KCX0NCglsIDo9IG11c3RMYXVuY2goaWQpDQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KCWlmIGNhbGxlciAhPSBsLkNyZWF0b3IgJiYgY2FsbGVyICE9IHByb3RvY29sQWRkciB7DQoJCXBhbmljKCJwYWQ6IGNyZWF0b3Igb3IgcHJvdG9jb2wgb25seSIpDQoJfQ0KCWlmIGwuU3RhdHVzICE9IFN0YXR1c0dyYWR1YXRlZCB7DQoJCXBhbmljKCJwYWQ6IG5vdCBncmFkdWF0ZWQiKQ0KCX0NCglpZiBsLkdub3N3YXBMaXN0ZWQgfHwgbC5MaXN0VmVudWUgIT0gIiIgew0KCQlwYW5pYygicGFkOiBhbHJlYWR5IGxpc3RlZCIpDQoJfQ0KCWlmIGwuTGlzdFNlZWRSZWxlYXNlZCB7DQoJCXBhbmljKCJwYWQ6IGxpc3Qgc2VlZCBhbHJlYWR5IHJlbGVhc2VkIikNCgl9DQoJcG9vbFUgOj0gbC5Qb29sVWdub3QNCglwb29sVCA6PSBsLlBvb2xUb2tlbg0KCWlmIHBvb2xVIDw9IDAgfHwgcG9vbFQgPD0gMCB7DQoJCXBhbmljKCJwYWQ6IGVtcHR5IGludGVybmFsIHBvb2wiKQ0KCX0NCgkvLyBGYWlsLWNsb3NlZDogbXVzdCBmdWxseSBmdW5kIGNyZWF0b3IgYmVmb3JlIGtpbGxpbmcgaW50ZXJuYWwgQ1BNTS4NCglpZiAhdGVzdFNraXBCYW5rZXIgew0KCQloYXZlIDo9IHd1Z25vdC5CYWxhbmNlT2YocGFkQWRkcikNCgkJaWYgaGF2ZSA8IHBvb2xVIHsNCgkJCXBhbmljKCJwYWQ6IHVuZGVyZnVuZGVkIFdVR05PVCBmb3IgbGlzdCBzZWVkIHJlbGVhc2UiKQ0KCQl9DQoJfQ0KCS8vIE1hcmsgcmVsZWFzZWQgYmVmb3JlIFRyYW5zZmVyIHNvIHJlc2VydmVkV3Vnbm90IGRyb3BzIGluIHNhbWUgdHguDQoJbC5MaXN0U2VlZFJlbGVhc2VkID0gdHJ1ZQ0KCWwuUG9vbFVnbm90ID0gMA0KCWwuUG9vbFRva2VuID0gMA0KCWwuTGlxV3Vnbm90VXNlZCA9IHBvb2xVDQoJbC5Hbm9zd2FwTm90ZSA9ICJsaXN0IHNlZWQgcmVsZWFzZWQgdG8gY3JlYXRvciBmb3IgemRleCBDcmVhdGVQb29sOyB0aGVuIENvbmZpcm1aZGV4TGlzdCINCglpZiAhdGVzdFNraXBCYW5rZXIgew0KCQl3dWdub3QuVHJhbnNmZXIoY3Jvc3MoY3VyKSwgbC5DcmVhdG9yLCBwb29sVSkNCgl9IGVsc2Ugew0KCQlwYXlXdWdub3RPdXQoY3VyLCBsLkNyZWF0b3IsIHBvb2xVKQ0KCX0NCglhZGRCYWwobCwgbC5DcmVhdG9yLCBwb29sVCkNCgljaGFpbi5FbWl0KCJSZWxlYXNlTGlzdFNlZWQiLA0KCQkiaWQiLCBpZCwNCgkJInRvIiwgbC5DcmVhdG9yLlN0cmluZygpLA0KCQkid3Vnbm90Iiwgc3RyY29udi5Gb3JtYXRJbnQocG9vbFUsIDEwKSwNCgkJInRva2VucyIsIHN0cmNvbnYuRm9ybWF0SW50KHBvb2xULCAxMCksDQoJKQ0KfQ0KDQovLyBDb25maXJtWmRleExpc3QgbWFya3MgYSBsYXVuY2ggbGlzdGVkIG9uIHpkZXggYWZ0ZXIgRU9BIENyZWF0ZVBvb2wgc3VjY2VlZGVkLg0KLy8gcG9vbElkIGUuZy4gInVnbm90fFNZTUJPTCIgKG11c3QgYmUgbm9uLWVtcHR5OyBubyBvbi1jaGFpbiBwb29sIHZlcmlmeSkuDQovLyBDcmVhdG9yIG9yIHByb3RvY29sLiBQcmVmZXIgUmVsZWFzZUxpc3RTZWVkIGZpcnN0IHdoZW4gcGFkIHN0aWxsIGhvbGRzIExQIHNlZWQuDQpmdW5jIENvbmZpcm1aZGV4TGlzdChjdXIgcmVhbG0sIGlkLCBwb29sSWQgc3RyaW5nKSB7DQoJcmVxdWlyZUluaXQoKQ0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkNCglpZiBjYWxsZXIgIT0gbC5DcmVhdG9yICYmIGNhbGxlciAhPSBwcm90b2NvbEFkZHIgew0KCQlwYW5pYygicGFkOiBjcmVhdG9yIG9yIHByb3RvY29sIG9ubHkiKQ0KCX0NCglpZiBsLlN0YXR1cyAhPSBTdGF0dXNHcmFkdWF0ZWQgew0KCQlwYW5pYygicGFkOiBub3QgZ3JhZHVhdGVkIikNCgl9DQoJaWYgbC5Hbm9zd2FwTGlzdGVkIHx8IGwuTGlzdFZlbnVlICE9ICIiIHsNCgkJcGFuaWMoInBhZDogYWxyZWFkeSBsaXN0ZWQiKQ0KCX0NCgkvLyBBdm9pZCBtYXJraW5nIGxpc3RlZCB3aGlsZSBwYWQgc3RpbGwgaG9sZHMgdW5yZWxlYXNlZCBMUCBjYXBpdGFsLg0KCWlmICFsLkxpc3RTZWVkUmVsZWFzZWQgJiYgKGwuUG9vbFVnbm90ID4gMCB8fCBsLlBvb2xUb2tlbiA+IDApIHsNCgkJcGFuaWMoInBhZDogUmVsZWFzZUxpc3RTZWVkIGZpcnN0IChvciBlbXB0eSBwb29sKSIpDQoJfQ0KCXBvb2xJZCA9IHN0cmluZ3MuVHJpbVNwYWNlKHBvb2xJZCkNCglpZiBwb29sSWQgPT0gIiIgew0KCQlwYW5pYygicGFkOiBlbXB0eSBwb29sSWQiKQ0KCX0NCglsLkxpc3RWZW51ZSA9IFZlbnVlWmRleA0KCWwuR25vc3dhcExpc3RlZCA9IHRydWUgLy8gVUkvY29tcGF0OiAibGlzdGVkIG9uIERFWCINCglsLkdub3N3YXBQb29sUGF0aCA9IHBvb2xJZA0KCWwuR25vc3dhcFBvc2l0aW9uSUQgPSAwDQoJaWYgbC5MaXFXdWdub3RVc2VkID09IDAgew0KCQlsLkxpcVd1Z25vdFVzZWQgPSBsLlBvb2xVZ25vdA0KCX0NCglsLkdub3N3YXBOb3RlID0gImNvbmZpcm1lZCB6ZGV4IGxpc3Q7IHBvb2w9IiArIHBvb2xJZA0KCWNoYWluLkVtaXQoIkNvbmZpcm1aZGV4TGlzdCIsDQoJCSJpZCIsIGlkLA0KCQkicG9vbFBhdGgiLCBwb29sSWQsDQoJCSJzeW1ib2wiLCBsLlN5bWJvbCwNCgkJInZlbnVlIiwgVmVudWVaZGV4LA0KCSkNCgljaGFpbi5FbWl0KCJMaXN0ZWRSZXRyeSIsDQoJCSJpZCIsIGlkLA0KCQkidmVudWUiLCBWZW51ZVpkZXgsDQoJCSJwb29sUGF0aCIsIHBvb2xJZCwNCgkJInBvc2l0aW9uSWQiLCAiMCIsDQoJCSJwb29sVWdub3QiLCBzdHJjb252LkZvcm1hdEludChsLlBvb2xVZ25vdCwgMTApLA0KCQkicG9vbFRva2VuIiwgc3RyY29udi5Gb3JtYXRJbnQobC5Qb29sVG9rZW4sIDEwKSwNCgkpDQp9DQoNCi8vIFJldHJ5TGlzdCBsaXN0cyBhIGdyYWR1YXRlZCBsYXVuY2ggb24gdGhlIGNob3NlbiB2ZW51ZS4NCi8vIFBlcm1pc3Npb25sZXNzIEVPQSBNc2dDYWxsLiBVc2VzIFBvb2xVZ25vdCAvIFBvb2xUb2tlbiAoY3VydmUtc3BvdCBzaXplZCkuDQovLyB2ZW51ZUlkOiBlbXB0eSDihpIgUHJlZmVycmVkVmVudWUg4oaSIERlZmF1bHRMaXN0VmVudWUoKTsgdW5rbm93bi9kaXNhYmxlZCDihpIgc29mdC1mYWlsIG5vdGUuDQpmdW5jIFJldHJ5TGlzdChjdXIgcmVhbG0sIGlkLCB2ZW51ZUlkIHN0cmluZykgYm9vbCB7DQoJcmVxdWlyZUluaXQoKQ0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWlmIGwuU3RhdHVzICE9IFN0YXR1c0dyYWR1YXRlZCB7DQoJCXBhbmljKCJwYWQ6IG5vdCBncmFkdWF0ZWQiKQ0KCX0NCglpZiBsLkdub3N3YXBMaXN0ZWQgfHwgbC5MaXN0VmVudWUgIT0gIiIgew0KCQlwYW5pYygicGFkOiBhbHJlYWR5IGxpc3RlZCIpDQoJfQ0KCWlmIGwuTGlzdFNlZWRSZWxlYXNlZCB7DQoJCXBhbmljKCJwYWQ6IGxpc3Qgc2VlZCByZWxlYXNlZCAtIHVzZSBDb25maXJtWmRleExpc3QgYWZ0ZXIgRU9BIENyZWF0ZVBvb2wiKQ0KCX0NCglwb29sVSA6PSBsLlBvb2xVZ25vdA0KCXBvb2xUIDo9IGwuUG9vbFRva2VuDQoJaWYgcG9vbFUgPD0gMCB8fCBwb29sVCA8PSAwIHsNCgkJcGFuaWMoInBhZDogZW1wdHkgaW50ZXJuYWwgcG9vbCIpDQoJfQ0KCXJhdyA6PSBzdHJpbmdzLlRyaW1TcGFjZSh2ZW51ZUlkKQ0KCWlmIHJhdyA9PSAiIiAmJiBsLlByZWZlcnJlZFZlbnVlICE9ICIiIHsNCgkJcmF3ID0gbC5QcmVmZXJyZWRWZW51ZQ0KCX0NCgl2aWQgOj0gbm9ybWFsaXplVmVudWVJRChyYXcpDQoJb2sgOj0gdHJ5TGlzdFZlbnVlKGN1ciwgbCwgdmlkLCBwb29sVSwgcG9vbFQpDQoJaWYgb2sgew0KCQljaGFpbi5FbWl0KCJMaXN0ZWRSZXRyeSIsDQoJCQkiaWQiLCBsLklELA0KCQkJInZlbnVlIiwgbC5MaXN0VmVudWUsDQoJCQkicG9vbFBhdGgiLCBsLkdub3N3YXBQb29sUGF0aCwNCgkJCSJwb3NpdGlvbklkIiwgc3RyY29udi5Gb3JtYXRVaW50KGwuR25vc3dhcFBvc2l0aW9uSUQsIDEwKSwNCgkJCSJwb29sVWdub3QiLCBzdHJjb252LkZvcm1hdEludChwb29sVSwgMTApLA0KCQkJInBvb2xUb2tlbiIsIHN0cmNvbnYuRm9ybWF0SW50KHBvb2xULCAxMCksDQoJCSkNCgkJLy8gQ29tcGF0IGV2ZW50IG5hbWUgZm9yIGluZGV4ZXJzIHRoYXQgbGlzdGVuIGZvciBHbm9zd2FwTGlzdGVkUmV0cnkuDQoJCWlmIGwuTGlzdFZlbnVlID09IFZlbnVlR25vc3dhcCB7DQoJCQljaGFpbi5FbWl0KCJHbm9zd2FwTGlzdGVkUmV0cnkiLA0KCQkJCSJpZCIsIGwuSUQsDQoJCQkJInBvb2xQYXRoIiwgbC5Hbm9zd2FwUG9vbFBhdGgsDQoJCQkJInBvc2l0aW9uSWQiLCBzdHJjb252LkZvcm1hdFVpbnQobC5Hbm9zd2FwUG9zaXRpb25JRCwgMTApLA0KCQkJCSJwb29sVWdub3QiLCBzdHJjb252LkZvcm1hdEludChwb29sVSwgMTApLA0KCQkJCSJwb29sVG9rZW4iLCBzdHJjb252LkZvcm1hdEludChwb29sVCwgMTApLA0KCQkJKQ0KCQl9DQoJfSBlbHNlIGlmIGwuR25vc3dhcE5vdGUgPT0gIiIgew0KCQlsLkdub3N3YXBOb3RlID0gInJldHJ5IGxpc3QgZmFpbGVkIC0gY2hlY2sgTGlzdE5lZWQgLyBMaXN0TmVlZEZvcjsgdmVudWU9IiArIHZpZA0KCX0NCglyZXR1cm4gb2sNCn0NCg0KLy8gUmV0cnlMaXN0R25vc3dhcCBpcyB0aGUgR25vc3dhcC1zcGVjaWZpYyB3cmFwcGVyIChjb21wYXQgZm9yIGV4aXN0aW5nIFVJKS4NCmZ1bmMgUmV0cnlMaXN0R25vc3dhcChjdXIgcmVhbG0sIGlkIHN0cmluZykgYm9vbCB7DQoJcmV0dXJuIFJldHJ5TGlzdChjdXIsIGlkLCBWZW51ZUdub3N3YXApDQp9DQoNCi8vIFRva2VuSURPZiByZXR1cm5zIHRoZSBHUkMyMCBUb2tlbi5JRCgpIGZvciBhIGxhdW5jaC4NCmZ1bmMgVG9rZW5JRE9mKGlkIHN0cmluZykgc3RyaW5nIHsNCglyZXR1cm4gbXVzdExhdW5jaChpZCkuVG9rZW5JRA0KfQ0KDQovLyBHUkMyMEJhbmsgcmV0dXJucyB0aGUgdW5kZXJseWluZyAqZ3JjMjAuVG9rZW4gZm9yIGludGVyb3AgKG1ldGFkYXRhIC8gZXh0ZXJuYWwgREVYKS4NCi8vIERvZXMgbm90IGV4cG9zZSBQcml2YXRlTGVkZ2VyIC0gbWludC9idXJuIHN0YXkgcGFkLW9ubHkuDQpmdW5jIEdSQzIwQmFuayhpZCBzdHJpbmcpICpncmMyMC5Ub2tlbiB7DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWlmIGwudG9rZW4gPT0gbmlsIHsNCgkJcGFuaWMoInBhZDogbm8gdG9rZW4iKQ0KCX0NCglyZXR1cm4gbC50b2tlbg0KfQ0KDQovLyBTd2FwQnV5IGJ1eXMgdG9rZW5zIGZyb20gdGhlIGdyYWR1YXRlZCBpbnRlcm5hbCBwb29sIHdpdGggV1VHTk9ULg0KLy8gYW1vdW50V3Vnbm90OiBtYXggdG8gc3BlbmQgKEFwcHJvdmUgcGFkKS4gbWluVG9rZW5zT3V0OiBzbGlwcGFnZSAoMCA9IG9mZikuDQovLyBEaXNhYmxlZCB3aGVuIGxpc3RlZCBvbiBHbm9zd2FwICh0cmFkZSB2aWEgcm91dGVyKS4NCmZ1bmMgU3dhcEJ1eShjdXIgcmVhbG0sIGlkIHN0cmluZywgYW1vdW50V3Vnbm90LCBtaW5Ub2tlbnNPdXQgaW50NjQpIGludDY0IHsNCglyZXF1aXJlSW5pdCgpDQoJc2VudCA6PSB0YWtlV3Vnbm90SW4oY3VyLCBhbW91bnRXdWdub3QpDQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWlmIGwuU3RhdHVzICE9IFN0YXR1c0dyYWR1YXRlZCB7DQoJCXBhbmljKCJwYWQ6IG5vdCBncmFkdWF0ZWQgKHVzZSBCdXkpIikNCgl9DQoJaWYgbC5Hbm9zd2FwTGlzdGVkIHx8IGwuTGlzdFZlbnVlICE9ICIiIHsNCgkJcGFuaWMoInBhZDogbGlzdGVkIG9uIERFWCAtIHRyYWRlIHZpYSByb3V0ZXIsIG5vdCBwYWQgU3dhcEJ1eSIpDQoJfQ0KCWlmIGwuTGlzdFNlZWRSZWxlYXNlZCB7DQoJCXBhbmljKCJwYWQ6IGxpc3Qgc2VlZCByZWxlYXNlZCAtIGZpbmlzaCB6ZGV4IENyZWF0ZVBvb2wgKyBDb25maXJtWmRleExpc3QiKQ0KCX0NCglidXllciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkNCg0KCWZlZSA6PSBhbW1tYXRoLkFwcGx5RmVlKHNlbnQsIEZlZUJQUywgQ3JlYXRvckZlZVNoYXJlQlBTLCBQcm90b2NvbEZlZVNoYXJlQlBTKQ0KCXRva2Vuc091dCwgbmV3UFUsIG5ld1BUIDo9IGFtbW1hdGguUG9vbFN3YXBVZ25vdEZvclRva2VuKA0KCQlsLlBvb2xVZ25vdCwgbC5Qb29sVG9rZW4sIGZlZS5OZXQsIGZlZS5SZW1haW5kZXIsDQoJKQ0KCXJlcXVpcmVNaW5PdXQodG9rZW5zT3V0LCBtaW5Ub2tlbnNPdXQsICJ0b2tlbnMgb3V0IikNCg0KCS8vIFJlZnVuZCB1bnVzZWQgZ3Jvc3MgaWYgcG9vbCBtYXRoIHVzZWQgbGVzcyAocmFyZSk7IGZlZXMgZnJvbSBzZW50Lg0KCS8vIFBvb2wgc3dhcCB1c2VzIGZlZS5OZXQgaW50byBwb29sOyBmdWxsIHNlbnQgc3RheXMgYXMgZmVlK3Bvb2wgY29udHJpYnV0aW9uLg0KCWwuQ3JlYXRvckZlZXMgKz0gZmVlLkNyZWF0b3INCgljcmVkaXRQcm90b2NvbChmZWUuUHJvdG9jb2wpDQoJbC5Qb29sVWdub3QgPSBuZXdQVQ0KCWwuUG9vbFRva2VuID0gbmV3UFQNCglhZGRCYWwobCwgYnV5ZXIsIHRva2Vuc091dCkNCglub3RlQnV5ZXIobCwgYnV5ZXIpDQoJcmVjb3JkVHJhZGUobCwgVHJhZGVTaWRlQnV5LCBzZW50LCB0b2tlbnNPdXQpDQoNCgljaGFpbi5FbWl0KCJTd2FwQnV5IiwNCgkJImlkIiwgaWQsDQoJCSJidXllciIsIGJ1eWVyLlN0cmluZygpLA0KCQkidWdub3QiLCBzdHJjb252LkZvcm1hdEludChzZW50LCAxMCksDQoJCSJ3dWdub3QiLCBzdHJjb252LkZvcm1hdEludChzZW50LCAxMCksDQoJCSJ0b2tlbnMiLCBzdHJjb252LkZvcm1hdEludCh0b2tlbnNPdXQsIDEwKSwNCgkpDQoJbm90aWZ5VHJhZGUoY3VyLCBidXllciwgaWQsIDAsIHNlbnQpDQoJcmV0dXJuIHRva2Vuc091dA0KfQ0KDQovLyBTd2FwU2VsbCBzZWxscyB0b2tlbnMgaW50byB0aGUgZ3JhZHVhdGVkIHBvb2wgZm9yIFdVR05PVC4NCi8vIG1pbld1Z25vdE91dDogc2xpcHBhZ2UgZmxvb3IgKDAgPSBkaXNhYmxlZCkuDQpmdW5jIFN3YXBTZWxsKGN1ciByZWFsbSwgaWQgc3RyaW5nLCB0b2tlbnNJbiwgbWluV3Vnbm90T3V0IGludDY0KSBpbnQ2NCB7DQoJcmVxdWlyZUluaXQoKQ0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJaWYgdG9rZW5zSW4gPD0gMCB7DQoJCXBhbmljKCJwYWQ6IHRva2Vuc0luIG11c3QgYmUgcG9zaXRpdmUiKQ0KCX0NCglsIDo9IG11c3RMYXVuY2goaWQpDQoJaWYgbC5TdGF0dXMgIT0gU3RhdHVzR3JhZHVhdGVkIHsNCgkJcGFuaWMoInBhZDogbm90IGdyYWR1YXRlZCAodXNlIFNlbGwpIikNCgl9DQoJaWYgbC5Hbm9zd2FwTGlzdGVkIHx8IGwuTGlzdFZlbnVlICE9ICIiIHsNCgkJcGFuaWMoInBhZDogbGlzdGVkIG9uIERFWCAtIHRyYWRlIHZpYSByb3V0ZXIsIG5vdCBwYWQgU3dhcFNlbGwiKQ0KCX0NCglpZiBsLkxpc3RTZWVkUmVsZWFzZWQgew0KCQlwYW5pYygicGFkOiBsaXN0IHNlZWQgcmVsZWFzZWQgLSBmaW5pc2ggemRleCBDcmVhdGVQb29sICsgQ29uZmlybVpkZXhMaXN0IikNCgl9DQoJc2VsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KCWlmIGJhbE9mKGwsIHNlbGxlcikgPCB0b2tlbnNJbiB7DQoJCXBhbmljKCJwYWQ6IGluc3VmZmljaWVudCB0b2tlbiBiYWxhbmNlIikNCgl9DQoNCglncm9zcywgbmV3UFUsIG5ld1BUIDo9IGFtbW1hdGguUG9vbFN3YXBUb2tlbkZvclVnbm90KGwuUG9vbFVnbm90LCBsLlBvb2xUb2tlbiwgdG9rZW5zSW4pDQoJZmVlIDo9IGFtbW1hdGguQXBwbHlGZWVPbk91dHB1dChncm9zcywgRmVlQlBTLCBDcmVhdG9yRmVlU2hhcmVCUFMsIFByb3RvY29sRmVlU2hhcmVCUFMpDQoJcmVxdWlyZU1pbk91dChmZWUuTmV0LCBtaW5XdWdub3RPdXQsICJ3dWdub3Qgb3V0IikNCg0KCS8vIFJldGFpbiBmZWUgaW4gcG9vbCB1Z25vdCAoY2FzaCBzdGF5cyk7IHVzZXIgZ2V0cyBuZXQgV1VHTk9ULg0KCWwuUG9vbFVnbm90ID0gbmV3UFUgKyBmZWUuRmVlDQoJbC5Qb29sVG9rZW4gPSBuZXdQVA0KCWwuQ3JlYXRvckZlZXMgKz0gZmVlLkNyZWF0b3INCgljcmVkaXRQcm90b2NvbChmZWUuUHJvdG9jb2wpDQoNCglhZGRCYWwobCwgc2VsbGVyLCAtdG9rZW5zSW4pDQoJcGF5V3Vnbm90T3V0KGN1ciwgc2VsbGVyLCBmZWUuTmV0KQ0KCXJlY29yZFRyYWRlKGwsIFRyYWRlU2lkZVNlbGwsIGZlZS5OZXQsIHRva2Vuc0luKQ0KDQoJY2hhaW4uRW1pdCgiU3dhcFNlbGwiLA0KCQkiaWQiLCBpZCwNCgkJInNlbGxlciIsIHNlbGxlci5TdHJpbmcoKSwNCgkJInRva2VucyIsIHN0cmNvbnYuRm9ybWF0SW50KHRva2Vuc0luLCAxMCksDQoJCSJ1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KGZlZS5OZXQsIDEwKSwNCgkJInd1Z25vdCIsIHN0cmNvbnYuRm9ybWF0SW50KGZlZS5OZXQsIDEwKSwNCgkpDQoJbm90aWZ5VHJhZGUoY3VyLCBzZWxsZXIsIGlkLCAxLCBmZWUuTmV0KQ0KCXJldHVybiBmZWUuTmV0DQp9DQoNCi8vIFRyYW5zZmVyIG1vdmVzIEdSQzIwIHRva2VucyBiZXR3ZWVuIGFkZHJlc3NlcyAodXNlci1pbml0aWF0ZWQpLg0KZnVuYyBUcmFuc2ZlcihjdXIgcmVhbG0sIGlkIHN0cmluZywgdG8gYWRkcmVzcywgYW1vdW50IGludDY0KSB7DQoJcmVxdWlyZUluaXQoKQ0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJaWYgYW1vdW50IDw9IDAgew0KCQlwYW5pYygicGFkOiBhbW91bnQgbXVzdCBiZSBwb3NpdGl2ZSIpDQoJfQ0KCWlmICF0by5Jc1ZhbGlkKCkgew0KCQlwYW5pYygicGFkOiBpbnZhbGlkIHRvIikNCgl9DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWZyb20gOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpDQoJaWYgZnJvbSA9PSB0byB7DQoJCXBhbmljKCJwYWQ6IHNlbGYgdHJhbnNmZXIiKQ0KCX0NCglpZiBsLmxlZGdlciA9PSBuaWwgew0KCQlwYW5pYygicGFkOiBubyBHUkMyMCBsZWRnZXIiKQ0KCX0NCglpZiBlcnIgOj0gbC5sZWRnZXIuVHJhbnNmZXIoZnJvbSwgdG8sIGFtb3VudCk7IGVyciAhPSBuaWwgew0KCQlwYW5pYygicGFkOiB0cmFuc2ZlcjogIiArIGVyci5FcnJvcigpKQ0KCX0NCgljaGFpbi5FbWl0KCJUcmFuc2ZlciIsICJpZCIsIGlkLCAiZnJvbSIsIGZyb20uU3RyaW5nKCksICJ0byIsIHRvLlN0cmluZygpLA0KCQkiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQoYW1vdW50LCAxMCkpDQp9DQoNCi8vIEFwcHJvdmUgc2V0cyBHUkMyMCBhbGxvd2FuY2Ugc28gREVYL2NvbnRyYWN0cyBjYW4gVHJhbnNmZXJGcm9tLg0KZnVuYyBBcHByb3ZlKGN1ciByZWFsbSwgaWQgc3RyaW5nLCBzcGVuZGVyIGFkZHJlc3MsIGFtb3VudCBpbnQ2NCkgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCWlmICFzcGVuZGVyLklzVmFsaWQoKSB7DQoJCXBhbmljKCJwYWQ6IGludmFsaWQgc3BlbmRlciIpDQoJfQ0KCWwgOj0gbXVzdExhdW5jaChpZCkNCglpZiBsLmxlZGdlciA9PSBuaWwgew0KCQlwYW5pYygicGFkOiBubyBHUkMyMCBsZWRnZXIiKQ0KCX0NCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkNCglpZiBlcnIgOj0gbC5sZWRnZXIuQXBwcm92ZShvd25lciwgc3BlbmRlciwgYW1vdW50KTsgZXJyICE9IG5pbCB7DQoJCXBhbmljKCJwYWQ6IGFwcHJvdmU6ICIgKyBlcnIuRXJyb3IoKSkNCgl9DQoJY2hhaW4uRW1pdCgiQXBwcm92YWwiLCAiaWQiLCBpZCwgIm93bmVyIiwgb3duZXIuU3RyaW5nKCksICJzcGVuZGVyIiwgc3BlbmRlci5TdHJpbmcoKSwNCgkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtb3VudCwgMTApKQ0KfQ0KDQovLyBUcmFuc2ZlckZyb20gc3BlbmRzIGFsbG93YW5jZTogc3BlbmRlciA9IE1zZ0NhbGwgRU9BIGNhbGxlci4NCi8vIEVuYWJsZXMgREVYIC8gcm91dGVycyB0aGF0IGhvbGQgYWxsb3dhbmNlIGZyb20gQXBwcm92ZS4NCmZ1bmMgVHJhbnNmZXJGcm9tKGN1ciByZWFsbSwgaWQgc3RyaW5nLCBmcm9tLCB0byBhZGRyZXNzLCBhbW91bnQgaW50NjQpIHsNCglyZXF1aXJlSW5pdCgpDQoJaWYgIWN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSB7DQoJCXBhbmljKCJwYWQ6IG11c3QgYmUgRU9BIE1zZ0NhbGwiKQ0KCX0NCglpZiBhbW91bnQgPD0gMCB7DQoJCXBhbmljKCJwYWQ6IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikNCgl9DQoJaWYgIWZyb20uSXNWYWxpZCgpIHx8ICF0by5Jc1ZhbGlkKCkgew0KCQlwYW5pYygicGFkOiBpbnZhbGlkIGFkZHJlc3MiKQ0KCX0NCglpZiBmcm9tID09IHRvIHsNCgkJcGFuaWMoInBhZDogc2VsZiB0cmFuc2ZlciIpDQoJfQ0KCWwgOj0gbXVzdExhdW5jaChpZCkNCglpZiBsLmxlZGdlciA9PSBuaWwgew0KCQlwYW5pYygicGFkOiBubyBHUkMyMCBsZWRnZXIiKQ0KCX0NCglzcGVuZGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQ0KCWlmIGVyciA6PSBsLmxlZGdlci5UcmFuc2ZlckZyb20oZnJvbSwgc3BlbmRlciwgdG8sIGFtb3VudCk7IGVyciAhPSBuaWwgew0KCQlwYW5pYygicGFkOiB0cmFuc2ZlckZyb206ICIgKyBlcnIuRXJyb3IoKSkNCgl9DQoJY2hhaW4uRW1pdCgiVHJhbnNmZXJGcm9tIiwgImlkIiwgaWQsICJmcm9tIiwgZnJvbS5TdHJpbmcoKSwgInRvIiwgdG8uU3RyaW5nKCksDQoJCSJzcGVuZGVyIiwgc3BlbmRlci5TdHJpbmcoKSwgImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtb3VudCwgMTApKQ0KfQ0KDQovLyBDbGFpbUNyZWF0b3JGZWVzIHdpdGhkcmF3cyBhY2NydWVkIGNyZWF0b3IgZmVlcyBmb3IgYSBsYXVuY2guDQovLyBPbmx5IHRoZSB0b2tlbiBjcmVhdG9yIG1heSBjbGFpbS4gRmVlcyBzdGF5IG9uIHBhZCB1bnRpbCBjbGFpbWVkLg0KZnVuYyBDbGFpbUNyZWF0b3JGZWVzKGN1ciByZWFsbSwgaWQgc3RyaW5nKSBpbnQ2NCB7DQoJcmVxdWlyZUluaXQoKQ0KCWlmICFjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgew0KCQlwYW5pYygicGFkOiBtdXN0IGJlIEVPQSBNc2dDYWxsIikNCgl9DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkNCglpZiBjYWxsZXIgIT0gbC5DcmVhdG9yIHsNCgkJcGFuaWMoInBhZDogbm90IGNyZWF0b3IiKQ0KCX0NCglhbXQgOj0gbC5DcmVhdG9yRmVlcw0KCWlmIGFtdCA8PSAwIHsNCgkJcmV0dXJuIDANCgl9DQoJbC5DcmVhdG9yRmVlcyA9IDANCgkvLyBQcm9kdWN0aW9uOiBmZWVzIGFjY3J1ZSBhcyBXVUdOT1Qgb24gcGFkLiBUZXN0cyBwYXkgdWdub3QgdmlhIHBheVd1Z25vdE91dC4NCglwYXlXdWdub3RPdXQoY3VyLCBjYWxsZXIsIGFtdCkNCgljaGFpbi5FbWl0KCJDbGFpbUNyZWF0b3IiLCAiaWQiLCBpZCwgImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtdCwgMTApKQ0KCXJldHVybiBhbXQNCn0NCg0KLy8gcGF5b3V0UHJvdG9jb2xGZWVzIHNlbmRzIGFsbCBwZW5kaW5nIHByb3RvY29sRmVlcyB0byBwcm90b2NvbEFkZHIuDQovLyBTaGFyZWQgYnkgQ2xhaW1Qcm90b2NvbEZlZXMgYW5kIFB1c2hQcm90b2NvbEZlZXMuDQpmdW5jIHBheW91dFByb3RvY29sRmVlcyhjdXIgcmVhbG0pIGludDY0IHsNCglhbXQgOj0gcHJvdG9jb2xGZWVzDQoJaWYgYW10IDw9IDAgew0KCQlyZXR1cm4gMA0KCX0NCglpZiAhcHJvdG9jb2xBZGRyLklzVmFsaWQoKSB7DQoJCXBhbmljKCJwYWQ6IHByb3RvY29sIGFkZHJlc3MgdW5zZXQiKQ0KCX0NCglwcm90b2NvbEZlZXMgPSAwDQoJcHJvdG9jb2xGZWVzUGFpZCArPSBhbXQNCglwYXlXdWdub3RPdXQoY3VyLCBwcm90b2NvbEFkZHIsIGFtdCkNCgljaGFpbi5FbWl0KCJDbGFpbVByb3RvY29sIiwNCgkJInRvIiwgcHJvdG9jb2xBZGRyLlN0cmluZygpLA0KCQkiYW1vdW50Iiwgc3RyY29udi5Gb3JtYXRJbnQoYW10LCAxMCksDQoJKQ0KCXJldHVybiBhbXQNCn0NCg0KLy8gQ2xhaW1Qcm90b2NvbEZlZXMgd2l0aGRyYXdzIHBlbmRpbmcgcHJvdG9jb2wgZmVlcyB0byBwcm90b2NvbEFkZHIuDQovLyBPbmx5IHRoZSBjdXJyZW50IHByb3RvY29sIHRyZWFzdXJ5IGtleSBtYXkgY2FsbCAoc2FtZSB3YWxsZXQgdGhhdCBJbml0J2QsDQovLyB1bmxlc3MgVHJhbnNmZXJQcm90b2NvbCB3YXMgdXNlZCkuDQpmdW5jIENsYWltUHJvdG9jb2xGZWVzKGN1ciByZWFsbSkgaW50NjQgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBwcm90b2NvbEFkZHIgew0KCQlwYW5pYygicGFkOiBub3QgcHJvdG9jb2wiKQ0KCX0NCglyZXR1cm4gcGF5b3V0UHJvdG9jb2xGZWVzKGN1cikNCn0NCg0KLy8gUHVzaFByb3RvY29sRmVlcyBzZW5kcyBwZW5kaW5nIHByb3RvY29sIGZlZXMgdG8gcHJvdG9jb2xBZGRyLg0KLy8gUGVybWlzc2lvbmxlc3M6IGFueW9uZSBtYXkgY2FsbCBzbyB0cmVhc3VyeSBjYW4gYmUgcGFpZCB3aXRob3V0IHRoZSBwcm90b2NvbA0KLy8ga2V5IHNpZ25pbmcgKHN0aWxsIG9ubHkgcGF5cyB0aGUgY29uZmlndXJlZCBwcm90b2NvbEFkZHIpLg0KZnVuYyBQdXNoUHJvdG9jb2xGZWVzKGN1ciByZWFsbSkgaW50NjQgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCXJldHVybiBwYXlvdXRQcm90b2NvbEZlZXMoY3VyKQ0KfQ0KDQovLyBUcmFuc2ZlclByb3RvY29sIHJvdGF0ZXMgdGhlIHByb3RvY29sIGZlZSByZWNpcGllbnQgKGN1cnJlbnQgcHJvdG9jb2wgb25seSkuDQovLyBQZW5kaW5nIHByb3RvY29sRmVlcyBzdGF5IG9uIHBhZCB1bnRpbCBjbGFpbWVkL3B1c2hlZCB0byB0aGUgKm5ldyogYWRkcmVzcy4NCmZ1bmMgVHJhbnNmZXJQcm90b2NvbChjdXIgcmVhbG0sIG5ld0FkZHIgYWRkcmVzcykgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBwcm90b2NvbEFkZHIgew0KCQlwYW5pYygicGFkOiBub3QgcHJvdG9jb2wiKQ0KCX0NCglpZiAhbmV3QWRkci5Jc1ZhbGlkKCkgew0KCQlwYW5pYygicGFkOiBpbnZhbGlkIG5ldyBwcm90b2NvbCBhZGRyZXNzIikNCgl9DQoJaWYgbmV3QWRkciA9PSBwcm90b2NvbEFkZHIgew0KCQlwYW5pYygicGFkOiBzYW1lIHByb3RvY29sIGFkZHJlc3MiKQ0KCX0NCglvbGQgOj0gcHJvdG9jb2xBZGRyDQoJcHJvdG9jb2xBZGRyID0gbmV3QWRkcg0KCWNoYWluLkVtaXQoIlRyYW5zZmVyUHJvdG9jb2wiLCAiZnJvbSIsIG9sZC5TdHJpbmcoKSwgInRvIiwgbmV3QWRkci5TdHJpbmcoKSkNCn0NCg0KLy8gUHJvdG9jb2xBZGRyZXNzIHJldHVybnMgdGhlIGN1cnJlbnQgcHJvdG9jb2wgdHJlYXN1cnkgYWRkcmVzcyAoYmVjaDMyKS4NCmZ1bmMgUHJvdG9jb2xBZGRyZXNzKCkgc3RyaW5nIHsNCglyZXR1cm4gcHJvdG9jb2xBZGRyLlN0cmluZygpDQp9DQoNCi8vIFByb3RvY29sRmVlc1BhaWQgcmV0dXJucyBsaWZldGltZSB1Z25vdCBhbHJlYWR5IHBhaWQgb3V0IHRvIHRoZSB0cmVhc3VyeS4NCmZ1bmMgUHJvdG9jb2xGZWVzUGFpZCgpIGludDY0IHsNCglyZXR1cm4gcHJvdG9jb2xGZWVzUGFpZA0KfQ0KDQovLyBGZWVJbmZvIHJldHVybnMgcHJvdG9jb2xBZGRyfHBlbmRpbmdVZ25vdHxwYWlkVWdub3QgZm9yIFVJcy4NCmZ1bmMgRmVlSW5mbygpIHN0cmluZyB7DQoJcmV0dXJuIHByb3RvY29sQWRkci5TdHJpbmcoKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KHByb3RvY29sRmVlcywgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQocHJvdG9jb2xGZWVzUGFpZCwgMTApDQp9DQoNCi8vIFBhZEFkZHJlc3MgcmV0dXJucyB0aGlzIHBhZCByZWFsbSdzIGJlY2gzMiBwYWNrYWdlIGFkZHJlc3MgKGZ1bmQgV1VHTk9UIGhlcmUpLg0KZnVuYyBQYWRBZGRyZXNzKCkgc3RyaW5nIHsNCglyZXR1cm4gcGFkQWRkci5TdHJpbmcoKQ0KfQ0KDQovLyBBZG1pbkluZm8gaXMgYSBzaW5nbGUtbGluZSBkYXNoYm9hcmQgc25hcHNob3QgZm9yIHRoZSBvcHMgVUk6DQovLw0KLy8JcHJvdG9jb2xBZGRyfHBlbmRpbmdGZWVzfHBhaWRGZWVzfHJlc2VydmVkVWdub3R8bGF1bmNoQ291bnR8cG9pbnRzT258aW5pdGVkfHBhZEFkZHINCi8vDQovLyBwb2ludHNPbi9pbml0ZWQgYXJlIDB8MS4NCmZ1bmMgQWRtaW5JbmZvKCkgc3RyaW5nIHsNCglwdHMgOj0gIjAiDQoJaWYgcG9pbnRzRW5hYmxlZCB7DQoJCXB0cyA9ICIxIg0KCX0NCglpbmkgOj0gIjAiDQoJaWYgaW5pdGVkIHsNCgkJaW5pID0gIjEiDQoJfQ0KCXJldHVybiBwcm90b2NvbEFkZHIuU3RyaW5nKCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChwcm90b2NvbEZlZXMsIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KHByb3RvY29sRmVlc1BhaWQsIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KHJlc2VydmVkVWdub3QoKSwgMTApICsgInwiICsNCgkJc3RyY29udi5JdG9hKGxhdW5jaGVzLlNpemUoKSkgKyAifCIgKw0KCQlwdHMgKyAifCIgKw0KCQlpbmkgKyAifCIgKw0KCQlwYWRBZGRyLlN0cmluZygpDQp9DQoNCi8vIElzUHJvdG9jb2wgcmVwb3J0cyB3aGV0aGVyIGFkZHIgaXMgdGhlIGN1cnJlbnQgdHJlYXN1cnkgKGZvciBVSSBnYXRpbmcpLg0KZnVuYyBJc1Byb3RvY29sKGFkZHIgc3RyaW5nKSBib29sIHsNCglpZiAhaW5pdGVkIHx8ICFwcm90b2NvbEFkZHIuSXNWYWxpZCgpIHsNCgkJcmV0dXJuIGZhbHNlDQoJfQ0KCXJldHVybiBwcm90b2NvbEFkZHIuU3RyaW5nKCkgPT0gYWRkcg0KfQ0KDQovLyByZXNlcnZlZFVnbm90IGlzIHVnbm90IHRoZSBwYWQgbXVzdCBrZWVwIHRvIGhvbm9yIHVzZXIvY3JlYXRvciBsaWFiaWxpdGllcw0KLy8gYW5kIGFjdGl2ZSBtYXJrZXRzIChjdXJ2ZSByYWlzZWQsIGludGVybmFsIENQTU0sIGJvbmRzLCBwZW5kaW5nIGZlZXMpLg0KZnVuYyByZXNlcnZlZFVnbm90KCkgaW50NjQgew0KCXJlc2VydmVkIDo9IHByb3RvY29sRmVlcw0KCWxhdW5jaGVzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgew0KCQlsIDo9IHZhbHVlLigqTGF1bmNoKQ0KCQlyZXNlcnZlZCArPSBsLkNyZWF0b3JGZWVzDQoJCWlmICFsLkJvbmRSZWZ1bmRlZCB7DQoJCQlyZXNlcnZlZCArPSBsLkJvbmRVZ25vdA0KCQl9DQoJCWlmIGwuU3RhdHVzID09IFN0YXR1c0N1cnZlIHsNCgkJCXJlc2VydmVkICs9IGwuUmFpc2VkVWdub3QNCgkJfQ0KCQkvLyBJbnRlcm5hbCBDUE1NIChmYWxsYmFjayB3aGVuIG5vdCBsaXN0ZWQgLyBzZWVkIG5vdCByZWxlYXNlZCkuDQoJCWlmIGwuU3RhdHVzID09IFN0YXR1c0dyYWR1YXRlZCAmJiAhbC5Hbm9zd2FwTGlzdGVkICYmICFsLkxpc3RTZWVkUmVsZWFzZWQgew0KCQkJcmVzZXJ2ZWQgKz0gbC5Qb29sVWdub3QNCgkJfQ0KCQlyZXR1cm4gZmFsc2UNCgl9KQ0KCXJldHVybiByZXNlcnZlZA0KfQ0KDQovLyBSZXNlcnZlZFVnbm90IGlzIHVnbm90IHRoZSBwYWQgbXVzdCBrZWVwIGZvciBtYXJrZXRzICsgcGVuZGluZyBjbGFpbXMuDQpmdW5jIFJlc2VydmVkVWdub3QoKSBpbnQ2NCB7DQoJcmV0dXJuIHJlc2VydmVkVWdub3QoKQ0KfQ0KDQovLyBmcmVlVWdub3QgcmVwb3J0cyBiYW5rIHVnbm90IGFib3ZlIHJlc2VydmVkIGxpYWJpbGl0aWVzICgwIGlmIHNob3J0L3Rlc3QpLg0KZnVuYyBmcmVlVWdub3QoY3VyIHJlYWxtKSBpbnQ2NCB7DQoJaWYgdGVzdFNraXBCYW5rZXIgew0KCQlyZXR1cm4gMA0KCX0NCgliayA6PSBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhZG9ubHksIGN1cikNCgliYWwgOj0gYmsuR2V0Q29pbnMoY3VyLkFkZHJlc3MoKSkuQW1vdW50T2YoRGVub21VZ25vdCkNCglmcmVlIDo9IGJhbCAtIHJlc2VydmVkVWdub3QoKQ0KCWlmIGZyZWUgPCAwIHsNCgkJcmV0dXJuIDANCgl9DQoJcmV0dXJuIGZyZWUNCn0NCg0KLy8gV2l0aGRyYXdQcm90b2NvbFVnbm90IGxldHMgdGhlIHRyZWFzdXJ5IHB1bGwgZnJlZSB1Z25vdCBmcm9tIHRoZSBwYWQgYmFuaw0KLy8gKGUuZy4gcmFpc2VkIGJhY2tsb2cgYWZ0ZXIgR25vc3dhcCBsaXN0LCB0byByZS13cmFwIGFzIFdVR05PVCBpbnZlbnRvcnkpLg0KLy8gQ2FwcGVkIGJ5IGZyZWUgYmFsYW5jZTsgcGFuaWNzIGlmIGFtb3VudCA+IGZyZWUuDQpmdW5jIFdpdGhkcmF3UHJvdG9jb2xVZ25vdChjdXIgcmVhbG0sIGFtb3VudCBpbnQ2NCkgaW50NjQgew0KCXJlcXVpcmVJbml0KCkNCglpZiAhY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpIHsNCgkJcGFuaWMoInBhZDogbXVzdCBiZSBFT0EgTXNnQ2FsbCIpDQoJfQ0KCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBwcm90b2NvbEFkZHIgew0KCQlwYW5pYygicGFkOiBub3QgcHJvdG9jb2wiKQ0KCX0NCglpZiBhbW91bnQgPD0gMCB7DQoJCXBhbmljKCJwYWQ6IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikNCgl9DQoJZnJlZSA6PSBmcmVlVWdub3QoY3VyKQ0KCWlmIGFtb3VudCA+IGZyZWUgew0KCQlwYW5pYygicGFkOiBhbW91bnQgZXhjZWVkcyBmcmVlIHVnbm90IChyZXNlcnZlZCBmb3IgbWFya2V0cy9mZWVzKSIpDQoJfQ0KCXNlbmRVZ25vdChjdXIsIHByb3RvY29sQWRkciwgYW1vdW50KQ0KCWNoYWluLkVtaXQoIldpdGhkcmF3UHJvdG9jb2xVZ25vdCIsDQoJCSJ0byIsIHByb3RvY29sQWRkci5TdHJpbmcoKSwNCgkJImFtb3VudCIsIHN0cmNvbnYuRm9ybWF0SW50KGFtb3VudCwgMTApLA0KCQkiZnJlZUxlZnQiLCBzdHJjb252LkZvcm1hdEludChmcmVlLWFtb3VudCwgMTApLA0KCSkNCglyZXR1cm4gYW1vdW50DQp9DQoNCi8vIC0tLSByZWFkIGhlbHBlcnMgKG5vbi1jcm9zc2luZykgLS0tDQoNCmZ1bmMgQmFsYW5jZU9mKGlkIHN0cmluZywgb3duZXIgYWRkcmVzcykgaW50NjQgew0KCXJldHVybiBiYWxPZihtdXN0TGF1bmNoKGlkKSwgb3duZXIpDQp9DQoNCi8vIExpc3RCdXllcnMgcmV0dXJucyB1bmlxdWUgYnV5ZXIgYWRkcmVzc2VzIChvbmUgcGVyIGxpbmUpLCBjYXBwZWQgZm9yIHF1ZXJ5IHNpemUuDQovLyBPbmx5IGFkZHJlc3NlcyB0aGF0IGJvdWdodCBhdCBsZWFzdCBvbmNlIG9uIHRoaXMgcGFkIChVbmlxdWVCdXllcnMpLiBOb3QgZnVsbCBHUkMyMCBob2xkZXJzDQovLyB3aG8gcmVjZWl2ZWQgdG9rZW5zIHZpYSB0cmFuc2Zlci4NCmZ1bmMgTGlzdEJ1eWVycyhpZCBzdHJpbmcpIHN0cmluZyB7DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCWNvbnN0IG1heE4gPSAxMDANCglvdXQgOj0gIiINCgluIDo9IDANCglsLlVuaXF1ZUJ1eWVycy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrZXkgc3RyaW5nLCBfIGFueSkgYm9vbCB7DQoJCWlmIG4gPj0gbWF4TiB7DQoJCQlyZXR1cm4gdHJ1ZQ0KCQl9DQoJCWlmIG91dCAhPSAiIiB7DQoJCQlvdXQgKz0gIlxuIg0KCQl9DQoJCW91dCArPSBrZXkNCgkJbisrDQoJCXJldHVybiBmYWxzZQ0KCX0pDQoJcmV0dXJuIG91dA0KfQ0KDQpmdW5jIEdldFN0YXR1cyhpZCBzdHJpbmcpIGludCB7DQoJcmV0dXJuIG11c3RMYXVuY2goaWQpLlN0YXR1cw0KfQ0KDQpmdW5jIEdldFJhaXNlZChpZCBzdHJpbmcpIGludDY0IHsNCglyZXR1cm4gbXVzdExhdW5jaChpZCkuUmFpc2VkVWdub3QNCn0NCg0KZnVuYyBHZXRQb29sKGlkIHN0cmluZykgKHVnbm90LCB0b2tlbiBpbnQ2NCkgew0KCWwgOj0gbXVzdExhdW5jaChpZCkNCglyZXR1cm4gbC5Qb29sVWdub3QsIGwuUG9vbFRva2VuDQp9DQoNCmZ1bmMgR2V0Q3JlYXRvckZlZXMoaWQgc3RyaW5nKSBpbnQ2NCB7DQoJcmV0dXJuIG11c3RMYXVuY2goaWQpLkNyZWF0b3JGZWVzDQp9DQoNCmZ1bmMgUHJvdG9jb2xGZWVzKCkgaW50NjQgew0KCXJldHVybiBwcm90b2NvbEZlZXMNCn0NCg0KZnVuYyBMYXVuY2hDb3VudCgpIGludCB7DQoJcmV0dXJuIGxhdW5jaGVzLlNpemUoKQ0KfQ0KDQpmdW5jIFJlc29sdmVTeW1ib2woc3ltYm9sIHN0cmluZykgc3RyaW5nIHsNCglzLCBvayA6PSBieVN5bWJvbC5HZXQoc3ltYm9sKS4oc3RyaW5nKQ0KCWlmICFvayB7DQoJCXJldHVybiAiIg0KCX0NCglyZXR1cm4gcw0KfQ0KDQovLyBMaXN0SURzIHJldHVybnMgbmV3bGluZS1zZXBhcmF0ZWQgbGF1bmNoIElEcyAoc29ydGVkIGJ5IEFWTCBrZXkgLyBjcmVhdGlvbiBvcmRlcikuDQpmdW5jIExpc3RJRHMoKSBzdHJpbmcgew0KCW91dCA6PSAiIg0KCWxhdW5jaGVzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIF8gYW55KSBib29sIHsNCgkJaWYgb3V0ICE9ICIiIHsNCgkJCW91dCArPSAiXG4iDQoJCX0NCgkJb3V0ICs9IGtleQ0KCQlyZXR1cm4gZmFsc2UNCgl9KQ0KCXJldHVybiBvdXQNCn0NCg0KLy8gTGF1bmNoSW5mbyByZXR1cm5zIGEgc2luZ2xlLWxpbmUgcGlwZS1kZWxpbWl0ZWQgc3VtbWFyeSBmb3IgVUlzL2luZGV4ZXJzOg0KLy8NCi8vCWlkfG5hbWV8c3ltYm9sfHN0YXR1c3xyYWlzZWR8c29sZHxidXllcnN8Y3JlYXRvckZlZXN8cG9vbFVnbm90fHBvb2xUb2tlbnx1cml8Y3JlYXRvcnx2aXJ0dWFsVWdub3R8dmlydHVhbFRva2VufGNyZWF0ZWR8dG9rZW5JRHxnbm9zd2FwUmVhZHl8Z25vc3dhcExpc3RlZHxnbm9zd2FwUG9vbFBhdGh8Z25vc3dhcE5vdGV8bGlzdFZlbnVlDQovLw0KLy8gc3RhdHVzOiAwPWN1cnZlIDE9Z3JhZHVhdGVkOyBnbm9zd2FwUmVhZHkvbGlzdGVkOiAwfDENCi8vIGdub3N3YXBOb3RlOiBvcHRpb25hbCAocGFkdjEyKyk7IHBpcGVzIHN0cmlwcGVkIGZvciBkZWxpbWl0ZXIgc2FmZXR5Lg0KLy8gbGlzdFZlbnVlOiBvcHRpb25hbCAocGFkdjIzKyk7IGVtcHR5IGlmIHVubGlzdGVkLg0KZnVuYyBMYXVuY2hJbmZvKGlkIHN0cmluZykgc3RyaW5nIHsNCglsIDo9IG11c3RMYXVuY2goaWQpDQoJZ3MgOj0gIjAiDQoJaWYgbC5Hbm9zd2FwUmVhZHkgew0KCQlncyA9ICIxIg0KCX0NCglnbCA6PSAiMCINCglpZiBsLkdub3N3YXBMaXN0ZWQgew0KCQlnbCA9ICIxIg0KCX0NCglub3RlIDo9IHN0cmluZ3MuUmVwbGFjZUFsbChsLkdub3N3YXBOb3RlLCAifCIsICIvIikNCgl2ZW51ZSA6PSBzdHJpbmdzLlJlcGxhY2VBbGwobC5MaXN0VmVudWUsICJ8IiwgIi8iKQ0KCXJldHVybiBsLklEICsgInwiICsNCgkJbC5OYW1lICsgInwiICsNCgkJbC5TeW1ib2wgKyAifCIgKw0KCQlzdHJjb252Lkl0b2EobC5TdGF0dXMpICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQobC5SYWlzZWRVZ25vdCwgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQobC5SZWFsU29sZCwgMTApICsgInwiICsNCgkJc3RyY29udi5JdG9hKGwuQnV5ZXJDb3VudCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChsLkNyZWF0b3JGZWVzLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChsLlBvb2xVZ25vdCwgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQobC5Qb29sVG9rZW4sIDEwKSArICJ8IiArDQoJCWwuVVJJICsgInwiICsNCgkJbC5DcmVhdG9yLlN0cmluZygpICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQobC5WaXJ0dWFsVWdub3QsIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KGwuVmlydHVhbFRva2VuLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChsLkNyZWF0ZWQsIDEwKSArICJ8IiArDQoJCWwuVG9rZW5JRCArICJ8IiArDQoJCWdzICsgInwiICsNCgkJZ2wgKyAifCIgKw0KCQlsLkdub3N3YXBQb29sUGF0aCArICJ8IiArDQoJCW5vdGUgKyAifCIgKw0KCQl2ZW51ZQ0KfQ0KDQovLyBQYXJhbXNJbmZvIHJldHVybnMgcGFyYW1ldGVycyBmb3IgVUkgZGlzcGxheS4NCi8vIHRvdGFsfGN1cnZlfHBvb2xTZWVkfGdyYWRUaHJlc2hvbGR8ZmVlQnBzfGNyZWF0ZUJvbmR8bGlzdEZlZUducw0KLy8gY3JlYXRlQm9uZCBpcyBsaXZlIGZyb20gYm9uZCByZWFsbSB3aGVuIG5vdCBpbiB1bml0LXRlc3QgbW9kZS4NCi8vIGxpc3RGZWVHbnM6IENyZWF0ZS10aW1lIEdOUyBlc2Nyb3cgcmVxdWlyZWQgKHBhZHYyMCspLg0KZnVuYyBQYXJhbXNJbmZvKCkgc3RyaW5nIHsNCglyZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQoVG90YWxTdXBwbHksIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KEN1cnZlU3VwcGx5LCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChQb29sU2VlZCwgMTApICsgInwiICsNCgkJc3RyY29udi5Gb3JtYXRJbnQoZ3JhZHVhdGlvblRocmVzaG9sZCgpLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChGZWVCUFMsIDEwKSArICJ8IiArDQoJCXN0cmNvbnYuRm9ybWF0SW50KHJlcXVpcmVkQ3JlYXRlQm9uZCgpLCAxMCkgKyAifCIgKw0KCQlzdHJjb252LkZvcm1hdEludChyZXF1aXJlZExpc3RGZWVHbnMoKSwgMTApDQp9DQoNCi8vIFRyYWRlSGlzdG9yeSByZXR1cm5zIG5ld2xpbmUtc2VwYXJhdGVkIGNoYXJ0IHBvaW50czoNCi8vDQovLwloZWlnaHR8c2lkZXx1Z25vdHx0b2tlbnN8cHJpY2VTY2FsZWQNCi8vDQovLyBzaWRlOiAwPWJ1eSAxPXNlbGwgMj1vcGVuL2dyYWR1YXRlLiBPcmRlcmVkIG9sZGVzdCAtPiBuZXdlc3QuDQpmdW5jIFRyYWRlSGlzdG9yeShpZCBzdHJpbmcpIHN0cmluZyB7DQoJbCA6PSBtdXN0TGF1bmNoKGlkKQ0KCW91dCA6PSAiIg0KCWwuVHJhZGVzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgew0KCQl0IDo9IHZhbHVlLigqVHJhZGUpDQoJCWxpbmUgOj0gc3RyY29udi5Gb3JtYXRJbnQodC5IZWlnaHQsIDEwKSArICJ8IiArDQoJCQlzdHJjb252Lkl0b2EodC5TaWRlKSArICJ8IiArDQoJCQlzdHJjb252LkZvcm1hdEludCh0LlVnbm90LCAxMCkgKyAifCIgKw0KCQkJc3RyY29udi5Gb3JtYXRJbnQodC5Ub2tlbnMsIDEwKSArICJ8IiArDQoJCQlzdHJjb252LkZvcm1hdEludCh0LlByaWNlLCAxMCkNCgkJaWYgb3V0ICE9ICIiIHsNCgkJCW91dCArPSAiXG4iDQoJCX0NCgkJb3V0ICs9IGxpbmUNCgkJcmV0dXJuIGZhbHNlDQoJfSkNCglyZXR1cm4gb3V0DQp9DQoNCi8vIFRyYWRlQ291bnQgcmV0dXJucyBudW1iZXIgb2Ygc3RvcmVkIGNoYXJ0IHNhbXBsZXMgZm9yIGEgbGF1bmNoLg0KZnVuYyBUcmFkZUNvdW50KGlkIHN0cmluZykgaW50IHsNCglyZXR1cm4gbXVzdExhdW5jaChpZCkuVHJhZGVzLlNpemUoKQ0KfQ0KDQovLyByZXNldEZvclRlc3QgY2xlYXJzIHBhY2thZ2Ugc3RhdGUgYmV0d2VlbiB1bml0IHRlc3RzLg0KZnVuYyByZXNldEZvclRlc3QoKSB7DQoJbGF1bmNoZXMgPSBhdmwuVHJlZXt9DQoJYnlTeW1ib2wgPSBhdmwuVHJlZXt9DQoJbmV4dElEID0gMA0KCW5leHRUb2tlbklEID0gMA0KCXZhciB6ZXJvIGFkZHJlc3MNCglwcm90b2NvbEFkZHIgPSB6ZXJvDQoJLy8gcGFkQWRkciBpcyBzZXQgaW4gcGFja2FnZSBpbml0IC0gZG8gbm90IGNsZWFyIChyZWFsbSBhZGRyZXNzIGlzIGZpeGVkKS4NCglwcm90b2NvbEZlZXMgPSAwDQoJcHJvdG9jb2xGZWVzUGFpZCA9IDANCglpbml0ZWQgPSBmYWxzZQ0KCXBvaW50c0VuYWJsZWQgPSBmYWxzZQ0KCWdyYWR1YXRpb25VZ25vdCA9IDANCglsaXN0RmVlR25zTGl2ZSA9IDANCgl0ZXN0U2tpcEJhbmtlciA9IHRydWUgLy8gdW5pdCB0ZXN0cyBza2lwIGJhbmtlcjsgaW50ZWdyYXRpb24vY2hhaW4gdGVzdHMgbGVhdmUgZmFsc2UNCgl0ZXN0Rm9yY2VHbm9zd2FwTGlzdCA9IGZhbHNlDQoJdGVzdEZvcmNlWmRleExpc3QgPSBmYWxzZQ0KCXRvdGFsTGlzdEZlZUducyA9IDANCgl0b3RhbFd1Z25vdENyZWRpdCA9IDANCgl3dWdub3RDcmVkaXQgPSBhdmwuVHJlZXt9DQoJcmVzZXRMaXN0VmVudWVzRm9yVGVzdCgpDQp9DQoarBoKCnBhcmFtcy5nbm8SnRpwYWNrYWdlIHBhZA0KDQovLyBQcm90b2NvbCBwYXJhbWV0ZXJzLg0KLy8gRGVmYXVsdHMgYXJlIGNvbXBpbGUtdGltZSBjb25zdGFudHM7IEdyYWR1YXRpb25UaHJlc2hvbGQgYW5kIExpc3RGZWVHbnMgYWxzbyBoYXZlDQovLyBsaXZlIGNvcGllcyBzZXQgaW4gSW5pdCBhbmQgYWRqdXN0YWJsZSBieSBwcm90b2NvbCB2aWEgU2V0R3JhZHVhdGlvblRocmVzaG9sZCAvDQovLyBTZXRMaXN0RmVlR25zIChzZWUgbWVtZXBhZC5nbm8pLiBCb25kIGNyZWF0ZSBmZWUgaXMgb3duZWQgYnkgdGhlIGJvbmQgcmVhbG0uDQoNCmNvbnN0ICgNCgkvLyBUb2tlbiBlY29ub21pY3MNCglUb3RhbFN1cHBseSBpbnQ2NCA9IDFfMDAwXzAwMF8wMDANCglDdXJ2ZVN1cHBseSBpbnQ2NCA9IDgwMF8wMDBfMDAwIC8vIHNvbGQgb24gYm9uZGluZyBjdXJ2ZQ0KCS8vIFBvb2xTZWVkIGlzIGxlZ2FjeS4gR3JhZHVhdGlvbiBzaXplcyBMUCB0b2tlbnMgdG8gY3VydmUgc3BvdA0KCS8vIChyYWlzZWQgKiBWaXJ0dWFsVG9rZW4gLyBWaXJ0dWFsVWdub3QpOyB1bnNvbGQgcmVtYWluZGVyID0gTGVmdG92ZXJUb2tlbnMuDQoJUG9vbFNlZWQgaW50NjQgPSAyMDBfMDAwXzAwMA0KDQoJLy8gVmlydHVhbCBjb25zdGFudC1wcm9kdWN0IHNlZWQgKFB1bXAtc3R5bGUpLg0KCS8vIE1heCBuZXQgcmFpc2Ugd2hlbiBzZWxsaW5nIGZ1bGwgQ3VydmVTdXBwbHk6DQoJLy8gICBSID0gVmlydHVhbFVnbm90MCAqIEN1cnZlU3VwcGx5IC8gKFZpcnR1YWxUb2tlbjAgLSBDdXJ2ZVN1cHBseSkNCgkvLyBQZWFybCBkZWZhdWx0OiBWVTA9My41ZTkgKyBWVDDiiYgxLjA3M2U5ID0+IG1heCByYWlzZSDiiYgxMC4yayBHTk9UIHNvDQoJLy8gRGVmYXVsdEdyYWR1YXRpb25UaHJlc2hvbGQgMTBfMDAwIEdOT1QgaXMgcmVhY2hhYmxlIGJlZm9yZSBzb2xkLW91dC4NCglWaXJ0dWFsVWdub3QwIGludDY0ID0gMTAyXzM3NV8wNzFfNjI1IC8vIG1haW5uZXQ6IG1heCByYWlzZSDiiaUgMzAwayBHTk9UCglWaXJ0dWFsVG9rZW4wIGludDY0ID0gMV8wNzNfMDAwXzE5MSAvLyB2aXJ0dWFsIHRva2VuIHNpZGUNCg0KCS8vIERlZmF1bHQgZ3JhZHVhdGlvbiByYWlzZSAodWdub3QpLiBMaXZlIHZhbHVlIHN0YXJ0cyBoZXJlIGluIEluaXQ7DQoJLy8gcHJvdG9jb2wgbWF5IGNhbGwgU2V0R3JhZHVhdGlvblRocmVzaG9sZCBhZnRlcndhcmQuDQoJR3JhZHVhdGlvblRocmVzaG9sZCBpbnQ2NCA9IDMwMF8wMDBfMDAwXzAwMCAvLyAzMDBfMDAwIEdOT1QgKFNldEdyYWR1YXRpb25UaHJlc2hvbGQgbGF0ZXIpCg0KCS8vIEZlZXM6IDEuMjAlIHRvdGFsLiBPZiB0aGUgZmVlOiA0MCUgY3JlYXRvciwgNDAlIHByb3RvY29sLCAyMCUgTFAvayByZW1haW5kZXIuDQoJRmVlQlBTICAgICAgICAgICAgICBpbnQ2NCA9IDEyMA0KCUNyZWF0b3JGZWVTaGFyZUJQUyAgaW50NjQgPSA0MDAwDQoJUHJvdG9jb2xGZWVTaGFyZUJQUyBpbnQ2NCA9IDQwMDANCg0KCS8vIEZhbGxiYWNrIGNyZWF0ZSBib25kIGZvciB1bml0IHRlc3RzIC8gaWYgYm9uZCByZWFsbSB1bmF2YWlsYWJsZS4NCgkvLyBQcm9kdWN0aW9uIHBhZCB1c2VzIGNyZWF0ZWJvbmQuQ3VycmVudEJvbmRVZ25vdCgpIChzZWUgYm9uZCBwYWNrYWdlKS4NCgkvLyBTYXBwaGlyZSBub3JtYWwgYm9uZCA9IDIgR05PVDsgcHJvbW8gfiAkMjAgaW4gdWdub3Qgc2V0IG9uIGJvbmQuU3RhcnRQcm9tby4NCglDcmVhdGVCb25kVWdub3QgaW50NjQgPSAxNTBfMDAwXzAwMCAvLyAxNTAgR05PVCBmYWxsYmFjazsgbGl2ZSA9IGJvbmQgcmVhbG0NCglCb25kUmVmdW5kQnV5ZXJzICAgICBpbnQgICA9IDUNCglCb25kUmVmdW5kTWluUmFpc2VkICBpbnQ2NCA9IDVfMDAwXzAwMCAvLyA+PTUgR05PVCByYWlzZWQNCglCb25kUmVmdW5kTWF4SGVpZ2h0cyBpbnQ2NCA9IDEwMF8wMDANCg0KCS8vIEFudGktc25pcGU6IGZpcnN0IE4gaGVpZ2h0cywgbWF4IGN1bXVsYXRpdmUgdG9rZW5zIHBlciBhZGRyZXNzIChCUFMgb2YgVG90YWxTdXBwbHkpLg0KCUFudGlTbmlwZUhlaWdodHMgICBpbnQ2NCA9IDIwDQoJQW50aVNuaXBlTWF4QnV5QlBTIGludDY0ID0gNTAwIC8vIDUlIHBlciBhZGRyZXNzIGluIHdpbmRvdw0KDQoJLy8gU3RhdHVzDQoJU3RhdHVzQ3VydmUgICAgID0gMA0KCVN0YXR1c0dyYWR1YXRlZCA9IDENCg0KCS8vIFRyYWRlIGhpc3RvcnkgcmluZyBidWZmZXIuDQoJTWF4VHJhZGVIaXN0b3J5ID0gMTI4DQoJLy8gVHJhZGUgc2lkZXMgc3RvcmVkIGluIGhpc3RvcnkNCglUcmFkZVNpZGVCdXkgID0gMA0KCVRyYWRlU2lkZVNlbGwgPSAxDQoJVHJhZGVTaWRlT3BlbiA9IDIgLy8gaW5pdGlhbCBsaXN0aW5nIG1hcmsNCg0KCURlbm9tVWdub3QgPSAidWdub3QiDQoNCgkvLyAtLS0gR25vc3dhcCBhdXRvLWxpc3QgKFNhcHBoaXJlKSAtLS0NCgkvLyBDdXJ2ZSBjb2xsYXRlcmFsIGlzIFdVR05PVCAoQnV5IFRyYW5zZmVyRnJvbSkuIEF0IGdyYWR1YXRlLCBwYWQgYWxyZWFkeSBob2xkcw0KCS8vIHJhaXNlZCBXVUdOT1QgZm9yIExQIC0gbm8gcmVhbG0gc2VsZi13cmFwIG5lZWRlZC4NCgkvLyBDcmVhdGVQb29sIGZlZSBpcyBmaXhlZCBpbiBHTlMgKHR5cGljYWxseSAxMDBlNiA9IDEwMCBHTlMpOg0KCS8vICAgRmVlID0gcHJlLWZ1bmRlZCBHTlMgb24gcGFkIE9SIHN1cnBsdXMgV1VHTk9UIChmZWVzIHJldGFpbmVkKSBFeGFjdE91dCAtPiBHTlMNCglHbm9zd2FwRmVlVGllciAgICAgdWludDMyID0gMzAwMCAvLyAwLjMlIG1lbWUgdGllcg0KCUdub3N3YXBUaWNrU3BhY2luZyBpbnQzMiAgPSA2MA0KCUdub3N3YXBNaW5UaWNrICAgICBpbnQzMiAgPSAtODg3MjcyDQoJR25vc3dhcE1heFRpY2sgICAgIGludDMyICA9IDg4NzI3Mg0KCS8vIE1heCBXVUdOT1QgdXNlZCBhcyBFeGFjdE91dCBtYXhJbiBmb3IgZmVlIGJ1eSAoY2VpbGluZyAvIHNsaXBwYWdlKS4NCgkvLyBQcmVmZXIgcHJlLWZ1bmRpbmcgPj0xMDAgR05TIG9uIHBhZCBzbyBMUCBkZXB0aCBzdGF5cyA9IHJhaXNlZC4NCglHbm9zd2FwTWF4RmVlV3Vnbm90IGludDY0ID0gMV81MDBfMDAwXzAwMCAvLyAxNTAwIEdOT1QNCg0KCS8vIENyZWF0ZS10aW1lIEdOUyBsaXN0IGZlZSBlc2Nyb3cgKHBhZHYyMCspLg0KCS8vIENyZWF0b3IgbXVzdCBUcmFuc2ZlciA+PSBMaXN0RmVlR25zIGZyZWUgR05TIHRvIHBhZCBiZWZvcmUgQ3JlYXRlLg0KCS8vIExvY2tlZCBwZXItbGF1bmNoIHVudGlsIEdub3N3YXAgbGlzdCBjb25zdW1lcyBpdCwgb3IgQ2xhaW1MaXN0RmVlIHJlZnVuZHMgY3JlYXRvci4NCgkvLyBNYXRjaGVzIHR5cGljYWwgZ25zcG9vbC5HZXRQb29sQ3JlYXRpb25GZWUoKSAoMTAwIEdOUywgNiBkZWNpbWFscykuDQoJTGlzdEZlZUducyBpbnQ2NCA9IDEwMF8wMDBfMDAwDQopDQoa1zoKCnJlbmRlci5nbm8SyDpwYWNrYWdlIHBhZA0KDQppbXBvcnQgKA0KCSJzdHJjb252Ig0KCSJzdHJpbmdzIg0KDQoJImduby5sYW5kL3AvZzFuNHBsNXVjNHl0NXI5Nm05dzZmbWR6bngzeDBqeWc4bDZhcmhtdC9nbm9taS9hbW1tYXRoIg0KCSJnbm8ubGFuZC9wL250L3VmbXQvdjAiDQopDQoNCi8vIFJlbmRlciBwcm92aWRlcyBvbi1jaGFpbiBkaXNjb3ZlcnkgKGdub3dlYikuIFJlYWQtb25seSBieSBjb252ZW50aW9uLg0KLy8NCi8vIFBhdGhzOg0KLy8NCi8vCSIiICAgICAgICAgICAgICAtIGhvbWUgLyBsaXN0DQovLwl0b2tlbi97aWR9ICAgICAgLSBsYXVuY2ggZGV0YWlsDQovLwloZWxwICAgICAgICAgICAgLSBBUEkgaGVscA0KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7DQoJcGF0aCA9IHN0cmluZ3MuVHJpbShwYXRoLCAiLyIpDQoJaWYgcGF0aCA9PSAiIiB7DQoJCXJldHVybiByZW5kZXJIb21lKCkNCgl9DQoJaWYgcGF0aCA9PSAiaGVscCIgew0KCQlyZXR1cm4gcmVuZGVySGVscCgpDQoJfQ0KCWlmIHN0cmluZ3MuSGFzUHJlZml4KHBhdGgsICJ0b2tlbi8iKSB7DQoJCWlkIDo9IHN0cmluZ3MuVHJpbVByZWZpeChwYXRoLCAidG9rZW4vIikNCgkJcmV0dXJuIHJlbmRlclRva2VuKGlkKQ0KCX0NCglyZXR1cm4gIj4gWyFXQVJOSU5HXVxuPiBQYXRoIG5vdCBmb3VuZDogIiArIHNhbml0aXplKHBhdGgpICsgIlxuIg0KfQ0KDQpmdW5jIHNhbml0aXplKHMgc3RyaW5nKSBzdHJpbmcgew0KCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgImAiLCAiJyIpDQoJcyA9IHN0cmluZ3MuUmVwbGFjZUFsbChzLCAiPCIsICIiKQ0KCXMgPSBzdHJpbmdzLlJlcGxhY2VBbGwocywgIj4iLCAiIikNCglyZXR1cm4gcw0KfQ0KDQpmdW5jIHJlbmRlckhvbWUoKSBzdHJpbmcgew0KCW91dCA6PSAiIyBnbm9taVxuXG4iDQoJb3V0ICs9ICJNZW1lIGxhdW5jaHBhZCAtIFdVR05PVCBib25kaW5nIGN1cnZlIC0+IHJlbWFpbmluZyB0b2tlbnMgKyByYWlzZWQgV1VHTk9UIHNlZWQgR25vc3dhcCBMUCAoYXV0by1saXN0KS5cblxuIg0KCWlmICFpbml0ZWQgew0KCQlvdXQgKz0gIj4gWyFDQVVUSU9OXVxuPiBQcm90b2NvbCBub3QgaW5pdGlhbGl6ZWQuIENhbGwgSW5pdCBmaXJzdC5cblxuIg0KCQlyZXR1cm4gb3V0DQoJfQ0KCW91dCArPSB1Zm10LlNwcmludGYoIi0gTGF1bmNoZXM6ICoqJWQqKlxuIiwgbGF1bmNoZXMuU2l6ZSgpKQ0KCWlmIHByb3RvY29sQWRkci5Jc1ZhbGlkKCkgew0KCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIFByb3RvY29sIHRyZWFzdXJ5OiBgJXNgXG4iLCBwcm90b2NvbEFkZHIuU3RyaW5nKCkpDQoJfQ0KCW91dCArPSB1Zm10LlNwcmludGYoIi0gUHJvdG9jb2wgZmVlcyBwZW5kaW5nIChjbGFpbS9wdXNoKTogKiolZCoqIHVnbm90XG4iLCBwcm90b2NvbEZlZXMpDQoJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBQcm90b2NvbCBmZWVzIHBhaWQgKGxpZmV0aW1lKTogKiolZCoqIHVnbm90XG5cbiIsIHByb3RvY29sRmVlc1BhaWQpDQoJb3V0ICs9ICIjIyBNYXJrZXRzXG5cbiINCglpZiBsYXVuY2hlcy5TaXplKCkgPT0gMCB7DQoJCW91dCArPSAiX05vIGxhdW5jaGVzIHlldC4gQ2FsbCBDcmVhdGUgd2l0aCBuYW1lLCBzeW1ib2wsIHVyaSBhbmQgYm9uZC5fXG4iDQoJCXJldHVybiBvdXQNCgl9DQoJbGF1bmNoZXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBib29sIHsNCgkJbCA6PSB2YWx1ZS4oKkxhdW5jaCkNCgkJc3QgOj0gImN1cnZlIg0KCQlpZiBsLlN0YXR1cyA9PSBTdGF0dXNHcmFkdWF0ZWQgew0KCQkJc3QgPSAiZ3JhZHVhdGVkIg0KCQl9DQoJCW91dCArPSB1Zm10LlNwcmludGYoIi0gWyVzICgkJXMpXSh0b2tlbi8lcykgLSAlcyAtIHJhaXNlZCAlZCB1Z25vdCAtIGJ1eWVycyAlZFxuIiwNCgkJCXNhbml0aXplKGwuTmFtZSksIHNhbml0aXplKGwuU3ltYm9sKSwgbC5JRCwgc3QsIGwuUmFpc2VkVWdub3QsIGwuQnV5ZXJDb3VudCkNCgkJcmV0dXJuIGZhbHNlDQoJfSkNCglvdXQgKz0gIlxuW0hlbHBdKGhlbHApXG4iDQoJcmV0dXJuIG91dA0KfQ0KDQpmdW5jIHJlbmRlclRva2VuKGlkIHN0cmluZykgc3RyaW5nIHsNCglpZCA9IHNhbml0aXplKGlkKQ0KCWwsIG9rIDo9IGxhdW5jaGVzLkdldChpZCkuKCpMYXVuY2gpDQoJaWYgIW9rIHsNCgkJcmV0dXJuICI+IFshV0FSTklOR11cbj4gVW5rbm93biBsYXVuY2ggIiArIGlkICsgIlxuXG5bSG9tZV0oLi8pXG4iDQoJfQ0KCXN0IDo9ICJib25kaW5nIGN1cnZlIg0KCWlmIGwuU3RhdHVzID09IFN0YXR1c0dyYWR1YXRlZCB7DQoJCXN0ID0gImdyYWR1YXRlZCBwb29sIChMUCBsb2NrZWQpIg0KCX0NCglvdXQgOj0gdWZtdC5TcHJpbnRmKCIjICVzICgkJXMpXG5cbiIsIHNhbml0aXplKGwuTmFtZSksIHNhbml0aXplKGwuU3ltYm9sKSkNCglvdXQgKz0gdWZtdC5TcHJpbnRmKCItICoqSUQ6KiogJXNcbiIsIGwuSUQpDQoJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSAqKlN0YXR1czoqKiAlc1xuIiwgc3QpDQoJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSAqKkNyZWF0b3I6KiogJXNcbiIsIGwuQ3JlYXRvci5TdHJpbmcoKSkNCglpZiBsLlVSSSAhPSAiIiB7DQoJCW91dCArPSB1Zm10LlNwcmludGYoIi0gKipVUkk6KiogJXNcbiIsIHNhbml0aXplKGwuVVJJKSkNCgl9DQoJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSAqKlVuaXF1ZSBidXllcnM6KiogJWRcbiIsIGwuQnV5ZXJDb3VudCkNCglvdXQgKz0gdWZtdC5TcHJpbnRmKCItICoqQ3JlYXRvciBmZWVzIChjbGFpbWFibGUpOioqICVkIHVnbm90XG5cbiIsIGwuQ3JlYXRvckZlZXMpDQoNCglpZiBsLlN0YXR1cyA9PSBTdGF0dXNDdXJ2ZSB7DQoJCXJlbWFpbmluZyA6PSBDdXJ2ZVN1cHBseSAtIGwuUmVhbFNvbGQNCgkJcGN0IDo9IGludDY0KDApDQoJCWlmIGdyYWR1YXRpb25UaHJlc2hvbGQoKSA+IDAgew0KCQkJcGN0ID0gbC5SYWlzZWRVZ25vdCAqIDEwMCAvIGdyYWR1YXRpb25UaHJlc2hvbGQoKQ0KCQkJaWYgcGN0ID4gMTAwIHsNCgkJCQlwY3QgPSAxMDANCgkJCX0NCgkJfQ0KCQlzcG90IDo9IGFtbW1hdGguU3BvdFByaWNlVWdub3RQZXJUb2tlbihsLlZpcnR1YWxVZ25vdCwgbC5WaXJ0dWFsVG9rZW4pDQoJCW91dCArPSAiIyMgQm9uZGluZyBjdXJ2ZVxuXG4iDQoJCW91dCArPSB1Zm10LlNwcmludGYoIi0gUmFpc2VkOiAqKiVkKiogLyAlZCB1Z25vdCAoJWQlJSlcbiIsIGwuUmFpc2VkVWdub3QsIGdyYWR1YXRpb25UaHJlc2hvbGQoKSwgcGN0KQ0KCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIFRva2VucyBzb2xkOiAqKiVkKiogLyAlZFxuIiwgbC5SZWFsU29sZCwgQ3VydmVTdXBwbHkpDQoJCW91dCArPSB1Zm10LlNwcmludGYoIi0gUmVtYWluaW5nIG9uIGN1cnZlOiAqKiVkKipcbiIsIHJlbWFpbmluZykNCgkJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBTcG90ICh1Z25vdC90b2tlbiB4MWU2KTogKiolZCoqXG4iLCBzcG90KQ0KCQlvdXQgKz0gIlxuUHJvZ3Jlc3MgdG93YXJkIGdyYWR1YXRpb246XG5cbiINCgkJb3V0ICs9IHByb2dyZXNzQmFyKHBjdCkgKyAiXG4iDQoJfSBlbHNlIHsNCgkJc3BvdCA6PSBhbW1tYXRoLlNwb3RQcmljZVVnbm90UGVyVG9rZW4obC5Qb29sVWdub3QsIGwuUG9vbFRva2VuKQ0KCQlvdXQgKz0gIiMjIExpcXVpZGl0eSAocG9zdC1ncmFkdWF0ZSlcblxuIg0KCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIFJhaXNlZCBjYXBpdGFsIChyZWNvcmQpOiAqKiVkKiogdWdub3RcbiIsIGwuUG9vbFVnbm90KQ0KCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIExQIHRva2VucyAoY3VydmUtc3BvdCBzaXplZCk6ICoqJWQqKlxuIiwgbC5Qb29sVG9rZW4pDQoJCWlmIGwuTGVmdG92ZXJUb2tlbnMgPiAwIHsNCgkJCW91dCArPSB1Zm10LlNwcmludGYoIi0gTGVmdG92ZXIgb24gcGFkIChub3QgaW4gTFApOiAqKiVkKipcbiIsIGwuTGVmdG92ZXJUb2tlbnMpDQoJCX0NCgkJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBTcG90ICh1Z25vdC90b2tlbiB4MWU2KTogKiolZCoqXG4iLCBzcG90KQ0KCQlpZiBsLkdub3N3YXBMaXN0ZWQgew0KCQkJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSAqKkdub3N3YXAgbGlzdGVkOioqIGAlc2BcbiIsIHNhbml0aXplKGwuR25vc3dhcFBvb2xQYXRoKSkNCgkJCW91dCArPSB1Zm10LlNwcmludGYoIi0gUG9zaXRpb24gTkZUIGlkOiAqKiVkKiogKHBhZC1vd25lZCwgbG9ja2VkKVxuIiwgbC5Hbm9zd2FwUG9zaXRpb25JRCkNCgkJCW91dCArPSB1Zm10LlNwcmludGYoIi0gRmVlIFdVR05PVCBzcGVudDogKiolZCoqIHwgTFAgV1VHTk9UOiAqKiVkKipcbiIsIGwuRmVlV3Vnbm90U3BlbnQsIGwuTGlxV3Vnbm90VXNlZCkNCgkJCW91dCArPSAiXG4+IFshTk9URV1cbj4gVHJhZGUgb24gR25vc3dhcCByb3V0ZXIgLSBwYWQgU3dhcEJ1eS9Td2FwU2VsbCBkaXNhYmxlZCBhZnRlciBhdXRvLWxpc3QuXG4iDQoJCX0gZWxzZSB7DQoJCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIEdub3N3YXA6ICVzXG4iLCBzYW5pdGl6ZShsLkdub3N3YXBOb3RlKSkNCgkJCW91dCArPSAiXG4+IFshTk9URV1cbj4gSW50ZXJuYWwgQ1BNTS4gTGlzdDogd3Vnbm90LkRlcG9zaXQgLT4gQXBwcm92ZShwYWQpIC0+IFJldHJ5TGlzdEdub3N3YXAgKExQIHVnbm90IHJlaW1idXJzZWQ7IHByZWZlciBHTlMgZm9yIGZlZSkuXG4iDQoJCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIExpc3ROZWVkOiBgJXNgXG4iLCBsaXN0TmVlZE9mKGwpKQ0KCQl9DQoJfQ0KDQoJb3V0ICs9ICJcbiMjIFRyYWRlXG5cbiINCglvdXQgKz0gIlVzZSB3YWxsZXQgTXNnQ2FsbCAocGF5YWJsZSB0eHMpOlxuXG4iDQoJaWYgbC5TdGF0dXMgPT0gU3RhdHVzQ3VydmUgew0KCQlvdXQgKz0gdWZtdC5TcHJpbnRmKCItIEJ1eShpZCkgd2l0aCAtc2VuZCB1Z25vdCAtIGlkPSVzXG4iLCBsLklEKQ0KCQlvdXQgKz0gIi0gU2VsbChpZCwgdG9rZW5zSW4pXG4iDQoJCW91dCArPSAiLSBHcmFkdWF0ZShpZCkgd2hlbiB0aHJlc2hvbGQgbWV0XG4iDQoJfSBlbHNlIGlmIGwuR25vc3dhcExpc3RlZCB7DQoJCW91dCArPSAiLSBUcmFkZSBvbiBHbm9zd2FwIHJvdXRlciAocGFkIFN3YXBCdXkvU2VsbCBkaXNhYmxlZClcbiINCgkJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBQb29sOiBgJXNgXG4iLCBzYW5pdGl6ZShsLkdub3N3YXBQb29sUGF0aCkpDQoJfSBlbHNlIHsNCgkJb3V0ICs9ICItIFN3YXBCdXkoaWQpIHdpdGggLXNlbmQgdWdub3RcbiINCgkJb3V0ICs9ICItIFN3YXBTZWxsKGlkLCB0b2tlbnNJbilcbiINCgkJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBSZXRyeUxpc3RHbm9zd2FwKGlkKSAtIGF1dG8tcHVsbCBXVUdOT1QvR05TIGZyb20gY2FsbGVyIGlmIEFwcHJvdmVkIC0gaWQ9JXNcbiIsIGwuSUQpDQoJfQ0KCW91dCArPSAiXG5bSG9tZV0oLi8pIHwgW0hlbHBdKGhlbHApXG4iDQoJcmV0dXJuIG91dA0KfQ0KDQpmdW5jIHByb2dyZXNzQmFyKHBjdCBpbnQ2NCkgc3RyaW5nIHsNCglpZiBwY3QgPCAwIHsNCgkJcGN0ID0gMA0KCX0NCglpZiBwY3QgPiAxMDAgew0KCQlwY3QgPSAxMDANCgl9DQoJZmlsbGVkIDo9IGludChwY3QgLyA1KQ0KCWJhciA6PSAiWyINCglmb3IgaSA6PSAwOyBpIDwgMjA7IGkrKyB7DQoJCWlmIGkgPCBmaWxsZWQgew0KCQkJYmFyICs9ICIjIg0KCQl9IGVsc2Ugew0KCQkJYmFyICs9ICIuIg0KCQl9DQoJfQ0KCWJhciArPSAiXSAiICsgc3RyY29udi5Gb3JtYXRJbnQocGN0LCAxMCkgKyAiJSINCglyZXR1cm4gYmFyDQp9DQoNCmZ1bmMgcmVuZGVySGVscCgpIHN0cmluZyB7DQoJb3V0IDo9ICIjIGdub21pIEFQSVxuXG4iDQoJb3V0ICs9ICIjIyBMaWZlY3ljbGVcblxuIg0KCW91dCArPSAiMS4gSW5pdCgpIC0gb25jZTsgY2FsbGVyIGJlY29tZXMgcHJvdG9jb2wgdHJlYXN1cnlcbiINCglvdXQgKz0gIjIuIENyZWF0ZShuYW1lLCBzeW1ib2wsIHVyaSkgKyBib25kIGZyb20gYm9uZCByZWFsbSAocHJvbW8vbm9ybWFsKVxuIg0KCW91dCArPSAiMy4gQnV5KGlkLCBtaW5Ub2tlbnNPdXQpIC8gU2VsbChpZCwgYW1vdW50LCBtaW5VZ25vdE91dCkgLSBib25kaW5nIGN1cnZlXG4iDQoJb3V0ICs9ICI0LiBBdXRvIG9yIEdyYWR1YXRlKGlkKSBhdCB0aHJlc2hvbGRcbiINCglvdXQgKz0gIjUuIEdyYWR1YXRlIHNlZWRzIHJlbWFpbmluZyB0b2tlbnMgKyByYWlzZWQgYXMgbGlxdWlkaXR5XG4iDQoJb3V0ICs9ICIgICAtPiBhdXRvIEdub3N3YXAgQ3JlYXRlUG9vbCtNaW50IGlmIHBhZCBoYXMgV1VHTk9UIGludmVudG9yeVxuIg0KCW91dCArPSAiICAgLT4gZWxzZSBsb2NrZWQgaW50ZXJuYWwgQ1BNTSAoU3dhcEJ1eS9Td2FwU2VsbClcbiINCglvdXQgKz0gIjYuIFRyYW5zZmVyIC8gQXBwcm92ZSAvIFRyYW5zZmVyRnJvbSAtIEdSQzIwXG4iDQoJb3V0ICs9ICI3LiBGZWVzOlxuIg0KCW91dCArPSAiICAgLSBDcmVhdG9yOiBDbGFpbUNyZWF0b3JGZWVzKGlkKSAtIG9ubHkgY3JlYXRvciwgKiptdXN0IGNsYWltKipcbiINCglvdXQgKz0gIiAgIC0gUHJvdG9jb2w6IENsYWltUHJvdG9jb2xGZWVzKCkgKHRyZWFzdXJ5KSBvciBQdXNoUHJvdG9jb2xGZWVzKCkgKGFueW9uZSAtPiB0cmVhc3VyeSlcbiINCglvdXQgKz0gIiAgIC0gVHJhbnNmZXJQcm90b2NvbChuZXdBZGRyKSAvIFdpdGhkcmF3UHJvdG9jb2xVZ25vdChhbW91bnQpIC0gdHJlYXN1cnkgb3BzXG4iDQoJb3V0ICs9ICIgICAtIEdub3N3YXAgQ3JlYXRlUG9vbCBHTlMgZmVlIGdvZXMgdG8gR25vc3dhcCwgbm90IHBhZCB0cmVhc3VyeVxuXG4iDQoJb3V0ICs9ICIjIyBQYXJhbXMgKE1WUClcblxuIg0KCW91dCArPSB1Zm10LlNwcmludGYoIi0gVG90YWwgc3VwcGx5OiAlZFxuIiwgVG90YWxTdXBwbHkpDQoJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBDdXJ2ZSBzYWxlOiAlZFxuIiwgQ3VydmVTdXBwbHkpDQoJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBMUCB0b2tlbnMgYXQgZ3JhZDogVG90YWxTdXBwbHkgLSBSZWFsU29sZCAod2FzIFBvb2xTZWVkPSVkKVxuIiwgUG9vbFNlZWQpDQoJb3V0ICs9IHVmbXQuU3ByaW50ZigiLSBHcmFkdWF0aW9uOiAlZCB1Z25vdFxuIiwgZ3JhZHVhdGlvblRocmVzaG9sZCgpKQ0KCW91dCArPSB1Zm10LlNwcmludGYoIi0gRmVlOiAlZCBCUFNcbiIsIEZlZUJQUykNCglvdXQgKz0gdWZtdC5TcHJpbnRmKCItIENyZWF0ZSBib25kIChsaXZlKTogJWQgdWdub3RcblxuIiwgcmVxdWlyZWRDcmVhdGVCb25kKCkpDQoJb3V0ICs9ICIjIyBEZXNpZ25cblxuIg0KCW91dCArPSAiLSBSZW1haW5pbmcgdG9rZW5zICsgcmFpc2VkIEdOT1QgLT4gbGlxdWlkaXR5IGF0IGdyYWR1YXRlXG4iDQoJb3V0ICs9ICItIFBhcnQgb2YgV1VHTk9UIGludmVudG9yeSBzd2FwcyB0byBHTlMgZm9yIENyZWF0ZVBvb2wgZmVlXG4iDQoJb3V0ICs9ICItIFBlcm1hbmVudCBMUCBsb2NrIChwYWQgaG9sZHMgR25vc3dhcCBwb3NpdGlvbiBORlQpXG4iDQoJb3V0ICs9ICItIEVPQSArIE9yaWdpblNlbmQgcGF5bWVudCBndWFyZHNcblxuIg0KCW91dCArPSAiW0hvbWVdKC4vKVxuIg0KCXJldHVybiBvdXQNCn0NChquCgoNemRleF9saXN0LmdubxKcCnBhY2thZ2UgcGFkCgovLyB0cnlMaXN0T25aZGV4IOKAlCBzdHViIHVudGlsIFpkZXggaHViIGFsbG93cyBmYXJtL3JlYWxtIENyZWF0ZVBvb2wuCi8vIExpdmUgUGVhcmwvbWFpbm5ldDogQ3JlYXRlUG9vbCBpcyBFT0Etb25seSArIHJlcXVpcmVMaXN0ZWQuCi8vIFBhZCBwYXRoIHRvZGF5OgovLyAgMSkgUmVsZWFzZUxpc3RTZWVkKGlkKSDigJQgV1VHTk9UICsgbWludGVkIFBvb2xUb2tlbiDihpIgY3JlYXRvcgovLyAgMikgRU9BOiBvcHRpb25hbCB3dWdub3QuV2l0aGRyYXcg4oaSIEFwcHJvdmUoemRleCBSZWFsbUFkZHIpIOKGkiBDcmVhdGVQb29sCi8vICAzKSBDb25maXJtWmRleExpc3QoaWQsIHBvb2xJZCkg4oCUIG1hcmsgTGlzdFZlbnVlPXpkZXgKLy8KLy8gUGVhcmwgaHViOiBnbm8ubGFuZC9yL2cxbjRwbDV1YzR5dDVyOTZtOXc2Zm1kem54M3gwanlnOGw2YXJobXQvemRleC92MwovLyBDcmVhdGVQb29sKGN1ciwgdG9rZW5LZXksIHN5bWJvbCwgYW1vdW50VSwgYW1vdW50VCwgZmVlQnBzKSBzdHJpbmcKZnVuYyB0cnlMaXN0T25aZGV4KGN1ciByZWFsbSwgbCAqTGF1bmNoLCByYWlzZWRVZ25vdCwgbGlxVG9rZW5zIGludDY0KSBib29sIHsKCV8gPSBjdXIKCV8gPSByYWlzZWRVZ25vdAoJXyA9IGxpcVRva2VucwoJaWYgdGVzdEZvcmNlWmRleExpc3QgJiYgbCAhPSBuaWwgewoJCWwuR25vc3dhcExpc3RlZCA9IHRydWUgLy8gY29tcGF0ICJsaXN0ZWQiIGZsYWcgdXNlZCBieSBVSQoJCWwuR25vc3dhcFBvb2xQYXRoID0gInVnbm90fCIgKyBsLlN5bWJvbAoJCWwuR25vc3dhcFBvc2l0aW9uSUQgPSAwCgkJbC5MaXFXdWdub3RVc2VkID0gcmFpc2VkVWdub3QKCQlsLkdub3N3YXBOb3RlID0gImxpc3RlZCAodGVzdCBmb3JjZSB6ZGV4KSIKCQlsLkxpc3RWZW51ZSA9IFZlbnVlWmRleAoJCXJldHVybiB0cnVlCgl9CglpZiBsICE9IG5pbCB7CgkJaWYgbC5MaXN0U2VlZFJlbGVhc2VkIHsKCQkJbC5Hbm9zd2FwTm90ZSA9CgkJCQkiemRleDogc2VlZCByZWxlYXNlZCDigJQgRU9BIENyZWF0ZVBvb2wgdGhlbiBDb25maXJtWmRleExpc3QoaWQsIHVnbm90fFNZTUJPTCk7IFByZWZlcnJlZFZlbnVlPSIgKwoJCQkJCWwuUHJlZmVycmVkVmVudWUKCQl9IGVsc2UgewoJCQlsLkdub3N3YXBOb3RlID0KCQkJCSJ6ZGV4OiBSZWxlYXNlTGlzdFNlZWQg4oaSIEVPQSBDcmVhdGVQb29sIChXVUdOT1QgV2l0aGRyYXcgKyBBcHByb3ZlIFJlYWxtQWRkcikg4oaSIENvbmZpcm1aZGV4TGlzdDsgUHJlZmVycmVkVmVudWU9IiArCgkJCQkJbC5QcmVmZXJyZWRWZW51ZQoJCX0KCX0KCXJldHVybiBmYWxzZQp9CiIiChMvZ25vLk1lbVBhY2thZ2VUeXBlEgsKCU1QVXNlckFsbCINNTAwMDAwMDB1Z25vdBIUCIDO5M0CEgwyMDAwMDAwdWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECMUm5DwZgnt2UhYmlCfsy/+i/HtUmmVkWJmorMAzLSZASQOOClOhbabpPuCpRfhntpxUjgPbnaxwR/6asGuuHeiACLIv8wem3o2JR2GmNyclP33nwRvUQ89HN+IHptcEQnm8aKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU=