LyoKICogIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogKiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogKiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqCiAqICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKgogKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqICB1bmRlciB0aGUgTGljZW5zZS4KICovCgpwYWNrYWdlIG9yZy5hcGFjaGUuY29tbW9ucy5pbWFnaW5nLmZvcm1hdHMuanBlZy5kZWNvZGVyOwoKcHVibGljIGNsYXNzIERjdAp7CiAgICAvKgogICAgICogVGhlIGJvb2sgIkpQRUcgc3RpbGwgaW1hZ2UgZGF0YSBjb21wcmVzc2lvbiBzdGFuZGFyZCIsCiAgICAgKiBieSBQZW5uZWJha2VyIGFuZCBNaXRjaGVsbCwgQ2hhcHRlciA0LCBkaXNjdXNzZXMgYSBudW1iZXIgb2YKICAgICAqIGFwcHJvYWNoZXMgdG8gdGhlIGZhc3QgRENULiBIZXJlJ3MgdGhlIGNvc3QsIGV4bHVkaW5nIG1vZGlmaWVkCiAgICAgKiAoZGUpcXVhbnRpemF0aW9uLCBmb3IgdHJhbnNmb3JtaW5nIGFuIDh4OCBibG9jazoKICAgICAqCiAgICAgKiBBbGdvcml0aG0gICAgICAgICBBZGRzIE11bHRpcGxpZXMgUmlnaHRTaGlmdHMgIFRvdGFsCiAgICAgKiBOYWl2ZSAgICAgICAgICAgICAgODk2ICAgICAgIDEwMjQgICAgICAgICAgIDAgICAxOTIwCiAgICAgKiAiU3ltbWV0cmllcyIgICAgICAgNDQ4ICAgICAgICAyMjQgICAgICAgICAgIDAgICAgNjcyCiAgICAgKiBWZXR0ZXJsaSBhbmQgICAgICAgNDY0ICAgICAgICAyMDggICAgICAgICAgIDAgICAgNjcyCiAgICAgKiAgIExpZ3RlbmJlcmcKICAgICAqIEFyYWksIEFndWkgYW5kICAgICA0NjQgICAgICAgICA4MCAgICAgICAgICAgMCAgICA1NDQKICAgICAqICAgTmFrYWppbWEgKEFBJk4pCiAgICAgKiBGZWlnIDh4OCAgICAgICAgICAgNDYyICAgICAgICAgNTQgICAgICAgICAgIDYgICAgNTIyCiAgICAgKiBGdXNlZCBtdWwvYWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDE2CiAgICAgKiAgIChhIHBpcGUgZHJlYW0pCiAgICAgKgogICAgICogSUpHJ3MgbGlianBlZywgRkZtcGVnLCBhbmQgYSBudW1iZXIgb2Ygb3RoZXJzIHVzZSBBQSZOLgogICAgICoKICAgICAqIEl0IHdvdWxkIGFwcGVhciB0aGF0IEZlaWcgZG9lcyA0LTUlIGxlc3Mgb3BlcmF0aW9ucywgYW5kCiAgICAgKiBtdWx0aXBsaWNhdGlvbnMgYXJlIHJlZHVjZWQgZnJvbSA4MCBpbiBBQSZOIHRvIG9ubHkgNTQuCiAgICAgKiBCdXQgaW4gcHJhY3RpY2U6CiAgICAgKgogICAgICogQmVuY2htYXJrcywgSW50ZWwgQ29yZSBpMyBAIDIuOTMgR0h6IGluIGxvbmcgbW9kZSwgNCBHQiBSQU0KICAgICAqIFRpbWUgdGFrZW4gdG8gZG8gMTAwIG1pbGxpb24gSURDVHMgKGxlc3MgaXMgYmV0dGVyKToKICAgICAqIFJlbmUnIFN09mNrZWwncyBGZWlnLCBpbnQ6IDQ1LjA3IHNlY29uZHMKICAgICAqIE15IEZlaWcsIGZsb2F0aW5nIHBvaW50OiAzNi4yNTIgc2Vjb25kcwogICAgICogQUEmTiwgdW5yb2xsZWQgbG9vcHMsIGRvdWJsZVtdW10gLT4gZG91YmxlW11bXTogMjUuMTY3IHNlY29uZHMKICAgICAqCiAgICAgKiBDbGVhcmx5IEZlaWcgaXMgaG9wZWxlc3MuIEkgc3VzcGVjdCB0aGUgcGVyZm9ybWFuY2Uga2lsbGVyIGlzIHNpbXBseQogICAgICogdGhlIHdlaWdodCBvZiB0aGUgYWxnb3JpdGhtOiBtYXNzaXZlIG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMsCiAgICAgKiBsYXJnZSBjb2RlIHNpemUsIGFuZCBsb3RzIG9mIHJhbmRvbSBhcnJheSBhY2Nlc3Nlcy4KICAgICAqCiAgICAgKiBBbHNvLCBBQSZOIGNhbiBiZSBvcHRpbWl6ZWQgYSBsb3Q6CiAgICAgKiBBQSZOLCByb2xsZWQgbG9vcHMsIGRvdWJsZVtdW10gLT4gZG91YmxlW11bXTogMjEuMTYyIHNlY29uZHMKICAgICAqIEFBJk4sIHJvbGxlZCBsb29wcywgZmxvYXRbXVtdIC0+IGZsb2F0W11bXTogbm8gaW1wcm92ZW1lbnQsIGJ1dAogICAgICogICAgIGF0IHNvbWUgc3RhZ2UgSG90c3BvdCBtaWdodCBzdGFydCBkb2luZyBTSU1ELCBzbyBsZXQncyB1c2UgZmxvYXQKICAgICAqIEFBJk4sIHJvbGxlZCBsb29wcywgZmxvYXRbXSAtPiBmbG9hdFtdW106IDE5Ljk3OSBzZWNvbmRzCiAgICAgKiAgICAgYXBwYXJlbnRseSAyRCBhcnJheXMgYXJlIHNsb3chCiAgICAgKiBBQSZOLCByb2xsZWQgbG9vcHMsIGlubGluZWQgMUQgQUEmTiB0cmFuc2Zvcm0sIGZsb2F0W10KICAgICAqICAgICB0cmFuc2Zvcm1lZCBpbi1wbGFjZTogMTguNSBzZWNvbmRzCiAgICAgKiBBQSZOLCBwcmV2aW91cyB2ZXJzaW9uIHJld3JpdHRlbiBpbiBDIGFuZCBjb21waWxlZCB3aXRoICJnY2MgLU8zIgogICAgICogICAgIHRha2VzOiA4LjUgc2Vjb25kcyAocHJvYmFibHkgZHVlIHRvIGhlYXZ5IHVzZSBvZiBTSU1EKQogICAgICoKICAgICAqIE90aGVyIGJyYXZlIGF0dGVtcHRzOgogICAgICogQUEmTiwgYmVzdCBmbG9hdCB2ZXJzaW9uIGNvbnZlcnRlZCB0byAxNjoxNiBmaXhlZCBwb2ludDogMjMuOTIzIHNlY29uZHMKICAgICAqCiAgICAgKiBBbnl3YXkgdGhlIGJlc3QgZmxvYXQgdmVyc2lvbiBzdGF5cy4KICAgICAqIDE4LjUgc2Vjb25kcyA9IDUuNCBtaWxsaW9uIHRyYW5zZm9ybXMgcGVyIHNlY29uZCBwZXIgY29yZSA6LSkKICAgICAqLwoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0W10gZGN0U2NhbGluZ0ZhY3RvcnMgPQogICAgewogICAgICAgIChmbG9hdCkoMC41IC8gTWF0aC5zcXJ0KDIuMCkpLAogICAgICAgIChmbG9hdCkoMC4yNSAvIE1hdGguY29zKE1hdGguUEkvMTYuMCkpLAogICAgICAgIChmbG9hdCkoMC4yNSAvIE1hdGguY29zKDIuMCpNYXRoLlBJLzE2LjApKSwKICAgICAgICAoZmxvYXQpKDAuMjUgLyBNYXRoLmNvcygzLjAqTWF0aC5QSS8xNi4wKSksCiAgICAgICAgKGZsb2F0KSgwLjI1IC8gTWF0aC5jb3MoNC4wKk1hdGguUEkvMTYuMCkpLAogICAgICAgIChmbG9hdCkoMC4yNSAvIE1hdGguY29zKDUuMCpNYXRoLlBJLzE2LjApKSwKICAgICAgICAoZmxvYXQpKDAuMjUgLyBNYXRoLmNvcyg2LjAqTWF0aC5QSS8xNi4wKSksCiAgICAgICAgKGZsb2F0KSgwLjI1IC8gTWF0aC5jb3MoNy4wKk1hdGguUEkvMTYuMCkpLAogICAgfTsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdFtdIGlkY3RTY2FsaW5nRmFjdG9ycyA9CiAgICB7CiAgICAgICAgKGZsb2F0KSgyLjAgKiA0LjAgLyBNYXRoLnNxcnQoMi4wKSAqIDAuMDYyNSksCiAgICAgICAgKGZsb2F0KSg0LjAgKiBNYXRoLmNvcyhNYXRoLlBJLzE2LjApICogMC4xMjUpLAogICAgICAgIChmbG9hdCkoNC4wICogTWF0aC5jb3MoMi4wKk1hdGguUEkvMTYuMCkgKiAwLjEyNSksCiAgICAgICAgKGZsb2F0KSg0LjAgKiBNYXRoLmNvcygzLjAqTWF0aC5QSS8xNi4wKSAqIDAuMTI1KSwKICAgICAgICAoZmxvYXQpKDQuMCAqIE1hdGguY29zKDQuMCpNYXRoLlBJLzE2LjApICogMC4xMjUpLAogICAgICAgIChmbG9hdCkoNC4wICogTWF0aC5jb3MoNS4wKk1hdGguUEkvMTYuMCkgKiAwLjEyNSksCiAgICAgICAgKGZsb2F0KSg0LjAgKiBNYXRoLmNvcyg2LjAqTWF0aC5QSS8xNi4wKSAqIDAuMTI1KSwKICAgICAgICAoZmxvYXQpKDQuMCAqIE1hdGguY29zKDcuMCpNYXRoLlBJLzE2LjApICogMC4xMjUpLAogICAgfTsKCiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBBMSA9IChmbG9hdCkoTWF0aC5jb3MoMi4wKk1hdGguUEkvOC4wKSk7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBBMiA9IChmbG9hdCkoTWF0aC5jb3MoTWF0aC5QSS84LjApIC0gTWF0aC5jb3MoMy4wKk1hdGguUEkvOC4wKSk7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBBMyA9IEExOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgQTQgPSAoZmxvYXQpKE1hdGguY29zKE1hdGguUEkvOC4wKSArIE1hdGguY29zKDMuMCpNYXRoLlBJLzguMCkpOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgQTUgPSAoZmxvYXQpKE1hdGguY29zKDMuMCpNYXRoLlBJLzguMCkpOwoKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEMyID0gKGZsb2F0KSgyLjAgKiBNYXRoLmNvcyhNYXRoLlBJLzgpKTsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEM0ID0gKGZsb2F0KSgyLjAgKiBNYXRoLmNvcygyKk1hdGguUEkvOCkpOwogICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgQzYgPSAoZmxvYXQpKDIuMCAqIE1hdGguY29zKDMqTWF0aC5QSS84KSk7CiAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBRID0gQzIgLSBDNjsKICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IFIgPSBDMiArIEM2OwoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzY2FsZVF1YW50aXphdGlvblZlY3RvcihmbG9hdFtdIHZlY3RvcikKICAgIHsKICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDg7IHgrKykKICAgICAgICB7CiAgICAgICAgICAgIHZlY3Rvclt4XSAqPSBkY3RTY2FsaW5nRmFjdG9yc1t4XTsKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIHNjYWxlRGVxdWFudGl6YXRpb25WZWN0b3IoZmxvYXRbXSB2ZWN0b3IpCiAgICB7CiAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCA4OyB4KyspCiAgICAgICAgewogICAgICAgICAgICB2ZWN0b3JbeF0gKj0gaWRjdFNjYWxpbmdGYWN0b3JzW3hdOwogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2NhbGVRdWFudGl6YXRpb25NYXRyaXgoZmxvYXRbXSBtYXRyaXgpCiAgICB7CiAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCA4OyB5KyspCiAgICAgICAgewogICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IDg7IHgrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbWF0cml4WzggKiB5ICsgeF0gKj0gZGN0U2NhbGluZ0ZhY3RvcnNbeV0gKiBkY3RTY2FsaW5nRmFjdG9yc1t4XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2NhbGVEZXF1YW50aXphdGlvbk1hdHJpeChmbG9hdFtdIG1hdHJpeCkKICAgIHsKICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IDg7IHkrKykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgODsgeCsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBtYXRyaXhbOCAqIHkgKyB4XSAqPSBpZGN0U2NhbGluZ0ZhY3RvcnNbeV0gKiBpZGN0U2NhbGluZ0ZhY3RvcnNbeF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGYXN0IGZvcndhcmQgRGN0IHVzaW5nIEFBJk4uCiAgICAgKiBUYWtlbiBmcm9tIHRoZSBib29rICJKUEVHIHN0aWxsIGltYWdlIGRhdGEgY29tcHJlc3Npb24gc3RhbmRhcmQiLAogICAgICogYnkgUGVubmViYWtlciBhbmQgTWl0Y2hlbGwsIGNoYXB0ZXIgNCwgZmlndXJlICI0LTgiLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgZm9yd2FyZERDVDgoZmxvYXRbXSB2ZWN0b3IpCiAgICB7CiAgICAgICAgZmxvYXQgYTAwID0gdmVjdG9yWzBdICsgdmVjdG9yWzddOwogICAgICAgIGZsb2F0IGExMCA9IHZlY3RvclsxXSArIHZlY3Rvcls2XTsKICAgICAgICBmbG9hdCBhMjAgPSB2ZWN0b3JbMl0gKyB2ZWN0b3JbNV07CiAgICAgICAgZmxvYXQgYTMwID0gdmVjdG9yWzNdICsgdmVjdG9yWzRdOwogICAgICAgIGZsb2F0IGE0MCA9IHZlY3RvclszXSAtIHZlY3Rvcls0XTsKICAgICAgICBmbG9hdCBhNTAgPSB2ZWN0b3JbMl0gLSB2ZWN0b3JbNV07CiAgICAgICAgZmxvYXQgYTYwID0gdmVjdG9yWzFdIC0gdmVjdG9yWzZdOwogICAgICAgIGZsb2F0IGE3MCA9IHZlY3RvclswXSAtIHZlY3Rvcls3XTsKCiAgICAgICAgZmxvYXQgYTAxID0gYTAwICsgYTMwOwogICAgICAgIGZsb2F0IGExMSA9IGExMCArIGEyMDsKICAgICAgICBmbG9hdCBhMjEgPSBhMTAgLSBhMjA7CiAgICAgICAgZmxvYXQgYTMxID0gYTAwIC0gYTMwOwogICAgICAgIC8vIEF2b2lkIHNvbWUgbmVnYXRpb25zOgogICAgICAgIC8vIGZsb2F0IGE0MSA9IC1hNDAgLSBhNTA7CiAgICAgICAgZmxvYXQgbmVnX2E0MSA9IGE0MCArIGE1MDsKICAgICAgICBmbG9hdCBhNTEgPSBhNTAgKyBhNjA7CiAgICAgICAgZmxvYXQgYTYxID0gYTYwICsgYTcwOwoKICAgICAgICBmbG9hdCBhMjIgPSBhMjEgKyBhMzE7CgogICAgICAgIGZsb2F0IGEyMyA9IGEyMipBMTsKICAgICAgICBmbG9hdCBtdWw1ID0gKGE2MSAtIG5lZ19hNDEpKkE1OwogICAgICAgIGZsb2F0IGE0MyA9IG5lZ19hNDEqQTIgLSBtdWw1OwogICAgICAgIGZsb2F0IGE1MyA9IGE1MSpBMzsKICAgICAgICBmbG9hdCBhNjMgPSBhNjEqQTQgLSBtdWw1OwoKICAgICAgICBmbG9hdCBhNTQgPSBhNzAgKyBhNTM7CiAgICAgICAgZmxvYXQgYTc0ID0gYTcwIC0gYTUzOwoKICAgICAgICB2ZWN0b3JbMF0gPSBhMDEgKyBhMTE7CiAgICAgICAgdmVjdG9yWzRdID0gYTAxIC0gYTExOwogICAgICAgIHZlY3RvclsyXSA9IGEzMSArIGEyMzsKICAgICAgICB2ZWN0b3JbNl0gPSBhMzEgLSBhMjM7CiAgICAgICAgdmVjdG9yWzVdID0gYTc0ICsgYTQzOwogICAgICAgIHZlY3RvclsxXSA9IGE1NCArIGE2MzsKICAgICAgICB2ZWN0b3JbN10gPSBhNTQgLSBhNjM7CiAgICAgICAgdmVjdG9yWzNdID0gYTc0IC0gYTQzOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb3J3YXJkRENUOHg4KGZsb2F0W10gbWF0cml4KQogICAgewogICAgICAgIGZsb2F0IGEwMCwgYTEwLCBhMjAsIGEzMCwgYTQwLCBhNTAsIGE2MCwgYTcwOwogICAgICAgIGZsb2F0IGEwMSwgYTExLCBhMjEsIGEzMSwgbmVnX2E0MSwgYTUxLCBhNjE7CiAgICAgICAgZmxvYXQgYTIyLCBhMjMsIG11bDUsIGE0MywgYTUzLCBhNjM7CiAgICAgICAgZmxvYXQgYTU0LCBhNzQ7CgogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgYTAwID0gbWF0cml4WzgqaV0gKyBtYXRyaXhbOCppICsgN107CiAgICAgICAgICAgIGExMCA9IG1hdHJpeFs4KmkgKyAxXSArIG1hdHJpeFs4KmkgKyA2XTsKICAgICAgICAgICAgYTIwID0gbWF0cml4WzgqaSArIDJdICsgbWF0cml4WzgqaSArIDVdOwogICAgICAgICAgICBhMzAgPSBtYXRyaXhbOCppICsgM10gKyBtYXRyaXhbOCppICsgNF07CiAgICAgICAgICAgIGE0MCA9IG1hdHJpeFs4KmkgKyAzXSAtIG1hdHJpeFs4KmkgKyA0XTsKICAgICAgICAgICAgYTUwID0gbWF0cml4WzgqaSArIDJdIC0gbWF0cml4WzgqaSArIDVdOwogICAgICAgICAgICBhNjAgPSBtYXRyaXhbOCppICsgMV0gLSBtYXRyaXhbOCppICsgNl07CiAgICAgICAgICAgIGE3MCA9IG1hdHJpeFs4KmldIC0gbWF0cml4WzgqaSArIDddOwogICAgICAgICAgICBhMDEgPSBhMDAgKyBhMzA7CiAgICAgICAgICAgIGExMSA9IGExMCArIGEyMDsKICAgICAgICAgICAgYTIxID0gYTEwIC0gYTIwOwogICAgICAgICAgICBhMzEgPSBhMDAgLSBhMzA7CiAgICAgICAgICAgIG5lZ19hNDEgPSBhNDAgKyBhNTA7CiAgICAgICAgICAgIGE1MSA9IGE1MCArIGE2MDsKICAgICAgICAgICAgYTYxID0gYTYwICsgYTcwOwogICAgICAgICAgICBhMjIgPSBhMjEgKyBhMzE7CiAgICAgICAgICAgIGEyMyA9IGEyMipBMTsKICAgICAgICAgICAgbXVsNSA9IChhNjEgLSBuZWdfYTQxKSpBNTsKICAgICAgICAgICAgYTQzID0gbmVnX2E0MSpBMiAtIG11bDU7CiAgICAgICAgICAgIGE1MyA9IGE1MSpBMzsKICAgICAgICAgICAgYTYzID0gYTYxKkE0IC0gbXVsNTsKICAgICAgICAgICAgYTU0ID0gYTcwICsgYTUzOwogICAgICAgICAgICBhNzQgPSBhNzAgLSBhNTM7CiAgICAgICAgICAgIG1hdHJpeFs4KmldID0gYTAxICsgYTExOwogICAgICAgICAgICBtYXRyaXhbOCppICsgNF0gPSBhMDEgLSBhMTE7CiAgICAgICAgICAgIG1hdHJpeFs4KmkgKyAyXSA9IGEzMSArIGEyMzsKICAgICAgICAgICAgbWF0cml4WzgqaSArIDZdID0gYTMxIC0gYTIzOwogICAgICAgICAgICBtYXRyaXhbOCppICsgNV0gPSBhNzQgKyBhNDM7CiAgICAgICAgICAgIG1hdHJpeFs4KmkgKyAxXSA9IGE1NCArIGE2MzsKICAgICAgICAgICAgbWF0cml4WzgqaSArIDddID0gYTU0IC0gYTYzOwogICAgICAgICAgICBtYXRyaXhbOCppICsgM10gPSBhNzQgLSBhNDM7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGEwMCA9IG1hdHJpeFtpXSArIG1hdHJpeFs1NiArIGldOwogICAgICAgICAgICBhMTAgPSBtYXRyaXhbOCArIGldICsgbWF0cml4WzQ4ICsgaV07CiAgICAgICAgICAgIGEyMCA9IG1hdHJpeFsxNiArIGldICsgbWF0cml4WzQwICsgaV07CiAgICAgICAgICAgIGEzMCA9IG1hdHJpeFsyNCArIGldICsgbWF0cml4WzMyICsgaV07CiAgICAgICAgICAgIGE0MCA9IG1hdHJpeFsyNCArIGldIC0gbWF0cml4WzMyICsgaV07CiAgICAgICAgICAgIGE1MCA9IG1hdHJpeFsxNiArIGldIC0gbWF0cml4WzQwICsgaV07CiAgICAgICAgICAgIGE2MCA9IG1hdHJpeFs4ICsgaV0gLSBtYXRyaXhbNDggKyBpXTsKICAgICAgICAgICAgYTcwID0gbWF0cml4W2ldIC0gbWF0cml4WzU2ICsgaV07CiAgICAgICAgICAgIGEwMSA9IGEwMCArIGEzMDsKICAgICAgICAgICAgYTExID0gYTEwICsgYTIwOwogICAgICAgICAgICBhMjEgPSBhMTAgLSBhMjA7CiAgICAgICAgICAgIGEzMSA9IGEwMCAtIGEzMDsKICAgICAgICAgICAgbmVnX2E0MSA9IGE0MCArIGE1MDsKICAgICAgICAgICAgYTUxID0gYTUwICsgYTYwOwogICAgICAgICAgICBhNjEgPSBhNjAgKyBhNzA7CiAgICAgICAgICAgIGEyMiA9IGEyMSArIGEzMTsKICAgICAgICAgICAgYTIzID0gYTIyKkExOwogICAgICAgICAgICBtdWw1ID0gKGE2MSAtIG5lZ19hNDEpKkE1OwogICAgICAgICAgICBhNDMgPSBuZWdfYTQxKkEyIC0gbXVsNTsKICAgICAgICAgICAgYTUzID0gYTUxKkEzOwogICAgICAgICAgICBhNjMgPSBhNjEqQTQgLSBtdWw1OwogICAgICAgICAgICBhNTQgPSBhNzAgKyBhNTM7CiAgICAgICAgICAgIGE3NCA9IGE3MCAtIGE1MzsKICAgICAgICAgICAgbWF0cml4W2ldID0gYTAxICsgYTExOwogICAgICAgICAgICBtYXRyaXhbMzIgKyBpXSA9IGEwMSAtIGExMTsKICAgICAgICAgICAgbWF0cml4WzE2ICsgaV0gPSBhMzEgKyBhMjM7CiAgICAgICAgICAgIG1hdHJpeFs0OCArIGldID0gYTMxIC0gYTIzOwogICAgICAgICAgICBtYXRyaXhbNDAgKyBpXSA9IGE3NCArIGE0MzsKICAgICAgICAgICAgbWF0cml4WzggKyBpXSA9IGE1NCArIGE2MzsKICAgICAgICAgICAgbWF0cml4WzU2ICsgaV0gPSBhNTQgLSBhNjM7CiAgICAgICAgICAgIG1hdHJpeFsyNCArIGldID0gYTc0IC0gYTQzOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEZhc3QgaW52ZXJzZSBEY3QgdXNpbmcgQUEmTi4gVGhpcyBpcyB0YWtlbiBmcm9tIHRoZSBiZWF1dGlmdWwKICAgICAqIGh0dHA6Ly92c3IuaW5mb3JtYXRpay50dS1jaGVtbml0ei5kZS9+amFuL01QRUcvSFRNTC9JRENULmh0bWwKICAgICAqIHdoaWNoIGdpdmVzIGVhc3kgZXF1YXRpb25zIGFuZCBwcm9wZXJseSBleHBsYWlucyBjb25zdGFudHMgYW5kCiAgICAgKiBzY2FsaW5nIGZhY3RvcnMuIFRlcm1zIGhhdmUgYmVlbiBpbmxpbmVkIGFuZCB0aGUgbmVnYXRpb24KICAgICAqIG9wdGltaXplZCBvdXQgb2YgZXhpc3RlbmNlLgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW52ZXJzZURDVDgoZmxvYXRbXSB2ZWN0b3IpCiAgICB7CiAgICAgICAgLy8gQjEKICAgICAgICBmbG9hdCBhMiA9IHZlY3RvclsyXSAtIHZlY3Rvcls2XTsKICAgICAgICBmbG9hdCBhMyA9IHZlY3RvclsyXSArIHZlY3Rvcls2XTsKICAgICAgICBmbG9hdCBhNCA9IHZlY3Rvcls1XSAtIHZlY3RvclszXTsKICAgICAgICBmbG9hdCB0bXAxID0gdmVjdG9yWzFdICsgdmVjdG9yWzddOwogICAgICAgIGZsb2F0IHRtcDIgPSB2ZWN0b3JbM10gKyB2ZWN0b3JbNV07CiAgICAgICAgZmxvYXQgYTUgPSB0bXAxIC0gdG1wMjsKICAgICAgICBmbG9hdCBhNiA9IHZlY3RvclsxXSAtIHZlY3Rvcls3XTsKICAgICAgICBmbG9hdCBhNyA9IHRtcDEgKyB0bXAyOwoKICAgICAgICAvLyBNCiAgICAgICAgZmxvYXQgdG1wNCA9IEM2KihhNCArIGE2KTsKICAgICAgICAvLyBFbGltaW5hdGUgdGhlIG5lZ2F0aXZlOgogICAgICAgIC8vIGZsb2F0IGI0ID0gLVEqYTQgLSB0bXA0OwogICAgICAgIGZsb2F0IG5lZ19iNCA9IFEqYTQgKyB0bXA0OwogICAgICAgIGZsb2F0IGI2ID0gUiphNiAtIHRtcDQ7CiAgICAgICAgZmxvYXQgYjIgPSBhMipDNDsKICAgICAgICBmbG9hdCBiNSA9IGE1KkM0OwoKICAgICAgICAvLyBBMQogICAgICAgIGZsb2F0IHRtcDMgPSBiNiAtIGE3OwogICAgICAgIGZsb2F0IG4wID0gdG1wMyAtIGI1OwogICAgICAgIGZsb2F0IG4xID0gdmVjdG9yWzBdIC0gdmVjdG9yWzRdOwogICAgICAgIGZsb2F0IG4yID0gYjIgLSBhMzsKICAgICAgICBmbG9hdCBuMyA9IHZlY3RvclswXSArIHZlY3Rvcls0XTsKICAgICAgICBmbG9hdCBuZWdfbjUgPSBuZWdfYjQ7CgogICAgICAgIC8vIEEyCiAgICAgICAgZmxvYXQgbTMgPSBuMSArIG4yOwogICAgICAgIGZsb2F0IG00ID0gbjMgKyBhMzsKICAgICAgICBmbG9hdCBtNSA9IG4xIC0gbjI7CiAgICAgICAgZmxvYXQgbTYgPSBuMyAtIGEzOwogICAgICAgIC8vIGZsb2F0IG03ID0gbjUgLSBuMDsKICAgICAgICBmbG9hdCBuZWdfbTcgPSBuZWdfbjUgKyBuMDsKCiAgICAgICAgLy8gQTMKICAgICAgICB2ZWN0b3JbMF0gPSBtNCArIGE3OwogICAgICAgIHZlY3RvclsxXSA9IG0zICsgdG1wMzsKICAgICAgICB2ZWN0b3JbMl0gPSBtNSAtIG4wOwogICAgICAgIHZlY3RvclszXSA9IG02ICsgbmVnX203OwogICAgICAgIHZlY3Rvcls0XSA9IG02IC0gbmVnX203OwogICAgICAgIHZlY3Rvcls1XSA9IG01ICsgbjA7CiAgICAgICAgdmVjdG9yWzZdID0gbTMgLSB0bXAzOwogICAgICAgIHZlY3Rvcls3XSA9IG00IC0gYTc7CiAgICB9CgogICAgcHVibGljIHN0YXRpYyB2b2lkIGludmVyc2VEQ1Q4eDgoZmxvYXRbXSBtYXRyaXgpCiAgICB7CiAgICAgICAgZmxvYXQgYTIsIGEzLCBhNCwgdG1wMSwgdG1wMiwgYTUsIGE2LCBhNzsKICAgICAgICBmbG9hdCB0bXA0LCBuZWdfYjQsIGI2LCBiMiwgYjU7CiAgICAgICAgZmxvYXQgdG1wMywgbjAsIG4xLCBuMiwgbjMsIG5lZ19uNTsKICAgICAgICBmbG9hdCBtMywgbTQsIG01LCBtNiwgbmVnX203OwoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGEyID0gbWF0cml4WzgqaSArIDJdIC0gbWF0cml4WzgqaSArIDZdOwogICAgICAgICAgICBhMyA9IG1hdHJpeFs4KmkgKyAyXSArIG1hdHJpeFs4KmkgKyA2XTsKICAgICAgICAgICAgYTQgPSBtYXRyaXhbOCppICsgNV0gLSBtYXRyaXhbOCppICsgM107CiAgICAgICAgICAgIHRtcDEgPSBtYXRyaXhbOCppICsgMV0gKyBtYXRyaXhbOCppICsgN107CiAgICAgICAgICAgIHRtcDIgPSBtYXRyaXhbOCppICsgM10gKyBtYXRyaXhbOCppICsgNV07CiAgICAgICAgICAgIGE1ID0gdG1wMSAtIHRtcDI7CiAgICAgICAgICAgIGE2ID0gbWF0cml4WzgqaSArIDFdIC0gbWF0cml4WzgqaSArIDddOwogICAgICAgICAgICBhNyA9IHRtcDEgKyB0bXAyOwogICAgICAgICAgICB0bXA0ID0gQzYqKGE0ICsgYTYpOwogICAgICAgICAgICBuZWdfYjQgPSBRKmE0ICsgdG1wNDsKICAgICAgICAgICAgYjYgPSBSKmE2IC0gdG1wNDsKICAgICAgICAgICAgYjIgPSBhMipDNDsKICAgICAgICAgICAgYjUgPSBhNSpDNDsKICAgICAgICAgICAgdG1wMyA9IGI2IC0gYTc7CiAgICAgICAgICAgIG4wID0gdG1wMyAtIGI1OwogICAgICAgICAgICBuMSA9IG1hdHJpeFs4KmldIC0gbWF0cml4WzgqaSArIDRdOwogICAgICAgICAgICBuMiA9IGIyIC0gYTM7CiAgICAgICAgICAgIG4zID0gbWF0cml4WzgqaV0gKyBtYXRyaXhbOCppICsgNF07CiAgICAgICAgICAgIG5lZ19uNSA9IG5lZ19iNDsKICAgICAgICAgICAgbTMgPSBuMSArIG4yOwogICAgICAgICAgICBtNCA9IG4zICsgYTM7CiAgICAgICAgICAgIG01ID0gbjEgLSBuMjsKICAgICAgICAgICAgbTYgPSBuMyAtIGEzOwogICAgICAgICAgICBuZWdfbTcgPSBuZWdfbjUgKyBuMDsKICAgICAgICAgICAgbWF0cml4WzgqaV0gPSBtNCArIGE3OwogICAgICAgICAgICBtYXRyaXhbOCppICsgMV0gPSBtMyArIHRtcDM7CiAgICAgICAgICAgIG1hdHJpeFs4KmkgKyAyXSA9IG01IC0gbjA7CiAgICAgICAgICAgIG1hdHJpeFs4KmkgKyAzXSA9IG02ICsgbmVnX203OwogICAgICAgICAgICBtYXRyaXhbOCppICsgNF0gPSBtNiAtIG5lZ19tNzsKICAgICAgICAgICAgbWF0cml4WzgqaSArIDVdID0gbTUgKyBuMDsKICAgICAgICAgICAgbWF0cml4WzgqaSArIDZdID0gbTMgLSB0bXAzOwogICAgICAgICAgICBtYXRyaXhbOCppICsgN10gPSBtNCAtIGE3OwogICAgICAgIH0KCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspCiAgICAgICAgewogICAgICAgICAgICBhMiA9IG1hdHJpeFsxNiArIGldIC0gbWF0cml4WzQ4ICsgaV07CiAgICAgICAgICAgIGEzID0gbWF0cml4WzE2ICsgaV0gKyBtYXRyaXhbNDggKyBpXTsKICAgICAgICAgICAgYTQgPSBtYXRyaXhbNDAgKyBpXSAtIG1hdHJpeFsyNCArIGldOwogICAgICAgICAgICB0bXAxID0gbWF0cml4WzggKyBpXSArIG1hdHJpeFs1NiArIGldOwogICAgICAgICAgICB0bXAyID0gbWF0cml4WzI0ICsgaV0gKyBtYXRyaXhbNDAgKyBpXTsKICAgICAgICAgICAgYTUgPSB0bXAxIC0gdG1wMjsKICAgICAgICAgICAgYTYgPSBtYXRyaXhbOCArIGldIC0gbWF0cml4WzU2ICsgaV07CiAgICAgICAgICAgIGE3ID0gdG1wMSArIHRtcDI7CiAgICAgICAgICAgIHRtcDQgPSBDNiooYTQgKyBhNik7CiAgICAgICAgICAgIG5lZ19iNCA9IFEqYTQgKyB0bXA0OwogICAgICAgICAgICBiNiA9IFIqYTYgLSB0bXA0OwogICAgICAgICAgICBiMiA9IGEyKkM0OwogICAgICAgICAgICBiNSA9IGE1KkM0OwogICAgICAgICAgICB0bXAzID0gYjYgLSBhNzsKICAgICAgICAgICAgbjAgPSB0bXAzIC0gYjU7CiAgICAgICAgICAgIG4xID0gbWF0cml4W2ldIC0gbWF0cml4WzMyICsgaV07CiAgICAgICAgICAgIG4yID0gYjIgLSBhMzsKICAgICAgICAgICAgbjMgPSBtYXRyaXhbaV0gKyBtYXRyaXhbMzIgKyBpXTsKICAgICAgICAgICAgbmVnX241ID0gbmVnX2I0OwogICAgICAgICAgICBtMyA9IG4xICsgbjI7CiAgICAgICAgICAgIG00ID0gbjMgKyBhMzsKICAgICAgICAgICAgbTUgPSBuMSAtIG4yOwogICAgICAgICAgICBtNiA9IG4zIC0gYTM7CiAgICAgICAgICAgIG5lZ19tNyA9IG5lZ19uNSArIG4wOwogICAgICAgICAgICBtYXRyaXhbaV0gPSBtNCArIGE3OwogICAgICAgICAgICBtYXRyaXhbOCArIGldID0gbTMgKyB0bXAzOwogICAgICAgICAgICBtYXRyaXhbMTYgKyBpXSA9IG01IC0gbjA7CiAgICAgICAgICAgIG1hdHJpeFsyNCArIGldID0gbTYgKyBuZWdfbTc7CiAgICAgICAgICAgIG1hdHJpeFszMiArIGldID0gbTYgLSBuZWdfbTc7CiAgICAgICAgICAgIG1hdHJpeFs0MCArIGldID0gbTUgKyBuMDsKICAgICAgICAgICAgbWF0cml4WzQ4ICsgaV0gPSBtMyAtIHRtcDM7CiAgICAgICAgICAgIG1hdHJpeFs1NiArIGldID0gbTQgLSBhNzsKICAgICAgICB9CiAgICB9Cn0K