LyoKICogU3RhcnQgKFJ1c3NpYW4gcmVzb3VyY2VzKQogKgogKiBDb3B5cmlnaHQgMjAwMyBJZ29yIFN0ZXBpbgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX1JVU1NJQU4sIFNVQkxBTkdfREVGQVVMVAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgTEFOR1VBR0UgTEFOR19SVVNTSUFOLCBTVUJMQU5HX0RFRkFVTFQKewpTVFJJTkdfVVNBR0UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAix+Dv8/Hq4OXyIO/w7uPw4Ozs+yDo6+gg7vLq8Pvi4OXyIOTu6vPs5e3y+yDv8Ojr7ubl7ejl7CxcblwK7uH79+3uIOjx7+7r/Ofz5ez77CDk6/8g9ODp6+7iIPEg5ODt7fvsIPDg8fjo8OXt6OXsLlxuXG5cCsjx7+7r/Ofu4uDt6OU6XG5cCnN0YXJ0IFtvcHRpb25zXSDo7P9f9ODp6+Bf7/Du4/Dg7Oz7IFsuLi5dXG5cCnN0YXJ0IFtvcHRpb25zXSDo7P9f9ODp6+Bf5O7q8+zl7fLgXG5cClxuXArO7/bo6DpcblwKL01baW5pbWl6ZWRdIMfg7/Px8ujy/CDv8O7j8ODs7PMg7Ojt6Ozo5+jw7uLg7e3u6S5cblwKL01BWFtpbWl6ZWRdIMfg7/Px8ujy/CDv8O7j8ODs7PMg7ODq8ejs6Ofo8O7i4O3t7ukuXG5cCi9SW2VzdG9yZWRdICDH4O/z8fLo8vwg7/Du4/Dg7OzzIO3u8Ozg6/zt7iAo7eUg7ODq8ejs6Ofo8O7i4O3t7iDoIO3lIOzo7ejs6Ofo8O7i4O3t7ikuXG5cCi9XW2FpdF0gICAgICDO5ujk4PL8IOfg4uXw+OXt6P8g5+Dv8/nl7e3u6SDv8O7j8ODs7Psg6CDi++ny6CDxIOru5O7sIOW4IOL79e7k4C5cblwKL1VuaXggICAgICAgIMjx7+7r/Ofu4uDy/CDv8/L8IFVuaXgg5Ov/IOfg7/Px6uAg7/Du4/Dg7Psg6uDqIOLo7eTu4vEg7/Du4u7k7ejqLlxuXAovTCAgICAgICAgICAgz+7q4Ofg8vwg6+j25e3n6P4g6u7t5fft7uPuIO/u6/zn7uLg8uXr/y5cblwKXG5cCnN0YXJ0LmV4ZSDi5fDx6P8gMC4yIENvcHlyaWdodCAoQykgMjAwMywgRGFuIEtlZ2VsXG5cClN0YXJ0IOjk5fIgwcXHIMrAysjVLcvIwc4gw8DQwM3SyMk7IO/u5PDu4e3u8fLoIO/w6CDn4O/z8erlIPEg7u/26OXpIC9MLlxuXArd8u4g8eLu4e7k7eD/IO/w7uPw4Ozs4Cwg6CDi+yDs7ubl8uUg5bgg8ODx7/Du8fLw4O3/8vwg7eAg7u/w5eTl67jt7fv1XG5cCvPx6+7i6P/1OyDv7uTw7uHt7vHy6CDv8Ogg5+Dv8/Hq5SDxIO7v9ujl6SAvTC5cblwKIgoKU1RSSU5HX0xJQ0VOU0UsICJzdGFydC5leGUg4uXw8ej/IDAuMiBDb3B5cmlnaHQgKEMpIDIwMDMsIERhbiBLZWdlbFxuXArd8u4g7/Du4/Dg7OzgIPDg8e/w7vHy8ODt/+Xy8f8g7+4g6+j25e3n6OggR05VIExlc3NlciBQdWJsaWMgTGljZW5zZVxuXAroIP/i6//l8vH/IPHi7uHu5O377CDv8O7j8ODs7O377CDv8O7k8+ry7uwuXG5cClxuXApUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yXG5cCm1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2VcblwKYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIuMVxuXApvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi5cblwKXG5cClRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLFxuXApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZlxuXApNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlXG5cCkdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy5cblwKXG5cCllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgUHVibGljIExpY2Vuc2VcblwKYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmVcblwKRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS5cblwKXG5cClNlZSB0aGUgQ09QWUlORy5MSUIgZmlsZSBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cblwKIgoKU1RSSU5HX0VYRUNGQUlMICLP8Ojr7ubl7ejlIO3lIOzu5uXyIOH78vwg5+Dv8/nl7e4g6OvoIO3lIODx8e726Ojw7uLg7e4g7/Do6+7m5e3o6SDxIPLo7+7sIOTg7e3u4+4g5O7q8+zl7fLgLlxuwvvn7uIgU2hlbGxFeGVjdXRlRXgg7/Du4uDr6Ovx/yIKClNUUklOR19VTklYRkFJTCAizeXi7ufs7ubt7iDv5fDl4uXx8ugg6Oz/IO/w7uPw4Ozs+yBVTklYIOIg6Oz/IERPUy4iCn0K