LyoKICogVmVyeSBiYXNpYyB1bml0IHRlc3QgZm9yIGxvY2FsZSBmdW5jdGlvbnMKICogVGVzdCBydW4gb24gd2luMksgKEZyZW5jaCkKICoKICogQ29weXJpZ2h0IChjKSAyMDAyIFlBU0FSIE1laG1ldAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSAid2luZS90ZXN0LmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2lubmxzLmgiCgojZGVmaW5lIGVxKHJlY2VpdmVkLCBleHBlY3RlZCwgbGFiZWwsIHR5cGUpIFwKICAgICAgICBvaygocmVjZWl2ZWQpID09IChleHBlY3RlZCksICIlczogZ290ICIgdHlwZSAiIGluc3RlYWQgb2YgIiB0eXBlLCAobGFiZWwpLChyZWNlaXZlZCksKGV4cGVjdGVkKSkKCiNkZWZpbmUgQlVGRkVSX1NJWkUJCTUwCi8qIEJ1ZmZlciB1c2VkIGJ5IGNhbGxiYWNrIGZ1bmN0aW9uICovCmNoYXIgR2xvYmFsQnVmZmVyW0JVRkZFUl9TSVpFXTsKCi8qIFRPRE8gOgogKiBVbmljb2RlIHZlcnNpb25zCiAqIEVudW1UaW1lRm9ybWF0c0EKICogRW51bURhdGVGb3JtYXRzQQogKiBMQ01hcFN0cmluZ0EKICogR2V0VXNlckRlZmF1bHRMYW5nSUQKICogLi4uCiAqLwoKdm9pZCBUZXN0R2V0TG9jYWxlSW5mb0EoKQp7CmludCByZXQsIGNtcDsKTENJRCBsY2lkOwpjaGFyIGJ1ZmZlcltCVUZGRVJfU0laRV0sIEV4cGVjdGVkW0JVRkZFUl9TSVpFXTsKCglzdHJjcHkoRXhwZWN0ZWQsICJNb25kYXkiKTsKCWxjaWQgPSBNQUtFTENJRChNQUtFTEFOR0lEKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTKSwgU09SVF9ERUZBVUxUICk7CglvayAobGNpZCA9PSAweDQwOSwgIndyb25nIExDSUQgY2FsY3VsYXRlZCIpOwoKCXN0cmNweShFeHBlY3RlZCwgInh4eHh4Iik7CgltZW1zZXQoIGJ1ZmZlciwgJ3gnLCBzaXplb2YgKGJ1ZmZlcikvc2l6ZW9mKGJ1ZmZlclswXSkgKTsKCXJldCA9IEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TREFZTkFNRTEsIGJ1ZmZlciwgMCk7CgljbXAgPSBzdHJuY21wIChidWZmZXIsIEV4cGVjdGVkLCBzdHJsZW4oRXhwZWN0ZWQpKTsKCW9rIChjbXAgPT0gMCwgIkdldExvY2FsZUluZm9BIGdvdCAlcyBpbnN0ZWFkIG9mICVzIiwgYnVmZmVyLCBFeHBlY3RlZCk7CgllcSAocmV0LCBzdHJsZW4oIk1vbmRheSIpICsgMSwgIkdldExvY2FsZUluZm9BIHdpdGggbGVuPTAiLCAiJWQiKTsKCglzdHJjcHkoRXhwZWN0ZWQsICJNb254eCIpOwoJbWVtc2V0KCBidWZmZXIsICd4Jywgc2l6ZW9mIChidWZmZXIpL3NpemVvZihidWZmZXJbMF0pICk7CglyZXQgPSBHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0RBWU5BTUUxLCBidWZmZXIsIDMpOwoJY21wID0gc3RybmNtcCAoYnVmZmVyLCBFeHBlY3RlZCwgc3RybGVuKEV4cGVjdGVkKSk7CglvayAoY21wID09IDAsICJHZXRMb2NhbGVJbmZvQSBnb3QgJXMgaW5zdGVhZCBvZiAlcyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwoJZXEgKHJldCwgMCwgIkdldExvY2FsZUluZm9BIHdpdGggbGVuID0gMyIsICIlZCIpOwoKCXN0cmNweShFeHBlY3RlZCwgIk1vbmRheSIpOwoJbWVtc2V0KCBidWZmZXIsICd4Jywgc2l6ZW9mIChidWZmZXIpL3NpemVvZihidWZmZXJbMF0pICk7CglyZXQgPSBHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0RBWU5BTUUxLCBidWZmZXIsIDEwKTsKCS8qIFdlIGNoZWNrIGFsc28gcHJlc2VuY2Ugb2YgJ1wwJyAqLwoJY21wID0gc3RybmNtcCAoYnVmZmVyLCBFeHBlY3RlZCwgc3RybGVuKEV4cGVjdGVkKSArIDEpOwoJb2sgKGNtcCA9PSAwLCAiR2V0TG9jYWxlSW5mb0EgZ290ICVzIGluc3RlYWQgb2YgJXMiLCBidWZmZXIsIEV4cGVjdGVkKTsKCWVxIChyZXQsIHN0cmxlbihFeHBlY3RlZCkrMSwgIkdldExvY2FsZUluZm9BIHdpdGggbGVuID0gMTAiLCAiJWQiICk7CgoJLyogV2UgY2hlY2sgdGhlIHdob2xlIGJ1ZmZlciB3aXRoIHN0cm5jbXAgKi8KCW1lbXNldCggRXhwZWN0ZWQsICd4Jywgc2l6ZW9mIChFeHBlY3RlZCkvc2l6ZW9mKEV4cGVjdGVkWzBdKSApOwoJc3RyY3B5KEV4cGVjdGVkLCAiTW9uZGF5Iik7CgltZW1zZXQoIGJ1ZmZlciwgJ3gnLCBzaXplb2YgKGJ1ZmZlcikvc2l6ZW9mKGJ1ZmZlclswXSkgKTsKCXJldCA9IEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TREFZTkFNRTEsIGJ1ZmZlciwgQlVGRkVSX1NJWkUpOwoJY21wID0gc3RybmNtcCAoYnVmZmVyLCBFeHBlY3RlZCwgQlVGRkVSX1NJWkUpOwoJb2sgKGNtcCA9PSAwLCAiR2V0TG9jYWxlSW5mb0EgZ290ICVzIGluc3RlYWQgb2YgJXMiLCBidWZmZXIsIEV4cGVjdGVkKTsKCWVxIChyZXQsIHN0cmxlbihFeHBlY3RlZCkrMSwgIkdldExvY2FsZUluZm9BIHdpdGggbGVuID0gMTAiLCAiJWQiICk7Cgp9CgoKdm9pZCBUZXN0R2V0VGltZUZvcm1hdEEoKQp7CmludCByZXQsIGVycm9yLCBjbXA7ClNZU1RFTVRJTUUgIGN1cnRpbWU7CmNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXSwgZm9ybWF0W0JVRkZFUl9TSVpFXSwgRXhwZWN0ZWRbQlVGRkVSX1NJWkVdOwpMQ0lEIGxjaWQ7CgoJbGNpZCA9IE1BS0VMQ0lEKE1BS0VMQU5HSUQoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMpLCBTT1JUX0RFRkFVTFQgKTsKCXN0cmNweShmb3JtYXQsICJ0dCBISCc6J21tJ0Anc3MiKTsKCiAgICAgICAgdG9kb193aW5lIHsKICAgICAgICAgICAgLyogZmlsbCBjdXJ0aW1lIHdpdGggZHVtbXkgZGF0YSAqLwogICAgICAgICAgICBtZW1zZXQoJmN1cnRpbWUsIDIsIHNpemVvZihTWVNURU1USU1FKSk7CiAgICAgICAgICAgIHJldCA9IEdldFRpbWVGb3JtYXRBKGxjaWQsIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQsICZjdXJ0aW1lLCBmb3JtYXQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogICAgICAgICAgICBlcnJvciA9IEdldExhc3RFcnJvciAoKTsKICAgICAgICAgICAgb2sgKHJldCA9PSAwLCAiR2V0VGltZUZvcm1hdCBzaG91bGQgZmFpbCBvbiBkdW1teSBkYXRhIik7CiAgICAgICAgICAgIGVxIChlcnJvciwgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIsICJHZXRUaW1lRm9ybWF0IEdldExhc3RFcnJvcigpIiwgIiVkIik7CiAgICAgICAgfQoKCXN0cmNweShFeHBlY3RlZCwgIkFNIDA4OjU2QDEzIik7CgljdXJ0aW1lLndIb3VyID0gODsgIGN1cnRpbWUud01pbnV0ZSA9IDU2OwoJY3VydGltZS53U2Vjb25kID0gMTM7IGN1cnRpbWUud01pbGxpc2Vjb25kcyA9IDIyOwoJcmV0ID0gR2V0VGltZUZvcm1hdEEobGNpZCwgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCwgJmN1cnRpbWUsIGZvcm1hdCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CgljbXAgPSBzdHJuY21wIChFeHBlY3RlZCwgYnVmZmVyLCBzdHJsZW4oRXhwZWN0ZWQpKzEpOwoJb2sgKGNtcCA9PSAwLCAiR2V0VGltZUZvcm1hdCBnb3QgJXMgaW5zdGVhZCBvZiAlcyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwoJZXEgKHJldCwgc3RybGVuKEV4cGVjdGVkKSsxLCAiR2V0VGltZUZvcm1hdCIsICIlZCIpOwoKCS8qIHRlc3Qgd2l0aCB0b28gc21hbGwgYnVmZmVycyAqLwoJbWVtc2V0KGJ1ZmZlciwgJ3gnLCBzaXplb2YgKGJ1ZmZlcikvc2l6ZW9mKGJ1ZmZlclswXSkgKTsKCXN0cmNweShFeHBlY3RlZCwgInh4eHgiKTsKCXJldCA9IEdldFRpbWVGb3JtYXRBKGxjaWQsIFRJTUVfRk9SQ0UyNEhPVVJGT1JNQVQsICZjdXJ0aW1lLCBmb3JtYXQsIGJ1ZmZlciwgMCk7CgljbXAgPSBzdHJuY21wIChFeHBlY3RlZCwgYnVmZmVyLCA0KTsKCW9rIChjbXAgPT0gMCwgIkdldFRpbWVGb3JtYXQgd2l0aCBsZW49MCBnb3QgJXMgaW5zdGVhZCBvZiAlcyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwoJdG9kb193aW5lIHsgZXEgKHJldCwgMTIsICJHZXRUaW1lRm9ybWF0IHdpdGggbGVuPTAiLCAiJWQiKTsgfQoKCW1lbXNldChidWZmZXIsICd4Jywgc2l6ZW9mIChidWZmZXIpL3NpemVvZihidWZmZXJbMF0pICk7CglzdHJjcHkoRXhwZWN0ZWQsICJBTXh4Iik7CglyZXQgPSBHZXRUaW1lRm9ybWF0QShsY2lkLCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFULCAmY3VydGltZSwgZm9ybWF0LCBidWZmZXIsIDIpOwoJY21wID0gc3RybmNtcCAoRXhwZWN0ZWQsIGJ1ZmZlciwgNCk7Cgl0b2RvX3dpbmUgeyBvayAoY21wID09IDAsICJHZXRUaW1lRm9ybWF0IHdpdGggbGVuPTIgZ290ICVzIGluc3RlYWQgb2YgJXMiLCBidWZmZXIsIEV4cGVjdGVkKTsgfQoJZXEgKHJldCwgMCwgIkdldFRpbWVGb3JtYXQgd2l0aCBsZW49MiIsICIlZCIpOwp9Cgp2b2lkIFRlc3RHZXREYXRlRm9ybWF0QSgpCnsKaW50IHJldCwgZXJyb3IsIGNtcDsKU1lTVEVNVElNRSAgY3VydGltZTsKY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdLCBmb3JtYXRbQlVGRkVSX1NJWkVdLCBFeHBlY3RlZFtCVUZGRVJfU0laRV07CkxDSUQgbGNpZDsKCglsY2lkID0gTUFLRUxDSUQoTUFLRUxBTkdJRChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUyksIFNPUlRfREVGQVVMVCApOwoJc3RyY3B5KGZvcm1hdCwgImRkZCcsJyBNTU0gZGQgeXkiKTsKCiAgICAgICAgdG9kb193aW5lIHsKICAgICAgICAgICAgLyogZmlsbCBjdXJ0aW1lIHdpdGggZHVtbXkgZGF0YSAqLwogICAgICAgICAgICBtZW1zZXQoJmN1cnRpbWUsIDIsIHNpemVvZihTWVNURU1USU1FKSk7CiAgICAgICAgICAgIG1lbXNldChidWZmZXIsICd4Jywgc2l6ZW9mIChidWZmZXIpL3NpemVvZihidWZmZXJbMF0pICk7CiAgICAgICAgICAgIHJldCA9IEdldERhdGVGb3JtYXRBKGxjaWQsIDAsICZjdXJ0aW1lLCBmb3JtYXQsIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogICAgICAgICAgICBlcnJvciA9IEdldExhc3RFcnJvciAoKTsKICAgICAgICAgICAgb2sgKHJldD09IDAsICJHZXREYXRlRm9ybWF0IHNob3VsZCBmYWlsIG9uIGR1bW15IGRhdGEiKTsKICAgICAgICAgICAgZXEgKGVycm9yLCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiwgIkdldERhdGVGb3JtYXQiLCAiJWQiKTsKICAgICAgICB9CgoJc3RyY3B5KEV4cGVjdGVkLCAiU2F0LCBNYXkgMDQgMDIiKTsKCW1lbXNldChidWZmZXIsICd4Jywgc2l6ZW9mIChidWZmZXIpL3NpemVvZihidWZmZXJbMF0pICk7CgljdXJ0aW1lLndZZWFyID0gMjAwMjsKCWN1cnRpbWUud01vbnRoID0gNTsKCWN1cnRpbWUud0RheSA9IDQ7CgljdXJ0aW1lLndEYXlPZldlZWsgPSAzOwoJcmV0ID0gR2V0RGF0ZUZvcm1hdEEobGNpZCwgMCwgJmN1cnRpbWUsIGZvcm1hdCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CgljbXAgPSBzdHJuY21wIChFeHBlY3RlZCwgYnVmZmVyLCBzdHJsZW4oRXhwZWN0ZWQpKzEpOwoJdG9kb193aW5lIHsgb2sgKGNtcCA9PSAwLCAiR2V0RGF0ZUZvcm1hdCBnb3QgJXMgaW5zdGVhZCBvZiAlcyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOyB9CgllcSAocmV0LCBzdHJsZW4oRXhwZWN0ZWQpKzEsICJHZXREYXRlRm9ybWF0IiwgIiVkIik7CgoJLyogdGVzdCBmb3JtYXQgd2l0aCAiJyIgKi8KCW1lbXNldChidWZmZXIsICd4Jywgc2l6ZW9mIChidWZmZXIpL3NpemVvZihidWZmZXJbMF0pICk7CglzdHJjcHkoZm9ybWF0LCAiZGRkJywnIE1NTSBkZCAnJycneXkiKTsKCXN0cmNweShFeHBlY3RlZCwgIlNhdCwgTWF5IDA0ICcwMiIpOwoJcmV0ID0gR2V0RGF0ZUZvcm1hdEEobGNpZCwgMCwgJmN1cnRpbWUsIGZvcm1hdCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CgljbXAgPSBzdHJuY21wIChFeHBlY3RlZCwgYnVmZmVyLCBzdHJsZW4oRXhwZWN0ZWQpKzEpOwoJdG9kb193aW5lIHsgb2sgKGNtcCA9PSAwLCAiR2V0RGF0ZUZvcm1hdCBnb3QgJXMgaW5zdGVhZCBvZiAlcyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOyB9CgllcSAocmV0LCAoc3RybGVuKEV4cGVjdGVkKSsxKSwgIkdldERhdGVGb3JtYXQiLCAiJWQiKTsKCgkvKiB0ZXN0IHdpdGggdG9vIHNtYWxsIGJ1ZmZlcnMgKi8KCW1lbXNldChidWZmZXIsICd4Jywgc2l6ZW9mIChidWZmZXIpL3NpemVvZihidWZmZXJbMF0pICk7CglzdHJjcHkoRXhwZWN0ZWQsICJ4eHh4Iik7CglyZXQgPSBHZXREYXRlRm9ybWF0QShsY2lkLCAwLCAmY3VydGltZSwgZm9ybWF0LCBidWZmZXIsIDApOwoJY21wID0gc3RybmNtcCAoRXhwZWN0ZWQsIGJ1ZmZlciwgNCk7CglvayAoY21wID09IDAsICJHZXREYXRlRm9ybWF0IGdvdCAlcyBpbnN0ZWFkIG9mICVzIiwgYnVmZmVyLCBFeHBlY3RlZCk7Cgl0b2RvX3dpbmUgeyBlcSAocmV0LCAxNiwgIkdldERhdGVGb3JtYXQgd2l0aCBsZW49MCIsICIlZCIpOyB9CgoJbWVtc2V0KGJ1ZmZlciwgJ3gnLCBzaXplb2YgKGJ1ZmZlcikvc2l6ZW9mKGJ1ZmZlclswXSkgKTsKCXN0cmNweShFeHBlY3RlZCwgIlNheHgiKTsKCXJldCA9IEdldERhdGVGb3JtYXRBKGxjaWQsIDAsICZjdXJ0aW1lLCBmb3JtYXQsIGJ1ZmZlciwgMik7CgljbXAgPSBzdHJuY21wIChFeHBlY3RlZCwgYnVmZmVyLCA0KTsKCXRvZG9fd2luZSB7IG9rIChjbXAgPT0gMCwgIkdldERhdGVGb3JtYXQgZ290ICVzIGluc3RlYWQgb2YgJXMiLCBidWZmZXIsIEV4cGVjdGVkKTsgfQoJZXEgKHJldCwgMCwgIkdldERhdGVGb3JtYXQgd2l0aCBsZW49MiIsICIlZCIpOwp9CgoKdm9pZCBUZXN0R2V0Q3VycmVuY3lGb3JtYXQoKQp7CmludCByZXQsIGVycm9yLCBjbXA7CmNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXSwgRXhwZWN0ZWRbQlVGRkVSX1NJWkVdLCBmb3JtYXRbQlVGRkVSX1NJWkVdOwpMQ0lEIGxjaWQ7CgoJbGNpZCA9IE1BS0VMQ0lEKE1BS0VMQU5HSUQoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMpLCBTT1JUX0RFRkFVTFQgKTsKI2lmIDAKCWxjaWQgPSBNQUtFTENJRChNQUtFTEFOR0lEKExBTkdfRlJFTkNILCBTVUJMQU5HX0RFRkFVTFQpLCBTT1JUX0RFRkFVTFQgKTsKI2VuZGlmCgoJbWVtc2V0KCBidWZmZXIsICd4Jywgc2l6ZW9mIChidWZmZXIpL3NpemVvZihidWZmZXJbMF0pICk7CglyZXQgPSBHZXRDdXJyZW5jeUZvcm1hdEEobGNpZCwgMCwgIjIzLDY1IiwgTlVMTCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CgllcnJvciA9IEdldExhc3RFcnJvciAoKTsKCWNtcCA9IHN0cm5jbXAgKCJ4eHh4IiwgYnVmZmVyLCA0KTsKCglvayAoY21wID09IDAsICJHZXRDdXJyZW5jeUZvcm1hdCBzaG91bGQgZmFpbCB3aXRoICcsJyIpOwoJZXEgKHJldCwgMCwgIkdldEN1cnJlbmN5Rm9ybWF0IHdpdGggJywnIiwgIiVkIik7CgllcSAoZXJyb3IsIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSLCAiR2V0Q3VycmVuY3lGb3JtYXQiLCAiJWQiKTsKCgltZW1zZXQoRXhwZWN0ZWQsICd4Jywgc2l6ZW9mIChFeHBlY3RlZCkvc2l6ZW9mKEV4cGVjdGVkWzBdKSApOwoJc3RyY3B5IChFeHBlY3RlZCwgIiQyMy41MyIpOwoJc3RyY3B5IChmb3JtYXQsICIyMy41MyIpOwoJbWVtc2V0KCBidWZmZXIsICd4Jywgc2l6ZW9mIChidWZmZXIpL3NpemVvZihidWZmZXJbMF0pICk7CglyZXQgPSBHZXRDdXJyZW5jeUZvcm1hdEEobGNpZCwgMCwgZm9ybWF0LCBOVUxMLCBidWZmZXIsIDApOwoJY21wID0gc3RybmNtcCAoInh4eCIsIGJ1ZmZlciwgMyk7CglvayAoY21wID09IDAsICJHZXRDdXJyZW5jeUZvcm1hdCB3aXRoIDAgYnVmZmVyIHNpemUiKTsKCWVxIChyZXQsIHN0cmxlbihFeHBlY3RlZCkrMSwgIkdldEN1cnJlbmN5Rm9ybWF0IHdpdGggbGVuPTAiLCAiJWQiKTsKCgltZW1zZXQoIGJ1ZmZlciwgJ3gnLCBzaXplb2YgKGJ1ZmZlcikvc2l6ZW9mKGJ1ZmZlclswXSkgKTsKCXJldCA9IEdldEN1cnJlbmN5Rm9ybWF0QShsY2lkLCAwLCBmb3JtYXQsIE5VTEwsIGJ1ZmZlciwgMik7CgljbXAgPSBzdHJuY21wICgiJDJ4eCIsIGJ1ZmZlciwgNCk7CglvayAoY21wID09IDAsICJHZXRDdXJyZW5jeUZvcm1hdCBnb3QgJXMgaW5zdGVhZCBvZiAlcyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwoJZXEgKHJldCwgMCwgIkdldEN1cnJlbmN5Rm9ybWF0IHdpdGggbGVuPTIiLCAiJWQiKTsKCgkvKiBXZSBjaGVjayB0aGUgd2hvbGUgYnVmZmVyIHdpdGggc3RybmNtcCAqLwoJbWVtc2V0KCBidWZmZXIsICd4Jywgc2l6ZW9mIChidWZmZXIpL3NpemVvZihidWZmZXJbMF0pICk7CglyZXQgPSBHZXRDdXJyZW5jeUZvcm1hdEEobGNpZCwgMCwgZm9ybWF0LCBOVUxMLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKCWNtcCA9IHN0cm5jbXAgKEV4cGVjdGVkLCBidWZmZXIsIEJVRkZFUl9TSVpFKTsKCW9rIChjbXAgPT0gMCwgIkdldEN1cnJlbmN5Rm9ybWF0IGdvdCAlcyBpbnN0ZWFkIG9mICVzIiwgYnVmZmVyLCBFeHBlY3RlZCk7CgllcSAocmV0LCBzdHJsZW4oRXhwZWN0ZWQpKzEsICJHZXRDdXJyZW5jeUZvcm1hdCIsIiVkIik7Cgp9CgoKdm9pZCBUZXN0R2V0TnVtYmVyRm9ybWF0KCkKewppbnQgcmV0LCBlcnJvciwgY21wOwpjaGFyIGJ1ZmZlcltCVUZGRVJfU0laRV0sIEV4cGVjdGVkW0JVRkZFUl9TSVpFXSwgaW5wdXRbQlVGRkVSX1NJWkVdOwpMQ0lEIGxjaWQ7CgoJbGNpZCA9IE1BS0VMQ0lEKE1BS0VMQU5HSUQoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMpLCBTT1JUX0RFRkFVTFQgKTsKCgltZW1zZXQoIGJ1ZmZlciwgJ3gnLCBzaXplb2YgKGJ1ZmZlcikvc2l6ZW9mKGJ1ZmZlclswXSkgKTsKCXJldCA9IEdldE51bWJlckZvcm1hdEEobGNpZCwgMCwgIjIzLDY1IiwgTlVMTCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CgllcnJvciA9IEdldExhc3RFcnJvciAoKTsKCWNtcCA9IHN0cm5jbXAgKCJ4eHgiLCBidWZmZXIsIDMpOwoJb2sgKGNtcCA9PSAwLCAiR2V0Q3VycmVuY3lGb3JtYXQiKTsKCW9rIChyZXQgPT0gMCwgIkdldE51bWJlckZvcm1hdCBzaG91bGQgcmV0dXJuIDAiKTsKCWVxIChlcnJvciwgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIsICJHZXROdW1iZXJGb3JtYXQiLCAiJWQiKTsKCglzdHJjcHkoaW5wdXQsICIyMzUzIik7CglzdHJjcHkoRXhwZWN0ZWQsICIyLDM1My4wMCIpOwoJbWVtc2V0KCBidWZmZXIsICd4Jywgc2l6ZW9mIChidWZmZXIpL3NpemVvZihidWZmZXJbMF0pICk7CglyZXQgPSBHZXROdW1iZXJGb3JtYXRBKGxjaWQsIDAsIGlucHV0LCBOVUxMLCBidWZmZXIsIDApOwoJY21wID0gc3RybmNtcCAoInh4eCIsIGJ1ZmZlciwgMyk7CglvayAoY21wID09IDAsICJHZXROdW1iZXJGb3JtYXQgd2l0aCBsZW49MCBnb3QgJXMgaW5zdGVhZCBvZiAlcyIsIGJ1ZmZlciwgInh4eCIpOwoJZXEgKHJldCwgc3RybGVuKEV4cGVjdGVkKSsxLCAiR2V0TnVtYmVyRm9ybWF0IiwgIiVkIik7CgoJc3RyY3B5KEV4cGVjdGVkLCAiMix4eCIpOwoJbWVtc2V0KCBidWZmZXIsICd4Jywgc2l6ZW9mIChidWZmZXIpL3NpemVvZihidWZmZXJbMF0pICk7CglyZXQgPSBHZXROdW1iZXJGb3JtYXRBKGxjaWQsIDAsIGlucHV0LCBOVUxMLCBidWZmZXIsIDIpOwoJY21wID0gc3RybmNtcCAoRXhwZWN0ZWQsIGJ1ZmZlciwgNCk7CglvayAoY21wID09IDAsICJHZXROdW1iZXJGb3JtYXQgd2l0aCBsZW49MiBnb3QgJXMgaW5zdGVhZCBvZiAlcyIsIGJ1ZmZlciwgRXhwZWN0ZWQpOwoJZXEgKHJldCwgMCwgIkdldE51bWJlckZvcm1hdCIsICIlZCIpOwoKCS8qIFdlIGNoZWNrIHRoZSB3aG9sZSBidWZmZXIgd2l0aCBzdHJuY21wICovCgltZW1zZXQoRXhwZWN0ZWQsICd4Jywgc2l6ZW9mIChFeHBlY3RlZCkvc2l6ZW9mKEV4cGVjdGVkWzBdKSApOwoJc3RyY3B5KEV4cGVjdGVkLCAiMiwzNTMuMDAiKTsKCW1lbXNldCggYnVmZmVyLCAneCcsIHNpemVvZiAoYnVmZmVyKS9zaXplb2YoYnVmZmVyWzBdKSApOwoJcmV0ID0gR2V0TnVtYmVyRm9ybWF0QShsY2lkLCAwLCBpbnB1dCwgTlVMTCwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CgljbXAgPSBzdHJuY21wIChFeHBlY3RlZCwgYnVmZmVyLCBCVUZGRVJfU0laRSk7CglvayAoY21wID09IDAsICJHZXROdW1iZXJGb3JtYXQgZ290ICVzIGluc3RlYWQgb2YgJXMiLCBidWZmZXIsIEV4cGVjdGVkKTsKCWVxIChyZXQsIHN0cmxlbihFeHBlY3RlZCkrMSwgIkdldE51bWJlckZvcm1hdCIsICIlZCIpOwp9CgoKLyogQ2FsbGJhY2sgZnVuY3Rpb24gdXNlZCBieSBUZXN0RW51bVRpbWVGb3JtYXRzICovCkJPT0wgQ0FMTEJBQ0sgRW51bVRpbWVGb3JtYXRzUHJvYyhjaGFyICogbHBUaW1lRm9ybWF0U3RyaW5nKQp7Cgl0cmFjZSgiJXNcbiIsIGxwVGltZUZvcm1hdFN0cmluZyk7CglzdHJjcHkoR2xvYmFsQnVmZmVyLCBscFRpbWVGb3JtYXRTdHJpbmcpOwojaWYgMAoJcmV0dXJuIFRSVUU7CiNlbmRpZgoJcmV0dXJuIEZBTFNFOwp9Cgp2b2lkIFRlc3RFbnVtVGltZUZvcm1hdHMoKQp7CmludCByZXQ7CkxDSUQgbGNpZDsKY2hhciBFeHBlY3RlZFtCVUZGRVJfU0laRV07CgoJbGNpZCA9IE1BS0VMQ0lEKE1BS0VMQU5HSUQoTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMpLCBTT1JUX0RFRkFVTFQgKTsKCW1lbXNldCggR2xvYmFsQnVmZmVyLCAneCcsIHNpemVvZiAoR2xvYmFsQnVmZmVyKS9zaXplb2YoR2xvYmFsQnVmZmVyWzBdKSApOwoJc3RyY3B5KEV4cGVjdGVkLCAiaDptbTpzcyB0dCIpOwoJcmV0ID0gRW51bVRpbWVGb3JtYXRzQShFbnVtVGltZUZvcm1hdHNQcm9jLCBsY2lkLCAwKTsKCgllcSAocmV0LCAxLCAiRW51bVRpbWVGb3JtYXRzIHNob3VsZCByZXR1cm4gMSIsICIlZCIpOwoJb2sgKHN0cm5jbXAgKEdsb2JhbEJ1ZmZlciwgRXhwZWN0ZWQsIHN0cmxlbihFeHBlY3RlZCkpID09IDAsCgkJCQkiRW51bVRpbWVGb3JtYXRzIGZhaWxlZCIpOwoJb2sgKHJldCA9PSAxLCAiRW51bVRpbWVGb3JtYXRzIHNob3VsZCByZXR1cm4gMSIpOwp9CgoKdm9pZCBUZXN0Q29tcGFyZVN0cmluZ0EoKQp7CmludCByZXQ7CkxDSUQgbGNpZDsKY2hhciBidWZmZXIxW0JVRkZFUl9TSVpFXSwgYnVmZmVyMltCVUZGRVJfU0laRV07CgoJbGNpZCA9IE1BS0VMQ0lEKE1BS0VMQU5HSUQoTEFOR19GUkVOQ0gsIFNVQkxBTkdfREVGQVVMVCksIFNPUlRfREVGQVVMVCApOwoKCXN0cmNweShidWZmZXIxLCAiU2FsdXQiKTsgc3RyY3B5KGJ1ZmZlcjIsICJTYWx1dGUiKTsKCXJldCA9IENvbXBhcmVTdHJpbmdBKGxjaWQsIE5PUk1fSUdOT1JFQ0FTRSwgYnVmZmVyMSwgLTEsIGJ1ZmZlcjIsIC0xKTsKCW9rIChyZXQ9PSAxLCAiQ29tcGFyZVN0cmluZ0EgKHN0MT0lcyBzdHIyPSVzKSBleHBlY3RlZCByZXN1bHQ9MSIsIGJ1ZmZlcjEsIGJ1ZmZlcjIpOwoKCXN0cmNweShidWZmZXIxLCAiU2FsdXQiKTsgc3RyY3B5KGJ1ZmZlcjIsICJzYUx1VCIpOwoJcmV0ID0gQ29tcGFyZVN0cmluZ0EobGNpZCwgTk9STV9JR05PUkVDQVNFLCBidWZmZXIxLCAtMSwgYnVmZmVyMiwgLTEpOwoJb2sgKHJldD09IDIsICJDb21wYXJlU3RyaW5nQSAoc3QxPSVzIHN0cjI9JXMpIGV4cGVjdGVkIHJlc3VsdD0yIiwgYnVmZmVyMSwgYnVmZmVyMik7CgoJc3RyY3B5KGJ1ZmZlcjEsICJTYWx1dCIpOyBzdHJjcHkoYnVmZmVyMiwgImhvbGEiKTsKCXJldCA9IENvbXBhcmVTdHJpbmdBKGxjaWQsIE5PUk1fSUdOT1JFQ0FTRSwgYnVmZmVyMSwgLTEsIGJ1ZmZlcjIsIC0xKTsKCW9rIChyZXQ9PSAzLCAiQ29tcGFyZVN0cmluZ0EgKHN0MT0lcyBzdHIyPSVzKSBleHBlY3RlZCByZXN1bHQ9MyIsIGJ1ZmZlcjEsIGJ1ZmZlcjIpOwoKCXN0cmNweShidWZmZXIxLCAiaOlo6SIpOyBzdHJjcHkoYnVmZmVyMiwgImjoaOgiKTsKCXJldCA9IENvbXBhcmVTdHJpbmdBKGxjaWQsIE5PUk1fSUdOT1JFQ0FTRSwgYnVmZmVyMSwgLTEsIGJ1ZmZlcjIsIC0xKTsKCW9rIChyZXQ9PSAxLCAiQ29tcGFyZVN0cmluZ0EgKHN0MT0lcyBzdHIyPSVzKSBleHBlY3RlZCByZXN1bHQ9MSIsIGJ1ZmZlcjEsIGJ1ZmZlcjIpOwoKCWxjaWQgPSBNQUtFTENJRChNQUtFTEFOR0lEKExBTkdfRU5HTElTSCwgU1VCTEFOR19FTkdMSVNIX1VTKSwgU09SVF9ERUZBVUxUICk7CgoJc3RyY3B5KGJ1ZmZlcjEsICJo6WjpIik7IHN0cmNweShidWZmZXIyLCAiaOho6CIpOwoJcmV0ID0gQ29tcGFyZVN0cmluZ0EobGNpZCwgTk9STV9JR05PUkVDQVNFLCBidWZmZXIxLCAtMSwgYnVmZmVyMiwgLTEpOwoJb2sgKHJldD09IDEsICJDb21wYXJlU3RyaW5nQSAoc3QxPSVzIHN0cjI9JXMpIGV4cGVjdGVkIHJlc3VsdD0xIiwgYnVmZmVyMSwgYnVmZmVyMik7CgoJcmV0ID0gQ29tcGFyZVN0cmluZ0EobGNpZCwgTk9STV9JR05PUkVDQVNFLCBidWZmZXIxLCAtMSwgYnVmZmVyMiwgMCk7CglvayAocmV0PT0gMywgIkNvbXBhcmVTdHJpbmdBIChzdDE9JXMgc3RyMj0lcykgZXhwZWN0ZWQgcmVzdWx0PTMiLCBidWZmZXIxLCBidWZmZXIyKTsKfQoKClNUQVJUX1RFU1QobG9jYWxlKQp7CiNpZiAwCglUZXN0RW51bVRpbWVGb3JtYXRzKCk7CiNlbmRpZgoJVGVzdEdldExvY2FsZUluZm9BKCk7CglUZXN0R2V0VGltZUZvcm1hdEEoKTsKCVRlc3RHZXREYXRlRm9ybWF0QSgpOwoJVGVzdEdldE51bWJlckZvcm1hdCgpOwoJVGVzdEdldEN1cnJlbmN5Rm9ybWF0KCk7CglUZXN0Q29tcGFyZVN0cmluZ0EoKTsKfQo=