LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxwcmVjb21wLmg+CiNpbmNsdWRlIDxjZnJzdGQuaHh4PgoKCi8vIE5PVCBGVUxMWSBERUZJTkVEIFNFUlZJQ0VTCiNpbmNsdWRlIDx0aW1lLmg+CgoKLyogICAgICAgICAgICAgICAgICAgICAgQ1NTIFN0eWxlcwogICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tCgpDb2xvcnM6Ci0gICBsaWdodCBiYWNrZ3JvdW5kIGNvbG9yICAgICAgICAgICAgICAjZWVlZWZmCi0gICBkYXJrIGJhY2tncm91bmQgY29sb3IgICAgICAgICAgICAgICAjY2NjY2ZmCi0gICBzZWxmIGluIG5hdmliYXIgYmFja2dyb3VuZCBjb2xvciAgICAjMjIyMmFkCgoKRm9udHM6Ci0gICBwYWdlIHRpdGxlICAgICAgICAgICAgICAyMCwgYm9sZCwgQXJpYWwKLSAgIG5hdmliYXIgbWFpbgkJCTEyLCBib2xkLCBBcmlhbAotICAgbmF2aWJhciBzdWIgICAgICAgICAgICAgIDgsIEFyaWFsLCBrYXBpdORsY2hlbgotICAgYXR0cnRhYmxlIHRpdGxlIGxpbmUgICAgIDgsIGJvbGQsIEFyaWFsLCBrYXBpdORsY2hlbgotICAgYXR0cnRhYmxlIHZhbHVlIGxpbmUgICAgIDgsIEFyaWFsIGthcGl05GxjaGVuCgotICAgbmFtZXNwYWNlIGNoYWluICAgICAgICAgMTMsIGJvbGQKLSAgIHRhYmxlIHRpdGxlICAgICAgICAgICAgIDEzLCBib2xkCi0gICB0ZW1wbGF0ZSBsaW5lICAgICAgICAgICAxMwoKLSAgIG1lbWJlciBwYXJhZ3JhcGggdGl0bGUgIDEyLCBib2xkCgotICAgZG9jdSBwYXJhZ3JhcGggdGl0bGUgICAgMTEsIGJvbGQKLSAgIHN0YW5kYXJkIHRleHQgICAgICAgICAgIDExCgotICAgaGllcmFyY2h5ICAgICAgICAgICAgICAgMTEsIG1vbm9zcGFjZQoKCmNsYXNzZXM6CgogICAgdGQudGl0bGUgICAgICAgICAgICAgICAgcGFnZSB0aXRsZQogICAgaDMgICAgICAgICAgICAgICAgICAgICAgdGFibGUgdGl0bGUKICAgIGg0ICAgICAgICAgICAgICAgICAgICAgIG1lbWJlciBwYXJhZ3JhcGggdGl0bGUKCiAgICB0ZC5ubWFpbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uIG1haW4gYmFyCiAgICB0ZC5uc3ViICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uIHN1YiBiYXIKICAgIGEubm1haW4gICAgICAgICAgICAgICAgIGxpbmtzIGluIG5hdmlnYXRpb24gbWFpbiBiYXIKICAgIGEubnN1YiAgICAgICAgICAgICAgICAgIGxpbmtzIGluIG5hdmlnYXRpb24gc3ViIGJhcgoKICAgIHRkLmF0dHIxICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSB0YWJsZSBoZWFkIGxpbmUKICAgIHRkLmF0dHIyICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSB0YWJsZSB2YWx1ZSBsaW5lCgogICAgcC5uYW1lY2hhaW4gICAgICAgICAgICAgbmFtZXNwYWNlIGNoYWluIGluIGhlYWQgb2YgcGFnZXMKICAgIHAudHBsICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlIGxpbmUgaW4gaGVhZCBvZiBwYWdlcwoKICAgIHByZS5kb2MgICAgICAgICAgICAgICAgIHByZWZvcm1hdHRlZCBkb2N1CiAgICBwcmUuaGllcmFyY2h5ICAgICAgICAgICBjbGFzcyBiYXNlcyBoaWVyYXJjaHkgZ3JhcGhpYwoKICAgIGRsLnN5bnRheCAgICAgICAgICAgICAgIGZ1bmN0aW9uLSBvciB2YXJpYWJsZS1kZWNsYXJhdGlvbiBmaWVsZAogICAgYS5zeW50YXggICAgICAgICAgICAgICAgbGluayBpbiBmdW5jdGlvbi0gb3IgdmFyaWFibGUtZGVjbGFyYXRpb24gZmllbGQKCiAgICBwLmR0ICAgICAgICAgICAgICAgICAgICBkb2N1IHBhcmFncmFwaCB0aXRsZQogICAgZGwuZHQgICAgICAgICAgICAgICAgICAgZG9jdSBwYXJhZ3JhcGggdGl0bGUKCiAgICBwICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCB0ZXh0CiAgICBkbCAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCB0ZXh0CiAgICBkZCAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCB0ZXh0CiovCgoKI2RlZmluZSBDUkxGICJcbiIKCm5hbWVzcGFjZQp7Cgpib29sICAgICAgICAgICAgYlVzZV9PT29GcmFtZURpdiA9IHRydWU7CgoKLy8qKioqKioqKioqKioqKiogICBUaGVzZSBhcmUgdXNlZCBmb3IgSURMIGN1cnJlbnRseSBvbmx5ISAgICoqKioqKioqKioqKioqKioqKioqCgpjb25zdCBjaGFyICogY29uc3QgQ19zU3RkU3R5bGUgPQogICAgIi8qU2VlIGJvdHRvbSBvZiBmaWxlIGZvciBleHBsYW5hdGlvbnMuKi8iQ1JMRgogICAgQ1JMRgogICAgImJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmY7IH0iQ1JMRgogICAgQ1JMRgoJImgzICAgICAgICAgICAgIHsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IkNSTEYKCSIgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6M3B0OyBtYXJnaW4tYm90dG9tOjFwdDsgfSJDUkxGCiAgICAicCwgZHQsIGRkLCBwcmUgeyBmb250LXNpemU6MTFwdDsiQ1JMRgogICAgIiAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDozcHQ7IG1hcmdpbi1ib3R0b206MXB0OyB9IkNSTEYKCSJwcmUgICAgICAgICAgICB7IGZvbnQtZmFtaWx5Om1vbm9zcGFjZTsgfSJDUkxGCiAgICBDUkxGCiAgICAidGFibGUubmF2aW1haW4geyBiYWNrZ3JvdW5kLWNvbG9yOiNlZWVlZmY7IH0iQ1JMRgogICAgInRhYmxlLnN1YnRpdGxlIHsgbWFyZ2luLXRvcDo2cHQ7IG1hcmdpbi1ib3R0b206NnB0OyB9IkNSTEYKICAgIENSTEYKCSJ0ZCAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjExcHQ7IH0iQ1JMRgogICAgInRkLnRpdGxlICAgICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsOyBmb250LXNpemU6MTlwdDsgZm9udC13ZWlnaHQ6Ym9sZDsiQ1JMRgogICAgIiAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6MzBwdDsgICBiYWNrZ3JvdW5kLWNvbG9yOiNjY2NjZmY7IHRleHQtYWxpZ246Y2VudGVyOyB9IkNSTEYKICAgICJ0ZC5zdWJ0aXRsZSAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbDsgZm9udC1zaXplOjEzcHQ7IkNSTEYKICAgICIgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjIwcHQ7ICAgYmFja2dyb3VuZC1jb2xvcjojY2NjY2ZmOyB9IkNSTEYKICAgICJ0ZC5jcm9zc3RpdGxlICB7ICAgICAgICAgICAgICAgICAgICAgZm9udC1zaXplOjEycHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IkNSTEYKICAgICIgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjE1cHQ7ICAgYmFja2dyb3VuZC1jb2xvcjojZWVlZWZmOyB9IkNSTEYKICAgICJ0ZC5pbWRldGFpbCAgICB7IHdpZHRoOjEwMCU7ICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjojZWVlZWZmOyB9IkNSTEYKICAgIENSTEYKICAgICJ0ZC5pbXN1bV9sZWZ0ICB7IHdpZHRoOjMwJTsgIH0iQ1JMRgogICAgInRkLmltc3VtX3JpZ2h0IHsgd2lkdGg6NzAlOyAgfSJDUkxGCiAgICBDUkxGCiAgICAidGQubmF2aW1haW4sIGEubmF2aW1haW4iQ1JMRgogICAgIiAgICAgICAgICAgICAgICAgICB7IHRleHQtYWxpZ246Y2VudGVyOyBmb250LWZhbWlseTogQXJpYWw7IGZvbnQtc2l6ZToxMnB0OyBmb250LXdlaWdodDpib2xkOyB9IkNSTEYKICAgICJ0ZC5uYXZpbWFpbnNlbGYgICAgeyB0ZXh0LWFsaWduOmNlbnRlcjsgZm9udC1mYW1pbHk6IEFyaWFsOyBmb250LXNpemU6MTJwdDsgZm9udC13ZWlnaHQ6Ym9sZDsiQ1JMRgogICAgIiAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiNmZmZmZmY7IGJhY2tncm91bmQtY29sb3I6IzIyMjJhZDsgfSJDUkxGCiAgICAidGQubmF2aW1haW5ub25lICAgIHsgdGV4dC1hbGlnbjpjZW50ZXI7IGZvbnQtZmFtaWx5OiBBcmlhbDsgZm9udC1zaXplOjEycHQ7IH0iQ1JMRgogICAgInRkLm5hdmlzdWIsIGEubmF2aXN1YiJDUkxGCiAgICAiICAgICAgICAgICAgICAgICAgIHsgdGV4dC1hbGlnbjpjZW50ZXI7IGZvbnQtZmFtaWx5OiBBcmlhbDsgZm9udC1zaXplOjlwdDsgZm9udC12YXJpYW50OnNtYWxsLWNhcHM7IH0iQ1JMRgogICAgInRkLm5hdmltYWluLCB0ZC5uYXZpc3ViIkNSTEYKICAgICIgICAgICAgICAgICAgICAgICAgeyBwYWRkaW5nLWxlZnQ6N3B0OyBwYWRkaW5nLXJpZ2h0OjdwdDsgfSJDUkxGCiAgICBDUkxGCiAgICAiYS5tZW1iZXJ0aXRsZSAgeyBmb250LXNpemU6MTJwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgbGluZS1oZWlnaHQ6MThwdDsgfSJDUkxGCiAgICAiYS5uYXZpbWFpbiwgYS5uYXZpc3ViICB7IGNvbG9yOiMwMDAwMDA7IH0iQ1JMRgogICAgIi5kdCAgICAgICAgICAgIHsgZm9udC13ZWlnaHQ6Ym9sZDsgfSJDUkxGCgkiLm5hbWVjaGFpbiAgICAgeyBmb250LXNpemU6MTNwdDsgZm9udC13ZWlnaHQ6Ym9sZDsiQ1JMRgoJIiAgICAgICAgICAgICAgICAgbWFyZ2luLXRvcDozcHQ7IG1hcmdpbi1ib3R0b206NnB0OyB9IkNSTEYKCSIudGl0bGUyICAgICAgICB7IGZvbnQtc2l6ZToxM3B0OyBmb250LXN0eWxlOml0YWxpYzsgZm9udC13ZWlnaHQ6Ym9sZDsgdGV4dC1hbGlnbjpsZWZ0OyB9IkNSTEYKICAgIDsKCgpjb25zdCBjaGFyICogY29uc3QgQ19zQ3NzRXhwbGFuYXRpb25zID0KICAgICIvKiBFeHBsYW5hdGlvbiBvZiBDU1MgY2xhc3NlczoiQ1JMRgogICAgQ1JMRgogICAgIi5uYXZpbWFpbiAgICAgICAgICBUZXh0IGluIG1haW4gbmF2aWdhdGlvbiBiYXIuIkNSTEYKICAgICIubmF2aXN1YiAgICAgICAgICAgVGV4dCBpbiBsb3dlciBuYXZpZ2F0aW9uIGJhci4iQ1JMRgogICAgInRkLm5hdmltYWluc2VsZiAgICBDZWxsIGluIG1haW4gbmF2aWdhdGlvbiBiYXIgd2l0aCBcInNlbGVjdGVkXCIgc2hhZG93OiBZb3UgYXJlIGhlcmUuIkNSTEYKICAgICJ0ZC5uYXZpbWFpbm5vbmUgICAgQ2VsbCBpbiBtYWluIG5hdmlnYXRpb24gYmFyIHdpdGggbm8gbGluay4iQ1JMRgogICAgQ1JMRgoJIi5uYW1lY2hhaW4gICAgICAgICBMaW5lIHdpdGggY3VycmVudCBtb2R1bGUgcGF0aC4iQ1JMRgogICAgQ1JMRgogICAgInRkLmNyb3NzdGl0bGUgICAgICBDb21tZW50IGJveCBmb3IgYmFzZXMgKGJhc2UgaW50ZXJmYWNlcyBldGMuKSJDUkxGCiAgICAidGQuaW1zdW1fbGVmdCAgICAgIExlZnQgcGFydCBvZiBzdWNoIGJveGVzLiJDUkxGCiAgICAidGQuaW1zdW1fcmlnaHQgICAgIFJpZ2h0IHBhcnQgb2Ygc3VjaCBib3hlcy4iQ1JMRgogICAgQ1JMRgogICAgInRkLnRpdGxlICAgICAgICAgICBNYWluIHRpdGxlIG9mIHRoZSBwYWdlIGxpa2UgXCJpbnRlcmZhY2UgWFl6XCIiQ1JMRgogICAgIi5zdWJ0aXRsZSAgICAgICAgICBUYWJsZXMsIGFuZCBoZWFkIGNlbGxzIG9mIHRob3NlLCB3aGljaCBsaXN0IG1lbWJlcnMiQ1JMRgogICAgIiAgICAgICAgICAgICAgICAgICBsaWtlIFwibWV0aG9kIHN1bW1hcnlcIiBhbmQgXCJtZXRob2QgZGV0YWlsc1wiLiJDUkxGCiAgICBDUkxGCiAgICAidGQuaW1kZXRhaWwgICAgICAgIEJhY2tncm91bmQgdGFibGUgb2YgbWV0aG9kJ3MgZGV0YWlsIGRlc2NyaXB0aW9uLiJDUkxGCiAgICAiYS5tZW1iZXJ0aXRsZSAgICAgIE1ldGhvZCBuYW1lIChhcyBqdW1wIGxhYmVsKSBpbiBtZXRob2QncyBkZXRhaWwiQ1JMRgogICAgIiAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbi4iQ1JMRgoJIi50aXRsZTIgICAgICAgICAgICBzbWFsbGVyIGZvbnQgcHJlZml4ZXMgdG8gcGFnZSB0aXRsZXMiQ1JMRgogICAgIiovIkNSTEYKICAgIDsKCmNvbnN0IGNoYXIgKiBjb25zdCBDX3NTdGRTdHlsZV93aXRoRGl2RnJhbWUgPQogICAgIi8qU2VlIGJvdHRvbSBvZiBmaWxlIGZvciBleHBsYW5hdGlvbnMuKi8iQ1JMRgogICAgQ1JMRgogICAgImJvZHkgeyBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmY7IH0iQ1JMRgogICAgQ1JMRgoJIiNhZGMtaWRscmVmIGgzIHsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IkNSTEYKCSIgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6M3B0OyBtYXJnaW4tYm90dG9tOjFwdDsgfSJDUkxGCiAgICAiI2FkYy1pZGxyZWYgcCwgI2FkYy1pZGxyZWYgZHQsICNhZGMtaWRscmVmIGRkLCAjYWRjLWlkbHJlZiBwcmUiQ1JMRgogICAgIiAgICAgICAgICAgICAgIHsgZm9udC1zaXplOjExcHQ7IkNSTEYKICAgICIgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6M3B0OyBtYXJnaW4tYm90dG9tOjFwdDsgfSJDUkxGCgkiI2FkYy1pZGxyZWYgcHJlICAgIHsgZm9udC1mYW1pbHk6bW9ub3NwYWNlOyB9IkNSTEYKICAgIENSTEYKICAgICIjYWRjLWlkbHJlZiB0YWJsZS5uYXZpbWFpbiB7IGJhY2tncm91bmQtY29sb3I6I2VlZWVmZjsgfSJDUkxGCiAgICAiI2FkYy1pZGxyZWYgdGFibGUuc3VidGl0bGUgeyBtYXJnaW4tdG9wOjZwdDsgbWFyZ2luLWJvdHRvbTo2cHQ7IH0iQ1JMRgogICAgQ1JMRgoJIiNhZGMtaWRscmVmIHRkICAgICAgICAgICAgIHsgZm9udC1zaXplOjExcHQ7IH0iQ1JMRgogICAgIiNhZGMtaWRscmVmIHRkLnRpdGxlICAgICAgIHsgZm9udC1mYW1pbHk6IEFyaWFsOyBmb250LXNpemU6MTlwdDsgZm9udC13ZWlnaHQ6Ym9sZDsiQ1JMRgogICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZS1oZWlnaHQ6MzBwdDsgICBiYWNrZ3JvdW5kLWNvbG9yOiNjY2NjZmY7IHRleHQtYWxpZ246Y2VudGVyOyB9IkNSTEYKICAgICIjYWRjLWlkbHJlZiB0ZC5zdWJ0aXRsZSAgICB7IGZvbnQtZmFtaWx5OiBBcmlhbDsgZm9udC1zaXplOjEzcHQ7IkNSTEYKICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUtaGVpZ2h0OjIwcHQ7ICAgYmFja2dyb3VuZC1jb2xvcjojY2NjY2ZmOyB9IkNSTEYKICAgICIjYWRjLWlkbHJlZiB0ZC5jcm9zc3RpdGxlICB7IGZvbnQtc2l6ZToxMnB0OyBmb250LXdlaWdodDpib2xkOyJDUkxGCiAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLWhlaWdodDoxNXB0OyAgIGJhY2tncm91bmQtY29sb3I6I2VlZWVmZjsgfSJDUkxGCiAgICAiI2FkYy1pZGxyZWYgdGQuaW1kZXRhaWwgICAgeyB3aWR0aDoxMDAlOyAgICAgICAgIGJhY2tncm91bmQtY29sb3I6I2VlZWVmZjsgfSJDUkxGCiAgICBDUkxGCiAgICAiI2FkYy1pZGxyZWYgdGQuaW1zdW1fbGVmdCAgeyB3aWR0aDozMCU7ICB9IkNSTEYKICAgICIjYWRjLWlkbHJlZiB0ZC5pbXN1bV9yaWdodCB7IHdpZHRoOjcwJTsgIH0iQ1JMRgogICAgQ1JMRgogICAgIiNhZGMtaWRscmVmIHRkLm5hdmltYWluLCAjYWRjLWlkbHJlZiBhLm5hdmltYWluIkNSTEYKICAgICIgICAgICAgICAgICAgICAgICAgeyB0ZXh0LWFsaWduOmNlbnRlcjsgZm9udC1mYW1pbHk6IEFyaWFsOyBmb250LXNpemU6MTJwdDsgZm9udC13ZWlnaHQ6Ym9sZDsgfSJDUkxGCiAgICAiI2FkYy1pZGxyZWYgdGQubmF2aW1haW5zZWxmICAgIHsgdGV4dC1hbGlnbjpjZW50ZXI7IGZvbnQtZmFtaWx5OiBBcmlhbDsgZm9udC1zaXplOjEycHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IkNSTEYKICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjojZmZmZmZmOyBiYWNrZ3JvdW5kLWNvbG9yOiMyMjIyYWQ7IH0iQ1JMRgogICAgIiNhZGMtaWRscmVmIHRkLm5hdmltYWlubm9uZSAgICB7IHRleHQtYWxpZ246Y2VudGVyOyBmb250LWZhbWlseTogQXJpYWw7IGZvbnQtc2l6ZToxMnB0OyB9IkNSTEYKICAgICIjYWRjLWlkbHJlZiB0ZC5uYXZpc3ViLCAjYWRjLWlkbHJlZiBhLm5hdmlzdWIiQ1JMRgogICAgIiAgICAgICAgICAgICAgICAgICB7IHRleHQtYWxpZ246Y2VudGVyOyBmb250LWZhbWlseTogQXJpYWw7IGZvbnQtc2l6ZTo5cHQ7IGZvbnQtdmFyaWFudDpzbWFsbC1jYXBzOyB9IkNSTEYKICAgICIjYWRjLWlkbHJlZiB0ZC5uYXZpbWFpbiwgI2FkYy1pZGxyZWYgdGQubmF2aXN1YiJDUkxGCiAgICAiICAgICAgICAgICAgICAgICAgIHsgcGFkZGluZy1sZWZ0OjdwdDsgcGFkZGluZy1yaWdodDo3cHQ7IH0iQ1JMRgogICAgQ1JMRgogICAgIiNhZGMtaWRscmVmIGEubWVtYmVydGl0bGUgIHsgZm9udC1zaXplOjEycHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IGxpbmUtaGVpZ2h0OjE4cHQ7IH0iQ1JMRgogICAgIiNhZGMtaWRscmVmIGEubmF2aW1haW4sICNhZGMtaWRscmVmIGEubmF2aXN1YiAgeyBjb2xvcjojMDAwMDAwOyB9IkNSTEYKICAgICIjYWRjLWlkbHJlZiAuZHQgICAgICAgICAgICB7IGZvbnQtd2VpZ2h0OmJvbGQ7IH0iQ1JMRgoJIiNhZGMtaWRscmVmIC5uYW1lY2hhaW4gICAgIHsgZm9udC1zaXplOjEzcHQ7IGZvbnQtd2VpZ2h0OmJvbGQ7IkNSTEYKCSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbi10b3A6M3B0OyBtYXJnaW4tYm90dG9tOjZwdDsgfSJDUkxGCgkiI2FkYy1pZGxyZWYgLnRpdGxlMiAgICAgICAgeyBmb250LXNpemU6MTNwdDsgZm9udC1zdHlsZTppdGFsaWM7IGZvbnQtd2VpZ2h0OmJvbGQ7IHRleHQtYWxpZ246bGVmdDsgfSJDUkxGCiAgICAiIkNSTEYKICAgICIjYWRjLWlkbHJlZiB0YWJsZSB7IGVtcHR5LWNlbGxzOnNob3c7IH0iQ1JMRgogICAgIiJDUkxGCgkiI2FkYy1pZGxyZWYgLmNoaWxkbGlzdCB0ZCwgIkNSTEYKCSIjYWRjLWlkbHJlZiAuY29tbWVudGVkbGlua3MgdGQsICJDUkxGCgkiI2FkYy1pZGxyZWYgLm1lbWJlcmxpc3QgdGQsICJDUkxGCgkiI2FkYy1pZGxyZWYgLnN1YnRpdGxlIHRkLCAiQ1JMRgoJIiNhZGMtaWRscmVmIC5jcm9zc3RpdGxlIHRkICB7IGJvcmRlcjogLjFwdCBzb2xpZCAjMDAwMDAwOyB9IkNSTEYKICAgICIiQ1JMRgoJIiNhZGMtaWRscmVmIC5mbGFnLXRhYmxlIHRkIHsgYm9yZGVyOiAuMXB0IHNvbGlkICNjY2NjY2M7IH0gIkNSTEYKICAgICIiQ1JMRgoJIiNhZGMtaWRscmVmIC50aXRsZS10YWJsZSB0ZCwgIkNSTEYKCSIjYWRjLWlkbHJlZiAudGFibGUtaW4tbWV0aG9kIHRkLCAiQ1JMRgoJIiNhZGMtaWRscmVmIC50YWJsZS1pbi1kYXRhIHRkLCAiQ1JMRgoJIiNhZGMtaWRscmVmIC5uYXZpbWFpbiB0ZCwgIkNSTEYKCSIjYWRjLWlkbHJlZiAubmF2aXN1YiB0ZCwgIkNSTEYKCSIjYWRjLWlkbHJlZiAuZXhwbC10YWJsZSB0ZCwgIkNSTEYKCSIjYWRjLWlkbHJlZiAucGFyYW0tdGFibGUgdGQgIHsgYm9yZGVyOiBub25lOyB9IkNSTEYKICAgIDsKCgp9ICAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQoKClN0ZEZyYW1lOjpTdGRGcmFtZSgpCiAgICA6ICAgc0RldmVsb3BlcnNHdWlkZUh0bWxSb290KCksCiAgICAgICAgYlNpbXBsZUxpbmtzKGZhbHNlKQp7Cn0KCkRZTiBIdG1sX0ltYWdlICoKU3RkRnJhbWU6OkxvZ29TcmMoKSBjb25zdAp7CiAgICByZXR1cm4gMDsKCi8vICAgIHJldHVybiAgbmV3IEh0bWxfSW1hZ2UoICJsb2dvZG90LWJsdS5naWYiLAovLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTA5IiwKLy8JCQkJCQkJICAiNTQiLAovLwkJCQkJCQkgICJSSUdIVCIsCi8vCQkJCQkJCSAgIjAiLAovLwkJCQkJCQkgICJPcGVuT2ZmaWNlIiApOwoKfQoKY29uc3QgY2hhciAqClN0ZEZyYW1lOjpMb2dvTGluaygpIGNvbnN0CnsKICAgIHJldHVybiAiIjsKLy8gIHJldHVybiAiaHR0cDovL3d3dy5zdW4uY29tIjsKLy8gIHJldHVybiAiaHR0cDovL3d3dy5vcGVub2ZmaWNlLm9yZyI7Cn0KCgpTdHJpbmcgICAgICAgICAgICAgIE1ha2VDb3B5UmlnaHQoKTsKCmNvbnN0IGNoYXIgKgpTdGRGcmFtZTo6Q29weXJpZ2h0VGV4dCgpIGNvbnN0CnsKICAgIHN0YXRpYyBTdHJpbmcgc0NvcHlSaWdodF8oIE1ha2VDb3B5UmlnaHQoKSApOwogICAgcmV0dXJuIHNDb3B5UmlnaHRfLmNfc3RyKCk7Cn0KCmNvbnN0IGNoYXIgKgpTdGRGcmFtZTo6Q3NzU3R5bGUoKSBjb25zdAp7CiAgICBpZiAoYlVzZV9PT29GcmFtZURpdikKICAgICAgICByZXR1cm4gQ19zU3RkU3R5bGVfd2l0aERpdkZyYW1lOwogICAgZWxzZQogICAgICAgIHJldHVybiBDX3NTdGRTdHlsZTsKfQoKY29uc3QgY2hhciAqClN0ZEZyYW1lOjpDc3NTdHlsZXNFeHBsYW5hdGlvbigpIGNvbnN0CnsKICAgIHJldHVybiBDX3NDc3NFeHBsYW5hdGlvbnM7Cn0KCmNvbnN0IGNoYXIgKgpTdGRGcmFtZTo6RGV2ZWxvcGVyc0d1aWRlSHRtbFJvb3QoKSBjb25zdAp7CiAgICByZXR1cm4gc0RldmVsb3BlcnNHdWlkZUh0bWxSb290Owp9Cgpib29sClN0ZEZyYW1lOjpTaW1wbGVMaW5rcygpIGNvbnN0CnsKICAgIHJldHVybiBiU2ltcGxlTGlua3M7Cn0KCnZvaWQKU3RkRnJhbWU6OlNldF9EZXZlbG9wZXJzR3VpZGVIdG1sUm9vdCggY29uc3QgU3RyaW5nICYgaV9kaXJlY3RvcnkgKQp7CiAgICBpZiAoTk9UIGlfZGlyZWN0b3J5LmVtcHR5KCkpCiAgICB7CiAgICAgICAgaWYgKGlfZGlyZWN0b3J5LmNoYXJfYXQoaV9kaXJlY3RvcnkubGVuZ3RoKCktMSkgPT0gJy8nKQogICAgICAgIHsKICAgICAgICAgICAgc0RldmVsb3BlcnNHdWlkZUh0bWxSb290LmFzc2lnbihpX2RpcmVjdG9yeSxpX2RpcmVjdG9yeS5sZW5ndGgoKS0xKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIHNEZXZlbG9wZXJzR3VpZGVIdG1sUm9vdCA9IGlfZGlyZWN0b3J5Owp9Cgp2b2lkClN0ZEZyYW1lOjpTZXRfU2ltcGxlTGlua3MoKQp7CiAgICBiU2ltcGxlTGlua3MgPSB0cnVlOwp9CgpTdHJpbmcKTWFrZUNvcHlSaWdodCgpCnsKICAgIFN0cmVhbVN0ciBjcig3MDApOwogICAgdGltZV90CiAgICAgICAgZ3Q7CiAgICB0aW1lKCZndCk7CiAgICB0bSAqCiAgICAgICAgcGx0ID0gbG9jYWx0aW1lKCZndCk7CiAgICBpbnQgeWVhciA9IDE5MDAgKyBwbHQtPnRtX3llYXI7CgogICAgY3IgIDw8ICJDb3B5cmlnaHQgJmNvcHk7ICIKICAgICAgICA8PCB5ZWFyCiAgICAgICAgPDwgIiwgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wLiBBcGFjaGUsIHRoZSBBcGFjaGUgZmVhdGhlciBsb2dvLCBBcGFjaGUgT3Blbk9mZmljZSBhbmQgT3Blbk9maWZjZS5vcmcgYXJlIHRyYWRlbWFya3Mgb2YgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBPdGhlciBuYW1lcyBtYXkgYmUgdHJhZGVtYXJrcyBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4iOwogICAgcmV0dXJuIFN0cmluZyhjci5jX3N0cigpKTsKCn0K