@codingame/monaco-editor-wrapper 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  import { c as createBase64WorkerFactory } from './worker.js';
2
2
 
3
- var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgb24gRXZlbnRFbWl0dGVyIGJ5IGltcGxlbWVudGluZyBhIHN1YnNldCBvZiB0aGUgaW50ZXJmYWNlLgogICAgY2xhc3MgRXJyb3JIYW5kbGVyIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSBbXTsKICAgICAgICAgICAgdGhpcy51bmV4cGVjdGVkRXJyb3JIYW5kbGVyID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlLnN0YWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLm1lc3NhZ2UgKyAnXG5cbicgKyBlLnN0YWNrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBhZGRMaXN0ZW5lcihsaXN0ZW5lcikgewogICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTsKICAgICAgICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVyKGxpc3RlbmVyKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZW1pdChlKSB7CiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7CiAgICAgICAgICAgICAgICBsaXN0ZW5lcihlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcikgewogICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zcGxpY2UodGhpcy5saXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lciksIDEpOwogICAgICAgIH0KICAgICAgICBzZXRVbmV4cGVjdGVkRXJyb3JIYW5kbGVyKG5ld1VuZXhwZWN0ZWRFcnJvckhhbmRsZXIpIHsKICAgICAgICAgICAgdGhpcy51bmV4cGVjdGVkRXJyb3JIYW5kbGVyID0gbmV3VW5leHBlY3RlZEVycm9ySGFuZGxlcjsKICAgICAgICB9CiAgICAgICAgZ2V0VW5leHBlY3RlZEVycm9ySGFuZGxlcigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcjsKICAgICAgICB9CiAgICAgICAgb25VbmV4cGVjdGVkRXJyb3IoZSkgewogICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWRFcnJvckhhbmRsZXIoZSk7CiAgICAgICAgICAgIHRoaXMuZW1pdChlKTsKICAgICAgICB9CiAgICAgICAgLy8gRm9yIGV4dGVybmFsIGVycm9ycywgd2UgZG9uJ3Qgd2FudCB0aGUgbGlzdGVuZXJzIHRvIGJlIGNhbGxlZAogICAgICAgIG9uVW5leHBlY3RlZEV4dGVybmFsRXJyb3IoZSkgewogICAgICAgICAgICB0aGlzLnVuZXhwZWN0ZWRFcnJvckhhbmRsZXIoZSk7CiAgICAgICAgfQogICAgfQogICAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpOwogICAgZnVuY3Rpb24gb25VbmV4cGVjdGVkRXJyb3IoZSkgewogICAgICAgIC8vIGlnbm9yZSBlcnJvcnMgZnJvbSBjYW5jZWxsZWQgcHJvbWlzZXMKICAgICAgICBpZiAoIWlzUHJvbWlzZUNhbmNlbGVkRXJyb3IoZSkpIHsKICAgICAgICAgICAgZXJyb3JIYW5kbGVyLm9uVW5leHBlY3RlZEVycm9yKGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgfQogICAgZnVuY3Rpb24gdHJhbnNmb3JtRXJyb3JGb3JTZXJpYWxpemF0aW9uKGVycm9yKSB7CiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHsKICAgICAgICAgICAgbGV0IHsgbmFtZSwgbWVzc2FnZSB9ID0gZXJyb3I7CiAgICAgICAgICAgIGNvbnN0IHN0YWNrID0gZXJyb3Iuc3RhY2t0cmFjZSB8fCBlcnJvci5zdGFjazsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICRpc0Vycm9yOiB0cnVlLAogICAgICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgICAgIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICBzdGFjawogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvLyByZXR1cm4gYXMgaXMKICAgICAgICByZXR1cm4gZXJyb3I7CiAgICB9CiAgICBjb25zdCBjYW5jZWxlZE5hbWUgPSAnQ2FuY2VsZWQnOwogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGVycm9yIGlzIGEgcHJvbWlzZSBpbiBjYW5jZWxlZCBzdGF0ZQogICAgICovCiAgICBmdW5jdGlvbiBpc1Byb21pc2VDYW5jZWxlZEVycm9yKGVycm9yKSB7CiAgICAgICAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgJiYgZXJyb3IubmFtZSA9PT0gY2FuY2VsZWROYW1lICYmIGVycm9yLm1lc3NhZ2UgPT09IGNhbmNlbGVkTmFtZTsKICAgIH0KICAgIGZ1bmN0aW9uIGlsbGVnYWxBcmd1bWVudChuYW1lKSB7CiAgICAgICAgaWYgKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihgSWxsZWdhbCBhcmd1bWVudDogJHtuYW1lfWApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBFcnJvcignSWxsZWdhbCBhcmd1bWVudCcpOwogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGZ1bmN0aW9uIG9uY2UoZm4pIHsKICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7CiAgICAgICAgbGV0IGRpZENhbGwgPSBmYWxzZTsKICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmIChkaWRDYWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRpZENhbGwgPSB0cnVlOwogICAgICAgICAgICByZXN1bHQgPSBmbi5hcHBseShfdGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9OwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdmFyIEl0ZXJhYmxlOwogICAgKGZ1bmN0aW9uIChJdGVyYWJsZSkgewogICAgICAgIGZ1bmN0aW9uIGlzKHRoaW5nKSB7CiAgICAgICAgICAgIHJldHVybiB0aGluZyAmJiB0eXBlb2YgdGhpbmcgPT09ICdvYmplY3QnICYmIHR5cGVvZiB0aGluZ1tTeW1ib2wuaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nOwogICAgICAgIH0KICAgICAgICBJdGVyYWJsZS5pcyA9IGlzOwogICAgICAgIGNvbnN0IF9lbXB0eSA9IE9iamVjdC5mcmVlemUoW10pOwogICAgICAgIGZ1bmN0aW9uIGVtcHR5KCkgewogICAgICAgICAgICByZXR1cm4gX2VtcHR5OwogICAgICAgIH0KICAgICAgICBJdGVyYWJsZS5lbXB0eSA9IGVtcHR5OwogICAgICAgIGZ1bmN0aW9uKiBzaW5nbGUoZWxlbWVudCkgewogICAgICAgICAgICB5aWVsZCBlbGVtZW50OwogICAgICAgIH0KICAgICAgICBJdGVyYWJsZS5zaW5nbGUgPSBzaW5nbGU7CiAgICAgICAgZnVuY3Rpb24gZnJvbShpdGVyYWJsZSkgewogICAgICAgICAgICByZXR1cm4gaXRlcmFibGUgfHwgX2VtcHR5OwogICAgICAgIH0KICAgICAgICBJdGVyYWJsZS5mcm9tID0gZnJvbTsKICAgICAgICBmdW5jdGlvbiBpc0VtcHR5KGl0ZXJhYmxlKSB7CiAgICAgICAgICAgIHJldHVybiAhaXRlcmFibGUgfHwgaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpLm5leHQoKS5kb25lID09PSB0cnVlOwogICAgICAgIH0KICAgICAgICBJdGVyYWJsZS5pc0VtcHR5ID0gaXNFbXB0eTsKICAgICAgICBmdW5jdGlvbiBmaXJzdChpdGVyYWJsZSkgewogICAgICAgICAgICByZXR1cm4gaXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpLm5leHQoKS52YWx1ZTsKICAgICAgICB9CiAgICAgICAgSXRlcmFibGUuZmlyc3QgPSBmaXJzdDsKICAgICAgICBmdW5jdGlvbiBzb21lKGl0ZXJhYmxlLCBwcmVkaWNhdGUpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGl0ZXJhYmxlKSB7CiAgICAgICAgICAgICAgICBpZiAocHJlZGljYXRlKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBJdGVyYWJsZS5zb21lID0gc29tZTsKICAgICAgICBmdW5jdGlvbiBmaW5kKGl0ZXJhYmxlLCBwcmVkaWNhdGUpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGl0ZXJhYmxlKSB7CiAgICAgICAgICAgICAgICBpZiAocHJlZGljYXRlKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgSXRlcmFibGUuZmluZCA9IGZpbmQ7CiAgICAgICAgZnVuY3Rpb24qIGZpbHRlcihpdGVyYWJsZSwgcHJlZGljYXRlKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBpdGVyYWJsZSkgewogICAgICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShlbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgIHlpZWxkIGVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgSXRlcmFibGUuZmlsdGVyID0gZmlsdGVyOwogICAgICAgIGZ1bmN0aW9uKiBtYXAoaXRlcmFibGUsIGZuKSB7CiAgICAgICAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBpdGVyYWJsZSkgewogICAgICAgICAgICAgICAgeWllbGQgZm4oZWxlbWVudCwgaW5kZXgrKyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgSXRlcmFibGUubWFwID0gbWFwOwogICAgICAgIGZ1bmN0aW9uKiBjb25jYXQoLi4uaXRlcmFibGVzKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlcmFibGUgb2YgaXRlcmFibGVzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgaXRlcmFibGUpIHsKICAgICAgICAgICAgICAgICAgICB5aWVsZCBlbGVtZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEl0ZXJhYmxlLmNvbmNhdCA9IGNvbmNhdDsKICAgICAgICBmdW5jdGlvbiogY29uY2F0TmVzdGVkKGl0ZXJhYmxlcykgewogICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZXJhYmxlIG9mIGl0ZXJhYmxlcykgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGl0ZXJhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgeWllbGQgZWxlbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBJdGVyYWJsZS5jb25jYXROZXN0ZWQgPSBjb25jYXROZXN0ZWQ7CiAgICAgICAgZnVuY3Rpb24gcmVkdWNlKGl0ZXJhYmxlLCByZWR1Y2VyLCBpbml0aWFsVmFsdWUpIHsKICAgICAgICAgICAgbGV0IHZhbHVlID0gaW5pdGlhbFZhbHVlOwogICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgaXRlcmFibGUpIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gcmVkdWNlcih2YWx1ZSwgZWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgICBJdGVyYWJsZS5yZWR1Y2UgPSByZWR1Y2U7CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhbiBpdGVyYWJsZSBzbGljZSBvZiB0aGUgYXJyYXksIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIGFzIGBhcnJheS5zbGljZSgpYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiogc2xpY2UoYXJyLCBmcm9tLCB0byA9IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgaWYgKGZyb20gPCAwKSB7CiAgICAgICAgICAgICAgICBmcm9tICs9IGFyci5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRvIDwgMCkgewogICAgICAgICAgICAgICAgdG8gKz0gYXJyLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0byA+IGFyci5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRvID0gYXJyLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKDsgZnJvbSA8IHRvOyBmcm9tKyspIHsKICAgICAgICAgICAgICAgIHlpZWxkIGFycltmcm9tXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBJdGVyYWJsZS5zbGljZSA9IHNsaWNlOwogICAgICAgIC8qKgogICAgICAgICAqIENvbnN1bWVzIGBhdE1vc3RgIGVsZW1lbnRzIGZyb20gaXRlcmFibGUgYW5kIHJldHVybnMgdGhlIGNvbnN1bWVkIGVsZW1lbnRzLAogICAgICAgICAqIGFuZCBhbiBpdGVyYWJsZSBmb3IgdGhlIHJlc3Qgb2YgdGhlIGVsZW1lbnRzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNvbnN1bWUoaXRlcmFibGUsIGF0TW9zdCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgewogICAgICAgICAgICBjb25zdCBjb25zdW1lZCA9IFtdOwogICAgICAgICAgICBpZiAoYXRNb3N0ID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW2NvbnN1bWVkLCBpdGVyYWJsZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBpdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXRNb3N0OyBpKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICBpZiAobmV4dC5kb25lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtjb25zdW1lZCwgSXRlcmFibGUuZW1wdHkoKV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdW1lZC5wdXNoKG5leHQudmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbY29uc3VtZWQsIHsgW1N5bWJvbC5pdGVyYXRvcl0oKSB7IHJldHVybiBpdGVyYXRvcjsgfSB9XTsKICAgICAgICB9CiAgICAgICAgSXRlcmFibGUuY29uc3VtZSA9IGNvbnN1bWU7CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVyYWJsZXMgYXJlIHRoZSBzYW1lIGxlbmd0aCBhbmQgYWxsIGl0ZW1zIGFyZQogICAgICAgICAqIGVxdWFsIHVzaW5nIHRoZSBjb21wYXJhdG9yIGZ1bmN0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGVxdWFscyhhLCBiLCBjb21wYXJhdG9yID0gKGF0LCBidCkgPT4gYXQgPT09IGJ0KSB7CiAgICAgICAgICAgIGNvbnN0IGFpID0gYVtTeW1ib2wuaXRlcmF0b3JdKCk7CiAgICAgICAgICAgIGNvbnN0IGJpID0gYltTeW1ib2wuaXRlcmF0b3JdKCk7CiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhbiA9IGFpLm5leHQoKTsKICAgICAgICAgICAgICAgIGNvbnN0IGJuID0gYmkubmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKGFuLmRvbmUgIT09IGJuLmRvbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChhbi5kb25lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghY29tcGFyYXRvcihhbi52YWx1ZSwgYm4udmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEl0ZXJhYmxlLmVxdWFscyA9IGVxdWFsczsKICAgIH0pKEl0ZXJhYmxlIHx8IChJdGVyYWJsZSA9IHt9KSk7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAodW5kZWZpbmVkICYmIHVuZGVmaW5lZC5fX2F3YWl0ZXIpIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHsKICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0KICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9CiAgICAgICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsKICAgICAgICB9KTsKICAgIH07CiAgICBmdW5jdGlvbiB0cmFja0Rpc3Bvc2FibGUoeCkgewogICAgICAgIHJldHVybiB4OwogICAgfQogICAgZnVuY3Rpb24gc2V0UGFyZW50T2ZEaXNwb3NhYmxlKGNoaWxkLCBwYXJlbnQpIHsKICAgIH0KICAgIGNsYXNzIE11bHRpRGlzcG9zZUVycm9yIGV4dGVuZHMgRXJyb3IgewogICAgICAgIGNvbnN0cnVjdG9yKGVycm9ycykgewogICAgICAgICAgICBzdXBlcihgRW5jb3VudGVyZWQgZXJyb3JzIHdoaWxlIGRpc3Bvc2luZyBvZiBzdG9yZS4gRXJyb3JzOiBbJHtlcnJvcnMuam9pbignLCAnKX1dYCk7CiAgICAgICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGRpc3Bvc2UoYXJnKSB7CiAgICAgICAgaWYgKEl0ZXJhYmxlLmlzKGFyZykpIHsKICAgICAgICAgICAgbGV0IGVycm9ycyA9IFtdOwogICAgICAgICAgICBmb3IgKGNvbnN0IGQgb2YgYXJnKSB7CiAgICAgICAgICAgICAgICBpZiAoZCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGQuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgIHRocm93IGVycm9yc1swXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChlcnJvcnMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IE11bHRpRGlzcG9zZUVycm9yKGVycm9ycyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXJnKSA/IFtdIDogYXJnOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhcmcpIHsKICAgICAgICAgICAgYXJnLmRpc3Bvc2UoKTsKICAgICAgICAgICAgcmV0dXJuIGFyZzsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjb21iaW5lZERpc3Bvc2FibGUoLi4uZGlzcG9zYWJsZXMpIHsKICAgICAgICBjb25zdCBwYXJlbnQgPSB0b0Rpc3Bvc2FibGUoKCkgPT4gZGlzcG9zZShkaXNwb3NhYmxlcykpOwogICAgICAgIHJldHVybiBwYXJlbnQ7CiAgICB9CiAgICBmdW5jdGlvbiB0b0Rpc3Bvc2FibGUoZm4pIHsKICAgICAgICBjb25zdCBzZWxmID0gdHJhY2tEaXNwb3NhYmxlKHsKICAgICAgICAgICAgZGlzcG9zZTogb25jZSgoKSA9PiB7CiAgICAgICAgICAgICAgICBmbigpOwogICAgICAgICAgICB9KQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBzZWxmOwogICAgfQogICAgY2xhc3MgRGlzcG9zYWJsZVN0b3JlIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5fdG9EaXNwb3NlID0gbmV3IFNldCgpOwogICAgICAgICAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERpc3Bvc2Ugb2YgYWxsIHJlZ2lzdGVyZWQgZGlzcG9zYWJsZXMgYW5kIG1hcmsgdGhpcyBvYmplY3QgYXMgZGlzcG9zZWQuCiAgICAgICAgICoKICAgICAgICAgKiBBbnkgZnV0dXJlIGRpc3Bvc2FibGVzIGFkZGVkIHRvIHRoaXMgb2JqZWN0IHdpbGwgYmUgZGlzcG9zZWQgb2Ygb24gYGFkZGAuCiAgICAgICAgICovCiAgICAgICAgZGlzcG9zZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzRGlzcG9zZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5jbGVhcigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEaXNwb3NlIG9mIGFsbCByZWdpc3RlcmVkIGRpc3Bvc2FibGVzIGJ1dCBkbyBub3QgbWFyayB0aGlzIG9iamVjdCBhcyBkaXNwb3NlZC4KICAgICAgICAgKi8KICAgICAgICBjbGVhcigpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGRpc3Bvc2UodGhpcy5fdG9EaXNwb3NlLnZhbHVlcygpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIHRoaXMuX3RvRGlzcG9zZS5jbGVhcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFkZChvKSB7CiAgICAgICAgICAgIGlmICghbykgewogICAgICAgICAgICAgICAgcmV0dXJuIG87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG8gPT09IHRoaXMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlZ2lzdGVyIGEgZGlzcG9zYWJsZSBvbiBpdHNlbGYhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX2lzRGlzcG9zZWQpIHsKICAgICAgICAgICAgICAgIGlmICghRGlzcG9zYWJsZVN0b3JlLkRJU0FCTEVfRElTUE9TRURfV0FSTklORykgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihuZXcgRXJyb3IoJ1RyeWluZyB0byBhZGQgYSBkaXNwb3NhYmxlIHRvIGEgRGlzcG9zYWJsZVN0b3JlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZCBvZi4gVGhlIGFkZGVkIG9iamVjdCB3aWxsIGJlIGxlYWtlZCEnKS5zdGFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl90b0Rpc3Bvc2UuYWRkKG8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvOwogICAgICAgIH0KICAgIH0KICAgIERpc3Bvc2FibGVTdG9yZS5ESVNBQkxFX0RJU1BPU0VEX1dBUk5JTkcgPSBmYWxzZTsKICAgIGNsYXNzIERpc3Bvc2FibGUgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLl9zdG9yZSA9IG5ldyBEaXNwb3NhYmxlU3RvcmUoKTsKICAgICAgICAgICAgc2V0UGFyZW50T2ZEaXNwb3NhYmxlKHRoaXMuX3N0b3JlKTsKICAgICAgICB9CiAgICAgICAgZGlzcG9zZSgpIHsKICAgICAgICAgICAgdGhpcy5fc3RvcmUuZGlzcG9zZSgpOwogICAgICAgIH0KICAgICAgICBfcmVnaXN0ZXIobykgewogICAgICAgICAgICBpZiAobyA9PT0gdGhpcykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVnaXN0ZXIgYSBkaXNwb3NhYmxlIG9uIGl0c2VsZiEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RvcmUuYWRkKG8pOwogICAgICAgIH0KICAgIH0KICAgIERpc3Bvc2FibGUuTm9uZSA9IE9iamVjdC5mcmVlemUoeyBkaXNwb3NlKCkgeyB9IH0pOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY2xhc3MgTm9kZSB7CiAgICAgICAgY29uc3RydWN0b3IoZWxlbWVudCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgICAgICB0aGlzLm5leHQgPSBOb2RlLlVuZGVmaW5lZDsKICAgICAgICAgICAgdGhpcy5wcmV2ID0gTm9kZS5VbmRlZmluZWQ7CiAgICAgICAgfQogICAgfQogICAgTm9kZS5VbmRlZmluZWQgPSBuZXcgTm9kZSh1bmRlZmluZWQpOwogICAgY2xhc3MgTGlua2VkTGlzdCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpcnN0ID0gTm9kZS5VbmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMuX2xhc3QgPSBOb2RlLlVuZGVmaW5lZDsKICAgICAgICAgICAgdGhpcy5fc2l6ZSA9IDA7CiAgICAgICAgfQogICAgICAgIGdldCBzaXplKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTsKICAgICAgICB9CiAgICAgICAgaXNFbXB0eSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpcnN0ID09PSBOb2RlLlVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgY2xlYXIoKSB7CiAgICAgICAgICAgIGxldCBub2RlID0gdGhpcy5fZmlyc3Q7CiAgICAgICAgICAgIHdoaWxlIChub2RlICE9PSBOb2RlLlVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IG5vZGUubmV4dDsKICAgICAgICAgICAgICAgIG5vZGUucHJldiA9IE5vZGUuVW5kZWZpbmVkOwogICAgICAgICAgICAgICAgbm9kZS5uZXh0ID0gTm9kZS5VbmRlZmluZWQ7CiAgICAgICAgICAgICAgICBub2RlID0gbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9maXJzdCA9IE5vZGUuVW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLl9sYXN0ID0gTm9kZS5VbmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMuX3NpemUgPSAwOwogICAgICAgIH0KICAgICAgICB1bnNoaWZ0KGVsZW1lbnQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc2VydChlbGVtZW50LCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIHB1c2goZWxlbWVudCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faW5zZXJ0KGVsZW1lbnQsIHRydWUpOwogICAgICAgIH0KICAgICAgICBfaW5zZXJ0KGVsZW1lbnQsIGF0VGhlRW5kKSB7CiAgICAgICAgICAgIGNvbnN0IG5ld05vZGUgPSBuZXcgTm9kZShlbGVtZW50KTsKICAgICAgICAgICAgaWYgKHRoaXMuX2ZpcnN0ID09PSBOb2RlLlVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdGhpcy5fZmlyc3QgPSBuZXdOb2RlOwogICAgICAgICAgICAgICAgdGhpcy5fbGFzdCA9IG5ld05vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoYXRUaGVFbmQpIHsKICAgICAgICAgICAgICAgIC8vIHB1c2gKICAgICAgICAgICAgICAgIGNvbnN0IG9sZExhc3QgPSB0aGlzLl9sYXN0OwogICAgICAgICAgICAgICAgdGhpcy5fbGFzdCA9IG5ld05vZGU7CiAgICAgICAgICAgICAgICBuZXdOb2RlLnByZXYgPSBvbGRMYXN0OwogICAgICAgICAgICAgICAgb2xkTGFzdC5uZXh0ID0gbmV3Tm9kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIHVuc2hpZnQKICAgICAgICAgICAgICAgIGNvbnN0IG9sZEZpcnN0ID0gdGhpcy5fZmlyc3Q7CiAgICAgICAgICAgICAgICB0aGlzLl9maXJzdCA9IG5ld05vZGU7CiAgICAgICAgICAgICAgICBuZXdOb2RlLm5leHQgPSBvbGRGaXJzdDsKICAgICAgICAgICAgICAgIG9sZEZpcnN0LnByZXYgPSBuZXdOb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3NpemUgKz0gMTsKICAgICAgICAgICAgbGV0IGRpZFJlbW92ZSA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm4gKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKCFkaWRSZW1vdmUpIHsKICAgICAgICAgICAgICAgICAgICBkaWRSZW1vdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZShuZXdOb2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgc2hpZnQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9maXJzdCA9PT0gTm9kZS5VbmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLl9maXJzdC5lbGVtZW50OwogICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlKHRoaXMuX2ZpcnN0KTsKICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcG9wKCkgewogICAgICAgICAgICBpZiAodGhpcy5fbGFzdCA9PT0gTm9kZS5VbmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSB0aGlzLl9sYXN0LmVsZW1lbnQ7CiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmUodGhpcy5fbGFzdCk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9yZW1vdmUobm9kZSkgewogICAgICAgICAgICBpZiAobm9kZS5wcmV2ICE9PSBOb2RlLlVuZGVmaW5lZCAmJiBub2RlLm5leHQgIT09IE5vZGUuVW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAvLyBtaWRkbGUKICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvciA9IG5vZGUucHJldjsKICAgICAgICAgICAgICAgIGFuY2hvci5uZXh0ID0gbm9kZS5uZXh0OwogICAgICAgICAgICAgICAgbm9kZS5uZXh0LnByZXYgPSBhbmNob3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5wcmV2ID09PSBOb2RlLlVuZGVmaW5lZCAmJiBub2RlLm5leHQgPT09IE5vZGUuVW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAvLyBvbmx5IG5vZGUKICAgICAgICAgICAgICAgIHRoaXMuX2ZpcnN0ID0gTm9kZS5VbmRlZmluZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0ID0gTm9kZS5VbmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobm9kZS5uZXh0ID09PSBOb2RlLlVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgLy8gbGFzdAogICAgICAgICAgICAgICAgdGhpcy5fbGFzdCA9IHRoaXMuX2xhc3QucHJldjsKICAgICAgICAgICAgICAgIHRoaXMuX2xhc3QubmV4dCA9IE5vZGUuVW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG5vZGUucHJldiA9PT0gTm9kZS5VbmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIC8vIGZpcnN0CiAgICAgICAgICAgICAgICB0aGlzLl9maXJzdCA9IHRoaXMuX2ZpcnN0Lm5leHQ7CiAgICAgICAgICAgICAgICB0aGlzLl9maXJzdC5wcmV2ID0gTm9kZS5VbmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZG9uZQogICAgICAgICAgICB0aGlzLl9zaXplIC09IDE7CiAgICAgICAgfQogICAgICAgICpbU3ltYm9sLml0ZXJhdG9yXSgpIHsKICAgICAgICAgICAgbGV0IG5vZGUgPSB0aGlzLl9maXJzdDsKICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT09IE5vZGUuVW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB5aWVsZCBub2RlLmVsZW1lbnQ7CiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdmFyIF9hOwogICAgY29uc3QgTEFOR1VBR0VfREVGQVVMVCA9ICdlbic7CiAgICBsZXQgX2lzV2luZG93cyA9IGZhbHNlOwogICAgbGV0IF9pc01hY2ludG9zaCA9IGZhbHNlOwogICAgbGV0IF9pc0xpbnV4ID0gZmFsc2U7CiAgICBsZXQgX2xvY2FsZSA9IHVuZGVmaW5lZDsKICAgIGxldCBfbGFuZ3VhZ2UgPSBMQU5HVUFHRV9ERUZBVUxUOwogICAgbGV0IF90cmFuc2xhdGlvbnNDb25maWdGaWxlID0gdW5kZWZpbmVkOwogICAgbGV0IF91c2VyQWdlbnQgPSB1bmRlZmluZWQ7CiAgICBjb25zdCBnbG9iYWxzID0gKHR5cGVvZiBzZWxmID09PSAnb2JqZWN0JyA/IHNlbGYgOiB0eXBlb2YgZ2xvYmFsID09PSAnb2JqZWN0JyA/IGdsb2JhbCA6IHt9KTsKICAgIGxldCBub2RlUHJvY2VzcyA9IHVuZGVmaW5lZDsKICAgIGlmICh0eXBlb2YgZ2xvYmFscy52c2NvZGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWxzLnZzY29kZS5wcm9jZXNzICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIC8vIE5hdGl2ZSBlbnZpcm9ubWVudCAoc2FuZGJveGVkKQogICAgICAgIG5vZGVQcm9jZXNzID0gZ2xvYmFscy52c2NvZGUucHJvY2VzczsKICAgIH0KICAgIGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIC8vIE5hdGl2ZSBlbnZpcm9ubWVudCAobm9uLXNhbmRib3hlZCkKICAgICAgICBub2RlUHJvY2VzcyA9IHByb2Nlc3M7CiAgICB9CiAgICBjb25zdCBpc0VsZWN0cm9uUHJvY2VzcyA9IHR5cGVvZiAoKF9hID0gbm9kZVByb2Nlc3MgPT09IG51bGwgfHwgbm9kZVByb2Nlc3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG5vZGVQcm9jZXNzLnZlcnNpb25zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZWxlY3Ryb24pID09PSAnc3RyaW5nJzsKICAgIGNvbnN0IGlzRWxlY3Ryb25SZW5kZXJlciA9IGlzRWxlY3Ryb25Qcm9jZXNzICYmIChub2RlUHJvY2VzcyA9PT0gbnVsbCB8fCBub2RlUHJvY2VzcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogbm9kZVByb2Nlc3MudHlwZSkgPT09ICdyZW5kZXJlcic7CiAgICAvLyBXZWIgZW52aXJvbm1lbnQKICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yID09PSAnb2JqZWN0JyAmJiAhaXNFbGVjdHJvblJlbmRlcmVyKSB7CiAgICAgICAgX3VzZXJBZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICAgICAgX2lzV2luZG93cyA9IF91c2VyQWdlbnQuaW5kZXhPZignV2luZG93cycpID49IDA7CiAgICAgICAgX2lzTWFjaW50b3NoID0gX3VzZXJBZ2VudC5pbmRleE9mKCdNYWNpbnRvc2gnKSA+PSAwOwogICAgICAgIChfdXNlckFnZW50LmluZGV4T2YoJ01hY2ludG9zaCcpID49IDAgfHwgX3VzZXJBZ2VudC5pbmRleE9mKCdpUGFkJykgPj0gMCB8fCBfdXNlckFnZW50LmluZGV4T2YoJ2lQaG9uZScpID49IDApICYmICEhbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzICYmIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDA7CiAgICAgICAgX2lzTGludXggPSBfdXNlckFnZW50LmluZGV4T2YoJ0xpbnV4JykgPj0gMDsKICAgICAgICBfbG9jYWxlID0gbmF2aWdhdG9yLmxhbmd1YWdlOwogICAgICAgIF9sYW5ndWFnZSA9IF9sb2NhbGU7CiAgICB9CiAgICAvLyBOYXRpdmUgZW52aXJvbm1lbnQKICAgIGVsc2UgaWYgKHR5cGVvZiBub2RlUHJvY2VzcyA9PT0gJ29iamVjdCcpIHsKICAgICAgICBfaXNXaW5kb3dzID0gKG5vZGVQcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInKTsKICAgICAgICBfaXNNYWNpbnRvc2ggPSAobm9kZVByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nKTsKICAgICAgICBfaXNMaW51eCA9IChub2RlUHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2xpbnV4Jyk7CiAgICAgICAgX2lzTGludXggJiYgISFub2RlUHJvY2Vzcy5lbnZbJ1NOQVAnXSAmJiAhIW5vZGVQcm9jZXNzLmVudlsnU05BUF9SRVZJU0lPTiddOwogICAgICAgIF9sb2NhbGUgPSBMQU5HVUFHRV9ERUZBVUxUOwogICAgICAgIF9sYW5ndWFnZSA9IExBTkdVQUdFX0RFRkFVTFQ7CiAgICAgICAgY29uc3QgcmF3TmxzQ29uZmlnID0gbm9kZVByb2Nlc3MuZW52WydWU0NPREVfTkxTX0NPTkZJRyddOwogICAgICAgIGlmIChyYXdObHNDb25maWcpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IG5sc0NvbmZpZyA9IEpTT04ucGFyc2UocmF3TmxzQ29uZmlnKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkID0gbmxzQ29uZmlnLmF2YWlsYWJsZUxhbmd1YWdlc1snKiddOwogICAgICAgICAgICAgICAgX2xvY2FsZSA9IG5sc0NvbmZpZy5sb2NhbGU7CiAgICAgICAgICAgICAgICAvLyBWU0NvZGUncyBkZWZhdWx0IGxhbmd1YWdlIGlzICdlbicKICAgICAgICAgICAgICAgIF9sYW5ndWFnZSA9IHJlc29sdmVkID8gcmVzb2x2ZWQgOiBMQU5HVUFHRV9ERUZBVUxUOwogICAgICAgICAgICAgICAgX3RyYW5zbGF0aW9uc0NvbmZpZ0ZpbGUgPSBubHNDb25maWcuX3RyYW5zbGF0aW9uc0NvbmZpZ0ZpbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIFVua25vd24gZW52aXJvbm1lbnQKICAgIGVsc2UgewogICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuYWJsZSB0byByZXNvbHZlIHBsYXRmb3JtLicpOwogICAgfQogICAgY29uc3QgaXNXaW5kb3dzID0gX2lzV2luZG93czsKICAgIGNvbnN0IGlzTWFjaW50b3NoID0gX2lzTWFjaW50b3NoOwogICAgLyoqCiAgICAgKiBUaGUgbGFuZ3VhZ2UgdXNlZCBmb3IgdGhlIHVzZXIgaW50ZXJmYWNlLiBUaGUgZm9ybWF0IG9mCiAgICAgKiB0aGUgc3RyaW5nIGlzIGFsbCBsb3dlciBjYXNlIChlLmcuIHpoLXR3IGZvciBUcmFkaXRpb25hbAogICAgICogQ2hpbmVzZSkKICAgICAqLwogICAgY29uc3QgbGFuZ3VhZ2UgPSBfbGFuZ3VhZ2U7CiAgICAvKioKICAgICAqIFRoZSBPUyBsb2NhbGUgb3IgdGhlIGxvY2FsZSBzcGVjaWZpZWQgYnkgLS1sb2NhbGUuIFRoZSBmb3JtYXQgb2YKICAgICAqIHRoZSBzdHJpbmcgaXMgYWxsIGxvd2VyIGNhc2UgKGUuZy4gemgtdHcgZm9yIFRyYWRpdGlvbmFsCiAgICAgKiBDaGluZXNlKS4gVGhlIFVJIGlzIG5vdCBuZWNlc3NhcmlseSBzaG93biBpbiB0aGUgcHJvdmlkZWQgbG9jYWxlLgogICAgICovCiAgICBjb25zdCBsb2NhbGUgPSBfbG9jYWxlOwogICAgLyoqCiAgICAgKiBTZWUgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGltZXJzLWFuZC11c2VyLXByb21wdHMuaHRtbCM6fjp0ZXh0PXRoYW4lMjA0JTJDJTIwdGhlbi0sc2V0JTIwdGltZW91dCUyMHRvJTIwNCwtLgogICAgICoKICAgICAqIFdvcmtzIHNpbWlsYXJseSB0byBgc2V0VGltZW91dCgwKWAgYnV0IGRvZXNuJ3Qgc3VmZmVyIGZyb20gdGhlIDRtcyBhcnRpZmljaWFsIGRlbGF5CiAgICAgKiB0aGF0IGJyb3dzZXJzIHNldCB3aGVuIHRoZSBuZXN0aW5nIGxldmVsIGlzID4gNS4KICAgICAqLwogICAgY29uc3Qgc2V0VGltZW91dDAgPSAoKCkgPT4gewogICAgICAgIGlmICh0eXBlb2YgZ2xvYmFscy5wb3N0TWVzc2FnZSA9PT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFscy5pbXBvcnRTY3JpcHRzKSB7CiAgICAgICAgICAgIGxldCBwZW5kaW5nID0gW107CiAgICAgICAgICAgIGdsb2JhbHMuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZS5kYXRhICYmIGUuZGF0YS52c2NvZGVTY2hlZHVsZUFzeW5jV29yaykgewogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBwZW5kaW5nLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHBlbmRpbmdbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUuaWQgPT09IGUuZGF0YS52c2NvZGVTY2hlZHVsZUFzeW5jV29yaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUuY2FsbGJhY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGxldCBsYXN0SWQgPSAwOwogICAgICAgICAgICByZXR1cm4gKGNhbGxiYWNrKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBteUlkID0gKytsYXN0SWQ7CiAgICAgICAgICAgICAgICBwZW5kaW5nLnB1c2goewogICAgICAgICAgICAgICAgICAgIGlkOiBteUlkLAogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrOiBjYWxsYmFjawogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBnbG9iYWxzLnBvc3RNZXNzYWdlKHsgdnNjb2RlU2NoZWR1bGVBc3luY1dvcms6IG15SWQgfSwgJyonKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChjYWxsYmFjaykgPT4gc2V0VGltZW91dChjYWxsYmFjayk7CiAgICB9KSgpOwogICAgKChmdW5jdGlvbiBkZWZpbmVTZXRJbW1lZGlhdGUoKSB7CiAgICAgICAgaWYgKGdsb2JhbHMuc2V0SW1tZWRpYXRlKSB7CiAgICAgICAgICAgIHJldHVybiBnbG9iYWxzLnNldEltbWVkaWF0ZS5iaW5kKGdsb2JhbHMpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIGdsb2JhbHMucG9zdE1lc3NhZ2UgPT09ICdmdW5jdGlvbicgJiYgIWdsb2JhbHMuaW1wb3J0U2NyaXB0cykgewogICAgICAgICAgICByZXR1cm4gc2V0VGltZW91dDA7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgKG5vZGVQcm9jZXNzID09PSBudWxsIHx8IG5vZGVQcm9jZXNzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBub2RlUHJvY2Vzcy5uZXh0VGljaykgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGVQcm9jZXNzLm5leHRUaWNrLmJpbmQobm9kZVByb2Nlc3MpOwogICAgICAgIH0KICAgICAgICBjb25zdCBfcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpOwogICAgICAgIHJldHVybiAoY2FsbGJhY2spID0+IF9wcm9taXNlLnRoZW4oY2FsbGJhY2spOwogICAgfSkpKCk7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjb25zdCBoYXNQZXJmb3JtYW5jZU5vdyA9IChnbG9iYWxzLnBlcmZvcm1hbmNlICYmIHR5cGVvZiBnbG9iYWxzLnBlcmZvcm1hbmNlLm5vdyA9PT0gJ2Z1bmN0aW9uJyk7CiAgICBjbGFzcyBTdG9wV2F0Y2ggewogICAgICAgIGNvbnN0cnVjdG9yKGhpZ2hSZXNvbHV0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX2hpZ2hSZXNvbHV0aW9uID0gaGFzUGVyZm9ybWFuY2VOb3cgJiYgaGlnaFJlc29sdXRpb247CiAgICAgICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IHRoaXMuX25vdygpOwogICAgICAgICAgICB0aGlzLl9zdG9wVGltZSA9IC0xOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgY3JlYXRlKGhpZ2hSZXNvbHV0aW9uID0gdHJ1ZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFN0b3BXYXRjaChoaWdoUmVzb2x1dGlvbik7CiAgICAgICAgfQogICAgICAgIHN0b3AoKSB7CiAgICAgICAgICAgIHRoaXMuX3N0b3BUaW1lID0gdGhpcy5fbm93KCk7CiAgICAgICAgfQogICAgICAgIGVsYXBzZWQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9zdG9wVGltZSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdG9wVGltZSAtIHRoaXMuX3N0YXJ0VGltZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fbm93KCkgLSB0aGlzLl9zdGFydFRpbWU7CiAgICAgICAgfQogICAgICAgIF9ub3coKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oaWdoUmVzb2x1dGlvbiA/IGdsb2JhbHMucGVyZm9ybWFuY2Uubm93KCkgOiBEYXRlLm5vdygpOwogICAgICAgIH0KICAgIH0KCiAgICB2YXIgRXZlbnQ7CiAgICAoZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgRXZlbnQuTm9uZSA9ICgpID0+IERpc3Bvc2FibGUuTm9uZTsKICAgICAgICAvKioKICAgICAgICAgKiBHaXZlbiBhbiBldmVudCwgcmV0dXJucyBhbm90aGVyIGV2ZW50IHdoaWNoIG9ubHkgZmlyZXMgb25jZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBvbmNlKGV2ZW50KSB7CiAgICAgICAgICAgIHJldHVybiAobGlzdGVuZXIsIHRoaXNBcmdzID0gbnVsbCwgZGlzcG9zYWJsZXMpID0+IHsKICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgdGhpcywgaW4gY2FzZSB0aGUgZXZlbnQgZmlyZXMgZHVyaW5nIHRoZSBsaXN0ZW5lciBjYWxsCiAgICAgICAgICAgICAgICBsZXQgZGlkRmlyZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV2ZW50KGUgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChkaWRGaXJlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBkaWRGaXJlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyLmNhbGwodGhpc0FyZ3MsIGUpOwogICAgICAgICAgICAgICAgfSwgbnVsbCwgZGlzcG9zYWJsZXMpOwogICAgICAgICAgICAgICAgaWYgKGRpZEZpcmUpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgRXZlbnQub25jZSA9IG9uY2U7CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlcHJlY2F0ZWQgRE8gTk9UIHVzZSwgdGhpcyBsZWFrcyBtZW1vcnkKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtYXAoZXZlbnQsIG1hcCkgewogICAgICAgICAgICByZXR1cm4gc25hcHNob3QoKGxpc3RlbmVyLCB0aGlzQXJncyA9IG51bGwsIGRpc3Bvc2FibGVzKSA9PiBldmVudChpID0+IGxpc3RlbmVyLmNhbGwodGhpc0FyZ3MsIG1hcChpKSksIG51bGwsIGRpc3Bvc2FibGVzKSk7CiAgICAgICAgfQogICAgICAgIEV2ZW50Lm1hcCA9IG1hcDsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVwcmVjYXRlZCBETyBOT1QgdXNlLCB0aGlzIGxlYWtzIG1lbW9yeQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGZvckVhY2goZXZlbnQsIGVhY2gpIHsKICAgICAgICAgICAgcmV0dXJuIHNuYXBzaG90KChsaXN0ZW5lciwgdGhpc0FyZ3MgPSBudWxsLCBkaXNwb3NhYmxlcykgPT4gZXZlbnQoaSA9PiB7IGVhY2goaSk7IGxpc3RlbmVyLmNhbGwodGhpc0FyZ3MsIGkpOyB9LCBudWxsLCBkaXNwb3NhYmxlcykpOwogICAgICAgIH0KICAgICAgICBFdmVudC5mb3JFYWNoID0gZm9yRWFjaDsKICAgICAgICBmdW5jdGlvbiBmaWx0ZXIoZXZlbnQsIGZpbHRlcikgewogICAgICAgICAgICByZXR1cm4gc25hcHNob3QoKGxpc3RlbmVyLCB0aGlzQXJncyA9IG51bGwsIGRpc3Bvc2FibGVzKSA9PiBldmVudChlID0+IGZpbHRlcihlKSAmJiBsaXN0ZW5lci5jYWxsKHRoaXNBcmdzLCBlKSwgbnVsbCwgZGlzcG9zYWJsZXMpKTsKICAgICAgICB9CiAgICAgICAgRXZlbnQuZmlsdGVyID0gZmlsdGVyOwogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIGFuIGV2ZW50LCByZXR1cm5zIHRoZSBzYW1lIGV2ZW50IGJ1dCB0eXBlZCBhcyBgRXZlbnQ8dm9pZD5gLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNpZ25hbChldmVudCkgewogICAgICAgICAgICByZXR1cm4gZXZlbnQ7CiAgICAgICAgfQogICAgICAgIEV2ZW50LnNpZ25hbCA9IHNpZ25hbDsKICAgICAgICBmdW5jdGlvbiBhbnkoLi4uZXZlbnRzKSB7CiAgICAgICAgICAgIHJldHVybiAobGlzdGVuZXIsIHRoaXNBcmdzID0gbnVsbCwgZGlzcG9zYWJsZXMpID0+IGNvbWJpbmVkRGlzcG9zYWJsZSguLi5ldmVudHMubWFwKGV2ZW50ID0+IGV2ZW50KGUgPT4gbGlzdGVuZXIuY2FsbCh0aGlzQXJncywgZSksIG51bGwsIGRpc3Bvc2FibGVzKSkpOwogICAgICAgIH0KICAgICAgICBFdmVudC5hbnkgPSBhbnk7CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlcHJlY2F0ZWQgRE8gTk9UIHVzZSwgdGhpcyBsZWFrcyBtZW1vcnkKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiByZWR1Y2UoZXZlbnQsIG1lcmdlLCBpbml0aWFsKSB7CiAgICAgICAgICAgIGxldCBvdXRwdXQgPSBpbml0aWFsOwogICAgICAgICAgICByZXR1cm4gbWFwKGV2ZW50LCBlID0+IHsKICAgICAgICAgICAgICAgIG91dHB1dCA9IG1lcmdlKG91dHB1dCwgZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgRXZlbnQucmVkdWNlID0gcmVkdWNlOwogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIERPIE5PVCB1c2UsIHRoaXMgbGVha3MgbWVtb3J5CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc25hcHNob3QoZXZlbnQpIHsKICAgICAgICAgICAgbGV0IGxpc3RlbmVyOwogICAgICAgICAgICBjb25zdCBlbWl0dGVyID0gbmV3IEVtaXR0ZXIoewogICAgICAgICAgICAgICAgb25GaXJzdExpc3RlbmVyQWRkKCkgewogICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gZXZlbnQoZW1pdHRlci5maXJlLCBlbWl0dGVyKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBvbkxhc3RMaXN0ZW5lclJlbW92ZSgpIHsKICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gZW1pdHRlci5ldmVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlcHJlY2F0ZWQgRE8gTk9UIHVzZSwgdGhpcyBsZWFrcyBtZW1vcnkKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBkZWJvdW5jZShldmVudCwgbWVyZ2UsIGRlbGF5ID0gMTAwLCBsZWFkaW5nID0gZmFsc2UsIGxlYWtXYXJuaW5nVGhyZXNob2xkKSB7CiAgICAgICAgICAgIGxldCBzdWJzY3JpcHRpb247CiAgICAgICAgICAgIGxldCBvdXRwdXQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGxldCBoYW5kbGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGxldCBudW1EZWJvdW5jZWRDYWxscyA9IDA7CiAgICAgICAgICAgIGNvbnN0IGVtaXR0ZXIgPSBuZXcgRW1pdHRlcih7CiAgICAgICAgICAgICAgICBsZWFrV2FybmluZ1RocmVzaG9sZCwKICAgICAgICAgICAgICAgIG9uRmlyc3RMaXN0ZW5lckFkZCgpIHsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBldmVudChjdXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBudW1EZWJvdW5jZWRDYWxscysrOwogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBtZXJnZShvdXRwdXQsIGN1cik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZWFkaW5nICYmICFoYW5kbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZXIuZmlyZShvdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9vdXRwdXQgPSBvdXRwdXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxlYWRpbmcgfHwgbnVtRGVib3VuY2VkQ2FsbHMgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1pdHRlci5maXJlKF9vdXRwdXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRGVib3VuY2VkQ2FsbHMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9LCBkZWxheSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgb25MYXN0TGlzdGVuZXJSZW1vdmUoKSB7CiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmRpc3Bvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBlbWl0dGVyLmV2ZW50OwogICAgICAgIH0KICAgICAgICBFdmVudC5kZWJvdW5jZSA9IGRlYm91bmNlOwogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIERPIE5PVCB1c2UsIHRoaXMgbGVha3MgbWVtb3J5CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gbGF0Y2goZXZlbnQsIGVxdWFscyA9IChhLCBiKSA9PiBhID09PSBiKSB7CiAgICAgICAgICAgIGxldCBmaXJzdENhbGwgPSB0cnVlOwogICAgICAgICAgICBsZXQgY2FjaGU7CiAgICAgICAgICAgIHJldHVybiBmaWx0ZXIoZXZlbnQsIHZhbHVlID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZEVtaXQgPSBmaXJzdENhbGwgfHwgIWVxdWFscyh2YWx1ZSwgY2FjaGUpOwogICAgICAgICAgICAgICAgZmlyc3RDYWxsID0gZmFsc2U7CiAgICAgICAgICAgICAgICBjYWNoZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgcmV0dXJuIHNob3VsZEVtaXQ7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBFdmVudC5sYXRjaCA9IGxhdGNoOwogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIERPIE5PVCB1c2UsIHRoaXMgbGVha3MgbWVtb3J5CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc3BsaXQoZXZlbnQsIGlzVCkgewogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgRXZlbnQuZmlsdGVyKGV2ZW50LCBpc1QpLAogICAgICAgICAgICAgICAgRXZlbnQuZmlsdGVyKGV2ZW50LCBlID0+ICFpc1QoZSkpLAogICAgICAgICAgICBdOwogICAgICAgIH0KICAgICAgICBFdmVudC5zcGxpdCA9IHNwbGl0OwogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIERPIE5PVCB1c2UsIHRoaXMgbGVha3MgbWVtb3J5CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYnVmZmVyKGV2ZW50LCBmbHVzaEFmdGVyVGltZW91dCA9IGZhbHNlLCBfYnVmZmVyID0gW10pIHsKICAgICAgICAgICAgbGV0IGJ1ZmZlciA9IF9idWZmZXIuc2xpY2UoKTsKICAgICAgICAgICAgbGV0IGxpc3RlbmVyID0gZXZlbnQoZSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnB1c2goZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlbWl0dGVyLmZpcmUoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCBmbHVzaCA9ICgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICBidWZmZXIuZm9yRWFjaChlID0+IGVtaXR0ZXIuZmlyZShlKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBidWZmZXIgPSBudWxsOwogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCBlbWl0dGVyID0gbmV3IEVtaXR0ZXIoewogICAgICAgICAgICAgICAgb25GaXJzdExpc3RlbmVyQWRkKCkgewogICAgICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBldmVudChlID0+IGVtaXR0ZXIuZmlyZShlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG9uRmlyc3RMaXN0ZW5lckRpZEFkZCgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmbHVzaEFmdGVyVGltZW91dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmbHVzaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG9uTGFzdExpc3RlbmVyUmVtb3ZlKCkgewogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgewogICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBlbWl0dGVyLmV2ZW50OwogICAgICAgIH0KICAgICAgICBFdmVudC5idWZmZXIgPSBidWZmZXI7CiAgICAgICAgY2xhc3MgQ2hhaW5hYmxlRXZlbnQgewogICAgICAgICAgICBjb25zdHJ1Y3RvcihldmVudCkgewogICAgICAgICAgICAgICAgdGhpcy5ldmVudCA9IGV2ZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hcChmbikgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFpbmFibGVFdmVudChtYXAodGhpcy5ldmVudCwgZm4pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JFYWNoKGZuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENoYWluYWJsZUV2ZW50KGZvckVhY2godGhpcy5ldmVudCwgZm4pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaWx0ZXIoZm4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2hhaW5hYmxlRXZlbnQoZmlsdGVyKHRoaXMuZXZlbnQsIGZuKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVkdWNlKG1lcmdlLCBpbml0aWFsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENoYWluYWJsZUV2ZW50KHJlZHVjZSh0aGlzLmV2ZW50LCBtZXJnZSwgaW5pdGlhbCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhdGNoKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFpbmFibGVFdmVudChsYXRjaCh0aGlzLmV2ZW50KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVib3VuY2UobWVyZ2UsIGRlbGF5ID0gMTAwLCBsZWFkaW5nID0gZmFsc2UsIGxlYWtXYXJuaW5nVGhyZXNob2xkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENoYWluYWJsZUV2ZW50KGRlYm91bmNlKHRoaXMuZXZlbnQsIG1lcmdlLCBkZWxheSwgbGVhZGluZywgbGVha1dhcm5pbmdUaHJlc2hvbGQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvbihsaXN0ZW5lciwgdGhpc0FyZ3MsIGRpc3Bvc2FibGVzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ldmVudChsaXN0ZW5lciwgdGhpc0FyZ3MsIGRpc3Bvc2FibGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvbmNlKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvbmNlKHRoaXMuZXZlbnQpKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIERPIE5PVCB1c2UsIHRoaXMgbGVha3MgbWVtb3J5CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY2hhaW4oZXZlbnQpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGFpbmFibGVFdmVudChldmVudCk7CiAgICAgICAgfQogICAgICAgIEV2ZW50LmNoYWluID0gY2hhaW47CiAgICAgICAgZnVuY3Rpb24gZnJvbU5vZGVFdmVudEVtaXR0ZXIoZW1pdHRlciwgZXZlbnROYW1lLCBtYXAgPSBpZCA9PiBpZCkgewogICAgICAgICAgICBjb25zdCBmbiA9ICguLi5hcmdzKSA9PiByZXN1bHQuZmlyZShtYXAoLi4uYXJncykpOwogICAgICAgICAgICBjb25zdCBvbkZpcnN0TGlzdGVuZXJBZGQgPSAoKSA9PiBlbWl0dGVyLm9uKGV2ZW50TmFtZSwgZm4pOwogICAgICAgICAgICBjb25zdCBvbkxhc3RMaXN0ZW5lclJlbW92ZSA9ICgpID0+IGVtaXR0ZXIucmVtb3ZlTGlzdGVuZXIoZXZlbnROYW1lLCBmbik7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBFbWl0dGVyKHsgb25GaXJzdExpc3RlbmVyQWRkLCBvbkxhc3RMaXN0ZW5lclJlbW92ZSB9KTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5ldmVudDsKICAgICAgICB9CiAgICAgICAgRXZlbnQuZnJvbU5vZGVFdmVudEVtaXR0ZXIgPSBmcm9tTm9kZUV2ZW50RW1pdHRlcjsKICAgICAgICBmdW5jdGlvbiBmcm9tRE9NRXZlbnRFbWl0dGVyKGVtaXR0ZXIsIGV2ZW50TmFtZSwgbWFwID0gaWQgPT4gaWQpIHsKICAgICAgICAgICAgY29uc3QgZm4gPSAoLi4uYXJncykgPT4gcmVzdWx0LmZpcmUobWFwKC4uLmFyZ3MpKTsKICAgICAgICAgICAgY29uc3Qgb25GaXJzdExpc3RlbmVyQWRkID0gKCkgPT4gZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZm4pOwogICAgICAgICAgICBjb25zdCBvbkxhc3RMaXN0ZW5lclJlbW92ZSA9ICgpID0+IGVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZuKTsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEVtaXR0ZXIoeyBvbkZpcnN0TGlzdGVuZXJBZGQsIG9uTGFzdExpc3RlbmVyUmVtb3ZlIH0pOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0LmV2ZW50OwogICAgICAgIH0KICAgICAgICBFdmVudC5mcm9tRE9NRXZlbnRFbWl0dGVyID0gZnJvbURPTUV2ZW50RW1pdHRlcjsKICAgICAgICBmdW5jdGlvbiB0b1Byb21pc2UoZXZlbnQpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gb25jZShldmVudCkocmVzb2x2ZSkpOwogICAgICAgIH0KICAgICAgICBFdmVudC50b1Byb21pc2UgPSB0b1Byb21pc2U7CiAgICB9KShFdmVudCB8fCAoRXZlbnQgPSB7fSkpOwogICAgY2xhc3MgRXZlbnRQcm9maWxpbmcgewogICAgICAgIGNvbnN0cnVjdG9yKG5hbWUpIHsKICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJDb3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMuX2ludm9jYXRpb25Db3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMuX2VsYXBzZWRPdmVyYWxsID0gMDsKICAgICAgICAgICAgdGhpcy5fbmFtZSA9IGAke25hbWV9XyR7RXZlbnRQcm9maWxpbmcuX2lkUG9vbCsrfWA7CiAgICAgICAgfQogICAgICAgIHN0YXJ0KGxpc3RlbmVyQ291bnQpIHsKICAgICAgICAgICAgdGhpcy5fc3RvcFdhdGNoID0gbmV3IFN0b3BXYXRjaCh0cnVlKTsKICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJDb3VudCA9IGxpc3RlbmVyQ291bnQ7CiAgICAgICAgfQogICAgICAgIHN0b3AoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9zdG9wV2F0Y2gpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVsYXBzZWQgPSB0aGlzLl9zdG9wV2F0Y2guZWxhcHNlZCgpOwogICAgICAgICAgICAgICAgdGhpcy5fZWxhcHNlZE92ZXJhbGwgKz0gZWxhcHNlZDsKICAgICAgICAgICAgICAgIHRoaXMuX2ludm9jYXRpb25Db3VudCArPSAxOwogICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKGBkaWQgRklSRSAke3RoaXMuX25hbWV9OiBlbGFwc2VkX21zOiAke2VsYXBzZWQudG9GaXhlZCg1KX0sIGxpc3RlbmVyOiAke3RoaXMuX2xpc3RlbmVyQ291bnR9IChlbGFwc2VkX292ZXJhbGw6ICR7dGhpcy5fZWxhcHNlZE92ZXJhbGwudG9GaXhlZCgyKX0sIGludm9jYXRpb25zOiAke3RoaXMuX2ludm9jYXRpb25Db3VudH0pYCk7CiAgICAgICAgICAgICAgICB0aGlzLl9zdG9wV2F0Y2ggPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBFdmVudFByb2ZpbGluZy5faWRQb29sID0gMDsKICAgIC8qKgogICAgICogVGhlIEVtaXR0ZXIgY2FuIGJlIHVzZWQgdG8gZXhwb3NlIGFuIEV2ZW50IHRvIHRoZSBwdWJsaWMKICAgICAqIHRvIGZpcmUgaXQgZnJvbSB0aGUgaW5zaWRlcy4KICAgICAqIFNhbXBsZToKICAgICAgICBjbGFzcyBEb2N1bWVudCB7CgogICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9vbkRpZENoYW5nZSA9IG5ldyBFbWl0dGVyPCh2YWx1ZTpzdHJpbmcpPT5hbnk+KCk7CgogICAgICAgICAgICBwdWJsaWMgb25EaWRDaGFuZ2UgPSB0aGlzLl9vbkRpZENoYW5nZS5ldmVudDsKCiAgICAgICAgICAgIC8vIGdldHRlci1zdHlsZQogICAgICAgICAgICAvLyBnZXQgb25EaWRDaGFuZ2UoKTogRXZlbnQ8KHZhbHVlOnN0cmluZyk9PmFueT4gewogICAgICAgICAgICAvLyAJcmV0dXJuIHRoaXMuX29uRGlkQ2hhbmdlLmV2ZW50OwogICAgICAgICAgICAvLyB9CgogICAgICAgICAgICBwcml2YXRlIF9kb0l0KCkgewogICAgICAgICAgICAgICAgLy8uLi4KICAgICAgICAgICAgICAgIHRoaXMuX29uRGlkQ2hhbmdlLmZpcmUodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICovCiAgICBjbGFzcyBFbWl0dGVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAgICAgICAgIHZhciBfYTsKICAgICAgICAgICAgdGhpcy5fZGlzcG9zZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fb3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIHRoaXMuX2xlYWthZ2VNb24gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMuX3BlcmZNb24gPSAoKF9hID0gdGhpcy5fb3B0aW9ucykgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLl9wcm9mTmFtZSkgPyBuZXcgRXZlbnRQcm9maWxpbmcodGhpcy5fb3B0aW9ucy5fcHJvZk5hbWUpIDogdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmUKICAgICAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXIKICAgICAgICAgKi8KICAgICAgICBnZXQgZXZlbnQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHsKICAgICAgICAgICAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9saXN0ZW5lcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gbmV3IExpbmtlZExpc3QoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RMaXN0ZW5lciA9IHRoaXMuX2xpc3RlbmVycy5pc0VtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0TGlzdGVuZXIgJiYgdGhpcy5fb3B0aW9ucyAmJiB0aGlzLl9vcHRpb25zLm9uRmlyc3RMaXN0ZW5lckFkZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLm9uRmlyc3RMaXN0ZW5lckFkZCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlID0gdGhpcy5fbGlzdGVuZXJzLnB1c2goIXRoaXNBcmdzID8gbGlzdGVuZXIgOiBbbGlzdGVuZXIsIHRoaXNBcmdzXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0TGlzdGVuZXIgJiYgdGhpcy5fb3B0aW9ucyAmJiB0aGlzLl9vcHRpb25zLm9uRmlyc3RMaXN0ZW5lckRpZEFkZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLm9uRmlyc3RMaXN0ZW5lckRpZEFkZCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMgJiYgdGhpcy5fb3B0aW9ucy5vbkxpc3RlbmVyRGlkQWRkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MaXN0ZW5lckRpZEFkZCh0aGlzLCBsaXN0ZW5lciwgdGhpc0FyZ3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBhbmQgcmVjb3JkIHRoaXMgZW1pdHRlciBmb3IgcG90ZW50aWFsIGxlYWthZ2UKICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVNb25pdG9yID0gKF9hID0gdGhpcy5fbGVha2FnZU1vbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNoZWNrKHRoaXMuX2xpc3RlbmVycy5zaXplKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0b0Rpc3Bvc2FibGUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVtb3ZlTW9uaXRvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTW9uaXRvcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZGlzcG9zZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX29wdGlvbnMgJiYgdGhpcy5fb3B0aW9ucy5vbkxhc3RMaXN0ZW5lclJlbW92ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0xpc3RlbmVycyA9ICh0aGlzLl9saXN0ZW5lcnMgJiYgIXRoaXMuX2xpc3RlbmVycy5pc0VtcHR5KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzTGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2FibGVzIGluc3RhbmNlb2YgRGlzcG9zYWJsZVN0b3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Bvc2FibGVzLmFkZChyZXN1bHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ldmVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG8KICAgICAgICAgKiBzdWJzY3JpYmVycwogICAgICAgICAqLwogICAgICAgIGZpcmUoZXZlbnQpIHsKICAgICAgICAgICAgdmFyIF9hLCBfYjsKICAgICAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVycykgewogICAgICAgICAgICAgICAgLy8gcHV0IGFsbCBbbGlzdGVuZXIsZXZlbnRdLXBhaXJzIGludG8gZGVsaXZlcnkgcXVldWUKICAgICAgICAgICAgICAgIC8vIHRoZW4gZW1pdCBhbGwgZXZlbnQuIGFuIGlubmVyL25lc3RlZCBldmVudCBtaWdodCBiZQogICAgICAgICAgICAgICAgLy8gdGhlIGRyaXZlciBvZiB0aGlzCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2RlbGl2ZXJ5UXVldWUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWxpdmVyeVF1ZXVlID0gbmV3IExpbmtlZExpc3QoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAobGV0IGxpc3RlbmVyIG9mIHRoaXMuX2xpc3RlbmVycykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGl2ZXJ5UXVldWUucHVzaChbbGlzdGVuZXIsIGV2ZW50XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBzdGFydC9zdG9wIHBlcmZvcm1hbmNlIGluc2lnaHQgY29sbGVjdGlvbgogICAgICAgICAgICAgICAgKF9hID0gdGhpcy5fcGVyZk1vbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0YXJ0KHRoaXMuX2RlbGl2ZXJ5UXVldWUuc2l6ZSk7CiAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5fZGVsaXZlcnlRdWV1ZS5zaXplID4gMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IFtsaXN0ZW5lciwgZXZlbnRdID0gdGhpcy5fZGVsaXZlcnlRdWV1ZS5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbGlzdGVuZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLmNhbGwodW5kZWZpbmVkLCBldmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclswXS5jYWxsKGxpc3RlbmVyWzFdLCBldmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb25VbmV4cGVjdGVkRXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKF9iID0gdGhpcy5fcGVyZk1vbikgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLnN0b3AoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkaXNwb3NlKCkgewogICAgICAgICAgICB2YXIgX2EsIF9iLCBfYywgX2QsIF9lOwogICAgICAgICAgICBpZiAoIXRoaXMuX2Rpc3Bvc2VkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwb3NlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAoX2EgPSB0aGlzLl9saXN0ZW5lcnMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jbGVhcigpOwogICAgICAgICAgICAgICAgKF9iID0gdGhpcy5fZGVsaXZlcnlRdWV1ZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNsZWFyKCk7CiAgICAgICAgICAgICAgICAoX2QgPSAoX2MgPSB0aGlzLl9vcHRpb25zKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Mub25MYXN0TGlzdGVuZXJSZW1vdmUpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5jYWxsKF9jKTsKICAgICAgICAgICAgICAgIChfZSA9IHRoaXMuX2xlYWthZ2VNb24pID09PSBudWxsIHx8IF9lID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZS5kaXNwb3NlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJucyB3aGV0aGVyIHRoZSBwcm92aWRlZCBwYXJhbWV0ZXIgaXMgYSBKYXZhU2NyaXB0IEFycmF5IG9yIG5vdC4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0QWxsUHJvcGVydHlOYW1lcyhvYmopIHsKICAgICAgICBsZXQgcmVzID0gW107CiAgICAgICAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7CiAgICAgICAgd2hpbGUgKE9iamVjdC5wcm90b3R5cGUgIT09IHByb3RvKSB7CiAgICAgICAgICAgIHJlcyA9IHJlcy5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMocHJvdG8pKTsKICAgICAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgfQogICAgZnVuY3Rpb24gZ2V0QWxsTWV0aG9kTmFtZXMob2JqKSB7CiAgICAgICAgY29uc3QgbWV0aG9kcyA9IFtdOwogICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBnZXRBbGxQcm9wZXJ0eU5hbWVzKG9iaikpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpbcHJvcF0gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIG1ldGhvZHMucHVzaChwcm9wKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbWV0aG9kczsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVByb3h5T2JqZWN0JDEobWV0aG9kTmFtZXMsIGludm9rZSkgewogICAgICAgIGNvbnN0IGNyZWF0ZVByb3h5TWV0aG9kID0gKG1ldGhvZCkgPT4gewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gaW52b2tlKG1ldGhvZCwgYXJncyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBsZXQgcmVzdWx0ID0ge307CiAgICAgICAgZm9yIChjb25zdCBtZXRob2ROYW1lIG9mIG1ldGhvZE5hbWVzKSB7CiAgICAgICAgICAgIHJlc3VsdFttZXRob2ROYW1lXSA9IGNyZWF0ZVByb3h5TWV0aG9kKG1ldGhvZE5hbWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gYXNzZXJ0TmV2ZXIodmFsdWUsIG1lc3NhZ2UgPSAnVW5yZWFjaGFibGUnKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgLyoqCiAgICAgKiBFc2NhcGVzIHJlZ3VsYXIgZXhwcmVzc2lvbiBjaGFyYWN0ZXJzIGluIGEgZ2l2ZW4gc3RyaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cENoYXJhY3RlcnModmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvW1xcXHtcfVwqXCtcP1x8XF5cJFwuXFtcXVwoXCldL2csICdcXCQmJyk7CiAgICB9CiAgICBmdW5jdGlvbiBzcGxpdExpbmVzKHN0cikgewogICAgICAgIHJldHVybiBzdHIuc3BsaXQoL1xyXG58XHJ8XG4vKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBmaXJzdCBpbmRleCBvZiB0aGUgc3RyaW5nIHRoYXQgaXMgbm90IHdoaXRlc3BhY2UuCiAgICAgKiBJZiBzdHJpbmcgaXMgZW1wdHkgb3IgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlcywgcmV0dXJucyAtMQogICAgICovCiAgICBmdW5jdGlvbiBmaXJzdE5vbldoaXRlc3BhY2VJbmRleChzdHIpIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc3RyLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IGNoQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoY2hDb2RlICE9PSAzMiAvKiBTcGFjZSAqLyAmJiBjaENvZGUgIT09IDkgLyogVGFiICovKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgbGFzdCBpbmRleCBvZiB0aGUgc3RyaW5nIHRoYXQgaXMgbm90IHdoaXRlc3BhY2UuCiAgICAgKiBJZiBzdHJpbmcgaXMgZW1wdHkgb3IgY29udGFpbnMgb25seSB3aGl0ZXNwYWNlcywgcmV0dXJucyAtMQogICAgICovCiAgICBmdW5jdGlvbiBsYXN0Tm9uV2hpdGVzcGFjZUluZGV4KHN0ciwgc3RhcnRJbmRleCA9IHN0ci5sZW5ndGggLSAxKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIGNvbnN0IGNoQ29kZSA9IHN0ci5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICBpZiAoY2hDb2RlICE9PSAzMiAvKiBTcGFjZSAqLyAmJiBjaENvZGUgIT09IDkgLyogVGFiICovKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBmdW5jdGlvbiBjb21wYXJlU3Vic3RyaW5nKGEsIGIsIGFTdGFydCA9IDAsIGFFbmQgPSBhLmxlbmd0aCwgYlN0YXJ0ID0gMCwgYkVuZCA9IGIubGVuZ3RoKSB7CiAgICAgICAgZm9yICg7IGFTdGFydCA8IGFFbmQgJiYgYlN0YXJ0IDwgYkVuZDsgYVN0YXJ0KyssIGJTdGFydCsrKSB7CiAgICAgICAgICAgIGxldCBjb2RlQSA9IGEuY2hhckNvZGVBdChhU3RhcnQpOwogICAgICAgICAgICBsZXQgY29kZUIgPSBiLmNoYXJDb2RlQXQoYlN0YXJ0KTsKICAgICAgICAgICAgaWYgKGNvZGVBIDwgY29kZUIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChjb2RlQSA+IGNvZGVCKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBhTGVuID0gYUVuZCAtIGFTdGFydDsKICAgICAgICBjb25zdCBiTGVuID0gYkVuZCAtIGJTdGFydDsKICAgICAgICBpZiAoYUxlbiA8IGJMZW4pIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChhTGVuID4gYkxlbikgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBmdW5jdGlvbiBjb21wYXJlU3Vic3RyaW5nSWdub3JlQ2FzZShhLCBiLCBhU3RhcnQgPSAwLCBhRW5kID0gYS5sZW5ndGgsIGJTdGFydCA9IDAsIGJFbmQgPSBiLmxlbmd0aCkgewogICAgICAgIGZvciAoOyBhU3RhcnQgPCBhRW5kICYmIGJTdGFydCA8IGJFbmQ7IGFTdGFydCsrLCBiU3RhcnQrKykgewogICAgICAgICAgICBsZXQgY29kZUEgPSBhLmNoYXJDb2RlQXQoYVN0YXJ0KTsKICAgICAgICAgICAgbGV0IGNvZGVCID0gYi5jaGFyQ29kZUF0KGJTdGFydCk7CiAgICAgICAgICAgIGlmIChjb2RlQSA9PT0gY29kZUIpIHsKICAgICAgICAgICAgICAgIC8vIGVxdWFsCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29kZUEgPj0gMTI4IHx8IGNvZGVCID49IDEyOCkgewogICAgICAgICAgICAgICAgLy8gbm90IEFTQ0lJIGxldHRlcnMgLT4gZmFsbGJhY2sgdG8gbG93ZXItY2FzaW5nIHN0cmluZ3MKICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlU3Vic3RyaW5nKGEudG9Mb3dlckNhc2UoKSwgYi50b0xvd2VyQ2FzZSgpLCBhU3RhcnQsIGFFbmQsIGJTdGFydCwgYkVuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gbWFwcGVyIGxvd2VyLWNhc2UgYXNjaWkgbGV0dGVyIG9udG8gdXBwZXItY2FzZSB2YXJpbmF0cwogICAgICAgICAgICAvLyBbOTctMTIyXSAobG93ZXIgYXNjaWkpIC0tPiBbNjUtOTBdICh1cHBlciBhc2NpaSkKICAgICAgICAgICAgaWYgKGlzTG93ZXJBc2NpaUxldHRlcihjb2RlQSkpIHsKICAgICAgICAgICAgICAgIGNvZGVBIC09IDMyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc0xvd2VyQXNjaWlMZXR0ZXIoY29kZUIpKSB7CiAgICAgICAgICAgICAgICBjb2RlQiAtPSAzMjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBjb21wYXJlIGJvdGggY29kZSBwb2ludHMKICAgICAgICAgICAgY29uc3QgZGlmZiA9IGNvZGVBIC0gY29kZUI7CiAgICAgICAgICAgIGlmIChkaWZmID09PSAwKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGlmZjsKICAgICAgICB9CiAgICAgICAgY29uc3QgYUxlbiA9IGFFbmQgLSBhU3RhcnQ7CiAgICAgICAgY29uc3QgYkxlbiA9IGJFbmQgLSBiU3RhcnQ7CiAgICAgICAgaWYgKGFMZW4gPCBiTGVuKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYUxlbiA+IGJMZW4pIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgfQogICAgZnVuY3Rpb24gaXNMb3dlckFzY2lpTGV0dGVyKGNvZGUpIHsKICAgICAgICByZXR1cm4gY29kZSA+PSA5NyAvKiBhICovICYmIGNvZGUgPD0gMTIyIC8qIHogKi87CiAgICB9CiAgICBmdW5jdGlvbiBpc1VwcGVyQXNjaWlMZXR0ZXIoY29kZSkgewogICAgICAgIHJldHVybiBjb2RlID49IDY1IC8qIEEgKi8gJiYgY29kZSA8PSA5MCAvKiBaICovOwogICAgfQogICAgZnVuY3Rpb24gc3RhcnRzV2l0aElnbm9yZUNhc2Uoc3RyLCBjYW5kaWRhdGUpIHsKICAgICAgICBjb25zdCBjYW5kaWRhdGVMZW5ndGggPSBjYW5kaWRhdGUubGVuZ3RoOwogICAgICAgIGlmIChjYW5kaWRhdGUubGVuZ3RoID4gc3RyLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb21wYXJlU3Vic3RyaW5nSWdub3JlQ2FzZShzdHIsIGNhbmRpZGF0ZSwgMCwgY2FuZGlkYXRlTGVuZ3RoKSA9PT0gMDsKICAgIH0KICAgIC8qKgogICAgICogU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3Vycm9nYXRlX3BhaXIKICAgICAqLwogICAgZnVuY3Rpb24gaXNIaWdoU3Vycm9nYXRlKGNoYXJDb2RlKSB7CiAgICAgICAgcmV0dXJuICgweEQ4MDAgPD0gY2hhckNvZGUgJiYgY2hhckNvZGUgPD0gMHhEQkZGKTsKICAgIH0KICAgIC8qKgogICAgICogU2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3Vycm9nYXRlX3BhaXIKICAgICAqLwogICAgZnVuY3Rpb24gaXNMb3dTdXJyb2dhdGUoY2hhckNvZGUpIHsKICAgICAgICByZXR1cm4gKDB4REMwMCA8PSBjaGFyQ29kZSAmJiBjaGFyQ29kZSA8PSAweERGRkYpOwogICAgfQogICAgLyoqCiAgICAgKiBTZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TdXJyb2dhdGVfcGFpcgogICAgICovCiAgICBmdW5jdGlvbiBjb21wdXRlQ29kZVBvaW50KGhpZ2hTdXJyb2dhdGUsIGxvd1N1cnJvZ2F0ZSkgewogICAgICAgIHJldHVybiAoKGhpZ2hTdXJyb2dhdGUgLSAweEQ4MDApIDw8IDEwKSArIChsb3dTdXJyb2dhdGUgLSAweERDMDApICsgMHgxMDAwMDsKICAgIH0KICAgIC8qKgogICAgICogZ2V0IHRoZSBjb2RlIHBvaW50IHRoYXQgYmVnaW5zIGF0IG9mZnNldCBgb2Zmc2V0YAogICAgICovCiAgICBmdW5jdGlvbiBnZXROZXh0Q29kZVBvaW50KHN0ciwgbGVuLCBvZmZzZXQpIHsKICAgICAgICBjb25zdCBjaGFyQ29kZSA9IHN0ci5jaGFyQ29kZUF0KG9mZnNldCk7CiAgICAgICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZShjaGFyQ29kZSkgJiYgb2Zmc2V0ICsgMSA8IGxlbikgewogICAgICAgICAgICBjb25zdCBuZXh0Q2hhckNvZGUgPSBzdHIuY2hhckNvZGVBdChvZmZzZXQgKyAxKTsKICAgICAgICAgICAgaWYgKGlzTG93U3Vycm9nYXRlKG5leHRDaGFyQ29kZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb21wdXRlQ29kZVBvaW50KGNoYXJDb2RlLCBuZXh0Q2hhckNvZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjaGFyQ29kZTsKICAgIH0KICAgIGNsYXNzIEFtYmlndW91c0NoYXJhY3RlcnMgewogICAgICAgIHN0YXRpYyBnZXREYXRhKCkgewogICAgICAgICAgICAvLyBTdG9yZWQgYXMga2V5MSwgdmFsdWUxLCBrZXkyLCB2YWx1ZTIsIC4uLgogICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSgne1wiX2NvbW1vblwiOls4MjMyLDMyLDgyMzMsMzIsNTc2MCwzMiw4MTkyLDMyLDgxOTMsMzIsODE5NCwzMiw4MTk1LDMyLDgxOTYsMzIsODE5NywzMiw4MTk4LDMyLDgyMDAsMzIsODIwMSwzMiw4MjAyLDMyLDgyODcsMzIsODE5OSwzMiw4MjM5LDMyLDIwNDIsOTUsNjUxMDEsOTUsNjUxMDIsOTUsNjUxMDMsOTUsODIwOCw0NSw4MjA5LDQ1LDgyMTAsNDUsNjUxMTIsNDUsMTc0OCw0NSw4MjU5LDQ1LDcyNyw0NSw4NzIyLDQ1LDEwMTM0LDQ1LDExNDUwLDQ1LDE1NDksNDQsMTY0Myw0NCw4MjE4LDQ0LDE4NCw0NCw0MjIzMyw0NCw4OTQsNTksMjMwNyw1OCwyNjkxLDU4LDE0MTcsNTgsMTc5NSw1OCwxNzk2LDU4LDU4NjgsNTgsNjUwNzIsNTgsNjE0Nyw1OCw2MTUzLDU4LDgyODIsNTgsMTQ3NSw1OCw3NjAsNTgsNDI4ODksNTgsODc1OCw1OCw3MjAsNTgsNDIyMzcsNTgsNDUxLDMzLDExNjAxLDMzLDY2MCw2Myw1NzcsNjMsMjQyOSw2Myw1MDM4LDYzLDQyNzMxLDYzLDExOTE0OSw0Niw4MjI4LDQ2LDE3OTMsNDYsMTc5NCw0Niw0MjUxMCw0Niw2ODE3Niw0NiwxNjMyLDQ2LDE3NzYsNDYsNDIyMzIsNDYsMTM3Myw5Niw2NTI4Nyw5Niw4MjE5LDk2LDgyNDIsOTYsMTM3MCw5NiwxNTIzLDk2LDgxNzUsOTYsNjUzNDQsOTYsOTAwLDk2LDgxODksOTYsODEyNSw5Niw4MTI3LDk2LDgxOTAsOTYsNjk3LDk2LDg4NCw5Niw3MTIsOTYsNzE0LDk2LDcxNSw5Niw3NTYsOTYsNjk5LDk2LDcwMSw5Niw3MDAsOTYsNzAyLDk2LDQyODkyLDk2LDE0OTcsOTYsMjAzNiw5NiwyMDM3LDk2LDUxOTQsOTYsNTgzNiw5Niw5NDAzMyw5Niw5NDAzNCw5Niw2NTMzOSw0MCwxMDA4OCw0MCwxMDA5OCw0MCwxMjMwOCw0MCw2NDgzMCw0MCw2NTM0MSw0MSwxMDA4OSw0MSwxMDA5OSw0MSwxMjMwOSw0MSw2NDgzMSw0MSwxMDEwMCwxMjMsMTE5MDYwLDEyMywxMDEwMSwxMjUsODI3MCw0MiwxNjQ1LDQyLDg3MjcsNDIsNjYzMzUsNDIsNTk0MSw0Nyw4MjU3LDQ3LDg3MjUsNDcsODI2MCw0Nyw5NTg1LDQ3LDEwMTg3LDQ3LDEwNzQ0LDQ3LDExOTM1NCw0NywxMjc1NSw0NywxMjMzOSw0NywxMTQ2Miw0NywyMDAzMSw0NywxMjAzNSw0Nyw2NTM0MCw5Miw2NTEyOCw5Miw4NzI2LDkyLDEwMTg5LDkyLDEwNzQxLDkyLDEwNzQ1LDkyLDExOTMxMSw5MiwxMTkzNTUsOTIsMTI3NTYsOTIsMjAwMjIsOTIsMTIwMzQsOTIsNDI4NzIsMzgsNzA4LDk0LDcxMCw5NCw1ODY5LDQzLDEwMTMzLDQzLDY2MjAzLDQzLDgyNDksNjAsMTAwOTQsNjAsNzA2LDYwLDExOTM1MCw2MCw1MTc2LDYwLDU4MTAsNjAsNTEyMCw2MSwxMTg0MCw2MSwxMjQ0OCw2MSw0MjIzOSw2MSw4MjUwLDYyLDEwMDk1LDYyLDcwNyw2MiwxMTkzNTEsNjIsNTE3MSw2Miw5NDAxNSw2Miw4Mjc1LDEyNiw3MzIsMTI2LDgxMjgsMTI2LDg3NjQsMTI2LDEyMDc4NCw1MCwxMjA3OTQsNTAsMTIwODA0LDUwLDEyMDgxNCw1MCwxMjA4MjQsNTAsMTMwMDM0LDUwLDQyODQyLDUwLDQyMyw1MCwxMDAwLDUwLDQyNTY0LDUwLDUzMTEsNTAsNDI3MzUsNTAsMTE5MzAyLDUxLDEyMDc4NSw1MSwxMjA3OTUsNTEsMTIwODA1LDUxLDEyMDgxNSw1MSwxMjA4MjUsNTEsMTMwMDM1LDUxLDQyOTIzLDUxLDU0MCw1MSw0MzksNTEsNDI4NTgsNTEsMTE0NjgsNTEsMTI0OCw1MSw5NDAxMSw1MSw3MTg4Miw1MSwxMjA3ODYsNTIsMTIwNzk2LDUyLDEyMDgwNiw1MiwxMjA4MTYsNTIsMTIwODI2LDUyLDEzMDAzNiw1Miw1MDcwLDUyLDcxODU1LDUyLDEyMDc4Nyw1MywxMjA3OTcsNTMsMTIwODA3LDUzLDEyMDgxNyw1MywxMjA4MjcsNTMsMTMwMDM3LDUzLDQ0NCw1Myw3MTg2Nyw1MywxMjA3ODgsNTQsMTIwNzk4LDU0LDEyMDgwOCw1NCwxMjA4MTgsNTQsMTIwODI4LDU0LDEzMDAzOCw1NCwxMTQ3NCw1NCw1MTAyLDU0LDcxODkzLDU0LDExOTMxNCw1NSwxMjA3ODksNTUsMTIwNzk5LDU1LDEyMDgwOSw1NSwxMjA4MTksNTUsMTIwODI5LDU1LDEzMDAzOSw1NSw2Njc3MCw1NSw3MTg3OCw1NSwyODE5LDU2LDI1MzgsNTYsMjY2Niw1NiwxMjUxMzEsNTYsMTIwNzkwLDU2LDEyMDgwMCw1NiwxMjA4MTAsNTYsMTIwODIwLDU2LDEyMDgzMCw1NiwxMzAwNDAsNTYsNTQ3LDU2LDU0Niw1Niw2NjMzMCw1NiwyNjYzLDU3LDI5MjAsNTcsMjU0MSw1NywzNDM3LDU3LDEyMDc5MSw1NywxMjA4MDEsNTcsMTIwODExLDU3LDEyMDgyMSw1NywxMjA4MzEsNTcsMTMwMDQxLDU3LDQyODYyLDU3LDExNDY2LDU3LDcxODg0LDU3LDcxODUyLDU3LDcxODk0LDU3LDkwODIsOTcsNjUzNDUsOTcsMTE5ODM0LDk3LDExOTg4Niw5NywxMTk5MzgsOTcsMTE5OTkwLDk3LDEyMDA0Miw5NywxMjAwOTQsOTcsMTIwMTQ2LDk3LDEyMDE5OCw5NywxMjAyNTAsOTcsMTIwMzAyLDk3LDEyMDM1NCw5NywxMjA0MDYsOTcsMTIwNDU4LDk3LDU5Myw5Nyw5NDUsOTcsMTIwNTE0LDk3LDEyMDU3Miw5NywxMjA2MzAsOTcsMTIwNjg4LDk3LDEyMDc0Niw5Nyw2NTMxMyw2NSwxMTk4MDgsNjUsMTE5ODYwLDY1LDExOTkxMiw2NSwxMTk5NjQsNjUsMTIwMDE2LDY1LDEyMDA2OCw2NSwxMjAxMjAsNjUsMTIwMTcyLDY1LDEyMDIyNCw2NSwxMjAyNzYsNjUsMTIwMzI4LDY1LDEyMDM4MCw2NSwxMjA0MzIsNjUsOTEzLDY1LDEyMDQ4OCw2NSwxMjA1NDYsNjUsMTIwNjA0LDY1LDEyMDY2Miw2NSwxMjA3MjAsNjUsNTAzNCw2NSw1NTczLDY1LDQyMjIyLDY1LDk0MDE2LDY1LDY2MjA4LDY1LDExOTgzNSw5OCwxMTk4ODcsOTgsMTE5OTM5LDk4LDExOTk5MSw5OCwxMjAwNDMsOTgsMTIwMDk1LDk4LDEyMDE0Nyw5OCwxMjAxOTksOTgsMTIwMjUxLDk4LDEyMDMwMyw5OCwxMjAzNTUsOTgsMTIwNDA3LDk4LDEyMDQ1OSw5OCwzODgsOTgsNTA3MSw5OCw1MjM0LDk4LDU1NTEsOTgsNjUzMTQsNjYsODQ5Miw2NiwxMTk4MDksNjYsMTE5ODYxLDY2LDExOTkxMyw2NiwxMjAwMTcsNjYsMTIwMDY5LDY2LDEyMDEyMSw2NiwxMjAxNzMsNjYsMTIwMjI1LDY2LDEyMDI3Nyw2NiwxMjAzMjksNjYsMTIwMzgxLDY2LDEyMDQzMyw2Niw0MjkzMiw2Niw5MTQsNjYsMTIwNDg5LDY2LDEyMDU0Nyw2NiwxMjA2MDUsNjYsMTIwNjYzLDY2LDEyMDcyMSw2Niw1MTA4LDY2LDU2MjMsNjYsNDIxOTIsNjYsNjYxNzgsNjYsNjYyMDksNjYsNjYzMDUsNjYsNjUzNDcsOTksODU3Myw5OSwxMTk4MzYsOTksMTE5ODg4LDk5LDExOTk0MCw5OSwxMTk5OTIsOTksMTIwMDQ0LDk5LDEyMDA5Niw5OSwxMjAxNDgsOTksMTIwMjAwLDk5LDEyMDI1Miw5OSwxMjAzMDQsOTksMTIwMzU2LDk5LDEyMDQwOCw5OSwxMjA0NjAsOTksNzQyOCw5OSwxMDEwLDk5LDExNDI5LDk5LDQzOTUxLDk5LDY2NjIxLDk5LDEyODg0NCw2Nyw3MTkyMiw2Nyw3MTkxMyw2Nyw2NTMxNSw2Nyw4NTU3LDY3LDg0NTAsNjcsODQ5Myw2NywxMTk4MTAsNjcsMTE5ODYyLDY3LDExOTkxNCw2NywxMTk5NjYsNjcsMTIwMDE4LDY3LDEyMDE3NCw2NywxMjAyMjYsNjcsMTIwMjc4LDY3LDEyMDMzMCw2NywxMjAzODIsNjcsMTIwNDM0LDY3LDEwMTcsNjcsMTE0MjgsNjcsNTA4Nyw2Nyw0MjIwMiw2Nyw2NjIxMCw2Nyw2NjMwNiw2Nyw2NjU4MSw2Nyw2Njg0NCw2Nyw4NTc0LDEwMCw4NTE4LDEwMCwxMTk4MzcsMTAwLDExOTg4OSwxMDAsMTE5OTQxLDEwMCwxMTk5OTMsMTAwLDEyMDA0NSwxMDAsMTIwMDk3LDEwMCwxMjAxNDksMTAwLDEyMDIwMSwxMDAsMTIwMjUzLDEwMCwxMjAzMDUsMTAwLDEyMDM1NywxMDAsMTIwNDA5LDEwMCwxMjA0NjEsMTAwLDEyODEsMTAwLDUwOTUsMTAwLDUyMzEsMTAwLDQyMTk0LDEwMCw4NTU4LDY4LDg1MTcsNjgsMTE5ODExLDY4LDExOTg2Myw2OCwxMTk5MTUsNjgsMTE5OTY3LDY4LDEyMDAxOSw2OCwxMjAwNzEsNjgsMTIwMTIzLDY4LDEyMDE3NSw2OCwxMjAyMjcsNjgsMTIwMjc5LDY4LDEyMDMzMSw2OCwxMjAzODMsNjgsMTIwNDM1LDY4LDUwMjQsNjgsNTU5OCw2OCw1NjEwLDY4LDQyMTk1LDY4LDg0OTQsMTAxLDY1MzQ5LDEwMSw4NDk1LDEwMSw4NTE5LDEwMSwxMTk4MzgsMTAxLDExOTg5MCwxMDEsMTE5OTQyLDEwMSwxMjAwNDYsMTAxLDEyMDA5OCwxMDEsMTIwMTUwLDEwMSwxMjAyMDIsMTAxLDEyMDI1NCwxMDEsMTIwMzA2LDEwMSwxMjAzNTgsMTAxLDEyMDQxMCwxMDEsMTIwNDYyLDEwMSw0MzgyNiwxMDEsMTIxMywxMDEsODk1OSw2OSw2NTMxNyw2OSw4NDk2LDY5LDExOTgxMiw2OSwxMTk4NjQsNjksMTE5OTE2LDY5LDEyMDAyMCw2OSwxMjAwNzIsNjksMTIwMTI0LDY5LDEyMDE3Niw2OSwxMjAyMjgsNjksMTIwMjgwLDY5LDEyMDMzMiw2OSwxMjAzODQsNjksMTIwNDM2LDY5LDkxNyw2OSwxMjA0OTIsNjksMTIwNTUwLDY5LDEyMDYwOCw2OSwxMjA2NjYsNjksMTIwNzI0LDY5LDExNTc3LDY5LDUwMzYsNjksNDIyMjQsNjksNzE4NDYsNjksNzE4NTQsNjksNjYxODIsNjksMTE5ODM5LDEwMiwxMTk4OTEsMTAyLDExOTk0MywxMDIsMTE5OTk1LDEwMiwxMjAwNDcsMTAyLDEyMDA5OSwxMDIsMTIwMTUxLDEwMiwxMjAyMDMsMTAyLDEyMDI1NSwxMDIsMTIwMzA3LDEwMiwxMjAzNTksMTAyLDEyMDQxMSwxMDIsMTIwNDYzLDEwMiw0MzgyOSwxMDIsNDI5MDUsMTAyLDM4MywxMDIsNzgzNywxMDIsMTQxMiwxMDIsMTE5MzE1LDcwLDg0OTcsNzAsMTE5ODEzLDcwLDExOTg2NSw3MCwxMTk5MTcsNzAsMTIwMDIxLDcwLDEyMDA3Myw3MCwxMjAxMjUsNzAsMTIwMTc3LDcwLDEyMDIyOSw3MCwxMjAyODEsNzAsMTIwMzMzLDcwLDEyMDM4NSw3MCwxMjA0MzcsNzAsNDI5MDQsNzAsOTg4LDcwLDEyMDc3OCw3MCw1NTU2LDcwLDQyMjA1LDcwLDcxODc0LDcwLDcxODQyLDcwLDY2MTgzLDcwLDY2MjEzLDcwLDY2ODUzLDcwLDY1MzUxLDEwMyw4NDU4LDEwMywxMTk4NDAsMTAzLDExOTg5MiwxMDMsMTE5OTQ0LDEwMywxMjAwNDgsMTAzLDEyMDEwMCwxMDMsMTIwMTUyLDEwMywxMjAyMDQsMTAzLDEyMDI1NiwxMDMsMTIwMzA4LDEwMywxMjAzNjAsMTAzLDEyMDQxMiwxMDMsMTIwNDY0LDEwMyw2MDksMTAzLDc1NTUsMTAzLDM5NywxMDMsMTQwOSwxMDMsMTE5ODE0LDcxLDExOTg2Niw3MSwxMTk5MTgsNzEsMTE5OTcwLDcxLDEyMDAyMiw3MSwxMjAwNzQsNzEsMTIwMTI2LDcxLDEyMDE3OCw3MSwxMjAyMzAsNzEsMTIwMjgyLDcxLDEyMDMzNCw3MSwxMjAzODYsNzEsMTIwNDM4LDcxLDEyOTIsNzEsNTA1Niw3MSw1MTA3LDcxLDQyMTk4LDcxLDY1MzUyLDEwNCw4NDYyLDEwNCwxMTk4NDEsMTA0LDExOTk0NSwxMDQsMTE5OTk3LDEwNCwxMjAwNDksMTA0LDEyMDEwMSwxMDQsMTIwMTUzLDEwNCwxMjAyMDUsMTA0LDEyMDI1NywxMDQsMTIwMzA5LDEwNCwxMjAzNjEsMTA0LDEyMDQxMywxMDQsMTIwNDY1LDEwNCwxMjExLDEwNCwxMzkyLDEwNCw1MDU4LDEwNCw2NTMyMCw3Miw4NDU5LDcyLDg0NjAsNzIsODQ2MSw3MiwxMTk4MTUsNzIsMTE5ODY3LDcyLDExOTkxOSw3MiwxMjAwMjMsNzIsMTIwMTc5LDcyLDEyMDIzMSw3MiwxMjAyODMsNzIsMTIwMzM1LDcyLDEyMDM4Nyw3MiwxMjA0MzksNzIsOTE5LDcyLDEyMDQ5NCw3MiwxMjA1NTIsNzIsMTIwNjEwLDcyLDEyMDY2OCw3MiwxMjA3MjYsNzIsMTE0MDYsNzIsNTA1MSw3Miw1NTAwLDcyLDQyMjE1LDcyLDY2MjU1LDcyLDczMSwxMDUsOTA3NSwxMDUsNjUzNTMsMTA1LDg1NjAsMTA1LDg1MDUsMTA1LDg1MjAsMTA1LDExOTg0MiwxMDUsMTE5ODk0LDEwNSwxMTk5NDYsMTA1LDExOTk5OCwxMDUsMTIwMDUwLDEwNSwxMjAxMDIsMTA1LDEyMDE1NCwxMDUsMTIwMjA2LDEwNSwxMjAyNTgsMTA1LDEyMDMxMCwxMDUsMTIwMzYyLDEwNSwxMjA0MTQsMTA1LDEyMDQ2NiwxMDUsMTIwNDg0LDEwNSw2MTgsMTA1LDYxNywxMDUsOTUzLDEwNSw4MTI2LDEwNSw4OTAsMTA1LDEyMDUyMiwxMDUsMTIwNTgwLDEwNSwxMjA2MzgsMTA1LDEyMDY5NiwxMDUsMTIwNzU0LDEwNSwxMTEwLDEwNSw0MjU2NywxMDUsMTIzMSwxMDUsNDM4OTMsMTA1LDUwMjksMTA1LDcxODc1LDEwNSw2NTM1NCwxMDYsODUyMSwxMDYsMTE5ODQzLDEwNiwxMTk4OTUsMTA2LDExOTk0NywxMDYsMTE5OTk5LDEwNiwxMjAwNTEsMTA2LDEyMDEwMywxMDYsMTIwMTU1LDEwNiwxMjAyMDcsMTA2LDEyMDI1OSwxMDYsMTIwMzExLDEwNiwxMjAzNjMsMTA2LDEyMDQxNSwxMDYsMTIwNDY3LDEwNiwxMDExLDEwNiwxMTEyLDEwNiw2NTMyMiw3NCwxMTk4MTcsNzQsMTE5ODY5LDc0LDExOTkyMSw3NCwxMTk5NzMsNzQsMTIwMDI1LDc0LDEyMDA3Nyw3NCwxMjAxMjksNzQsMTIwMTgxLDc0LDEyMDIzMyw3NCwxMjAyODUsNzQsMTIwMzM3LDc0LDEyMDM4OSw3NCwxMjA0NDEsNzQsNDI5MzAsNzQsODk1LDc0LDEwMzIsNzQsNTAzNSw3NCw1MjYxLDc0LDQyMjAxLDc0LDExOTg0NCwxMDcsMTE5ODk2LDEwNywxMTk5NDgsMTA3LDEyMDAwMCwxMDcsMTIwMDUyLDEwNywxMjAxMDQsMTA3LDEyMDE1NiwxMDcsMTIwMjA4LDEwNywxMjAyNjAsMTA3LDEyMDMxMiwxMDcsMTIwMzY0LDEwNywxMjA0MTYsMTA3LDEyMDQ2OCwxMDcsODQ5MCw3NSw2NTMyMyw3NSwxMTk4MTgsNzUsMTE5ODcwLDc1LDExOTkyMiw3NSwxMTk5NzQsNzUsMTIwMDI2LDc1LDEyMDA3OCw3NSwxMjAxMzAsNzUsMTIwMTgyLDc1LDEyMDIzNCw3NSwxMjAyODYsNzUsMTIwMzM4LDc1LDEyMDM5MCw3NSwxMjA0NDIsNzUsOTIyLDc1LDEyMDQ5Nyw3NSwxMjA1NTUsNzUsMTIwNjEzLDc1LDEyMDY3MSw3NSwxMjA3MjksNzUsMTE0MTIsNzUsNTA5NCw3NSw1ODQ1LDc1LDQyMTk5LDc1LDY2ODQwLDc1LDE0NzIsMTI0LDg3MzksMTI0LDkyMTMsMTI0LDY1NTEyLDEyNCwxNjMzLDEyNCwxNzc3LDEyNCw2NjMzNiwxMjQsMTI1MTI3LDEyNCwxMjA3ODMsMTI0LDEyMDc5MywxMjQsMTIwODAzLDEyNCwxMjA4MTMsMTI0LDEyMDgyMywxMjQsMTMwMDMzLDEyNCw2NTMyMSwxMjQsODU0NCwxMjQsODQ2NCwxMjQsODQ2NSwxMjQsMTE5ODE2LDEyNCwxMTk4NjgsMTI0LDExOTkyMCwxMjQsMTIwMDI0LDEyNCwxMjAxMjgsMTI0LDEyMDE4MCwxMjQsMTIwMjMyLDEyNCwxMjAyODQsMTI0LDEyMDMzNiwxMjQsMTIwMzg4LDEyNCwxMjA0NDAsMTI0LDQwNiwxMjQsNjUzNTYsMTI0LDg1NzIsMTI0LDg0NjcsMTI0LDExOTg0NSwxMjQsMTE5ODk3LDEyNCwxMTk5NDksMTI0LDEyMDAwMSwxMjQsMTIwMDUzLDEyNCwxMjAxMDUsMTI0LDEyMDE1NywxMjQsMTIwMjA5LDEyNCwxMjAyNjEsMTI0LDEyMDMxMywxMjQsMTIwMzY1LDEyNCwxMjA0MTcsMTI0LDEyMDQ2OSwxMjQsNDQ4LDEyNCwxMjA0OTYsMTI0LDEyMDU1NCwxMjQsMTIwNjEyLDEyNCwxMjA2NzAsMTI0LDEyMDcyOCwxMjQsMTE0MTAsMTI0LDEwMzAsMTI0LDEyMTYsMTI0LDE0OTMsMTI0LDE1MDMsMTI0LDE1NzUsMTI0LDEyNjQ2NCwxMjQsMTI2NTkyLDEyNCw2NTE2NiwxMjQsNjUxNjUsMTI0LDE5OTQsMTI0LDExNTk5LDEyNCw1ODI1LDEyNCw0MjIyNiwxMjQsOTM5OTIsMTI0LDY2MTg2LDEyNCw2NjMxMywxMjQsMTE5MzM4LDc2LDg1NTYsNzYsODQ2Niw3NiwxMTk4MTksNzYsMTE5ODcxLDc2LDExOTkyMyw3NiwxMjAwMjcsNzYsMTIwMDc5LDc2LDEyMDEzMSw3NiwxMjAxODMsNzYsMTIwMjM1LDc2LDEyMDI4Nyw3NiwxMjAzMzksNzYsMTIwMzkxLDc2LDEyMDQ0Myw3NiwxMTQ3Miw3Niw1MDg2LDc2LDUyOTAsNzYsNDIyMDksNzYsOTM5NzQsNzYsNzE4NDMsNzYsNzE4NTgsNzYsNjY1ODcsNzYsNjY4NTQsNzYsNjUzMjUsNzcsODU1OSw3Nyw4NDk5LDc3LDExOTgyMCw3NywxMTk4NzIsNzcsMTE5OTI0LDc3LDEyMDAyOCw3NywxMjAwODAsNzcsMTIwMTMyLDc3LDEyMDE4NCw3NywxMjAyMzYsNzcsMTIwMjg4LDc3LDEyMDM0MCw3NywxMjAzOTIsNzcsMTIwNDQ0LDc3LDkyNCw3NywxMjA0OTksNzcsMTIwNTU3LDc3LDEyMDYxNSw3NywxMjA2NzMsNzcsMTIwNzMxLDc3LDEwMTgsNzcsMTE0MTYsNzcsNTA0Nyw3Nyw1NjE2LDc3LDU4NDYsNzcsNDIyMDcsNzcsNjYyMjQsNzcsNjYzMjEsNzcsMTE5ODQ3LDExMCwxMTk4OTksMTEwLDExOTk1MSwxMTAsMTIwMDAzLDExMCwxMjAwNTUsMTEwLDEyMDEwNywxMTAsMTIwMTU5LDExMCwxMjAyMTEsMTEwLDEyMDI2MywxMTAsMTIwMzE1LDExMCwxMjAzNjcsMTEwLDEyMDQxOSwxMTAsMTIwNDcxLDExMCwxNDAwLDExMCwxNDA0LDExMCw2NTMyNiw3OCw4NDY5LDc4LDExOTgyMSw3OCwxMTk4NzMsNzgsMTE5OTI1LDc4LDExOTk3Nyw3OCwxMjAwMjksNzgsMTIwMDgxLDc4LDEyMDE4NSw3OCwxMjAyMzcsNzgsMTIwMjg5LDc4LDEyMDM0MSw3OCwxMjAzOTMsNzgsMTIwNDQ1LDc4LDkyNSw3OCwxMjA1MDAsNzgsMTIwNTU4LDc4LDEyMDYxNiw3OCwxMjA2NzQsNzgsMTIwNzMyLDc4LDExNDE4LDc4LDQyMjA4LDc4LDY2ODM1LDc4LDMwNzQsMTExLDMyMDIsMTExLDMzMzAsMTExLDM0NTgsMTExLDI0MDYsMTExLDI2NjIsMTExLDI3OTAsMTExLDMwNDYsMTExLDMxNzQsMTExLDMzMDIsMTExLDM0MzAsMTExLDM2NjQsMTExLDM3OTIsMTExLDQxNjAsMTExLDE2MzcsMTExLDE3ODEsMTExLDY1MzU5LDExMSw4NTAwLDExMSwxMTk4NDgsMTExLDExOTkwMCwxMTEsMTE5OTUyLDExMSwxMjAwNTYsMTExLDEyMDEwOCwxMTEsMTIwMTYwLDExMSwxMjAyMTIsMTExLDEyMDI2NCwxMTEsMTIwMzE2LDExMSwxMjAzNjgsMTExLDEyMDQyMCwxMTEsMTIwNDcyLDExMSw3NDM5LDExMSw3NDQxLDExMSw0MzgzNywxMTEsOTU5LDExMSwxMjA1MjgsMTExLDEyMDU4NiwxMTEsMTIwNjQ0LDExMSwxMjA3MDIsMTExLDEyMDc2MCwxMTEsOTYzLDExMSwxMjA1MzIsMTExLDEyMDU5MCwxMTEsMTIwNjQ4LDExMSwxMjA3MDYsMTExLDEyMDc2NCwxMTEsMTE0MjMsMTExLDQzNTEsMTExLDE0MTMsMTExLDE1MDUsMTExLDE2MDcsMTExLDEyNjUwMCwxMTEsMTI2NTY0LDExMSwxMjY1OTYsMTExLDY1MjU5LDExMSw2NTI2MCwxMTEsNjUyNTgsMTExLDY1MjU3LDExMSwxNzI2LDExMSw2NDQyOCwxMTEsNjQ0MjksMTExLDY0NDI3LDExMSw2NDQyNiwxMTEsMTcyOSwxMTEsNjQ0MjQsMTExLDY0NDI1LDExMSw2NDQyMywxMTEsNjQ0MjIsMTExLDE3NDksMTExLDMzNjAsMTExLDQxMjUsMTExLDY2Nzk0LDExMSw3MTg4MCwxMTEsNzE4OTUsMTExLDY2NjA0LDExMSwxOTg0LDc5LDI1MzQsNzksMjkxOCw3OSwxMjI5NSw3OSw3MDg2NCw3OSw3MTkwNCw3OSwxMjA3ODIsNzksMTIwNzkyLDc5LDEyMDgwMiw3OSwxMjA4MTIsNzksMTIwODIyLDc5LDEzMDAzMiw3OSw2NTMyNyw3OSwxMTk4MjIsNzksMTE5ODc0LDc5LDExOTkyNiw3OSwxMTk5NzgsNzksMTIwMDMwLDc5LDEyMDA4Miw3OSwxMjAxMzQsNzksMTIwMTg2LDc5LDEyMDIzOCw3OSwxMjAyOTAsNzksMTIwMzQyLDc5LDEyMDM5NCw3OSwxMjA0NDYsNzksOTI3LDc5LDEyMDUwMiw3OSwxMjA1NjAsNzksMTIwNjE4LDc5LDEyMDY3Niw3OSwxMjA3MzQsNzksMTE0MjIsNzksMTM2NSw3OSwxMTYwNCw3OSw0ODE2LDc5LDI4NDgsNzksNjY3NTQsNzksNDIyMjcsNzksNzE4NjEsNzksNjYxOTQsNzksNjYyMTksNzksNjY1NjQsNzksNjY4MzgsNzksOTA3NiwxMTIsNjUzNjAsMTEyLDExOTg0OSwxMTIsMTE5OTAxLDExMiwxMTk5NTMsMTEyLDEyMDAwNSwxMTIsMTIwMDU3LDExMiwxMjAxMDksMTEyLDEyMDE2MSwxMTIsMTIwMjEzLDExMiwxMjAyNjUsMTEyLDEyMDMxNywxMTIsMTIwMzY5LDExMiwxMjA0MjEsMTEyLDEyMDQ3MywxMTIsOTYxLDExMiwxMjA1MzAsMTEyLDEyMDU0NCwxMTIsMTIwNTg4LDExMiwxMjA2MDIsMTEyLDEyMDY0NiwxMTIsMTIwNjYwLDExMiwxMjA3MDQsMTEyLDEyMDcxOCwxMTIsMTIwNzYyLDExMiwxMjA3NzYsMTEyLDExNDI3LDExMiw2NTMyOCw4MCw4NDczLDgwLDExOTgyMyw4MCwxMTk4NzUsODAsMTE5OTI3LDgwLDExOTk3OSw4MCwxMjAwMzEsODAsMTIwMDgzLDgwLDEyMDE4Nyw4MCwxMjAyMzksODAsMTIwMjkxLDgwLDEyMDM0Myw4MCwxMjAzOTUsODAsMTIwNDQ3LDgwLDkyOSw4MCwxMjA1MDQsODAsMTIwNTYyLDgwLDEyMDYyMCw4MCwxMjA2NzgsODAsMTIwNzM2LDgwLDExNDI2LDgwLDUwOTAsODAsNTIyOSw4MCw0MjE5Myw4MCw2NjE5Nyw4MCwxMTk4NTAsMTEzLDExOTkwMiwxMTMsMTE5OTU0LDExMywxMjAwMDYsMTEzLDEyMDA1OCwxMTMsMTIwMTEwLDExMywxMjAxNjIsMTEzLDEyMDIxNCwxMTMsMTIwMjY2LDExMywxMjAzMTgsMTEzLDEyMDM3MCwxMTMsMTIwNDIyLDExMywxMjA0NzQsMTEzLDEzMDcsMTEzLDEzNzksMTEzLDEzODIsMTEzLDg0NzQsODEsMTE5ODI0LDgxLDExOTg3Niw4MSwxMTk5MjgsODEsMTE5OTgwLDgxLDEyMDAzMiw4MSwxMjAwODQsODEsMTIwMTg4LDgxLDEyMDI0MCw4MSwxMjAyOTIsODEsMTIwMzQ0LDgxLDEyMDM5Niw4MSwxMjA0NDgsODEsMTE2MDUsODEsMTE5ODUxLDExNCwxMTk5MDMsMTE0LDExOTk1NSwxMTQsMTIwMDA3LDExNCwxMjAwNTksMTE0LDEyMDExMSwxMTQsMTIwMTYzLDExNCwxMjAyMTUsMTE0LDEyMDI2NywxMTQsMTIwMzE5LDExNCwxMjAzNzEsMTE0LDEyMDQyMywxMTQsMTIwNDc1LDExNCw0Mzg0NywxMTQsNDM4NDgsMTE0LDc0NjIsMTE0LDExMzk3LDExNCw0MzkwNSwxMTQsMTE5MzE4LDgyLDg0NzUsODIsODQ3Niw4Miw4NDc3LDgyLDExOTgyNSw4MiwxMTk4NzcsODIsMTE5OTI5LDgyLDEyMDAzMyw4MiwxMjAxODksODIsMTIwMjQxLDgyLDEyMDI5Myw4MiwxMjAzNDUsODIsMTIwMzk3LDgyLDEyMDQ0OSw4Miw0MjIsODIsNTAyNSw4Miw1MDc0LDgyLDY2NzQwLDgyLDU1MTEsODIsNDIyMTEsODIsOTQwMDUsODIsNjUzNjMsMTE1LDExOTg1MiwxMTUsMTE5OTA0LDExNSwxMTk5NTYsMTE1LDEyMDAwOCwxMTUsMTIwMDYwLDExNSwxMjAxMTIsMTE1LDEyMDE2NCwxMTUsMTIwMjE2LDExNSwxMjAyNjgsMTE1LDEyMDMyMCwxMTUsMTIwMzcyLDExNSwxMjA0MjQsMTE1LDEyMDQ3NiwxMTUsNDI4MDEsMTE1LDQ0NSwxMTUsMTEwOSwxMTUsNDM5NDYsMTE1LDcxODczLDExNSw2NjYzMiwxMTUsNjUzMzEsODMsMTE5ODI2LDgzLDExOTg3OCw4MywxMTk5MzAsODMsMTE5OTgyLDgzLDEyMDAzNCw4MywxMjAwODYsODMsMTIwMTM4LDgzLDEyMDE5MCw4MywxMjAyNDIsODMsMTIwMjk0LDgzLDEyMDM0Niw4MywxMjAzOTgsODMsMTIwNDUwLDgzLDEwMjksODMsMTM1OSw4Myw1MDc3LDgzLDUwODIsODMsNDIyMTAsODMsOTQwMTAsODMsNjYxOTgsODMsNjY1OTIsODMsMTE5ODUzLDExNiwxMTk5MDUsMTE2LDExOTk1NywxMTYsMTIwMDA5LDExNiwxMjAwNjEsMTE2LDEyMDExMywxMTYsMTIwMTY1LDExNiwxMjAyMTcsMTE2LDEyMDI2OSwxMTYsMTIwMzIxLDExNiwxMjAzNzMsMTE2LDEyMDQyNSwxMTYsMTIwNDc3LDExNiw4ODY4LDg0LDEwMjAxLDg0LDEyODg3Miw4NCw2NTMzMiw4NCwxMTk4MjcsODQsMTE5ODc5LDg0LDExOTkzMSw4NCwxMTk5ODMsODQsMTIwMDM1LDg0LDEyMDA4Nyw4NCwxMjAxMzksODQsMTIwMTkxLDg0LDEyMDI0Myw4NCwxMjAyOTUsODQsMTIwMzQ3LDg0LDEyMDM5OSw4NCwxMjA0NTEsODQsOTMyLDg0LDEyMDUwNyw4NCwxMjA1NjUsODQsMTIwNjIzLDg0LDEyMDY4MSw4NCwxMjA3MzksODQsMTE0MzAsODQsNTAyNiw4NCw0MjE5Niw4NCw5Mzk2Miw4NCw3MTg2OCw4NCw2NjE5OSw4NCw2NjIyNSw4NCw2NjMyNSw4NCwxMTk4NTQsMTE3LDExOTkwNiwxMTcsMTE5OTU4LDExNywxMjAwMTAsMTE3LDEyMDA2MiwxMTcsMTIwMTE0LDExNywxMjAxNjYsMTE3LDEyMDIxOCwxMTcsMTIwMjcwLDExNywxMjAzMjIsMTE3LDEyMDM3NCwxMTcsMTIwNDI2LDExNywxMjA0NzgsMTE3LDQyOTExLDExNyw3NDUyLDExNyw0Mzg1NCwxMTcsNDM4NTgsMTE3LDY1MSwxMTcsOTY1LDExNywxMjA1MzQsMTE3LDEyMDU5MiwxMTcsMTIwNjUwLDExNywxMjA3MDgsMTE3LDEyMDc2NiwxMTcsMTQwNSwxMTcsNjY4MDYsMTE3LDcxODk2LDExNyw4NzQ2LDg1LDg4OTksODUsMTE5ODI4LDg1LDExOTg4MCw4NSwxMTk5MzIsODUsMTE5OTg0LDg1LDEyMDAzNiw4NSwxMjAwODgsODUsMTIwMTQwLDg1LDEyMDE5Miw4NSwxMjAyNDQsODUsMTIwMjk2LDg1LDEyMDM0OCw4NSwxMjA0MDAsODUsMTIwNDUyLDg1LDEzNTcsODUsNDYwOCw4NSw2Njc2Niw4NSw1MTk2LDg1LDQyMjI4LDg1LDk0MDE4LDg1LDcxODY0LDg1LDg3NDQsMTE4LDg4OTcsMTE4LDY1MzY2LDExOCw4NTY0LDExOCwxMTk4NTUsMTE4LDExOTkwNywxMTgsMTE5OTU5LDExOCwxMjAwMTEsMTE4LDEyMDA2MywxMTgsMTIwMTE1LDExOCwxMjAxNjcsMTE4LDEyMDIxOSwxMTgsMTIwMjcxLDExOCwxMjAzMjMsMTE4LDEyMDM3NSwxMTgsMTIwNDI3LDExOCwxMjA0NzksMTE4LDc0NTYsMTE4LDk1NywxMTgsMTIwNTI2LDExOCwxMjA1ODQsMTE4LDEyMDY0MiwxMTgsMTIwNzAwLDExOCwxMjA3NTgsMTE4LDExNDEsMTE4LDE0OTYsMTE4LDcxNDMwLDExOCw0Mzk0NSwxMTgsNzE4NzIsMTE4LDExOTMwOSw4NiwxNjM5LDg2LDE3ODMsODYsODU0OCw4NiwxMTk4MjksODYsMTE5ODgxLDg2LDExOTkzMyw4NiwxMTk5ODUsODYsMTIwMDM3LDg2LDEyMDA4OSw4NiwxMjAxNDEsODYsMTIwMTkzLDg2LDEyMDI0NSw4NiwxMjAyOTcsODYsMTIwMzQ5LDg2LDEyMDQwMSw4NiwxMjA0NTMsODYsMTE0MCw4NiwxMTU3Niw4Niw1MDgxLDg2LDUxNjcsODYsNDI3MTksODYsNDIyMTQsODYsOTM5NjAsODYsNzE4NDAsODYsNjY4NDUsODYsNjIzLDExOSwxMTk4NTYsMTE5LDExOTkwOCwxMTksMTE5OTYwLDExOSwxMjAwMTIsMTE5LDEyMDA2NCwxMTksMTIwMTE2LDExOSwxMjAxNjgsMTE5LDEyMDIyMCwxMTksMTIwMjcyLDExOSwxMjAzMjQsMTE5LDEyMDM3NiwxMTksMTIwNDI4LDExOSwxMjA0ODAsMTE5LDc0NTcsMTE5LDExMjEsMTE5LDEzMDksMTE5LDEzNzcsMTE5LDcxNDM0LDExOSw3MTQzOCwxMTksNzE0MzksMTE5LDQzOTA3LDExOSw3MTkxOSw4Nyw3MTkxMCw4NywxMTk4MzAsODcsMTE5ODgyLDg3LDExOTkzNCw4NywxMTk5ODYsODcsMTIwMDM4LDg3LDEyMDA5MCw4NywxMjAxNDIsODcsMTIwMTk0LDg3LDEyMDI0Niw4NywxMjAyOTgsODcsMTIwMzUwLDg3LDEyMDQwMiw4NywxMjA0NTQsODcsMTMwOCw4Nyw1MDQzLDg3LDUwNzYsODcsNDIyMTgsODcsNTc0MiwxMjAsMTA1MzksMTIwLDEwNTQwLDEyMCwxMDc5OSwxMjAsNjUzNjgsMTIwLDg1NjksMTIwLDExOTg1NywxMjAsMTE5OTA5LDEyMCwxMTk5NjEsMTIwLDEyMDAxMywxMjAsMTIwMDY1LDEyMCwxMjAxMTcsMTIwLDEyMDE2OSwxMjAsMTIwMjIxLDEyMCwxMjAyNzMsMTIwLDEyMDMyNSwxMjAsMTIwMzc3LDEyMCwxMjA0MjksMTIwLDEyMDQ4MSwxMjAsNTQ0MSwxMjAsNTUwMSwxMjAsNTc0MSw4OCw5NTg3LDg4LDY2MzM4LDg4LDcxOTE2LDg4LDY1MzM2LDg4LDg1NTMsODgsMTE5ODMxLDg4LDExOTg4Myw4OCwxMTk5MzUsODgsMTE5OTg3LDg4LDEyMDAzOSw4OCwxMjAwOTEsODgsMTIwMTQzLDg4LDEyMDE5NSw4OCwxMjAyNDcsODgsMTIwMjk5LDg4LDEyMDM1MSw4OCwxMjA0MDMsODgsMTIwNDU1LDg4LDQyOTMxLDg4LDkzNSw4OCwxMjA1MTAsODgsMTIwNTY4LDg4LDEyMDYyNiw4OCwxMjA2ODQsODgsMTIwNzQyLDg4LDExNDM2LDg4LDExNjEzLDg4LDU4MTUsODgsNDIyMTksODgsNjYxOTIsODgsNjYyMjgsODgsNjYzMjcsODgsNjY4NTUsODgsNjExLDEyMSw3NTY0LDEyMSw2NTM2OSwxMjEsMTE5ODU4LDEyMSwxMTk5MTAsMTIxLDExOTk2MiwxMjEsMTIwMDE0LDEyMSwxMjAwNjYsMTIxLDEyMDExOCwxMjEsMTIwMTcwLDEyMSwxMjAyMjIsMTIxLDEyMDI3NCwxMjEsMTIwMzI2LDEyMSwxMjAzNzgsMTIxLDEyMDQzMCwxMjEsMTIwNDgyLDEyMSw2NTUsMTIxLDc5MzUsMTIxLDQzODY2LDEyMSw5NDcsMTIxLDg1MDksMTIxLDEyMDUxNiwxMjEsMTIwNTc0LDEyMSwxMjA2MzIsMTIxLDEyMDY5MCwxMjEsMTIwNzQ4LDEyMSwxMTk5LDEyMSw0MzI3LDEyMSw3MTkwMCwxMjEsNjUzMzcsODksMTE5ODMyLDg5LDExOTg4NCw4OSwxMTk5MzYsODksMTE5OTg4LDg5LDEyMDA0MCw4OSwxMjAwOTIsODksMTIwMTQ0LDg5LDEyMDE5Niw4OSwxMjAyNDgsODksMTIwMzAwLDg5LDEyMDM1Miw4OSwxMjA0MDQsODksMTIwNDU2LDg5LDkzMyw4OSw5NzgsODksMTIwNTA4LDg5LDEyMDU2Niw4OSwxMjA2MjQsODksMTIwNjgyLDg5LDEyMDc0MCw4OSwxMTQzMiw4OSwxMTk4LDg5LDUwMzMsODksNTA1Myw4OSw0MjIyMCw4OSw5NDAxOSw4OSw3MTg0NCw4OSw2NjIyNiw4OSwxMTk4NTksMTIyLDExOTkxMSwxMjIsMTE5OTYzLDEyMiwxMjAwMTUsMTIyLDEyMDA2NywxMjIsMTIwMTE5LDEyMiwxMjAxNzEsMTIyLDEyMDIyMywxMjIsMTIwMjc1LDEyMiwxMjAzMjcsMTIyLDEyMDM3OSwxMjIsMTIwNDMxLDEyMiwxMjA0ODMsMTIyLDc0NTgsMTIyLDQzOTIzLDEyMiw3MTg3NiwxMjIsNjYyOTMsOTAsNzE5MDksOTAsNjUzMzgsOTAsODQ4NCw5MCw4NDg4LDkwLDExOTgzMyw5MCwxMTk4ODUsOTAsMTE5OTM3LDkwLDExOTk4OSw5MCwxMjAwNDEsOTAsMTIwMTk3LDkwLDEyMDI0OSw5MCwxMjAzMDEsOTAsMTIwMzUzLDkwLDEyMDQwNSw5MCwxMjA0NTcsOTAsOTE4LDkwLDEyMDQ5Myw5MCwxMjA1NTEsOTAsMTIwNjA5LDkwLDEyMDY2Nyw5MCwxMjA3MjUsOTAsNTA1OSw5MCw0MjIwNCw5MCw3MTg0OSw5MF0sXCJfZGVmYXVsdFwiOlsxNjAsMzIsODIxMSw0NSw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSxcImNzXCI6WzY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSxcImRlXCI6WzY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSxcImVzXCI6WzgyMTEsNDUsNjUzMDYsNTgsNjUyODEsMzMsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sXCJmclwiOls2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyNDUsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSxcIml0XCI6WzE2MCwzMiw4MjExLDQ1LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSxcImphXCI6WzgyMTEsNDUsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sXCJrb1wiOls4MjExLDQ1LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sXCJwbFwiOls2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSxcInB0LUJSXCI6WzY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLFwicXBzLXBsb2NcIjpbMTYwLDMyLDgyMTEsNDUsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sXCJydVwiOls2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMzA1LDEwNSw5MjEsMTI0LDEwMDksMTEyLDIxNSwxMjBdLFwidHJcIjpbMTYwLDMyLDgyMTEsNDUsNjUzMDYsNTgsNjUyODEsMzMsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sXCJ6aC1oYW5zXCI6WzY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sXCJ6aC1oYW50XCI6WzgyMTEsNDUsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV19Jyk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBnZXRDb25mdXNhYmxlc0ZvckN1cnJlbnRMb2NhbGUoKSB7CiAgICAgICAgICAgIGlmICghQW1iaWd1b3VzQ2hhcmFjdGVycy5tYXApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBBbWJpZ3VvdXNDaGFyYWN0ZXJzLmdldERhdGEoKTsKICAgICAgICAgICAgICAgIGxldCBsb2NhbGUkMSA9IGxvY2FsZTsKICAgICAgICAgICAgICAgIGlmICghbG9jYWxlJDEgfHwgIShsb2NhbGUkMSBpbiBkYXRhKSkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsZSQxID0gbGFuZ3VhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsZSQxIHx8ICEobG9jYWxlJDEgaW4gZGF0YSkpIHsKICAgICAgICAgICAgICAgICAgICBsb2NhbGUkMSA9ICdfZGVmYXVsdCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBhcnJheVRvTWFwKGFycikgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0KGFycltpXSwgYXJyW2kgKyAxXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBzZXQgPSBhcnJheVRvTWFwKGRhdGFbJ19jb21tb24nXSk7CiAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsQ29uZnVzYWJsZXMgPSBhcnJheVRvTWFwKGRhdGFbbG9jYWxlJDFdKTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2NvZGVQb2ludCwgb3JpZ2luYWxDb2RlUG9pbnRdIG9mIGFkZGl0aW9uYWxDb25mdXNhYmxlcykgewogICAgICAgICAgICAgICAgICAgIHNldC5zZXQoY29kZVBvaW50LCBvcmlnaW5hbENvZGVQb2ludCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBBbWJpZ3VvdXNDaGFyYWN0ZXJzLm1hcCA9IHNldDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gQW1iaWd1b3VzQ2hhcmFjdGVycy5tYXA7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBpc0FtYmlndW91cyhjb2RlUG9pbnQpIHsKICAgICAgICAgICAgcmV0dXJuIEFtYmlndW91c0NoYXJhY3RlcnMuZ2V0Q29uZnVzYWJsZXNGb3JDdXJyZW50TG9jYWxlKCkuaGFzKGNvZGVQb2ludCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIG5vbiBiYXNpYyBBU0NJSSBjb2RlIHBvaW50IHRoYXQgdGhlIGdpdmVuIGNvZGUgcG9pbnQgY2FuIGJlIGNvbmZ1c2VkLAogICAgICAgICAqIG9yIHVuZGVmaW5lZCBpZiBzdWNoIGNvZGUgcG9pbnQgZG9lcyBub3RlIGV4aXN0LgogICAgICAgICovCiAgICAgICAgc3RhdGljIGdldFByaW1hcnlDb25mdXNhYmxlKGNvZGVQb2ludCkgewogICAgICAgICAgICByZXR1cm4gQW1iaWd1b3VzQ2hhcmFjdGVycy5nZXRDb25mdXNhYmxlc0ZvckN1cnJlbnRMb2NhbGUoKS5nZXQoY29kZVBvaW50KTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGdldFByaW1hcnlDb25mdXNhYmxlQ29kZVBvaW50cygpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXQoQW1iaWd1b3VzQ2hhcmFjdGVycy5nZXRDb25mdXNhYmxlc0ZvckN1cnJlbnRMb2NhbGUoKS5rZXlzKCkpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIEludmlzaWJsZUNoYXJhY3RlcnMgewogICAgICAgIHN0YXRpYyBnZXRSYXdEYXRhKCkgewogICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZSgnWzksMTAsMTEsMTIsMTMsMzIsMTI3LDE2MCwxNzMsODQ3LDE1NjQsNDQ0Nyw0NDQ4LDYwNjgsNjA2OSw2MTU1LDYxNTYsNjE1Nyw2MTU4LDczNTUsNzM1Niw4MTkyLDgxOTMsODE5NCw4MTk1LDgxOTYsODE5Nyw4MTk4LDgxOTksODIwMCw4MjAxLDgyMDIsODIwMyw4MjA0LDgyMDUsODIwNiw4MjA3LDgyMzQsODIzNSw4MjM2LDgyMzcsODIzOCw4MjM5LDgyODcsODI4OCw4Mjg5LDgyOTAsODI5MSw4MjkyLDgyOTMsODI5NCw4Mjk1LDgyOTYsODI5Nyw4Mjk4LDgyOTksODMwMCw4MzAxLDgzMDIsODMwMywxMDI0MCwxMjI4OCwxMjY0NCw2NTAyNCw2NTAyNSw2NTAyNiw2NTAyNyw2NTAyOCw2NTAyOSw2NTAzMCw2NTAzMSw2NTAzMiw2NTAzMyw2NTAzNCw2NTAzNSw2NTAzNiw2NTAzNyw2NTAzOCw2NTAzOSw2NTI3OSw2NTQ0MCw2NTUyMCw2NTUyMSw2NTUyMiw2NTUyMyw2NTUyNCw2NTUyNSw2NTUyNiw2NTUyNyw2NTUyOCw2NTUzMiw3ODg0NCwxMTkxNTUsMTE5MTU2LDExOTE1NywxMTkxNTgsMTE5MTU5LDExOTE2MCwxMTkxNjEsMTE5MTYyLDkxNzUwNCw5MTc1MDUsOTE3NTA2LDkxNzUwNyw5MTc1MDgsOTE3NTA5LDkxNzUxMCw5MTc1MTEsOTE3NTEyLDkxNzUxMyw5MTc1MTQsOTE3NTE1LDkxNzUxNiw5MTc1MTcsOTE3NTE4LDkxNzUxOSw5MTc1MjAsOTE3NTIxLDkxNzUyMiw5MTc1MjMsOTE3NTI0LDkxNzUyNSw5MTc1MjYsOTE3NTI3LDkxNzUyOCw5MTc1MjksOTE3NTMwLDkxNzUzMSw5MTc1MzIsOTE3NTMzLDkxNzUzNCw5MTc1MzUsOTE3NTM2LDkxNzUzNyw5MTc1MzgsOTE3NTM5LDkxNzU0MCw5MTc1NDEsOTE3NTQyLDkxNzU0Myw5MTc1NDQsOTE3NTQ1LDkxNzU0Niw5MTc1NDcsOTE3NTQ4LDkxNzU0OSw5MTc1NTAsOTE3NTUxLDkxNzU1Miw5MTc1NTMsOTE3NTU0LDkxNzU1NSw5MTc1NTYsOTE3NTU3LDkxNzU1OCw5MTc1NTksOTE3NTYwLDkxNzU2MSw5MTc1NjIsOTE3NTYzLDkxNzU2NCw5MTc1NjUsOTE3NTY2LDkxNzU2Nyw5MTc1NjgsOTE3NTY5LDkxNzU3MCw5MTc1NzEsOTE3NTcyLDkxNzU3Myw5MTc1NzQsOTE3NTc1LDkxNzU3Niw5MTc1NzcsOTE3NTc4LDkxNzU3OSw5MTc1ODAsOTE3NTgxLDkxNzU4Miw5MTc1ODMsOTE3NTg0LDkxNzU4NSw5MTc1ODYsOTE3NTg3LDkxNzU4OCw5MTc1ODksOTE3NTkwLDkxNzU5MSw5MTc1OTIsOTE3NTkzLDkxNzU5NCw5MTc1OTUsOTE3NTk2LDkxNzU5Nyw5MTc1OTgsOTE3NTk5LDkxNzYwMCw5MTc2MDEsOTE3NjAyLDkxNzYwMyw5MTc2MDQsOTE3NjA1LDkxNzYwNiw5MTc2MDcsOTE3NjA4LDkxNzYwOSw5MTc2MTAsOTE3NjExLDkxNzYxMiw5MTc2MTMsOTE3NjE0LDkxNzYxNSw5MTc2MTYsOTE3NjE3LDkxNzYxOCw5MTc2MTksOTE3NjIwLDkxNzYyMSw5MTc2MjIsOTE3NjIzLDkxNzYyNCw5MTc2MjUsOTE3NjI2LDkxNzYyNyw5MTc2MjgsOTE3NjI5LDkxNzYzMCw5MTc2MzEsOTE3NzYwLDkxNzc2MSw5MTc3NjIsOTE3NzYzLDkxNzc2NCw5MTc3NjUsOTE3NzY2LDkxNzc2Nyw5MTc3NjgsOTE3NzY5LDkxNzc3MCw5MTc3NzEsOTE3NzcyLDkxNzc3Myw5MTc3NzQsOTE3Nzc1LDkxNzc3Niw5MTc3NzcsOTE3Nzc4LDkxNzc3OSw5MTc3ODAsOTE3NzgxLDkxNzc4Miw5MTc3ODMsOTE3Nzg0LDkxNzc4NSw5MTc3ODYsOTE3Nzg3LDkxNzc4OCw5MTc3ODksOTE3NzkwLDkxNzc5MSw5MTc3OTIsOTE3NzkzLDkxNzc5NCw5MTc3OTUsOTE3Nzk2LDkxNzc5Nyw5MTc3OTgsOTE3Nzk5LDkxNzgwMCw5MTc4MDEsOTE3ODAyLDkxNzgwMyw5MTc4MDQsOTE3ODA1LDkxNzgwNiw5MTc4MDcsOTE3ODA4LDkxNzgwOSw5MTc4MTAsOTE3ODExLDkxNzgxMiw5MTc4MTMsOTE3ODE0LDkxNzgxNSw5MTc4MTYsOTE3ODE3LDkxNzgxOCw5MTc4MTksOTE3ODIwLDkxNzgyMSw5MTc4MjIsOTE3ODIzLDkxNzgyNCw5MTc4MjUsOTE3ODI2LDkxNzgyNyw5MTc4MjgsOTE3ODI5LDkxNzgzMCw5MTc4MzEsOTE3ODMyLDkxNzgzMyw5MTc4MzQsOTE3ODM1LDkxNzgzNiw5MTc4MzcsOTE3ODM4LDkxNzgzOSw5MTc4NDAsOTE3ODQxLDkxNzg0Miw5MTc4NDMsOTE3ODQ0LDkxNzg0NSw5MTc4NDYsOTE3ODQ3LDkxNzg0OCw5MTc4NDksOTE3ODUwLDkxNzg1MSw5MTc4NTIsOTE3ODUzLDkxNzg1NCw5MTc4NTUsOTE3ODU2LDkxNzg1Nyw5MTc4NTgsOTE3ODU5LDkxNzg2MCw5MTc4NjEsOTE3ODYyLDkxNzg2Myw5MTc4NjQsOTE3ODY1LDkxNzg2Niw5MTc4NjcsOTE3ODY4LDkxNzg2OSw5MTc4NzAsOTE3ODcxLDkxNzg3Miw5MTc4NzMsOTE3ODc0LDkxNzg3NSw5MTc4NzYsOTE3ODc3LDkxNzg3OCw5MTc4NzksOTE3ODgwLDkxNzg4MSw5MTc4ODIsOTE3ODgzLDkxNzg4NCw5MTc4ODUsOTE3ODg2LDkxNzg4Nyw5MTc4ODgsOTE3ODg5LDkxNzg5MCw5MTc4OTEsOTE3ODkyLDkxNzg5Myw5MTc4OTQsOTE3ODk1LDkxNzg5Niw5MTc4OTcsOTE3ODk4LDkxNzg5OSw5MTc5MDAsOTE3OTAxLDkxNzkwMiw5MTc5MDMsOTE3OTA0LDkxNzkwNSw5MTc5MDYsOTE3OTA3LDkxNzkwOCw5MTc5MDksOTE3OTEwLDkxNzkxMSw5MTc5MTIsOTE3OTEzLDkxNzkxNCw5MTc5MTUsOTE3OTE2LDkxNzkxNyw5MTc5MTgsOTE3OTE5LDkxNzkyMCw5MTc5MjEsOTE3OTIyLDkxNzkyMyw5MTc5MjQsOTE3OTI1LDkxNzkyNiw5MTc5MjcsOTE3OTI4LDkxNzkyOSw5MTc5MzAsOTE3OTMxLDkxNzkzMiw5MTc5MzMsOTE3OTM0LDkxNzkzNSw5MTc5MzYsOTE3OTM3LDkxNzkzOCw5MTc5MzksOTE3OTQwLDkxNzk0MSw5MTc5NDIsOTE3OTQzLDkxNzk0NCw5MTc5NDUsOTE3OTQ2LDkxNzk0Nyw5MTc5NDgsOTE3OTQ5LDkxNzk1MCw5MTc5NTEsOTE3OTUyLDkxNzk1Myw5MTc5NTQsOTE3OTU1LDkxNzk1Niw5MTc5NTcsOTE3OTU4LDkxNzk1OSw5MTc5NjAsOTE3OTYxLDkxNzk2Miw5MTc5NjMsOTE3OTY0LDkxNzk2NSw5MTc5NjYsOTE3OTY3LDkxNzk2OCw5MTc5NjksOTE3OTcwLDkxNzk3MSw5MTc5NzIsOTE3OTczLDkxNzk3NCw5MTc5NzUsOTE3OTc2LDkxNzk3Nyw5MTc5NzgsOTE3OTc5LDkxNzk4MCw5MTc5ODEsOTE3OTgyLDkxNzk4Myw5MTc5ODQsOTE3OTg1LDkxNzk4Niw5MTc5ODcsOTE3OTg4LDkxNzk4OSw5MTc5OTAsOTE3OTkxLDkxNzk5Miw5MTc5OTMsOTE3OTk0LDkxNzk5NSw5MTc5OTYsOTE3OTk3LDkxNzk5OCw5MTc5OTldJyk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBnZXREYXRhKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2RhdGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2RhdGEgPSBuZXcgU2V0KEludmlzaWJsZUNoYXJhY3RlcnMuZ2V0UmF3RGF0YSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGlzSW52aXNpYmxlQ2hhcmFjdGVyKGNvZGVQb2ludCkgewogICAgICAgICAgICByZXR1cm4gSW52aXNpYmxlQ2hhcmFjdGVycy5nZXREYXRhKCkuaGFzKGNvZGVQb2ludCk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBnZXQgY29kZVBvaW50cygpIHsKICAgICAgICAgICAgcmV0dXJuIEludmlzaWJsZUNoYXJhY3RlcnMuZ2V0RGF0YSgpOwogICAgICAgIH0KICAgIH0KICAgIEludmlzaWJsZUNoYXJhY3RlcnMuX2RhdGEgPSB1bmRlZmluZWQ7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjb25zdCBJTklUSUFMSVpFID0gJyRpbml0aWFsaXplJzsKICAgIGNsYXNzIFJlcXVlc3RNZXNzYWdlIHsKICAgICAgICBjb25zdHJ1Y3Rvcih2c1dvcmtlciwgcmVxLCBtZXRob2QsIGFyZ3MpIHsKICAgICAgICAgICAgdGhpcy52c1dvcmtlciA9IHZzV29ya2VyOwogICAgICAgICAgICB0aGlzLnJlcSA9IHJlcTsKICAgICAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CiAgICAgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IDAgLyogUmVxdWVzdCAqLzsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBSZXBseU1lc3NhZ2UgewogICAgICAgIGNvbnN0cnVjdG9yKHZzV29ya2VyLCBzZXEsIHJlcywgZXJyKSB7CiAgICAgICAgICAgIHRoaXMudnNXb3JrZXIgPSB2c1dvcmtlcjsKICAgICAgICAgICAgdGhpcy5zZXEgPSBzZXE7CiAgICAgICAgICAgIHRoaXMucmVzID0gcmVzOwogICAgICAgICAgICB0aGlzLmVyciA9IGVycjsKICAgICAgICAgICAgdGhpcy50eXBlID0gMSAvKiBSZXBseSAqLzsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBTdWJzY3JpYmVFdmVudE1lc3NhZ2UgewogICAgICAgIGNvbnN0cnVjdG9yKHZzV29ya2VyLCByZXEsIGV2ZW50TmFtZSwgYXJnKSB7CiAgICAgICAgICAgIHRoaXMudnNXb3JrZXIgPSB2c1dvcmtlcjsKICAgICAgICAgICAgdGhpcy5yZXEgPSByZXE7CiAgICAgICAgICAgIHRoaXMuZXZlbnROYW1lID0gZXZlbnROYW1lOwogICAgICAgICAgICB0aGlzLmFyZyA9IGFyZzsKICAgICAgICAgICAgdGhpcy50eXBlID0gMiAvKiBTdWJzY3JpYmVFdmVudCAqLzsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBFdmVudE1lc3NhZ2UgewogICAgICAgIGNvbnN0cnVjdG9yKHZzV29ya2VyLCByZXEsIGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMudnNXb3JrZXIgPSB2c1dvcmtlcjsKICAgICAgICAgICAgdGhpcy5yZXEgPSByZXE7CiAgICAgICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDsKICAgICAgICAgICAgdGhpcy50eXBlID0gMyAvKiBFdmVudCAqLzsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBVbnN1YnNjcmliZUV2ZW50TWVzc2FnZSB7CiAgICAgICAgY29uc3RydWN0b3IodnNXb3JrZXIsIHJlcSkgewogICAgICAgICAgICB0aGlzLnZzV29ya2VyID0gdnNXb3JrZXI7CiAgICAgICAgICAgIHRoaXMucmVxID0gcmVxOwogICAgICAgICAgICB0aGlzLnR5cGUgPSA0IC8qIFVuc3Vic2NyaWJlRXZlbnQgKi87CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgU2ltcGxlV29ya2VyUHJvdG9jb2wgewogICAgICAgIGNvbnN0cnVjdG9yKGhhbmRsZXIpIHsKICAgICAgICAgICAgdGhpcy5fd29ya2VySWQgPSAtMTsKICAgICAgICAgICAgdGhpcy5faGFuZGxlciA9IGhhbmRsZXI7CiAgICAgICAgICAgIHRoaXMuX2xhc3RTZW50UmVxID0gMDsKICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1JlcGxpZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICB0aGlzLl9wZW5kaW5nRW1pdHRlcnMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudHMgPSBuZXcgTWFwKCk7CiAgICAgICAgfQogICAgICAgIHNldFdvcmtlcklkKHdvcmtlcklkKSB7CiAgICAgICAgICAgIHRoaXMuX3dvcmtlcklkID0gd29ya2VySWQ7CiAgICAgICAgfQogICAgICAgIHNlbmRNZXNzYWdlKG1ldGhvZCwgYXJncykgewogICAgICAgICAgICBjb25zdCByZXEgPSBTdHJpbmcoKyt0aGlzLl9sYXN0U2VudFJlcSk7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nUmVwbGllc1tyZXFdID0gewogICAgICAgICAgICAgICAgICAgIHJlc29sdmU6IHJlc29sdmUsCiAgICAgICAgICAgICAgICAgICAgcmVqZWN0OiByZWplY3QKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB0aGlzLl9zZW5kKG5ldyBSZXF1ZXN0TWVzc2FnZSh0aGlzLl93b3JrZXJJZCwgcmVxLCBtZXRob2QsIGFyZ3MpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGxpc3RlbihldmVudE5hbWUsIGFyZykgewogICAgICAgICAgICBsZXQgcmVxID0gbnVsbDsKICAgICAgICAgICAgY29uc3QgZW1pdHRlciA9IG5ldyBFbWl0dGVyKHsKICAgICAgICAgICAgICAgIG9uRmlyc3RMaXN0ZW5lckFkZDogKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJlcSA9IFN0cmluZygrK3RoaXMuX2xhc3RTZW50UmVxKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nRW1pdHRlcnMuc2V0KHJlcSwgZW1pdHRlcik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VuZChuZXcgU3Vic2NyaWJlRXZlbnRNZXNzYWdlKHRoaXMuX3dvcmtlcklkLCByZXEsIGV2ZW50TmFtZSwgYXJnKSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgb25MYXN0TGlzdGVuZXJSZW1vdmU6ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nRW1pdHRlcnMuZGVsZXRlKHJlcSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VuZChuZXcgVW5zdWJzY3JpYmVFdmVudE1lc3NhZ2UodGhpcy5fd29ya2VySWQsIHJlcSkpOwogICAgICAgICAgICAgICAgICAgIHJlcSA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gZW1pdHRlci5ldmVudDsKICAgICAgICB9CiAgICAgICAgaGFuZGxlTWVzc2FnZShtZXNzYWdlKSB7CiAgICAgICAgICAgIGlmICghbWVzc2FnZSB8fCAhbWVzc2FnZS52c1dvcmtlcikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl93b3JrZXJJZCAhPT0gLTEgJiYgbWVzc2FnZS52c1dvcmtlciAhPT0gdGhpcy5fd29ya2VySWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9oYW5kbGVNZXNzYWdlKG1lc3NhZ2UpOwogICAgICAgIH0KICAgICAgICBfaGFuZGxlTWVzc2FnZShtc2cpIHsKICAgICAgICAgICAgc3dpdGNoIChtc2cudHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAxIC8qIFJlcGx5ICovOgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVSZXBseU1lc3NhZ2UobXNnKTsKICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBSZXF1ZXN0ICovOgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVSZXF1ZXN0TWVzc2FnZShtc2cpOwogICAgICAgICAgICAgICAgY2FzZSAyIC8qIFN1YnNjcmliZUV2ZW50ICovOgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVTdWJzY3JpYmVFdmVudE1lc3NhZ2UobXNnKTsKICAgICAgICAgICAgICAgIGNhc2UgMyAvKiBFdmVudCAqLzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlRXZlbnRNZXNzYWdlKG1zZyk7CiAgICAgICAgICAgICAgICBjYXNlIDQgLyogVW5zdWJzY3JpYmVFdmVudCAqLzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faGFuZGxlVW5zdWJzY3JpYmVFdmVudE1lc3NhZ2UobXNnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfaGFuZGxlUmVwbHlNZXNzYWdlKHJlcGx5TWVzc2FnZSkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3BlbmRpbmdSZXBsaWVzW3JlcGx5TWVzc2FnZS5zZXFdKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0dvdCByZXBseSB0byB1bmtub3duIHNlcScpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCByZXBseSA9IHRoaXMuX3BlbmRpbmdSZXBsaWVzW3JlcGx5TWVzc2FnZS5zZXFdOwogICAgICAgICAgICBkZWxldGUgdGhpcy5fcGVuZGluZ1JlcGxpZXNbcmVwbHlNZXNzYWdlLnNlcV07CiAgICAgICAgICAgIGlmIChyZXBseU1lc3NhZ2UuZXJyKSB7CiAgICAgICAgICAgICAgICBsZXQgZXJyID0gcmVwbHlNZXNzYWdlLmVycjsKICAgICAgICAgICAgICAgIGlmIChyZXBseU1lc3NhZ2UuZXJyLiRpc0Vycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgZXJyLm5hbWUgPSByZXBseU1lc3NhZ2UuZXJyLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgZXJyLm1lc3NhZ2UgPSByZXBseU1lc3NhZ2UuZXJyLm1lc3NhZ2U7CiAgICAgICAgICAgICAgICAgICAgZXJyLnN0YWNrID0gcmVwbHlNZXNzYWdlLmVyci5zdGFjazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcGx5LnJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlcGx5LnJlc29sdmUocmVwbHlNZXNzYWdlLnJlcyk7CiAgICAgICAgfQogICAgICAgIF9oYW5kbGVSZXF1ZXN0TWVzc2FnZShyZXF1ZXN0TWVzc2FnZSkgewogICAgICAgICAgICBsZXQgcmVxID0gcmVxdWVzdE1lc3NhZ2UucmVxOwogICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5faGFuZGxlci5oYW5kbGVNZXNzYWdlKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UuYXJncyk7CiAgICAgICAgICAgIHJlc3VsdC50aGVuKChyKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZW5kKG5ldyBSZXBseU1lc3NhZ2UodGhpcy5fd29ya2VySWQsIHJlcSwgciwgdW5kZWZpbmVkKSk7CiAgICAgICAgICAgIH0sIChlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZS5kZXRhaWwgaW5zdGFuY2VvZiBFcnJvcikgewogICAgICAgICAgICAgICAgICAgIC8vIExvYWRpbmcgZXJyb3JzIGhhdmUgYSBkZXRhaWwgcHJvcGVydHkgdGhhdCBwb2ludHMgdG8gdGhlIGFjdHVhbCBlcnJvcgogICAgICAgICAgICAgICAgICAgIGUuZGV0YWlsID0gdHJhbnNmb3JtRXJyb3JGb3JTZXJpYWxpemF0aW9uKGUuZGV0YWlsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3NlbmQobmV3IFJlcGx5TWVzc2FnZSh0aGlzLl93b3JrZXJJZCwgcmVxLCB1bmRlZmluZWQsIHRyYW5zZm9ybUVycm9yRm9yU2VyaWFsaXphdGlvbihlKSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX2hhbmRsZVN1YnNjcmliZUV2ZW50TWVzc2FnZShtc2cpIHsKICAgICAgICAgICAgY29uc3QgcmVxID0gbXNnLnJlcTsKICAgICAgICAgICAgY29uc3QgZGlzcG9zYWJsZSA9IHRoaXMuX2hhbmRsZXIuaGFuZGxlRXZlbnQobXNnLmV2ZW50TmFtZSwgbXNnLmFyZykoKGV2ZW50KSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZW5kKG5ldyBFdmVudE1lc3NhZ2UodGhpcy5fd29ya2VySWQsIHJlcSwgZXZlbnQpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdFdmVudHMuc2V0KHJlcSwgZGlzcG9zYWJsZSk7CiAgICAgICAgfQogICAgICAgIF9oYW5kbGVFdmVudE1lc3NhZ2UobXNnKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fcGVuZGluZ0VtaXR0ZXJzLmhhcyhtc2cucmVxKSkgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdHb3QgZXZlbnQgZm9yIHVua25vd24gcmVxJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0VtaXR0ZXJzLmdldChtc2cucmVxKS5maXJlKG1zZy5ldmVudCk7CiAgICAgICAgfQogICAgICAgIF9oYW5kbGVVbnN1YnNjcmliZUV2ZW50TWVzc2FnZShtc2cpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9wZW5kaW5nRXZlbnRzLmhhcyhtc2cucmVxKSkgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdHb3QgdW5zdWJzY3JpYmUgZm9yIHVua25vd24gcmVxJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0V2ZW50cy5nZXQobXNnLnJlcSkuZGlzcG9zZSgpOwogICAgICAgICAgICB0aGlzLl9wZW5kaW5nRXZlbnRzLmRlbGV0ZShtc2cucmVxKTsKICAgICAgICB9CiAgICAgICAgX3NlbmQobXNnKSB7CiAgICAgICAgICAgIGxldCB0cmFuc2ZlciA9IFtdOwogICAgICAgICAgICBpZiAobXNnLnR5cGUgPT09IDAgLyogUmVxdWVzdCAqLykgewogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtc2cuYXJncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmIChtc2cuYXJnc1tpXSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyLnB1c2gobXNnLmFyZ3NbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChtc2cudHlwZSA9PT0gMSAvKiBSZXBseSAqLykgewogICAgICAgICAgICAgICAgaWYgKG1zZy5yZXMgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyLnB1c2gobXNnLnJlcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faGFuZGxlci5zZW5kTWVzc2FnZShtc2csIHRyYW5zZmVyKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBwcm9wZXJ0eUlzRXZlbnQobmFtZSkgewogICAgICAgIC8vIEFzc3VtZSBhIHByb3BlcnR5IGlzIGFuIGV2ZW50IGlmIGl0IGhhcyBhIGZvcm0gb2YgIm9uU29tZXRoaW5nIgogICAgICAgIHJldHVybiBuYW1lWzBdID09PSAnbycgJiYgbmFtZVsxXSA9PT0gJ24nICYmIGlzVXBwZXJBc2NpaUxldHRlcihuYW1lLmNoYXJDb2RlQXQoMikpOwogICAgfQogICAgZnVuY3Rpb24gcHJvcGVydHlJc0R5bmFtaWNFdmVudChuYW1lKSB7CiAgICAgICAgLy8gQXNzdW1lIGEgcHJvcGVydHkgaXMgYSBkeW5hbWljIGV2ZW50IChhIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gZXZlbnQpIGlmIGl0IGhhcyBhIGZvcm0gb2YgIm9uRHluYW1pY1NvbWV0aGluZyIKICAgICAgICByZXR1cm4gL15vbkR5bmFtaWMvLnRlc3QobmFtZSkgJiYgaXNVcHBlckFzY2lpTGV0dGVyKG5hbWUuY2hhckNvZGVBdCg5KSk7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVQcm94eU9iamVjdChtZXRob2ROYW1lcywgaW52b2tlLCBwcm94eUxpc3RlbikgewogICAgICAgIGNvbnN0IGNyZWF0ZVByb3h5TWV0aG9kID0gKG1ldGhvZCkgPT4gewogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgY29uc3QgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gaW52b2tlKG1ldGhvZCwgYXJncyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBjb25zdCBjcmVhdGVQcm94eUR5bmFtaWNFdmVudCA9IChldmVudE5hbWUpID0+IHsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChhcmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm94eUxpc3RlbihldmVudE5hbWUsIGFyZyk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBsZXQgcmVzdWx0ID0ge307CiAgICAgICAgZm9yIChjb25zdCBtZXRob2ROYW1lIG9mIG1ldGhvZE5hbWVzKSB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlzRHluYW1pY0V2ZW50KG1ldGhvZE5hbWUpKSB7CiAgICAgICAgICAgICAgICByZXN1bHRbbWV0aG9kTmFtZV0gPSBjcmVhdGVQcm94eUR5bmFtaWNFdmVudChtZXRob2ROYW1lKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlzRXZlbnQobWV0aG9kTmFtZSkpIHsKICAgICAgICAgICAgICAgIHJlc3VsdFttZXRob2ROYW1lXSA9IHByb3h5TGlzdGVuKG1ldGhvZE5hbWUsIHVuZGVmaW5lZCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHRbbWV0aG9kTmFtZV0gPSBjcmVhdGVQcm94eU1ldGhvZChtZXRob2ROYW1lKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogV29ya2VyIHNpZGUKICAgICAqLwogICAgY2xhc3MgU2ltcGxlV29ya2VyU2VydmVyIHsKICAgICAgICBjb25zdHJ1Y3Rvcihwb3N0TWVzc2FnZSwgcmVxdWVzdEhhbmRsZXJGYWN0b3J5KSB7CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RIYW5kbGVyRmFjdG9yeSA9IHJlcXVlc3RIYW5kbGVyRmFjdG9yeTsKICAgICAgICAgICAgdGhpcy5fcmVxdWVzdEhhbmRsZXIgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9wcm90b2NvbCA9IG5ldyBTaW1wbGVXb3JrZXJQcm90b2NvbCh7CiAgICAgICAgICAgICAgICBzZW5kTWVzc2FnZTogKG1zZywgdHJhbnNmZXIpID0+IHsKICAgICAgICAgICAgICAgICAgICBwb3N0TWVzc2FnZShtc2csIHRyYW5zZmVyKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBoYW5kbGVNZXNzYWdlOiAobWV0aG9kLCBhcmdzKSA9PiB0aGlzLl9oYW5kbGVNZXNzYWdlKG1ldGhvZCwgYXJncyksCiAgICAgICAgICAgICAgICBoYW5kbGVFdmVudDogKGV2ZW50TmFtZSwgYXJnKSA9PiB0aGlzLl9oYW5kbGVFdmVudChldmVudE5hbWUsIGFyZykKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIG9ubWVzc2FnZShtc2cpIHsKICAgICAgICAgICAgdGhpcy5fcHJvdG9jb2wuaGFuZGxlTWVzc2FnZShtc2cpOwogICAgICAgIH0KICAgICAgICBfaGFuZGxlTWVzc2FnZShtZXRob2QsIGFyZ3MpIHsKICAgICAgICAgICAgaWYgKG1ldGhvZCA9PT0gSU5JVElBTElaRSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMuX3JlcXVlc3RIYW5kbGVyIHx8IHR5cGVvZiB0aGlzLl9yZXF1ZXN0SGFuZGxlclttZXRob2RdICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdNaXNzaW5nIHJlcXVlc3RIYW5kbGVyIG9yIG1ldGhvZDogJyArIG1ldGhvZCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX3JlcXVlc3RIYW5kbGVyW21ldGhvZF0uYXBwbHkodGhpcy5fcmVxdWVzdEhhbmRsZXIsIGFyZ3MpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9oYW5kbGVFdmVudChldmVudE5hbWUsIGFyZykgewogICAgICAgICAgICBpZiAoIXRoaXMuX3JlcXVlc3RIYW5kbGVyKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgcmVxdWVzdEhhbmRsZXJgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHJvcGVydHlJc0R5bmFtaWNFdmVudChldmVudE5hbWUpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuX3JlcXVlc3RIYW5kbGVyW2V2ZW50TmFtZV0uY2FsbCh0aGlzLl9yZXF1ZXN0SGFuZGxlciwgYXJnKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZXZlbnQgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZHluYW1pYyBldmVudCAke2V2ZW50TmFtZX0gb24gcmVxdWVzdCBoYW5kbGVyLmApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUlzRXZlbnQoZXZlbnROYW1lKSkgewogICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLl9yZXF1ZXN0SGFuZGxlcltldmVudE5hbWVdOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBldmVudCAke2V2ZW50TmFtZX0gb24gcmVxdWVzdCBoYW5kbGVyLmApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWFsZm9ybWVkIGV2ZW50IG5hbWUgJHtldmVudE5hbWV9YCk7CiAgICAgICAgfQogICAgICAgIGluaXRpYWxpemUod29ya2VySWQsIGxvYWRlckNvbmZpZywgbW9kdWxlSWQsIGhvc3RNZXRob2RzKSB7CiAgICAgICAgICAgIHRoaXMuX3Byb3RvY29sLnNldFdvcmtlcklkKHdvcmtlcklkKTsKICAgICAgICAgICAgY29uc3QgcHJveHlNZXRob2RSZXF1ZXN0ID0gKG1ldGhvZCwgYXJncykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sLnNlbmRNZXNzYWdlKG1ldGhvZCwgYXJncyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHByb3h5TGlzdGVuID0gKGV2ZW50TmFtZSwgYXJnKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvdG9jb2wubGlzdGVuKGV2ZW50TmFtZSwgYXJnKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY29uc3QgaG9zdFByb3h5ID0gY3JlYXRlUHJveHlPYmplY3QoaG9zdE1ldGhvZHMsIHByb3h5TWV0aG9kUmVxdWVzdCwgcHJveHlMaXN0ZW4pOwogICAgICAgICAgICBpZiAodGhpcy5fcmVxdWVzdEhhbmRsZXJGYWN0b3J5KSB7CiAgICAgICAgICAgICAgICAvLyBzdGF0aWMgcmVxdWVzdCBoYW5kbGVyCiAgICAgICAgICAgICAgICB0aGlzLl9yZXF1ZXN0SGFuZGxlciA9IHRoaXMuX3JlcXVlc3RIYW5kbGVyRmFjdG9yeShob3N0UHJveHkpOwogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShnZXRBbGxNZXRob2ROYW1lcyh0aGlzLl9yZXF1ZXN0SGFuZGxlcikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsb2FkZXJDb25maWcpIHsKICAgICAgICAgICAgICAgIC8vIFJlbW92ZSAnYmFzZVVybCcsIGhhbmRsaW5nIGl0IGlzIGJleW9uZCBzY29wZSBmb3Igbm93CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxvYWRlckNvbmZpZy5iYXNlVXJsICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsb2FkZXJDb25maWdbJ2Jhc2VVcmwnXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbG9hZGVyQ29uZmlnLnBhdGhzICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbG9hZGVyQ29uZmlnLnBhdGhzLnZzICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9hZGVyQ29uZmlnLnBhdGhzWyd2cyddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbG9hZGVyQ29uZmlnLnRydXN0ZWRUeXBlc1BvbGljeSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgdXNlLCBpdCBoYXMgYmVlbiBkZXN0cm95ZWQgZHVyaW5nIHNlcmlhbGl6ZQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBsb2FkZXJDb25maWdbJ3RydXN0ZWRUeXBlc1BvbGljeSddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBpbiBhIHdlYiB3b3JrZXIsIGVuYWJsZSBjYXRjaGluZyBlcnJvcnMKICAgICAgICAgICAgICAgIGxvYWRlckNvbmZpZy5jYXRjaEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGdsb2JhbHMucmVxdWlyZS5jb25maWcobG9hZGVyQ29uZmlnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICAgICAgLy8gVXNlIHRoZSBnbG9iYWwgcmVxdWlyZSB0byBiZSBzdXJlIHRvIGdldCB0aGUgZ2xvYmFsIGNvbmZpZwogICAgICAgICAgICAgICAgLy8gRVNNLWNvbW1lbnQtYmVnaW4KICAgICAgICAgICAgICAgIC8vIAkJCWNvbnN0IHJlcSA9IChnbG9iYWxzLnJlcXVpcmUgfHwgcmVxdWlyZSk7CiAgICAgICAgICAgICAgICAvLyBFU00tY29tbWVudC1lbmQKICAgICAgICAgICAgICAgIC8vIEVTTS11bmNvbW1lbnQtYmVnaW4KICAgICAgICAgICAgICAgIGNvbnN0IHJlcSA9IGdsb2JhbHMucmVxdWlyZTsKICAgICAgICAgICAgICAgIC8vIEVTTS11bmNvbW1lbnQtZW5kCiAgICAgICAgICAgICAgICByZXEoW21vZHVsZUlkXSwgKG1vZHVsZSkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RIYW5kbGVyID0gbW9kdWxlLmNyZWF0ZShob3N0UHJveHkpOwogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fcmVxdWVzdEhhbmRsZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgTm8gUmVxdWVzdEhhbmRsZXIhYCkpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZ2V0QWxsTWV0aG9kTmFtZXModGhpcy5fcmVxdWVzdEhhbmRsZXIpKTsKICAgICAgICAgICAgICAgIH0sIHJlamVjdCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIC8qKgogICAgICogUmVwcmVzZW50cyBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc2VxdWVuY2VzLgogICAgICovCiAgICBjbGFzcyBEaWZmQ2hhbmdlIHsKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IERpZmZDaGFuZ2Ugd2l0aCB0aGUgZ2l2ZW4gc2VxdWVuY2UgaW5mb3JtYXRpb24KICAgICAgICAgKiBhbmQgY29udGVudC4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbExlbmd0aCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRMZW5ndGgpIHsKICAgICAgICAgICAgLy9EZWJ1Zy5Bc3NlcnQob3JpZ2luYWxMZW5ndGggPiAwIHx8IG1vZGlmaWVkTGVuZ3RoID4gMCwgIm9yaWdpbmFsTGVuZ3RoIGFuZCBtb2RpZmllZExlbmd0aCBjYW5ub3QgYm90aCBiZSA8PSAwIik7CiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxTdGFydCA9IG9yaWdpbmFsU3RhcnQ7CiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxMZW5ndGggPSBvcmlnaW5hbExlbmd0aDsKICAgICAgICAgICAgdGhpcy5tb2RpZmllZFN0YXJ0ID0gbW9kaWZpZWRTdGFydDsKICAgICAgICAgICAgdGhpcy5tb2RpZmllZExlbmd0aCA9IG1vZGlmaWVkTGVuZ3RoOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZW5kIHBvaW50IChleGNsdXNpdmUpIG9mIHRoZSBjaGFuZ2UgaW4gdGhlIG9yaWdpbmFsIHNlcXVlbmNlLgogICAgICAgICAqLwogICAgICAgIGdldE9yaWdpbmFsRW5kKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW5hbFN0YXJ0ICsgdGhpcy5vcmlnaW5hbExlbmd0aDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGVuZCBwb2ludCAoZXhjbHVzaXZlKSBvZiB0aGUgY2hhbmdlIGluIHRoZSBtb2RpZmllZCBzZXF1ZW5jZS4KICAgICAgICAgKi8KICAgICAgICBnZXRNb2RpZmllZEVuZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9kaWZpZWRTdGFydCArIHRoaXMubW9kaWZpZWRMZW5ndGg7CiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgZnVuY3Rpb24gbnVtYmVySGFzaCh2YWwsIGluaXRpYWxIYXNoVmFsKSB7CiAgICAgICAgcmV0dXJuICgoKGluaXRpYWxIYXNoVmFsIDw8IDUpIC0gaW5pdGlhbEhhc2hWYWwpICsgdmFsKSB8IDA7IC8vIGhhc2hWYWwgKiAzMSArIGNoLCBrZWVwIGFzIGludDMyCiAgICB9CiAgICBmdW5jdGlvbiBzdHJpbmdIYXNoKHMsIGhhc2hWYWwpIHsKICAgICAgICBoYXNoVmFsID0gbnVtYmVySGFzaCgxNDk0MTcsIGhhc2hWYWwpOwogICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGhhc2hWYWwgPSBudW1iZXJIYXNoKHMuY2hhckNvZGVBdChpKSwgaGFzaFZhbCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBoYXNoVmFsOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY2xhc3MgU3RyaW5nRGlmZlNlcXVlbmNlIHsKICAgICAgICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHsKICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgfQogICAgICAgIGdldEVsZW1lbnRzKCkgewogICAgICAgICAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnNvdXJjZTsKICAgICAgICAgICAgY29uc3QgY2hhcmFjdGVycyA9IG5ldyBJbnQzMkFycmF5KHNvdXJjZS5sZW5ndGgpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gc291cmNlLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzW2ldID0gc291cmNlLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNoYXJhY3RlcnM7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc3RyaW5nRGlmZihvcmlnaW5hbCwgbW9kaWZpZWQsIHByZXR0eSkgewogICAgICAgIHJldHVybiBuZXcgTGNzRGlmZihuZXcgU3RyaW5nRGlmZlNlcXVlbmNlKG9yaWdpbmFsKSwgbmV3IFN0cmluZ0RpZmZTZXF1ZW5jZShtb2RpZmllZCkpLkNvbXB1dGVEaWZmKHByZXR0eSkuY2hhbmdlczsKICAgIH0KICAgIC8vCiAgICAvLyBUaGUgY29kZSBiZWxvdyBoYXMgYmVlbiBwb3J0ZWQgZnJvbSBhIEMjIGltcGxlbWVudGF0aW9uIGluIFZTCiAgICAvLwogICAgY2xhc3MgRGVidWcgewogICAgICAgIHN0YXRpYyBBc3NlcnQoY29uZGl0aW9uLCBtZXNzYWdlKSB7CiAgICAgICAgICAgIGlmICghY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBNeUFycmF5IHsKICAgICAgICAvKioKICAgICAgICAgKiBDb3BpZXMgYSByYW5nZSBvZiBlbGVtZW50cyBmcm9tIGFuIEFycmF5IHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgc291cmNlIGluZGV4IGFuZCBwYXN0ZXMKICAgICAgICAgKiB0aGVtIHRvIGFub3RoZXIgQXJyYXkgc3RhcnRpbmcgYXQgdGhlIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBpbmRleC4gVGhlIGxlbmd0aCBhbmQgdGhlIGluZGV4ZXMKICAgICAgICAgKiBhcmUgc3BlY2lmaWVkIGFzIDY0LWJpdCBpbnRlZ2Vycy4KICAgICAgICAgKiBzb3VyY2VBcnJheToKICAgICAgICAgKgkJVGhlIEFycmF5IHRoYXQgY29udGFpbnMgdGhlIGRhdGEgdG8gY29weS4KICAgICAgICAgKiBzb3VyY2VJbmRleDoKICAgICAgICAgKgkJQSA2NC1iaXQgaW50ZWdlciB0aGF0IHJlcHJlc2VudHMgdGhlIGluZGV4IGluIHRoZSBzb3VyY2VBcnJheSBhdCB3aGljaCBjb3B5aW5nIGJlZ2lucy4KICAgICAgICAgKiBkZXN0aW5hdGlvbkFycmF5OgogICAgICAgICAqCQlUaGUgQXJyYXkgdGhhdCByZWNlaXZlcyB0aGUgZGF0YS4KICAgICAgICAgKiBkZXN0aW5hdGlvbkluZGV4OgogICAgICAgICAqCQlBIDY0LWJpdCBpbnRlZ2VyIHRoYXQgcmVwcmVzZW50cyB0aGUgaW5kZXggaW4gdGhlIGRlc3RpbmF0aW9uQXJyYXkgYXQgd2hpY2ggc3RvcmluZyBiZWdpbnMuCiAgICAgICAgICogbGVuZ3RoOgogICAgICAgICAqCQlBIDY0LWJpdCBpbnRlZ2VyIHRoYXQgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvcHkuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIENvcHkoc291cmNlQXJyYXksIHNvdXJjZUluZGV4LCBkZXN0aW5hdGlvbkFycmF5LCBkZXN0aW5hdGlvbkluZGV4LCBsZW5ndGgpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgZGVzdGluYXRpb25BcnJheVtkZXN0aW5hdGlvbkluZGV4ICsgaV0gPSBzb3VyY2VBcnJheVtzb3VyY2VJbmRleCArIGldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBDb3B5Mihzb3VyY2VBcnJheSwgc291cmNlSW5kZXgsIGRlc3RpbmF0aW9uQXJyYXksIGRlc3RpbmF0aW9uSW5kZXgsIGxlbmd0aCkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkFycmF5W2Rlc3RpbmF0aW9uSW5kZXggKyBpXSA9IHNvdXJjZUFycmF5W3NvdXJjZUluZGV4ICsgaV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEEgdXRpbGl0eSBjbGFzcyB3aGljaCBoZWxwcyB0byBjcmVhdGUgdGhlIHNldCBvZiBEaWZmQ2hhbmdlcyBmcm9tCiAgICAgKiBhIGRpZmZlcmVuY2Ugb3BlcmF0aW9uLiBUaGlzIGNsYXNzIGFjY2VwdHMgb3JpZ2luYWwgRGlmZkVsZW1lbnRzIGFuZAogICAgICogbW9kaWZpZWQgRGlmZkVsZW1lbnRzIHRoYXQgYXJlIGludm9sdmVkIGluIGEgcGFydGljdWxhciBjaGFuZ2UuIFRoZQogICAgICogTWFya05leHRDaGFuZ2UoKSBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBtYXJrIHRoZSBzZXBhcmF0aW9uIGJldHdlZW4KICAgICAqIGRpc3RpbmN0IGNoYW5nZXMuIEF0IHRoZSBlbmQsIHRoZSBDaGFuZ2VzIHByb3BlcnR5IGNhbiBiZSBjYWxsZWQgdG8gcmV0cmlldmUKICAgICAqIHRoZSBjb25zdHJ1Y3RlZCBjaGFuZ2VzLgogICAgICovCiAgICBjbGFzcyBEaWZmQ2hhbmdlSGVscGVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IERpZmZDaGFuZ2VIZWxwZXIgZm9yIHRoZSBnaXZlbiBEaWZmU2VxdWVuY2VzLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLm1fY2hhbmdlcyA9IFtdOwogICAgICAgICAgICB0aGlzLm1fb3JpZ2luYWxTdGFydCA9IDEwNzM3NDE4MjQgLyogTUFYX1NBRkVfU01BTExfSU5URUdFUiAqLzsKICAgICAgICAgICAgdGhpcy5tX21vZGlmaWVkU3RhcnQgPSAxMDczNzQxODI0IC8qIE1BWF9TQUZFX1NNQUxMX0lOVEVHRVIgKi87CiAgICAgICAgICAgIHRoaXMubV9vcmlnaW5hbENvdW50ID0gMDsKICAgICAgICAgICAgdGhpcy5tX21vZGlmaWVkQ291bnQgPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBNYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGNoYW5nZSBpbiB0aGUgc2V0IG9mIGRpZmZlcmVuY2VzLgogICAgICAgICAqLwogICAgICAgIE1hcmtOZXh0Q2hhbmdlKCkgewogICAgICAgICAgICAvLyBPbmx5IGFkZCB0byB0aGUgbGlzdCBpZiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gYWRkCiAgICAgICAgICAgIGlmICh0aGlzLm1fb3JpZ2luYWxDb3VudCA+IDAgfHwgdGhpcy5tX21vZGlmaWVkQ291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5ldyBjaGFuZ2UgdG8gb3VyIGxpc3QKICAgICAgICAgICAgICAgIHRoaXMubV9jaGFuZ2VzLnB1c2gobmV3IERpZmZDaGFuZ2UodGhpcy5tX29yaWdpbmFsU3RhcnQsIHRoaXMubV9vcmlnaW5hbENvdW50LCB0aGlzLm1fbW9kaWZpZWRTdGFydCwgdGhpcy5tX21vZGlmaWVkQ291bnQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZXNldCBmb3IgdGhlIG5leHQgY2hhbmdlCiAgICAgICAgICAgIHRoaXMubV9vcmlnaW5hbENvdW50ID0gMDsKICAgICAgICAgICAgdGhpcy5tX21vZGlmaWVkQ291bnQgPSAwOwogICAgICAgICAgICB0aGlzLm1fb3JpZ2luYWxTdGFydCA9IDEwNzM3NDE4MjQgLyogTUFYX1NBRkVfU01BTExfSU5URUdFUiAqLzsKICAgICAgICAgICAgdGhpcy5tX21vZGlmaWVkU3RhcnQgPSAxMDczNzQxODI0IC8qIE1BWF9TQUZFX1NNQUxMX0lOVEVHRVIgKi87CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgdGhlIG9yaWdpbmFsIGVsZW1lbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIHRvIHRoZSBlbGVtZW50cwogICAgICAgICAqIGFmZmVjdGVkIGJ5IHRoZSBjdXJyZW50IGNoYW5nZS4gVGhlIG1vZGlmaWVkIGluZGV4IGdpdmVzIGNvbnRleHQKICAgICAgICAgKiB0byB0aGUgY2hhbmdlIHBvc2l0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgb3JpZ2luYWwgc2VxdWVuY2UuCiAgICAgICAgICogQHBhcmFtIG9yaWdpbmFsSW5kZXggVGhlIGluZGV4IG9mIHRoZSBvcmlnaW5hbCBlbGVtZW50IHRvIGFkZC4KICAgICAgICAgKiBAcGFyYW0gbW9kaWZpZWRJbmRleCBUaGUgaW5kZXggb2YgdGhlIG1vZGlmaWVkIGVsZW1lbnQgdGhhdCBwcm92aWRlcyBjb3JyZXNwb25kaW5nIHBvc2l0aW9uIGluIHRoZSBtb2RpZmllZCBzZXF1ZW5jZS4KICAgICAgICAgKi8KICAgICAgICBBZGRPcmlnaW5hbEVsZW1lbnQob3JpZ2luYWxJbmRleCwgbW9kaWZpZWRJbmRleCkgewogICAgICAgICAgICAvLyBUaGUgJ3RydWUnIHN0YXJ0IGluZGV4IGlzIHRoZSBzbWFsbGVzdCBvZiB0aGUgb25lcyB3ZSd2ZSBzZWVuCiAgICAgICAgICAgIHRoaXMubV9vcmlnaW5hbFN0YXJ0ID0gTWF0aC5taW4odGhpcy5tX29yaWdpbmFsU3RhcnQsIG9yaWdpbmFsSW5kZXgpOwogICAgICAgICAgICB0aGlzLm1fbW9kaWZpZWRTdGFydCA9IE1hdGgubWluKHRoaXMubV9tb2RpZmllZFN0YXJ0LCBtb2RpZmllZEluZGV4KTsKICAgICAgICAgICAgdGhpcy5tX29yaWdpbmFsQ291bnQrKzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyB0aGUgbW9kaWZpZWQgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gdG8gdGhlIGVsZW1lbnRzCiAgICAgICAgICogYWZmZWN0ZWQgYnkgdGhlIGN1cnJlbnQgY2hhbmdlLiBUaGUgb3JpZ2luYWwgaW5kZXggZ2l2ZXMgY29udGV4dAogICAgICAgICAqIHRvIHRoZSBjaGFuZ2UgcG9zaXRpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBtb2RpZmllZCBzZXF1ZW5jZS4KICAgICAgICAgKiBAcGFyYW0gb3JpZ2luYWxJbmRleCBUaGUgaW5kZXggb2YgdGhlIG9yaWdpbmFsIGVsZW1lbnQgdGhhdCBwcm92aWRlcyBjb3JyZXNwb25kaW5nIHBvc2l0aW9uIGluIHRoZSBvcmlnaW5hbCBzZXF1ZW5jZS4KICAgICAgICAgKiBAcGFyYW0gbW9kaWZpZWRJbmRleCBUaGUgaW5kZXggb2YgdGhlIG1vZGlmaWVkIGVsZW1lbnQgdG8gYWRkLgogICAgICAgICAqLwogICAgICAgIEFkZE1vZGlmaWVkRWxlbWVudChvcmlnaW5hbEluZGV4LCBtb2RpZmllZEluZGV4KSB7CiAgICAgICAgICAgIC8vIFRoZSAndHJ1ZScgc3RhcnQgaW5kZXggaXMgdGhlIHNtYWxsZXN0IG9mIHRoZSBvbmVzIHdlJ3ZlIHNlZW4KICAgICAgICAgICAgdGhpcy5tX29yaWdpbmFsU3RhcnQgPSBNYXRoLm1pbih0aGlzLm1fb3JpZ2luYWxTdGFydCwgb3JpZ2luYWxJbmRleCk7CiAgICAgICAgICAgIHRoaXMubV9tb2RpZmllZFN0YXJ0ID0gTWF0aC5taW4odGhpcy5tX21vZGlmaWVkU3RhcnQsIG1vZGlmaWVkSW5kZXgpOwogICAgICAgICAgICB0aGlzLm1fbW9kaWZpZWRDb3VudCsrOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYWxsIG9mIHRoZSBjaGFuZ2VzIG1hcmtlZCBieSB0aGUgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgZ2V0Q2hhbmdlcygpIHsKICAgICAgICAgICAgaWYgKHRoaXMubV9vcmlnaW5hbENvdW50ID4gMCB8fCB0aGlzLm1fbW9kaWZpZWRDb3VudCA+IDApIHsKICAgICAgICAgICAgICAgIC8vIEZpbmlzaCB1cCBvbiB3aGF0ZXZlciBpcyBsZWZ0CiAgICAgICAgICAgICAgICB0aGlzLk1hcmtOZXh0Q2hhbmdlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMubV9jaGFuZ2VzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYWxsIG9mIHRoZSBjaGFuZ2VzIG1hcmtlZCBieSB0aGUgY2xhc3MgaW4gdGhlIHJldmVyc2Ugb3JkZXIKICAgICAgICAgKi8KICAgICAgICBnZXRSZXZlcnNlQ2hhbmdlcygpIHsKICAgICAgICAgICAgaWYgKHRoaXMubV9vcmlnaW5hbENvdW50ID4gMCB8fCB0aGlzLm1fbW9kaWZpZWRDb3VudCA+IDApIHsKICAgICAgICAgICAgICAgIC8vIEZpbmlzaCB1cCBvbiB3aGF0ZXZlciBpcyBsZWZ0CiAgICAgICAgICAgICAgICB0aGlzLk1hcmtOZXh0Q2hhbmdlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5tX2NoYW5nZXMucmV2ZXJzZSgpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5tX2NoYW5nZXM7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGlmZmVyZW5jZSBhbGdvcml0aG0gZGVzY3JpYmVkIGluCiAgICAgKiAiQW4gTyhORCkgRGlmZmVyZW5jZSBBbGdvcml0aG0gYW5kIGl0cyB2YXJpYXRpb25zIiBieSBFdWdlbmUgVy4gTXllcnMKICAgICAqLwogICAgY2xhc3MgTGNzRGlmZiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0cyB0aGUgRGlmZkZpbmRlcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKG9yaWdpbmFsU2VxdWVuY2UsIG1vZGlmaWVkU2VxdWVuY2UsIGNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZSA9IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5Db250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUgPSBjb250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGU7CiAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsU2VxdWVuY2UgPSBvcmlnaW5hbFNlcXVlbmNlOwogICAgICAgICAgICB0aGlzLl9tb2RpZmllZFNlcXVlbmNlID0gbW9kaWZpZWRTZXF1ZW5jZTsKICAgICAgICAgICAgY29uc3QgW29yaWdpbmFsU3RyaW5nRWxlbWVudHMsIG9yaWdpbmFsRWxlbWVudHNPckhhc2gsIG9yaWdpbmFsSGFzU3RyaW5nc10gPSBMY3NEaWZmLl9nZXRFbGVtZW50cyhvcmlnaW5hbFNlcXVlbmNlKTsKICAgICAgICAgICAgY29uc3QgW21vZGlmaWVkU3RyaW5nRWxlbWVudHMsIG1vZGlmaWVkRWxlbWVudHNPckhhc2gsIG1vZGlmaWVkSGFzU3RyaW5nc10gPSBMY3NEaWZmLl9nZXRFbGVtZW50cyhtb2RpZmllZFNlcXVlbmNlKTsKICAgICAgICAgICAgdGhpcy5faGFzU3RyaW5ncyA9IChvcmlnaW5hbEhhc1N0cmluZ3MgJiYgbW9kaWZpZWRIYXNTdHJpbmdzKTsKICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50cyA9IG9yaWdpbmFsU3RyaW5nRWxlbWVudHM7CiAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2ggPSBvcmlnaW5hbEVsZW1lbnRzT3JIYXNoOwogICAgICAgICAgICB0aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzID0gbW9kaWZpZWRTdHJpbmdFbGVtZW50czsKICAgICAgICAgICAgdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaCA9IG1vZGlmaWVkRWxlbWVudHNPckhhc2g7CiAgICAgICAgICAgIHRoaXMubV9mb3J3YXJkSGlzdG9yeSA9IFtdOwogICAgICAgICAgICB0aGlzLm1fcmV2ZXJzZUhpc3RvcnkgPSBbXTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIF9pc1N0cmluZ0FycmF5KGFycikgewogICAgICAgICAgICByZXR1cm4gKGFyci5sZW5ndGggPiAwICYmIHR5cGVvZiBhcnJbMF0gPT09ICdzdHJpbmcnKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIF9nZXRFbGVtZW50cyhzZXF1ZW5jZSkgewogICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHNlcXVlbmNlLmdldEVsZW1lbnRzKCk7CiAgICAgICAgICAgIGlmIChMY3NEaWZmLl9pc1N0cmluZ0FycmF5KGVsZW1lbnRzKSkgewogICAgICAgICAgICAgICAgY29uc3QgaGFzaGVzID0gbmV3IEludDMyQXJyYXkoZWxlbWVudHMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgIGhhc2hlc1tpXSA9IHN0cmluZ0hhc2goZWxlbWVudHNbaV0sIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFtlbGVtZW50cywgaGFzaGVzLCB0cnVlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZWxlbWVudHMgaW5zdGFuY2VvZiBJbnQzMkFycmF5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW1tdLCBlbGVtZW50cywgZmFsc2VdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbW10sIG5ldyBJbnQzMkFycmF5KGVsZW1lbnRzKSwgZmFsc2VdOwogICAgICAgIH0KICAgICAgICBFbGVtZW50c0FyZUVxdWFsKG9yaWdpbmFsSW5kZXgsIG5ld0luZGV4KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoW29yaWdpbmFsSW5kZXhdICE9PSB0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoW25ld0luZGV4XSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAodGhpcy5faGFzU3RyaW5ncyA/IHRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbb3JpZ2luYWxJbmRleF0gPT09IHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbbmV3SW5kZXhdIDogdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIEVsZW1lbnRzQXJlU3RyaWN0RXF1YWwob3JpZ2luYWxJbmRleCwgbmV3SW5kZXgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLkVsZW1lbnRzQXJlRXF1YWwob3JpZ2luYWxJbmRleCwgbmV3SW5kZXgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxFbGVtZW50ID0gTGNzRGlmZi5fZ2V0U3RyaWN0RWxlbWVudCh0aGlzLl9vcmlnaW5hbFNlcXVlbmNlLCBvcmlnaW5hbEluZGV4KTsKICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRFbGVtZW50ID0gTGNzRGlmZi5fZ2V0U3RyaWN0RWxlbWVudCh0aGlzLl9tb2RpZmllZFNlcXVlbmNlLCBuZXdJbmRleCk7CiAgICAgICAgICAgIHJldHVybiAob3JpZ2luYWxFbGVtZW50ID09PSBtb2RpZmllZEVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgX2dldFN0cmljdEVsZW1lbnQoc2VxdWVuY2UsIGluZGV4KSB7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VxdWVuY2UuZ2V0U3RyaWN0RWxlbWVudCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlLmdldFN0cmljdEVsZW1lbnQoaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBPcmlnaW5hbEVsZW1lbnRzQXJlRXF1YWwoaW5kZXgxLCBpbmRleDIpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2hbaW5kZXgxXSAhPT0gdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaFtpbmRleDJdKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9oYXNTdHJpbmdzID8gdGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1tpbmRleDFdID09PSB0aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW2luZGV4Ml0gOiB0cnVlKTsKICAgICAgICB9CiAgICAgICAgTW9kaWZpZWRFbGVtZW50c0FyZUVxdWFsKGluZGV4MSwgaW5kZXgyKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoW2luZGV4MV0gIT09IHRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2hbaW5kZXgyXSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAodGhpcy5faGFzU3RyaW5ncyA/IHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbaW5kZXgxXSA9PT0gdGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50c1tpbmRleDJdIDogdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIENvbXB1dGVEaWZmKHByZXR0eSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fQ29tcHV0ZURpZmYoMCwgdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaC5sZW5ndGggLSAxLCAwLCB0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoLmxlbmd0aCAtIDEsIHByZXR0eSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbXB1dGVzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBvcmlnaW5hbCBhbmQgbW9kaWZpZWQgaW5wdXQKICAgICAgICAgKiBzZXF1ZW5jZXMgb24gdGhlIGJvdW5kZWQgcmFuZ2UuCiAgICAgICAgICogQHJldHVybnMgQW4gYXJyYXkgb2YgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBpbnB1dCBzZXF1ZW5jZXMuCiAgICAgICAgICovCiAgICAgICAgX0NvbXB1dGVEaWZmKG9yaWdpbmFsU3RhcnQsIG9yaWdpbmFsRW5kLCBtb2RpZmllZFN0YXJ0LCBtb2RpZmllZEVuZCwgcHJldHR5KSB7CiAgICAgICAgICAgIGNvbnN0IHF1aXRFYXJseUFyciA9IFtmYWxzZV07CiAgICAgICAgICAgIGxldCBjaGFuZ2VzID0gdGhpcy5Db21wdXRlRGlmZlJlY3Vyc2l2ZShvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEVuZCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQsIHF1aXRFYXJseUFycik7CiAgICAgICAgICAgIGlmIChwcmV0dHkpIHsKICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gY2xlYW4gdXAgdGhlIGNvbXB1dGVkIGRpZmYgdG8gYmUgbW9yZSBpbnR1aXRpdmUKICAgICAgICAgICAgICAgIC8vIGJ1dCBpdCB0dXJucyBvdXQgdGhpcyBjYW5ub3QgYmUgZG9uZSBjb3JyZWN0bHkgdW50aWwgdGhlIGVudGlyZSBzZXQKICAgICAgICAgICAgICAgIC8vIG9mIGRpZmZzIGhhdmUgYmVlbiBjb21wdXRlZAogICAgICAgICAgICAgICAgY2hhbmdlcyA9IHRoaXMuUHJldHRpZnlDaGFuZ2VzKGNoYW5nZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBxdWl0RWFybHk6IHF1aXRFYXJseUFyclswXSwKICAgICAgICAgICAgICAgIGNoYW5nZXM6IGNoYW5nZXMKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUHJpdmF0ZSBoZWxwZXIgbWV0aG9kIHdoaWNoIGNvbXB1dGVzIHRoZSBkaWZmZXJlbmNlcyBvbiB0aGUgYm91bmRlZCByYW5nZQogICAgICAgICAqIHJlY3Vyc2l2ZWx5LgogICAgICAgICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gaW5wdXQgc2VxdWVuY2VzLgogICAgICAgICAqLwogICAgICAgIENvbXB1dGVEaWZmUmVjdXJzaXZlKG9yaWdpbmFsU3RhcnQsIG9yaWdpbmFsRW5kLCBtb2RpZmllZFN0YXJ0LCBtb2RpZmllZEVuZCwgcXVpdEVhcmx5QXJyKSB7CiAgICAgICAgICAgIHF1aXRFYXJseUFyclswXSA9IGZhbHNlOwogICAgICAgICAgICAvLyBGaW5kIHRoZSBzdGFydCBvZiB0aGUgZGlmZmVyZW5jZXMKICAgICAgICAgICAgd2hpbGUgKG9yaWdpbmFsU3RhcnQgPD0gb3JpZ2luYWxFbmQgJiYgbW9kaWZpZWRTdGFydCA8PSBtb2RpZmllZEVuZCAmJiB0aGlzLkVsZW1lbnRzQXJlRXF1YWwob3JpZ2luYWxTdGFydCwgbW9kaWZpZWRTdGFydCkpIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnQrKzsKICAgICAgICAgICAgICAgIG1vZGlmaWVkU3RhcnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGaW5kIHRoZSBlbmQgb2YgdGhlIGRpZmZlcmVuY2VzCiAgICAgICAgICAgIHdoaWxlIChvcmlnaW5hbEVuZCA+PSBvcmlnaW5hbFN0YXJ0ICYmIG1vZGlmaWVkRW5kID49IG1vZGlmaWVkU3RhcnQgJiYgdGhpcy5FbGVtZW50c0FyZUVxdWFsKG9yaWdpbmFsRW5kLCBtb2RpZmllZEVuZCkpIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kLS07CiAgICAgICAgICAgICAgICBtb2RpZmllZEVuZC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEluIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUgd2UgZWl0aGVyIGhhdmUgYWxsIGluc2VydGlvbnMgb3IgYWxsIGRlbGV0aW9ucyBvciB0aGUgc2VxdWVuY2VzIGFyZSBpZGVudGljYWwKICAgICAgICAgICAgaWYgKG9yaWdpbmFsU3RhcnQgPiBvcmlnaW5hbEVuZCB8fCBtb2RpZmllZFN0YXJ0ID4gbW9kaWZpZWRFbmQpIHsKICAgICAgICAgICAgICAgIGxldCBjaGFuZ2VzOwogICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVkU3RhcnQgPD0gbW9kaWZpZWRFbmQpIHsKICAgICAgICAgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQob3JpZ2luYWxTdGFydCA9PT0gb3JpZ2luYWxFbmQgKyAxLCAnb3JpZ2luYWxTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG9yaWdpbmFsRW5kJyk7CiAgICAgICAgICAgICAgICAgICAgLy8gQWxsIGluc2VydGlvbnMKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzID0gWwogICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlmZkNoYW5nZShvcmlnaW5hbFN0YXJ0LCAwLCBtb2RpZmllZFN0YXJ0LCBtb2RpZmllZEVuZCAtIG1vZGlmaWVkU3RhcnQgKyAxKQogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcmlnaW5hbFN0YXJ0IDw9IG9yaWdpbmFsRW5kKSB7CiAgICAgICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KG1vZGlmaWVkU3RhcnQgPT09IG1vZGlmaWVkRW5kICsgMSwgJ21vZGlmaWVkU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBtb2RpZmllZEVuZCcpOwogICAgICAgICAgICAgICAgICAgIC8vIEFsbCBkZWxldGlvbnMKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzID0gWwogICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlmZkNoYW5nZShvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEVuZCAtIG9yaWdpbmFsU3RhcnQgKyAxLCBtb2RpZmllZFN0YXJ0LCAwKQogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQob3JpZ2luYWxTdGFydCA9PT0gb3JpZ2luYWxFbmQgKyAxLCAnb3JpZ2luYWxTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG9yaWdpbmFsRW5kJyk7CiAgICAgICAgICAgICAgICAgICAgRGVidWcuQXNzZXJ0KG1vZGlmaWVkU3RhcnQgPT09IG1vZGlmaWVkRW5kICsgMSwgJ21vZGlmaWVkU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBtb2RpZmllZEVuZCcpOwogICAgICAgICAgICAgICAgICAgIC8vIElkZW50aWNhbCBzZXF1ZW5jZXMgLSBObyBkaWZmZXJlbmNlcwogICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRoaXMgcHJvYmxlbSBjYW4gYmUgc29sdmVkIHVzaW5nIHRoZSBEaXZpZGUtQW5kLUNvbnF1ZXIgdGVjaG5pcXVlLgogICAgICAgICAgICBjb25zdCBtaWRPcmlnaW5hbEFyciA9IFswXTsKICAgICAgICAgICAgY29uc3QgbWlkTW9kaWZpZWRBcnIgPSBbMF07CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuQ29tcHV0ZVJlY3Vyc2lvblBvaW50KG9yaWdpbmFsU3RhcnQsIG9yaWdpbmFsRW5kLCBtb2RpZmllZFN0YXJ0LCBtb2RpZmllZEVuZCwgbWlkT3JpZ2luYWxBcnIsIG1pZE1vZGlmaWVkQXJyLCBxdWl0RWFybHlBcnIpOwogICAgICAgICAgICBjb25zdCBtaWRPcmlnaW5hbCA9IG1pZE9yaWdpbmFsQXJyWzBdOwogICAgICAgICAgICBjb25zdCBtaWRNb2RpZmllZCA9IG1pZE1vZGlmaWVkQXJyWzBdOwogICAgICAgICAgICBpZiAocmVzdWx0ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBSZXN1bHQgaXMgbm90LW51bGwgd2hlbiB0aGVyZSB3YXMgZW5vdWdoIG1lbW9yeSB0byBjb21wdXRlIHRoZSBjaGFuZ2VzIHdoaWxlCiAgICAgICAgICAgICAgICAvLyBzZWFyY2hpbmcgZm9yIHRoZSByZWN1cnNpb24gcG9pbnQKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIXF1aXRFYXJseUFyclswXSkgewogICAgICAgICAgICAgICAgLy8gV2UgY2FuIGJyZWFrIHRoZSBwcm9ibGVtIGRvd24gcmVjdXJzaXZlbHkgYnkgZmluZGluZyB0aGUgY2hhbmdlcyBpbiB0aGUKICAgICAgICAgICAgICAgIC8vIEZpcnN0IEhhbGY6ICAgKG9yaWdpbmFsU3RhcnQsIG1vZGlmaWVkU3RhcnQpIHRvIChtaWRPcmlnaW5hbCwgbWlkTW9kaWZpZWQpCiAgICAgICAgICAgICAgICAvLyBTZWNvbmQgSGFsZjogIChtaWRPcmlnaW5hbCArIDEsIG1pbk1vZGlmaWVkICsgMSkgdG8gKG9yaWdpbmFsRW5kLCBtb2RpZmllZEVuZCkKICAgICAgICAgICAgICAgIC8vIE5PVEU6IENvbXB1dGVEaWZmKCkgaXMgaW5jbHVzaXZlLCB0aGVyZWZvcmUgdGhlIHNlY29uZCByYW5nZSBzdGFydHMgb24gdGhlIG5leHQgcG9pbnQKICAgICAgICAgICAgICAgIGNvbnN0IGxlZnRDaGFuZ2VzID0gdGhpcy5Db21wdXRlRGlmZlJlY3Vyc2l2ZShvcmlnaW5hbFN0YXJ0LCBtaWRPcmlnaW5hbCwgbW9kaWZpZWRTdGFydCwgbWlkTW9kaWZpZWQsIHF1aXRFYXJseUFycik7CiAgICAgICAgICAgICAgICBsZXQgcmlnaHRDaGFuZ2VzID0gW107CiAgICAgICAgICAgICAgICBpZiAoIXF1aXRFYXJseUFyclswXSkgewogICAgICAgICAgICAgICAgICAgIHJpZ2h0Q2hhbmdlcyA9IHRoaXMuQ29tcHV0ZURpZmZSZWN1cnNpdmUobWlkT3JpZ2luYWwgKyAxLCBvcmlnaW5hbEVuZCwgbWlkTW9kaWZpZWQgKyAxLCBtb2RpZmllZEVuZCwgcXVpdEVhcmx5QXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBoYXZlIHRpbWUgdG8gZmluaXNoIHRoZSBmaXJzdCBoYWxmLCBzbyB3ZSBkb24ndCBoYXZlIHRpbWUgdG8gY29tcHV0ZSB0aGlzIGhhbGYuCiAgICAgICAgICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGVudGlyZSByZXN0IG9mIHRoZSBzZXF1ZW5jZSBkaWZmZXJlbnQuCiAgICAgICAgICAgICAgICAgICAgcmlnaHRDaGFuZ2VzID0gWwogICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlmZkNoYW5nZShtaWRPcmlnaW5hbCArIDEsIG9yaWdpbmFsRW5kIC0gKG1pZE9yaWdpbmFsICsgMSkgKyAxLCBtaWRNb2RpZmllZCArIDEsIG1vZGlmaWVkRW5kIC0gKG1pZE1vZGlmaWVkICsgMSkgKyAxKQogICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5Db25jYXRlbmF0ZUNoYW5nZXMobGVmdENoYW5nZXMsIHJpZ2h0Q2hhbmdlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgd2UgaGl0IGhlcmUsIHdlIHF1aXQgZWFybHksIGFuZCBzbyBjYW4ndCByZXR1cm4gYW55dGhpbmcgbWVhbmluZ2Z1bAogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgbmV3IERpZmZDaGFuZ2Uob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxFbmQgLSBvcmlnaW5hbFN0YXJ0ICsgMSwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQgLSBtb2RpZmllZFN0YXJ0ICsgMSkKICAgICAgICAgICAgXTsKICAgICAgICB9CiAgICAgICAgV0FMS1RSQUNFKGRpYWdvbmFsRm9yd2FyZEJhc2UsIGRpYWdvbmFsRm9yd2FyZFN0YXJ0LCBkaWFnb25hbEZvcndhcmRFbmQsIGRpYWdvbmFsRm9yd2FyZE9mZnNldCwgZGlhZ29uYWxSZXZlcnNlQmFzZSwgZGlhZ29uYWxSZXZlcnNlU3RhcnQsIGRpYWdvbmFsUmV2ZXJzZUVuZCwgZGlhZ29uYWxSZXZlcnNlT2Zmc2V0LCBmb3J3YXJkUG9pbnRzLCByZXZlcnNlUG9pbnRzLCBvcmlnaW5hbEluZGV4LCBvcmlnaW5hbEVuZCwgbWlkT3JpZ2luYWxBcnIsIG1vZGlmaWVkSW5kZXgsIG1vZGlmaWVkRW5kLCBtaWRNb2RpZmllZEFyciwgZGVsdGFJc0V2ZW4sIHF1aXRFYXJseUFycikgewogICAgICAgICAgICBsZXQgZm9yd2FyZENoYW5nZXMgPSBudWxsOwogICAgICAgICAgICBsZXQgcmV2ZXJzZUNoYW5nZXMgPSBudWxsOwogICAgICAgICAgICAvLyBGaXJzdCwgd2FsayBiYWNrd2FyZCB0aHJvdWdoIHRoZSBmb3J3YXJkIGRpYWdvbmFscyBoaXN0b3J5CiAgICAgICAgICAgIGxldCBjaGFuZ2VIZWxwZXIgPSBuZXcgRGlmZkNoYW5nZUhlbHBlcigpOwogICAgICAgICAgICBsZXQgZGlhZ29uYWxNaW4gPSBkaWFnb25hbEZvcndhcmRTdGFydDsKICAgICAgICAgICAgbGV0IGRpYWdvbmFsTWF4ID0gZGlhZ29uYWxGb3J3YXJkRW5kOwogICAgICAgICAgICBsZXQgZGlhZ29uYWxSZWxhdGl2ZSA9IChtaWRPcmlnaW5hbEFyclswXSAtIG1pZE1vZGlmaWVkQXJyWzBdKSAtIGRpYWdvbmFsRm9yd2FyZE9mZnNldDsKICAgICAgICAgICAgbGV0IGxhc3RPcmlnaW5hbEluZGV4ID0gLTEwNzM3NDE4MjQgLyogTUlOX1NBRkVfU01BTExfSU5URUdFUiAqLzsKICAgICAgICAgICAgbGV0IGhpc3RvcnlJbmRleCA9IHRoaXMubV9mb3J3YXJkSGlzdG9yeS5sZW5ndGggLSAxOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGRpYWdvbmFsIGluZGV4IGZyb20gdGhlIHJlbGF0aXZlIGRpYWdvbmFsIG51bWJlcgogICAgICAgICAgICAgICAgY29uc3QgZGlhZ29uYWwgPSBkaWFnb25hbFJlbGF0aXZlICsgZGlhZ29uYWxGb3J3YXJkQmFzZTsKICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hlcmUgd2UgY2FtZSBmcm9tCiAgICAgICAgICAgICAgICBpZiAoZGlhZ29uYWwgPT09IGRpYWdvbmFsTWluIHx8IChkaWFnb25hbCA8IGRpYWdvbmFsTWF4ICYmIGZvcndhcmRQb2ludHNbZGlhZ29uYWwgLSAxXSA8IGZvcndhcmRQb2ludHNbZGlhZ29uYWwgKyAxXSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBWZXJ0aWNhbCBsaW5lICh0aGUgZWxlbWVudCBpcyBhbiBpbnNlcnQpCiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxJbmRleCA9IGZvcndhcmRQb2ludHNbZGlhZ29uYWwgKyAxXTsKICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEluZGV4ID0gb3JpZ2luYWxJbmRleCAtIGRpYWdvbmFsUmVsYXRpdmUgLSBkaWFnb25hbEZvcndhcmRPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSW5kZXggPCBsYXN0T3JpZ2luYWxJbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VIZWxwZXIuTWFya05leHRDaGFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGFzdE9yaWdpbmFsSW5kZXggPSBvcmlnaW5hbEluZGV4OwogICAgICAgICAgICAgICAgICAgIGNoYW5nZUhlbHBlci5BZGRNb2RpZmllZEVsZW1lbnQob3JpZ2luYWxJbmRleCArIDEsIG1vZGlmaWVkSW5kZXgpOwogICAgICAgICAgICAgICAgICAgIGRpYWdvbmFsUmVsYXRpdmUgPSAoZGlhZ29uYWwgKyAxKSAtIGRpYWdvbmFsRm9yd2FyZEJhc2U7IC8vU2V0dXAgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSG9yaXpvbnRhbCBsaW5lICh0aGUgZWxlbWVudCBpcyBhIGRlbGV0aW9uKQogICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSW5kZXggPSBmb3J3YXJkUG9pbnRzW2RpYWdvbmFsIC0gMV0gKyAxOwogICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkSW5kZXggPSBvcmlnaW5hbEluZGV4IC0gZGlhZ29uYWxSZWxhdGl2ZSAtIGRpYWdvbmFsRm9yd2FyZE9mZnNldDsKICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJbmRleCA8IGxhc3RPcmlnaW5hbEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUhlbHBlci5NYXJrTmV4dENoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsYXN0T3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsSW5kZXggLSAxOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZUhlbHBlci5BZGRPcmlnaW5hbEVsZW1lbnQob3JpZ2luYWxJbmRleCwgbW9kaWZpZWRJbmRleCArIDEpOwogICAgICAgICAgICAgICAgICAgIGRpYWdvbmFsUmVsYXRpdmUgPSAoZGlhZ29uYWwgLSAxKSAtIGRpYWdvbmFsRm9yd2FyZEJhc2U7IC8vU2V0dXAgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhpc3RvcnlJbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yd2FyZFBvaW50cyA9IHRoaXMubV9mb3J3YXJkSGlzdG9yeVtoaXN0b3J5SW5kZXhdOwogICAgICAgICAgICAgICAgICAgIGRpYWdvbmFsRm9yd2FyZEJhc2UgPSBmb3J3YXJkUG9pbnRzWzBdOyAvL1dlIHN0b3JlZCB0aGlzIGluIHRoZSBmaXJzdCBzcG90CiAgICAgICAgICAgICAgICAgICAgZGlhZ29uYWxNaW4gPSAxOwogICAgICAgICAgICAgICAgICAgIGRpYWdvbmFsTWF4ID0gZm9yd2FyZFBvaW50cy5sZW5ndGggLSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHdoaWxlICgtLWhpc3RvcnlJbmRleCA+PSAtMSk7CiAgICAgICAgICAgIC8vIElyb25pY2FsbHksIHdlIGdldCB0aGUgZm9yd2FyZCBjaGFuZ2VzIGFzIHRoZSByZXZlcnNlIG9mIHRoZQogICAgICAgICAgICAvLyBvcmRlciB3ZSBhZGRlZCB0aGVtIHNpbmNlIHdlIHRlY2huaWNhbGx5IGFkZGVkIHRoZW0gYmFja3dhcmRzCiAgICAgICAgICAgIGZvcndhcmRDaGFuZ2VzID0gY2hhbmdlSGVscGVyLmdldFJldmVyc2VDaGFuZ2VzKCk7CiAgICAgICAgICAgIGlmIChxdWl0RWFybHlBcnJbMF0pIHsKICAgICAgICAgICAgICAgIC8vIFRPRE86IENhbGN1bGF0ZSBhIHBhcnRpYWwgZnJvbSB0aGUgcmV2ZXJzZSBkaWFnb25hbHMuCiAgICAgICAgICAgICAgICAvLyAgICAgICBGb3Igbm93LCBqdXN0IGFzc3VtZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBtaWRPcmlnaW5hbC9taWRNb2RpZmllZCBwb2ludCBpcyBhIGRpZmYKICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbFN0YXJ0UG9pbnQgPSBtaWRPcmlnaW5hbEFyclswXSArIDE7CiAgICAgICAgICAgICAgICBsZXQgbW9kaWZpZWRTdGFydFBvaW50ID0gbWlkTW9kaWZpZWRBcnJbMF0gKyAxOwogICAgICAgICAgICAgICAgaWYgKGZvcndhcmRDaGFuZ2VzICE9PSBudWxsICYmIGZvcndhcmRDaGFuZ2VzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0Rm9yd2FyZENoYW5nZSA9IGZvcndhcmRDaGFuZ2VzW2ZvcndhcmRDaGFuZ2VzLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRQb2ludCA9IE1hdGgubWF4KG9yaWdpbmFsU3RhcnRQb2ludCwgbGFzdEZvcndhcmRDaGFuZ2UuZ2V0T3JpZ2luYWxFbmQoKSk7CiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydFBvaW50ID0gTWF0aC5tYXgobW9kaWZpZWRTdGFydFBvaW50LCBsYXN0Rm9yd2FyZENoYW5nZS5nZXRNb2RpZmllZEVuZCgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldmVyc2VDaGFuZ2VzID0gWwogICAgICAgICAgICAgICAgICAgIG5ldyBEaWZmQ2hhbmdlKG9yaWdpbmFsU3RhcnRQb2ludCwgb3JpZ2luYWxFbmQgLSBvcmlnaW5hbFN0YXJ0UG9pbnQgKyAxLCBtb2RpZmllZFN0YXJ0UG9pbnQsIG1vZGlmaWVkRW5kIC0gbW9kaWZpZWRTdGFydFBvaW50ICsgMSkKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBOb3cgd2FsayBiYWNrd2FyZCB0aHJvdWdoIHRoZSByZXZlcnNlIGRpYWdvbmFscyBoaXN0b3J5CiAgICAgICAgICAgICAgICBjaGFuZ2VIZWxwZXIgPSBuZXcgRGlmZkNoYW5nZUhlbHBlcigpOwogICAgICAgICAgICAgICAgZGlhZ29uYWxNaW4gPSBkaWFnb25hbFJldmVyc2VTdGFydDsKICAgICAgICAgICAgICAgIGRpYWdvbmFsTWF4ID0gZGlhZ29uYWxSZXZlcnNlRW5kOwogICAgICAgICAgICAgICAgZGlhZ29uYWxSZWxhdGl2ZSA9IChtaWRPcmlnaW5hbEFyclswXSAtIG1pZE1vZGlmaWVkQXJyWzBdKSAtIGRpYWdvbmFsUmV2ZXJzZU9mZnNldDsKICAgICAgICAgICAgICAgIGxhc3RPcmlnaW5hbEluZGV4ID0gMTA3Mzc0MTgyNCAvKiBNQVhfU0FGRV9TTUFMTF9JTlRFR0VSICovOwogICAgICAgICAgICAgICAgaGlzdG9yeUluZGV4ID0gKGRlbHRhSXNFdmVuKSA/IHRoaXMubV9yZXZlcnNlSGlzdG9yeS5sZW5ndGggLSAxIDogdGhpcy5tX3JldmVyc2VIaXN0b3J5Lmxlbmd0aCAtIDI7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBkaWFnb25hbCBpbmRleCBmcm9tIHRoZSByZWxhdGl2ZSBkaWFnb25hbCBudW1iZXIKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaWFnb25hbCA9IGRpYWdvbmFsUmVsYXRpdmUgKyBkaWFnb25hbFJldmVyc2VCYXNlOwogICAgICAgICAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgd2hlcmUgd2UgY2FtZSBmcm9tCiAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWdvbmFsID09PSBkaWFnb25hbE1pbiB8fCAoZGlhZ29uYWwgPCBkaWFnb25hbE1heCAmJiByZXZlcnNlUG9pbnRzW2RpYWdvbmFsIC0gMV0gPj0gcmV2ZXJzZVBvaW50c1tkaWFnb25hbCArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBIb3Jpem9udGFsIGxpbmUgKHRoZSBlbGVtZW50IGlzIGEgZGVsZXRpb24pKQogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4ID0gcmV2ZXJzZVBvaW50c1tkaWFnb25hbCArIDFdIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRJbmRleCA9IG9yaWdpbmFsSW5kZXggLSBkaWFnb25hbFJlbGF0aXZlIC0gZGlhZ29uYWxSZXZlcnNlT2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJbmRleCA+IGxhc3RPcmlnaW5hbEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VIZWxwZXIuTWFya05leHRDaGFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBsYXN0T3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsSW5kZXggKyAxOwogICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VIZWxwZXIuQWRkT3JpZ2luYWxFbGVtZW50KG9yaWdpbmFsSW5kZXggKyAxLCBtb2RpZmllZEluZGV4ICsgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdvbmFsUmVsYXRpdmUgPSAoZGlhZ29uYWwgKyAxKSAtIGRpYWdvbmFsUmV2ZXJzZUJhc2U7IC8vU2V0dXAgZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmVydGljYWwgbGluZSAodGhlIGVsZW1lbnQgaXMgYW4gaW5zZXJ0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4ID0gcmV2ZXJzZVBvaW50c1tkaWFnb25hbCAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEluZGV4ID0gb3JpZ2luYWxJbmRleCAtIGRpYWdvbmFsUmVsYXRpdmUgLSBkaWFnb25hbFJldmVyc2VPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEluZGV4ID4gbGFzdE9yaWdpbmFsSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZUhlbHBlci5NYXJrTmV4dENoYW5nZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RPcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlSGVscGVyLkFkZE1vZGlmaWVkRWxlbWVudChvcmlnaW5hbEluZGV4ICsgMSwgbW9kaWZpZWRJbmRleCArIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBkaWFnb25hbFJlbGF0aXZlID0gKGRpYWdvbmFsIC0gMSkgLSBkaWFnb25hbFJldmVyc2VCYXNlOyAvL1NldHVwIGZvciB0aGUgbmV4dCBpdGVyYXRpb24KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGhpc3RvcnlJbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyc2VQb2ludHMgPSB0aGlzLm1fcmV2ZXJzZUhpc3RvcnlbaGlzdG9yeUluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ29uYWxSZXZlcnNlQmFzZSA9IHJldmVyc2VQb2ludHNbMF07IC8vV2Ugc3RvcmVkIHRoaXMgaW4gdGhlIGZpcnN0IHNwb3QKICAgICAgICAgICAgICAgICAgICAgICAgZGlhZ29uYWxNaW4gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBkaWFnb25hbE1heCA9IHJldmVyc2VQb2ludHMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IHdoaWxlICgtLWhpc3RvcnlJbmRleCA+PSAtMSk7CiAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHJldmVyc2UgaGlzdG9yeSB3aWxsIGZpbmQgZGlmZnMgdGhhdAogICAgICAgICAgICAgICAgLy8gYXJlIGNvcnJlY3QsIGJ1dCBub3QgaW50dWl0aXZlLCBzbyB3ZSBuZWVkIHNoaWZ0IHRoZW0uCiAgICAgICAgICAgICAgICByZXZlcnNlQ2hhbmdlcyA9IGNoYW5nZUhlbHBlci5nZXRDaGFuZ2VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuQ29uY2F0ZW5hdGVDaGFuZ2VzKGZvcndhcmRDaGFuZ2VzLCByZXZlcnNlQ2hhbmdlcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIHRoZSByYW5nZSB0byBjb21wdXRlIHRoZSBkaWZmIG9uLCB0aGlzIG1ldGhvZCBmaW5kcyB0aGUgcG9pbnQ6CiAgICAgICAgICogKG1pZE9yaWdpbmFsLCBtaWRNb2RpZmllZCkKICAgICAgICAgKiB0aGF0IGV4aXN0cyBpbiB0aGUgbWlkZGxlIG9mIHRoZSBMQ1Mgb2YgdGhlIHR3byBzZXF1ZW5jZXMgYW5kCiAgICAgICAgICogaXMgdGhlIHBvaW50IGF0IHdoaWNoIHRoZSBMQ1MgcHJvYmxlbSBtYXkgYmUgYnJva2VuIGRvd24gcmVjdXJzaXZlbHkuCiAgICAgICAgICogVGhpcyBtZXRob2Qgd2lsbCB0cnkgdG8ga2VlcCB0aGUgTENTIHRyYWNlIGluIG1lbW9yeS4gSWYgdGhlIExDUyByZWN1cnNpb24KICAgICAgICAgKiBwb2ludCBpcyBjYWxjdWxhdGVkIGFuZCB0aGUgZnVsbCB0cmFjZSBpcyBhdmFpbGFibGUgaW4gbWVtb3J5LCB0aGVuIHRoaXMgbWV0aG9kCiAgICAgICAgICogd2lsbCByZXR1cm4gdGhlIGNoYW5nZSBsaXN0LgogICAgICAgICAqIEBwYXJhbSBvcmlnaW5hbFN0YXJ0IFRoZSBzdGFydCBib3VuZCBvZiB0aGUgb3JpZ2luYWwgc2VxdWVuY2UgcmFuZ2UKICAgICAgICAgKiBAcGFyYW0gb3JpZ2luYWxFbmQgVGhlIGVuZCBib3VuZCBvZiB0aGUgb3JpZ2luYWwgc2VxdWVuY2UgcmFuZ2UKICAgICAgICAgKiBAcGFyYW0gbW9kaWZpZWRTdGFydCBUaGUgc3RhcnQgYm91bmQgb2YgdGhlIG1vZGlmaWVkIHNlcXVlbmNlIHJhbmdlCiAgICAgICAgICogQHBhcmFtIG1vZGlmaWVkRW5kIFRoZSBlbmQgYm91bmQgb2YgdGhlIG1vZGlmaWVkIHNlcXVlbmNlIHJhbmdlCiAgICAgICAgICogQHBhcmFtIG1pZE9yaWdpbmFsIFRoZSBtaWRkbGUgcG9pbnQgb2YgdGhlIG9yaWdpbmFsIHNlcXVlbmNlIHJhbmdlCiAgICAgICAgICogQHBhcmFtIG1pZE1vZGlmaWVkIFRoZSBtaWRkbGUgcG9pbnQgb2YgdGhlIG1vZGlmaWVkIHNlcXVlbmNlIHJhbmdlCiAgICAgICAgICogQHJldHVybnMgVGhlIGRpZmYgY2hhbmdlcywgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgbnVsbAogICAgICAgICAqLwogICAgICAgIENvbXB1dGVSZWN1cnNpb25Qb2ludChvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEVuZCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRFbmQsIG1pZE9yaWdpbmFsQXJyLCBtaWRNb2RpZmllZEFyciwgcXVpdEVhcmx5QXJyKSB7CiAgICAgICAgICAgIGxldCBvcmlnaW5hbEluZGV4ID0gMCwgbW9kaWZpZWRJbmRleCA9IDA7CiAgICAgICAgICAgIGxldCBkaWFnb25hbEZvcndhcmRTdGFydCA9IDAsIGRpYWdvbmFsRm9yd2FyZEVuZCA9IDA7CiAgICAgICAgICAgIGxldCBkaWFnb25hbFJldmVyc2VTdGFydCA9IDAsIGRpYWdvbmFsUmV2ZXJzZUVuZCA9IDA7CiAgICAgICAgICAgIC8vIFRvIHRyYXZlcnNlIHRoZSBlZGl0IGdyYXBoIGFuZCBwcm9kdWNlIHRoZSBwcm9wZXIgTENTLCBvdXIgYWN0dWFsCiAgICAgICAgICAgIC8vIHN0YXJ0IHBvc2l0aW9uIGlzIGp1c3Qgb3V0c2lkZSB0aGUgZ2l2ZW4gYm91bmRhcnkKICAgICAgICAgICAgb3JpZ2luYWxTdGFydC0tOwogICAgICAgICAgICBtb2RpZmllZFN0YXJ0LS07CiAgICAgICAgICAgIC8vIFdlIHNldCB0aGVzZSB1cCB0byBtYWtlIHRoZSBjb21waWxlciBoYXBweSwgYnV0IHRoZXkgd2lsbAogICAgICAgICAgICAvLyBiZSByZXBsYWNlZCBiZWZvcmUgd2UgcmV0dXJuIHdpdGggdGhlIGFjdHVhbCByZWN1cnNpb24gcG9pbnQKICAgICAgICAgICAgbWlkT3JpZ2luYWxBcnJbMF0gPSAwOwogICAgICAgICAgICBtaWRNb2RpZmllZEFyclswXSA9IDA7CiAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgaGlzdG9yeQogICAgICAgICAgICB0aGlzLm1fZm9yd2FyZEhpc3RvcnkgPSBbXTsKICAgICAgICAgICAgdGhpcy5tX3JldmVyc2VIaXN0b3J5ID0gW107CiAgICAgICAgICAgIC8vIEVhY2ggY2VsbCBpbiB0aGUgdHdvIGFycmF5cyBjb3JyZXNwb25kcyB0byBhIGRpYWdvbmFsIGluIHRoZSBlZGl0IGdyYXBoLgogICAgICAgICAgICAvLyBUaGUgaW50ZWdlciB2YWx1ZSBpbiB0aGUgY2VsbCByZXByZXNlbnRzIHRoZSBvcmlnaW5hbEluZGV4IG9mIHRoZSBmdXJ0aGVzdAogICAgICAgICAgICAvLyByZWFjaGluZyBwb2ludCBmb3VuZCBzbyBmYXIgdGhhdCBlbmRzIGluIHRoYXQgZGlhZ29uYWwuCiAgICAgICAgICAgIC8vIFRoZSBtb2RpZmllZEluZGV4IGNhbiBiZSBjb21wdXRlZCBtYXRoZW1hdGljYWxseSBmcm9tIHRoZSBvcmlnaW5hbEluZGV4IGFuZCB0aGUgZGlhZ29uYWwgbnVtYmVyLgogICAgICAgICAgICBjb25zdCBtYXhEaWZmZXJlbmNlcyA9IChvcmlnaW5hbEVuZCAtIG9yaWdpbmFsU3RhcnQpICsgKG1vZGlmaWVkRW5kIC0gbW9kaWZpZWRTdGFydCk7CiAgICAgICAgICAgIGNvbnN0IG51bURpYWdvbmFscyA9IG1heERpZmZlcmVuY2VzICsgMTsKICAgICAgICAgICAgY29uc3QgZm9yd2FyZFBvaW50cyA9IG5ldyBJbnQzMkFycmF5KG51bURpYWdvbmFscyk7CiAgICAgICAgICAgIGNvbnN0IHJldmVyc2VQb2ludHMgPSBuZXcgSW50MzJBcnJheShudW1EaWFnb25hbHMpOwogICAgICAgICAgICAvLyBkaWFnb25hbEZvcndhcmRCYXNlOiBJbmRleCBpbnRvIGZvcndhcmRQb2ludHMgb2YgdGhlIGRpYWdvbmFsIHdoaWNoIHBhc3NlcyB0aHJvdWdoIChvcmlnaW5hbFN0YXJ0LCBtb2RpZmllZFN0YXJ0KQogICAgICAgICAgICAvLyBkaWFnb25hbFJldmVyc2VCYXNlOiBJbmRleCBpbnRvIHJldmVyc2VQb2ludHMgb2YgdGhlIGRpYWdvbmFsIHdoaWNoIHBhc3NlcyB0aHJvdWdoIChvcmlnaW5hbEVuZCwgbW9kaWZpZWRFbmQpCiAgICAgICAgICAgIGNvbnN0IGRpYWdvbmFsRm9yd2FyZEJhc2UgPSAobW9kaWZpZWRFbmQgLSBtb2RpZmllZFN0YXJ0KTsKICAgICAgICAgICAgY29uc3QgZGlhZ29uYWxSZXZlcnNlQmFzZSA9IChvcmlnaW5hbEVuZCAtIG9yaWdpbmFsU3RhcnQpOwogICAgICAgICAgICAvLyBkaWFnb25hbEZvcndhcmRPZmZzZXQ6IEdlb21ldHJpYyBvZmZzZXQgd2hpY2ggYWxsb3dzIG1vZGlmaWVkSW5kZXggdG8gYmUgY29tcHV0ZWQgZnJvbSBvcmlnaW5hbEluZGV4IGFuZCB0aGUKICAgICAgICAgICAgLy8gICAgZGlhZ29uYWwgbnVtYmVyIChyZWxhdGl2ZSB0byBkaWFnb25hbEZvcndhcmRCYXNlKQogICAgICAgICAgICAvLyBkaWFnb25hbFJldmVyc2VPZmZzZXQ6IEdlb21ldHJpYyBvZmZzZXQgd2hpY2ggYWxsb3dzIG1vZGlmaWVkSW5kZXggdG8gYmUgY29tcHV0ZWQgZnJvbSBvcmlnaW5hbEluZGV4IGFuZCB0aGUKICAgICAgICAgICAgLy8gICAgZGlhZ29uYWwgbnVtYmVyIChyZWxhdGl2ZSB0byBkaWFnb25hbFJldmVyc2VCYXNlKQogICAgICAgICAgICBjb25zdCBkaWFnb25hbEZvcndhcmRPZmZzZXQgPSAob3JpZ2luYWxTdGFydCAtIG1vZGlmaWVkU3RhcnQpOwogICAgICAgICAgICBjb25zdCBkaWFnb25hbFJldmVyc2VPZmZzZXQgPSAob3JpZ2luYWxFbmQgLSBtb2RpZmllZEVuZCk7CiAgICAgICAgICAgIC8vIGRlbHRhOiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBlbmQgZGlhZ29uYWwgYW5kIHRoZSBzdGFydCBkaWFnb25hbC4gVGhpcyBpcyB1c2VkIHRvIHJlbGF0ZSBkaWFnb25hbCBudW1iZXJzCiAgICAgICAgICAgIC8vICAgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0IGRpYWdvbmFsIHdpdGggZGlhZ29uYWwgbnVtYmVycyByZWxhdGl2ZSB0byB0aGUgZW5kIGRpYWdvbmFsLgogICAgICAgICAgICAvLyBUaGUgRXZlbi9PZGRuLW5lc3Mgb2YgdGhpcyBkZWx0YSBpcyBpbXBvcnRhbnQgZm9yIGRldGVybWluaW5nIHdoZW4gd2Ugc2hvdWxkIGNoZWNrIGZvciBvdmVybGFwCiAgICAgICAgICAgIGNvbnN0IGRlbHRhID0gZGlhZ29uYWxSZXZlcnNlQmFzZSAtIGRpYWdvbmFsRm9yd2FyZEJhc2U7CiAgICAgICAgICAgIGNvbnN0IGRlbHRhSXNFdmVuID0gKGRlbHRhICUgMiA9PT0gMCk7CiAgICAgICAgICAgIC8vIEhlcmUgd2Ugc2V0IHVwIHRoZSBzdGFydCBhbmQgZW5kIHBvaW50cyBhcyB0aGUgZnVydGhlc3QgcG9pbnRzIGZvdW5kIHNvIGZhcgogICAgICAgICAgICAvLyBpbiBib3RoIHRoZSBmb3J3YXJkIGFuZCByZXZlcnNlIGRpcmVjdGlvbnMsIHJlc3BlY3RpdmVseQogICAgICAgICAgICBmb3J3YXJkUG9pbnRzW2RpYWdvbmFsRm9yd2FyZEJhc2VdID0gb3JpZ2luYWxTdGFydDsKICAgICAgICAgICAgcmV2ZXJzZVBvaW50c1tkaWFnb25hbFJldmVyc2VCYXNlXSA9IG9yaWdpbmFsRW5kOwogICAgICAgICAgICAvLyBSZW1lbWJlciBpZiB3ZSBxdWl0IGVhcmx5LCBhbmQgdGh1cyBuZWVkIHRvIGRvIGEgYmVzdC1lZmZvcnQgcmVzdWx0IGluc3RlYWQgb2YgYSByZWFsIHJlc3VsdC4KICAgICAgICAgICAgcXVpdEVhcmx5QXJyWzBdID0gZmFsc2U7CiAgICAgICAgICAgIC8vIEEgY291cGxlIG9mIHBvaW50czoKICAgICAgICAgICAgLy8gLS1XaXRoIHRoaXMgbWV0aG9kLCB3ZSBpdGVyYXRlIG9uIHRoZSBudW1iZXIgb2YgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIHNlcXVlbmNlcy4KICAgICAgICAgICAgLy8gICBUaGUgbW9yZSBkaWZmZXJlbmNlcyB0aGVyZSBhY3R1YWxseSBhcmUsIHRoZSBsb25nZXIgdGhpcyB3aWxsIHRha2UuCiAgICAgICAgICAgIC8vIC0tQWxzbywgYXMgdGhlIG51bWJlciBvZiBkaWZmZXJlbmNlcyBpbmNyZWFzZXMsIHdlIGhhdmUgdG8gc2VhcmNoIG9uIGRpYWdvbmFscyBmdXJ0aGVyCiAgICAgICAgICAgIC8vICAgYXdheSBmcm9tIHRoZSByZWZlcmVuY2UgZGlhZ29uYWwgKHdoaWNoIGlzIGRpYWdvbmFsRm9yd2FyZEJhc2UgZm9yIGZvcndhcmQsIGRpYWdvbmFsUmV2ZXJzZUJhc2UgZm9yIHJldmVyc2UpLgogICAgICAgICAgICAvLyAtLVdlIGV4dGVuZCBvbiBldmVuIGRpYWdvbmFscyAocmVsYXRpdmUgdG8gdGhlIHJlZmVyZW5jZSBkaWFnb25hbCkgb25seSB3aGVuIG51bURpZmZlcmVuY2VzCiAgICAgICAgICAgIC8vICAgaXMgZXZlbiBhbmQgb2RkIGRpYWdvbmFscyBvbmx5IHdoZW4gbnVtRGlmZmVyZW5jZXMgaXMgb2RkLgogICAgICAgICAgICBmb3IgKGxldCBudW1EaWZmZXJlbmNlcyA9IDE7IG51bURpZmZlcmVuY2VzIDw9IChtYXhEaWZmZXJlbmNlcyAvIDIpICsgMTsgbnVtRGlmZmVyZW5jZXMrKykgewogICAgICAgICAgICAgICAgbGV0IGZ1cnRoZXN0T3JpZ2luYWxJbmRleCA9IDA7CiAgICAgICAgICAgICAgICBsZXQgZnVydGhlc3RNb2RpZmllZEluZGV4ID0gMDsKICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgYWxnb3JpdGhtIGluIHRoZSBmb3J3YXJkIGRpcmVjdGlvbgogICAgICAgICAgICAgICAgZGlhZ29uYWxGb3J3YXJkU3RhcnQgPSB0aGlzLkNsaXBEaWFnb25hbEJvdW5kKGRpYWdvbmFsRm9yd2FyZEJhc2UgLSBudW1EaWZmZXJlbmNlcywgbnVtRGlmZmVyZW5jZXMsIGRpYWdvbmFsRm9yd2FyZEJhc2UsIG51bURpYWdvbmFscyk7CiAgICAgICAgICAgICAgICBkaWFnb25hbEZvcndhcmRFbmQgPSB0aGlzLkNsaXBEaWFnb25hbEJvdW5kKGRpYWdvbmFsRm9yd2FyZEJhc2UgKyBudW1EaWZmZXJlbmNlcywgbnVtRGlmZmVyZW5jZXMsIGRpYWdvbmFsRm9yd2FyZEJhc2UsIG51bURpYWdvbmFscyk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBkaWFnb25hbCA9IGRpYWdvbmFsRm9yd2FyZFN0YXJ0OyBkaWFnb25hbCA8PSBkaWFnb25hbEZvcndhcmRFbmQ7IGRpYWdvbmFsICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTVEVQIDE6IFdlIGV4dGVuZCB0aGUgZnVydGhlc3QgcmVhY2hpbmcgcG9pbnQgaW4gdGhlIHByZXNlbnQgZGlhZ29uYWwKICAgICAgICAgICAgICAgICAgICAvLyBieSBsb29raW5nIGF0IHRoZSBkaWFnb25hbHMgYWJvdmUgYW5kIGJlbG93IGFuZCBwaWNraW5nIHRoZSBvbmUgd2hvc2UgcG9pbnQKICAgICAgICAgICAgICAgICAgICAvLyBpcyBmdXJ0aGVyIGF3YXkgZnJvbSB0aGUgc3RhcnQgcG9pbnQgKG9yaWdpbmFsU3RhcnQsIG1vZGlmaWVkU3RhcnQpCiAgICAgICAgICAgICAgICAgICAgaWYgKGRpYWdvbmFsID09PSBkaWFnb25hbEZvcndhcmRTdGFydCB8fCAoZGlhZ29uYWwgPCBkaWFnb25hbEZvcndhcmRFbmQgJiYgZm9yd2FyZFBvaW50c1tkaWFnb25hbCAtIDFdIDwgZm9yd2FyZFBvaW50c1tkaWFnb25hbCArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4ID0gZm9yd2FyZFBvaW50c1tkaWFnb25hbCArIDFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxJbmRleCA9IGZvcndhcmRQb2ludHNbZGlhZ29uYWwgLSAxXSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkSW5kZXggPSBvcmlnaW5hbEluZGV4IC0gKGRpYWdvbmFsIC0gZGlhZ29uYWxGb3J3YXJkQmFzZSkgLSBkaWFnb25hbEZvcndhcmRPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCBvcmlnaW5hbEluZGV4IHNvIHdlIGNhbiB0ZXN0IGZvciBmYWxzZSBvdmVybGFwIGluIHN0ZXAgMwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBPcmlnaW5hbEluZGV4ID0gb3JpZ2luYWxJbmRleDsKICAgICAgICAgICAgICAgICAgICAvLyBTVEVQIDI6IFdlIGNhbiBjb250aW51ZSB0byBleHRlbmQgdGhlIGZ1cnRoZXN0IHJlYWNoaW5nIHBvaW50IGluIHRoZSBwcmVzZW50IGRpYWdvbmFsCiAgICAgICAgICAgICAgICAgICAgLy8gc28gbG9uZyBhcyB0aGUgZWxlbWVudHMgYXJlIGVxdWFsLgogICAgICAgICAgICAgICAgICAgIHdoaWxlIChvcmlnaW5hbEluZGV4IDwgb3JpZ2luYWxFbmQgJiYgbW9kaWZpZWRJbmRleCA8IG1vZGlmaWVkRW5kICYmIHRoaXMuRWxlbWVudHNBcmVFcXVhbChvcmlnaW5hbEluZGV4ICsgMSwgbW9kaWZpZWRJbmRleCArIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmb3J3YXJkUG9pbnRzW2RpYWdvbmFsXSA9IG9yaWdpbmFsSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsSW5kZXggKyBtb2RpZmllZEluZGV4ID4gZnVydGhlc3RPcmlnaW5hbEluZGV4ICsgZnVydGhlc3RNb2RpZmllZEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1cnRoZXN0T3JpZ2luYWxJbmRleCA9IG9yaWdpbmFsSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ1cnRoZXN0TW9kaWZpZWRJbmRleCA9IG1vZGlmaWVkSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIFNURVAgMzogSWYgZGVsdGEgaXMgb2RkIChvdmVybGFwIGZpcnN0IGhhcHBlbnMgb24gZm9yd2FyZCB3aGVuIGRlbHRhIGlzIG9kZCkKICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZGlhZ29uYWwgaXMgaW4gdGhlIHJhbmdlIG9mIHJldmVyc2UgZGlhZ29uYWxzIGNvbXB1dGVkIGZvciBudW1EaWZmZXJlbmNlcy0xCiAgICAgICAgICAgICAgICAgICAgLy8gKHRoZSBwcmV2aW91cyBpdGVyYXRpb247IHdlIGhhdmVuJ3QgY29tcHV0ZWQgcmV2ZXJzZSBkaWFnb25hbHMgZm9yIG51bURpZmZlcmVuY2VzIHlldCkKICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIGNoZWNrIGZvciBvdmVybGFwLgogICAgICAgICAgICAgICAgICAgIGlmICghZGVsdGFJc0V2ZW4gJiYgTWF0aC5hYnMoZGlhZ29uYWwgLSBkaWFnb25hbFJldmVyc2VCYXNlKSA8PSAobnVtRGlmZmVyZW5jZXMgLSAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJbmRleCA+PSByZXZlcnNlUG9pbnRzW2RpYWdvbmFsXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkT3JpZ2luYWxBcnJbMF0gPSBvcmlnaW5hbEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkTW9kaWZpZWRBcnJbMF0gPSBtb2RpZmllZEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBPcmlnaW5hbEluZGV4IDw9IHJldmVyc2VQb2ludHNbZGlhZ29uYWxdICYmIDE0NDcgLyogTWF4RGlmZmVyZW5jZXNIaXN0b3J5ICovID4gMCAmJiBudW1EaWZmZXJlbmNlcyA8PSAoMTQ0NyAvKiBNYXhEaWZmZXJlbmNlc0hpc3RvcnkgKi8gKyAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJJTkdPISBXZSBvdmVybGFwcGVkLCBhbmQgd2UgaGF2ZSB0aGUgZnVsbCB0cmFjZSBpbiBtZW1vcnkhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV0FMS1RSQUNFKGRpYWdvbmFsRm9yd2FyZEJhc2UsIGRpYWdvbmFsRm9yd2FyZFN0YXJ0LCBkaWFnb25hbEZvcndhcmRFbmQsIGRpYWdvbmFsRm9yd2FyZE9mZnNldCwgZGlhZ29uYWxSZXZlcnNlQmFzZSwgZGlhZ29uYWxSZXZlcnNlU3RhcnQsIGRpYWdvbmFsUmV2ZXJzZUVuZCwgZGlhZ29uYWxSZXZlcnNlT2Zmc2V0LCBmb3J3YXJkUG9pbnRzLCByZXZlcnNlUG9pbnRzLCBvcmlnaW5hbEluZGV4LCBvcmlnaW5hbEVuZCwgbWlkT3JpZ2luYWxBcnIsIG1vZGlmaWVkSW5kZXgsIG1vZGlmaWVkRW5kLCBtaWRNb2RpZmllZEFyciwgZGVsdGFJc0V2ZW4sIHF1aXRFYXJseUFycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFaXRoZXIgZmFsc2Ugb3ZlcmxhcCwgb3Igd2UgZGlkbid0IGhhdmUgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIGZ1bGwgdHJhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgcmVjdXJzaW9uIHBvaW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIGJlIHF1aXR0aW5nIGVhcmx5LCBiZWZvcmUgbW92aW5nIG9uIHRvIHRoZSBuZXh0IGl0ZXJhdGlvbi4KICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoTGVuZ3RoT2ZMb25nZXN0ID0gKChmdXJ0aGVzdE9yaWdpbmFsSW5kZXggLSBvcmlnaW5hbFN0YXJ0KSArIChmdXJ0aGVzdE1vZGlmaWVkSW5kZXggLSBtb2RpZmllZFN0YXJ0KSAtIG51bURpZmZlcmVuY2VzKSAvIDI7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5Db250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUgIT09IG51bGwgJiYgIXRoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlKGZ1cnRoZXN0T3JpZ2luYWxJbmRleCwgbWF0Y2hMZW5ndGhPZkxvbmdlc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgZmluaXNoLCBzbyBza2lwIGFoZWFkIHRvIGdlbmVyYXRpbmcgYSByZXN1bHQgZnJvbSB3aGF0IHdlIGhhdmUuCiAgICAgICAgICAgICAgICAgICAgcXVpdEVhcmx5QXJyWzBdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGZ1cnRoZXN0IGRpc3RhbmNlIHdlIGdvdCBpbiB0aGUgZm9yd2FyZCBkaXJlY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgbWlkT3JpZ2luYWxBcnJbMF0gPSBmdXJ0aGVzdE9yaWdpbmFsSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgbWlkTW9kaWZpZWRBcnJbMF0gPSBmdXJ0aGVzdE1vZGlmaWVkSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoTGVuZ3RoT2ZMb25nZXN0ID4gMCAmJiAxNDQ3IC8qIE1heERpZmZlcmVuY2VzSGlzdG9yeSAqLyA+IDAgJiYgbnVtRGlmZmVyZW5jZXMgPD0gKDE0NDcgLyogTWF4RGlmZmVyZW5jZXNIaXN0b3J5ICovICsgMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW5vdWdoIG9mIHRoZSBoaXN0b3J5IGlzIGluIG1lbW9yeSB0byB3YWxrIGl0IGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5XQUxLVFJBQ0UoZGlhZ29uYWxGb3J3YXJkQmFzZSwgZGlhZ29uYWxGb3J3YXJkU3RhcnQsIGRpYWdvbmFsRm9yd2FyZEVuZCwgZGlhZ29uYWxGb3J3YXJkT2Zmc2V0LCBkaWFnb25hbFJldmVyc2VCYXNlLCBkaWFnb25hbFJldmVyc2VTdGFydCwgZGlhZ29uYWxSZXZlcnNlRW5kLCBkaWFnb25hbFJldmVyc2VPZmZzZXQsIGZvcndhcmRQb2ludHMsIHJldmVyc2VQb2ludHMsIG9yaWdpbmFsSW5kZXgsIG9yaWdpbmFsRW5kLCBtaWRPcmlnaW5hbEFyciwgbW9kaWZpZWRJbmRleCwgbW9kaWZpZWRFbmQsIG1pZE1vZGlmaWVkQXJyLCBkZWx0YUlzRXZlbiwgcXVpdEVhcmx5QXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRpZG4ndCBhY3R1YWxseSByZW1lbWJlciBlbm91Z2ggb2YgdGhlIGhpc3RvcnkuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vU2luY2Ugd2UgYXJlIHF1aXR0aW5nIHRoZSBkaWZmIGVhcmx5LCB3ZSBuZWVkIHRvIHNoaWZ0IGJhY2sgdGhlIG9yaWdpbmFsU3RhcnQgYW5kIG1vZGlmaWVkIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vYmFjayBpbnRvIHRoZSBib3VuZGFyeSBsaW1pdHMgc2luY2Ugd2UgZGVjcmVtZW50ZWQgdGhlaXIgdmFsdWUgYWJvdmUgYmV5b25kIHRoZSBib3VuZGFyeSBsaW1pdC4KICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTdGFydCsrOwogICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGlmZkNoYW5nZShvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbEVuZCAtIG9yaWdpbmFsU3RhcnQgKyAxLCBtb2RpZmllZFN0YXJ0LCBtb2RpZmllZEVuZCAtIG1vZGlmaWVkU3RhcnQgKyAxKQogICAgICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgYWxnb3JpdGhtIGluIHRoZSByZXZlcnNlIGRpcmVjdGlvbgogICAgICAgICAgICAgICAgZGlhZ29uYWxSZXZlcnNlU3RhcnQgPSB0aGlzLkNsaXBEaWFnb25hbEJvdW5kKGRpYWdvbmFsUmV2ZXJzZUJhc2UgLSBudW1EaWZmZXJlbmNlcywgbnVtRGlmZmVyZW5jZXMsIGRpYWdvbmFsUmV2ZXJzZUJhc2UsIG51bURpYWdvbmFscyk7CiAgICAgICAgICAgICAgICBkaWFnb25hbFJldmVyc2VFbmQgPSB0aGlzLkNsaXBEaWFnb25hbEJvdW5kKGRpYWdvbmFsUmV2ZXJzZUJhc2UgKyBudW1EaWZmZXJlbmNlcywgbnVtRGlmZmVyZW5jZXMsIGRpYWdvbmFsUmV2ZXJzZUJhc2UsIG51bURpYWdvbmFscyk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBkaWFnb25hbCA9IGRpYWdvbmFsUmV2ZXJzZVN0YXJ0OyBkaWFnb25hbCA8PSBkaWFnb25hbFJldmVyc2VFbmQ7IGRpYWdvbmFsICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTVEVQIDE6IFdlIGV4dGVuZCB0aGUgZnVydGhlc3QgcmVhY2hpbmcgcG9pbnQgaW4gdGhlIHByZXNlbnQgZGlhZ29uYWwKICAgICAgICAgICAgICAgICAgICAvLyBieSBsb29raW5nIGF0IHRoZSBkaWFnb25hbHMgYWJvdmUgYW5kIGJlbG93IGFuZCBwaWNraW5nIHRoZSBvbmUgd2hvc2UgcG9pbnQKICAgICAgICAgICAgICAgICAgICAvLyBpcyBmdXJ0aGVyIGF3YXkgZnJvbSB0aGUgc3RhcnQgcG9pbnQgKG9yaWdpbmFsRW5kLCBtb2RpZmllZEVuZCkKICAgICAgICAgICAgICAgICAgICBpZiAoZGlhZ29uYWwgPT09IGRpYWdvbmFsUmV2ZXJzZVN0YXJ0IHx8IChkaWFnb25hbCA8IGRpYWdvbmFsUmV2ZXJzZUVuZCAmJiByZXZlcnNlUG9pbnRzW2RpYWdvbmFsIC0gMV0gPj0gcmV2ZXJzZVBvaW50c1tkaWFnb25hbCArIDFdKSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4ID0gcmV2ZXJzZVBvaW50c1tkaWFnb25hbCArIDFdIC0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSW5kZXggPSByZXZlcnNlUG9pbnRzW2RpYWdvbmFsIC0gMV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkSW5kZXggPSBvcmlnaW5hbEluZGV4IC0gKGRpYWdvbmFsIC0gZGlhZ29uYWxSZXZlcnNlQmFzZSkgLSBkaWFnb25hbFJldmVyc2VPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgY3VycmVudCBvcmlnaW5hbEluZGV4IHNvIHdlIGNhbiB0ZXN0IGZvciBmYWxzZSBvdmVybGFwCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGVtcE9yaWdpbmFsSW5kZXggPSBvcmlnaW5hbEluZGV4OwogICAgICAgICAgICAgICAgICAgIC8vIFNURVAgMjogV2UgY2FuIGNvbnRpbnVlIHRvIGV4dGVuZCB0aGUgZnVydGhlc3QgcmVhY2hpbmcgcG9pbnQgaW4gdGhlIHByZXNlbnQgZGlhZ29uYWwKICAgICAgICAgICAgICAgICAgICAvLyBhcyBsb25nIGFzIHRoZSBlbGVtZW50cyBhcmUgZXF1YWwuCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9yaWdpbmFsSW5kZXggPiBvcmlnaW5hbFN0YXJ0ICYmIG1vZGlmaWVkSW5kZXggPiBtb2RpZmllZFN0YXJ0ICYmIHRoaXMuRWxlbWVudHNBcmVFcXVhbChvcmlnaW5hbEluZGV4LCBtb2RpZmllZEluZGV4KSkgewogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEluZGV4LS07CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkSW5kZXgtLTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZVBvaW50c1tkaWFnb25hbF0gPSBvcmlnaW5hbEluZGV4OwogICAgICAgICAgICAgICAgICAgIC8vIFNURVAgNDogSWYgZGVsdGEgaXMgZXZlbiAob3ZlcmxhcCBmaXJzdCBoYXBwZW5zIG9uIHJldmVyc2Ugd2hlbiBkZWx0YSBpcyBldmVuKQogICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkaWFnb25hbCBpcyBpbiB0aGUgcmFuZ2Ugb2YgZm9yd2FyZCBkaWFnb25hbHMgY29tcHV0ZWQgZm9yIG51bURpZmZlcmVuY2VzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiBjaGVjayBmb3Igb3ZlcmxhcC4KICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGFJc0V2ZW4gJiYgTWF0aC5hYnMoZGlhZ29uYWwgLSBkaWFnb25hbEZvcndhcmRCYXNlKSA8PSBudW1EaWZmZXJlbmNlcykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxJbmRleCA8PSBmb3J3YXJkUG9pbnRzW2RpYWdvbmFsXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkT3JpZ2luYWxBcnJbMF0gPSBvcmlnaW5hbEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkTW9kaWZpZWRBcnJbMF0gPSBtb2RpZmllZEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBPcmlnaW5hbEluZGV4ID49IGZvcndhcmRQb2ludHNbZGlhZ29uYWxdICYmIDE0NDcgLyogTWF4RGlmZmVyZW5jZXNIaXN0b3J5ICovID4gMCAmJiBudW1EaWZmZXJlbmNlcyA8PSAoMTQ0NyAvKiBNYXhEaWZmZXJlbmNlc0hpc3RvcnkgKi8gKyAxKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJJTkdPISBXZSBvdmVybGFwcGVkLCBhbmQgd2UgaGF2ZSB0aGUgZnVsbCB0cmFjZSBpbiBtZW1vcnkhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuV0FMS1RSQUNFKGRpYWdvbmFsRm9yd2FyZEJhc2UsIGRpYWdvbmFsRm9yd2FyZFN0YXJ0LCBkaWFnb25hbEZvcndhcmRFbmQsIGRpYWdvbmFsRm9yd2FyZE9mZnNldCwgZGlhZ29uYWxSZXZlcnNlQmFzZSwgZGlhZ29uYWxSZXZlcnNlU3RhcnQsIGRpYWdvbmFsUmV2ZXJzZUVuZCwgZGlhZ29uYWxSZXZlcnNlT2Zmc2V0LCBmb3J3YXJkUG9pbnRzLCByZXZlcnNlUG9pbnRzLCBvcmlnaW5hbEluZGV4LCBvcmlnaW5hbEVuZCwgbWlkT3JpZ2luYWxBcnIsIG1vZGlmaWVkSW5kZXgsIG1vZGlmaWVkRW5kLCBtaWRNb2RpZmllZEFyciwgZGVsdGFJc0V2ZW4sIHF1aXRFYXJseUFycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFaXRoZXIgZmFsc2Ugb3ZlcmxhcCwgb3Igd2UgZGlkbid0IGhhdmUgZW5vdWdoIG1lbW9yeSBmb3IgdGhlIGZ1bGwgdHJhY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJldHVybiB0aGUgcmVjdXJzaW9uIHBvaW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBTYXZlIGN1cnJlbnQgdmVjdG9ycyB0byBoaXN0b3J5IGJlZm9yZSB0aGUgbmV4dCBpdGVyYXRpb24KICAgICAgICAgICAgICAgIGlmIChudW1EaWZmZXJlbmNlcyA8PSAxNDQ3IC8qIE1heERpZmZlcmVuY2VzSGlzdG9yeSAqLykgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBhbGxvY2F0aW5nIHNwYWNlIGZvciBvbmUgZXh0cmEgaW50LCB3aGljaCB3ZSBmaWxsIHdpdGgKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5kZXggb2YgdGhlIGRpYWdvbmFsIGJhc2UgaW5kZXgKICAgICAgICAgICAgICAgICAgICBsZXQgdGVtcCA9IG5ldyBJbnQzMkFycmF5KGRpYWdvbmFsRm9yd2FyZEVuZCAtIGRpYWdvbmFsRm9yd2FyZFN0YXJ0ICsgMik7CiAgICAgICAgICAgICAgICAgICAgdGVtcFswXSA9IGRpYWdvbmFsRm9yd2FyZEJhc2UgLSBkaWFnb25hbEZvcndhcmRTdGFydCArIDE7CiAgICAgICAgICAgICAgICAgICAgTXlBcnJheS5Db3B5Mihmb3J3YXJkUG9pbnRzLCBkaWFnb25hbEZvcndhcmRTdGFydCwgdGVtcCwgMSwgZGlhZ29uYWxGb3J3YXJkRW5kIC0gZGlhZ29uYWxGb3J3YXJkU3RhcnQgKyAxKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLm1fZm9yd2FyZEhpc3RvcnkucHVzaCh0ZW1wKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wID0gbmV3IEludDMyQXJyYXkoZGlhZ29uYWxSZXZlcnNlRW5kIC0gZGlhZ29uYWxSZXZlcnNlU3RhcnQgKyAyKTsKICAgICAgICAgICAgICAgICAgICB0ZW1wWzBdID0gZGlhZ29uYWxSZXZlcnNlQmFzZSAtIGRpYWdvbmFsUmV2ZXJzZVN0YXJ0ICsgMTsKICAgICAgICAgICAgICAgICAgICBNeUFycmF5LkNvcHkyKHJldmVyc2VQb2ludHMsIGRpYWdvbmFsUmV2ZXJzZVN0YXJ0LCB0ZW1wLCAxLCBkaWFnb25hbFJldmVyc2VFbmQgLSBkaWFnb25hbFJldmVyc2VTdGFydCArIDEpOwogICAgICAgICAgICAgICAgICAgIHRoaXMubV9yZXZlcnNlSGlzdG9yeS5wdXNoKHRlbXApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIHdlIGdvdCBoZXJlLCB0aGVuIHdlIGhhdmUgdGhlIGZ1bGwgdHJhY2UgaW4gaGlzdG9yeS4gV2UganVzdCBoYXZlIHRvIGNvbnZlcnQgaXQgdG8gYSBjaGFuZ2UgbGlzdAogICAgICAgICAgICAvLyBOT1RFOiBUaGlzIHBhcnQgaXMgYSBiaXQgbWVzc3kKICAgICAgICAgICAgcmV0dXJuIHRoaXMuV0FMS1RSQUNFKGRpYWdvbmFsRm9yd2FyZEJhc2UsIGRpYWdvbmFsRm9yd2FyZFN0YXJ0LCBkaWFnb25hbEZvcndhcmRFbmQsIGRpYWdvbmFsRm9yd2FyZE9mZnNldCwgZGlhZ29uYWxSZXZlcnNlQmFzZSwgZGlhZ29uYWxSZXZlcnNlU3RhcnQsIGRpYWdvbmFsUmV2ZXJzZUVuZCwgZGlhZ29uYWxSZXZlcnNlT2Zmc2V0LCBmb3J3YXJkUG9pbnRzLCByZXZlcnNlUG9pbnRzLCBvcmlnaW5hbEluZGV4LCBvcmlnaW5hbEVuZCwgbWlkT3JpZ2luYWxBcnIsIG1vZGlmaWVkSW5kZXgsIG1vZGlmaWVkRW5kLCBtaWRNb2RpZmllZEFyciwgZGVsdGFJc0V2ZW4sIHF1aXRFYXJseUFycik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNoaWZ0cyB0aGUgZ2l2ZW4gY2hhbmdlcyB0byBwcm92aWRlIGEgbW9yZSBpbnR1aXRpdmUgZGlmZi4KICAgICAgICAgKiBXaGlsZSB0aGUgZmlyc3QgZWxlbWVudCBpbiBhIGRpZmYgbWF0Y2hlcyB0aGUgZmlyc3QgZWxlbWVudCBhZnRlciB0aGUgZGlmZiwKICAgICAgICAgKiB3ZSBzaGlmdCB0aGUgZGlmZiBkb3duLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNoYW5nZXMgVGhlIGxpc3Qgb2YgY2hhbmdlcyB0byBzaGlmdAogICAgICAgICAqIEByZXR1cm5zIFRoZSBzaGlmdGVkIGNoYW5nZXMKICAgICAgICAgKi8KICAgICAgICBQcmV0dGlmeUNoYW5nZXMoY2hhbmdlcykgewogICAgICAgICAgICAvLyBTaGlmdCBhbGwgdGhlIGNoYW5nZXMgZG93biBmaXJzdAogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZSA9IGNoYW5nZXNbaV07CiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFN0b3AgPSAoaSA8IGNoYW5nZXMubGVuZ3RoIC0gMSkgPyBjaGFuZ2VzW2kgKyAxXS5vcmlnaW5hbFN0YXJ0IDogdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaC5sZW5ndGg7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZFN0b3AgPSAoaSA8IGNoYW5nZXMubGVuZ3RoIC0gMSkgPyBjaGFuZ2VzW2kgKyAxXS5tb2RpZmllZFN0YXJ0IDogdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGg7CiAgICAgICAgICAgICAgICBjb25zdCBjaGVja09yaWdpbmFsID0gY2hhbmdlLm9yaWdpbmFsTGVuZ3RoID4gMDsKICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrTW9kaWZpZWQgPSBjaGFuZ2UubW9kaWZpZWRMZW5ndGggPiAwOwogICAgICAgICAgICAgICAgd2hpbGUgKGNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgY2hhbmdlLm9yaWdpbmFsTGVuZ3RoIDwgb3JpZ2luYWxTdG9wCiAgICAgICAgICAgICAgICAgICAgJiYgY2hhbmdlLm1vZGlmaWVkU3RhcnQgKyBjaGFuZ2UubW9kaWZpZWRMZW5ndGggPCBtb2RpZmllZFN0b3AKICAgICAgICAgICAgICAgICAgICAmJiAoIWNoZWNrT3JpZ2luYWwgfHwgdGhpcy5PcmlnaW5hbEVsZW1lbnRzQXJlRXF1YWwoY2hhbmdlLm9yaWdpbmFsU3RhcnQsIGNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgY2hhbmdlLm9yaWdpbmFsTGVuZ3RoKSkKICAgICAgICAgICAgICAgICAgICAmJiAoIWNoZWNrTW9kaWZpZWQgfHwgdGhpcy5Nb2RpZmllZEVsZW1lbnRzQXJlRXF1YWwoY2hhbmdlLm1vZGlmaWVkU3RhcnQsIGNoYW5nZS5tb2RpZmllZFN0YXJ0ICsgY2hhbmdlLm1vZGlmaWVkTGVuZ3RoKSkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydFN0cmljdEVxdWFsID0gdGhpcy5FbGVtZW50c0FyZVN0cmljdEVxdWFsKGNoYW5nZS5vcmlnaW5hbFN0YXJ0LCBjaGFuZ2UubW9kaWZpZWRTdGFydCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kU3RyaWN0RXF1YWwgPSB0aGlzLkVsZW1lbnRzQXJlU3RyaWN0RXF1YWwoY2hhbmdlLm9yaWdpbmFsU3RhcnQgKyBjaGFuZ2Uub3JpZ2luYWxMZW5ndGgsIGNoYW5nZS5tb2RpZmllZFN0YXJ0ICsgY2hhbmdlLm1vZGlmaWVkTGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5kU3RyaWN0RXF1YWwgJiYgIXN0YXJ0U3RyaWN0RXF1YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92aW5nIHRoZSBjaGFuZ2UgZG93biB3b3VsZCBjcmVhdGUgYW4gZXF1YWwgY2hhbmdlLCBidXQgdGhlIGVsZW1lbnRzIGFyZSBub3Qgc3RyaWN0IGVxdWFsCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjaGFuZ2Uub3JpZ2luYWxTdGFydCsrOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZS5tb2RpZmllZFN0YXJ0Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgbWVyZ2VkQ2hhbmdlQXJyID0gW251bGxdOwogICAgICAgICAgICAgICAgaWYgKGkgPCBjaGFuZ2VzLmxlbmd0aCAtIDEgJiYgdGhpcy5DaGFuZ2VzT3ZlcmxhcChjaGFuZ2VzW2ldLCBjaGFuZ2VzW2kgKyAxXSwgbWVyZ2VkQ2hhbmdlQXJyKSkgewogICAgICAgICAgICAgICAgICAgIGNoYW5nZXNbaV0gPSBtZXJnZWRDaGFuZ2VBcnJbMF07CiAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5zcGxpY2UoaSArIDEsIDEpOwogICAgICAgICAgICAgICAgICAgIGktLTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTaGlmdCBjaGFuZ2VzIGJhY2sgdXAgdW50aWwgd2UgaGl0IGVtcHR5IG9yIHdoaXRlc3BhY2Utb25seSBsaW5lcwogICAgICAgICAgICBmb3IgKGxldCBpID0gY2hhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlID0gY2hhbmdlc1tpXTsKICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbFN0b3AgPSAwOwogICAgICAgICAgICAgICAgbGV0IG1vZGlmaWVkU3RvcCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2Q2hhbmdlID0gY2hhbmdlc1tpIC0gMV07CiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTdG9wID0gcHJldkNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgcHJldkNoYW5nZS5vcmlnaW5hbExlbmd0aDsKICAgICAgICAgICAgICAgICAgICBtb2RpZmllZFN0b3AgPSBwcmV2Q2hhbmdlLm1vZGlmaWVkU3RhcnQgKyBwcmV2Q2hhbmdlLm1vZGlmaWVkTGVuZ3RoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgY2hlY2tPcmlnaW5hbCA9IGNoYW5nZS5vcmlnaW5hbExlbmd0aCA+IDA7CiAgICAgICAgICAgICAgICBjb25zdCBjaGVja01vZGlmaWVkID0gY2hhbmdlLm1vZGlmaWVkTGVuZ3RoID4gMDsKICAgICAgICAgICAgICAgIGxldCBiZXN0RGVsdGEgPSAwOwogICAgICAgICAgICAgICAgbGV0IGJlc3RTY29yZSA9IHRoaXMuX2JvdW5kYXJ5U2NvcmUoY2hhbmdlLm9yaWdpbmFsU3RhcnQsIGNoYW5nZS5vcmlnaW5hbExlbmd0aCwgY2hhbmdlLm1vZGlmaWVkU3RhcnQsIGNoYW5nZS5tb2RpZmllZExlbmd0aCk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBkZWx0YSA9IDE7OyBkZWx0YSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydCA9IGNoYW5nZS5vcmlnaW5hbFN0YXJ0IC0gZGVsdGE7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRTdGFydCA9IGNoYW5nZS5tb2RpZmllZFN0YXJ0IC0gZGVsdGE7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsU3RhcnQgPCBvcmlnaW5hbFN0b3AgfHwgbW9kaWZpZWRTdGFydCA8IG1vZGlmaWVkU3RvcCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrT3JpZ2luYWwgJiYgIXRoaXMuT3JpZ2luYWxFbGVtZW50c0FyZUVxdWFsKG9yaWdpbmFsU3RhcnQsIG9yaWdpbmFsU3RhcnQgKyBjaGFuZ2Uub3JpZ2luYWxMZW5ndGgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tNb2RpZmllZCAmJiAhdGhpcy5Nb2RpZmllZEVsZW1lbnRzQXJlRXF1YWwobW9kaWZpZWRTdGFydCwgbW9kaWZpZWRTdGFydCArIGNoYW5nZS5tb2RpZmllZExlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvdWNoaW5nUHJldmlvdXNDaGFuZ2UgPSAob3JpZ2luYWxTdGFydCA9PT0gb3JpZ2luYWxTdG9wICYmIG1vZGlmaWVkU3RhcnQgPT09IG1vZGlmaWVkU3RvcCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcmUgPSAoKHRvdWNoaW5nUHJldmlvdXNDaGFuZ2UgPyA1IDogMCkKICAgICAgICAgICAgICAgICAgICAgICAgKyB0aGlzLl9ib3VuZGFyeVNjb3JlKG9yaWdpbmFsU3RhcnQsIGNoYW5nZS5vcmlnaW5hbExlbmd0aCwgbW9kaWZpZWRTdGFydCwgY2hhbmdlLm1vZGlmaWVkTGVuZ3RoKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gYmVzdFNjb3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOwogICAgICAgICAgICAgICAgICAgICAgICBiZXN0RGVsdGEgPSBkZWx0YTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjaGFuZ2Uub3JpZ2luYWxTdGFydCAtPSBiZXN0RGVsdGE7CiAgICAgICAgICAgICAgICBjaGFuZ2UubW9kaWZpZWRTdGFydCAtPSBiZXN0RGVsdGE7CiAgICAgICAgICAgICAgICBjb25zdCBtZXJnZWRDaGFuZ2VBcnIgPSBbbnVsbF07CiAgICAgICAgICAgICAgICBpZiAoaSA+IDAgJiYgdGhpcy5DaGFuZ2VzT3ZlcmxhcChjaGFuZ2VzW2kgLSAxXSwgY2hhbmdlc1tpXSwgbWVyZ2VkQ2hhbmdlQXJyKSkgewogICAgICAgICAgICAgICAgICAgIGNoYW5nZXNbaSAtIDFdID0gbWVyZ2VkQ2hhbmdlQXJyWzBdOwogICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBsb25nZXN0IGNvbW1vbiBzdWJzdHJpbmdzLgogICAgICAgICAgICAvLyBHaXZlIHByZWZlcmVuY2UgdG8gdGhlIG9uZXMgY29udGFpbmluZyBsb25nZXIgbGluZXMKICAgICAgICAgICAgaWYgKHRoaXMuX2hhc1N0cmluZ3MpIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxLCBsZW4gPSBjaGFuZ2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYUNoYW5nZSA9IGNoYW5nZXNbaSAtIDFdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGJDaGFuZ2UgPSBjaGFuZ2VzW2ldOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRMZW5ndGggPSBiQ2hhbmdlLm9yaWdpbmFsU3RhcnQgLSBhQ2hhbmdlLm9yaWdpbmFsU3RhcnQgLSBhQ2hhbmdlLm9yaWdpbmFsTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFPcmlnaW5hbFN0YXJ0ID0gYUNoYW5nZS5vcmlnaW5hbFN0YXJ0OwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGJPcmlnaW5hbEVuZCA9IGJDaGFuZ2Uub3JpZ2luYWxTdGFydCArIGJDaGFuZ2Uub3JpZ2luYWxMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJPcmlnaW5hbExlbmd0aCA9IGJPcmlnaW5hbEVuZCAtIGFPcmlnaW5hbFN0YXJ0OwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFNb2RpZmllZFN0YXJ0ID0gYUNoYW5nZS5tb2RpZmllZFN0YXJ0OwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGJNb2RpZmllZEVuZCA9IGJDaGFuZ2UubW9kaWZpZWRTdGFydCArIGJDaGFuZ2UubW9kaWZpZWRMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWJNb2RpZmllZExlbmd0aCA9IGJNb2RpZmllZEVuZCAtIGFNb2RpZmllZFN0YXJ0OwogICAgICAgICAgICAgICAgICAgIC8vIEF2b2lkIHdhc3RpbmcgYSBsb3Qgb2YgdGltZSB3aXRoIHRoZXNlIHNlYXJjaGVzCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoZWRMZW5ndGggPCA1ICYmIGFiT3JpZ2luYWxMZW5ndGggPCAyMCAmJiBhYk1vZGlmaWVkTGVuZ3RoIDwgMjApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdCA9IHRoaXMuX2ZpbmRCZXR0ZXJDb250aWd1b3VzU2VxdWVuY2UoYU9yaWdpbmFsU3RhcnQsIGFiT3JpZ2luYWxMZW5ndGgsIGFNb2RpZmllZFN0YXJ0LCBhYk1vZGlmaWVkTGVuZ3RoLCBtYXRjaGVkTGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtvcmlnaW5hbE1hdGNoU3RhcnQsIG1vZGlmaWVkTWF0Y2hTdGFydF0gPSB0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsTWF0Y2hTdGFydCAhPT0gYUNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgYUNoYW5nZS5vcmlnaW5hbExlbmd0aCB8fCBtb2RpZmllZE1hdGNoU3RhcnQgIT09IGFDaGFuZ2UubW9kaWZpZWRTdGFydCArIGFDaGFuZ2UubW9kaWZpZWRMZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzd2l0Y2ggdG8gYW5vdGhlciBzZXF1ZW5jZSB0aGF0IGhhcyBhIGJldHRlciBzY29yZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDaGFuZ2Uub3JpZ2luYWxMZW5ndGggPSBvcmlnaW5hbE1hdGNoU3RhcnQgLSBhQ2hhbmdlLm9yaWdpbmFsU3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYUNoYW5nZS5tb2RpZmllZExlbmd0aCA9IG1vZGlmaWVkTWF0Y2hTdGFydCAtIGFDaGFuZ2UubW9kaWZpZWRTdGFydDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hhbmdlLm9yaWdpbmFsU3RhcnQgPSBvcmlnaW5hbE1hdGNoU3RhcnQgKyBtYXRjaGVkTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaGFuZ2UubW9kaWZpZWRTdGFydCA9IG1vZGlmaWVkTWF0Y2hTdGFydCArIG1hdGNoZWRMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYkNoYW5nZS5vcmlnaW5hbExlbmd0aCA9IGJPcmlnaW5hbEVuZCAtIGJDaGFuZ2Uub3JpZ2luYWxTdGFydDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hhbmdlLm1vZGlmaWVkTGVuZ3RoID0gYk1vZGlmaWVkRW5kIC0gYkNoYW5nZS5tb2RpZmllZFN0YXJ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwogICAgICAgIH0KICAgICAgICBfZmluZEJldHRlckNvbnRpZ3VvdXNTZXF1ZW5jZShvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbExlbmd0aCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRMZW5ndGgsIGRlc2lyZWRMZW5ndGgpIHsKICAgICAgICAgICAgaWYgKG9yaWdpbmFsTGVuZ3RoIDwgZGVzaXJlZExlbmd0aCB8fCBtb2RpZmllZExlbmd0aCA8IGRlc2lyZWRMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTWF4ID0gb3JpZ2luYWxTdGFydCArIG9yaWdpbmFsTGVuZ3RoIC0gZGVzaXJlZExlbmd0aCArIDE7CiAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkTWF4ID0gbW9kaWZpZWRTdGFydCArIG1vZGlmaWVkTGVuZ3RoIC0gZGVzaXJlZExlbmd0aCArIDE7CiAgICAgICAgICAgIGxldCBiZXN0U2NvcmUgPSAwOwogICAgICAgICAgICBsZXQgYmVzdE9yaWdpbmFsU3RhcnQgPSAwOwogICAgICAgICAgICBsZXQgYmVzdE1vZGlmaWVkU3RhcnQgPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gb3JpZ2luYWxTdGFydDsgaSA8IG9yaWdpbmFsTWF4OyBpKyspIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSBtb2RpZmllZFN0YXJ0OyBqIDwgbW9kaWZpZWRNYXg7IGorKykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3JlID0gdGhpcy5fY29udGlndW91c1NlcXVlbmNlU2NvcmUoaSwgaiwgZGVzaXJlZExlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gMCAmJiBzY29yZSA+IGJlc3RTY29yZSkgewogICAgICAgICAgICAgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKICAgICAgICAgICAgICAgICAgICAgICAgYmVzdE9yaWdpbmFsU3RhcnQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICBiZXN0TW9kaWZpZWRTdGFydCA9IGo7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChiZXN0U2NvcmUgPiAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW2Jlc3RPcmlnaW5hbFN0YXJ0LCBiZXN0TW9kaWZpZWRTdGFydF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIF9jb250aWd1b3VzU2VxdWVuY2VTY29yZShvcmlnaW5hbFN0YXJ0LCBtb2RpZmllZFN0YXJ0LCBsZW5ndGgpIHsKICAgICAgICAgICAgbGV0IHNjb3JlID0gMDsKICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBsZW5ndGg7IGwrKykgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLkVsZW1lbnRzQXJlRXF1YWwob3JpZ2luYWxTdGFydCArIGwsIG1vZGlmaWVkU3RhcnQgKyBsKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2NvcmUgKz0gdGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1tvcmlnaW5hbFN0YXJ0ICsgbF0ubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzY29yZTsKICAgICAgICB9CiAgICAgICAgX09yaWdpbmFsSXNCb3VuZGFyeShpbmRleCkgewogICAgICAgICAgICBpZiAoaW5kZXggPD0gMCB8fCBpbmRleCA+PSB0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAodGhpcy5faGFzU3RyaW5ncyAmJiAvXlxzKiQvLnRlc3QodGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1tpbmRleF0pKTsKICAgICAgICB9CiAgICAgICAgX09yaWdpbmFsUmVnaW9uSXNCb3VuZGFyeShvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbExlbmd0aCkgewogICAgICAgICAgICBpZiAodGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KG9yaWdpbmFsU3RhcnQpIHx8IHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeShvcmlnaW5hbFN0YXJ0IC0gMSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvcmlnaW5hbExlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRW5kID0gb3JpZ2luYWxTdGFydCArIG9yaWdpbmFsTGVuZ3RoOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeShvcmlnaW5hbEVuZCAtIDEpIHx8IHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeShvcmlnaW5hbEVuZCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIF9Nb2RpZmllZElzQm91bmRhcnkoaW5kZXgpIHsKICAgICAgICAgICAgaWYgKGluZGV4IDw9IDAgfHwgaW5kZXggPj0gdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2hhc1N0cmluZ3MgJiYgL15ccyokLy50ZXN0KHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbaW5kZXhdKSk7CiAgICAgICAgfQogICAgICAgIF9Nb2RpZmllZFJlZ2lvbklzQm91bmRhcnkobW9kaWZpZWRTdGFydCwgbW9kaWZpZWRMZW5ndGgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX01vZGlmaWVkSXNCb3VuZGFyeShtb2RpZmllZFN0YXJ0KSB8fCB0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkobW9kaWZpZWRTdGFydCAtIDEpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobW9kaWZpZWRMZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZEVuZCA9IG1vZGlmaWVkU3RhcnQgKyBtb2RpZmllZExlbmd0aDsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkobW9kaWZpZWRFbmQgLSAxKSB8fCB0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkobW9kaWZpZWRFbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBfYm91bmRhcnlTY29yZShvcmlnaW5hbFN0YXJ0LCBvcmlnaW5hbExlbmd0aCwgbW9kaWZpZWRTdGFydCwgbW9kaWZpZWRMZW5ndGgpIHsKICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTY29yZSA9ICh0aGlzLl9PcmlnaW5hbFJlZ2lvbklzQm91bmRhcnkob3JpZ2luYWxTdGFydCwgb3JpZ2luYWxMZW5ndGgpID8gMSA6IDApOwogICAgICAgICAgICBjb25zdCBtb2RpZmllZFNjb3JlID0gKHRoaXMuX01vZGlmaWVkUmVnaW9uSXNCb3VuZGFyeShtb2RpZmllZFN0YXJ0LCBtb2RpZmllZExlbmd0aCkgPyAxIDogMCk7CiAgICAgICAgICAgIHJldHVybiAob3JpZ2luYWxTY29yZSArIG1vZGlmaWVkU2NvcmUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb25jYXRlbmF0ZXMgdGhlIHR3byBpbnB1dCBEaWZmQ2hhbmdlIGxpc3RzIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcKICAgICAgICAgKiBsaXN0LgogICAgICAgICAqIEBwYXJhbSBUaGUgbGVmdCBjaGFuZ2VzCiAgICAgICAgICogQHBhcmFtIFRoZSByaWdodCBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybnMgVGhlIGNvbmNhdGVuYXRlZCBsaXN0CiAgICAgICAgICovCiAgICAgICAgQ29uY2F0ZW5hdGVDaGFuZ2VzKGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgICAgIGxldCBtZXJnZWRDaGFuZ2VBcnIgPSBbXTsKICAgICAgICAgICAgaWYgKGxlZnQubGVuZ3RoID09PSAwIHx8IHJpZ2h0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChyaWdodC5sZW5ndGggPiAwKSA/IHJpZ2h0IDogbGVmdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLkNoYW5nZXNPdmVybGFwKGxlZnRbbGVmdC5sZW5ndGggLSAxXSwgcmlnaHRbMF0sIG1lcmdlZENoYW5nZUFycikpIHsKICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGJyZWFrIHRoZSBwcm9ibGVtIGRvd24gcmVjdXJzaXZlbHksIGl0IGlzIHBvc3NpYmxlIHRoYXQgd2UKICAgICAgICAgICAgICAgIC8vIG1pZ2h0IHJlY3Vyc2UgaW4gdGhlIG1pZGRsZSBvZiBhIGNoYW5nZSB0aGVyZWJ5IHNwbGl0dGluZyBpdCBpbnRvCiAgICAgICAgICAgICAgICAvLyB0d28gY2hhbmdlcy4gSGVyZSBpbiB0aGUgY29tYmluaW5nIHN0YWdlLCB3ZSBkZXRlY3QgYW5kIGZ1c2UgdGhvc2UKICAgICAgICAgICAgICAgIC8vIGNoYW5nZXMgYmFjayB0b2dldGhlcgogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGxlZnQubGVuZ3RoICsgcmlnaHQubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICBNeUFycmF5LkNvcHkobGVmdCwgMCwgcmVzdWx0LCAwLCBsZWZ0Lmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgcmVzdWx0W2xlZnQubGVuZ3RoIC0gMV0gPSBtZXJnZWRDaGFuZ2VBcnJbMF07CiAgICAgICAgICAgICAgICBNeUFycmF5LkNvcHkocmlnaHQsIDEsIHJlc3VsdCwgbGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheShsZWZ0Lmxlbmd0aCArIHJpZ2h0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICBNeUFycmF5LkNvcHkobGVmdCwgMCwgcmVzdWx0LCAwLCBsZWZ0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICBNeUFycmF5LkNvcHkocmlnaHQsIDAsIHJlc3VsdCwgbGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHdvIGNoYW5nZXMgb3ZlcmxhcCBhbmQgY2FuIGJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlCiAgICAgICAgICogY2hhbmdlCiAgICAgICAgICogQHBhcmFtIGxlZnQgVGhlIGxlZnQgY2hhbmdlCiAgICAgICAgICogQHBhcmFtIHJpZ2h0IFRoZSByaWdodCBjaGFuZ2UKICAgICAgICAgKiBAcGFyYW0gbWVyZ2VkQ2hhbmdlIFRoZSBtZXJnZWQgY2hhbmdlIGlmIHRoZSB0d28gb3ZlcmxhcCwgbnVsbCBvdGhlcndpc2UKICAgICAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSB0d28gY2hhbmdlcyBvdmVybGFwCiAgICAgICAgICovCiAgICAgICAgQ2hhbmdlc092ZXJsYXAobGVmdCwgcmlnaHQsIG1lcmdlZENoYW5nZUFycikgewogICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQobGVmdC5vcmlnaW5hbFN0YXJ0IDw9IHJpZ2h0Lm9yaWdpbmFsU3RhcnQsICdMZWZ0IGNoYW5nZSBpcyBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHJpZ2h0IGNoYW5nZScpOwogICAgICAgICAgICBEZWJ1Zy5Bc3NlcnQobGVmdC5tb2RpZmllZFN0YXJ0IDw9IHJpZ2h0Lm1vZGlmaWVkU3RhcnQsICdMZWZ0IGNoYW5nZSBpcyBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHJpZ2h0IGNoYW5nZScpOwogICAgICAgICAgICBpZiAobGVmdC5vcmlnaW5hbFN0YXJ0ICsgbGVmdC5vcmlnaW5hbExlbmd0aCA+PSByaWdodC5vcmlnaW5hbFN0YXJ0IHx8IGxlZnQubW9kaWZpZWRTdGFydCArIGxlZnQubW9kaWZpZWRMZW5ndGggPj0gcmlnaHQubW9kaWZpZWRTdGFydCkgewogICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydCA9IGxlZnQub3JpZ2luYWxTdGFydDsKICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbExlbmd0aCA9IGxlZnQub3JpZ2luYWxMZW5ndGg7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZFN0YXJ0ID0gbGVmdC5tb2RpZmllZFN0YXJ0OwogICAgICAgICAgICAgICAgbGV0IG1vZGlmaWVkTGVuZ3RoID0gbGVmdC5tb2RpZmllZExlbmd0aDsKICAgICAgICAgICAgICAgIGlmIChsZWZ0Lm9yaWdpbmFsU3RhcnQgKyBsZWZ0Lm9yaWdpbmFsTGVuZ3RoID49IHJpZ2h0Lm9yaWdpbmFsU3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbExlbmd0aCA9IHJpZ2h0Lm9yaWdpbmFsU3RhcnQgKyByaWdodC5vcmlnaW5hbExlbmd0aCAtIGxlZnQub3JpZ2luYWxTdGFydDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsZWZ0Lm1vZGlmaWVkU3RhcnQgKyBsZWZ0Lm1vZGlmaWVkTGVuZ3RoID49IHJpZ2h0Lm1vZGlmaWVkU3RhcnQpIHsKICAgICAgICAgICAgICAgICAgICBtb2RpZmllZExlbmd0aCA9IHJpZ2h0Lm1vZGlmaWVkU3RhcnQgKyByaWdodC5tb2RpZmllZExlbmd0aCAtIGxlZnQubW9kaWZpZWRTdGFydDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lcmdlZENoYW5nZUFyclswXSA9IG5ldyBEaWZmQ2hhbmdlKG9yaWdpbmFsU3RhcnQsIG9yaWdpbmFsTGVuZ3RoLCBtb2RpZmllZFN0YXJ0LCBtb2RpZmllZExlbmd0aCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG1lcmdlZENoYW5nZUFyclswXSA9IG51bGw7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSGVscGVyIG1ldGhvZCB1c2VkIHRvIGNsaXAgYSBkaWFnb25hbCBpbmRleCB0byB0aGUgcmFuZ2Ugb2YgdmFsaWQKICAgICAgICAgKiBkaWFnb25hbHMuIFRoaXMgYWxzbyBkZWNpZGVzIHdoZXRoZXIgb3Igbm90IHRoZSBkaWFnb25hbCBpbmRleCwKICAgICAgICAgKiBpZiBpdCBleGNlZWRzIHRoZSBib3VuZGFyeSwgc2hvdWxkIGJlIGNsaXBwZWQgdG8gdGhlIGJvdW5kYXJ5IG9yIGNsaXBwZWQKICAgICAgICAgKiBvbmUgaW5zaWRlIHRoZSBib3VuZGFyeSBkZXBlbmRpbmcgb24gdGhlIEV2ZW4vT2RkIHN0YXR1cyBvZiB0aGUgYm91bmRhcnkKICAgICAgICAgKiBhbmQgbnVtRGlmZmVyZW5jZXMuCiAgICAgICAgICogQHBhcmFtIGRpYWdvbmFsIFRoZSBpbmRleCBvZiB0aGUgZGlhZ29uYWwgdG8gY2xpcC4KICAgICAgICAgKiBAcGFyYW0gbnVtRGlmZmVyZW5jZXMgVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGRpZmZlcmVuY2VzIGJlaW5nIGl0ZXJhdGVkIHVwb24uCiAgICAgICAgICogQHBhcmFtIGRpYWdvbmFsQmFzZUluZGV4IFRoZSBiYXNlIHJlZmVyZW5jZSBkaWFnb25hbC4KICAgICAgICAgKiBAcGFyYW0gbnVtRGlhZ29uYWxzIFRoZSB0b3RhbCBudW1iZXIgb2YgZGlhZ29uYWxzLgogICAgICAgICAqIEByZXR1cm5zIFRoZSBjbGlwcGVkIGRpYWdvbmFsIGluZGV4LgogICAgICAgICAqLwogICAgICAgIENsaXBEaWFnb25hbEJvdW5kKGRpYWdvbmFsLCBudW1EaWZmZXJlbmNlcywgZGlhZ29uYWxCYXNlSW5kZXgsIG51bURpYWdvbmFscykgewogICAgICAgICAgICBpZiAoZGlhZ29uYWwgPj0gMCAmJiBkaWFnb25hbCA8IG51bURpYWdvbmFscykgewogICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBjbGlwLCBpdHMgaW4gcmFuZ2UKICAgICAgICAgICAgICAgIHJldHVybiBkaWFnb25hbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBkaWFnb25hbHNCZWxvdzogVGhlIG51bWJlciBvZiBkaWFnb25hbHMgYmVsb3cgdGhlIHJlZmVyZW5jZSBkaWFnb25hbAogICAgICAgICAgICAvLyBkaWFnb25hbHNBYm92ZTogVGhlIG51bWJlciBvZiBkaWFnb25hbHMgYWJvdmUgdGhlIHJlZmVyZW5jZSBkaWFnb25hbAogICAgICAgICAgICBjb25zdCBkaWFnb25hbHNCZWxvdyA9IGRpYWdvbmFsQmFzZUluZGV4OwogICAgICAgICAgICBjb25zdCBkaWFnb25hbHNBYm92ZSA9IG51bURpYWdvbmFscyAtIGRpYWdvbmFsQmFzZUluZGV4IC0gMTsKICAgICAgICAgICAgY29uc3QgZGlmZkV2ZW4gPSAobnVtRGlmZmVyZW5jZXMgJSAyID09PSAwKTsKICAgICAgICAgICAgaWYgKGRpYWdvbmFsIDwgMCkgewogICAgICAgICAgICAgICAgY29uc3QgbG93ZXJCb3VuZEV2ZW4gPSAoZGlhZ29uYWxzQmVsb3cgJSAyID09PSAwKTsKICAgICAgICAgICAgICAgIHJldHVybiAoZGlmZkV2ZW4gPT09IGxvd2VyQm91bmRFdmVuKSA/IDAgOiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgdXBwZXJCb3VuZEV2ZW4gPSAoZGlhZ29uYWxzQWJvdmUgJSAyID09PSAwKTsKICAgICAgICAgICAgICAgIHJldHVybiAoZGlmZkV2ZW4gPT09IHVwcGVyQm91bmRFdmVuKSA/IG51bURpYWdvbmFscyAtIDEgOiBudW1EaWFnb25hbHMgLSAyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgbGV0IHNhZmVQcm9jZXNzOwogICAgLy8gTmF0aXZlIHNhbmRib3ggZW52aXJvbm1lbnQKICAgIGlmICh0eXBlb2YgZ2xvYmFscy52c2NvZGUgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnbG9iYWxzLnZzY29kZS5wcm9jZXNzICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIGNvbnN0IHNhbmRib3hQcm9jZXNzID0gZ2xvYmFscy52c2NvZGUucHJvY2VzczsKICAgICAgICBzYWZlUHJvY2VzcyA9IHsKICAgICAgICAgICAgZ2V0IHBsYXRmb3JtKCkgeyByZXR1cm4gc2FuZGJveFByb2Nlc3MucGxhdGZvcm07IH0sCiAgICAgICAgICAgIGdldCBhcmNoKCkgeyByZXR1cm4gc2FuZGJveFByb2Nlc3MuYXJjaDsgfSwKICAgICAgICAgICAgZ2V0IGVudigpIHsgcmV0dXJuIHNhbmRib3hQcm9jZXNzLmVudjsgfSwKICAgICAgICAgICAgY3dkKCkgeyByZXR1cm4gc2FuZGJveFByb2Nlc3MuY3dkKCk7IH0KICAgICAgICB9OwogICAgfQogICAgLy8gTmF0aXZlIG5vZGUuanMgZW52aXJvbm1lbnQKICAgIGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIHNhZmVQcm9jZXNzID0gewogICAgICAgICAgICBnZXQgcGxhdGZvcm0oKSB7IHJldHVybiBwcm9jZXNzLnBsYXRmb3JtOyB9LAogICAgICAgICAgICBnZXQgYXJjaCgpIHsgcmV0dXJuIHByb2Nlc3MuYXJjaDsgfSwKICAgICAgICAgICAgZ2V0IGVudigpIHsgcmV0dXJuIHByb2Nlc3MuZW52OyB9LAogICAgICAgICAgICBjd2QoKSB7IHJldHVybiBwcm9jZXNzLmVudlsnVlNDT0RFX0NXRCddIHx8IHByb2Nlc3MuY3dkKCk7IH0KICAgICAgICB9OwogICAgfQogICAgLy8gV2ViIGVudmlyb25tZW50CiAgICBlbHNlIHsKICAgICAgICBzYWZlUHJvY2VzcyA9IHsKICAgICAgICAgICAgLy8gU3VwcG9ydGVkCiAgICAgICAgICAgIGdldCBwbGF0Zm9ybSgpIHsgcmV0dXJuIGlzV2luZG93cyA/ICd3aW4zMicgOiBpc01hY2ludG9zaCA/ICdkYXJ3aW4nIDogJ2xpbnV4JzsgfSwKICAgICAgICAgICAgZ2V0IGFyY2goKSB7IHJldHVybiB1bmRlZmluZWQ7IC8qIGFyY2ggaXMgdW5kZWZpbmVkIGluIHdlYiAqLyB9LAogICAgICAgICAgICAvLyBVbnN1cHBvcnRlZAogICAgICAgICAgICBnZXQgZW52KCkgeyByZXR1cm4ge307IH0sCiAgICAgICAgICAgIGN3ZCgpIHsgcmV0dXJuICcvJzsgfQogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIFByb3ZpZGVzIHNhZmUgYWNjZXNzIHRvIHRoZSBgY3dkYCBwcm9wZXJ0eSBpbiBub2RlLmpzLCBzYW5kYm94ZWQgb3Igd2ViCiAgICAgKiBlbnZpcm9ubWVudHMuCiAgICAgKgogICAgICogTm90ZTogaW4gd2ViLCB0aGlzIHByb3BlcnR5IGlzIGhhcmRjb2RlZCB0byBiZSBgL2AuCiAgICAgKi8KICAgIGNvbnN0IGN3ZCA9IHNhZmVQcm9jZXNzLmN3ZDsKICAgIC8qKgogICAgICogUHJvdmlkZXMgc2FmZSBhY2Nlc3MgdG8gdGhlIGBlbnZgIHByb3BlcnR5IGluIG5vZGUuanMsIHNhbmRib3hlZCBvciB3ZWIKICAgICAqIGVudmlyb25tZW50cy4KICAgICAqCiAgICAgKiBOb3RlOiBpbiB3ZWIsIHRoaXMgcHJvcGVydHkgaXMgaGFyZGNvZGVkIHRvIGJlIGB7fWAuCiAgICAgKi8KICAgIGNvbnN0IGVudiA9IHNhZmVQcm9jZXNzLmVudjsKICAgIC8qKgogICAgICogUHJvdmlkZXMgc2FmZSBhY2Nlc3MgdG8gdGhlIGBwbGF0Zm9ybWAgcHJvcGVydHkgaW4gbm9kZS5qcywgc2FuZGJveGVkIG9yIHdlYgogICAgICogZW52aXJvbm1lbnRzLgogICAgICovCiAgICBjb25zdCBwbGF0Zm9ybSA9IHNhZmVQcm9jZXNzLnBsYXRmb3JtOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY29uc3QgQ0hBUl9VUFBFUkNBU0VfQSA9IDY1OyAvKiBBICovCiAgICBjb25zdCBDSEFSX0xPV0VSQ0FTRV9BID0gOTc7IC8qIGEgKi8KICAgIGNvbnN0IENIQVJfVVBQRVJDQVNFX1ogPSA5MDsgLyogWiAqLwogICAgY29uc3QgQ0hBUl9MT1dFUkNBU0VfWiA9IDEyMjsgLyogeiAqLwogICAgY29uc3QgQ0hBUl9ET1QgPSA0NjsgLyogLiAqLwogICAgY29uc3QgQ0hBUl9GT1JXQVJEX1NMQVNIID0gNDc7IC8qIC8gKi8KICAgIGNvbnN0IENIQVJfQkFDS1dBUkRfU0xBU0ggPSA5MjsgLyogXCAqLwogICAgY29uc3QgQ0hBUl9DT0xPTiA9IDU4OyAvKiA6ICovCiAgICBjb25zdCBDSEFSX1FVRVNUSU9OX01BUksgPSA2MzsgLyogPyAqLwogICAgY2xhc3MgRXJyb3JJbnZhbGlkQXJnVHlwZSBleHRlbmRzIEVycm9yIHsKICAgICAgICBjb25zdHJ1Y3RvcihuYW1lLCBleHBlY3RlZCwgYWN0dWFsKSB7CiAgICAgICAgICAgIC8vIGRldGVybWluZXI6ICdtdXN0IGJlJyBvciAnbXVzdCBub3QgYmUnCiAgICAgICAgICAgIGxldCBkZXRlcm1pbmVyOwogICAgICAgICAgICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJyAmJiBleHBlY3RlZC5pbmRleE9mKCdub3QgJykgPT09IDApIHsKICAgICAgICAgICAgICAgIGRldGVybWluZXIgPSAnbXVzdCBub3QgYmUnOwogICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZC5yZXBsYWNlKC9ebm90IC8sICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRldGVybWluZXIgPSAnbXVzdCBiZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdHlwZSA9IG5hbWUuaW5kZXhPZignLicpICE9PSAtMSA/ICdwcm9wZXJ0eScgOiAnYXJndW1lbnQnOwogICAgICAgICAgICBsZXQgbXNnID0gYFRoZSAiJHtuYW1lfSIgJHt0eXBlfSAke2RldGVybWluZXJ9IG9mIHR5cGUgJHtleHBlY3RlZH1gOwogICAgICAgICAgICBtc2cgKz0gYC4gUmVjZWl2ZWQgdHlwZSAke3R5cGVvZiBhY3R1YWx9YDsKICAgICAgICAgICAgc3VwZXIobXNnKTsKICAgICAgICAgICAgdGhpcy5jb2RlID0gJ0VSUl9JTlZBTElEX0FSR19UWVBFJzsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB2YWxpZGF0ZVN0cmluZyh2YWx1ZSwgbmFtZSkgewogICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvckludmFsaWRBcmdUeXBlKG5hbWUsICdzdHJpbmcnLCB2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gaXNQYXRoU2VwYXJhdG9yKGNvZGUpIHsKICAgICAgICByZXR1cm4gY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIIHx8IGNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0g7CiAgICB9CiAgICBmdW5jdGlvbiBpc1Bvc2l4UGF0aFNlcGFyYXRvcihjb2RlKSB7CiAgICAgICAgcmV0dXJuIGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSDsKICAgIH0KICAgIGZ1bmN0aW9uIGlzV2luZG93c0RldmljZVJvb3QoY29kZSkgewogICAgICAgIHJldHVybiAoY29kZSA+PSBDSEFSX1VQUEVSQ0FTRV9BICYmIGNvZGUgPD0gQ0hBUl9VUFBFUkNBU0VfWikgfHwKICAgICAgICAgICAgKGNvZGUgPj0gQ0hBUl9MT1dFUkNBU0VfQSAmJiBjb2RlIDw9IENIQVJfTE9XRVJDQVNFX1opOwogICAgfQogICAgLy8gUmVzb2x2ZXMgLiBhbmQgLi4gZWxlbWVudHMgaW4gYSBwYXRoIHdpdGggZGlyZWN0b3J5IG5hbWVzCiAgICBmdW5jdGlvbiBub3JtYWxpemVTdHJpbmcocGF0aCwgYWxsb3dBYm92ZVJvb3QsIHNlcGFyYXRvciwgaXNQYXRoU2VwYXJhdG9yKSB7CiAgICAgICAgbGV0IHJlcyA9ICcnOwogICAgICAgIGxldCBsYXN0U2VnbWVudExlbmd0aCA9IDA7CiAgICAgICAgbGV0IGxhc3RTbGFzaCA9IC0xOwogICAgICAgIGxldCBkb3RzID0gMDsKICAgICAgICBsZXQgY29kZSA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gcGF0aC5sZW5ndGg7ICsraSkgewogICAgICAgICAgICBpZiAoaSA8IHBhdGgubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzUGF0aFNlcGFyYXRvcihjb2RlKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb2RlID0gQ0hBUl9GT1JXQVJEX1NMQVNIOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoY29kZSkpIHsKICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2ggPT09IGkgLSAxIHx8IGRvdHMgPT09IDEpIDsKICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRvdHMgPT09IDIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmxlbmd0aCA8IDIgfHwgbGFzdFNlZ21lbnRMZW5ndGggIT09IDIgfHwKICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmNoYXJDb2RlQXQocmVzLmxlbmd0aCAtIDEpICE9PSBDSEFSX0RPVCB8fAogICAgICAgICAgICAgICAgICAgICAgICByZXMuY2hhckNvZGVBdChyZXMubGVuZ3RoIC0gMikgIT09IENIQVJfRE9UKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdFNsYXNoSW5kZXggPSByZXMubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSByZXMuc2xpY2UoMCwgbGFzdFNsYXNoSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gcmVzLmxlbmd0aCAtIDEgLSByZXMubGFzdEluZGV4T2Yoc2VwYXJhdG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3RzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlcy5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNlZ21lbnRMZW5ndGggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFNsYXNoID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdHMgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93QWJvdmVSb290KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyArPSByZXMubGVuZ3RoID4gMCA/IGAke3NlcGFyYXRvcn0uLmAgOiAnLi4nOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyArPSBgJHtzZXBhcmF0b3J9JHtwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGkpfWA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBwYXRoLnNsaWNlKGxhc3RTbGFzaCArIDEsIGkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IGkgLSBsYXN0U2xhc2ggLSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGFzdFNsYXNoID0gaTsKICAgICAgICAgICAgICAgIGRvdHMgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGNvZGUgPT09IENIQVJfRE9UICYmIGRvdHMgIT09IC0xKSB7CiAgICAgICAgICAgICAgICArK2RvdHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkb3RzID0gLTE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KICAgIGZ1bmN0aW9uIF9mb3JtYXQoc2VwLCBwYXRoT2JqZWN0KSB7CiAgICAgICAgaWYgKHBhdGhPYmplY3QgPT09IG51bGwgfHwgdHlwZW9mIHBhdGhPYmplY3QgIT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvckludmFsaWRBcmdUeXBlKCdwYXRoT2JqZWN0JywgJ09iamVjdCcsIHBhdGhPYmplY3QpOwogICAgICAgIH0KICAgICAgICBjb25zdCBkaXIgPSBwYXRoT2JqZWN0LmRpciB8fCBwYXRoT2JqZWN0LnJvb3Q7CiAgICAgICAgY29uc3QgYmFzZSA9IHBhdGhPYmplY3QuYmFzZSB8fAogICAgICAgICAgICBgJHtwYXRoT2JqZWN0Lm5hbWUgfHwgJyd9JHtwYXRoT2JqZWN0LmV4dCB8fCAnJ31gOwogICAgICAgIGlmICghZGlyKSB7CiAgICAgICAgICAgIHJldHVybiBiYXNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGlyID09PSBwYXRoT2JqZWN0LnJvb3QgPyBgJHtkaXJ9JHtiYXNlfWAgOiBgJHtkaXJ9JHtzZXB9JHtiYXNlfWA7CiAgICB9CiAgICBjb25zdCB3aW4zMiA9IHsKICAgICAgICAvLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pCiAgICAgICAgcmVzb2x2ZSguLi5wYXRoU2VnbWVudHMpIHsKICAgICAgICAgICAgbGV0IHJlc29sdmVkRGV2aWNlID0gJyc7CiAgICAgICAgICAgIGxldCByZXNvbHZlZFRhaWwgPSAnJzsKICAgICAgICAgICAgbGV0IHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBhdGhTZWdtZW50cy5sZW5ndGggLSAxOyBpID49IC0xOyBpLS0pIHsKICAgICAgICAgICAgICAgIGxldCBwYXRoOwogICAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBwYXRoU2VnbWVudHNbaV07CiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTsKICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGVtcHR5IGVudHJpZXMKICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzb2x2ZWREZXZpY2UubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGN3ZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2luZG93cyBoYXMgdGhlIGNvbmNlcHQgb2YgZHJpdmUtc3BlY2lmaWMgY3VycmVudCB3b3JraW5nCiAgICAgICAgICAgICAgICAgICAgLy8gZGlyZWN0b3JpZXMuIElmIHdlJ3ZlIHJlc29sdmVkIGEgZHJpdmUgbGV0dGVyIGJ1dCBub3QgeWV0IGFuCiAgICAgICAgICAgICAgICAgICAgLy8gYWJzb2x1dGUgcGF0aCwgZ2V0IGN3ZCBmb3IgdGhhdCBkcml2ZSwgb3IgdGhlIHByb2Nlc3MgY3dkIGlmCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRyaXZlIGN3ZCBpcyBub3QgYXZhaWxhYmxlLiBXZSdyZSBzdXJlIHRoZSBkZXZpY2UgaXMgbm90CiAgICAgICAgICAgICAgICAgICAgLy8gYSBVTkMgcGF0aCBhdCB0aGlzIHBvaW50cywgYmVjYXVzZSBVTkMgcGF0aHMgYXJlIGFsd2F5cyBhYnNvbHV0ZS4KICAgICAgICAgICAgICAgICAgICBwYXRoID0gZW52W2A9JHtyZXNvbHZlZERldmljZX1gXSB8fCBjd2QoKTsKICAgICAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCBhIGN3ZCB3YXMgZm91bmQgYW5kIHRoYXQgaXQgYWN0dWFsbHkgcG9pbnRzCiAgICAgICAgICAgICAgICAgICAgLy8gdG8gb3VyIGRyaXZlLiBJZiBub3QsIGRlZmF1bHQgdG8gdGhlIGRyaXZlJ3Mgcm9vdC4KICAgICAgICAgICAgICAgICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIChwYXRoLnNsaWNlKDAsIDIpLnRvTG93ZXJDYXNlKCkgIT09IHJlc29sdmVkRGV2aWNlLnRvTG93ZXJDYXNlKCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguY2hhckNvZGVBdCgyKSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGAke3Jlc29sdmVkRGV2aWNlfVxcYDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBsZW4gPSBwYXRoLmxlbmd0aDsKICAgICAgICAgICAgICAgIGxldCByb290RW5kID0gMDsKICAgICAgICAgICAgICAgIGxldCBkZXZpY2UgPSAnJzsKICAgICAgICAgICAgICAgIGxldCBpc0Fic29sdXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KDApOwogICAgICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGEgcm9vdAogICAgICAgICAgICAgICAgaWYgKGxlbiA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoY29kZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHBhdGhgIGNvbnRhaW5zIGp1c3QgYSBwYXRoIHNlcGFyYXRvcgogICAgICAgICAgICAgICAgICAgICAgICByb290RW5kID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaXNBYnNvbHV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gUG9zc2libGUgVU5DIHJvb3QKICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBzdGFydGVkIHdpdGggYSBzZXBhcmF0b3IsIHdlIGtub3cgd2UgYXQgbGVhc3QgaGF2ZSBhbgogICAgICAgICAgICAgICAgICAgIC8vIGFic29sdXRlIHBhdGggb2Ygc29tZSBraW5kIChVTkMgb3Igb3RoZXJ3aXNlKQogICAgICAgICAgICAgICAgICAgIGlzQWJzb2x1dGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KDEpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIGRvdWJsZSBwYXRoIHNlcGFyYXRvciBhdCBiZWdpbm5pbmcKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGogPSAyOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBub24tcGF0aCBzZXBhcmF0b3JzCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgbGVuICYmICFpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgbGVuICYmIGogIT09IGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0UGFydCA9IHBhdGguc2xpY2UobGFzdCwgaik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCA9IGo7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaCAxIG9yIG1vcmUgcGF0aCBzZXBhcmF0b3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbiAmJiBpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgbGVuICYmIGogIT09IGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBub24tcGF0aCBzZXBhcmF0b3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgIWlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoaikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGxlbiB8fCBqICE9PSBsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgYSBVTkMgcm9vdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgPSBgXFxcXCR7Zmlyc3RQYXJ0fVxcJHtwYXRoLnNsaWNlKGxhc3QsIGopfWA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbmQgPSBqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVuZCA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNXaW5kb3dzRGV2aWNlUm9vdChjb2RlKSAmJgogICAgICAgICAgICAgICAgICAgIHBhdGguY2hhckNvZGVBdCgxKSA9PT0gQ0hBUl9DT0xPTikgewogICAgICAgICAgICAgICAgICAgIC8vIFBvc3NpYmxlIGRldmljZSByb290CiAgICAgICAgICAgICAgICAgICAgZGV2aWNlID0gcGF0aC5zbGljZSgwLCAyKTsKICAgICAgICAgICAgICAgICAgICByb290RW5kID0gMjsKICAgICAgICAgICAgICAgICAgICBpZiAobGVuID4gMiAmJiBpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KDIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmVhdCBzZXBhcmF0b3IgZm9sbG93aW5nIGRyaXZlIG5hbWUgYXMgYW4gYWJzb2x1dGUgcGF0aAogICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0b3IKICAgICAgICAgICAgICAgICAgICAgICAgaXNBYnNvbHV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbmQgPSAzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkZXZpY2UubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZERldmljZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UudG9Mb3dlckNhc2UoKSAhPT0gcmVzb2x2ZWREZXZpY2UudG9Mb3dlckNhc2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBwYXRoIHBvaW50cyB0byBhbm90aGVyIGRldmljZSBzbyBpdCBpcyBub3QgYXBwbGljYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVkRGV2aWNlID0gZGV2aWNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZEFic29sdXRlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkRGV2aWNlLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRUYWlsID0gYCR7cGF0aC5zbGljZShyb290RW5kKX1cXCR7cmVzb2x2ZWRUYWlsfWA7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGlzQWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQWJzb2x1dGUgJiYgcmVzb2x2ZWREZXZpY2UubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsCiAgICAgICAgICAgIC8vIGJ1dCBoYW5kbGUgcmVsYXRpdmUgcGF0aHMgdG8gYmUgc2FmZSAobWlnaHQgaGFwcGVuIHdoZW4gcHJvY2Vzcy5jd2QoKQogICAgICAgICAgICAvLyBmYWlscykKICAgICAgICAgICAgLy8gTm9ybWFsaXplIHRoZSB0YWlsIHBhdGgKICAgICAgICAgICAgcmVzb2x2ZWRUYWlsID0gbm9ybWFsaXplU3RyaW5nKHJlc29sdmVkVGFpbCwgIXJlc29sdmVkQWJzb2x1dGUsICdcXCcsIGlzUGF0aFNlcGFyYXRvcik7CiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZEFic29sdXRlID8KICAgICAgICAgICAgICAgIGAke3Jlc29sdmVkRGV2aWNlfVxcJHtyZXNvbHZlZFRhaWx9YCA6CiAgICAgICAgICAgICAgICBgJHtyZXNvbHZlZERldmljZX0ke3Jlc29sdmVkVGFpbH1gIHx8ICcuJzsKICAgICAgICB9LAogICAgICAgIG5vcm1hbGl6ZShwYXRoKSB7CiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgsICdwYXRoJyk7CiAgICAgICAgICAgIGNvbnN0IGxlbiA9IHBhdGgubGVuZ3RoOwogICAgICAgICAgICBpZiAobGVuID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJy4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCByb290RW5kID0gMDsKICAgICAgICAgICAgbGV0IGRldmljZTsKICAgICAgICAgICAgbGV0IGlzQWJzb2x1dGUgPSBmYWxzZTsKICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdCgwKTsKICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGEgcm9vdAogICAgICAgICAgICBpZiAobGVuID09PSAxKSB7CiAgICAgICAgICAgICAgICAvLyBgcGF0aGAgY29udGFpbnMganVzdCBhIHNpbmdsZSBjaGFyLCBleGl0IGVhcmx5IHRvIGF2b2lkCiAgICAgICAgICAgICAgICAvLyB1bm5lY2Vzc2FyeSB3b3JrCiAgICAgICAgICAgICAgICByZXR1cm4gaXNQb3NpeFBhdGhTZXBhcmF0b3IoY29kZSkgPyAnXFwnIDogcGF0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7CiAgICAgICAgICAgICAgICAvLyBQb3NzaWJsZSBVTkMgcm9vdAogICAgICAgICAgICAgICAgLy8gSWYgd2Ugc3RhcnRlZCB3aXRoIGEgc2VwYXJhdG9yLCB3ZSBrbm93IHdlIGF0IGxlYXN0IGhhdmUgYW4gYWJzb2x1dGUKICAgICAgICAgICAgICAgIC8vIHBhdGggb2Ygc29tZSBraW5kIChVTkMgb3Igb3RoZXJ3aXNlKQogICAgICAgICAgICAgICAgaXNBYnNvbHV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgxKSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIGRvdWJsZSBwYXRoIHNlcGFyYXRvciBhdCBiZWdpbm5pbmcKICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDI7CiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBqOwogICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBub24tcGF0aCBzZXBhcmF0b3JzCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgIWlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoaikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGogPCBsZW4gJiYgaiAhPT0gbGFzdCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFBhcnQgPSBwYXRoLnNsaWNlKGxhc3QsIGopOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIQogICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gajsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2ggMSBvciBtb3JlIHBhdGggc2VwYXJhdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbiAmJiBpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgbGVuICYmIGogIT09IGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoZWQhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBub24tcGF0aCBzZXBhcmF0b3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbiAmJiAhaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF0Y2hlZCBhIFVOQyByb290IG9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgVU5DIHJvb3Qgc2luY2UgdGhlcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3RoaW5nIGxlZnQgdG8gcHJvY2VzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgXFxcXCR7Zmlyc3RQYXJ0fVxcJHtwYXRoLnNsaWNlKGxhc3QpfVxcYDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqICE9PSBsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF0Y2hlZCBhIFVOQyByb290IHdpdGggbGVmdG92ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlID0gYFxcXFwke2ZpcnN0UGFydH1cXCR7cGF0aC5zbGljZShsYXN0LCBqKX1gOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RFbmQgPSBqOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdEVuZCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNXaW5kb3dzRGV2aWNlUm9vdChjb2RlKSAmJiBwYXRoLmNoYXJDb2RlQXQoMSkgPT09IENIQVJfQ09MT04pIHsKICAgICAgICAgICAgICAgIC8vIFBvc3NpYmxlIGRldmljZSByb290CiAgICAgICAgICAgICAgICBkZXZpY2UgPSBwYXRoLnNsaWNlKDAsIDIpOwogICAgICAgICAgICAgICAgcm9vdEVuZCA9IDI7CiAgICAgICAgICAgICAgICBpZiAobGVuID4gMiAmJiBpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KDIpKSkgewogICAgICAgICAgICAgICAgICAgIC8vIFRyZWF0IHNlcGFyYXRvciBmb2xsb3dpbmcgZHJpdmUgbmFtZSBhcyBhbiBhYnNvbHV0ZSBwYXRoCiAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdG9yCiAgICAgICAgICAgICAgICAgICAgaXNBYnNvbHV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcm9vdEVuZCA9IDM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHRhaWwgPSByb290RW5kIDwgbGVuID8KICAgICAgICAgICAgICAgIG5vcm1hbGl6ZVN0cmluZyhwYXRoLnNsaWNlKHJvb3RFbmQpLCAhaXNBYnNvbHV0ZSwgJ1xcJywgaXNQYXRoU2VwYXJhdG9yKSA6CiAgICAgICAgICAgICAgICAnJzsKICAgICAgICAgICAgaWYgKHRhaWwubGVuZ3RoID09PSAwICYmICFpc0Fic29sdXRlKSB7CiAgICAgICAgICAgICAgICB0YWlsID0gJy4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0YWlsLmxlbmd0aCA+IDAgJiYgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChsZW4gLSAxKSkpIHsKICAgICAgICAgICAgICAgIHRhaWwgKz0gJ1xcJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGV2aWNlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpc0Fic29sdXRlID8gYFxcJHt0YWlsfWAgOiB0YWlsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpc0Fic29sdXRlID8gYCR7ZGV2aWNlfVxcJHt0YWlsfWAgOiBgJHtkZXZpY2V9JHt0YWlsfWA7CiAgICAgICAgfSwKICAgICAgICBpc0Fic29sdXRlKHBhdGgpIHsKICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTsKICAgICAgICAgICAgY29uc3QgbGVuID0gcGF0aC5sZW5ndGg7CiAgICAgICAgICAgIGlmIChsZW4gPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KDApOwogICAgICAgICAgICByZXR1cm4gaXNQYXRoU2VwYXJhdG9yKGNvZGUpIHx8CiAgICAgICAgICAgICAgICAvLyBQb3NzaWJsZSBkZXZpY2Ugcm9vdAogICAgICAgICAgICAgICAgKGxlbiA+IDIgJiYKICAgICAgICAgICAgICAgICAgICBpc1dpbmRvd3NEZXZpY2VSb290KGNvZGUpICYmCiAgICAgICAgICAgICAgICAgICAgcGF0aC5jaGFyQ29kZUF0KDEpID09PSBDSEFSX0NPTE9OICYmCiAgICAgICAgICAgICAgICAgICAgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgyKSkpOwogICAgICAgIH0sCiAgICAgICAgam9pbiguLi5wYXRocykgewogICAgICAgICAgICBpZiAocGF0aHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJy4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBqb2luZWQ7CiAgICAgICAgICAgIGxldCBmaXJzdFBhcnQ7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGFyZyA9IHBhdGhzW2ldOwogICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcoYXJnLCAncGF0aCcpOwogICAgICAgICAgICAgICAgaWYgKGFyZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGpvaW5lZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5lZCA9IGZpcnN0UGFydCA9IGFyZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGpvaW5lZCArPSBgXFwke2FyZ31gOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoam9pbmVkID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnLic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGpvaW5lZCBwYXRoIGRvZXNuJ3Qgc3RhcnQgd2l0aCB0d28gc2xhc2hlcywgYmVjYXVzZQogICAgICAgICAgICAvLyBub3JtYWxpemUoKSB3aWxsIG1pc3Rha2UgaXQgZm9yIGEgVU5DIHBhdGggdGhlbi4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVGhpcyBzdGVwIGlzIHNraXBwZWQgd2hlbiBpdCBpcyB2ZXJ5IGNsZWFyIHRoYXQgdGhlIHVzZXIgYWN0dWFsbHkKICAgICAgICAgICAgLy8gaW50ZW5kZWQgdG8gcG9pbnQgYXQgYSBVTkMgcGF0aC4gVGhpcyBpcyBhc3N1bWVkIHdoZW4gdGhlIGZpcnN0CiAgICAgICAgICAgIC8vIG5vbi1lbXB0eSBzdHJpbmcgYXJndW1lbnRzIHN0YXJ0cyB3aXRoIGV4YWN0bHkgdHdvIHNsYXNoZXMgZm9sbG93ZWQgYnkKICAgICAgICAgICAgLy8gYXQgbGVhc3Qgb25lIG1vcmUgbm9uLXNsYXNoIGNoYXJhY3Rlci4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGZvciBub3JtYWxpemUoKSB0byB0cmVhdCBhIHBhdGggYXMgYSBVTkMgcGF0aCBpdCBuZWVkcyB0bwogICAgICAgICAgICAvLyBoYXZlIGF0IGxlYXN0IDIgY29tcG9uZW50cywgc28gd2UgZG9uJ3QgZmlsdGVyIGZvciB0aGF0IGhlcmUuCiAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgdXNlciBjYW4gdXNlIGpvaW4gdG8gY29uc3RydWN0IFVOQyBwYXRocyBmcm9tCiAgICAgICAgICAgIC8vIGEgc2VydmVyIG5hbWUgYW5kIGEgc2hhcmUgbmFtZTsgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgIC8vICAgcGF0aC5qb2luKCcvL3NlcnZlcicsICdzaGFyZScpIC0+ICdcXFxcc2VydmVyXFxzaGFyZVxcJykKICAgICAgICAgICAgbGV0IG5lZWRzUmVwbGFjZSA9IHRydWU7CiAgICAgICAgICAgIGxldCBzbGFzaENvdW50ID0gMDsKICAgICAgICAgICAgaWYgKHR5cGVvZiBmaXJzdFBhcnQgPT09ICdzdHJpbmcnICYmIGlzUGF0aFNlcGFyYXRvcihmaXJzdFBhcnQuY2hhckNvZGVBdCgwKSkpIHsKICAgICAgICAgICAgICAgICsrc2xhc2hDb3VudDsKICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0TGVuID0gZmlyc3RQYXJ0Lmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmIChmaXJzdExlbiA+IDEgJiYgaXNQYXRoU2VwYXJhdG9yKGZpcnN0UGFydC5jaGFyQ29kZUF0KDEpKSkgewogICAgICAgICAgICAgICAgICAgICsrc2xhc2hDb3VudDsKICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RMZW4gPiAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoZmlyc3RQYXJ0LmNoYXJDb2RlQXQoMikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3NsYXNoQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXRjaGVkIGEgVU5DIHBhdGggaW4gdGhlIGZpcnN0IHBhcnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzUmVwbGFjZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZWVkc1JlcGxhY2UpIHsKICAgICAgICAgICAgICAgIC8vIEZpbmQgYW55IG1vcmUgY29uc2VjdXRpdmUgc2xhc2hlcyB3ZSBuZWVkIHRvIHJlcGxhY2UKICAgICAgICAgICAgICAgIHdoaWxlIChzbGFzaENvdW50IDwgam9pbmVkLmxlbmd0aCAmJgogICAgICAgICAgICAgICAgICAgIGlzUGF0aFNlcGFyYXRvcihqb2luZWQuY2hhckNvZGVBdChzbGFzaENvdW50KSkpIHsKICAgICAgICAgICAgICAgICAgICBzbGFzaENvdW50Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIHRoZSBzbGFzaGVzIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgaWYgKHNsYXNoQ291bnQgPj0gMikgewogICAgICAgICAgICAgICAgICAgIGpvaW5lZCA9IGBcXCR7am9pbmVkLnNsaWNlKHNsYXNoQ291bnQpfWA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHdpbjMyLm5vcm1hbGl6ZShqb2luZWQpOwogICAgICAgIH0sCiAgICAgICAgLy8gSXQgd2lsbCBzb2x2ZSB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIGBmcm9tYCB0byBgdG9gLCBmb3IgaW5zdGFuY2U6CiAgICAgICAgLy8gIGZyb20gPSAnQzpcXG9yYW5kZWFcXHRlc3RcXGFhYScKICAgICAgICAvLyAgdG8gPSAnQzpcXG9yYW5kZWFcXGltcGxcXGJiYicKICAgICAgICAvLyBUaGUgb3V0cHV0IG9mIHRoZSBmdW5jdGlvbiBzaG91bGQgYmU6ICcuLlxcLi5cXGltcGxcXGJiYicKICAgICAgICByZWxhdGl2ZShmcm9tLCB0bykgewogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhmcm9tLCAnZnJvbScpOwogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyh0bywgJ3RvJyk7CiAgICAgICAgICAgIGlmIChmcm9tID09PSB0bykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGZyb21PcmlnID0gd2luMzIucmVzb2x2ZShmcm9tKTsKICAgICAgICAgICAgY29uc3QgdG9PcmlnID0gd2luMzIucmVzb2x2ZSh0byk7CiAgICAgICAgICAgIGlmIChmcm9tT3JpZyA9PT0gdG9PcmlnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnJvbSA9IGZyb21PcmlnLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIHRvID0gdG9PcmlnLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGlmIChmcm9tID09PSB0bykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRyaW0gYW55IGxlYWRpbmcgYmFja3NsYXNoZXMKICAgICAgICAgICAgbGV0IGZyb21TdGFydCA9IDA7CiAgICAgICAgICAgIHdoaWxlIChmcm9tU3RhcnQgPCBmcm9tLmxlbmd0aCAmJgogICAgICAgICAgICAgICAgZnJvbS5jaGFyQ29kZUF0KGZyb21TdGFydCkgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgIGZyb21TdGFydCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRyaW0gdHJhaWxpbmcgYmFja3NsYXNoZXMgKGFwcGxpY2FibGUgdG8gVU5DIHBhdGhzIG9ubHkpCiAgICAgICAgICAgIGxldCBmcm9tRW5kID0gZnJvbS5sZW5ndGg7CiAgICAgICAgICAgIHdoaWxlIChmcm9tRW5kIC0gMSA+IGZyb21TdGFydCAmJgogICAgICAgICAgICAgICAgZnJvbS5jaGFyQ29kZUF0KGZyb21FbmQgLSAxKSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkgewogICAgICAgICAgICAgICAgZnJvbUVuZC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGZyb21MZW4gPSBmcm9tRW5kIC0gZnJvbVN0YXJ0OwogICAgICAgICAgICAvLyBUcmltIGFueSBsZWFkaW5nIGJhY2tzbGFzaGVzCiAgICAgICAgICAgIGxldCB0b1N0YXJ0ID0gMDsKICAgICAgICAgICAgd2hpbGUgKHRvU3RhcnQgPCB0by5sZW5ndGggJiYKICAgICAgICAgICAgICAgIHRvLmNoYXJDb2RlQXQodG9TdGFydCkgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgIHRvU3RhcnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUcmltIHRyYWlsaW5nIGJhY2tzbGFzaGVzIChhcHBsaWNhYmxlIHRvIFVOQyBwYXRocyBvbmx5KQogICAgICAgICAgICBsZXQgdG9FbmQgPSB0by5sZW5ndGg7CiAgICAgICAgICAgIHdoaWxlICh0b0VuZCAtIDEgPiB0b1N0YXJ0ICYmCiAgICAgICAgICAgICAgICB0by5jaGFyQ29kZUF0KHRvRW5kIC0gMSkgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgIHRvRW5kLS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdG9MZW4gPSB0b0VuZCAtIHRvU3RhcnQ7CiAgICAgICAgICAgIC8vIENvbXBhcmUgcGF0aHMgdG8gZmluZCB0aGUgbG9uZ2VzdCBjb21tb24gcGF0aCBmcm9tIHJvb3QKICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gZnJvbUxlbiA8IHRvTGVuID8gZnJvbUxlbiA6IHRvTGVuOwogICAgICAgICAgICBsZXQgbGFzdENvbW1vblNlcCA9IC0xOwogICAgICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IGZyb21Db2RlID0gZnJvbS5jaGFyQ29kZUF0KGZyb21TdGFydCArIGkpOwogICAgICAgICAgICAgICAgaWYgKGZyb21Db2RlICE9PSB0by5jaGFyQ29kZUF0KHRvU3RhcnQgKyBpKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZnJvbUNvZGUgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgICAgICBsYXN0Q29tbW9uU2VwID0gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXZSBmb3VuZCBhIG1pc21hdGNoIGJlZm9yZSB0aGUgZmlyc3QgY29tbW9uIHBhdGggc2VwYXJhdG9yIHdhcyBzZWVuLCBzbwogICAgICAgICAgICAvLyByZXR1cm4gdGhlIG9yaWdpbmFsIGB0b2AuCiAgICAgICAgICAgIGlmIChpICE9PSBsZW5ndGgpIHsKICAgICAgICAgICAgICAgIGlmIChsYXN0Q29tbW9uU2VwID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0b09yaWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAodG9MZW4gPiBsZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodG8uY2hhckNvZGVBdCh0b1N0YXJ0ICsgaSkgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZ2V0IGhlcmUgaWYgYGZyb21gIGlzIHRoZSBleGFjdCBiYXNlIHBhdGggZm9yIGB0b2AuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBmcm9tPSdDOlxcZm9vXFxiYXInOyB0bz0nQzpcXGZvb1xcYmFyXFxiYXonCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b09yaWcuc2xpY2UodG9TdGFydCArIGkgKyAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZ2V0IGhlcmUgaWYgYGZyb21gIGlzIHRoZSBkZXZpY2Ugcm9vdC4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGZyb209J0M6XFwnOyB0bz0nQzpcXGZvbycKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvT3JpZy5zbGljZSh0b1N0YXJ0ICsgaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGZyb21MZW4gPiBsZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbS5jaGFyQ29kZUF0KGZyb21TdGFydCArIGkpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGB0b2AgaXMgdGhlIGV4YWN0IGJhc2UgcGF0aCBmb3IgYGZyb21gLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nQzpcXGZvb1xcYmFyJzsgdG89J0M6XFxmb28nCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDb21tb25TZXAgPSBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpID09PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGB0b2AgaXMgdGhlIGRldmljZSByb290LgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nQzpcXGZvb1xcYmFyJzsgdG89J0M6XFwnCiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDb21tb25TZXAgPSAzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsYXN0Q29tbW9uU2VwID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGxhc3RDb21tb25TZXAgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBvdXQgPSAnJzsKICAgICAgICAgICAgLy8gR2VuZXJhdGUgdGhlIHJlbGF0aXZlIHBhdGggYmFzZWQgb24gdGhlIHBhdGggZGlmZmVyZW5jZSBiZXR3ZWVuIGB0b2AgYW5kCiAgICAgICAgICAgIC8vIGBmcm9tYAogICAgICAgICAgICBmb3IgKGkgPSBmcm9tU3RhcnQgKyBsYXN0Q29tbW9uU2VwICsgMTsgaSA8PSBmcm9tRW5kOyArK2kpIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSBmcm9tRW5kIHx8IGZyb20uY2hhckNvZGVBdChpKSA9PT0gQ0hBUl9CQUNLV0FSRF9TTEFTSCkgewogICAgICAgICAgICAgICAgICAgIG91dCArPSBvdXQubGVuZ3RoID09PSAwID8gJy4uJyA6ICdcXC4uJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0b1N0YXJ0ICs9IGxhc3RDb21tb25TZXA7CiAgICAgICAgICAgIC8vIExhc3RseSwgYXBwZW5kIHRoZSByZXN0IG9mIHRoZSBkZXN0aW5hdGlvbiAoYHRvYCkgcGF0aCB0aGF0IGNvbWVzIGFmdGVyCiAgICAgICAgICAgIC8vIHRoZSBjb21tb24gcGF0aCBwYXJ0cwogICAgICAgICAgICBpZiAob3V0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBgJHtvdXR9JHt0b09yaWcuc2xpY2UodG9TdGFydCwgdG9FbmQpfWA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRvT3JpZy5jaGFyQ29kZUF0KHRvU3RhcnQpID09PSBDSEFSX0JBQ0tXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICArK3RvU3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRvT3JpZy5zbGljZSh0b1N0YXJ0LCB0b0VuZCk7CiAgICAgICAgfSwKICAgICAgICB0b05hbWVzcGFjZWRQYXRoKHBhdGgpIHsKICAgICAgICAgICAgLy8gTm90ZTogdGhpcyB3aWxsICpwcm9iYWJseSogdGhyb3cgc29tZXdoZXJlLgogICAgICAgICAgICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCByZXNvbHZlZFBhdGggPSB3aW4zMi5yZXNvbHZlKHBhdGgpOwogICAgICAgICAgICBpZiAocmVzb2x2ZWRQYXRoLmxlbmd0aCA8PSAyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVzb2x2ZWRQYXRoLmNoYXJDb2RlQXQoMCkgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgIC8vIFBvc3NpYmxlIFVOQyByb290CiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRQYXRoLmNoYXJDb2RlQXQoMSkgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0gcmVzb2x2ZWRQYXRoLmNoYXJDb2RlQXQoMik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgIT09IENIQVJfUVVFU1RJT05fTUFSSyAmJiBjb2RlICE9PSBDSEFSX0RPVCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIG5vbi1sb25nIFVOQyByb290LCBjb252ZXJ0IHRoZSBwYXRoIHRvIGEgbG9uZyBVTkMgcGF0aAogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFxcXFw/XFxVTkNcXCR7cmVzb2x2ZWRQYXRoLnNsaWNlKDIpfWA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzV2luZG93c0RldmljZVJvb3QocmVzb2x2ZWRQYXRoLmNoYXJDb2RlQXQoMCkpICYmCiAgICAgICAgICAgICAgICByZXNvbHZlZFBhdGguY2hhckNvZGVBdCgxKSA9PT0gQ0hBUl9DT0xPTiAmJgogICAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoLmNoYXJDb2RlQXQoMikgPT09IENIQVJfQkFDS1dBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgIC8vIE1hdGNoZWQgZGV2aWNlIHJvb3QsIGNvbnZlcnQgdGhlIHBhdGggdG8gYSBsb25nIFVOQyBwYXRoCiAgICAgICAgICAgICAgICByZXR1cm4gYFxcXFw/XFwke3Jlc29sdmVkUGF0aH1gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXRoOwogICAgICAgIH0sCiAgICAgICAgZGlybmFtZShwYXRoKSB7CiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgsICdwYXRoJyk7CiAgICAgICAgICAgIGNvbnN0IGxlbiA9IHBhdGgubGVuZ3RoOwogICAgICAgICAgICBpZiAobGVuID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJy4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCByb290RW5kID0gLTE7CiAgICAgICAgICAgIGxldCBvZmZzZXQgPSAwOwogICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KDApOwogICAgICAgICAgICBpZiAobGVuID09PSAxKSB7CiAgICAgICAgICAgICAgICAvLyBgcGF0aGAgY29udGFpbnMganVzdCBhIHBhdGggc2VwYXJhdG9yLCBleGl0IGVhcmx5IHRvIGF2b2lkCiAgICAgICAgICAgICAgICAvLyB1bm5lY2Vzc2FyeSB3b3JrIG9yIGEgZG90LgogICAgICAgICAgICAgICAgcmV0dXJuIGlzUGF0aFNlcGFyYXRvcihjb2RlKSA/IHBhdGggOiAnLic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGEgcm9vdAogICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7CiAgICAgICAgICAgICAgICAvLyBQb3NzaWJsZSBVTkMgcm9vdAogICAgICAgICAgICAgICAgcm9vdEVuZCA9IG9mZnNldCA9IDE7CiAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgxKSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIGRvdWJsZSBwYXRoIHNlcGFyYXRvciBhdCBiZWdpbm5pbmcKICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDI7CiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBqOwogICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBub24tcGF0aCBzZXBhcmF0b3JzCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgIWlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoaikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGogPCBsZW4gJiYgaiAhPT0gbGFzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIQogICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gajsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2ggMSBvciBtb3JlIHBhdGggc2VwYXJhdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbiAmJiBpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgbGVuICYmIGogIT09IGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoZWQhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBub24tcGF0aCBzZXBhcmF0b3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbiAmJiAhaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF0Y2hlZCBhIFVOQyByb290IG9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqICE9PSBsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF0Y2hlZCBhIFVOQyByb290IHdpdGggbGVmdG92ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT2Zmc2V0IGJ5IDEgdG8gaW5jbHVkZSB0aGUgc2VwYXJhdG9yIGFmdGVyIHRoZSBVTkMgcm9vdCB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyZWF0IGl0IGFzIGEgIm5vcm1hbCByb290IiBvbiB0b3Agb2YgYSAoVU5DKSByb290CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEVuZCA9IG9mZnNldCA9IGogKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUG9zc2libGUgZGV2aWNlIHJvb3QKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpc1dpbmRvd3NEZXZpY2VSb290KGNvZGUpICYmIHBhdGguY2hhckNvZGVBdCgxKSA9PT0gQ0hBUl9DT0xPTikgewogICAgICAgICAgICAgICAgcm9vdEVuZCA9IGxlbiA+IDIgJiYgaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgyKSkgPyAzIDogMjsKICAgICAgICAgICAgICAgIG9mZnNldCA9IHJvb3RFbmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGVuZCA9IC0xOwogICAgICAgICAgICBsZXQgbWF0Y2hlZFNsYXNoID0gdHJ1ZTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IGxlbiAtIDE7IGkgPj0gb2Zmc2V0OyAtLWkpIHsKICAgICAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGkpKSkgewogICAgICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIGlmIChyb290RW5kID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAnLic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbmQgPSByb290RW5kOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGVuZCk7CiAgICAgICAgfSwKICAgICAgICBiYXNlbmFtZShwYXRoLCBleHQpIHsKICAgICAgICAgICAgaWYgKGV4dCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhleHQsICdleHQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpOwogICAgICAgICAgICBsZXQgc3RhcnQgPSAwOwogICAgICAgICAgICBsZXQgZW5kID0gLTE7CiAgICAgICAgICAgIGxldCBtYXRjaGVkU2xhc2ggPSB0cnVlOwogICAgICAgICAgICBsZXQgaTsKICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgZHJpdmUgbGV0dGVyIHByZWZpeCBzbyBhcyBub3QgdG8gbWlzdGFrZSB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIC8vIHBhdGggc2VwYXJhdG9yIGFzIGFuIGV4dHJhIHNlcGFyYXRvciBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoIHRoYXQgY2FuIGJlCiAgICAgICAgICAgIC8vIGRpc3JlZ2FyZGVkCiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA+PSAyICYmCiAgICAgICAgICAgICAgICBpc1dpbmRvd3NEZXZpY2VSb290KHBhdGguY2hhckNvZGVBdCgwKSkgJiYKICAgICAgICAgICAgICAgIHBhdGguY2hhckNvZGVBdCgxKSA9PT0gQ0hBUl9DT0xPTikgewogICAgICAgICAgICAgICAgc3RhcnQgPSAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChleHQgIT09IHVuZGVmaW5lZCAmJiBleHQubGVuZ3RoID4gMCAmJiBleHQubGVuZ3RoIDw9IHBhdGgubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBpZiAoZXh0ID09PSBwYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IGV4dElkeCA9IGV4dC5sZW5ndGggLSAxOwogICAgICAgICAgICAgICAgbGV0IGZpcnN0Tm9uU2xhc2hFbmQgPSAtMTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSBzdGFydDsgLS1pKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vdwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3ROb25TbGFzaEVuZCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCByZW1lbWJlciB0aGlzIGluZGV4IGluIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgaXQgaWYgdGhlIGV4dGVuc2lvbiBlbmRzIHVwIG5vdCBtYXRjaGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE5vblNsYXNoRW5kID0gaSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dElkeCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbWF0Y2ggdGhlIGV4cGxpY2l0IGV4dGVuc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IGV4dC5jaGFyQ29kZUF0KGV4dElkeCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoLS1leHRJZHggPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG1hdGNoZWQgdGhlIGV4dGVuc2lvbiwgc28gbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXh0ZW5zaW9uIGRvZXMgbm90IG1hdGNoLCBzbyBvdXIgcmVzdWx0IGlzIHRoZSBlbnRpcmUgcGF0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dElkeCA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGZpcnN0Tm9uU2xhc2hFbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCkgewogICAgICAgICAgICAgICAgICAgIGVuZCA9IGZpcnN0Tm9uU2xhc2hFbmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gcGF0aC5sZW5ndGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aC5zbGljZShzdGFydCwgZW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gc3RhcnQ7IC0taSkgewogICAgICAgICAgICAgICAgaWYgKGlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoaSkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGgKICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3cKICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91cgogICAgICAgICAgICAgICAgICAgIC8vIHBhdGggY29tcG9uZW50CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gaSArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGF0aC5zbGljZShzdGFydCwgZW5kKTsKICAgICAgICB9LAogICAgICAgIGV4dG5hbWUocGF0aCkgewogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpOwogICAgICAgICAgICBsZXQgc3RhcnQgPSAwOwogICAgICAgICAgICBsZXQgc3RhcnREb3QgPSAtMTsKICAgICAgICAgICAgbGV0IHN0YXJ0UGFydCA9IDA7CiAgICAgICAgICAgIGxldCBlbmQgPSAtMTsKICAgICAgICAgICAgbGV0IG1hdGNoZWRTbGFzaCA9IHRydWU7CiAgICAgICAgICAgIC8vIFRyYWNrIHRoZSBzdGF0ZSBvZiBjaGFyYWN0ZXJzIChpZiBhbnkpIHdlIHNlZSBiZWZvcmUgb3VyIGZpcnN0IGRvdCBhbmQKICAgICAgICAgICAgLy8gYWZ0ZXIgYW55IHBhdGggc2VwYXJhdG9yIHdlIGZpbmQKICAgICAgICAgICAgbGV0IHByZURvdFN0YXRlID0gMDsKICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGEgZHJpdmUgbGV0dGVyIHByZWZpeCBzbyBhcyBub3QgdG8gbWlzdGFrZSB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIC8vIHBhdGggc2VwYXJhdG9yIGFzIGFuIGV4dHJhIHNlcGFyYXRvciBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoIHRoYXQgY2FuIGJlCiAgICAgICAgICAgIC8vIGRpc3JlZ2FyZGVkCiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA+PSAyICYmCiAgICAgICAgICAgICAgICBwYXRoLmNoYXJDb2RlQXQoMSkgPT09IENIQVJfQ09MT04gJiYKICAgICAgICAgICAgICAgIGlzV2luZG93c0RldmljZVJvb3QocGF0aC5jaGFyQ29kZUF0KDApKSkgewogICAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydFBhcnQgPSAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gc3RhcnQ7IC0taSkgewogICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTsKICAgICAgICAgICAgICAgIGlmIChpc1BhdGhTZXBhcmF0b3IoY29kZSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aAogICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vdwogICAgICAgICAgICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UGFydCA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZW5kID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXIKICAgICAgICAgICAgICAgICAgICAvLyBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICBtYXRjaGVkU2xhc2ggPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBlbmQgPSBpICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSBDSEFSX0RPVCkgewogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgb3VyIGZpcnN0IGRvdCwgbWFyayBpdCBhcyB0aGUgc3RhcnQgb2Ygb3VyIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgICAgIGlmIChzdGFydERvdCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREb3QgPSBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcmVEb3RTdGF0ZSAhPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBwcmVEb3RTdGF0ZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnREb3QgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBhbmQgbm9uLXBhdGggc2VwYXJhdG9yIGJlZm9yZSBvdXIgZG90LCBzbyB3ZSBzaG91bGQKICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIGEgZ29vZCBjaGFuY2UgYXQgaGF2aW5nIGEgbm9uLWVtcHR5IGV4dGVuc2lvbgogICAgICAgICAgICAgICAgICAgIHByZURvdFN0YXRlID0gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSB8fAogICAgICAgICAgICAgICAgZW5kID09PSAtMSB8fAogICAgICAgICAgICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBkb3QKICAgICAgICAgICAgICAgIHByZURvdFN0YXRlID09PSAwIHx8CiAgICAgICAgICAgICAgICAvLyBUaGUgKHJpZ2h0LW1vc3QpIHRyaW1tZWQgcGF0aCBjb21wb25lbnQgaXMgZXhhY3RseSAnLi4nCiAgICAgICAgICAgICAgICAocHJlRG90U3RhdGUgPT09IDEgJiYKICAgICAgICAgICAgICAgICAgICBzdGFydERvdCA9PT0gZW5kIC0gMSAmJgogICAgICAgICAgICAgICAgICAgIHN0YXJ0RG90ID09PSBzdGFydFBhcnQgKyAxKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXRoLnNsaWNlKHN0YXJ0RG90LCBlbmQpOwogICAgICAgIH0sCiAgICAgICAgZm9ybWF0OiBfZm9ybWF0LmJpbmQobnVsbCwgJ1xcJyksCiAgICAgICAgcGFyc2UocGF0aCkgewogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpOwogICAgICAgICAgICBjb25zdCByZXQgPSB7IHJvb3Q6ICcnLCBkaXI6ICcnLCBiYXNlOiAnJywgZXh0OiAnJywgbmFtZTogJycgfTsKICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGxlbiA9IHBhdGgubGVuZ3RoOwogICAgICAgICAgICBsZXQgcm9vdEVuZCA9IDA7CiAgICAgICAgICAgIGxldCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KDApOwogICAgICAgICAgICBpZiAobGVuID09PSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gYHBhdGhgIGNvbnRhaW5zIGp1c3QgYSBwYXRoIHNlcGFyYXRvciwgZXhpdCBlYXJseSB0byBhdm9pZAogICAgICAgICAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHdvcmsKICAgICAgICAgICAgICAgICAgICByZXQucm9vdCA9IHJldC5kaXIgPSBwYXRoOwogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXQuYmFzZSA9IHJldC5uYW1lID0gcGF0aDsKICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGEgcm9vdAogICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7CiAgICAgICAgICAgICAgICAvLyBQb3NzaWJsZSBVTkMgcm9vdAogICAgICAgICAgICAgICAgcm9vdEVuZCA9IDE7CiAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgxKSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIGRvdWJsZSBwYXRoIHNlcGFyYXRvciBhdCBiZWdpbm5pbmcKICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDI7CiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3QgPSBqOwogICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBub24tcGF0aCBzZXBhcmF0b3JzCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGogPCBsZW4gJiYgIWlzUGF0aFNlcGFyYXRvcihwYXRoLmNoYXJDb2RlQXQoaikpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGogPCBsZW4gJiYgaiAhPT0gbGFzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXRjaGVkIQogICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gajsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0Y2ggMSBvciBtb3JlIHBhdGggc2VwYXJhdG9ycwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbiAmJiBpc1BhdGhTZXBhcmF0b3IocGF0aC5jaGFyQ29kZUF0KGopKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqIDwgbGVuICYmIGogIT09IGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoZWQhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIDEgb3IgbW9yZSBub24tcGF0aCBzZXBhcmF0b3JzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbiAmJiAhaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdChqKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PT0gbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbWF0Y2hlZCBhIFVOQyByb290IG9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290RW5kID0gajsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGogIT09IGxhc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXRjaGVkIGEgVU5DIHJvb3Qgd2l0aCBsZWZ0b3ZlcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290RW5kID0gaiArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNXaW5kb3dzRGV2aWNlUm9vdChjb2RlKSAmJiBwYXRoLmNoYXJDb2RlQXQoMSkgPT09IENIQVJfQ09MT04pIHsKICAgICAgICAgICAgICAgIC8vIFBvc3NpYmxlIGRldmljZSByb290CiAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBgcGF0aGAgY29udGFpbnMganVzdCBhIGRyaXZlIHJvb3QsIGV4aXQgZWFybHkgdG8gYXZvaWQKICAgICAgICAgICAgICAgICAgICAvLyB1bm5lY2Vzc2FyeSB3b3JrCiAgICAgICAgICAgICAgICAgICAgcmV0LnJvb3QgPSByZXQuZGlyID0gcGF0aDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcm9vdEVuZCA9IDI7CiAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKHBhdGguY2hhckNvZGVBdCgyKSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobGVuID09PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBwYXRoYCBjb250YWlucyBqdXN0IGEgZHJpdmUgcm9vdCwgZXhpdCBlYXJseSB0byBhdm9pZAogICAgICAgICAgICAgICAgICAgICAgICAvLyB1bm5lY2Vzc2FyeSB3b3JrCiAgICAgICAgICAgICAgICAgICAgICAgIHJldC5yb290ID0gcmV0LmRpciA9IHBhdGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJvb3RFbmQgPSAzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyb290RW5kID4gMCkgewogICAgICAgICAgICAgICAgcmV0LnJvb3QgPSBwYXRoLnNsaWNlKDAsIHJvb3RFbmQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBzdGFydERvdCA9IC0xOwogICAgICAgICAgICBsZXQgc3RhcnRQYXJ0ID0gcm9vdEVuZDsKICAgICAgICAgICAgbGV0IGVuZCA9IC0xOwogICAgICAgICAgICBsZXQgbWF0Y2hlZFNsYXNoID0gdHJ1ZTsKICAgICAgICAgICAgbGV0IGkgPSBwYXRoLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIC8vIFRyYWNrIHRoZSBzdGF0ZSBvZiBjaGFyYWN0ZXJzIChpZiBhbnkpIHdlIHNlZSBiZWZvcmUgb3VyIGZpcnN0IGRvdCBhbmQKICAgICAgICAgICAgLy8gYWZ0ZXIgYW55IHBhdGggc2VwYXJhdG9yIHdlIGZpbmQKICAgICAgICAgICAgbGV0IHByZURvdFN0YXRlID0gMDsKICAgICAgICAgICAgLy8gR2V0IG5vbi1kaXIgaW5mbwogICAgICAgICAgICBmb3IgKDsgaSA+PSByb290RW5kOyAtLWkpIHsKICAgICAgICAgICAgICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICBpZiAoaXNQYXRoU2VwYXJhdG9yKGNvZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGgKICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3cKICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBhcnQgPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyCiAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gaSArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9ET1QpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG91ciBmaXJzdCBkb3QsIG1hcmsgaXQgYXMgdGhlIHN0YXJ0IG9mIG91ciBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RG90ID0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJlRG90U3RhdGUgIT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJlRG90U3RhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0RG90ICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgYW5kIG5vbi1wYXRoIHNlcGFyYXRvciBiZWZvcmUgb3VyIGRvdCwgc28gd2Ugc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSBhIGdvb2QgY2hhbmNlIGF0IGhhdmluZyBhIG5vbi1lbXB0eSBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICBwcmVEb3RTdGF0ZSA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbmQgIT09IC0xKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xIHx8CiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBkb3QKICAgICAgICAgICAgICAgICAgICBwcmVEb3RTdGF0ZSA9PT0gMCB8fAogICAgICAgICAgICAgICAgICAgIC8vIFRoZSAocmlnaHQtbW9zdCkgdHJpbW1lZCBwYXRoIGNvbXBvbmVudCBpcyBleGFjdGx5ICcuLicKICAgICAgICAgICAgICAgICAgICAocHJlRG90U3RhdGUgPT09IDEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREb3QgPT09IGVuZCAtIDEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREb3QgPT09IHN0YXJ0UGFydCArIDEpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0LmJhc2UgPSByZXQubmFtZSA9IHBhdGguc2xpY2Uoc3RhcnRQYXJ0LCBlbmQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0Lm5hbWUgPSBwYXRoLnNsaWNlKHN0YXJ0UGFydCwgc3RhcnREb3QpOwogICAgICAgICAgICAgICAgICAgIHJldC5iYXNlID0gcGF0aC5zbGljZShzdGFydFBhcnQsIGVuZCk7CiAgICAgICAgICAgICAgICAgICAgcmV0LmV4dCA9IHBhdGguc2xpY2Uoc3RhcnREb3QsIGVuZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgdGhlIGRpcmVjdG9yeSBpcyB0aGUgcm9vdCwgdXNlIHRoZSBlbnRpcmUgcm9vdCBhcyB0aGUgYGRpcmAgaW5jbHVkaW5nCiAgICAgICAgICAgIC8vIHRoZSB0cmFpbGluZyBzbGFzaCBpZiBhbnkgKGBDOlxhYmNgIC0+IGBDOlxgKS4gT3RoZXJ3aXNlLCBzdHJpcCBvdXQgdGhlCiAgICAgICAgICAgIC8vIHRyYWlsaW5nIHNsYXNoIChgQzpcYWJjXGRlZmAgLT4gYEM6XGFiY2ApLgogICAgICAgICAgICBpZiAoc3RhcnRQYXJ0ID4gMCAmJiBzdGFydFBhcnQgIT09IHJvb3RFbmQpIHsKICAgICAgICAgICAgICAgIHJldC5kaXIgPSBwYXRoLnNsaWNlKDAsIHN0YXJ0UGFydCAtIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0LmRpciA9IHJldC5yb290OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfSwKICAgICAgICBzZXA6ICdcXCcsCiAgICAgICAgZGVsaW1pdGVyOiAnOycsCiAgICAgICAgd2luMzI6IG51bGwsCiAgICAgICAgcG9zaXg6IG51bGwKICAgIH07CiAgICBjb25zdCBwb3NpeCA9IHsKICAgICAgICAvLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pCiAgICAgICAgcmVzb2x2ZSguLi5wYXRoU2VnbWVudHMpIHsKICAgICAgICAgICAgbGV0IHJlc29sdmVkUGF0aCA9ICcnOwogICAgICAgICAgICBsZXQgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlOwogICAgICAgICAgICBmb3IgKGxldCBpID0gcGF0aFNlZ21lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkgewogICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IGkgPj0gMCA/IHBhdGhTZWdtZW50c1tpXSA6IGN3ZCgpOwogICAgICAgICAgICAgICAgdmFsaWRhdGVTdHJpbmcocGF0aCwgJ3BhdGgnKTsKICAgICAgICAgICAgICAgIC8vIFNraXAgZW1wdHkgZW50cmllcwogICAgICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXNvbHZlZFBhdGggPSBgJHtwYXRofS8ke3Jlc29sdmVkUGF0aH1gOwogICAgICAgICAgICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIHBhdGggc2hvdWxkIGJlIHJlc29sdmVkIHRvIGEgZnVsbCBhYnNvbHV0ZSBwYXRoLCBidXQKICAgICAgICAgICAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpCiAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aAogICAgICAgICAgICByZXNvbHZlZFBhdGggPSBub3JtYWxpemVTdHJpbmcocmVzb2x2ZWRQYXRoLCAhcmVzb2x2ZWRBYnNvbHV0ZSwgJy8nLCBpc1Bvc2l4UGF0aFNlcGFyYXRvcik7CiAgICAgICAgICAgIGlmIChyZXNvbHZlZEFic29sdXRlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYC8ke3Jlc29sdmVkUGF0aH1gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFBhdGgubGVuZ3RoID4gMCA/IHJlc29sdmVkUGF0aCA6ICcuJzsKICAgICAgICB9LAogICAgICAgIG5vcm1hbGl6ZShwYXRoKSB7CiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgsICdwYXRoJyk7CiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBpc0Fic29sdXRlID0gcGF0aC5jaGFyQ29kZUF0KDApID09PSBDSEFSX0ZPUldBUkRfU0xBU0g7CiAgICAgICAgICAgIGNvbnN0IHRyYWlsaW5nU2VwYXJhdG9yID0gcGF0aC5jaGFyQ29kZUF0KHBhdGgubGVuZ3RoIC0gMSkgPT09IENIQVJfRk9SV0FSRF9TTEFTSDsKICAgICAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoCiAgICAgICAgICAgIHBhdGggPSBub3JtYWxpemVTdHJpbmcocGF0aCwgIWlzQWJzb2x1dGUsICcvJywgaXNQb3NpeFBhdGhTZXBhcmF0b3IpOwogICAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIGlmIChpc0Fic29sdXRlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcvJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0cmFpbGluZ1NlcGFyYXRvciA/ICcuLycgOiAnLic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRyYWlsaW5nU2VwYXJhdG9yKSB7CiAgICAgICAgICAgICAgICBwYXRoICs9ICcvJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaXNBYnNvbHV0ZSA/IGAvJHtwYXRofWAgOiBwYXRoOwogICAgICAgIH0sCiAgICAgICAgaXNBYnNvbHV0ZShwYXRoKSB7CiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgsICdwYXRoJyk7CiAgICAgICAgICAgIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgJiYgcGF0aC5jaGFyQ29kZUF0KDApID09PSBDSEFSX0ZPUldBUkRfU0xBU0g7CiAgICAgICAgfSwKICAgICAgICBqb2luKC4uLnBhdGhzKSB7CiAgICAgICAgICAgIGlmIChwYXRocy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAnLic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGpvaW5lZDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXRocy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgY29uc3QgYXJnID0gcGF0aHNbaV07CiAgICAgICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhhcmcsICdwYXRoJyk7CiAgICAgICAgICAgICAgICBpZiAoYXJnLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoam9pbmVkID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgam9pbmVkID0gYXJnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgam9pbmVkICs9IGAvJHthcmd9YDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGpvaW5lZCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJy4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwb3NpeC5ub3JtYWxpemUoam9pbmVkKTsKICAgICAgICB9LAogICAgICAgIHJlbGF0aXZlKGZyb20sIHRvKSB7CiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKGZyb20sICdmcm9tJyk7CiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHRvLCAndG8nKTsKICAgICAgICAgICAgaWYgKGZyb20gPT09IHRvKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVHJpbSBsZWFkaW5nIGZvcndhcmQgc2xhc2hlcy4KICAgICAgICAgICAgZnJvbSA9IHBvc2l4LnJlc29sdmUoZnJvbSk7CiAgICAgICAgICAgIHRvID0gcG9zaXgucmVzb2x2ZSh0byk7CiAgICAgICAgICAgIGlmIChmcm9tID09PSB0bykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGZyb21TdGFydCA9IDE7CiAgICAgICAgICAgIGNvbnN0IGZyb21FbmQgPSBmcm9tLmxlbmd0aDsKICAgICAgICAgICAgY29uc3QgZnJvbUxlbiA9IGZyb21FbmQgLSBmcm9tU3RhcnQ7CiAgICAgICAgICAgIGNvbnN0IHRvU3RhcnQgPSAxOwogICAgICAgICAgICBjb25zdCB0b0xlbiA9IHRvLmxlbmd0aCAtIHRvU3RhcnQ7CiAgICAgICAgICAgIC8vIENvbXBhcmUgcGF0aHMgdG8gZmluZCB0aGUgbG9uZ2VzdCBjb21tb24gcGF0aCBmcm9tIHJvb3QKICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gKGZyb21MZW4gPCB0b0xlbiA/IGZyb21MZW4gOiB0b0xlbik7CiAgICAgICAgICAgIGxldCBsYXN0Q29tbW9uU2VwID0gLTE7CiAgICAgICAgICAgIGxldCBpID0gMDsKICAgICAgICAgICAgZm9yICg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgY29uc3QgZnJvbUNvZGUgPSBmcm9tLmNoYXJDb2RlQXQoZnJvbVN0YXJ0ICsgaSk7CiAgICAgICAgICAgICAgICBpZiAoZnJvbUNvZGUgIT09IHRvLmNoYXJDb2RlQXQodG9TdGFydCArIGkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChmcm9tQ29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdENvbW1vblNlcCA9IGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGkgPT09IGxlbmd0aCkgewogICAgICAgICAgICAgICAgaWYgKHRvTGVuID4gbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRvLmNoYXJDb2RlQXQodG9TdGFydCArIGkpID09PSBDSEFSX0ZPUldBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZ2V0IGhlcmUgaWYgYGZyb21gIGlzIHRoZSBleGFjdCBiYXNlIHBhdGggZm9yIGB0b2AuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBmcm9tPScvZm9vL2Jhcic7IHRvPScvZm9vL2Jhci9iYXonCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0by5zbGljZSh0b1N0YXJ0ICsgaSArIDEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBnZXQgaGVyZSBpZiBgZnJvbWAgaXMgdGhlIHJvb3QKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGZyb209Jy8nOyB0bz0nL2ZvbycKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRvLnNsaWNlKHRvU3RhcnQgKyBpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChmcm9tTGVuID4gbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGZyb20uY2hhckNvZGVBdChmcm9tU3RhcnQgKyBpKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGB0b2AgaXMgdGhlIGV4YWN0IGJhc2UgcGF0aCBmb3IgYGZyb21gLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nL2Zvby9iYXIvYmF6JzsgdG89Jy9mb28vYmFyJwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q29tbW9uU2VwID0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBnZXQgaGVyZSBpZiBgdG9gIGlzIHRoZSByb290LgogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nL2Zvby9iYXInOyB0bz0nLycKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENvbW1vblNlcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBvdXQgPSAnJzsKICAgICAgICAgICAgLy8gR2VuZXJhdGUgdGhlIHJlbGF0aXZlIHBhdGggYmFzZWQgb24gdGhlIHBhdGggZGlmZmVyZW5jZSBiZXR3ZWVuIGB0b2AKICAgICAgICAgICAgLy8gYW5kIGBmcm9tYC4KICAgICAgICAgICAgZm9yIChpID0gZnJvbVN0YXJ0ICsgbGFzdENvbW1vblNlcCArIDE7IGkgPD0gZnJvbUVuZDsgKytpKSB7CiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gZnJvbUVuZCB8fCBmcm9tLmNoYXJDb2RlQXQoaSkgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkgewogICAgICAgICAgICAgICAgICAgIG91dCArPSBvdXQubGVuZ3RoID09PSAwID8gJy4uJyA6ICcvLi4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIExhc3RseSwgYXBwZW5kIHRoZSByZXN0IG9mIHRoZSBkZXN0aW5hdGlvbiAoYHRvYCkgcGF0aCB0aGF0IGNvbWVzIGFmdGVyCiAgICAgICAgICAgIC8vIHRoZSBjb21tb24gcGF0aCBwYXJ0cy4KICAgICAgICAgICAgcmV0dXJuIGAke291dH0ke3RvLnNsaWNlKHRvU3RhcnQgKyBsYXN0Q29tbW9uU2VwKX1gOwogICAgICAgIH0sCiAgICAgICAgdG9OYW1lc3BhY2VkUGF0aChwYXRoKSB7CiAgICAgICAgICAgIC8vIE5vbi1vcCBvbiBwb3NpeCBzeXN0ZW1zCiAgICAgICAgICAgIHJldHVybiBwYXRoOwogICAgICAgIH0sCiAgICAgICAgZGlybmFtZShwYXRoKSB7CiAgICAgICAgICAgIHZhbGlkYXRlU3RyaW5nKHBhdGgsICdwYXRoJyk7CiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBoYXNSb290ID0gcGF0aC5jaGFyQ29kZUF0KDApID09PSBDSEFSX0ZPUldBUkRfU0xBU0g7CiAgICAgICAgICAgIGxldCBlbmQgPSAtMTsKICAgICAgICAgICAgbGV0IG1hdGNoZWRTbGFzaCA9IHRydWU7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSBwYXRoLmxlbmd0aCAtIDE7IGkgPj0gMTsgLS1pKSB7CiAgICAgICAgICAgICAgICBpZiAocGF0aC5jaGFyQ29kZUF0KGkpID09PSBDSEFSX0ZPUldBUkRfU0xBU0gpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkgewogICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvcgogICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaGFzUm9vdCA/ICcvJyA6ICcuJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaGFzUm9vdCAmJiBlbmQgPT09IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnLy8nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGVuZCk7CiAgICAgICAgfSwKICAgICAgICBiYXNlbmFtZShwYXRoLCBleHQpIHsKICAgICAgICAgICAgaWYgKGV4dCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhleHQsICdleHQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpOwogICAgICAgICAgICBsZXQgc3RhcnQgPSAwOwogICAgICAgICAgICBsZXQgZW5kID0gLTE7CiAgICAgICAgICAgIGxldCBtYXRjaGVkU2xhc2ggPSB0cnVlOwogICAgICAgICAgICBsZXQgaTsKICAgICAgICAgICAgaWYgKGV4dCAhPT0gdW5kZWZpbmVkICYmIGV4dC5sZW5ndGggPiAwICYmIGV4dC5sZW5ndGggPD0gcGF0aC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGlmIChleHQgPT09IHBhdGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgZXh0SWR4ID0gZXh0Lmxlbmd0aCAtIDE7CiAgICAgICAgICAgICAgICBsZXQgZmlyc3ROb25TbGFzaEVuZCA9IC0xOwogICAgICAgICAgICAgICAgZm9yIChpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGUgPT09IENIQVJfRk9SV0FSRF9TTEFTSCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aAogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3cKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0Tm9uU2xhc2hFbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgcmVtZW1iZXIgdGhpcyBpbmRleCBpbiBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIGl0IGlmIHRoZSBleHRlbnNpb24gZW5kcyB1cCBub3QgbWF0Y2hpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3ROb25TbGFzaEVuZCA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRJZHggPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIHRoZSBleHBsaWNpdCBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlID09PSBleHQuY2hhckNvZGVBdChleHRJZHgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC0tZXh0SWR4ID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBleHRlbnNpb24sIHNvIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91ciBwYXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4dGVuc2lvbiBkb2VzIG5vdCBtYXRjaCwgc28gb3VyIHJlc3VsdCBpcyB0aGUgZW50aXJlIHBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRJZHggPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgPSBmaXJzdE5vblNsYXNoRW5kOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN0YXJ0ID09PSBlbmQpIHsKICAgICAgICAgICAgICAgICAgICBlbmQgPSBmaXJzdE5vblNsYXNoRW5kOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZW5kID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGVuZCA9IHBhdGgubGVuZ3RoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnQsIGVuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgICAgICAgaWYgKHBhdGguY2hhckNvZGVBdChpKSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGgKICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3cKICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IGkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbmQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91cgogICAgICAgICAgICAgICAgICAgIC8vIHBhdGggY29tcG9uZW50CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gaSArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGF0aC5zbGljZShzdGFydCwgZW5kKTsKICAgICAgICB9LAogICAgICAgIGV4dG5hbWUocGF0aCkgewogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpOwogICAgICAgICAgICBsZXQgc3RhcnREb3QgPSAtMTsKICAgICAgICAgICAgbGV0IHN0YXJ0UGFydCA9IDA7CiAgICAgICAgICAgIGxldCBlbmQgPSAtMTsKICAgICAgICAgICAgbGV0IG1hdGNoZWRTbGFzaCA9IHRydWU7CiAgICAgICAgICAgIC8vIFRyYWNrIHRoZSBzdGF0ZSBvZiBjaGFyYWN0ZXJzIChpZiBhbnkpIHdlIHNlZSBiZWZvcmUgb3VyIGZpcnN0IGRvdCBhbmQKICAgICAgICAgICAgLy8gYWZ0ZXIgYW55IHBhdGggc2VwYXJhdG9yIHdlIGZpbmQKICAgICAgICAgICAgbGV0IHByZURvdFN0YXRlID0gMDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGgKICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3cKICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBhcnQgPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyCiAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gaSArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9ET1QpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG91ciBmaXJzdCBkb3QsIG1hcmsgaXQgYXMgdGhlIHN0YXJ0IG9mIG91ciBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RG90ID0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJlRG90U3RhdGUgIT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJlRG90U3RhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0RG90ICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgYW5kIG5vbi1wYXRoIHNlcGFyYXRvciBiZWZvcmUgb3VyIGRvdCwgc28gd2Ugc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSBhIGdvb2QgY2hhbmNlIGF0IGhhdmluZyBhIG5vbi1lbXB0eSBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICBwcmVEb3RTdGF0ZSA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGFydERvdCA9PT0gLTEgfHwKICAgICAgICAgICAgICAgIGVuZCA9PT0gLTEgfHwKICAgICAgICAgICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZG90CiAgICAgICAgICAgICAgICBwcmVEb3RTdGF0ZSA9PT0gMCB8fAogICAgICAgICAgICAgICAgLy8gVGhlIChyaWdodC1tb3N0KSB0cmltbWVkIHBhdGggY29tcG9uZW50IGlzIGV4YWN0bHkgJy4uJwogICAgICAgICAgICAgICAgKHByZURvdFN0YXRlID09PSAxICYmCiAgICAgICAgICAgICAgICAgICAgc3RhcnREb3QgPT09IGVuZCAtIDEgJiYKICAgICAgICAgICAgICAgICAgICBzdGFydERvdCA9PT0gc3RhcnRQYXJ0ICsgMSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGF0aC5zbGljZShzdGFydERvdCwgZW5kKTsKICAgICAgICB9LAogICAgICAgIGZvcm1hdDogX2Zvcm1hdC5iaW5kKG51bGwsICcvJyksCiAgICAgICAgcGFyc2UocGF0aCkgewogICAgICAgICAgICB2YWxpZGF0ZVN0cmluZyhwYXRoLCAncGF0aCcpOwogICAgICAgICAgICBjb25zdCByZXQgPSB7IHJvb3Q6ICcnLCBkaXI6ICcnLCBiYXNlOiAnJywgZXh0OiAnJywgbmFtZTogJycgfTsKICAgICAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGlzQWJzb2x1dGUgPSBwYXRoLmNoYXJDb2RlQXQoMCkgPT09IENIQVJfRk9SV0FSRF9TTEFTSDsKICAgICAgICAgICAgbGV0IHN0YXJ0OwogICAgICAgICAgICBpZiAoaXNBYnNvbHV0ZSkgewogICAgICAgICAgICAgICAgcmV0LnJvb3QgPSAnLyc7CiAgICAgICAgICAgICAgICBzdGFydCA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdGFydCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHN0YXJ0RG90ID0gLTE7CiAgICAgICAgICAgIGxldCBzdGFydFBhcnQgPSAwOwogICAgICAgICAgICBsZXQgZW5kID0gLTE7CiAgICAgICAgICAgIGxldCBtYXRjaGVkU2xhc2ggPSB0cnVlOwogICAgICAgICAgICBsZXQgaSA9IHBhdGgubGVuZ3RoIC0gMTsKICAgICAgICAgICAgLy8gVHJhY2sgdGhlIHN0YXRlIG9mIGNoYXJhY3RlcnMgKGlmIGFueSkgd2Ugc2VlIGJlZm9yZSBvdXIgZmlyc3QgZG90IGFuZAogICAgICAgICAgICAvLyBhZnRlciBhbnkgcGF0aCBzZXBhcmF0b3Igd2UgZmluZAogICAgICAgICAgICBsZXQgcHJlRG90U3RhdGUgPSAwOwogICAgICAgICAgICAvLyBHZXQgbm9uLWRpciBpbmZvCiAgICAgICAgICAgIGZvciAoOyBpID49IHN0YXJ0OyAtLWkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9GT1JXQVJEX1NMQVNIKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGgKICAgICAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3cKICAgICAgICAgICAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFydFBhcnQgPSBpICsgMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVuZCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBzYXcgdGhlIGZpcnN0IG5vbi1wYXRoIHNlcGFyYXRvciwgbWFyayB0aGlzIGFzIHRoZSBlbmQgb2Ygb3VyCiAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gaSArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gQ0hBUl9ET1QpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIG91ciBmaXJzdCBkb3QsIG1hcmsgaXQgYXMgdGhlIHN0YXJ0IG9mIG91ciBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnREb3QgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0RG90ID0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJlRG90U3RhdGUgIT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJlRG90U3RhdGUgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJ0RG90ICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgYW5kIG5vbi1wYXRoIHNlcGFyYXRvciBiZWZvcmUgb3VyIGRvdCwgc28gd2Ugc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSBhIGdvb2QgY2hhbmNlIGF0IGhhdmluZyBhIG5vbi1lbXB0eSBleHRlbnNpb24KICAgICAgICAgICAgICAgICAgICBwcmVEb3RTdGF0ZSA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbmQgIT09IC0xKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzdGFydCA9IHN0YXJ0UGFydCA9PT0gMCAmJiBpc0Fic29sdXRlID8gMSA6IHN0YXJ0UGFydDsKICAgICAgICAgICAgICAgIGlmIChzdGFydERvdCA9PT0gLTEgfHwKICAgICAgICAgICAgICAgICAgICAvLyBXZSBzYXcgYSBub24tZG90IGNoYXJhY3RlciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGRvdAogICAgICAgICAgICAgICAgICAgIHByZURvdFN0YXRlID09PSAwIHx8CiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIChyaWdodC1tb3N0KSB0cmltbWVkIHBhdGggY29tcG9uZW50IGlzIGV4YWN0bHkgJy4uJwogICAgICAgICAgICAgICAgICAgIChwcmVEb3RTdGF0ZSA9PT0gMSAmJgogICAgICAgICAgICAgICAgICAgICAgICBzdGFydERvdCA9PT0gZW5kIC0gMSAmJgogICAgICAgICAgICAgICAgICAgICAgICBzdGFydERvdCA9PT0gc3RhcnRQYXJ0ICsgMSkpIHsKICAgICAgICAgICAgICAgICAgICByZXQuYmFzZSA9IHJldC5uYW1lID0gcGF0aC5zbGljZShzdGFydCwgZW5kKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldC5uYW1lID0gcGF0aC5zbGljZShzdGFydCwgc3RhcnREb3QpOwogICAgICAgICAgICAgICAgICAgIHJldC5iYXNlID0gcGF0aC5zbGljZShzdGFydCwgZW5kKTsKICAgICAgICAgICAgICAgICAgICByZXQuZXh0ID0gcGF0aC5zbGljZShzdGFydERvdCwgZW5kKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhcnRQYXJ0ID4gMCkgewogICAgICAgICAgICAgICAgcmV0LmRpciA9IHBhdGguc2xpY2UoMCwgc3RhcnRQYXJ0IC0gMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNBYnNvbHV0ZSkgewogICAgICAgICAgICAgICAgcmV0LmRpciA9ICcvJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0sCiAgICAgICAgc2VwOiAnLycsCiAgICAgICAgZGVsaW1pdGVyOiAnOicsCiAgICAgICAgd2luMzI6IG51bGwsCiAgICAgICAgcG9zaXg6IG51bGwKICAgIH07CiAgICBwb3NpeC53aW4zMiA9IHdpbjMyLndpbjMyID0gd2luMzI7CiAgICBwb3NpeC5wb3NpeCA9IHdpbjMyLnBvc2l4ID0gcG9zaXg7CiAgICAocGxhdGZvcm0gPT09ICd3aW4zMicgPyB3aW4zMi5ub3JtYWxpemUgOiBwb3NpeC5ub3JtYWxpemUpOwogICAgKHBsYXRmb3JtID09PSAnd2luMzInID8gd2luMzIucmVzb2x2ZSA6IHBvc2l4LnJlc29sdmUpOwogICAgKHBsYXRmb3JtID09PSAnd2luMzInID8gd2luMzIucmVsYXRpdmUgOiBwb3NpeC5yZWxhdGl2ZSk7CiAgICAocGxhdGZvcm0gPT09ICd3aW4zMicgPyB3aW4zMi5kaXJuYW1lIDogcG9zaXguZGlybmFtZSk7CiAgICAocGxhdGZvcm0gPT09ICd3aW4zMicgPyB3aW4zMi5iYXNlbmFtZSA6IHBvc2l4LmJhc2VuYW1lKTsKICAgIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IHdpbjMyLmV4dG5hbWUgOiBwb3NpeC5leHRuYW1lKTsKICAgIChwbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IHdpbjMyLnNlcCA6IHBvc2l4LnNlcCk7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjb25zdCBfc2NoZW1lUGF0dGVybiA9IC9eXHdbXHdcZCsuLV0qJC87CiAgICBjb25zdCBfc2luZ2xlU2xhc2hTdGFydCA9IC9eXC8vOwogICAgY29uc3QgX2RvdWJsZVNsYXNoU3RhcnQgPSAvXlwvXC8vOwogICAgZnVuY3Rpb24gX3ZhbGlkYXRlVXJpKHJldCwgX3N0cmljdCkgewogICAgICAgIC8vIHNjaGVtZSwgbXVzdCBiZSBzZXQKICAgICAgICBpZiAoIXJldC5zY2hlbWUgJiYgX3N0cmljdCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtVcmlFcnJvcl06IFNjaGVtZSBpcyBtaXNzaW5nOiB7c2NoZW1lOiAiIiwgYXV0aG9yaXR5OiAiJHtyZXQuYXV0aG9yaXR5fSIsIHBhdGg6ICIke3JldC5wYXRofSIsIHF1ZXJ5OiAiJHtyZXQucXVlcnl9IiwgZnJhZ21lbnQ6ICIke3JldC5mcmFnbWVudH0ifWApOwogICAgICAgIH0KICAgICAgICAvLyBzY2hlbWUsIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4xCiAgICAgICAgLy8gQUxQSEEgKiggQUxQSEEgLyBESUdJVCAvICIrIiAvICItIiAvICIuIiApCiAgICAgICAgaWYgKHJldC5zY2hlbWUgJiYgIV9zY2hlbWVQYXR0ZXJuLnRlc3QocmV0LnNjaGVtZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBTY2hlbWUgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzLicpOwogICAgICAgIH0KICAgICAgICAvLyBwYXRoLCBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tMy4zCiAgICAgICAgLy8gSWYgYSBVUkkgY29udGFpbnMgYW4gYXV0aG9yaXR5IGNvbXBvbmVudCwgdGhlbiB0aGUgcGF0aCBjb21wb25lbnQKICAgICAgICAvLyBtdXN0IGVpdGhlciBiZSBlbXB0eSBvciBiZWdpbiB3aXRoIGEgc2xhc2ggKCIvIikgY2hhcmFjdGVyLiAgSWYgYSBVUkkKICAgICAgICAvLyBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY2Fubm90IGJlZ2luCiAgICAgICAgLy8gd2l0aCB0d28gc2xhc2ggY2hhcmFjdGVycyAoIi8vIikuCiAgICAgICAgaWYgKHJldC5wYXRoKSB7CiAgICAgICAgICAgIGlmIChyZXQuYXV0aG9yaXR5KSB7CiAgICAgICAgICAgICAgICBpZiAoIV9zaW5nbGVTbGFzaFN0YXJ0LnRlc3QocmV0LnBhdGgpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBjb250YWlucyBhbiBhdXRob3JpdHkgY29tcG9uZW50LCB0aGVuIHRoZSBwYXRoIGNvbXBvbmVudCBtdXN0IGVpdGhlciBiZSBlbXB0eSBvciBiZWdpbiB3aXRoIGEgc2xhc2ggKCIvIikgY2hhcmFjdGVyJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoX2RvdWJsZVNsYXNoU3RhcnQudGVzdChyZXQucGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGRvZXMgbm90IGNvbnRhaW4gYW4gYXV0aG9yaXR5IGNvbXBvbmVudCwgdGhlbiB0aGUgcGF0aCBjYW5ub3QgYmVnaW4gd2l0aCB0d28gc2xhc2ggY2hhcmFjdGVycyAoIi8vIiknKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8vIGZvciBhIHdoaWxlIHdlIGFsbG93ZWQgdXJpcyAqd2l0aG91dCogc2NoZW1lcyBhbmQgdGhpcyBpcyB0aGUgbWlncmF0aW9uCiAgICAvLyBmb3IgdGhlbSwgZS5nLiBhbiB1cmkgd2l0aG91dCBzY2hlbWUgYW5kIHdpdGhvdXQgc3RyaWN0LW1vZGUgd2FybnMgYW5kIGZhbGxzCiAgICAvLyBiYWNrIHRvIHRoZSBmaWxlLXNjaGVtZS4gdGhhdCBzaG91bGQgY2F1c2UgdGhlIGxlYXN0IGNhcm5hZ2UgYW5kIHN0aWxsIGJlIGEKICAgIC8vIGNsZWFyIHdhcm5pbmcKICAgIGZ1bmN0aW9uIF9zY2hlbWVGaXgoc2NoZW1lLCBfc3RyaWN0KSB7CiAgICAgICAgaWYgKCFzY2hlbWUgJiYgIV9zdHJpY3QpIHsKICAgICAgICAgICAgcmV0dXJuICdmaWxlJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNjaGVtZTsKICAgIH0KICAgIC8vIGltcGxlbWVudHMgYSBiaXQgb2YgaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi01CiAgICBmdW5jdGlvbiBfcmVmZXJlbmNlUmVzb2x1dGlvbihzY2hlbWUsIHBhdGgpIHsKICAgICAgICAvLyB0aGUgc2xhc2gtY2hhcmFjdGVyIGlzIG91ciAnZGVmYXVsdCBiYXNlJyBhcyB3ZSBkb24ndAogICAgICAgIC8vIHN1cHBvcnQgY29uc3RydWN0aW5nIFVSSXMgcmVsYXRpdmUgdG8gb3RoZXIgVVJJcy4gVGhpcwogICAgICAgIC8vIGFsc28gbWVhbnMgdGhhdCB3ZSBhbHRlciBhbmQgcG90ZW50aWFsbHkgYnJlYWsgcGF0aHMuCiAgICAgICAgLy8gc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNS4xLjQKICAgICAgICBzd2l0Y2ggKHNjaGVtZSkgewogICAgICAgICAgICBjYXNlICdodHRwcyc6CiAgICAgICAgICAgIGNhc2UgJ2h0dHAnOgogICAgICAgICAgICBjYXNlICdmaWxlJzoKICAgICAgICAgICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgICAgICAgICAgIHBhdGggPSBfc2xhc2g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXRoWzBdICE9PSBfc2xhc2gpIHsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gX3NsYXNoICsgcGF0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGF0aDsKICAgIH0KICAgIGNvbnN0IF9lbXB0eSA9ICcnOwogICAgY29uc3QgX3NsYXNoID0gJy8nOwogICAgY29uc3QgX3JlZ2V4cCA9IC9eKChbXjovPyNdKz8pOik/KFwvXC8oW14vPyNdKikpPyhbXj8jXSopKFw/KFteI10qKSk/KCMoLiopKT8vOwogICAgLyoqCiAgICAgKiBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4Ni4KICAgICAqIFRoaXMgY2xhc3MgaXMgYSBzaW1wbGUgcGFyc2VyIHdoaWNoIGNyZWF0ZXMgdGhlIGJhc2ljIGNvbXBvbmVudCBwYXJ0cwogICAgICogKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0zKSB3aXRoIG1pbmltYWwgdmFsaWRhdGlvbgogICAgICogYW5kIGVuY29kaW5nLgogICAgICoKICAgICAqIGBgYHR4dAogICAgICogICAgICAgZm9vOi8vZXhhbXBsZS5jb206ODA0Mi9vdmVyL3RoZXJlP25hbWU9ZmVycmV0I25vc2UKICAgICAqICAgICAgIFxfLyAgIFxfX19fX19fX19fX19fXy9cX19fX19fX19fLyBcX19fX19fX19fLyBcX18vCiAgICAgKiAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICAgIHwgICAgICAgICAgICB8ICAgICAgICB8CiAgICAgKiAgICAgc2NoZW1lICAgICBhdXRob3JpdHkgICAgICAgcGF0aCAgICAgICAgcXVlcnkgICBmcmFnbWVudAogICAgICogICAgICAgIHwgICBfX19fX19fX19fX19fX19fX19fX198X18KICAgICAqICAgICAgIC8gXCAvICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICogICAgICAgdXJuOmV4YW1wbGU6YW5pbWFsOmZlcnJldDpub3NlCiAgICAgKiBgYGAKICAgICAqLwogICAgY2xhc3MgVVJJJDEgewogICAgICAgIC8qKgogICAgICAgICAqIEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHNjaGVtZU9yRGF0YSwgYXV0aG9yaXR5LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQsIF9zdHJpY3QgPSBmYWxzZSkgewogICAgICAgICAgICBpZiAodHlwZW9mIHNjaGVtZU9yRGF0YSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1lID0gc2NoZW1lT3JEYXRhLnNjaGVtZSB8fCBfZW1wdHk7CiAgICAgICAgICAgICAgICB0aGlzLmF1dGhvcml0eSA9IHNjaGVtZU9yRGF0YS5hdXRob3JpdHkgfHwgX2VtcHR5OwogICAgICAgICAgICAgICAgdGhpcy5wYXRoID0gc2NoZW1lT3JEYXRhLnBhdGggfHwgX2VtcHR5OwogICAgICAgICAgICAgICAgdGhpcy5xdWVyeSA9IHNjaGVtZU9yRGF0YS5xdWVyeSB8fCBfZW1wdHk7CiAgICAgICAgICAgICAgICB0aGlzLmZyYWdtZW50ID0gc2NoZW1lT3JEYXRhLmZyYWdtZW50IHx8IF9lbXB0eTsKICAgICAgICAgICAgICAgIC8vIG5vIHZhbGlkYXRpb24gYmVjYXVzZSBpdCdzIHRoaXMgVVJJCiAgICAgICAgICAgICAgICAvLyB0aGF0IGNyZWF0ZXMgdXJpIGNvbXBvbmVudHMuCiAgICAgICAgICAgICAgICAvLyBfdmFsaWRhdGVVcmkodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjaGVtZSA9IF9zY2hlbWVGaXgoc2NoZW1lT3JEYXRhLCBfc3RyaWN0KTsKICAgICAgICAgICAgICAgIHRoaXMuYXV0aG9yaXR5ID0gYXV0aG9yaXR5IHx8IF9lbXB0eTsKICAgICAgICAgICAgICAgIHRoaXMucGF0aCA9IF9yZWZlcmVuY2VSZXNvbHV0aW9uKHRoaXMuc2NoZW1lLCBwYXRoIHx8IF9lbXB0eSk7CiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnkgfHwgX2VtcHR5OwogICAgICAgICAgICAgICAgdGhpcy5mcmFnbWVudCA9IGZyYWdtZW50IHx8IF9lbXB0eTsKICAgICAgICAgICAgICAgIF92YWxpZGF0ZVVyaSh0aGlzLCBfc3RyaWN0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdGF0aWMgaXNVcmkodGhpbmcpIHsKICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgVVJJJDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpbmcpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHlwZW9mIHRoaW5nLmF1dGhvcml0eSA9PT0gJ3N0cmluZycKICAgICAgICAgICAgICAgICYmIHR5cGVvZiB0aGluZy5mcmFnbWVudCA9PT0gJ3N0cmluZycKICAgICAgICAgICAgICAgICYmIHR5cGVvZiB0aGluZy5wYXRoID09PSAnc3RyaW5nJwogICAgICAgICAgICAgICAgJiYgdHlwZW9mIHRoaW5nLnF1ZXJ5ID09PSAnc3RyaW5nJwogICAgICAgICAgICAgICAgJiYgdHlwZW9mIHRoaW5nLnNjaGVtZSA9PT0gJ3N0cmluZycKICAgICAgICAgICAgICAgICYmIHR5cGVvZiB0aGluZy5mc1BhdGggPT09ICdzdHJpbmcnCiAgICAgICAgICAgICAgICAmJiB0eXBlb2YgdGhpbmcud2l0aCA9PT0gJ2Z1bmN0aW9uJwogICAgICAgICAgICAgICAgJiYgdHlwZW9mIHRoaW5nLnRvU3RyaW5nID09PSAnZnVuY3Rpb24nOwogICAgICAgIH0KICAgICAgICAvLyAtLS0tIGZpbGVzeXN0ZW0gcGF0aCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIGZpbGUgc3lzdGVtIHBhdGggb2YgdGhpcyBVUkkuCiAgICAgICAgICogV2lsbCBoYW5kbGUgVU5DIHBhdGhzLCBub3JtYWxpemVzIHdpbmRvd3MgZHJpdmUgbGV0dGVycyB0byBsb3dlci1jYXNlLCBhbmQgdXNlcyB0aGUKICAgICAgICAgKiBwbGF0Zm9ybSBzcGVjaWZpYyBwYXRoIHNlcGFyYXRvci4KICAgICAgICAgKgogICAgICAgICAqICogV2lsbCAqbm90KiB2YWxpZGF0ZSB0aGUgcGF0aCBmb3IgaW52YWxpZCBjaGFyYWN0ZXJzIGFuZCBzZW1hbnRpY3MuCiAgICAgICAgICogKiBXaWxsICpub3QqIGxvb2sgYXQgdGhlIHNjaGVtZSBvZiB0aGlzIFVSSS4KICAgICAgICAgKiAqIFRoZSByZXN1bHQgc2hhbGwgKm5vdCogYmUgdXNlZCBmb3IgZGlzcGxheSBwdXJwb3NlcyBidXQgZm9yIGFjY2Vzc2luZyBhIGZpbGUgb24gZGlzay4KICAgICAgICAgKgogICAgICAgICAqCiAgICAgICAgICogVGhlICpkaWZmZXJlbmNlKiB0byBgVVJJI3BhdGhgIGlzIHRoZSB1c2Ugb2YgdGhlIHBsYXRmb3JtIHNwZWNpZmljIHNlcGFyYXRvciBhbmQgdGhlIGhhbmRsaW5nCiAgICAgICAgICogb2YgVU5DIHBhdGhzLiBTZWUgdGhlIGJlbG93IHNhbXBsZSBvZiBhIGZpbGUtdXJpIHdpdGggYW4gYXV0aG9yaXR5IChVTkMgcGF0aCkuCiAgICAgICAgICoKICAgICAgICAgKiBgYGB0cwogICAgICAgICAgICBjb25zdCB1ID0gVVJJLnBhcnNlKCdmaWxlOi8vc2VydmVyL2MkL2ZvbGRlci9maWxlLnR4dCcpCiAgICAgICAgICAgIHUuYXV0aG9yaXR5ID09PSAnc2VydmVyJwogICAgICAgICAgICB1LnBhdGggPT09ICcvc2hhcmVzL2MkL2ZpbGUudHh0JwogICAgICAgICAgICB1LmZzUGF0aCA9PT0gJ1xcc2VydmVyXGMkXGZvbGRlclxmaWxlLnR4dCcKICAgICAgICBgYGAKICAgICAgICAgKgogICAgICAgICAqIFVzaW5nIGBVUkkjcGF0aGAgdG8gcmVhZCBhIGZpbGUgKHVzaW5nIGZzLWFwaXMpIHdvdWxkIG5vdCBiZSBlbm91Z2ggYmVjYXVzZSBwYXJ0cyBvZiB0aGUgcGF0aCwKICAgICAgICAgKiBuYW1lbHkgdGhlIHNlcnZlciBuYW1lLCB3b3VsZCBiZSBtaXNzaW5nLiBUaGVyZWZvcmUgYFVSSSNmc1BhdGhgIGV4aXN0cyAtIGl0J3Mgc3VnYXIgdG8gZWFzZSB3b3JraW5nCiAgICAgICAgICogd2l0aCBVUklzIHRoYXQgcmVwcmVzZW50IGZpbGVzIG9uIGRpc2sgKGBmaWxlYCBzY2hlbWUpLgogICAgICAgICAqLwogICAgICAgIGdldCBmc1BhdGgoKSB7CiAgICAgICAgICAgIC8vIGlmICh0aGlzLnNjaGVtZSAhPT0gJ2ZpbGUnKSB7CiAgICAgICAgICAgIC8vIAljb25zb2xlLndhcm4oYFtVcmlFcnJvcl0gY2FsbGluZyBmc1BhdGggd2l0aCBzY2hlbWUgJHt0aGlzLnNjaGVtZX1gKTsKICAgICAgICAgICAgLy8gfQogICAgICAgICAgICByZXR1cm4gdXJpVG9Gc1BhdGgodGhpcywgZmFsc2UpOwogICAgICAgIH0KICAgICAgICAvLyAtLS0tIG1vZGlmeSB0byBuZXcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIHdpdGgoY2hhbmdlKSB7CiAgICAgICAgICAgIGlmICghY2hhbmdlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgeyBzY2hlbWUsIGF1dGhvcml0eSwgcGF0aCwgcXVlcnksIGZyYWdtZW50IH0gPSBjaGFuZ2U7CiAgICAgICAgICAgIGlmIChzY2hlbWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgc2NoZW1lID0gdGhpcy5zY2hlbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc2NoZW1lID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzY2hlbWUgPSBfZW1wdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGF1dGhvcml0eSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBhdXRob3JpdHkgPSB0aGlzLmF1dGhvcml0eTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChhdXRob3JpdHkgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGF1dGhvcml0eSA9IF9lbXB0eTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBwYXRoID0gdGhpcy5wYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHBhdGggPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHBhdGggPSBfZW1wdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHF1ZXJ5ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHF1ZXJ5ID0gdGhpcy5xdWVyeTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChxdWVyeSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcXVlcnkgPSBfZW1wdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGZyYWdtZW50ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gdGhpcy5mcmFnbWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChmcmFnbWVudCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgZnJhZ21lbnQgPSBfZW1wdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNjaGVtZSA9PT0gdGhpcy5zY2hlbWUKICAgICAgICAgICAgICAgICYmIGF1dGhvcml0eSA9PT0gdGhpcy5hdXRob3JpdHkKICAgICAgICAgICAgICAgICYmIHBhdGggPT09IHRoaXMucGF0aAogICAgICAgICAgICAgICAgJiYgcXVlcnkgPT09IHRoaXMucXVlcnkKICAgICAgICAgICAgICAgICYmIGZyYWdtZW50ID09PSB0aGlzLmZyYWdtZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFVyaShzY2hlbWUsIGF1dGhvcml0eSwgcGF0aCwgcXVlcnksIGZyYWdtZW50KTsKICAgICAgICB9CiAgICAgICAgLy8gLS0tLSBwYXJzZSAmIHZhbGlkYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBuZXcgVVJJIGZyb20gYSBzdHJpbmcsIGUuZy4gYGh0dHA6Ly93d3cubXNmdC5jb20vc29tZS9wYXRoYCwKICAgICAgICAgKiBgZmlsZTovLy91c3IvaG9tZWAsIG9yIGBzY2hlbWU6d2l0aC9wYXRoYC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSBBIHN0cmluZyB3aGljaCByZXByZXNlbnRzIGFuIFVSSSAoc2VlIGBVUkkjdG9TdHJpbmdgKS4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgcGFyc2UodmFsdWUsIF9zdHJpY3QgPSBmYWxzZSkgewogICAgICAgICAgICBjb25zdCBtYXRjaCA9IF9yZWdleHAuZXhlYyh2YWx1ZSk7CiAgICAgICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVXJpKF9lbXB0eSwgX2VtcHR5LCBfZW1wdHksIF9lbXB0eSwgX2VtcHR5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFVyaShtYXRjaFsyXSB8fCBfZW1wdHksIHBlcmNlbnREZWNvZGUobWF0Y2hbNF0gfHwgX2VtcHR5KSwgcGVyY2VudERlY29kZShtYXRjaFs1XSB8fCBfZW1wdHkpLCBwZXJjZW50RGVjb2RlKG1hdGNoWzddIHx8IF9lbXB0eSksIHBlcmNlbnREZWNvZGUobWF0Y2hbOV0gfHwgX2VtcHR5KSwgX3N0cmljdCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBuZXcgVVJJIGZyb20gYSBmaWxlIHN5c3RlbSBwYXRoLCBlLmcuIGBjOlxteVxmaWxlc2AsCiAgICAgICAgICogYC91c3IvaG9tZWAsIG9yIGBcXHNlcnZlclxzaGFyZVxzb21lXHBhdGhgLgogICAgICAgICAqCiAgICAgICAgICogVGhlICpkaWZmZXJlbmNlKiBiZXR3ZWVuIGBVUkkjcGFyc2VgIGFuZCBgVVJJI2ZpbGVgIGlzIHRoYXQgdGhlIGxhdHRlciB0cmVhdHMgdGhlIGFyZ3VtZW50CiAgICAgICAgICogYXMgcGF0aCwgbm90IGFzIHN0cmluZ2lmaWVkLXVyaS4gRS5nLiBgVVJJLmZpbGUocGF0aClgIGlzICoqbm90IHRoZSBzYW1lIGFzKioKICAgICAgICAgKiBgVVJJLnBhcnNlKCdmaWxlOi8vJyArIHBhdGgpYCBiZWNhdXNlIHRoZSBwYXRoIG1pZ2h0IGNvbnRhaW4gY2hhcmFjdGVycyB0aGF0IGFyZQogICAgICAgICAqIGludGVycHJldGVkICgjIGFuZCA/KS4gU2VlIHRoZSBmb2xsb3dpbmcgc2FtcGxlOgogICAgICAgICAqIGBgYHRzCiAgICAgICAgY29uc3QgZ29vZCA9IFVSSS5maWxlKCcvY29kaW5nL2MjL3Byb2plY3QxJyk7CiAgICAgICAgZ29vZC5zY2hlbWUgPT09ICdmaWxlJzsKICAgICAgICBnb29kLnBhdGggPT09ICcvY29kaW5nL2MjL3Byb2plY3QxJzsKICAgICAgICBnb29kLmZyYWdtZW50ID09PSAnJzsKICAgICAgICBjb25zdCBiYWQgPSBVUkkucGFyc2UoJ2ZpbGU6Ly8nICsgJy9jb2RpbmcvYyMvcHJvamVjdDEnKTsKICAgICAgICBiYWQuc2NoZW1lID09PSAnZmlsZSc7CiAgICAgICAgYmFkLnBhdGggPT09ICcvY29kaW5nL2MnOyAvLyBwYXRoIGlzIG5vdyBicm9rZW4KICAgICAgICBiYWQuZnJhZ21lbnQgPT09ICcvcHJvamVjdDEnOwogICAgICAgIGBgYAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHBhdGggQSBmaWxlIHN5c3RlbSBwYXRoIChzZWUgYFVSSSNmc1BhdGhgKQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBmaWxlKHBhdGgpIHsKICAgICAgICAgICAgbGV0IGF1dGhvcml0eSA9IF9lbXB0eTsKICAgICAgICAgICAgLy8gbm9ybWFsaXplIHRvIGZ3ZC1zbGFzaGVzIG9uIHdpbmRvd3MsCiAgICAgICAgICAgIC8vIG9uIG90aGVyIHN5c3RlbXMgYndkLXNsYXNoZXMgYXJlIHZhbGlkCiAgICAgICAgICAgIC8vIGZpbGVuYW1lIGNoYXJhY3RlciwgZWcgL2Zcb28vYmFcci50eHQKICAgICAgICAgICAgaWYgKGlzV2luZG93cykgewogICAgICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFwvZywgX3NsYXNoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBjaGVjayBmb3IgYXV0aG9yaXR5IGFzIHVzZWQgaW4gVU5DIHNoYXJlcwogICAgICAgICAgICAvLyBvciB1c2UgdGhlIHBhdGggYXMgZ2l2ZW4KICAgICAgICAgICAgaWYgKHBhdGhbMF0gPT09IF9zbGFzaCAmJiBwYXRoWzFdID09PSBfc2xhc2gpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHBhdGguaW5kZXhPZihfc2xhc2gsIDIpOwogICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBhdXRob3JpdHkgPSBwYXRoLnN1YnN0cmluZygyKTsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gX3NsYXNoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXR5ID0gcGF0aC5zdWJzdHJpbmcoMiwgaWR4KTsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoaWR4KSB8fCBfc2xhc2g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBVcmkoJ2ZpbGUnLCBhdXRob3JpdHksIHBhdGgsIF9lbXB0eSwgX2VtcHR5KTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGZyb20oY29tcG9uZW50cykgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVXJpKGNvbXBvbmVudHMuc2NoZW1lLCBjb21wb25lbnRzLmF1dGhvcml0eSwgY29tcG9uZW50cy5wYXRoLCBjb21wb25lbnRzLnF1ZXJ5LCBjb21wb25lbnRzLmZyYWdtZW50KTsKICAgICAgICAgICAgX3ZhbGlkYXRlVXJpKHJlc3VsdCwgdHJ1ZSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEpvaW4gYSBVUkkgcGF0aCB3aXRoIHBhdGggZnJhZ21lbnRzIGFuZCBub3JtYWxpemVzIHRoZSByZXN1bHRpbmcgcGF0aC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB1cmkgVGhlIGlucHV0IFVSSS4KICAgICAgICAgKiBAcGFyYW0gcGF0aEZyYWdtZW50IFRoZSBwYXRoIGZyYWdtZW50IHRvIGFkZCB0byB0aGUgVVJJIHBhdGguCiAgICAgICAgICogQHJldHVybnMgVGhlIHJlc3VsdGluZyBVUkkuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGpvaW5QYXRoKHVyaSwgLi4ucGF0aEZyYWdtZW50KSB7CiAgICAgICAgICAgIGlmICghdXJpLnBhdGgpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgW1VyaUVycm9yXTogY2Fubm90IGNhbGwgam9pblBhdGggb24gVVJJIHdpdGhvdXQgcGF0aGApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBuZXdQYXRoOwogICAgICAgICAgICBpZiAoaXNXaW5kb3dzICYmIHVyaS5zY2hlbWUgPT09ICdmaWxlJykgewogICAgICAgICAgICAgICAgbmV3UGF0aCA9IFVSSSQxLmZpbGUod2luMzIuam9pbih1cmlUb0ZzUGF0aCh1cmksIHRydWUpLCAuLi5wYXRoRnJhZ21lbnQpKS5wYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmV3UGF0aCA9IHBvc2l4LmpvaW4odXJpLnBhdGgsIC4uLnBhdGhGcmFnbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHVyaS53aXRoKHsgcGF0aDogbmV3UGF0aCB9KTsKICAgICAgICB9CiAgICAgICAgLy8gLS0tLSBwcmludGluZy9leHRlcm5hbGl6ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIFVSSS4gSXQncyBndWFyYW50ZWVkIHRoYXQgY2FsbGluZwogICAgICAgICAqIGBVUkkucGFyc2VgIHdpdGggdGhlIHJlc3VsdCBvZiB0aGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW4gVVJJIHdoaWNoIGlzIGVxdWFsCiAgICAgICAgICogdG8gdGhpcyBVUkkuCiAgICAgICAgICoKICAgICAgICAgKiAqIFRoZSByZXN1bHQgc2hhbGwgKm5vdCogYmUgdXNlZCBmb3IgZGlzcGxheSBwdXJwb3NlcyBidXQgZm9yIGV4dGVybmFsaXphdGlvbiBvciB0cmFuc3BvcnQuCiAgICAgICAgICogKiBUaGUgcmVzdWx0IHdpbGwgYmUgZW5jb2RlZCB1c2luZyB0aGUgcGVyY2VudGFnZSBlbmNvZGluZyBhbmQgZW5jb2RpbmcgaGFwcGVucyBtb3N0bHkKICAgICAgICAgKiBpZ25vcmUgdGhlIHNjaGVtZS1zcGVjaWZpYyBlbmNvZGluZyBydWxlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSBza2lwRW5jb2RpbmcgRG8gbm90IGVuY29kZSB0aGUgcmVzdWx0LCBkZWZhdWx0IGlzIGBmYWxzZWAKICAgICAgICAgKi8KICAgICAgICB0b1N0cmluZyhza2lwRW5jb2RpbmcgPSBmYWxzZSkgewogICAgICAgICAgICByZXR1cm4gX2FzRm9ybWF0dGVkKHRoaXMsIHNraXBFbmNvZGluZyk7CiAgICAgICAgfQogICAgICAgIHRvSlNPTigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyByZXZpdmUoZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBVUkkkMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgVXJpKGRhdGEpOwogICAgICAgICAgICAgICAgcmVzdWx0Ll9mb3JtYXR0ZWQgPSBkYXRhLmV4dGVybmFsOwogICAgICAgICAgICAgICAgcmVzdWx0Ll9mc1BhdGggPSBkYXRhLl9zZXAgPT09IF9wYXRoU2VwTWFya2VyID8gZGF0YS5mc1BhdGggOiBudWxsOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IF9wYXRoU2VwTWFya2VyID0gaXNXaW5kb3dzID8gMSA6IHVuZGVmaW5lZDsKICAgIC8vIFRoaXMgY2xhc3MgZXhpc3RzIHNvIHRoYXQgVVJJIGlzIGNvbXBhdGlibGUgd2l0aCB2c2NvZGUuVXJpIChBUEkpLgogICAgY2xhc3MgVXJpIGV4dGVuZHMgVVJJJDEgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLl9mb3JtYXR0ZWQgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9mc1BhdGggPSBudWxsOwogICAgICAgIH0KICAgICAgICBnZXQgZnNQYXRoKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2ZzUGF0aCkgewogICAgICAgICAgICAgICAgdGhpcy5fZnNQYXRoID0gdXJpVG9Gc1BhdGgodGhpcywgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mc1BhdGg7CiAgICAgICAgfQogICAgICAgIHRvU3RyaW5nKHNraXBFbmNvZGluZyA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICghc2tpcEVuY29kaW5nKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2Zvcm1hdHRlZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1hdHRlZCA9IF9hc0Zvcm1hdHRlZCh0aGlzLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgY2FjaGUgdGhhdAogICAgICAgICAgICAgICAgcmV0dXJuIF9hc0Zvcm1hdHRlZCh0aGlzLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0b0pTT04oKSB7CiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHsKICAgICAgICAgICAgICAgICRtaWQ6IDEgLyogVXJpICovCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIC8vIGNhY2hlZCBzdGF0ZQogICAgICAgICAgICBpZiAodGhpcy5fZnNQYXRoKSB7CiAgICAgICAgICAgICAgICByZXMuZnNQYXRoID0gdGhpcy5fZnNQYXRoOwogICAgICAgICAgICAgICAgcmVzLl9zZXAgPSBfcGF0aFNlcE1hcmtlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fZm9ybWF0dGVkKSB7CiAgICAgICAgICAgICAgICByZXMuZXh0ZXJuYWwgPSB0aGlzLl9mb3JtYXR0ZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gdXJpIGNvbXBvbmVudHMKICAgICAgICAgICAgaWYgKHRoaXMucGF0aCkgewogICAgICAgICAgICAgICAgcmVzLnBhdGggPSB0aGlzLnBhdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuc2NoZW1lKSB7CiAgICAgICAgICAgICAgICByZXMuc2NoZW1lID0gdGhpcy5zY2hlbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuYXV0aG9yaXR5KSB7CiAgICAgICAgICAgICAgICByZXMuYXV0aG9yaXR5ID0gdGhpcy5hdXRob3JpdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMucXVlcnkpIHsKICAgICAgICAgICAgICAgIHJlcy5xdWVyeSA9IHRoaXMucXVlcnk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuZnJhZ21lbnQpIHsKICAgICAgICAgICAgICAgIHJlcy5mcmFnbWVudCA9IHRoaXMuZnJhZ21lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9CiAgICB9CiAgICAvLyByZXNlcnZlZCBjaGFyYWN0ZXJzOiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTIuMgogICAgY29uc3QgZW5jb2RlVGFibGUgPSB7CiAgICAgICAgWzU4IC8qIENvbG9uICovXTogJyUzQScsCiAgICAgICAgWzQ3IC8qIFNsYXNoICovXTogJyUyRicsCiAgICAgICAgWzYzIC8qIFF1ZXN0aW9uTWFyayAqL106ICclM0YnLAogICAgICAgIFszNSAvKiBIYXNoICovXTogJyUyMycsCiAgICAgICAgWzkxIC8qIE9wZW5TcXVhcmVCcmFja2V0ICovXTogJyU1QicsCiAgICAgICAgWzkzIC8qIENsb3NlU3F1YXJlQnJhY2tldCAqL106ICclNUQnLAogICAgICAgIFs2NCAvKiBBdFNpZ24gKi9dOiAnJTQwJywKICAgICAgICBbMzMgLyogRXhjbGFtYXRpb25NYXJrICovXTogJyUyMScsCiAgICAgICAgWzM2IC8qIERvbGxhclNpZ24gKi9dOiAnJTI0JywKICAgICAgICBbMzggLyogQW1wZXJzYW5kICovXTogJyUyNicsCiAgICAgICAgWzM5IC8qIFNpbmdsZVF1b3RlICovXTogJyUyNycsCiAgICAgICAgWzQwIC8qIE9wZW5QYXJlbiAqL106ICclMjgnLAogICAgICAgIFs0MSAvKiBDbG9zZVBhcmVuICovXTogJyUyOScsCiAgICAgICAgWzQyIC8qIEFzdGVyaXNrICovXTogJyUyQScsCiAgICAgICAgWzQzIC8qIFBsdXMgKi9dOiAnJTJCJywKICAgICAgICBbNDQgLyogQ29tbWEgKi9dOiAnJTJDJywKICAgICAgICBbNTkgLyogU2VtaWNvbG9uICovXTogJyUzQicsCiAgICAgICAgWzYxIC8qIEVxdWFscyAqL106ICclM0QnLAogICAgICAgIFszMiAvKiBTcGFjZSAqL106ICclMjAnLAogICAgfTsKICAgIGZ1bmN0aW9uIGVuY29kZVVSSUNvbXBvbmVudEZhc3QodXJpQ29tcG9uZW50LCBhbGxvd1NsYXNoKSB7CiAgICAgICAgbGV0IHJlcyA9IHVuZGVmaW5lZDsKICAgICAgICBsZXQgbmF0aXZlRW5jb2RlUG9zID0gLTE7CiAgICAgICAgZm9yIChsZXQgcG9zID0gMDsgcG9zIDwgdXJpQ29tcG9uZW50Lmxlbmd0aDsgcG9zKyspIHsKICAgICAgICAgICAgY29uc3QgY29kZSA9IHVyaUNvbXBvbmVudC5jaGFyQ29kZUF0KHBvcyk7CiAgICAgICAgICAgIC8vIHVucmVzZXJ2ZWQgY2hhcmFjdGVyczogaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi0yLjMKICAgICAgICAgICAgaWYgKChjb2RlID49IDk3IC8qIGEgKi8gJiYgY29kZSA8PSAxMjIgLyogeiAqLykKICAgICAgICAgICAgICAgIHx8IChjb2RlID49IDY1IC8qIEEgKi8gJiYgY29kZSA8PSA5MCAvKiBaICovKQogICAgICAgICAgICAgICAgfHwgKGNvZGUgPj0gNDggLyogRGlnaXQwICovICYmIGNvZGUgPD0gNTcgLyogRGlnaXQ5ICovKQogICAgICAgICAgICAgICAgfHwgY29kZSA9PT0gNDUgLyogRGFzaCAqLwogICAgICAgICAgICAgICAgfHwgY29kZSA9PT0gNDYgLyogUGVyaW9kICovCiAgICAgICAgICAgICAgICB8fCBjb2RlID09PSA5NSAvKiBVbmRlcmxpbmUgKi8KICAgICAgICAgICAgICAgIHx8IGNvZGUgPT09IDEyNiAvKiBUaWxkZSAqLwogICAgICAgICAgICAgICAgfHwgKGFsbG93U2xhc2ggJiYgY29kZSA9PT0gNDcgLyogU2xhc2ggKi8pKSB7CiAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBhcmUgZGVsYXlpbmcgbmF0aXZlIGVuY29kZQogICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUVuY29kZVBvcyAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICByZXMgKz0gZW5jb2RlVVJJQ29tcG9uZW50KHVyaUNvbXBvbmVudC5zdWJzdHJpbmcobmF0aXZlRW5jb2RlUG9zLCBwb3MpKTsKICAgICAgICAgICAgICAgICAgICBuYXRpdmVFbmNvZGVQb3MgPSAtMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIHdyaXRlIGludG8gYSBuZXcgc3RyaW5nIChieSBkZWZhdWx0IHdlIHRyeSB0byByZXR1cm4gdGhlIHBhcmFtKQogICAgICAgICAgICAgICAgaWYgKHJlcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzICs9IHVyaUNvbXBvbmVudC5jaGFyQXQocG9zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGVuY29kaW5nIG5lZWRlZCwgd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBzdHJpbmcKICAgICAgICAgICAgICAgIGlmIChyZXMgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIHJlcyA9IHVyaUNvbXBvbmVudC5zdWJzdHIoMCwgcG9zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdpdGggZGVmYXVsdCB0YWJsZSBmaXJzdAogICAgICAgICAgICAgICAgY29uc3QgZXNjYXBlZCA9IGVuY29kZVRhYmxlW2NvZGVdOwogICAgICAgICAgICAgICAgaWYgKGVzY2FwZWQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHdlIGFyZSBkZWxheWluZyBuYXRpdmUgZW5jb2RlCiAgICAgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZUVuY29kZVBvcyAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzICs9IGVuY29kZVVSSUNvbXBvbmVudCh1cmlDb21wb25lbnQuc3Vic3RyaW5nKG5hdGl2ZUVuY29kZVBvcywgcG9zKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZUVuY29kZVBvcyA9IC0xOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBhcHBlbmQgZXNjYXBlZCB2YXJpYW50IHRvIHJlc3VsdAogICAgICAgICAgICAgICAgICAgIHJlcyArPSBlc2NhcGVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobmF0aXZlRW5jb2RlUG9zID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIHVzZSBuYXRpdmUgZW5jb2RlIG9ubHkgd2hlbiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICBuYXRpdmVFbmNvZGVQb3MgPSBwb3M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG5hdGl2ZUVuY29kZVBvcyAhPT0gLTEpIHsKICAgICAgICAgICAgcmVzICs9IGVuY29kZVVSSUNvbXBvbmVudCh1cmlDb21wb25lbnQuc3Vic3RyaW5nKG5hdGl2ZUVuY29kZVBvcykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzICE9PSB1bmRlZmluZWQgPyByZXMgOiB1cmlDb21wb25lbnQ7CiAgICB9CiAgICBmdW5jdGlvbiBlbmNvZGVVUklDb21wb25lbnRNaW5pbWFsKHBhdGgpIHsKICAgICAgICBsZXQgcmVzID0gdW5kZWZpbmVkOwogICAgICAgIGZvciAobGV0IHBvcyA9IDA7IHBvcyA8IHBhdGgubGVuZ3RoOyBwb3MrKykgewogICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KHBvcyk7CiAgICAgICAgICAgIGlmIChjb2RlID09PSAzNSAvKiBIYXNoICovIHx8IGNvZGUgPT09IDYzIC8qIFF1ZXN0aW9uTWFyayAqLykgewogICAgICAgICAgICAgICAgaWYgKHJlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzID0gcGF0aC5zdWJzdHIoMCwgcG9zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlcyArPSBlbmNvZGVUYWJsZVtjb2RlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChyZXMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIHJlcyArPSBwYXRoW3Bvc107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcyAhPT0gdW5kZWZpbmVkID8gcmVzIDogcGF0aDsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZSBgZnNQYXRoYCBmb3IgdGhlIGdpdmVuIHVyaQogICAgICovCiAgICBmdW5jdGlvbiB1cmlUb0ZzUGF0aCh1cmksIGtlZXBEcml2ZUxldHRlckNhc2luZykgewogICAgICAgIGxldCB2YWx1ZTsKICAgICAgICBpZiAodXJpLmF1dGhvcml0eSAmJiB1cmkucGF0aC5sZW5ndGggPiAxICYmIHVyaS5zY2hlbWUgPT09ICdmaWxlJykgewogICAgICAgICAgICAvLyB1bmMgcGF0aDogZmlsZTovL3NoYXJlcy9jJC9mYXIvYm9vCiAgICAgICAgICAgIHZhbHVlID0gYC8vJHt1cmkuYXV0aG9yaXR5fSR7dXJpLnBhdGh9YDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodXJpLnBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyogU2xhc2ggKi8KICAgICAgICAgICAgJiYgKHVyaS5wYXRoLmNoYXJDb2RlQXQoMSkgPj0gNjUgLyogQSAqLyAmJiB1cmkucGF0aC5jaGFyQ29kZUF0KDEpIDw9IDkwIC8qIFogKi8gfHwgdXJpLnBhdGguY2hhckNvZGVBdCgxKSA+PSA5NyAvKiBhICovICYmIHVyaS5wYXRoLmNoYXJDb2RlQXQoMSkgPD0gMTIyIC8qIHogKi8pCiAgICAgICAgICAgICYmIHVyaS5wYXRoLmNoYXJDb2RlQXQoMikgPT09IDU4IC8qIENvbG9uICovKSB7CiAgICAgICAgICAgIGlmICgha2VlcERyaXZlTGV0dGVyQ2FzaW5nKSB7CiAgICAgICAgICAgICAgICAvLyB3aW5kb3dzIGRyaXZlIGxldHRlcjogZmlsZTovLy9jOi9mYXIvYm9vCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHVyaS5wYXRoWzFdLnRvTG93ZXJDYXNlKCkgKyB1cmkucGF0aC5zdWJzdHIoMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHVyaS5wYXRoLnN1YnN0cigxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gb3RoZXIgcGF0aAogICAgICAgICAgICB2YWx1ZSA9IHVyaS5wYXRoOwogICAgICAgIH0KICAgICAgICBpZiAoaXNXaW5kb3dzKSB7CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXC8vZywgJ1xcJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlIHRoZSBleHRlcm5hbCB2ZXJzaW9uIG9mIGEgdXJpCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9hc0Zvcm1hdHRlZCh1cmksIHNraXBFbmNvZGluZykgewogICAgICAgIGNvbnN0IGVuY29kZXIgPSAhc2tpcEVuY29kaW5nCiAgICAgICAgICAgID8gZW5jb2RlVVJJQ29tcG9uZW50RmFzdAogICAgICAgICAgICA6IGVuY29kZVVSSUNvbXBvbmVudE1pbmltYWw7CiAgICAgICAgbGV0IHJlcyA9ICcnOwogICAgICAgIGxldCB7IHNjaGVtZSwgYXV0aG9yaXR5LCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQgfSA9IHVyaTsKICAgICAgICBpZiAoc2NoZW1lKSB7CiAgICAgICAgICAgIHJlcyArPSBzY2hlbWU7CiAgICAgICAgICAgIHJlcyArPSAnOic7CiAgICAgICAgfQogICAgICAgIGlmIChhdXRob3JpdHkgfHwgc2NoZW1lID09PSAnZmlsZScpIHsKICAgICAgICAgICAgcmVzICs9IF9zbGFzaDsKICAgICAgICAgICAgcmVzICs9IF9zbGFzaDsKICAgICAgICB9CiAgICAgICAgaWYgKGF1dGhvcml0eSkgewogICAgICAgICAgICBsZXQgaWR4ID0gYXV0aG9yaXR5LmluZGV4T2YoJ0AnKTsKICAgICAgICAgICAgaWYgKGlkeCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIC8vIDx1c2VyPkA8YXV0aD4KICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJpbmZvID0gYXV0aG9yaXR5LnN1YnN0cigwLCBpZHgpOwogICAgICAgICAgICAgICAgYXV0aG9yaXR5ID0gYXV0aG9yaXR5LnN1YnN0cihpZHggKyAxKTsKICAgICAgICAgICAgICAgIGlkeCA9IHVzZXJpbmZvLmluZGV4T2YoJzonKTsKICAgICAgICAgICAgICAgIGlmIChpZHggPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzICs9IGVuY29kZXIodXNlcmluZm8sIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIDx1c2VyPjo8cGFzcz5APGF1dGg+CiAgICAgICAgICAgICAgICAgICAgcmVzICs9IGVuY29kZXIodXNlcmluZm8uc3Vic3RyKDAsIGlkeCksIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICByZXMgKz0gJzonOwogICAgICAgICAgICAgICAgICAgIHJlcyArPSBlbmNvZGVyKHVzZXJpbmZvLnN1YnN0cihpZHggKyAxKSwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzICs9ICdAJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBhdXRob3JpdHkgPSBhdXRob3JpdHkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgaWR4ID0gYXV0aG9yaXR5LmluZGV4T2YoJzonKTsKICAgICAgICAgICAgaWYgKGlkeCA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIHJlcyArPSBlbmNvZGVyKGF1dGhvcml0eSwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gPGF1dGg+Ojxwb3J0PgogICAgICAgICAgICAgICAgcmVzICs9IGVuY29kZXIoYXV0aG9yaXR5LnN1YnN0cigwLCBpZHgpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICByZXMgKz0gYXV0aG9yaXR5LnN1YnN0cihpZHgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChwYXRoKSB7CiAgICAgICAgICAgIC8vIGxvd2VyLWNhc2Ugd2luZG93cyBkcml2ZSBsZXR0ZXJzIGluIC9DOi9mZmYgb3IgQzovZmZmCiAgICAgICAgICAgIGlmIChwYXRoLmxlbmd0aCA+PSAzICYmIHBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyogU2xhc2ggKi8gJiYgcGF0aC5jaGFyQ29kZUF0KDIpID09PSA1OCAvKiBDb2xvbiAqLykgewogICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHBhdGguY2hhckNvZGVBdCgxKTsKICAgICAgICAgICAgICAgIGlmIChjb2RlID49IDY1IC8qIEEgKi8gJiYgY29kZSA8PSA5MCAvKiBaICovKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0aCA9IGAvJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUgKyAzMil9OiR7cGF0aC5zdWJzdHIoMyl9YDsgLy8gIi9jOiIubGVuZ3RoID09PSAzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocGF0aC5sZW5ndGggPj0gMiAmJiBwYXRoLmNoYXJDb2RlQXQoMSkgPT09IDU4IC8qIENvbG9uICovKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KDApOwogICAgICAgICAgICAgICAgaWYgKGNvZGUgPj0gNjUgLyogQSAqLyAmJiBjb2RlIDw9IDkwIC8qIFogKi8pIHsKICAgICAgICAgICAgICAgICAgICBwYXRoID0gYCR7U3RyaW5nLmZyb21DaGFyQ29kZShjb2RlICsgMzIpfToke3BhdGguc3Vic3RyKDIpfWA7IC8vICIvYzoiLmxlbmd0aCA9PT0gMwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGVuY29kZSB0aGUgcmVzdCBvZiB0aGUgcGF0aAogICAgICAgICAgICByZXMgKz0gZW5jb2RlcihwYXRoLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHF1ZXJ5KSB7CiAgICAgICAgICAgIHJlcyArPSAnPyc7CiAgICAgICAgICAgIHJlcyArPSBlbmNvZGVyKHF1ZXJ5LCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIGlmIChmcmFnbWVudCkgewogICAgICAgICAgICByZXMgKz0gJyMnOwogICAgICAgICAgICByZXMgKz0gIXNraXBFbmNvZGluZyA/IGVuY29kZVVSSUNvbXBvbmVudEZhc3QoZnJhZ21lbnQsIGZhbHNlKSA6IGZyYWdtZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzOwogICAgfQogICAgLy8gLS0tIGRlY29kZQogICAgZnVuY3Rpb24gZGVjb2RlVVJJQ29tcG9uZW50R3JhY2VmdWwoc3RyKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHIpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoX2EpIHsKICAgICAgICAgICAgaWYgKHN0ci5sZW5ndGggPiAzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyLnN1YnN0cigwLCAzKSArIGRlY29kZVVSSUNvbXBvbmVudEdyYWNlZnVsKHN0ci5zdWJzdHIoMykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IF9yRW5jb2RlZEFzSGV4ID0gLyglWzAtOUEtWmEtel1bMC05QS1aYS16XSkrL2c7CiAgICBmdW5jdGlvbiBwZXJjZW50RGVjb2RlKHN0cikgewogICAgICAgIGlmICghc3RyLm1hdGNoKF9yRW5jb2RlZEFzSGV4KSkgewogICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyLnJlcGxhY2UoX3JFbmNvZGVkQXNIZXgsIChtYXRjaCkgPT4gZGVjb2RlVVJJQ29tcG9uZW50R3JhY2VmdWwobWF0Y2gpKTsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIC8qKgogICAgICogQSBwb3NpdGlvbiBpbiB0aGUgZWRpdG9yLgogICAgICovCiAgICBjbGFzcyBQb3NpdGlvbiQxIHsKICAgICAgICBjb25zdHJ1Y3RvcihsaW5lTnVtYmVyLCBjb2x1bW4pIHsKICAgICAgICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKICAgICAgICAgICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZSBhIG5ldyBwb3NpdGlvbiBmcm9tIHRoaXMgcG9zaXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbmV3TGluZU51bWJlciBuZXcgbGluZSBudW1iZXIKICAgICAgICAgKiBAcGFyYW0gbmV3Q29sdW1uIG5ldyBjb2x1bW4KICAgICAgICAgKi8KICAgICAgICB3aXRoKG5ld0xpbmVOdW1iZXIgPSB0aGlzLmxpbmVOdW1iZXIsIG5ld0NvbHVtbiA9IHRoaXMuY29sdW1uKSB7CiAgICAgICAgICAgIGlmIChuZXdMaW5lTnVtYmVyID09PSB0aGlzLmxpbmVOdW1iZXIgJiYgbmV3Q29sdW1uID09PSB0aGlzLmNvbHVtbikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uJDEobmV3TGluZU51bWJlciwgbmV3Q29sdW1uKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXJpdmUgYSBuZXcgcG9zaXRpb24gZnJvbSB0aGlzIHBvc2l0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGRlbHRhTGluZU51bWJlciBsaW5lIG51bWJlciBkZWx0YQogICAgICAgICAqIEBwYXJhbSBkZWx0YUNvbHVtbiBjb2x1bW4gZGVsdGEKICAgICAgICAgKi8KICAgICAgICBkZWx0YShkZWx0YUxpbmVOdW1iZXIgPSAwLCBkZWx0YUNvbHVtbiA9IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMud2l0aCh0aGlzLmxpbmVOdW1iZXIgKyBkZWx0YUxpbmVOdW1iZXIsIHRoaXMuY29sdW1uICsgZGVsdGFDb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIHRoaXMgcG9zaXRpb24gZXF1YWxzIG90aGVyIHBvc2l0aW9uCiAgICAgICAgICovCiAgICAgICAgZXF1YWxzKG90aGVyKSB7CiAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbiQxLmVxdWFscyh0aGlzLCBvdGhlcik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgcG9zaXRpb24gYGFgIGVxdWFscyBwb3NpdGlvbiBgYmAKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgZXF1YWxzKGEsIGIpIHsKICAgICAgICAgICAgaWYgKCFhICYmICFiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKCEhYSAmJgogICAgICAgICAgICAgICAgISFiICYmCiAgICAgICAgICAgICAgICBhLmxpbmVOdW1iZXIgPT09IGIubGluZU51bWJlciAmJgogICAgICAgICAgICAgICAgYS5jb2x1bW4gPT09IGIuY29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiB0aGlzIHBvc2l0aW9uIGlzIGJlZm9yZSBvdGhlciBwb3NpdGlvbi4KICAgICAgICAgKiBJZiB0aGUgdHdvIHBvc2l0aW9ucyBhcmUgZXF1YWwsIHRoZSByZXN1bHQgd2lsbCBiZSBmYWxzZS4KICAgICAgICAgKi8KICAgICAgICBpc0JlZm9yZShvdGhlcikgewogICAgICAgICAgICByZXR1cm4gUG9zaXRpb24kMS5pc0JlZm9yZSh0aGlzLCBvdGhlcik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgcG9zaXRpb24gYGFgIGlzIGJlZm9yZSBwb3NpdGlvbiBgYmAuCiAgICAgICAgICogSWYgdGhlIHR3byBwb3NpdGlvbnMgYXJlIGVxdWFsLCB0aGUgcmVzdWx0IHdpbGwgYmUgZmFsc2UuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGlzQmVmb3JlKGEsIGIpIHsKICAgICAgICAgICAgaWYgKGEubGluZU51bWJlciA8IGIubGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGIubGluZU51bWJlciA8IGEubGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhLmNvbHVtbiA8IGIuY29sdW1uOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIHRoaXMgcG9zaXRpb24gaXMgYmVmb3JlIG90aGVyIHBvc2l0aW9uLgogICAgICAgICAqIElmIHRoZSB0d28gcG9zaXRpb25zIGFyZSBlcXVhbCwgdGhlIHJlc3VsdCB3aWxsIGJlIHRydWUuCiAgICAgICAgICovCiAgICAgICAgaXNCZWZvcmVPckVxdWFsKG90aGVyKSB7CiAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbiQxLmlzQmVmb3JlT3JFcXVhbCh0aGlzLCBvdGhlcik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgcG9zaXRpb24gYGFgIGlzIGJlZm9yZSBwb3NpdGlvbiBgYmAuCiAgICAgICAgICogSWYgdGhlIHR3byBwb3NpdGlvbnMgYXJlIGVxdWFsLCB0aGUgcmVzdWx0IHdpbGwgYmUgdHJ1ZS4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgaXNCZWZvcmVPckVxdWFsKGEsIGIpIHsKICAgICAgICAgICAgaWYgKGEubGluZU51bWJlciA8IGIubGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGIubGluZU51bWJlciA8IGEubGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhLmNvbHVtbiA8PSBiLmNvbHVtbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHBvc2l0aW9ucywgdXNlZnVsIGZvciBzb3J0aW5nCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGNvbXBhcmUoYSwgYikgewogICAgICAgICAgICBsZXQgYUxpbmVOdW1iZXIgPSBhLmxpbmVOdW1iZXIgfCAwOwogICAgICAgICAgICBsZXQgYkxpbmVOdW1iZXIgPSBiLmxpbmVOdW1iZXIgfCAwOwogICAgICAgICAgICBpZiAoYUxpbmVOdW1iZXIgPT09IGJMaW5lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICBsZXQgYUNvbHVtbiA9IGEuY29sdW1uIHwgMDsKICAgICAgICAgICAgICAgIGxldCBiQ29sdW1uID0gYi5jb2x1bW4gfCAwOwogICAgICAgICAgICAgICAgcmV0dXJuIGFDb2x1bW4gLSBiQ29sdW1uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhTGluZU51bWJlciAtIGJMaW5lTnVtYmVyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbG9uZSB0aGlzIHBvc2l0aW9uLgogICAgICAgICAqLwogICAgICAgIGNsb25lKCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uJDEodGhpcy5saW5lTnVtYmVyLCB0aGlzLmNvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnQgdG8gYSBodW1hbi1yZWFkYWJsZSByZXByZXNlbnRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICB0b1N0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuICcoJyArIHRoaXMubGluZU51bWJlciArICcsJyArIHRoaXMuY29sdW1uICsgJyknOwogICAgICAgIH0KICAgICAgICAvLyAtLS0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBgUG9zaXRpb25gIGZyb20gYW4gYElQb3NpdGlvbmAuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGxpZnQocG9zKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24kMShwb3MubGluZU51bWJlciwgcG9zLmNvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgYG9iamAgaXMgYW4gYElQb3NpdGlvbmAuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGlzSVBvc2l0aW9uKG9iaikgewogICAgICAgICAgICByZXR1cm4gKG9iagogICAgICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmoubGluZU51bWJlciA9PT0gJ251bWJlcicpCiAgICAgICAgICAgICAgICAmJiAodHlwZW9mIG9iai5jb2x1bW4gPT09ICdudW1iZXInKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgLyoqCiAgICAgKiBBIHJhbmdlIGluIHRoZSBlZGl0b3IuIChzdGFydExpbmVOdW1iZXIsc3RhcnRDb2x1bW4pIGlzIDw9IChlbmRMaW5lTnVtYmVyLGVuZENvbHVtbikKICAgICAqLwogICAgY2xhc3MgUmFuZ2UkMSB7CiAgICAgICAgY29uc3RydWN0b3Ioc3RhcnRMaW5lTnVtYmVyLCBzdGFydENvbHVtbiwgZW5kTGluZU51bWJlciwgZW5kQ29sdW1uKSB7CiAgICAgICAgICAgIGlmICgoc3RhcnRMaW5lTnVtYmVyID4gZW5kTGluZU51bWJlcikgfHwgKHN0YXJ0TGluZU51bWJlciA9PT0gZW5kTGluZU51bWJlciAmJiBzdGFydENvbHVtbiA+IGVuZENvbHVtbikpIHsKICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRMaW5lTnVtYmVyID0gZW5kTGluZU51bWJlcjsKICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRDb2x1bW4gPSBlbmRDb2x1bW47CiAgICAgICAgICAgICAgICB0aGlzLmVuZExpbmVOdW1iZXIgPSBzdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICB0aGlzLmVuZENvbHVtbiA9IHN0YXJ0Q29sdW1uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5zdGFydExpbmVOdW1iZXIgPSBzdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0Q29sdW1uID0gc3RhcnRDb2x1bW47CiAgICAgICAgICAgICAgICB0aGlzLmVuZExpbmVOdW1iZXIgPSBlbmRMaW5lTnVtYmVyOwogICAgICAgICAgICAgICAgdGhpcy5lbmRDb2x1bW4gPSBlbmRDb2x1bW47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiB0aGlzIHJhbmdlIGlzIGVtcHR5LgogICAgICAgICAqLwogICAgICAgIGlzRW1wdHkoKSB7CiAgICAgICAgICAgIHJldHVybiBSYW5nZSQxLmlzRW1wdHkodGhpcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgYHJhbmdlYCBpcyBlbXB0eS4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgaXNFbXB0eShyYW5nZSkgewogICAgICAgICAgICByZXR1cm4gKHJhbmdlLnN0YXJ0TGluZU51bWJlciA9PT0gcmFuZ2UuZW5kTGluZU51bWJlciAmJiByYW5nZS5zdGFydENvbHVtbiA9PT0gcmFuZ2UuZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiBwb3NpdGlvbiBpcyBpbiB0aGlzIHJhbmdlLiBJZiB0aGUgcG9zaXRpb24gaXMgYXQgdGhlIGVkZ2VzLCB3aWxsIHJldHVybiB0cnVlLgogICAgICAgICAqLwogICAgICAgIGNvbnRhaW5zUG9zaXRpb24ocG9zaXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIFJhbmdlJDEuY29udGFpbnNQb3NpdGlvbih0aGlzLCBwb3NpdGlvbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgYHBvc2l0aW9uYCBpcyBpbiBgcmFuZ2VgLiBJZiB0aGUgcG9zaXRpb24gaXMgYXQgdGhlIGVkZ2VzLCB3aWxsIHJldHVybiB0cnVlLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjb250YWluc1Bvc2l0aW9uKHJhbmdlLCBwb3NpdGlvbikgewogICAgICAgICAgICBpZiAocG9zaXRpb24ubGluZU51bWJlciA8IHJhbmdlLnN0YXJ0TGluZU51bWJlciB8fCBwb3NpdGlvbi5saW5lTnVtYmVyID4gcmFuZ2UuZW5kTGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwb3NpdGlvbi5saW5lTnVtYmVyID09PSByYW5nZS5zdGFydExpbmVOdW1iZXIgJiYgcG9zaXRpb24uY29sdW1uIDwgcmFuZ2Uuc3RhcnRDb2x1bW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocG9zaXRpb24ubGluZU51bWJlciA9PT0gcmFuZ2UuZW5kTGluZU51bWJlciAmJiBwb3NpdGlvbi5jb2x1bW4gPiByYW5nZS5lbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiBgcG9zaXRpb25gIGlzIGluIGByYW5nZWAuIElmIHRoZSBwb3NpdGlvbiBpcyBhdCB0aGUgZWRnZXMsIHdpbGwgcmV0dXJuIGZhbHNlLgogICAgICAgICAqIEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBzdHJpY3RDb250YWluc1Bvc2l0aW9uKHJhbmdlLCBwb3NpdGlvbikgewogICAgICAgICAgICBpZiAocG9zaXRpb24ubGluZU51bWJlciA8IHJhbmdlLnN0YXJ0TGluZU51bWJlciB8fCBwb3NpdGlvbi5saW5lTnVtYmVyID4gcmFuZ2UuZW5kTGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwb3NpdGlvbi5saW5lTnVtYmVyID09PSByYW5nZS5zdGFydExpbmVOdW1iZXIgJiYgcG9zaXRpb24uY29sdW1uIDw9IHJhbmdlLnN0YXJ0Q29sdW1uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmVOdW1iZXIgPT09IHJhbmdlLmVuZExpbmVOdW1iZXIgJiYgcG9zaXRpb24uY29sdW1uID49IHJhbmdlLmVuZENvbHVtbikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIHJhbmdlIGlzIGluIHRoaXMgcmFuZ2UuIElmIHRoZSByYW5nZSBpcyBlcXVhbCB0byB0aGlzIHJhbmdlLCB3aWxsIHJldHVybiB0cnVlLgogICAgICAgICAqLwogICAgICAgIGNvbnRhaW5zUmFuZ2UocmFuZ2UpIHsKICAgICAgICAgICAgcmV0dXJuIFJhbmdlJDEuY29udGFpbnNSYW5nZSh0aGlzLCByYW5nZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgYG90aGVyUmFuZ2VgIGlzIGluIGByYW5nZWAuIElmIHRoZSByYW5nZXMgYXJlIGVxdWFsLCB3aWxsIHJldHVybiB0cnVlLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjb250YWluc1JhbmdlKHJhbmdlLCBvdGhlclJhbmdlKSB7CiAgICAgICAgICAgIGlmIChvdGhlclJhbmdlLnN0YXJ0TGluZU51bWJlciA8IHJhbmdlLnN0YXJ0TGluZU51bWJlciB8fCBvdGhlclJhbmdlLmVuZExpbmVOdW1iZXIgPCByYW5nZS5zdGFydExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3RoZXJSYW5nZS5zdGFydExpbmVOdW1iZXIgPiByYW5nZS5lbmRMaW5lTnVtYmVyIHx8IG90aGVyUmFuZ2UuZW5kTGluZU51bWJlciA+IHJhbmdlLmVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3RoZXJSYW5nZS5zdGFydExpbmVOdW1iZXIgPT09IHJhbmdlLnN0YXJ0TGluZU51bWJlciAmJiBvdGhlclJhbmdlLnN0YXJ0Q29sdW1uIDwgcmFuZ2Uuc3RhcnRDb2x1bW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3RoZXJSYW5nZS5lbmRMaW5lTnVtYmVyID09PSByYW5nZS5lbmRMaW5lTnVtYmVyICYmIG90aGVyUmFuZ2UuZW5kQ29sdW1uID4gcmFuZ2UuZW5kQ29sdW1uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgYHJhbmdlYCBpcyBzdHJpY3RseSBpbiB0aGlzIHJhbmdlLiBgcmFuZ2VgIG11c3Qgc3RhcnQgYWZ0ZXIgYW5kIGVuZCBiZWZvcmUgdGhpcyByYW5nZSBmb3IgdGhlIHJlc3VsdCB0byBiZSB0cnVlLgogICAgICAgICAqLwogICAgICAgIHN0cmljdENvbnRhaW5zUmFuZ2UocmFuZ2UpIHsKICAgICAgICAgICAgcmV0dXJuIFJhbmdlJDEuc3RyaWN0Q29udGFpbnNSYW5nZSh0aGlzLCByYW5nZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgYG90aGVyUmFuZ2VgIGlzIHN0cmljdGx5IGluIGByYW5nZWAgKG11c3Qgc3RhcnQgYWZ0ZXIsIGFuZCBlbmQgYmVmb3JlKS4gSWYgdGhlIHJhbmdlcyBhcmUgZXF1YWwsIHdpbGwgcmV0dXJuIGZhbHNlLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBzdHJpY3RDb250YWluc1JhbmdlKHJhbmdlLCBvdGhlclJhbmdlKSB7CiAgICAgICAgICAgIGlmIChvdGhlclJhbmdlLnN0YXJ0TGluZU51bWJlciA8IHJhbmdlLnN0YXJ0TGluZU51bWJlciB8fCBvdGhlclJhbmdlLmVuZExpbmVOdW1iZXIgPCByYW5nZS5zdGFydExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3RoZXJSYW5nZS5zdGFydExpbmVOdW1iZXIgPiByYW5nZS5lbmRMaW5lTnVtYmVyIHx8IG90aGVyUmFuZ2UuZW5kTGluZU51bWJlciA+IHJhbmdlLmVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3RoZXJSYW5nZS5zdGFydExpbmVOdW1iZXIgPT09IHJhbmdlLnN0YXJ0TGluZU51bWJlciAmJiBvdGhlclJhbmdlLnN0YXJ0Q29sdW1uIDw9IHJhbmdlLnN0YXJ0Q29sdW1uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG90aGVyUmFuZ2UuZW5kTGluZU51bWJlciA9PT0gcmFuZ2UuZW5kTGluZU51bWJlciAmJiBvdGhlclJhbmdlLmVuZENvbHVtbiA+PSByYW5nZS5lbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSByZXVuaW9uIG9mIHRoZSB0d28gcmFuZ2VzLgogICAgICAgICAqIFRoZSBzbWFsbGVzdCBwb3NpdGlvbiB3aWxsIGJlIHVzZWQgYXMgdGhlIHN0YXJ0IHBvaW50LCBhbmQgdGhlIGxhcmdlc3Qgb25lIGFzIHRoZSBlbmQgcG9pbnQuCiAgICAgICAgICovCiAgICAgICAgcGx1c1JhbmdlKHJhbmdlKSB7CiAgICAgICAgICAgIHJldHVybiBSYW5nZSQxLnBsdXNSYW5nZSh0aGlzLCByYW5nZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEEgcmV1bmlvbiBvZiB0aGUgdHdvIHJhbmdlcy4KICAgICAgICAgKiBUaGUgc21hbGxlc3QgcG9zaXRpb24gd2lsbCBiZSB1c2VkIGFzIHRoZSBzdGFydCBwb2ludCwgYW5kIHRoZSBsYXJnZXN0IG9uZSBhcyB0aGUgZW5kIHBvaW50LgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBwbHVzUmFuZ2UoYSwgYikgewogICAgICAgICAgICBsZXQgc3RhcnRMaW5lTnVtYmVyOwogICAgICAgICAgICBsZXQgc3RhcnRDb2x1bW47CiAgICAgICAgICAgIGxldCBlbmRMaW5lTnVtYmVyOwogICAgICAgICAgICBsZXQgZW5kQ29sdW1uOwogICAgICAgICAgICBpZiAoYi5zdGFydExpbmVOdW1iZXIgPCBhLnN0YXJ0TGluZU51bWJlcikgewogICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyID0gYi5zdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICBzdGFydENvbHVtbiA9IGIuc3RhcnRDb2x1bW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoYi5zdGFydExpbmVOdW1iZXIgPT09IGEuc3RhcnRMaW5lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICBzdGFydExpbmVOdW1iZXIgPSBiLnN0YXJ0TGluZU51bWJlcjsKICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uID0gTWF0aC5taW4oYi5zdGFydENvbHVtbiwgYS5zdGFydENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdGFydExpbmVOdW1iZXIgPSBhLnN0YXJ0TGluZU51bWJlcjsKICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uID0gYS5zdGFydENvbHVtbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYi5lbmRMaW5lTnVtYmVyID4gYS5lbmRMaW5lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICBlbmRMaW5lTnVtYmVyID0gYi5lbmRMaW5lTnVtYmVyOwogICAgICAgICAgICAgICAgZW5kQ29sdW1uID0gYi5lbmRDb2x1bW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoYi5lbmRMaW5lTnVtYmVyID09PSBhLmVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIGVuZExpbmVOdW1iZXIgPSBiLmVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICBlbmRDb2x1bW4gPSBNYXRoLm1heChiLmVuZENvbHVtbiwgYS5lbmRDb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZW5kTGluZU51bWJlciA9IGEuZW5kTGluZU51bWJlcjsKICAgICAgICAgICAgICAgIGVuZENvbHVtbiA9IGEuZW5kQ29sdW1uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UkMShzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uLCBlbmRMaW5lTnVtYmVyLCBlbmRDb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIHJhbmdlcy4KICAgICAgICAgKi8KICAgICAgICBpbnRlcnNlY3RSYW5nZXMocmFuZ2UpIHsKICAgICAgICAgICAgcmV0dXJuIFJhbmdlJDEuaW50ZXJzZWN0UmFuZ2VzKHRoaXMsIHJhbmdlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byByYW5nZXMuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGludGVyc2VjdFJhbmdlcyhhLCBiKSB7CiAgICAgICAgICAgIGxldCByZXN1bHRTdGFydExpbmVOdW1iZXIgPSBhLnN0YXJ0TGluZU51bWJlcjsKICAgICAgICAgICAgbGV0IHJlc3VsdFN0YXJ0Q29sdW1uID0gYS5zdGFydENvbHVtbjsKICAgICAgICAgICAgbGV0IHJlc3VsdEVuZExpbmVOdW1iZXIgPSBhLmVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgIGxldCByZXN1bHRFbmRDb2x1bW4gPSBhLmVuZENvbHVtbjsKICAgICAgICAgICAgbGV0IG90aGVyU3RhcnRMaW5lTnVtYmVyID0gYi5zdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIGxldCBvdGhlclN0YXJ0Q29sdW1uID0gYi5zdGFydENvbHVtbjsKICAgICAgICAgICAgbGV0IG90aGVyRW5kTGluZU51bWJlciA9IGIuZW5kTGluZU51bWJlcjsKICAgICAgICAgICAgbGV0IG90aGVyRW5kQ29sdW1uID0gYi5lbmRDb2x1bW47CiAgICAgICAgICAgIGlmIChyZXN1bHRTdGFydExpbmVOdW1iZXIgPCBvdGhlclN0YXJ0TGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcmVzdWx0U3RhcnRMaW5lTnVtYmVyID0gb3RoZXJTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICByZXN1bHRTdGFydENvbHVtbiA9IG90aGVyU3RhcnRDb2x1bW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocmVzdWx0U3RhcnRMaW5lTnVtYmVyID09PSBvdGhlclN0YXJ0TGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcmVzdWx0U3RhcnRDb2x1bW4gPSBNYXRoLm1heChyZXN1bHRTdGFydENvbHVtbiwgb3RoZXJTdGFydENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlc3VsdEVuZExpbmVOdW1iZXIgPiBvdGhlckVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJlc3VsdEVuZExpbmVOdW1iZXIgPSBvdGhlckVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICByZXN1bHRFbmRDb2x1bW4gPSBvdGhlckVuZENvbHVtbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChyZXN1bHRFbmRMaW5lTnVtYmVyID09PSBvdGhlckVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJlc3VsdEVuZENvbHVtbiA9IE1hdGgubWluKHJlc3VsdEVuZENvbHVtbiwgb3RoZXJFbmRDb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENoZWNrIGlmIHNlbGVjdGlvbiBpcyBub3cgZW1wdHkKICAgICAgICAgICAgaWYgKHJlc3VsdFN0YXJ0TGluZU51bWJlciA+IHJlc3VsdEVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZXN1bHRTdGFydExpbmVOdW1iZXIgPT09IHJlc3VsdEVuZExpbmVOdW1iZXIgJiYgcmVzdWx0U3RhcnRDb2x1bW4gPiByZXN1bHRFbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UkMShyZXN1bHRTdGFydExpbmVOdW1iZXIsIHJlc3VsdFN0YXJ0Q29sdW1uLCByZXN1bHRFbmRMaW5lTnVtYmVyLCByZXN1bHRFbmRDb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIHRoaXMgcmFuZ2UgZXF1YWxzIG90aGVyLgogICAgICAgICAqLwogICAgICAgIGVxdWFsc1JhbmdlKG90aGVyKSB7CiAgICAgICAgICAgIHJldHVybiBSYW5nZSQxLmVxdWFsc1JhbmdlKHRoaXMsIG90aGVyKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiByYW5nZSBgYWAgZXF1YWxzIGBiYC4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgZXF1YWxzUmFuZ2UoYSwgYikgewogICAgICAgICAgICByZXR1cm4gKCEhYSAmJgogICAgICAgICAgICAgICAgISFiICYmCiAgICAgICAgICAgICAgICBhLnN0YXJ0TGluZU51bWJlciA9PT0gYi5zdGFydExpbmVOdW1iZXIgJiYKICAgICAgICAgICAgICAgIGEuc3RhcnRDb2x1bW4gPT09IGIuc3RhcnRDb2x1bW4gJiYKICAgICAgICAgICAgICAgIGEuZW5kTGluZU51bWJlciA9PT0gYi5lbmRMaW5lTnVtYmVyICYmCiAgICAgICAgICAgICAgICBhLmVuZENvbHVtbiA9PT0gYi5lbmRDb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm4gdGhlIGVuZCBwb3NpdGlvbiAod2hpY2ggd2lsbCBiZSBhZnRlciBvciBlcXVhbCB0byB0aGUgc3RhcnQgcG9zaXRpb24pCiAgICAgICAgICovCiAgICAgICAgZ2V0RW5kUG9zaXRpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBSYW5nZSQxLmdldEVuZFBvc2l0aW9uKHRoaXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm4gdGhlIGVuZCBwb3NpdGlvbiAod2hpY2ggd2lsbCBiZSBhZnRlciBvciBlcXVhbCB0byB0aGUgc3RhcnQgcG9zaXRpb24pCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGdldEVuZFBvc2l0aW9uKHJhbmdlKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24kMShyYW5nZS5lbmRMaW5lTnVtYmVyLCByYW5nZS5lbmRDb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm4gdGhlIHN0YXJ0IHBvc2l0aW9uICh3aGljaCB3aWxsIGJlIGJlZm9yZSBvciBlcXVhbCB0byB0aGUgZW5kIHBvc2l0aW9uKQogICAgICAgICAqLwogICAgICAgIGdldFN0YXJ0UG9zaXRpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBSYW5nZSQxLmdldFN0YXJ0UG9zaXRpb24odGhpcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiB0aGUgc3RhcnQgcG9zaXRpb24gKHdoaWNoIHdpbGwgYmUgYmVmb3JlIG9yIGVxdWFsIHRvIHRoZSBlbmQgcG9zaXRpb24pCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGdldFN0YXJ0UG9zaXRpb24ocmFuZ2UpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3NpdGlvbiQxKHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2Uuc3RhcnRDb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUcmFuc2Zvcm0gdG8gYSB1c2VyIHByZXNlbnRhYmxlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KICAgICAgICAgKi8KICAgICAgICB0b1N0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuICdbJyArIHRoaXMuc3RhcnRMaW5lTnVtYmVyICsgJywnICsgdGhpcy5zdGFydENvbHVtbiArICcgLT4gJyArIHRoaXMuZW5kTGluZU51bWJlciArICcsJyArIHRoaXMuZW5kQ29sdW1uICsgJ10nOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBuZXcgcmFuZ2UgdXNpbmcgdGhpcyByYW5nZSdzIHN0YXJ0IHBvc2l0aW9uLCBhbmQgdXNpbmcgZW5kTGluZU51bWJlciBhbmQgZW5kQ29sdW1uIGFzIHRoZSBlbmQgcG9zaXRpb24uCiAgICAgICAgICovCiAgICAgICAgc2V0RW5kUG9zaXRpb24oZW5kTGluZU51bWJlciwgZW5kQ29sdW1uKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UkMSh0aGlzLnN0YXJ0TGluZU51bWJlciwgdGhpcy5zdGFydENvbHVtbiwgZW5kTGluZU51bWJlciwgZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlIGEgbmV3IHJhbmdlIHVzaW5nIHRoaXMgcmFuZ2UncyBlbmQgcG9zaXRpb24sIGFuZCB1c2luZyBzdGFydExpbmVOdW1iZXIgYW5kIHN0YXJ0Q29sdW1uIGFzIHRoZSBzdGFydCBwb3NpdGlvbi4KICAgICAgICAgKi8KICAgICAgICBzZXRTdGFydFBvc2l0aW9uKHN0YXJ0TGluZU51bWJlciwgc3RhcnRDb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSQxKHN0YXJ0TGluZU51bWJlciwgc3RhcnRDb2x1bW4sIHRoaXMuZW5kTGluZU51bWJlciwgdGhpcy5lbmRDb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW1wdHkgcmFuZ2UgdXNpbmcgdGhpcyByYW5nZSdzIHN0YXJ0IHBvc2l0aW9uLgogICAgICAgICAqLwogICAgICAgIGNvbGxhcHNlVG9TdGFydCgpIHsKICAgICAgICAgICAgcmV0dXJuIFJhbmdlJDEuY29sbGFwc2VUb1N0YXJ0KHRoaXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW1wdHkgcmFuZ2UgdXNpbmcgdGhpcyByYW5nZSdzIHN0YXJ0IHBvc2l0aW9uLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjb2xsYXBzZVRvU3RhcnQocmFuZ2UpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSQxKHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2Uuc3RhcnRDb2x1bW4sIHJhbmdlLnN0YXJ0TGluZU51bWJlciwgcmFuZ2Uuc3RhcnRDb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvLyAtLS0KICAgICAgICBzdGF0aWMgZnJvbVBvc2l0aW9ucyhzdGFydCwgZW5kID0gc3RhcnQpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSQxKHN0YXJ0LmxpbmVOdW1iZXIsIHN0YXJ0LmNvbHVtbiwgZW5kLmxpbmVOdW1iZXIsIGVuZC5jb2x1bW4pOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgbGlmdChyYW5nZSkgewogICAgICAgICAgICBpZiAoIXJhbmdlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFJhbmdlJDEocmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLCByYW5nZS5zdGFydENvbHVtbiwgcmFuZ2UuZW5kTGluZU51bWJlciwgcmFuZ2UuZW5kQ29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiBgb2JqYCBpcyBhbiBgSVJhbmdlYC4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgaXNJUmFuZ2Uob2JqKSB7CiAgICAgICAgICAgIHJldHVybiAob2JqCiAgICAgICAgICAgICAgICAmJiAodHlwZW9mIG9iai5zdGFydExpbmVOdW1iZXIgPT09ICdudW1iZXInKQogICAgICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmouc3RhcnRDb2x1bW4gPT09ICdudW1iZXInKQogICAgICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmouZW5kTGluZU51bWJlciA9PT0gJ251bWJlcicpCiAgICAgICAgICAgICAgICAmJiAodHlwZW9mIG9iai5lbmRDb2x1bW4gPT09ICdudW1iZXInKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgdGhlIHR3byByYW5nZXMgYXJlIHRvdWNoaW5nIGluIGFueSB3YXkuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGFyZUludGVyc2VjdGluZ09yVG91Y2hpbmcoYSwgYikgewogICAgICAgICAgICAvLyBDaGVjayBpZiBgYWAgaXMgYmVmb3JlIGBiYAogICAgICAgICAgICBpZiAoYS5lbmRMaW5lTnVtYmVyIDwgYi5zdGFydExpbmVOdW1iZXIgfHwgKGEuZW5kTGluZU51bWJlciA9PT0gYi5zdGFydExpbmVOdW1iZXIgJiYgYS5lbmRDb2x1bW4gPCBiLnN0YXJ0Q29sdW1uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENoZWNrIGlmIGBiYCBpcyBiZWZvcmUgYGFgCiAgICAgICAgICAgIGlmIChiLmVuZExpbmVOdW1iZXIgPCBhLnN0YXJ0TGluZU51bWJlciB8fCAoYi5lbmRMaW5lTnVtYmVyID09PSBhLnN0YXJ0TGluZU51bWJlciAmJiBiLmVuZENvbHVtbiA8IGEuc3RhcnRDb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlc2UgcmFuZ2VzIG11c3QgaW50ZXJzZWN0CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIHRoZSB0d28gcmFuZ2VzIGFyZSBpbnRlcnNlY3RpbmcuIElmIHRoZSByYW5nZXMgYXJlIHRvdWNoaW5nIGl0IHJldHVybnMgdHJ1ZS4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgYXJlSW50ZXJzZWN0aW5nKGEsIGIpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYGFgIGlzIGJlZm9yZSBgYmAKICAgICAgICAgICAgaWYgKGEuZW5kTGluZU51bWJlciA8IGIuc3RhcnRMaW5lTnVtYmVyIHx8IChhLmVuZExpbmVOdW1iZXIgPT09IGIuc3RhcnRMaW5lTnVtYmVyICYmIGEuZW5kQ29sdW1uIDw9IGIuc3RhcnRDb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYGJgIGlzIGJlZm9yZSBgYWAKICAgICAgICAgICAgaWYgKGIuZW5kTGluZU51bWJlciA8IGEuc3RhcnRMaW5lTnVtYmVyIHx8IChiLmVuZExpbmVOdW1iZXIgPT09IGEuc3RhcnRMaW5lTnVtYmVyICYmIGIuZW5kQ29sdW1uIDw9IGEuc3RhcnRDb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlc2UgcmFuZ2VzIG11c3QgaW50ZXJzZWN0CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMgcmFuZ2VzLCB1c2VmdWwgZm9yIHNvcnRpbmcgcmFuZ2VzCiAgICAgICAgICogSXQgd2lsbCBmaXJzdCBjb21wYXJlIHJhbmdlcyBvbiB0aGUgc3RhcnRQb3NpdGlvbiBhbmQgdGhlbiBvbiB0aGUgZW5kUG9zaXRpb24KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY29tcGFyZVJhbmdlc1VzaW5nU3RhcnRzKGEsIGIpIHsKICAgICAgICAgICAgaWYgKGEgJiYgYikgewogICAgICAgICAgICAgICAgY29uc3QgYVN0YXJ0TGluZU51bWJlciA9IGEuc3RhcnRMaW5lTnVtYmVyIHwgMDsKICAgICAgICAgICAgICAgIGNvbnN0IGJTdGFydExpbmVOdW1iZXIgPSBiLnN0YXJ0TGluZU51bWJlciB8IDA7CiAgICAgICAgICAgICAgICBpZiAoYVN0YXJ0TGluZU51bWJlciA9PT0gYlN0YXJ0TGluZU51bWJlcikgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFTdGFydENvbHVtbiA9IGEuc3RhcnRDb2x1bW4gfCAwOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGJTdGFydENvbHVtbiA9IGIuc3RhcnRDb2x1bW4gfCAwOwogICAgICAgICAgICAgICAgICAgIGlmIChhU3RhcnRDb2x1bW4gPT09IGJTdGFydENvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhRW5kTGluZU51bWJlciA9IGEuZW5kTGluZU51bWJlciB8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJFbmRMaW5lTnVtYmVyID0gYi5lbmRMaW5lTnVtYmVyIHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFFbmRMaW5lTnVtYmVyID09PSBiRW5kTGluZU51bWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYUVuZENvbHVtbiA9IGEuZW5kQ29sdW1uIHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJFbmRDb2x1bW4gPSBiLmVuZENvbHVtbiB8IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYUVuZENvbHVtbiAtIGJFbmRDb2x1bW47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFFbmRMaW5lTnVtYmVyIC0gYkVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhU3RhcnRDb2x1bW4gLSBiU3RhcnRDb2x1bW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gYVN0YXJ0TGluZU51bWJlciAtIGJTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgYUV4aXN0cyA9IChhID8gMSA6IDApOwogICAgICAgICAgICBjb25zdCBiRXhpc3RzID0gKGIgPyAxIDogMCk7CiAgICAgICAgICAgIHJldHVybiBhRXhpc3RzIC0gYkV4aXN0czsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGNvbXBhcmVzIHJhbmdlcywgdXNlZnVsIGZvciBzb3J0aW5nIHJhbmdlcwogICAgICAgICAqIEl0IHdpbGwgZmlyc3QgY29tcGFyZSByYW5nZXMgb24gdGhlIGVuZFBvc2l0aW9uIGFuZCB0aGVuIG9uIHRoZSBzdGFydFBvc2l0aW9uCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGNvbXBhcmVSYW5nZXNVc2luZ0VuZHMoYSwgYikgewogICAgICAgICAgICBpZiAoYS5lbmRMaW5lTnVtYmVyID09PSBiLmVuZExpbmVOdW1iZXIpIHsKICAgICAgICAgICAgICAgIGlmIChhLmVuZENvbHVtbiA9PT0gYi5lbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYS5zdGFydExpbmVOdW1iZXIgPT09IGIuc3RhcnRMaW5lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLnN0YXJ0Q29sdW1uIC0gYi5zdGFydENvbHVtbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGEuc3RhcnRMaW5lTnVtYmVyIC0gYi5zdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gYS5lbmRDb2x1bW4gLSBiLmVuZENvbHVtbjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYS5lbmRMaW5lTnVtYmVyIC0gYi5lbmRMaW5lTnVtYmVyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUZXN0IGlmIHRoZSByYW5nZSBzcGFucyBtdWx0aXBsZSBsaW5lcy4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgc3BhbnNNdWx0aXBsZUxpbmVzKHJhbmdlKSB7CiAgICAgICAgICAgIHJldHVybiByYW5nZS5lbmRMaW5lTnVtYmVyID4gcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyOwogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGNvbnN0IE1JTklNVU1fTUFUQ0hJTkdfQ0hBUkFDVEVSX0xFTkdUSCA9IDM7CiAgICBmdW5jdGlvbiBjb21wdXRlRGlmZihvcmlnaW5hbFNlcXVlbmNlLCBtb2RpZmllZFNlcXVlbmNlLCBjb250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUsIHByZXR0eSkgewogICAgICAgIGNvbnN0IGRpZmZBbGdvID0gbmV3IExjc0RpZmYob3JpZ2luYWxTZXF1ZW5jZSwgbW9kaWZpZWRTZXF1ZW5jZSwgY29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlKTsKICAgICAgICByZXR1cm4gZGlmZkFsZ28uQ29tcHV0ZURpZmYocHJldHR5KTsKICAgIH0KICAgIGNsYXNzIExpbmVTZXF1ZW5jZSB7CiAgICAgICAgY29uc3RydWN0b3IobGluZXMpIHsKICAgICAgICAgICAgY29uc3Qgc3RhcnRDb2x1bW5zID0gW107CiAgICAgICAgICAgIGNvbnN0IGVuZENvbHVtbnMgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGxpbmVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBzdGFydENvbHVtbnNbaV0gPSBnZXRGaXJzdE5vbkJsYW5rQ29sdW1uKGxpbmVzW2ldLCAxKTsKICAgICAgICAgICAgICAgIGVuZENvbHVtbnNbaV0gPSBnZXRMYXN0Tm9uQmxhbmtDb2x1bW4obGluZXNbaV0sIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMubGluZXMgPSBsaW5lczsKICAgICAgICAgICAgdGhpcy5fc3RhcnRDb2x1bW5zID0gc3RhcnRDb2x1bW5zOwogICAgICAgICAgICB0aGlzLl9lbmRDb2x1bW5zID0gZW5kQ29sdW1uczsKICAgICAgICB9CiAgICAgICAgZ2V0RWxlbWVudHMoKSB7CiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gW107CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLmxpbmVzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50c1tpXSA9IHRoaXMubGluZXNbaV0uc3Vic3RyaW5nKHRoaXMuX3N0YXJ0Q29sdW1uc1tpXSAtIDEsIHRoaXMuX2VuZENvbHVtbnNbaV0gLSAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZWxlbWVudHM7CiAgICAgICAgfQogICAgICAgIGdldFN0cmljdEVsZW1lbnQoaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubGluZXNbaW5kZXhdOwogICAgICAgIH0KICAgICAgICBnZXRTdGFydExpbmVOdW1iZXIoaSkgewogICAgICAgICAgICByZXR1cm4gaSArIDE7CiAgICAgICAgfQogICAgICAgIGdldEVuZExpbmVOdW1iZXIoaSkgewogICAgICAgICAgICByZXR1cm4gaSArIDE7CiAgICAgICAgfQogICAgICAgIGNyZWF0ZUNoYXJTZXF1ZW5jZShzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgICAgICAgICAgY29uc3QgY2hhckNvZGVzID0gW107CiAgICAgICAgICAgIGNvbnN0IGxpbmVOdW1iZXJzID0gW107CiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSBbXTsKICAgICAgICAgICAgbGV0IGxlbiA9IDA7CiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggPD0gZW5kSW5kZXg7IGluZGV4KyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gdGhpcy5saW5lc1tpbmRleF07CiAgICAgICAgICAgICAgICBjb25zdCBzdGFydENvbHVtbiA9IChzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSA/IHRoaXMuX3N0YXJ0Q29sdW1uc1tpbmRleF0gOiAxKTsKICAgICAgICAgICAgICAgIGNvbnN0IGVuZENvbHVtbiA9IChzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSA/IHRoaXMuX2VuZENvbHVtbnNbaW5kZXhdIDogbGluZUNvbnRlbnQubGVuZ3RoICsgMSk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2wgPSBzdGFydENvbHVtbjsgY29sIDwgZW5kQ29sdW1uOyBjb2wrKykgewogICAgICAgICAgICAgICAgICAgIGNoYXJDb2Rlc1tsZW5dID0gbGluZUNvbnRlbnQuY2hhckNvZGVBdChjb2wgLSAxKTsKICAgICAgICAgICAgICAgICAgICBsaW5lTnVtYmVyc1tsZW5dID0gaW5kZXggKyAxOwogICAgICAgICAgICAgICAgICAgIGNvbHVtbnNbbGVuXSA9IGNvbDsKICAgICAgICAgICAgICAgICAgICBsZW4rKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IENoYXJTZXF1ZW5jZShjaGFyQ29kZXMsIGxpbmVOdW1iZXJzLCBjb2x1bW5zKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBDaGFyU2VxdWVuY2UgewogICAgICAgIGNvbnN0cnVjdG9yKGNoYXJDb2RlcywgbGluZU51bWJlcnMsIGNvbHVtbnMpIHsKICAgICAgICAgICAgdGhpcy5fY2hhckNvZGVzID0gY2hhckNvZGVzOwogICAgICAgICAgICB0aGlzLl9saW5lTnVtYmVycyA9IGxpbmVOdW1iZXJzOwogICAgICAgICAgICB0aGlzLl9jb2x1bW5zID0gY29sdW1uczsKICAgICAgICB9CiAgICAgICAgZ2V0RWxlbWVudHMoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGFyQ29kZXM7CiAgICAgICAgfQogICAgICAgIGdldFN0YXJ0TGluZU51bWJlcihpKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW5lTnVtYmVyc1tpXTsKICAgICAgICB9CiAgICAgICAgZ2V0U3RhcnRDb2x1bW4oaSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uc1tpXTsKICAgICAgICB9CiAgICAgICAgZ2V0RW5kTGluZU51bWJlcihpKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW5lTnVtYmVyc1tpXTsKICAgICAgICB9CiAgICAgICAgZ2V0RW5kQ29sdW1uKGkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnNbaV0gKyAxOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIENoYXJDaGFuZ2UgewogICAgICAgIGNvbnN0cnVjdG9yKG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyLCBvcmlnaW5hbFN0YXJ0Q29sdW1uLCBvcmlnaW5hbEVuZExpbmVOdW1iZXIsIG9yaWdpbmFsRW5kQ29sdW1uLCBtb2RpZmllZFN0YXJ0TGluZU51bWJlciwgbW9kaWZpZWRTdGFydENvbHVtbiwgbW9kaWZpZWRFbmRMaW5lTnVtYmVyLCBtb2RpZmllZEVuZENvbHVtbikgewogICAgICAgICAgICB0aGlzLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gb3JpZ2luYWxTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxTdGFydENvbHVtbiA9IG9yaWdpbmFsU3RhcnRDb2x1bW47CiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxFbmRMaW5lTnVtYmVyID0gb3JpZ2luYWxFbmRMaW5lTnVtYmVyOwogICAgICAgICAgICB0aGlzLm9yaWdpbmFsRW5kQ29sdW1uID0gb3JpZ2luYWxFbmRDb2x1bW47CiAgICAgICAgICAgIHRoaXMubW9kaWZpZWRTdGFydExpbmVOdW1iZXIgPSBtb2RpZmllZFN0YXJ0TGluZU51bWJlcjsKICAgICAgICAgICAgdGhpcy5tb2RpZmllZFN0YXJ0Q29sdW1uID0gbW9kaWZpZWRTdGFydENvbHVtbjsKICAgICAgICAgICAgdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXIgPSBtb2RpZmllZEVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgIHRoaXMubW9kaWZpZWRFbmRDb2x1bW4gPSBtb2RpZmllZEVuZENvbHVtbjsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGNyZWF0ZUZyb21EaWZmQ2hhbmdlKGRpZmZDaGFuZ2UsIG9yaWdpbmFsQ2hhclNlcXVlbmNlLCBtb2RpZmllZENoYXJTZXF1ZW5jZSkgewogICAgICAgICAgICBsZXQgb3JpZ2luYWxTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIGxldCBvcmlnaW5hbFN0YXJ0Q29sdW1uOwogICAgICAgICAgICBsZXQgb3JpZ2luYWxFbmRMaW5lTnVtYmVyOwogICAgICAgICAgICBsZXQgb3JpZ2luYWxFbmRDb2x1bW47CiAgICAgICAgICAgIGxldCBtb2RpZmllZFN0YXJ0TGluZU51bWJlcjsKICAgICAgICAgICAgbGV0IG1vZGlmaWVkU3RhcnRDb2x1bW47CiAgICAgICAgICAgIGxldCBtb2RpZmllZEVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgIGxldCBtb2RpZmllZEVuZENvbHVtbjsKICAgICAgICAgICAgaWYgKGRpZmZDaGFuZ2Uub3JpZ2luYWxMZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gMDsKICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRDb2x1bW4gPSAwOwogICAgICAgICAgICAgICAgb3JpZ2luYWxFbmRMaW5lTnVtYmVyID0gMDsKICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kQ29sdW1uID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gb3JpZ2luYWxDaGFyU2VxdWVuY2UuZ2V0U3RhcnRMaW5lTnVtYmVyKGRpZmZDaGFuZ2Uub3JpZ2luYWxTdGFydCk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbFN0YXJ0Q29sdW1uID0gb3JpZ2luYWxDaGFyU2VxdWVuY2UuZ2V0U3RhcnRDb2x1bW4oZGlmZkNoYW5nZS5vcmlnaW5hbFN0YXJ0KTsKICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kTGluZU51bWJlciA9IG9yaWdpbmFsQ2hhclNlcXVlbmNlLmdldEVuZExpbmVOdW1iZXIoZGlmZkNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgZGlmZkNoYW5nZS5vcmlnaW5hbExlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgb3JpZ2luYWxFbmRDb2x1bW4gPSBvcmlnaW5hbENoYXJTZXF1ZW5jZS5nZXRFbmRDb2x1bW4oZGlmZkNoYW5nZS5vcmlnaW5hbFN0YXJ0ICsgZGlmZkNoYW5nZS5vcmlnaW5hbExlbmd0aCAtIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkaWZmQ2hhbmdlLm1vZGlmaWVkTGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0TGluZU51bWJlciA9IDA7CiAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0Q29sdW1uID0gMDsKICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kTGluZU51bWJlciA9IDA7CiAgICAgICAgICAgICAgICBtb2RpZmllZEVuZENvbHVtbiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0TGluZU51bWJlciA9IG1vZGlmaWVkQ2hhclNlcXVlbmNlLmdldFN0YXJ0TGluZU51bWJlcihkaWZmQ2hhbmdlLm1vZGlmaWVkU3RhcnQpOwogICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydENvbHVtbiA9IG1vZGlmaWVkQ2hhclNlcXVlbmNlLmdldFN0YXJ0Q29sdW1uKGRpZmZDaGFuZ2UubW9kaWZpZWRTdGFydCk7CiAgICAgICAgICAgICAgICBtb2RpZmllZEVuZExpbmVOdW1iZXIgPSBtb2RpZmllZENoYXJTZXF1ZW5jZS5nZXRFbmRMaW5lTnVtYmVyKGRpZmZDaGFuZ2UubW9kaWZpZWRTdGFydCArIGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kQ29sdW1uID0gbW9kaWZpZWRDaGFyU2VxdWVuY2UuZ2V0RW5kQ29sdW1uKGRpZmZDaGFuZ2UubW9kaWZpZWRTdGFydCArIGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggLSAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IENoYXJDaGFuZ2Uob3JpZ2luYWxTdGFydExpbmVOdW1iZXIsIG9yaWdpbmFsU3RhcnRDb2x1bW4sIG9yaWdpbmFsRW5kTGluZU51bWJlciwgb3JpZ2luYWxFbmRDb2x1bW4sIG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLCBtb2RpZmllZFN0YXJ0Q29sdW1uLCBtb2RpZmllZEVuZExpbmVOdW1iZXIsIG1vZGlmaWVkRW5kQ29sdW1uKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBwb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzKHJhd0NoYW5nZXMpIHsKICAgICAgICBpZiAocmF3Q2hhbmdlcy5sZW5ndGggPD0gMSkgewogICAgICAgICAgICByZXR1cm4gcmF3Q2hhbmdlczsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gW3Jhd0NoYW5nZXNbMF1dOwogICAgICAgIGxldCBwcmV2Q2hhbmdlID0gcmVzdWx0WzBdOwogICAgICAgIGZvciAobGV0IGkgPSAxLCBsZW4gPSByYXdDaGFuZ2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IGN1cnJDaGFuZ2UgPSByYXdDaGFuZ2VzW2ldOwogICAgICAgICAgICBjb25zdCBvcmlnaW5hbE1hdGNoaW5nTGVuZ3RoID0gY3VyckNoYW5nZS5vcmlnaW5hbFN0YXJ0IC0gKHByZXZDaGFuZ2Uub3JpZ2luYWxTdGFydCArIHByZXZDaGFuZ2Uub3JpZ2luYWxMZW5ndGgpOwogICAgICAgICAgICBjb25zdCBtb2RpZmllZE1hdGNoaW5nTGVuZ3RoID0gY3VyckNoYW5nZS5tb2RpZmllZFN0YXJ0IC0gKHByZXZDaGFuZ2UubW9kaWZpZWRTdGFydCArIHByZXZDaGFuZ2UubW9kaWZpZWRMZW5ndGgpOwogICAgICAgICAgICAvLyBCb3RoIG9mIHRoZSBhYm92ZSBzaG91bGQgYmUgZXF1YWwsIGJ1dCB0aGUgY29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlIG1heSBwcmV2ZW50IHRoaXMgZnJvbSBiZWluZyB0cnVlCiAgICAgICAgICAgIGNvbnN0IG1hdGNoaW5nTGVuZ3RoID0gTWF0aC5taW4ob3JpZ2luYWxNYXRjaGluZ0xlbmd0aCwgbW9kaWZpZWRNYXRjaGluZ0xlbmd0aCk7CiAgICAgICAgICAgIGlmIChtYXRjaGluZ0xlbmd0aCA8IE1JTklNVU1fTUFUQ0hJTkdfQ0hBUkFDVEVSX0xFTkdUSCkgewogICAgICAgICAgICAgICAgLy8gTWVyZ2UgdGhlIGN1cnJlbnQgY2hhbmdlIGludG8gdGhlIHByZXZpb3VzIG9uZQogICAgICAgICAgICAgICAgcHJldkNoYW5nZS5vcmlnaW5hbExlbmd0aCA9IChjdXJyQ2hhbmdlLm9yaWdpbmFsU3RhcnQgKyBjdXJyQ2hhbmdlLm9yaWdpbmFsTGVuZ3RoKSAtIHByZXZDaGFuZ2Uub3JpZ2luYWxTdGFydDsKICAgICAgICAgICAgICAgIHByZXZDaGFuZ2UubW9kaWZpZWRMZW5ndGggPSAoY3VyckNoYW5nZS5tb2RpZmllZFN0YXJ0ICsgY3VyckNoYW5nZS5tb2RpZmllZExlbmd0aCkgLSBwcmV2Q2hhbmdlLm1vZGlmaWVkU3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGN1cnJlbnQgY2hhbmdlCiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjdXJyQ2hhbmdlKTsKICAgICAgICAgICAgICAgIHByZXZDaGFuZ2UgPSBjdXJyQ2hhbmdlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBjbGFzcyBMaW5lQ2hhbmdlIHsKICAgICAgICBjb25zdHJ1Y3RvcihvcmlnaW5hbFN0YXJ0TGluZU51bWJlciwgb3JpZ2luYWxFbmRMaW5lTnVtYmVyLCBtb2RpZmllZFN0YXJ0TGluZU51bWJlciwgbW9kaWZpZWRFbmRMaW5lTnVtYmVyLCBjaGFyQ2hhbmdlcykgewogICAgICAgICAgICB0aGlzLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gb3JpZ2luYWxTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIHRoaXMub3JpZ2luYWxFbmRMaW5lTnVtYmVyID0gb3JpZ2luYWxFbmRMaW5lTnVtYmVyOwogICAgICAgICAgICB0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyID0gbW9kaWZpZWRTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIHRoaXMubW9kaWZpZWRFbmRMaW5lTnVtYmVyID0gbW9kaWZpZWRFbmRMaW5lTnVtYmVyOwogICAgICAgICAgICB0aGlzLmNoYXJDaGFuZ2VzID0gY2hhckNoYW5nZXM7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBjcmVhdGVGcm9tRGlmZlJlc3VsdChzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSwgZGlmZkNoYW5nZSwgb3JpZ2luYWxMaW5lU2VxdWVuY2UsIG1vZGlmaWVkTGluZVNlcXVlbmNlLCBjb250aW51ZUNoYXJEaWZmLCBzaG91bGRDb21wdXRlQ2hhckNoYW5nZXMsIHNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpIHsKICAgICAgICAgICAgbGV0IG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOwogICAgICAgICAgICBsZXQgb3JpZ2luYWxFbmRMaW5lTnVtYmVyOwogICAgICAgICAgICBsZXQgbW9kaWZpZWRTdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIGxldCBtb2RpZmllZEVuZExpbmVOdW1iZXI7CiAgICAgICAgICAgIGxldCBjaGFyQ2hhbmdlcyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgaWYgKGRpZmZDaGFuZ2Uub3JpZ2luYWxMZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gb3JpZ2luYWxMaW5lU2VxdWVuY2UuZ2V0U3RhcnRMaW5lTnVtYmVyKGRpZmZDaGFuZ2Uub3JpZ2luYWxTdGFydCkgLSAxOwogICAgICAgICAgICAgICAgb3JpZ2luYWxFbmRMaW5lTnVtYmVyID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyID0gb3JpZ2luYWxMaW5lU2VxdWVuY2UuZ2V0U3RhcnRMaW5lTnVtYmVyKGRpZmZDaGFuZ2Uub3JpZ2luYWxTdGFydCk7CiAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZExpbmVOdW1iZXIgPSBvcmlnaW5hbExpbmVTZXF1ZW5jZS5nZXRFbmRMaW5lTnVtYmVyKGRpZmZDaGFuZ2Uub3JpZ2luYWxTdGFydCArIGRpZmZDaGFuZ2Uub3JpZ2luYWxMZW5ndGggLSAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGlmZkNoYW5nZS5tb2RpZmllZExlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydExpbmVOdW1iZXIgPSBtb2RpZmllZExpbmVTZXF1ZW5jZS5nZXRTdGFydExpbmVOdW1iZXIoZGlmZkNoYW5nZS5tb2RpZmllZFN0YXJ0KSAtIDE7CiAgICAgICAgICAgICAgICBtb2RpZmllZEVuZExpbmVOdW1iZXIgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydExpbmVOdW1iZXIgPSBtb2RpZmllZExpbmVTZXF1ZW5jZS5nZXRTdGFydExpbmVOdW1iZXIoZGlmZkNoYW5nZS5tb2RpZmllZFN0YXJ0KTsKICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kTGluZU51bWJlciA9IG1vZGlmaWVkTGluZVNlcXVlbmNlLmdldEVuZExpbmVOdW1iZXIoZGlmZkNoYW5nZS5tb2RpZmllZFN0YXJ0ICsgZGlmZkNoYW5nZS5tb2RpZmllZExlbmd0aCAtIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzaG91bGRDb21wdXRlQ2hhckNoYW5nZXMgJiYgZGlmZkNoYW5nZS5vcmlnaW5hbExlbmd0aCA+IDAgJiYgZGlmZkNoYW5nZS5vcmlnaW5hbExlbmd0aCA8IDIwICYmIGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggPiAwICYmIGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggPCAyMCAmJiBjb250aW51ZUNoYXJEaWZmKCkpIHsKICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgY2hhcmFjdGVyIGNoYW5nZXMgZm9yIGRpZmYgY2h1bmtzIG9mIGF0IG1vc3QgMjAgbGluZXMuLi4KICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQ2hhclNlcXVlbmNlID0gb3JpZ2luYWxMaW5lU2VxdWVuY2UuY3JlYXRlQ2hhclNlcXVlbmNlKHNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLCBkaWZmQ2hhbmdlLm9yaWdpbmFsU3RhcnQsIGRpZmZDaGFuZ2Uub3JpZ2luYWxTdGFydCArIGRpZmZDaGFuZ2Uub3JpZ2luYWxMZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkQ2hhclNlcXVlbmNlID0gbW9kaWZpZWRMaW5lU2VxdWVuY2UuY3JlYXRlQ2hhclNlcXVlbmNlKHNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLCBkaWZmQ2hhbmdlLm1vZGlmaWVkU3RhcnQsIGRpZmZDaGFuZ2UubW9kaWZpZWRTdGFydCArIGRpZmZDaGFuZ2UubW9kaWZpZWRMZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgIGxldCByYXdDaGFuZ2VzID0gY29tcHV0ZURpZmYob3JpZ2luYWxDaGFyU2VxdWVuY2UsIG1vZGlmaWVkQ2hhclNlcXVlbmNlLCBjb250aW51ZUNoYXJEaWZmLCB0cnVlKS5jaGFuZ2VzOwogICAgICAgICAgICAgICAgaWYgKHNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpIHsKICAgICAgICAgICAgICAgICAgICByYXdDaGFuZ2VzID0gcG9zdFByb2Nlc3NDaGFyQ2hhbmdlcyhyYXdDaGFuZ2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNoYXJDaGFuZ2VzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gcmF3Q2hhbmdlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNoYXJDaGFuZ2VzLnB1c2goQ2hhckNoYW5nZS5jcmVhdGVGcm9tRGlmZkNoYW5nZShyYXdDaGFuZ2VzW2ldLCBvcmlnaW5hbENoYXJTZXF1ZW5jZSwgbW9kaWZpZWRDaGFyU2VxdWVuY2UpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IExpbmVDaGFuZ2Uob3JpZ2luYWxTdGFydExpbmVOdW1iZXIsIG9yaWdpbmFsRW5kTGluZU51bWJlciwgbW9kaWZpZWRTdGFydExpbmVOdW1iZXIsIG1vZGlmaWVkRW5kTGluZU51bWJlciwgY2hhckNoYW5nZXMpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIERpZmZDb21wdXRlciB7CiAgICAgICAgY29uc3RydWN0b3Iob3JpZ2luYWxMaW5lcywgbW9kaWZpZWRMaW5lcywgb3B0cykgewogICAgICAgICAgICB0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyA9IG9wdHMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzOwogICAgICAgICAgICB0aGlzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMgPSBvcHRzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXM7CiAgICAgICAgICAgIHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2UgPSBvcHRzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlOwogICAgICAgICAgICB0aGlzLnNob3VsZE1ha2VQcmV0dHlEaWZmID0gb3B0cy5zaG91bGRNYWtlUHJldHR5RGlmZjsKICAgICAgICAgICAgdGhpcy5vcmlnaW5hbExpbmVzID0gb3JpZ2luYWxMaW5lczsKICAgICAgICAgICAgdGhpcy5tb2RpZmllZExpbmVzID0gbW9kaWZpZWRMaW5lczsKICAgICAgICAgICAgdGhpcy5vcmlnaW5hbCA9IG5ldyBMaW5lU2VxdWVuY2Uob3JpZ2luYWxMaW5lcyk7CiAgICAgICAgICAgIHRoaXMubW9kaWZpZWQgPSBuZXcgTGluZVNlcXVlbmNlKG1vZGlmaWVkTGluZXMpOwogICAgICAgICAgICB0aGlzLmNvbnRpbnVlTGluZURpZmYgPSBjcmVhdGVDb250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUob3B0cy5tYXhDb21wdXRhdGlvblRpbWUpOwogICAgICAgICAgICB0aGlzLmNvbnRpbnVlQ2hhckRpZmYgPSBjcmVhdGVDb250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUob3B0cy5tYXhDb21wdXRhdGlvblRpbWUgPT09IDAgPyAwIDogTWF0aC5taW4ob3B0cy5tYXhDb21wdXRhdGlvblRpbWUsIDUwMDApKTsgLy8gbmV2ZXIgcnVuIGFmdGVyIDVzIGZvciBjaGFyYWN0ZXIgY2hhbmdlcy4uLgogICAgICAgIH0KICAgICAgICBjb21wdXRlRGlmZigpIHsKICAgICAgICAgICAgaWYgKHRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoID09PSAxICYmIHRoaXMub3JpZ2luYWwubGluZXNbMF0ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBlbXB0eSBvcmlnaW5hbCA9PiBmYXN0IHBhdGgKICAgICAgICAgICAgICAgIGlmICh0aGlzLm1vZGlmaWVkLmxpbmVzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLm1vZGlmaWVkLmxpbmVzWzBdLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHF1aXRFYXJseTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXM6IFtdCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcXVpdEVhcmx5OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTdGFydExpbmVOdW1iZXI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZExpbmVOdW1iZXI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZFN0YXJ0TGluZU51bWJlcjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kTGluZU51bWJlcjogdGhpcy5tb2RpZmllZC5saW5lcy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyQ2hhbmdlczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFbmRDb2x1bW46IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kTGluZU51bWJlcjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydENvbHVtbjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kQ29sdW1uOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZExpbmVOdW1iZXI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRDb2x1bW46IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMubW9kaWZpZWQubGluZXMubGVuZ3RoID09PSAxICYmIHRoaXMubW9kaWZpZWQubGluZXNbMF0ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBlbXB0eSBtb2RpZmllZCA9PiBmYXN0IHBhdGgKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcXVpdEVhcmx5OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzOiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTdGFydExpbmVOdW1iZXI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZExpbmVOdW1iZXI6IHRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmllZEVuZExpbmVOdW1iZXI6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyQ2hhbmdlczogW3sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFbmRDb2x1bW46IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkRW5kTGluZU51bWJlcjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydENvbHVtbjogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kQ29sdW1uOiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbEVuZExpbmVOdW1iZXI6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRDb2x1bW46IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOiAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgICAgICAgICAgfV0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgZGlmZlJlc3VsdCA9IGNvbXB1dGVEaWZmKHRoaXMub3JpZ2luYWwsIHRoaXMubW9kaWZpZWQsIHRoaXMuY29udGludWVMaW5lRGlmZiwgdGhpcy5zaG91bGRNYWtlUHJldHR5RGlmZik7CiAgICAgICAgICAgIGNvbnN0IHJhd0NoYW5nZXMgPSBkaWZmUmVzdWx0LmNoYW5nZXM7CiAgICAgICAgICAgIGNvbnN0IHF1aXRFYXJseSA9IGRpZmZSZXN1bHQucXVpdEVhcmx5OwogICAgICAgICAgICAvLyBUaGUgZGlmZiBpcyBhbHdheXMgY29tcHV0ZWQgd2l0aCBpZ25vcmluZyB0cmltIHdoaXRlc3BhY2UKICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHdlIGdldCB0aGUgcHJldHRpZXN0IGRpZmYKICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2UpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVDaGFuZ2VzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gcmF3Q2hhbmdlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGxpbmVDaGFuZ2VzLnB1c2goTGluZUNoYW5nZS5jcmVhdGVGcm9tRGlmZlJlc3VsdCh0aGlzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLCByYXdDaGFuZ2VzW2ldLCB0aGlzLm9yaWdpbmFsLCB0aGlzLm1vZGlmaWVkLCB0aGlzLmNvbnRpbnVlQ2hhckRpZmYsIHRoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzLCB0aGlzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcXVpdEVhcmx5OiBxdWl0RWFybHksCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlczogbGluZUNoYW5nZXMKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTmVlZCB0byBwb3N0LXByb2Nlc3MgYW5kIGludHJvZHVjZSBjaGFuZ2VzIHdoZXJlIHRoZSB0cmltIHdoaXRlc3BhY2UgaXMgZGlmZmVyZW50CiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBhcmUgbG9vcGluZyBzdGFydGluZyBhdCAtMSB0byBhbHNvIGNvdmVyIHRoZSBsaW5lcyBiZWZvcmUgdGhlIGZpcnN0IGNoYW5nZQogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICAgICAgbGV0IG9yaWdpbmFsTGluZUluZGV4ID0gMDsKICAgICAgICAgICAgbGV0IG1vZGlmaWVkTGluZUluZGV4ID0gMDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IC0xIC8qICEhISEgKi8sIGxlbiA9IHJhd0NoYW5nZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IG5leHRDaGFuZ2UgPSAoaSArIDEgPCBsZW4gPyByYXdDaGFuZ2VzW2kgKyAxXSA6IG51bGwpOwogICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTdG9wID0gKG5leHRDaGFuZ2UgPyBuZXh0Q2hhbmdlLm9yaWdpbmFsU3RhcnQgOiB0aGlzLm9yaWdpbmFsTGluZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkU3RvcCA9IChuZXh0Q2hhbmdlID8gbmV4dENoYW5nZS5tb2RpZmllZFN0YXJ0IDogdGhpcy5tb2RpZmllZExpbmVzLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB3aGlsZSAob3JpZ2luYWxMaW5lSW5kZXggPCBvcmlnaW5hbFN0b3AgJiYgbW9kaWZpZWRMaW5lSW5kZXggPCBtb2RpZmllZFN0b3ApIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbExpbmUgPSB0aGlzLm9yaWdpbmFsTGluZXNbb3JpZ2luYWxMaW5lSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVkTGluZSA9IHRoaXMubW9kaWZpZWRMaW5lc1ttb2RpZmllZExpbmVJbmRleF07CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsTGluZSAhPT0gbW9kaWZpZWRMaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGxpbmVzIGRpZmZlciBvbmx5IGluIHRyaW0gd2hpdGVzcGFjZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgbGVhZGluZyB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvcmlnaW5hbFN0YXJ0Q29sdW1uID0gZ2V0Rmlyc3ROb25CbGFua0NvbHVtbihvcmlnaW5hbExpbmUsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1vZGlmaWVkU3RhcnRDb2x1bW4gPSBnZXRGaXJzdE5vbkJsYW5rQ29sdW1uKG1vZGlmaWVkTGluZSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAob3JpZ2luYWxTdGFydENvbHVtbiA+IDEgJiYgbW9kaWZpZWRTdGFydENvbHVtbiA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbENoYXIgPSBvcmlnaW5hbExpbmUuY2hhckNvZGVBdChvcmlnaW5hbFN0YXJ0Q29sdW1uIC0gMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRDaGFyID0gbW9kaWZpZWRMaW5lLmNoYXJDb2RlQXQobW9kaWZpZWRTdGFydENvbHVtbiAtIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbENoYXIgIT09IG1vZGlmaWVkQ2hhcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxTdGFydENvbHVtbi0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkU3RhcnRDb2x1bW4tLTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbFN0YXJ0Q29sdW1uID4gMSB8fCBtb2RpZmllZFN0YXJ0Q29sdW1uID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3B1c2hUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UocmVzdWx0LCBvcmlnaW5hbExpbmVJbmRleCArIDEsIDEsIG9yaWdpbmFsU3RhcnRDb2x1bW4sIG1vZGlmaWVkTGluZUluZGV4ICsgMSwgMSwgbW9kaWZpZWRTdGFydENvbHVtbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG9yaWdpbmFsRW5kQ29sdW1uID0gZ2V0TGFzdE5vbkJsYW5rQ29sdW1uKG9yaWdpbmFsTGluZSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbW9kaWZpZWRFbmRDb2x1bW4gPSBnZXRMYXN0Tm9uQmxhbmtDb2x1bW4obW9kaWZpZWRMaW5lLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTWF4Q29sdW1uID0gb3JpZ2luYWxMaW5lLmxlbmd0aCArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZE1heENvbHVtbiA9IG1vZGlmaWVkTGluZS5sZW5ndGggKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG9yaWdpbmFsRW5kQ29sdW1uIDwgb3JpZ2luYWxNYXhDb2x1bW4gJiYgbW9kaWZpZWRFbmRDb2x1bW4gPCBtb2RpZmllZE1heENvbHVtbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQ2hhciA9IG9yaWdpbmFsTGluZS5jaGFyQ29kZUF0KG9yaWdpbmFsRW5kQ29sdW1uIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRDaGFyID0gb3JpZ2luYWxMaW5lLmNoYXJDb2RlQXQobW9kaWZpZWRFbmRDb2x1bW4gLSAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxDaGFyICE9PSBtb2RpZmllZENoYXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsRW5kQ29sdW1uKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRFbmRDb2x1bW4rKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbEVuZENvbHVtbiA8IG9yaWdpbmFsTWF4Q29sdW1uIHx8IG1vZGlmaWVkRW5kQ29sdW1uIDwgbW9kaWZpZWRNYXhDb2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wdXNoVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHJlc3VsdCwgb3JpZ2luYWxMaW5lSW5kZXggKyAxLCBvcmlnaW5hbEVuZENvbHVtbiwgb3JpZ2luYWxNYXhDb2x1bW4sIG1vZGlmaWVkTGluZUluZGV4ICsgMSwgbW9kaWZpZWRFbmRDb2x1bW4sIG1vZGlmaWVkTWF4Q29sdW1uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbExpbmVJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkTGluZUluZGV4Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobmV4dENoYW5nZSkgewogICAgICAgICAgICAgICAgICAgIC8vIEVtaXQgdGhlIGFjdHVhbCBjaGFuZ2UKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChMaW5lQ2hhbmdlLmNyZWF0ZUZyb21EaWZmUmVzdWx0KHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2UsIG5leHRDaGFuZ2UsIHRoaXMub3JpZ2luYWwsIHRoaXMubW9kaWZpZWQsIHRoaXMuY29udGludWVDaGFyRGlmZiwgdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMsIHRoaXMuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcykpOwogICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTGluZUluZGV4ICs9IG5leHRDaGFuZ2Uub3JpZ2luYWxMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWRMaW5lSW5kZXggKz0gbmV4dENoYW5nZS5tb2RpZmllZExlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcXVpdEVhcmx5OiBxdWl0RWFybHksCiAgICAgICAgICAgICAgICBjaGFuZ2VzOiByZXN1bHQKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgX3B1c2hUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UocmVzdWx0LCBvcmlnaW5hbExpbmVOdW1iZXIsIG9yaWdpbmFsU3RhcnRDb2x1bW4sIG9yaWdpbmFsRW5kQ29sdW1uLCBtb2RpZmllZExpbmVOdW1iZXIsIG1vZGlmaWVkU3RhcnRDb2x1bW4sIG1vZGlmaWVkRW5kQ29sdW1uKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9tZXJnZVRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZShyZXN1bHQsIG9yaWdpbmFsTGluZU51bWJlciwgb3JpZ2luYWxTdGFydENvbHVtbiwgb3JpZ2luYWxFbmRDb2x1bW4sIG1vZGlmaWVkTGluZU51bWJlciwgbW9kaWZpZWRTdGFydENvbHVtbiwgbW9kaWZpZWRFbmRDb2x1bW4pKSB7CiAgICAgICAgICAgICAgICAvLyBNZXJnZWQgaW50byBwcmV2aW91cwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBjaGFyQ2hhbmdlcyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICBjaGFyQ2hhbmdlcyA9IFtuZXcgQ2hhckNoYW5nZShvcmlnaW5hbExpbmVOdW1iZXIsIG9yaWdpbmFsU3RhcnRDb2x1bW4sIG9yaWdpbmFsTGluZU51bWJlciwgb3JpZ2luYWxFbmRDb2x1bW4sIG1vZGlmaWVkTGluZU51bWJlciwgbW9kaWZpZWRTdGFydENvbHVtbiwgbW9kaWZpZWRMaW5lTnVtYmVyLCBtb2RpZmllZEVuZENvbHVtbildOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBMaW5lQ2hhbmdlKG9yaWdpbmFsTGluZU51bWJlciwgb3JpZ2luYWxMaW5lTnVtYmVyLCBtb2RpZmllZExpbmVOdW1iZXIsIG1vZGlmaWVkTGluZU51bWJlciwgY2hhckNoYW5nZXMpKTsKICAgICAgICB9CiAgICAgICAgX21lcmdlVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHJlc3VsdCwgb3JpZ2luYWxMaW5lTnVtYmVyLCBvcmlnaW5hbFN0YXJ0Q29sdW1uLCBvcmlnaW5hbEVuZENvbHVtbiwgbW9kaWZpZWRMaW5lTnVtYmVyLCBtb2RpZmllZFN0YXJ0Q29sdW1uLCBtb2RpZmllZEVuZENvbHVtbikgewogICAgICAgICAgICBjb25zdCBsZW4gPSByZXN1bHQubGVuZ3RoOwogICAgICAgICAgICBpZiAobGVuID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcHJldkNoYW5nZSA9IHJlc3VsdFtsZW4gLSAxXTsKICAgICAgICAgICAgaWYgKHByZXZDaGFuZ2Uub3JpZ2luYWxFbmRMaW5lTnVtYmVyID09PSAwIHx8IHByZXZDaGFuZ2UubW9kaWZpZWRFbmRMaW5lTnVtYmVyID09PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBEb24ndCBtZXJnZSB3aXRoIGluc2VydHMvZGVsZXRlcwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwcmV2Q2hhbmdlLm9yaWdpbmFsRW5kTGluZU51bWJlciArIDEgPT09IG9yaWdpbmFsTGluZU51bWJlciAmJiBwcmV2Q2hhbmdlLm1vZGlmaWVkRW5kTGluZU51bWJlciArIDEgPT09IG1vZGlmaWVkTGluZU51bWJlcikgewogICAgICAgICAgICAgICAgcHJldkNoYW5nZS5vcmlnaW5hbEVuZExpbmVOdW1iZXIgPSBvcmlnaW5hbExpbmVOdW1iZXI7CiAgICAgICAgICAgICAgICBwcmV2Q2hhbmdlLm1vZGlmaWVkRW5kTGluZU51bWJlciA9IG1vZGlmaWVkTGluZU51bWJlcjsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyAmJiBwcmV2Q2hhbmdlLmNoYXJDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgcHJldkNoYW5nZS5jaGFyQ2hhbmdlcy5wdXNoKG5ldyBDaGFyQ2hhbmdlKG9yaWdpbmFsTGluZU51bWJlciwgb3JpZ2luYWxTdGFydENvbHVtbiwgb3JpZ2luYWxMaW5lTnVtYmVyLCBvcmlnaW5hbEVuZENvbHVtbiwgbW9kaWZpZWRMaW5lTnVtYmVyLCBtb2RpZmllZFN0YXJ0Q29sdW1uLCBtb2RpZmllZExpbmVOdW1iZXIsIG1vZGlmaWVkRW5kQ29sdW1uKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0Rmlyc3ROb25CbGFua0NvbHVtbih0eHQsIGRlZmF1bHRWYWx1ZSkgewogICAgICAgIGNvbnN0IHIgPSBmaXJzdE5vbldoaXRlc3BhY2VJbmRleCh0eHQpOwogICAgICAgIGlmIChyID09PSAtMSkgewogICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gciArIDE7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRMYXN0Tm9uQmxhbmtDb2x1bW4odHh0LCBkZWZhdWx0VmFsdWUpIHsKICAgICAgICBjb25zdCByID0gbGFzdE5vbldoaXRlc3BhY2VJbmRleCh0eHQpOwogICAgICAgIGlmIChyID09PSAtMSkgewogICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gciArIDI7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVDb250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGUobWF4aW11bVJ1bnRpbWUpIHsKICAgICAgICBpZiAobWF4aW11bVJ1bnRpbWUgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuICgpID0+IHRydWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7CiAgICAgICAgcmV0dXJuICgpID0+IHsKICAgICAgICAgICAgcmV0dXJuIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBtYXhpbXVtUnVudGltZTsKICAgICAgICB9OwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgZnVuY3Rpb24gdG9VaW50OCh2KSB7CiAgICAgICAgaWYgKHYgPCAwKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBpZiAodiA+IDI1NSAvKiBNQVhfVUlOVF84ICovKSB7CiAgICAgICAgICAgIHJldHVybiAyNTUgLyogTUFYX1VJTlRfOCAqLzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHYgfCAwOwogICAgfQogICAgZnVuY3Rpb24gdG9VaW50MzIodikgewogICAgICAgIGlmICh2IDwgMCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWYgKHYgPiA0Mjk0OTY3Mjk1IC8qIE1BWF9VSU5UXzMyICovKSB7CiAgICAgICAgICAgIHJldHVybiA0Mjk0OTY3Mjk1IC8qIE1BWF9VSU5UXzMyICovOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdiB8IDA7CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjbGFzcyBQcmVmaXhTdW1Db21wdXRlciB7CiAgICAgICAgY29uc3RydWN0b3IodmFsdWVzKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOwogICAgICAgICAgICB0aGlzLnByZWZpeFN1bSA9IG5ldyBVaW50MzJBcnJheSh2YWx1ZXMubGVuZ3RoKTsKICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4ID0gbmV3IEludDMyQXJyYXkoMSk7CiAgICAgICAgICAgIHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSA9IC0xOwogICAgICAgIH0KICAgICAgICBpbnNlcnRWYWx1ZXMoaW5zZXJ0SW5kZXgsIGluc2VydFZhbHVlcykgewogICAgICAgICAgICBpbnNlcnRJbmRleCA9IHRvVWludDMyKGluc2VydEluZGV4KTsKICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWVzID0gdGhpcy52YWx1ZXM7CiAgICAgICAgICAgIGNvbnN0IG9sZFByZWZpeFN1bSA9IHRoaXMucHJlZml4U3VtOwogICAgICAgICAgICBjb25zdCBpbnNlcnRWYWx1ZXNMZW4gPSBpbnNlcnRWYWx1ZXMubGVuZ3RoOwogICAgICAgICAgICBpZiAoaW5zZXJ0VmFsdWVzTGVuID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBuZXcgVWludDMyQXJyYXkob2xkVmFsdWVzLmxlbmd0aCArIGluc2VydFZhbHVlc0xlbik7CiAgICAgICAgICAgIHRoaXMudmFsdWVzLnNldChvbGRWYWx1ZXMuc3ViYXJyYXkoMCwgaW5zZXJ0SW5kZXgpLCAwKTsKICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG9sZFZhbHVlcy5zdWJhcnJheShpbnNlcnRJbmRleCksIGluc2VydEluZGV4ICsgaW5zZXJ0VmFsdWVzTGVuKTsKICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KGluc2VydFZhbHVlcywgaW5zZXJ0SW5kZXgpOwogICAgICAgICAgICBpZiAoaW5zZXJ0SW5kZXggLSAxIDwgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0gPSBpbnNlcnRJbmRleCAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW0gPSBuZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKTsKICAgICAgICAgICAgaWYgKHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSA+PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLnByZWZpeFN1bS5zZXQob2xkUHJlZml4U3VtLnN1YmFycmF5KDAsIHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSArIDEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgc2V0VmFsdWUoaW5kZXgsIHZhbHVlKSB7CiAgICAgICAgICAgIGluZGV4ID0gdG9VaW50MzIoaW5kZXgpOwogICAgICAgICAgICB2YWx1ZSA9IHRvVWludDMyKHZhbHVlKTsKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVzW2luZGV4XSA9PT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnZhbHVlc1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgaWYgKGluZGV4IC0gMSA8IHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSkgewogICAgICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdID0gaW5kZXggLSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZW1vdmVWYWx1ZXMoc3RhcnRJbmRleCwgY291bnQpIHsKICAgICAgICAgICAgc3RhcnRJbmRleCA9IHRvVWludDMyKHN0YXJ0SW5kZXgpOwogICAgICAgICAgICBjb3VudCA9IHRvVWludDMyKGNvdW50KTsKICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWVzID0gdGhpcy52YWx1ZXM7CiAgICAgICAgICAgIGNvbnN0IG9sZFByZWZpeFN1bSA9IHRoaXMucHJlZml4U3VtOwogICAgICAgICAgICBpZiAoc3RhcnRJbmRleCA+PSBvbGRWYWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG1heENvdW50ID0gb2xkVmFsdWVzLmxlbmd0aCAtIHN0YXJ0SW5kZXg7CiAgICAgICAgICAgIGlmIChjb3VudCA+PSBtYXhDb3VudCkgewogICAgICAgICAgICAgICAgY291bnQgPSBtYXhDb3VudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnZhbHVlcyA9IG5ldyBVaW50MzJBcnJheShvbGRWYWx1ZXMubGVuZ3RoIC0gY291bnQpOwogICAgICAgICAgICB0aGlzLnZhbHVlcy5zZXQob2xkVmFsdWVzLnN1YmFycmF5KDAsIHN0YXJ0SW5kZXgpLCAwKTsKICAgICAgICAgICAgdGhpcy52YWx1ZXMuc2V0KG9sZFZhbHVlcy5zdWJhcnJheShzdGFydEluZGV4ICsgY291bnQpLCBzdGFydEluZGV4KTsKICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW0gPSBuZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKTsKICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggLSAxIDwgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKSB7CiAgICAgICAgICAgICAgICB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0gPSBzdGFydEluZGV4IC0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdID49IDApIHsKICAgICAgICAgICAgICAgIHRoaXMucHJlZml4U3VtLnNldChvbGRQcmVmaXhTdW0uc3ViYXJyYXkoMCwgdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdICsgMSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBnZXRUb3RhbFN1bSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMudmFsdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByZWZpeFN1bSh0aGlzLnZhbHVlcy5sZW5ndGggLSAxKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgc3VtIG9mIHRoZSBmaXJzdCBgaW5kZXggKyAxYCBtYW55IGl0ZW1zLgogICAgICAgICAqIEByZXR1cm5zIGBTVU0oMCA8PSBqIDw9IGluZGV4LCB2YWx1ZXNbal0pYC4KICAgICAgICAgKi8KICAgICAgICBnZXRQcmVmaXhTdW0oaW5kZXgpIHsKICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5kZXggPSB0b1VpbnQzMihpbmRleCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRQcmVmaXhTdW0oaW5kZXgpOwogICAgICAgIH0KICAgICAgICBfZ2V0UHJlZml4U3VtKGluZGV4KSB7CiAgICAgICAgICAgIGlmIChpbmRleCA8PSB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0pIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZWZpeFN1bVtpbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0gKyAxOwogICAgICAgICAgICBpZiAoc3RhcnRJbmRleCA9PT0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW1bMF0gPSB0aGlzLnZhbHVlc1swXTsKICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXgrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW5kZXggPj0gdGhpcy52YWx1ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBpbmRleCA9IHRoaXMudmFsdWVzLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXg7IGkgPD0gaW5kZXg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5wcmVmaXhTdW1baV0gPSB0aGlzLnByZWZpeFN1bVtpIC0gMV0gKyB0aGlzLnZhbHVlc1tpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0gPSBNYXRoLm1heCh0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0sIGluZGV4KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4U3VtW2luZGV4XTsKICAgICAgICB9CiAgICAgICAgZ2V0SW5kZXhPZihzdW0pIHsKICAgICAgICAgICAgc3VtID0gTWF0aC5mbG9vcihzdW0pOwogICAgICAgICAgICAvLyBDb21wdXRlIGFsbCBzdW1zICh0byBnZXQgYSBmdWxseSB2YWxpZCBwcmVmaXhTdW0pCiAgICAgICAgICAgIHRoaXMuZ2V0VG90YWxTdW0oKTsKICAgICAgICAgICAgbGV0IGxvdyA9IDA7CiAgICAgICAgICAgIGxldCBoaWdoID0gdGhpcy52YWx1ZXMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgbGV0IG1pZCA9IDA7CiAgICAgICAgICAgIGxldCBtaWRTdG9wID0gMDsKICAgICAgICAgICAgbGV0IG1pZFN0YXJ0ID0gMDsKICAgICAgICAgICAgd2hpbGUgKGxvdyA8PSBoaWdoKSB7CiAgICAgICAgICAgICAgICBtaWQgPSBsb3cgKyAoKGhpZ2ggLSBsb3cpIC8gMikgfCAwOwogICAgICAgICAgICAgICAgbWlkU3RvcCA9IHRoaXMucHJlZml4U3VtW21pZF07CiAgICAgICAgICAgICAgICBtaWRTdGFydCA9IG1pZFN0b3AgLSB0aGlzLnZhbHVlc1ttaWRdOwogICAgICAgICAgICAgICAgaWYgKHN1bSA8IG1pZFN0YXJ0KSB7CiAgICAgICAgICAgICAgICAgICAgaGlnaCA9IG1pZCAtIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdW0gPj0gbWlkU3RvcCkgewogICAgICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFByZWZpeFN1bUluZGV4T2ZSZXN1bHQobWlkLCBzdW0gLSBtaWRTdGFydCk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgUHJlZml4U3VtSW5kZXhPZlJlc3VsdCB7CiAgICAgICAgY29uc3RydWN0b3IoaW5kZXgsIHJlbWFpbmRlcikgewogICAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgIHRoaXMucmVtYWluZGVyID0gcmVtYWluZGVyOwogICAgICAgICAgICB0aGlzLl9wcmVmaXhTdW1JbmRleE9mUmVzdWx0QnJhbmQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKICAgICAgICAgICAgdGhpcy5yZW1haW5kZXIgPSByZW1haW5kZXI7CiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY2xhc3MgTWlycm9yVGV4dE1vZGVsIHsKICAgICAgICBjb25zdHJ1Y3Rvcih1cmksIGxpbmVzLCBlb2wsIHZlcnNpb25JZCkgewogICAgICAgICAgICB0aGlzLl91cmkgPSB1cmk7CiAgICAgICAgICAgIHRoaXMuX2xpbmVzID0gbGluZXM7CiAgICAgICAgICAgIHRoaXMuX2VvbCA9IGVvbDsKICAgICAgICAgICAgdGhpcy5fdmVyc2lvbklkID0gdmVyc2lvbklkOwogICAgICAgICAgICB0aGlzLl9saW5lU3RhcnRzID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fY2FjaGVkVGV4dFZhbHVlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgZGlzcG9zZSgpIHsKICAgICAgICAgICAgdGhpcy5fbGluZXMubGVuZ3RoID0gMDsKICAgICAgICB9CiAgICAgICAgZ2V0IHZlcnNpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uSWQ7CiAgICAgICAgfQogICAgICAgIGdldFRleHQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZWRUZXh0VmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFRleHRWYWx1ZSA9IHRoaXMuX2xpbmVzLmpvaW4odGhpcy5fZW9sKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fY2FjaGVkVGV4dFZhbHVlOwogICAgICAgIH0KICAgICAgICBvbkV2ZW50cyhlKSB7CiAgICAgICAgICAgIGlmIChlLmVvbCAmJiBlLmVvbCAhPT0gdGhpcy5fZW9sKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lb2wgPSBlLmVvbDsKICAgICAgICAgICAgICAgIHRoaXMuX2xpbmVTdGFydHMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFVwZGF0ZSBteSBsaW5lcwogICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gZS5jaGFuZ2VzOwogICAgICAgICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hY2NlcHREZWxldGVSYW5nZShjaGFuZ2UucmFuZ2UpOwogICAgICAgICAgICAgICAgdGhpcy5fYWNjZXB0SW5zZXJ0VGV4dChuZXcgUG9zaXRpb24kMShjaGFuZ2UucmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLCBjaGFuZ2UucmFuZ2Uuc3RhcnRDb2x1bW4pLCBjaGFuZ2UudGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdmVyc2lvbklkID0gZS52ZXJzaW9uSWQ7CiAgICAgICAgICAgIHRoaXMuX2NhY2hlZFRleHRWYWx1ZSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIF9lbnN1cmVMaW5lU3RhcnRzKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2xpbmVTdGFydHMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVvbExlbmd0aCA9IHRoaXMuX2VvbC5sZW5ndGg7CiAgICAgICAgICAgICAgICBjb25zdCBsaW5lc0xlbmd0aCA9IHRoaXMuX2xpbmVzLmxlbmd0aDsKICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVTdGFydFZhbHVlcyA9IG5ldyBVaW50MzJBcnJheShsaW5lc0xlbmd0aCk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzTGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBsaW5lU3RhcnRWYWx1ZXNbaV0gPSB0aGlzLl9saW5lc1tpXS5sZW5ndGggKyBlb2xMZW5ndGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9saW5lU3RhcnRzID0gbmV3IFByZWZpeFN1bUNvbXB1dGVyKGxpbmVTdGFydFZhbHVlcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWxsIGNoYW5nZXMgdG8gYSBsaW5lJ3MgdGV4dCBnbyB0aHJvdWdoIHRoaXMgbWV0aG9kCiAgICAgICAgICovCiAgICAgICAgX3NldExpbmVUZXh0KGxpbmVJbmRleCwgbmV3VmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fbGluZXNbbGluZUluZGV4XSA9IG5ld1ZhbHVlOwogICAgICAgICAgICBpZiAodGhpcy5fbGluZVN0YXJ0cykgewogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHByZWZpeCBzdW0KICAgICAgICAgICAgICAgIHRoaXMuX2xpbmVTdGFydHMuc2V0VmFsdWUobGluZUluZGV4LCB0aGlzLl9saW5lc1tsaW5lSW5kZXhdLmxlbmd0aCArIHRoaXMuX2VvbC5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9hY2NlcHREZWxldGVSYW5nZShyYW5nZSkgewogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnRMaW5lTnVtYmVyID09PSByYW5nZS5lbmRMaW5lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnRDb2x1bW4gPT09IHJhbmdlLmVuZENvbHVtbikgewogICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZGVsZXRlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gRGVsZXRlIHRleHQgb24gdGhlIGFmZmVjdGVkIGxpbmUKICAgICAgICAgICAgICAgIHRoaXMuX3NldExpbmVUZXh0KHJhbmdlLnN0YXJ0TGluZU51bWJlciAtIDEsIHRoaXMuX2xpbmVzW3JhbmdlLnN0YXJ0TGluZU51bWJlciAtIDFdLnN1YnN0cmluZygwLCByYW5nZS5zdGFydENvbHVtbiAtIDEpCiAgICAgICAgICAgICAgICAgICAgKyB0aGlzLl9saW5lc1tyYW5nZS5zdGFydExpbmVOdW1iZXIgLSAxXS5zdWJzdHJpbmcocmFuZ2UuZW5kQ29sdW1uIC0gMSkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRha2UgcmVtYWluaW5nIHRleHQgb24gbGFzdCBsaW5lIGFuZCBhcHBlbmQgaXQgdG8gcmVtYWluaW5nIHRleHQgb24gZmlyc3QgbGluZQogICAgICAgICAgICB0aGlzLl9zZXRMaW5lVGV4dChyYW5nZS5zdGFydExpbmVOdW1iZXIgLSAxLCB0aGlzLl9saW5lc1tyYW5nZS5zdGFydExpbmVOdW1iZXIgLSAxXS5zdWJzdHJpbmcoMCwgcmFuZ2Uuc3RhcnRDb2x1bW4gLSAxKQogICAgICAgICAgICAgICAgKyB0aGlzLl9saW5lc1tyYW5nZS5lbmRMaW5lTnVtYmVyIC0gMV0uc3Vic3RyaW5nKHJhbmdlLmVuZENvbHVtbiAtIDEpKTsKICAgICAgICAgICAgLy8gRGVsZXRlIG1pZGRsZSBsaW5lcwogICAgICAgICAgICB0aGlzLl9saW5lcy5zcGxpY2UocmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLCByYW5nZS5lbmRMaW5lTnVtYmVyIC0gcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2xpbmVTdGFydHMpIHsKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcmVmaXggc3VtCiAgICAgICAgICAgICAgICB0aGlzLl9saW5lU3RhcnRzLnJlbW92ZVZhbHVlcyhyYW5nZS5zdGFydExpbmVOdW1iZXIsIHJhbmdlLmVuZExpbmVOdW1iZXIgLSByYW5nZS5zdGFydExpbmVOdW1iZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9hY2NlcHRJbnNlcnRUZXh0KHBvc2l0aW9uLCBpbnNlcnRUZXh0KSB7CiAgICAgICAgICAgIGlmIChpbnNlcnRUZXh0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBpbnNlcnQKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgaW5zZXJ0TGluZXMgPSBzcGxpdExpbmVzKGluc2VydFRleHQpOwogICAgICAgICAgICBpZiAoaW5zZXJ0TGluZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICAvLyBJbnNlcnRpbmcgdGV4dCBvbiBvbmUgbGluZQogICAgICAgICAgICAgICAgdGhpcy5fc2V0TGluZVRleHQocG9zaXRpb24ubGluZU51bWJlciAtIDEsIHRoaXMuX2xpbmVzW3Bvc2l0aW9uLmxpbmVOdW1iZXIgLSAxXS5zdWJzdHJpbmcoMCwgcG9zaXRpb24uY29sdW1uIC0gMSkKICAgICAgICAgICAgICAgICAgICArIGluc2VydExpbmVzWzBdCiAgICAgICAgICAgICAgICAgICAgKyB0aGlzLl9saW5lc1twb3NpdGlvbi5saW5lTnVtYmVyIC0gMV0uc3Vic3RyaW5nKHBvc2l0aW9uLmNvbHVtbiAtIDEpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBcHBlbmQgb3ZlcmZsb3dpbmcgdGV4dCBmcm9tIGZpcnN0IGxpbmUgdG8gdGhlIGVuZCBvZiB0ZXh0IHRvIGluc2VydAogICAgICAgICAgICBpbnNlcnRMaW5lc1tpbnNlcnRMaW5lcy5sZW5ndGggLSAxXSArPSB0aGlzLl9saW5lc1twb3NpdGlvbi5saW5lTnVtYmVyIC0gMV0uc3Vic3RyaW5nKHBvc2l0aW9uLmNvbHVtbiAtIDEpOwogICAgICAgICAgICAvLyBEZWxldGUgb3ZlcmZsb3dpbmcgdGV4dCBmcm9tIGZpcnN0IGxpbmUgYW5kIGluc2VydCB0ZXh0IG9uIGZpcnN0IGxpbmUKICAgICAgICAgICAgdGhpcy5fc2V0TGluZVRleHQocG9zaXRpb24ubGluZU51bWJlciAtIDEsIHRoaXMuX2xpbmVzW3Bvc2l0aW9uLmxpbmVOdW1iZXIgLSAxXS5zdWJzdHJpbmcoMCwgcG9zaXRpb24uY29sdW1uIC0gMSkKICAgICAgICAgICAgICAgICsgaW5zZXJ0TGluZXNbMF0pOwogICAgICAgICAgICAvLyBJbnNlcnQgbmV3IGxpbmVzICYgc3RvcmUgbGVuZ3RocwogICAgICAgICAgICBsZXQgbmV3TGVuZ3RocyA9IG5ldyBVaW50MzJBcnJheShpbnNlcnRMaW5lcy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpbnNlcnRMaW5lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5fbGluZXMuc3BsaWNlKHBvc2l0aW9uLmxpbmVOdW1iZXIgKyBpIC0gMSwgMCwgaW5zZXJ0TGluZXNbaV0pOwogICAgICAgICAgICAgICAgbmV3TGVuZ3Roc1tpIC0gMV0gPSBpbnNlcnRMaW5lc1tpXS5sZW5ndGggKyB0aGlzLl9lb2wubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9saW5lU3RhcnRzKSB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgcHJlZml4IHN1bQogICAgICAgICAgICAgICAgdGhpcy5fbGluZVN0YXJ0cy5pbnNlcnRWYWx1ZXMocG9zaXRpb24ubGluZU51bWJlciwgbmV3TGVuZ3Rocyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjb25zdCBVU1VBTF9XT1JEX1NFUEFSQVRPUlMgPSAnYH4hQCMkJV4mKigpLT0rW3tdfVxcfDs6XCciLC48Pi8/JzsKICAgIC8qKgogICAgICogQ3JlYXRlIGEgd29yZCBkZWZpbml0aW9uIHJlZ3VsYXIgZXhwcmVzc2lvbiBiYXNlZCBvbiBkZWZhdWx0IHdvcmQgc2VwYXJhdG9ycy4KICAgICAqIE9wdGlvbmFsbHkgcHJvdmlkZSBhbGxvd2VkIHNlcGFyYXRvcnMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gd29yZHMuCiAgICAgKgogICAgICogVGhlIGRlZmF1bHQgd291bGQgbG9vayBsaWtlIHRoaXM6CiAgICAgKiAvKC0/XGQqXC5cZFx3Kil8KFteXGBcflwhXEBcI1wkXCVcXlwmXCpcKFwpXC1cPVwrXFtce1xdXH1cXFx8XDtcOlwnXCJcLFwuXDxcPlwvXD9cc10rKS9nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVdvcmRSZWdFeHAoYWxsb3dJbldvcmRzID0gJycpIHsKICAgICAgICBsZXQgc291cmNlID0gJygtP1xcZCpcXC5cXGRcXHcqKXwoW14nOwogICAgICAgIGZvciAoY29uc3Qgc2VwIG9mIFVTVUFMX1dPUkRfU0VQQVJBVE9SUykgewogICAgICAgICAgICBpZiAoYWxsb3dJbldvcmRzLmluZGV4T2Yoc2VwKSA+PSAwKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzb3VyY2UgKz0gJ1xcJyArIHNlcDsKICAgICAgICB9CiAgICAgICAgc291cmNlICs9ICdcXHNdKyknOwogICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHNvdXJjZSwgJ2cnKTsKICAgIH0KICAgIC8vIGNhdGNoZXMgbnVtYmVycyAoaW5jbHVkaW5nIGZsb2F0aW5nIG51bWJlcnMpIGluIHRoZSBmaXJzdCBncm91cCwgYW5kIGFscGhhbnVtIGluIHRoZSBzZWNvbmQKICAgIGNvbnN0IERFRkFVTFRfV09SRF9SRUdFWFAgPSBjcmVhdGVXb3JkUmVnRXhwKCk7CiAgICBmdW5jdGlvbiBlbnN1cmVWYWxpZFdvcmREZWZpbml0aW9uKHdvcmREZWZpbml0aW9uKSB7CiAgICAgICAgbGV0IHJlc3VsdCA9IERFRkFVTFRfV09SRF9SRUdFWFA7CiAgICAgICAgaWYgKHdvcmREZWZpbml0aW9uICYmICh3b3JkRGVmaW5pdGlvbiBpbnN0YW5jZW9mIFJlZ0V4cCkpIHsKICAgICAgICAgICAgaWYgKCF3b3JkRGVmaW5pdGlvbi5nbG9iYWwpIHsKICAgICAgICAgICAgICAgIGxldCBmbGFncyA9ICdnJzsKICAgICAgICAgICAgICAgIGlmICh3b3JkRGVmaW5pdGlvbi5pZ25vcmVDYXNlKSB7CiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgKz0gJ2knOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHdvcmREZWZpbml0aW9uLm11bHRpbGluZSkgewogICAgICAgICAgICAgICAgICAgIGZsYWdzICs9ICdtJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh3b3JkRGVmaW5pdGlvbi51bmljb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgZmxhZ3MgKz0gJ3UnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFJlZ0V4cCh3b3JkRGVmaW5pdGlvbi5zb3VyY2UsIGZsYWdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHdvcmREZWZpbml0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJlc3VsdC5sYXN0SW5kZXggPSAwOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBjb25zdCBfZGVmYXVsdENvbmZpZyA9IHsKICAgICAgICBtYXhMZW46IDEwMDAsCiAgICAgICAgd2luZG93U2l6ZTogMTUsCiAgICAgICAgdGltZUJ1ZGdldDogMTUwCiAgICB9OwogICAgZnVuY3Rpb24gZ2V0V29yZEF0VGV4dChjb2x1bW4sIHdvcmREZWZpbml0aW9uLCB0ZXh0LCB0ZXh0T2Zmc2V0LCBjb25maWcgPSBfZGVmYXVsdENvbmZpZykgewogICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA+IGNvbmZpZy5tYXhMZW4pIHsKICAgICAgICAgICAgLy8gZG9uJ3QgdGhyb3cgc3RyaW5ncyB0aGF0IGxvbmcgYXQgdGhlIHJlZ2V4cAogICAgICAgICAgICAvLyBidXQgdXNlIGEgc3ViLXN0cmluZyBpbiB3aGljaCBhIHdvcmQgbXVzdCBvY2N1cgogICAgICAgICAgICBsZXQgc3RhcnQgPSBjb2x1bW4gLSBjb25maWcubWF4TGVuIC8gMjsKICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgICAgICAgICAgc3RhcnQgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGV4dE9mZnNldCArPSBzdGFydDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIGNvbHVtbiArIGNvbmZpZy5tYXhMZW4gLyAyKTsKICAgICAgICAgICAgcmV0dXJuIGdldFdvcmRBdFRleHQoY29sdW1uLCB3b3JkRGVmaW5pdGlvbiwgdGV4dCwgdGV4dE9mZnNldCwgY29uZmlnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdDEgPSBEYXRlLm5vdygpOwogICAgICAgIGNvbnN0IHBvcyA9IGNvbHVtbiAtIDEgLSB0ZXh0T2Zmc2V0OwogICAgICAgIGxldCBwcmV2UmVnZXhJbmRleCA9IC0xOwogICAgICAgIGxldCBtYXRjaCA9IG51bGw7CiAgICAgICAgZm9yIChsZXQgaSA9IDE7OyBpKyspIHsKICAgICAgICAgICAgLy8gY2hlY2sgdGltZSBidWRnZXQKICAgICAgICAgICAgaWYgKERhdGUubm93KCkgLSB0MSA+PSBjb25maWcudGltZUJ1ZGdldCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGluZGV4IGF0IHdoaWNoIHRoZSByZWdleHAgc2hvdWxkIHN0YXJ0IG1hdGNoaW5nLCBhbHNvIGtub3cgd2hlcmUgaXQKICAgICAgICAgICAgLy8gc2hvdWxkIHN0b3Agc28gdGhhdCBzdWJzZXF1ZW50IHNlYXJjaCBkb24ndCByZXBlYXQgcHJldmlvdXMgc2VhcmNoZXMKICAgICAgICAgICAgY29uc3QgcmVnZXhJbmRleCA9IHBvcyAtIGNvbmZpZy53aW5kb3dTaXplICogaTsKICAgICAgICAgICAgd29yZERlZmluaXRpb24ubGFzdEluZGV4ID0gTWF0aC5tYXgoMCwgcmVnZXhJbmRleCk7CiAgICAgICAgICAgIGNvbnN0IHRoaXNNYXRjaCA9IF9maW5kUmVnZXhNYXRjaEVuY2xvc2luZ1Bvc2l0aW9uKHdvcmREZWZpbml0aW9uLCB0ZXh0LCBwb3MsIHByZXZSZWdleEluZGV4KTsKICAgICAgICAgICAgaWYgKCF0aGlzTWF0Y2ggJiYgbWF0Y2gpIHsKICAgICAgICAgICAgICAgIC8vIHN0b3A6IHdlIGhhdmUgc29tZXRoaW5nCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYXRjaCA9IHRoaXNNYXRjaDsKICAgICAgICAgICAgLy8gc3RvcDogc2VhcmNoZWQgYXQgc3RhcnQKICAgICAgICAgICAgaWYgKHJlZ2V4SW5kZXggPD0gMCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJldlJlZ2V4SW5kZXggPSByZWdleEluZGV4OwogICAgICAgIH0KICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHsKICAgICAgICAgICAgICAgIHdvcmQ6IG1hdGNoWzBdLAogICAgICAgICAgICAgICAgc3RhcnRDb2x1bW46IHRleHRPZmZzZXQgKyAxICsgbWF0Y2guaW5kZXgsCiAgICAgICAgICAgICAgICBlbmRDb2x1bW46IHRleHRPZmZzZXQgKyAxICsgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgKICAgICAgICAgICAgfTsKICAgICAgICAgICAgd29yZERlZmluaXRpb24ubGFzdEluZGV4ID0gMDsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiBfZmluZFJlZ2V4TWF0Y2hFbmNsb3NpbmdQb3NpdGlvbih3b3JkRGVmaW5pdGlvbiwgdGV4dCwgcG9zLCBzdG9wUG9zKSB7CiAgICAgICAgbGV0IG1hdGNoOwogICAgICAgIHdoaWxlIChtYXRjaCA9IHdvcmREZWZpbml0aW9uLmV4ZWModGV4dCkpIHsKICAgICAgICAgICAgY29uc3QgbWF0Y2hJbmRleCA9IG1hdGNoLmluZGV4IHx8IDA7CiAgICAgICAgICAgIGlmIChtYXRjaEluZGV4IDw9IHBvcyAmJiB3b3JkRGVmaW5pdGlvbi5sYXN0SW5kZXggPj0gcG9zKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc3RvcFBvcyA+IDAgJiYgbWF0Y2hJbmRleCA+IHN0b3BQb3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgLyoqCiAgICAgKiBBIGZhc3QgY2hhcmFjdGVyIGNsYXNzaWZpZXIgdGhhdCB1c2VzIGEgY29tcGFjdCBhcnJheSBmb3IgQVNDSUkgdmFsdWVzLgogICAgICovCiAgICBjbGFzcyBDaGFyYWN0ZXJDbGFzc2lmaWVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihfZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgICAgIGxldCBkZWZhdWx0VmFsdWUgPSB0b1VpbnQ4KF9kZWZhdWx0VmFsdWUpOwogICAgICAgICAgICB0aGlzLl9kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7CiAgICAgICAgICAgIHRoaXMuX2FzY2lpTWFwID0gQ2hhcmFjdGVyQ2xhc3NpZmllci5fY3JlYXRlQXNjaWlNYXAoZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgX2NyZWF0ZUFzY2lpTWFwKGRlZmF1bHRWYWx1ZSkgewogICAgICAgICAgICBsZXQgYXNjaWlNYXAgPSBuZXcgVWludDhBcnJheSgyNTYpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAgICAgICAgICAgICAgICBhc2NpaU1hcFtpXSA9IGRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXNjaWlNYXA7CiAgICAgICAgfQogICAgICAgIHNldChjaGFyQ29kZSwgX3ZhbHVlKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRvVWludDgoX3ZhbHVlKTsKICAgICAgICAgICAgaWYgKGNoYXJDb2RlID49IDAgJiYgY2hhckNvZGUgPCAyNTYpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FzY2lpTWFwW2NoYXJDb2RlXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fbWFwLnNldChjaGFyQ29kZSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdldChjaGFyQ29kZSkgewogICAgICAgICAgICBpZiAoY2hhckNvZGUgPj0gMCAmJiBjaGFyQ29kZSA8IDI1NikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FzY2lpTWFwW2NoYXJDb2RlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5fbWFwLmdldChjaGFyQ29kZSkgfHwgdGhpcy5fZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGNsYXNzIFVpbnQ4TWF0cml4IHsKICAgICAgICBjb25zdHJ1Y3Rvcihyb3dzLCBjb2xzLCBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHJvd3MgKiBjb2xzKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IHJvd3MgKiBjb2xzOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGRhdGFbaV0gPSBkZWZhdWx0VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMucm93cyA9IHJvd3M7CiAgICAgICAgICAgIHRoaXMuY29scyA9IGNvbHM7CiAgICAgICAgfQogICAgICAgIGdldChyb3csIGNvbCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YVtyb3cgKiB0aGlzLmNvbHMgKyBjb2xdOwogICAgICAgIH0KICAgICAgICBzZXQocm93LCBjb2wsIHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2RhdGFbcm93ICogdGhpcy5jb2xzICsgY29sXSA9IHZhbHVlOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFN0YXRlTWFjaGluZSB7CiAgICAgICAgY29uc3RydWN0b3IoZWRnZXMpIHsKICAgICAgICAgICAgbGV0IG1heENoYXJDb2RlID0gMDsKICAgICAgICAgICAgbGV0IG1heFN0YXRlID0gMCAvKiBJbnZhbGlkICovOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gZWRnZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGxldCBbZnJvbSwgY2hDb2RlLCB0b10gPSBlZGdlc1tpXTsKICAgICAgICAgICAgICAgIGlmIChjaENvZGUgPiBtYXhDaGFyQ29kZSkgewogICAgICAgICAgICAgICAgICAgIG1heENoYXJDb2RlID0gY2hDb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGZyb20gPiBtYXhTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIG1heFN0YXRlID0gZnJvbTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0byA+IG1heFN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgbWF4U3RhdGUgPSB0bzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBtYXhDaGFyQ29kZSsrOwogICAgICAgICAgICBtYXhTdGF0ZSsrOwogICAgICAgICAgICBsZXQgc3RhdGVzID0gbmV3IFVpbnQ4TWF0cml4KG1heFN0YXRlLCBtYXhDaGFyQ29kZSwgMCAvKiBJbnZhbGlkICovKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGVkZ2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBsZXQgW2Zyb20sIGNoQ29kZSwgdG9dID0gZWRnZXNbaV07CiAgICAgICAgICAgICAgICBzdGF0ZXMuc2V0KGZyb20sIGNoQ29kZSwgdG8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3N0YXRlcyA9IHN0YXRlczsKICAgICAgICAgICAgdGhpcy5fbWF4Q2hhckNvZGUgPSBtYXhDaGFyQ29kZTsKICAgICAgICB9CiAgICAgICAgbmV4dFN0YXRlKGN1cnJlbnRTdGF0ZSwgY2hDb2RlKSB7CiAgICAgICAgICAgIGlmIChjaENvZGUgPCAwIHx8IGNoQ29kZSA+PSB0aGlzLl9tYXhDaGFyQ29kZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogSW52YWxpZCAqLzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGVzLmdldChjdXJyZW50U3RhdGUsIGNoQ29kZSk7CiAgICAgICAgfQogICAgfQogICAgLy8gU3RhdGUgbWFjaGluZSBmb3IgaHR0cDovLyBvciBodHRwczovLyBvciBmaWxlOi8vCiAgICBsZXQgX3N0YXRlTWFjaGluZSA9IG51bGw7CiAgICBmdW5jdGlvbiBnZXRTdGF0ZU1hY2hpbmUoKSB7CiAgICAgICAgaWYgKF9zdGF0ZU1hY2hpbmUgPT09IG51bGwpIHsKICAgICAgICAgICAgX3N0YXRlTWFjaGluZSA9IG5ldyBTdGF0ZU1hY2hpbmUoWwogICAgICAgICAgICAgICAgWzEgLyogU3RhcnQgKi8sIDEwNCAvKiBoICovLCAyIC8qIEggKi9dLAogICAgICAgICAgICAgICAgWzEgLyogU3RhcnQgKi8sIDcyIC8qIEggKi8sIDIgLyogSCAqL10sCiAgICAgICAgICAgICAgICBbMSAvKiBTdGFydCAqLywgMTAyIC8qIGYgKi8sIDYgLyogRiAqL10sCiAgICAgICAgICAgICAgICBbMSAvKiBTdGFydCAqLywgNzAgLyogRiAqLywgNiAvKiBGICovXSwKICAgICAgICAgICAgICAgIFsyIC8qIEggKi8sIDExNiAvKiB0ICovLCAzIC8qIEhUICovXSwKICAgICAgICAgICAgICAgIFsyIC8qIEggKi8sIDg0IC8qIFQgKi8sIDMgLyogSFQgKi9dLAogICAgICAgICAgICAgICAgWzMgLyogSFQgKi8sIDExNiAvKiB0ICovLCA0IC8qIEhUVCAqL10sCiAgICAgICAgICAgICAgICBbMyAvKiBIVCAqLywgODQgLyogVCAqLywgNCAvKiBIVFQgKi9dLAogICAgICAgICAgICAgICAgWzQgLyogSFRUICovLCAxMTIgLyogcCAqLywgNSAvKiBIVFRQICovXSwKICAgICAgICAgICAgICAgIFs0IC8qIEhUVCAqLywgODAgLyogUCAqLywgNSAvKiBIVFRQICovXSwKICAgICAgICAgICAgICAgIFs1IC8qIEhUVFAgKi8sIDExNSAvKiBzICovLCA5IC8qIEJlZm9yZUNvbG9uICovXSwKICAgICAgICAgICAgICAgIFs1IC8qIEhUVFAgKi8sIDgzIC8qIFMgKi8sIDkgLyogQmVmb3JlQ29sb24gKi9dLAogICAgICAgICAgICAgICAgWzUgLyogSFRUUCAqLywgNTggLyogQ29sb24gKi8sIDEwIC8qIEFmdGVyQ29sb24gKi9dLAogICAgICAgICAgICAgICAgWzYgLyogRiAqLywgMTA1IC8qIGkgKi8sIDcgLyogRkkgKi9dLAogICAgICAgICAgICAgICAgWzYgLyogRiAqLywgNzMgLyogSSAqLywgNyAvKiBGSSAqL10sCiAgICAgICAgICAgICAgICBbNyAvKiBGSSAqLywgMTA4IC8qIGwgKi8sIDggLyogRklMICovXSwKICAgICAgICAgICAgICAgIFs3IC8qIEZJICovLCA3NiAvKiBMICovLCA4IC8qIEZJTCAqL10sCiAgICAgICAgICAgICAgICBbOCAvKiBGSUwgKi8sIDEwMSAvKiBlICovLCA5IC8qIEJlZm9yZUNvbG9uICovXSwKICAgICAgICAgICAgICAgIFs4IC8qIEZJTCAqLywgNjkgLyogRSAqLywgOSAvKiBCZWZvcmVDb2xvbiAqL10sCiAgICAgICAgICAgICAgICBbOSAvKiBCZWZvcmVDb2xvbiAqLywgNTggLyogQ29sb24gKi8sIDEwIC8qIEFmdGVyQ29sb24gKi9dLAogICAgICAgICAgICAgICAgWzEwIC8qIEFmdGVyQ29sb24gKi8sIDQ3IC8qIFNsYXNoICovLCAxMSAvKiBBbG1vc3RUaGVyZSAqL10sCiAgICAgICAgICAgICAgICBbMTEgLyogQWxtb3N0VGhlcmUgKi8sIDQ3IC8qIFNsYXNoICovLCAxMiAvKiBFbmQgKi9dLAogICAgICAgICAgICBdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9zdGF0ZU1hY2hpbmU7CiAgICB9CiAgICBsZXQgX2NsYXNzaWZpZXIgPSBudWxsOwogICAgZnVuY3Rpb24gZ2V0Q2xhc3NpZmllcigpIHsKICAgICAgICBpZiAoX2NsYXNzaWZpZXIgPT09IG51bGwpIHsKICAgICAgICAgICAgX2NsYXNzaWZpZXIgPSBuZXcgQ2hhcmFjdGVyQ2xhc3NpZmllcigwIC8qIE5vbmUgKi8pOwogICAgICAgICAgICAvLyBhbGxvdy1hbnktdW5pY29kZS1uZXh0LWxpbmUKICAgICAgICAgICAgY29uc3QgRk9SQ0VfVEVSTUlOQVRJT05fQ0hBUkFDVEVSUyA9ICcgXHQ8PlwnXCLjgIHjgILvvaHvvaTvvIzvvI7vvJrvvJvigJjjgIjjgIzjgI7jgJTvvIjvvLvvvZvvvaLvvaPvvZ3vvL3vvInjgJXjgI/jgI3jgInigJnvvYDvvZ7igKYnOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IEZPUkNFX1RFUk1JTkFUSU9OX0NIQVJBQ1RFUlMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIF9jbGFzc2lmaWVyLnNldChGT1JDRV9URVJNSU5BVElPTl9DSEFSQUNURVJTLmNoYXJDb2RlQXQoaSksIDEgLyogRm9yY2VUZXJtaW5hdGlvbiAqLyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgQ0FOTk9UX0VORF9XSVRIX0NIQVJBQ1RFUlMgPSAnLiw7JzsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBDQU5OT1RfRU5EX1dJVEhfQ0hBUkFDVEVSUy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgX2NsYXNzaWZpZXIuc2V0KENBTk5PVF9FTkRfV0lUSF9DSEFSQUNURVJTLmNoYXJDb2RlQXQoaSksIDIgLyogQ2Fubm90RW5kSW4gKi8pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBfY2xhc3NpZmllcjsKICAgIH0KICAgIGNsYXNzIExpbmtDb21wdXRlciB7CiAgICAgICAgc3RhdGljIF9jcmVhdGVMaW5rKGNsYXNzaWZpZXIsIGxpbmUsIGxpbmVOdW1iZXIsIGxpbmtCZWdpbkluZGV4LCBsaW5rRW5kSW5kZXgpIHsKICAgICAgICAgICAgLy8gRG8gbm90IGFsbG93IHRvIGVuZCBsaW5rIGluIGNlcnRhaW4gY2hhcmFjdGVycy4uLgogICAgICAgICAgICBsZXQgbGFzdEluY2x1ZGVkQ2hhckluZGV4ID0gbGlua0VuZEluZGV4IC0gMTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgY29uc3QgY2hDb2RlID0gbGluZS5jaGFyQ29kZUF0KGxhc3RJbmNsdWRlZENoYXJJbmRleCk7CiAgICAgICAgICAgICAgICBjb25zdCBjaENsYXNzID0gY2xhc3NpZmllci5nZXQoY2hDb2RlKTsKICAgICAgICAgICAgICAgIGlmIChjaENsYXNzICE9PSAyIC8qIENhbm5vdEVuZEluICovKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsYXN0SW5jbHVkZWRDaGFySW5kZXgtLTsKICAgICAgICAgICAgfSB3aGlsZSAobGFzdEluY2x1ZGVkQ2hhckluZGV4ID4gbGlua0JlZ2luSW5kZXgpOwogICAgICAgICAgICAvLyBIYW5kbGUgbGlua3MgZW5jbG9zZWQgaW4gcGFyZW5zLCBzcXVhcmUgYnJhY2tldHMgYW5kIGN1cmx5cy4KICAgICAgICAgICAgaWYgKGxpbmtCZWdpbkluZGV4ID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgY2hhckNvZGVCZWZvcmVMaW5rID0gbGluZS5jaGFyQ29kZUF0KGxpbmtCZWdpbkluZGV4IC0gMSk7CiAgICAgICAgICAgICAgICBjb25zdCBsYXN0Q2hhckNvZGVJbkxpbmsgPSBsaW5lLmNoYXJDb2RlQXQobGFzdEluY2x1ZGVkQ2hhckluZGV4KTsKICAgICAgICAgICAgICAgIGlmICgoY2hhckNvZGVCZWZvcmVMaW5rID09PSA0MCAvKiBPcGVuUGFyZW4gKi8gJiYgbGFzdENoYXJDb2RlSW5MaW5rID09PSA0MSAvKiBDbG9zZVBhcmVuICovKQogICAgICAgICAgICAgICAgICAgIHx8IChjaGFyQ29kZUJlZm9yZUxpbmsgPT09IDkxIC8qIE9wZW5TcXVhcmVCcmFja2V0ICovICYmIGxhc3RDaGFyQ29kZUluTGluayA9PT0gOTMgLyogQ2xvc2VTcXVhcmVCcmFja2V0ICovKQogICAgICAgICAgICAgICAgICAgIHx8IChjaGFyQ29kZUJlZm9yZUxpbmsgPT09IDEyMyAvKiBPcGVuQ3VybHlCcmFjZSAqLyAmJiBsYXN0Q2hhckNvZGVJbkxpbmsgPT09IDEyNSAvKiBDbG9zZUN1cmx5QnJhY2UgKi8pKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGVuZCBpbiApIGlmICggaXMgYmVmb3JlIHRoZSBsaW5rIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGVuZCBpbiBdIGlmIFsgaXMgYmVmb3JlIHRoZSBsaW5rIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IGVuZCBpbiB9IGlmIHsgaXMgYmVmb3JlIHRoZSBsaW5rIHN0YXJ0CiAgICAgICAgICAgICAgICAgICAgbGFzdEluY2x1ZGVkQ2hhckluZGV4LS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJhbmdlOiB7CiAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBsaW5lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiBsaW5rQmVnaW5JbmRleCArIDEsCiAgICAgICAgICAgICAgICAgICAgZW5kTGluZU51bWJlcjogbGluZU51bWJlciwKICAgICAgICAgICAgICAgICAgICBlbmRDb2x1bW46IGxhc3RJbmNsdWRlZENoYXJJbmRleCArIDIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB1cmw6IGxpbmUuc3Vic3RyaW5nKGxpbmtCZWdpbkluZGV4LCBsYXN0SW5jbHVkZWRDaGFySW5kZXggKyAxKQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBzdGF0aWMgY29tcHV0ZUxpbmtzKG1vZGVsLCBzdGF0ZU1hY2hpbmUgPSBnZXRTdGF0ZU1hY2hpbmUoKSkgewogICAgICAgICAgICBjb25zdCBjbGFzc2lmaWVyID0gZ2V0Q2xhc3NpZmllcigpOwogICAgICAgICAgICBsZXQgcmVzdWx0ID0gW107CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxLCBsaW5lQ291bnQgPSBtb2RlbC5nZXRMaW5lQ291bnQoKTsgaSA8PSBsaW5lQ291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgY29uc3QgbGluZSA9IG1vZGVsLmdldExpbmVDb250ZW50KGkpOwogICAgICAgICAgICAgICAgY29uc3QgbGVuID0gbGluZS5sZW5ndGg7CiAgICAgICAgICAgICAgICBsZXQgaiA9IDA7CiAgICAgICAgICAgICAgICBsZXQgbGlua0JlZ2luSW5kZXggPSAwOwogICAgICAgICAgICAgICAgbGV0IGxpbmtCZWdpbkNoQ29kZSA9IDA7CiAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSAxIC8qIFN0YXJ0ICovOwogICAgICAgICAgICAgICAgbGV0IGhhc09wZW5QYXJlbnMgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGxldCBoYXNPcGVuU3F1YXJlQnJhY2tldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgbGV0IGluU3F1YXJlQnJhY2tldHMgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGxldCBoYXNPcGVuQ3VybHlCcmFja2V0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB3aGlsZSAoaiA8IGxlbikgewogICAgICAgICAgICAgICAgICAgIGxldCByZXNldFN0YXRlTWFjaGluZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoQ29kZSA9IGxpbmUuY2hhckNvZGVBdChqKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT09IDEzIC8qIEFjY2VwdCAqLykgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hDbGFzczsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjaENvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDAgLyogT3BlblBhcmVuICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09wZW5QYXJlbnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAwIC8qIE5vbmUgKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQxIC8qIENsb3NlUGFyZW4gKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IChoYXNPcGVuUGFyZW5zID8gMCAvKiBOb25lICovIDogMSAvKiBGb3JjZVRlcm1pbmF0aW9uICovKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOTEgLyogT3BlblNxdWFyZUJyYWNrZXQgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TcXVhcmVCcmFja2V0cyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3BlblNxdWFyZUJyYWNrZXQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAwIC8qIE5vbmUgKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDkzIC8qIENsb3NlU3F1YXJlQnJhY2tldCAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNxdWFyZUJyYWNrZXRzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IChoYXNPcGVuU3F1YXJlQnJhY2tldCA/IDAgLyogTm9uZSAqLyA6IDEgLyogRm9yY2VUZXJtaW5hdGlvbiAqLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEyMyAvKiBPcGVuQ3VybHlCcmFjZSAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNPcGVuQ3VybHlCcmFja2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gMCAvKiBOb25lICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjUgLyogQ2xvc2VDdXJseUJyYWNlICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAoaGFzT3BlbkN1cmx5QnJhY2tldCA/IDAgLyogTm9uZSAqLyA6IDEgLyogRm9yY2VUZXJtaW5hdGlvbiAqLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZm9sbG93aW5nIHRocmVlIHJ1bGVzIG1ha2UgaXQgdGhhdCAnIG9yICIgb3IgYCBhcmUgYWxsb3dlZCBpbnNpZGUgbGlua3MgaWYgdGhlIGxpbmsgYmVnYW4gd2l0aCBhIGRpZmZlcmVudCBvbmUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzkgLyogU2luZ2xlUXVvdGUgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IChsaW5rQmVnaW5DaENvZGUgPT09IDM0IC8qIERvdWJsZVF1b3RlICovIHx8IGxpbmtCZWdpbkNoQ29kZSA9PT0gOTYgLyogQmFja1RpY2sgKi8pID8gMCAvKiBOb25lICovIDogMSAvKiBGb3JjZVRlcm1pbmF0aW9uICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzNCAvKiBEb3VibGVRdW90ZSAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gKGxpbmtCZWdpbkNoQ29kZSA9PT0gMzkgLyogU2luZ2xlUXVvdGUgKi8gfHwgbGlua0JlZ2luQ2hDb2RlID09PSA5NiAvKiBCYWNrVGljayAqLykgPyAwIC8qIE5vbmUgKi8gOiAxIC8qIEZvcmNlVGVybWluYXRpb24gKi87CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDk2IC8qIEJhY2tUaWNrICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAobGlua0JlZ2luQ2hDb2RlID09PSAzOSAvKiBTaW5nbGVRdW90ZSAqLyB8fCBsaW5rQmVnaW5DaENvZGUgPT09IDM0IC8qIERvdWJsZVF1b3RlICovKSA/IDAgLyogTm9uZSAqLyA6IDEgLyogRm9yY2VUZXJtaW5hdGlvbiAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDIgLyogQXN0ZXJpc2sgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYCpgIHRlcm1pbmF0ZXMgYSBsaW5rIGlmIHRoZSBsaW5rIGJlZ2FuIHdpdGggYCpgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IChsaW5rQmVnaW5DaENvZGUgPT09IDQyIC8qIEFzdGVyaXNrICovKSA/IDEgLyogRm9yY2VUZXJtaW5hdGlvbiAqLyA6IDAgLyogTm9uZSAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTI0IC8qIFBpcGUgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYHxgIHRlcm1pbmF0ZXMgYSBsaW5rIGlmIHRoZSBsaW5rIGJlZ2FuIHdpdGggYHxgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hDbGFzcyA9IChsaW5rQmVnaW5DaENvZGUgPT09IDEyNCAvKiBQaXBlICovKSA/IDEgLyogRm9yY2VUZXJtaW5hdGlvbiAqLyA6IDAgLyogTm9uZSAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzIgLyogU3BhY2UgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYCBgIGFsbG93IHNwYWNlIGluIGJldHdlZW4gWyBhbmQgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAoaW5TcXVhcmVCcmFja2V0cyA/IDAgLyogTm9uZSAqLyA6IDEgLyogRm9yY2VUZXJtaW5hdGlvbiAqLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSBjbGFzc2lmaWVyLmdldChjaENvZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGNoYXJhY3RlciB0ZXJtaW5hdGVzIGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoQ2xhc3MgPT09IDEgLyogRm9yY2VUZXJtaW5hdGlvbiAqLykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goTGlua0NvbXB1dGVyLl9jcmVhdGVMaW5rKGNsYXNzaWZpZXIsIGxpbmUsIGksIGxpbmtCZWdpbkluZGV4LCBqKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldFN0YXRlTWFjaGluZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09IDEyIC8qIEVuZCAqLykgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hDbGFzczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoQ29kZSA9PT0gOTEgLyogT3BlblNxdWFyZUJyYWNrZXQgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IGZvciB0aGUgYXV0aG9yaXR5IHBhcnQgdG8gY29udGFpbiBpcHY2IGFkZHJlc3NlcyB3aGljaCBjb250YWluIFsgYW5kIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc09wZW5TcXVhcmVCcmFja2V0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoQ2xhc3MgPSAwIC8qIE5vbmUgKi87CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaENsYXNzID0gY2xhc3NpZmllci5nZXQoY2hDb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBjaGFyYWN0ZXIgdGVybWluYXRlcyBsaW5rCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaENsYXNzID09PSAxIC8qIEZvcmNlVGVybWluYXRpb24gKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2V0U3RhdGVNYWNoaW5lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTMgLyogQWNjZXB0ICovOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlTWFjaGluZS5uZXh0U3RhdGUoc3RhdGUsIGNoQ29kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gMCAvKiBJbnZhbGlkICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNldFN0YXRlTWFjaGluZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2V0U3RhdGVNYWNoaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMSAvKiBTdGFydCAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgaGFzT3BlblBhcmVucyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBoYXNPcGVuU3F1YXJlQnJhY2tldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBoYXNPcGVuQ3VybHlCcmFja2V0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlY29yZCB3aGVyZSB0aGUgbGluayBzdGFydGVkCiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtCZWdpbkluZGV4ID0gaiArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtCZWdpbkNoQ29kZSA9IGNoQ29kZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaisrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSAxMyAvKiBBY2NlcHQgKi8pIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChMaW5rQ29tcHV0ZXIuX2NyZWF0ZUxpbmsoY2xhc3NpZmllciwgbGluZSwgaSwgbGlua0JlZ2luSW5kZXgsIGxlbikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBsaW5rcyBjb250YWlucyBpbiB0aGUgcHJvdmlkZWQKICAgICAqIGRvY3VtZW50LiAqTm90ZSogdGhhdCB0aGlzIG9wZXJhdGlvbiBpcyBjb21wdXRhdGlvbmFsCiAgICAgKiBleHBlbnNpdmUgYW5kIHNob3VsZCBub3QgcnVuIGluIHRoZSBVSSB0aHJlYWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbXB1dGVMaW5rcyhtb2RlbCkgewogICAgICAgIGlmICghbW9kZWwgfHwgdHlwZW9mIG1vZGVsLmdldExpbmVDb3VudCAhPT0gJ2Z1bmN0aW9uJyB8fCB0eXBlb2YgbW9kZWwuZ2V0TGluZUNvbnRlbnQgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgLy8gVW5rbm93biBjYWxsZXIhCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIExpbmtDb21wdXRlci5jb21wdXRlTGlua3MobW9kZWwpOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY2xhc3MgQmFzaWNJbnBsYWNlUmVwbGFjZSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRWYWx1ZVNldCA9IFsKICAgICAgICAgICAgICAgIFsndHJ1ZScsICdmYWxzZSddLAogICAgICAgICAgICAgICAgWydUcnVlJywgJ0ZhbHNlJ10sCiAgICAgICAgICAgICAgICBbJ1ByaXZhdGUnLCAnUHVibGljJywgJ0ZyaWVuZCcsICdSZWFkT25seScsICdQYXJ0aWFsJywgJ1Byb3RlY3RlZCcsICdXcml0ZU9ubHknXSwKICAgICAgICAgICAgICAgIFsncHVibGljJywgJ3Byb3RlY3RlZCcsICdwcml2YXRlJ10sCiAgICAgICAgICAgIF07CiAgICAgICAgfQogICAgICAgIG5hdmlnYXRlVmFsdWVTZXQocmFuZ2UxLCB0ZXh0MSwgcmFuZ2UyLCB0ZXh0MiwgdXApIHsKICAgICAgICAgICAgaWYgKHJhbmdlMSAmJiB0ZXh0MSkgewogICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuZG9OYXZpZ2F0ZVZhbHVlU2V0KHRleHQxLCB1cCk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHJhbmdlMSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJhbmdlMiAmJiB0ZXh0MikgewogICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuZG9OYXZpZ2F0ZVZhbHVlU2V0KHRleHQyLCB1cCk7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHJhbmdlMiwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHJlc3VsdAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGRvTmF2aWdhdGVWYWx1ZVNldCh0ZXh0LCB1cCkgewogICAgICAgICAgICBsZXQgbnVtYmVyUmVzdWx0ID0gdGhpcy5udW1iZXJSZXBsYWNlKHRleHQsIHVwKTsKICAgICAgICAgICAgaWYgKG51bWJlclJlc3VsdCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlclJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy50ZXh0UmVwbGFjZSh0ZXh0LCB1cCk7CiAgICAgICAgfQogICAgICAgIG51bWJlclJlcGxhY2UodmFsdWUsIHVwKSB7CiAgICAgICAgICAgIGxldCBwcmVjaXNpb24gPSBNYXRoLnBvdygxMCwgdmFsdWUubGVuZ3RoIC0gKHZhbHVlLmxhc3RJbmRleE9mKCcuJykgKyAxKSk7CiAgICAgICAgICAgIGxldCBuMSA9IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIGxldCBuMiA9IHBhcnNlRmxvYXQodmFsdWUpOwogICAgICAgICAgICBpZiAoIWlzTmFOKG4xKSAmJiAhaXNOYU4objIpICYmIG4xID09PSBuMikgewogICAgICAgICAgICAgICAgaWYgKG4xID09PSAwICYmICF1cCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBkb24ndCBkbyBuZWdhdGl2ZQogICAgICAgICAgICAgICAgICAgIC8vCQkJfSBlbHNlIGlmKG4xID09PSA5ICYmIHVwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8JCQkJcmV0dXJuIG51bGw7IC8vIGRvbid0IGluc2VydCAxMCBpbnRvIGEgbnVtYmVyCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBuMSA9IE1hdGguZmxvb3IobjEgKiBwcmVjaXNpb24pOwogICAgICAgICAgICAgICAgICAgIG4xICs9IHVwID8gcHJlY2lzaW9uIDogLXByZWNpc2lvbjsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKG4xIC8gcHJlY2lzaW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgdGV4dFJlcGxhY2UodmFsdWUsIHVwKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnZhbHVlU2V0c1JlcGxhY2UodGhpcy5fZGVmYXVsdFZhbHVlU2V0LCB2YWx1ZSwgdXApOwogICAgICAgIH0KICAgICAgICB2YWx1ZVNldHNSZXBsYWNlKHZhbHVlU2V0cywgdmFsdWUsIHVwKSB7CiAgICAgICAgICAgIGxldCByZXN1bHQgPSBudWxsOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gdmFsdWVTZXRzLmxlbmd0aDsgcmVzdWx0ID09PSBudWxsICYmIGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy52YWx1ZVNldFJlcGxhY2UodmFsdWVTZXRzW2ldLCB2YWx1ZSwgdXApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIHZhbHVlU2V0UmVwbGFjZSh2YWx1ZVNldCwgdmFsdWUsIHVwKSB7CiAgICAgICAgICAgIGxldCBpZHggPSB2YWx1ZVNldC5pbmRleE9mKHZhbHVlKTsKICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICAgICAgICBpZHggKz0gdXAgPyArMSA6IC0xOwogICAgICAgICAgICAgICAgaWYgKGlkeCA8IDApIHsKICAgICAgICAgICAgICAgICAgICBpZHggPSB2YWx1ZVNldC5sZW5ndGggLSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWR4ICU9IHZhbHVlU2V0Lmxlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZVNldFtpZHhdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KICAgIEJhc2ljSW5wbGFjZVJlcGxhY2UuSU5TVEFOQ0UgPSBuZXcgQmFzaWNJbnBsYWNlUmVwbGFjZSgpOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7CiAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTsKICAgICAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBjbGVhclRpbWVvdXQoaGFuZGxlKTsgfSB9OwogICAgfSk7CiAgICB2YXIgQ2FuY2VsbGF0aW9uVG9rZW47CiAgICAoZnVuY3Rpb24gKENhbmNlbGxhdGlvblRva2VuKSB7CiAgICAgICAgZnVuY3Rpb24gaXNDYW5jZWxsYXRpb25Ub2tlbih0aGluZykgewogICAgICAgICAgICBpZiAodGhpbmcgPT09IENhbmNlbGxhdGlvblRva2VuLk5vbmUgfHwgdGhpbmcgPT09IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgTXV0YWJsZVRva2VuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaW5nIHx8IHR5cGVvZiB0aGluZyAhPT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHlwZW9mIHRoaW5nLmlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkID09PSAnYm9vbGVhbicKICAgICAgICAgICAgICAgICYmIHR5cGVvZiB0aGluZy5vbkNhbmNlbGxhdGlvblJlcXVlc3RlZCA9PT0gJ2Z1bmN0aW9uJzsKICAgICAgICB9CiAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXNDYW5jZWxsYXRpb25Ub2tlbiA9IGlzQ2FuY2VsbGF0aW9uVG9rZW47CiAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZSA9IE9iamVjdC5mcmVlemUoewogICAgICAgICAgICBpc0NhbmNlbGxhdGlvblJlcXVlc3RlZDogZmFsc2UsCiAgICAgICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBFdmVudC5Ob25lCiAgICAgICAgfSk7CiAgICAgICAgQ2FuY2VsbGF0aW9uVG9rZW4uQ2FuY2VsbGVkID0gT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiB0cnVlLAogICAgICAgICAgICBvbkNhbmNlbGxhdGlvblJlcXVlc3RlZDogc2hvcnRjdXRFdmVudAogICAgICAgIH0pOwogICAgfSkoQ2FuY2VsbGF0aW9uVG9rZW4gfHwgKENhbmNlbGxhdGlvblRva2VuID0ge30pKTsKICAgIGNsYXNzIE11dGFibGVUb2tlbiB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICBjYW5jZWwoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5faXNDYW5jZWxsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5maXJlKHVuZGVmaW5lZCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZ2V0IGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faXNDYW5jZWxsZWQ7CiAgICAgICAgfQogICAgICAgIGdldCBvbkNhbmNlbGxhdGlvblJlcXVlc3RlZCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ2FuY2VsbGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2hvcnRjdXRFdmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMuX2VtaXR0ZXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSBuZXcgRW1pdHRlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbWl0dGVyLmV2ZW50OwogICAgICAgIH0KICAgICAgICBkaXNwb3NlKCkgewogICAgICAgICAgICBpZiAodGhpcy5fZW1pdHRlcikgewogICAgICAgICAgICAgICAgdGhpcy5fZW1pdHRlci5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIENhbmNlbGxhdGlvblRva2VuU291cmNlIHsKICAgICAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHsKICAgICAgICAgICAgdGhpcy5fdG9rZW4gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudExpc3RlbmVyID0gdW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLl9wYXJlbnRMaXN0ZW5lciA9IHBhcmVudCAmJiBwYXJlbnQub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQodGhpcy5jYW5jZWwsIHRoaXMpOwogICAgICAgIH0KICAgICAgICBnZXQgdG9rZW4oKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHsKICAgICAgICAgICAgICAgIC8vIGJlIGxhenkgYW5kIGNyZWF0ZSB0aGUgdG9rZW4gb25seSB3aGVuCiAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSBuZWVkZWQKICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gbmV3IE11dGFibGVUb2tlbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl90b2tlbjsKICAgICAgICB9CiAgICAgICAgY2FuY2VsKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7CiAgICAgICAgICAgICAgICAvLyBzYXZlIGFuIG9iamVjdCBieSByZXR1cm5pbmcgdGhlIGRlZmF1bHQKICAgICAgICAgICAgICAgIC8vIGNhbmNlbGxlZCB0b2tlbiB3aGVuIGNhbmNlbGxhdGlvbiBoYXBwZW5zCiAgICAgICAgICAgICAgICAvLyBiZWZvcmUgc29tZW9uZSBhc2tzIGZvciB0aGUgdG9rZW4KICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uQ2FuY2VsbGVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3Rva2VuIGluc3RhbmNlb2YgTXV0YWJsZVRva2VuKSB7CiAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSBjYW5jZWwKICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRpc3Bvc2UoY2FuY2VsID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKGNhbmNlbCkgewogICAgICAgICAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50TGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudExpc3RlbmVyLmRpc3Bvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7CiAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdG8gaW5pdGlhbGl6ZSB3aXRoIGFuIGVtcHR5IHRva2VuIGlmIHdlIGhhZCBub25lCiAgICAgICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLk5vbmU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fdG9rZW4gaW5zdGFuY2VvZiBNdXRhYmxlVG9rZW4pIHsKICAgICAgICAgICAgICAgIC8vIGFjdHVhbGx5IGRpc3Bvc2UKICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuLmRpc3Bvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGNsYXNzIEtleUNvZGVTdHJNYXAgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLl9rZXlDb2RlVG9TdHIgPSBbXTsKICAgICAgICAgICAgdGhpcy5fc3RyVG9LZXlDb2RlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB9CiAgICAgICAgZGVmaW5lKGtleUNvZGUsIHN0cikgewogICAgICAgICAgICB0aGlzLl9rZXlDb2RlVG9TdHJba2V5Q29kZV0gPSBzdHI7CiAgICAgICAgICAgIHRoaXMuX3N0clRvS2V5Q29kZVtzdHIudG9Mb3dlckNhc2UoKV0gPSBrZXlDb2RlOwogICAgICAgIH0KICAgICAgICBrZXlDb2RlVG9TdHIoa2V5Q29kZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fa2V5Q29kZVRvU3RyW2tleUNvZGVdOwogICAgICAgIH0KICAgICAgICBzdHJUb0tleUNvZGUoc3RyKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdHJUb0tleUNvZGVbc3RyLnRvTG93ZXJDYXNlKCldIHx8IDAgLyogVW5rbm93biAqLzsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCB1aU1hcCA9IG5ldyBLZXlDb2RlU3RyTWFwKCk7CiAgICBjb25zdCB1c2VyU2V0dGluZ3NVU01hcCA9IG5ldyBLZXlDb2RlU3RyTWFwKCk7CiAgICBjb25zdCB1c2VyU2V0dGluZ3NHZW5lcmFsTWFwID0gbmV3IEtleUNvZGVTdHJNYXAoKTsKICAgIGNvbnN0IEVWRU5UX0tFWV9DT0RFX01BUCA9IG5ldyBBcnJheSgyMzApOwogICAgY29uc3QgTkFUSVZFX1dJTkRPV1NfS0VZX0NPREVfVE9fS0VZX0NPREUgPSB7fTsKICAgIGNvbnN0IHNjYW5Db2RlSW50VG9TdHIgPSBbXTsKICAgIGNvbnN0IHNjYW5Db2RlU3RyVG9JbnQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgY29uc3Qgc2NhbkNvZGVMb3dlckNhc2VTdHJUb0ludCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAvKioKICAgICAqIC0xIGlmIGEgU2NhbkNvZGUgPT4gS2V5Q29kZSBtYXBwaW5nIGRlcGVuZHMgb24ga2IgbGF5b3V0LgogICAgICovCiAgICBjb25zdCBJTU1VVEFCTEVfQ09ERV9UT19LRVlfQ09ERSA9IFtdOwogICAgLyoqCiAgICAgKiAtMSBpZiBhIEtleUNvZGUgPT4gU2NhbkNvZGUgbWFwcGluZyBkZXBlbmRzIG9uIGtiIGxheW91dC4KICAgICAqLwogICAgY29uc3QgSU1NVVRBQkxFX0tFWV9DT0RFX1RPX0NPREUgPSBbXTsKICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IDE5MyAvKiBNQVhfVkFMVUUgKi87IGkrKykgewogICAgICAgIElNTVVUQUJMRV9DT0RFX1RPX0tFWV9DT0RFW2ldID0gLTEgLyogRGVwZW5kc09uS2JMYXlvdXQgKi87CiAgICB9CiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSAxMjYgLyogTUFYX1ZBTFVFICovOyBpKyspIHsKICAgICAgICBJTU1VVEFCTEVfS0VZX0NPREVfVE9fQ09ERVtpXSA9IC0xIC8qIERlcGVuZHNPbktiTGF5b3V0ICovOwogICAgfQogICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAvLyBTZWUgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvZGQzNzU3MzEodj12cy44NSkuYXNweAogICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L25vZGUtbmF0aXZlLWtleW1hcC9ibG9iL21hc3Rlci9kZXBzL2Nocm9taXVtL2tleWJvYXJkX2NvZGVzX3dpbi5oCiAgICAgICAgY29uc3QgZW1wdHkgPSAnJzsKICAgICAgICBjb25zdCBtYXBwaW5ncyA9IFsKICAgICAgICAgICAgLy8ga2V5Q29kZU9yZCwgaW1tdXRhYmxlLCBzY2FuQ29kZSwgc2NhbkNvZGVTdHIsIGtleUNvZGUsIGtleUNvZGVTdHIsIGV2ZW50S2V5Q29kZSwgdmtleSwgdXNVc2VyU2V0dGluZ3NMYWJlbCwgZ2VuZXJhbFVzZXJTZXR0aW5nc0xhYmVsCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sICdOb25lJywgMCAvKiBVbmtub3duICovLCAndW5rbm93bicsIDAsICdWS19VTktOT1dOJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDEgLyogSHlwZXIgKi8sICdIeXBlcicsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMiAvKiBTdXBlciAqLywgJ1N1cGVyJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAzIC8qIEZuICovLCAnRm4nLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDQgLyogRm5Mb2NrICovLCAnRm5Mb2NrJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCA1IC8qIFN1c3BlbmQgKi8sICdTdXNwZW5kJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCA2IC8qIFJlc3VtZSAqLywgJ1Jlc3VtZScsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgNyAvKiBUdXJibyAqLywgJ1R1cmJvJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCA4IC8qIFNsZWVwICovLCAnU2xlZXAnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfU0xFRVAnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgOSAvKiBXYWtlVXAgKi8sICdXYWtlVXAnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzMxLCAwLCAxMCAvKiBLZXlBICovLCAnS2V5QScsIDMxIC8qIEtleUEgKi8sICdBJywgNjUsICdWS19BJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzMyLCAwLCAxMSAvKiBLZXlCICovLCAnS2V5QicsIDMyIC8qIEtleUIgKi8sICdCJywgNjYsICdWS19CJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzMzLCAwLCAxMiAvKiBLZXlDICovLCAnS2V5QycsIDMzIC8qIEtleUMgKi8sICdDJywgNjcsICdWS19DJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzM0LCAwLCAxMyAvKiBLZXlEICovLCAnS2V5RCcsIDM0IC8qIEtleUQgKi8sICdEJywgNjgsICdWS19EJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzM1LCAwLCAxNCAvKiBLZXlFICovLCAnS2V5RScsIDM1IC8qIEtleUUgKi8sICdFJywgNjksICdWS19FJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzM2LCAwLCAxNSAvKiBLZXlGICovLCAnS2V5RicsIDM2IC8qIEtleUYgKi8sICdGJywgNzAsICdWS19GJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzM3LCAwLCAxNiAvKiBLZXlHICovLCAnS2V5RycsIDM3IC8qIEtleUcgKi8sICdHJywgNzEsICdWS19HJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzM4LCAwLCAxNyAvKiBLZXlIICovLCAnS2V5SCcsIDM4IC8qIEtleUggKi8sICdIJywgNzIsICdWS19IJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzM5LCAwLCAxOCAvKiBLZXlJICovLCAnS2V5SScsIDM5IC8qIEtleUkgKi8sICdJJywgNzMsICdWS19JJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzQwLCAwLCAxOSAvKiBLZXlKICovLCAnS2V5SicsIDQwIC8qIEtleUogKi8sICdKJywgNzQsICdWS19KJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzQxLCAwLCAyMCAvKiBLZXlLICovLCAnS2V5SycsIDQxIC8qIEtleUsgKi8sICdLJywgNzUsICdWS19LJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzQyLCAwLCAyMSAvKiBLZXlMICovLCAnS2V5TCcsIDQyIC8qIEtleUwgKi8sICdMJywgNzYsICdWS19MJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzQzLCAwLCAyMiAvKiBLZXlNICovLCAnS2V5TScsIDQzIC8qIEtleU0gKi8sICdNJywgNzcsICdWS19NJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzQ0LCAwLCAyMyAvKiBLZXlOICovLCAnS2V5TicsIDQ0IC8qIEtleU4gKi8sICdOJywgNzgsICdWS19OJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzQ1LCAwLCAyNCAvKiBLZXlPICovLCAnS2V5TycsIDQ1IC8qIEtleU8gKi8sICdPJywgNzksICdWS19PJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzQ2LCAwLCAyNSAvKiBLZXlQICovLCAnS2V5UCcsIDQ2IC8qIEtleVAgKi8sICdQJywgODAsICdWS19QJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzQ3LCAwLCAyNiAvKiBLZXlRICovLCAnS2V5UScsIDQ3IC8qIEtleVEgKi8sICdRJywgODEsICdWS19RJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzQ4LCAwLCAyNyAvKiBLZXlSICovLCAnS2V5UicsIDQ4IC8qIEtleVIgKi8sICdSJywgODIsICdWS19SJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzQ5LCAwLCAyOCAvKiBLZXlTICovLCAnS2V5UycsIDQ5IC8qIEtleVMgKi8sICdTJywgODMsICdWS19TJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzUwLCAwLCAyOSAvKiBLZXlUICovLCAnS2V5VCcsIDUwIC8qIEtleVQgKi8sICdUJywgODQsICdWS19UJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzUxLCAwLCAzMCAvKiBLZXlVICovLCAnS2V5VScsIDUxIC8qIEtleVUgKi8sICdVJywgODUsICdWS19VJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzUyLCAwLCAzMSAvKiBLZXlWICovLCAnS2V5VicsIDUyIC8qIEtleVYgKi8sICdWJywgODYsICdWS19WJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzUzLCAwLCAzMiAvKiBLZXlXICovLCAnS2V5VycsIDUzIC8qIEtleVcgKi8sICdXJywgODcsICdWS19XJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzU0LCAwLCAzMyAvKiBLZXlYICovLCAnS2V5WCcsIDU0IC8qIEtleVggKi8sICdYJywgODgsICdWS19YJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzU1LCAwLCAzNCAvKiBLZXlZICovLCAnS2V5WScsIDU1IC8qIEtleVkgKi8sICdZJywgODksICdWS19ZJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzU2LCAwLCAzNSAvKiBLZXlaICovLCAnS2V5WicsIDU2IC8qIEtleVogKi8sICdaJywgOTAsICdWS19aJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzIyLCAwLCAzNiAvKiBEaWdpdDEgKi8sICdEaWdpdDEnLCAyMiAvKiBEaWdpdDEgKi8sICcxJywgNDksICdWS18xJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzIzLCAwLCAzNyAvKiBEaWdpdDIgKi8sICdEaWdpdDInLCAyMyAvKiBEaWdpdDIgKi8sICcyJywgNTAsICdWS18yJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzI0LCAwLCAzOCAvKiBEaWdpdDMgKi8sICdEaWdpdDMnLCAyNCAvKiBEaWdpdDMgKi8sICczJywgNTEsICdWS18zJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzI1LCAwLCAzOSAvKiBEaWdpdDQgKi8sICdEaWdpdDQnLCAyNSAvKiBEaWdpdDQgKi8sICc0JywgNTIsICdWS180JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzI2LCAwLCA0MCAvKiBEaWdpdDUgKi8sICdEaWdpdDUnLCAyNiAvKiBEaWdpdDUgKi8sICc1JywgNTMsICdWS181JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzI3LCAwLCA0MSAvKiBEaWdpdDYgKi8sICdEaWdpdDYnLCAyNyAvKiBEaWdpdDYgKi8sICc2JywgNTQsICdWS182JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzI4LCAwLCA0MiAvKiBEaWdpdDcgKi8sICdEaWdpdDcnLCAyOCAvKiBEaWdpdDcgKi8sICc3JywgNTUsICdWS183JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzI5LCAwLCA0MyAvKiBEaWdpdDggKi8sICdEaWdpdDgnLCAyOSAvKiBEaWdpdDggKi8sICc4JywgNTYsICdWS184JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzMwLCAwLCA0NCAvKiBEaWdpdDkgKi8sICdEaWdpdDknLCAzMCAvKiBEaWdpdDkgKi8sICc5JywgNTcsICdWS185JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzIxLCAwLCA0NSAvKiBEaWdpdDAgKi8sICdEaWdpdDAnLCAyMSAvKiBEaWdpdDAgKi8sICcwJywgNDgsICdWS18wJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzMsIDEsIDQ2IC8qIEVudGVyICovLCAnRW50ZXInLCAzIC8qIEVudGVyICovLCAnRW50ZXInLCAxMywgJ1ZLX1JFVFVSTicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs5LCAxLCA0NyAvKiBFc2NhcGUgKi8sICdFc2NhcGUnLCA5IC8qIEVzY2FwZSAqLywgJ0VzY2FwZScsIDI3LCAnVktfRVNDQVBFJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzEsIDEsIDQ4IC8qIEJhY2tzcGFjZSAqLywgJ0JhY2tzcGFjZScsIDEgLyogQmFja3NwYWNlICovLCAnQmFja3NwYWNlJywgOCwgJ1ZLX0JBQ0snLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMiwgMSwgNDkgLyogVGFiICovLCAnVGFiJywgMiAvKiBUYWIgKi8sICdUYWInLCA5LCAnVktfVEFCJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzEwLCAxLCA1MCAvKiBTcGFjZSAqLywgJ1NwYWNlJywgMTAgLyogU3BhY2UgKi8sICdTcGFjZScsIDMyLCAnVktfU1BBQ0UnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbODMsIDAsIDUxIC8qIE1pbnVzICovLCAnTWludXMnLCA4MyAvKiBNaW51cyAqLywgJy0nLCAxODksICdWS19PRU1fTUlOVVMnLCAnLScsICdPRU1fTUlOVVMnXSwKICAgICAgICAgICAgWzgxLCAwLCA1MiAvKiBFcXVhbCAqLywgJ0VxdWFsJywgODEgLyogRXF1YWwgKi8sICc9JywgMTg3LCAnVktfT0VNX1BMVVMnLCAnPScsICdPRU1fUExVUyddLAogICAgICAgICAgICBbODcsIDAsIDUzIC8qIEJyYWNrZXRMZWZ0ICovLCAnQnJhY2tldExlZnQnLCA4NyAvKiBCcmFja2V0TGVmdCAqLywgJ1snLCAyMTksICdWS19PRU1fNCcsICdbJywgJ09FTV80J10sCiAgICAgICAgICAgIFs4OSwgMCwgNTQgLyogQnJhY2tldFJpZ2h0ICovLCAnQnJhY2tldFJpZ2h0JywgODkgLyogQnJhY2tldFJpZ2h0ICovLCAnXScsIDIyMSwgJ1ZLX09FTV82JywgJ10nLCAnT0VNXzYnXSwKICAgICAgICAgICAgWzg4LCAwLCA1NSAvKiBCYWNrc2xhc2ggKi8sICdCYWNrc2xhc2gnLCA4OCAvKiBCYWNrc2xhc2ggKi8sICdcXCcsIDIyMCwgJ1ZLX09FTV81JywgJ1xcJywgJ09FTV81J10sCiAgICAgICAgICAgIFswLCAwLCA1NiAvKiBJbnRsSGFzaCAqLywgJ0ludGxIYXNoJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs4MCwgMCwgNTcgLyogU2VtaWNvbG9uICovLCAnU2VtaWNvbG9uJywgODAgLyogU2VtaWNvbG9uICovLCAnOycsIDE4NiwgJ1ZLX09FTV8xJywgJzsnLCAnT0VNXzEnXSwKICAgICAgICAgICAgWzkwLCAwLCA1OCAvKiBRdW90ZSAqLywgJ1F1b3RlJywgOTAgLyogUXVvdGUgKi8sICdcJycsIDIyMiwgJ1ZLX09FTV83JywgJ1wnJywgJ09FTV83J10sCiAgICAgICAgICAgIFs4NiwgMCwgNTkgLyogQmFja3F1b3RlICovLCAnQmFja3F1b3RlJywgODYgLyogQmFja3F1b3RlICovLCAnYCcsIDE5MiwgJ1ZLX09FTV8zJywgJ2AnLCAnT0VNXzMnXSwKICAgICAgICAgICAgWzgyLCAwLCA2MCAvKiBDb21tYSAqLywgJ0NvbW1hJywgODIgLyogQ29tbWEgKi8sICcsJywgMTg4LCAnVktfT0VNX0NPTU1BJywgJywnLCAnT0VNX0NPTU1BJ10sCiAgICAgICAgICAgIFs4NCwgMCwgNjEgLyogUGVyaW9kICovLCAnUGVyaW9kJywgODQgLyogUGVyaW9kICovLCAnLicsIDE5MCwgJ1ZLX09FTV9QRVJJT0QnLCAnLicsICdPRU1fUEVSSU9EJ10sCiAgICAgICAgICAgIFs4NSwgMCwgNjIgLyogU2xhc2ggKi8sICdTbGFzaCcsIDg1IC8qIFNsYXNoICovLCAnLycsIDE5MSwgJ1ZLX09FTV8yJywgJy8nLCAnT0VNXzInXSwKICAgICAgICAgICAgWzgsIDEsIDYzIC8qIENhcHNMb2NrICovLCAnQ2Fwc0xvY2snLCA4IC8qIENhcHNMb2NrICovLCAnQ2Fwc0xvY2snLCAyMCwgJ1ZLX0NBUElUQUwnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNTksIDEsIDY0IC8qIEYxICovLCAnRjEnLCA1OSAvKiBGMSAqLywgJ0YxJywgMTEyLCAnVktfRjEnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNjAsIDEsIDY1IC8qIEYyICovLCAnRjInLCA2MCAvKiBGMiAqLywgJ0YyJywgMTEzLCAnVktfRjInLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNjEsIDEsIDY2IC8qIEYzICovLCAnRjMnLCA2MSAvKiBGMyAqLywgJ0YzJywgMTE0LCAnVktfRjMnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNjIsIDEsIDY3IC8qIEY0ICovLCAnRjQnLCA2MiAvKiBGNCAqLywgJ0Y0JywgMTE1LCAnVktfRjQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNjMsIDEsIDY4IC8qIEY1ICovLCAnRjUnLCA2MyAvKiBGNSAqLywgJ0Y1JywgMTE2LCAnVktfRjUnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNjQsIDEsIDY5IC8qIEY2ICovLCAnRjYnLCA2NCAvKiBGNiAqLywgJ0Y2JywgMTE3LCAnVktfRjYnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNjUsIDEsIDcwIC8qIEY3ICovLCAnRjcnLCA2NSAvKiBGNyAqLywgJ0Y3JywgMTE4LCAnVktfRjcnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNjYsIDEsIDcxIC8qIEY4ICovLCAnRjgnLCA2NiAvKiBGOCAqLywgJ0Y4JywgMTE5LCAnVktfRjgnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNjcsIDEsIDcyIC8qIEY5ICovLCAnRjknLCA2NyAvKiBGOSAqLywgJ0Y5JywgMTIwLCAnVktfRjknLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNjgsIDEsIDczIC8qIEYxMCAqLywgJ0YxMCcsIDY4IC8qIEYxMCAqLywgJ0YxMCcsIDEyMSwgJ1ZLX0YxMCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs2OSwgMSwgNzQgLyogRjExICovLCAnRjExJywgNjkgLyogRjExICovLCAnRjExJywgMTIyLCAnVktfRjExJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzcwLCAxLCA3NSAvKiBGMTIgKi8sICdGMTInLCA3MCAvKiBGMTIgKi8sICdGMTInLCAxMjMsICdWS19GMTInLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgNzYgLyogUHJpbnRTY3JlZW4gKi8sICdQcmludFNjcmVlbicsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNzksIDEsIDc3IC8qIFNjcm9sbExvY2sgKi8sICdTY3JvbGxMb2NrJywgNzkgLyogU2Nyb2xsTG9jayAqLywgJ1Njcm9sbExvY2snLCAxNDUsICdWS19TQ1JPTEwnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNywgMSwgNzggLyogUGF1c2UgKi8sICdQYXVzZScsIDcgLyogUGF1c2VCcmVhayAqLywgJ1BhdXNlQnJlYWsnLCAxOSwgJ1ZLX1BBVVNFJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzE5LCAxLCA3OSAvKiBJbnNlcnQgKi8sICdJbnNlcnQnLCAxOSAvKiBJbnNlcnQgKi8sICdJbnNlcnQnLCA0NSwgJ1ZLX0lOU0VSVCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxNCwgMSwgODAgLyogSG9tZSAqLywgJ0hvbWUnLCAxNCAvKiBIb21lICovLCAnSG9tZScsIDM2LCAnVktfSE9NRScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMSwgMSwgODEgLyogUGFnZVVwICovLCAnUGFnZVVwJywgMTEgLyogUGFnZVVwICovLCAnUGFnZVVwJywgMzMsICdWS19QUklPUicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsyMCwgMSwgODIgLyogRGVsZXRlICovLCAnRGVsZXRlJywgMjAgLyogRGVsZXRlICovLCAnRGVsZXRlJywgNDYsICdWS19ERUxFVEUnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTMsIDEsIDgzIC8qIEVuZCAqLywgJ0VuZCcsIDEzIC8qIEVuZCAqLywgJ0VuZCcsIDM1LCAnVktfRU5EJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzEyLCAxLCA4NCAvKiBQYWdlRG93biAqLywgJ1BhZ2VEb3duJywgMTIgLyogUGFnZURvd24gKi8sICdQYWdlRG93bicsIDM0LCAnVktfTkVYVCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxNywgMSwgODUgLyogQXJyb3dSaWdodCAqLywgJ0Fycm93UmlnaHQnLCAxNyAvKiBSaWdodEFycm93ICovLCAnUmlnaHRBcnJvdycsIDM5LCAnVktfUklHSFQnLCAnUmlnaHQnLCBlbXB0eV0sCiAgICAgICAgICAgIFsxNSwgMSwgODYgLyogQXJyb3dMZWZ0ICovLCAnQXJyb3dMZWZ0JywgMTUgLyogTGVmdEFycm93ICovLCAnTGVmdEFycm93JywgMzcsICdWS19MRUZUJywgJ0xlZnQnLCBlbXB0eV0sCiAgICAgICAgICAgIFsxOCwgMSwgODcgLyogQXJyb3dEb3duICovLCAnQXJyb3dEb3duJywgMTggLyogRG93bkFycm93ICovLCAnRG93bkFycm93JywgNDAsICdWS19ET1dOJywgJ0Rvd24nLCBlbXB0eV0sCiAgICAgICAgICAgIFsxNiwgMSwgODggLyogQXJyb3dVcCAqLywgJ0Fycm93VXAnLCAxNiAvKiBVcEFycm93ICovLCAnVXBBcnJvdycsIDM4LCAnVktfVVAnLCAnVXAnLCBlbXB0eV0sCiAgICAgICAgICAgIFs3OCwgMSwgODkgLyogTnVtTG9jayAqLywgJ051bUxvY2snLCA3OCAvKiBOdW1Mb2NrICovLCAnTnVtTG9jaycsIDE0NCwgJ1ZLX05VTUxPQ0snLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTA4LCAxLCA5MCAvKiBOdW1wYWREaXZpZGUgKi8sICdOdW1wYWREaXZpZGUnLCAxMDggLyogTnVtcGFkRGl2aWRlICovLCAnTnVtUGFkX0RpdmlkZScsIDExMSwgJ1ZLX0RJVklERScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMDMsIDEsIDkxIC8qIE51bXBhZE11bHRpcGx5ICovLCAnTnVtcGFkTXVsdGlwbHknLCAxMDMgLyogTnVtcGFkTXVsdGlwbHkgKi8sICdOdW1QYWRfTXVsdGlwbHknLCAxMDYsICdWS19NVUxUSVBMWScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMDYsIDEsIDkyIC8qIE51bXBhZFN1YnRyYWN0ICovLCAnTnVtcGFkU3VidHJhY3QnLCAxMDYgLyogTnVtcGFkU3VidHJhY3QgKi8sICdOdW1QYWRfU3VidHJhY3QnLCAxMDksICdWS19TVUJUUkFDVCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMDQsIDEsIDkzIC8qIE51bXBhZEFkZCAqLywgJ051bXBhZEFkZCcsIDEwNCAvKiBOdW1wYWRBZGQgKi8sICdOdW1QYWRfQWRkJywgMTA3LCAnVktfQUREJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzMsIDEsIDk0IC8qIE51bXBhZEVudGVyICovLCAnTnVtcGFkRW50ZXInLCAzIC8qIEVudGVyICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs5NCwgMSwgOTUgLyogTnVtcGFkMSAqLywgJ051bXBhZDEnLCA5NCAvKiBOdW1wYWQxICovLCAnTnVtUGFkMScsIDk3LCAnVktfTlVNUEFEMScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs5NSwgMSwgOTYgLyogTnVtcGFkMiAqLywgJ051bXBhZDInLCA5NSAvKiBOdW1wYWQyICovLCAnTnVtUGFkMicsIDk4LCAnVktfTlVNUEFEMicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs5NiwgMSwgOTcgLyogTnVtcGFkMyAqLywgJ051bXBhZDMnLCA5NiAvKiBOdW1wYWQzICovLCAnTnVtUGFkMycsIDk5LCAnVktfTlVNUEFEMycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs5NywgMSwgOTggLyogTnVtcGFkNCAqLywgJ051bXBhZDQnLCA5NyAvKiBOdW1wYWQ0ICovLCAnTnVtUGFkNCcsIDEwMCwgJ1ZLX05VTVBBRDQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbOTgsIDEsIDk5IC8qIE51bXBhZDUgKi8sICdOdW1wYWQ1JywgOTggLyogTnVtcGFkNSAqLywgJ051bVBhZDUnLCAxMDEsICdWS19OVU1QQUQ1JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzk5LCAxLCAxMDAgLyogTnVtcGFkNiAqLywgJ051bXBhZDYnLCA5OSAvKiBOdW1wYWQ2ICovLCAnTnVtUGFkNicsIDEwMiwgJ1ZLX05VTVBBRDYnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTAwLCAxLCAxMDEgLyogTnVtcGFkNyAqLywgJ051bXBhZDcnLCAxMDAgLyogTnVtcGFkNyAqLywgJ051bVBhZDcnLCAxMDMsICdWS19OVU1QQUQ3JywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzEwMSwgMSwgMTAyIC8qIE51bXBhZDggKi8sICdOdW1wYWQ4JywgMTAxIC8qIE51bXBhZDggKi8sICdOdW1QYWQ4JywgMTA0LCAnVktfTlVNUEFEOCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMDIsIDEsIDEwMyAvKiBOdW1wYWQ5ICovLCAnTnVtcGFkOScsIDEwMiAvKiBOdW1wYWQ5ICovLCAnTnVtUGFkOScsIDEwNSwgJ1ZLX05VTVBBRDknLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbOTMsIDEsIDEwNCAvKiBOdW1wYWQwICovLCAnTnVtcGFkMCcsIDkzIC8qIE51bXBhZDAgKi8sICdOdW1QYWQwJywgOTYsICdWS19OVU1QQUQwJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzEwNywgMSwgMTA1IC8qIE51bXBhZERlY2ltYWwgKi8sICdOdW1wYWREZWNpbWFsJywgMTA3IC8qIE51bXBhZERlY2ltYWwgKi8sICdOdW1QYWRfRGVjaW1hbCcsIDExMCwgJ1ZLX0RFQ0lNQUwnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbOTIsIDAsIDEwNiAvKiBJbnRsQmFja3NsYXNoICovLCAnSW50bEJhY2tzbGFzaCcsIDkyIC8qIEludGxCYWNrc2xhc2ggKi8sICdPRU1fMTAyJywgMjI2LCAnVktfT0VNXzEwMicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs1OCwgMSwgMTA3IC8qIENvbnRleHRNZW51ICovLCAnQ29udGV4dE1lbnUnLCA1OCAvKiBDb250ZXh0TWVudSAqLywgJ0NvbnRleHRNZW51JywgOTMsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTA4IC8qIFBvd2VyICovLCAnUG93ZXInLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDEwOSAvKiBOdW1wYWRFcXVhbCAqLywgJ051bXBhZEVxdWFsJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs3MSwgMSwgMTEwIC8qIEYxMyAqLywgJ0YxMycsIDcxIC8qIEYxMyAqLywgJ0YxMycsIDEyNCwgJ1ZLX0YxMycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs3MiwgMSwgMTExIC8qIEYxNCAqLywgJ0YxNCcsIDcyIC8qIEYxNCAqLywgJ0YxNCcsIDEyNSwgJ1ZLX0YxNCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs3MywgMSwgMTEyIC8qIEYxNSAqLywgJ0YxNScsIDczIC8qIEYxNSAqLywgJ0YxNScsIDEyNiwgJ1ZLX0YxNScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs3NCwgMSwgMTEzIC8qIEYxNiAqLywgJ0YxNicsIDc0IC8qIEYxNiAqLywgJ0YxNicsIDEyNywgJ1ZLX0YxNicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs3NSwgMSwgMTE0IC8qIEYxNyAqLywgJ0YxNycsIDc1IC8qIEYxNyAqLywgJ0YxNycsIDEyOCwgJ1ZLX0YxNycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs3NiwgMSwgMTE1IC8qIEYxOCAqLywgJ0YxOCcsIDc2IC8qIEYxOCAqLywgJ0YxOCcsIDEyOSwgJ1ZLX0YxOCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs3NywgMSwgMTE2IC8qIEYxOSAqLywgJ0YxOScsIDc3IC8qIEYxOSAqLywgJ0YxOScsIDEzMCwgJ1ZLX0YxOScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMTcgLyogRjIwICovLCAnRjIwJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0YyMCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMTggLyogRjIxICovLCAnRjIxJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0YyMScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMTkgLyogRjIyICovLCAnRjIyJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0YyMicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMjAgLyogRjIzICovLCAnRjIzJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0YyMycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMjEgLyogRjI0ICovLCAnRjI0JywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0YyNCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMjIgLyogT3BlbiAqLywgJ09wZW4nLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDEyMyAvKiBIZWxwICovLCAnSGVscCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTI0IC8qIFNlbGVjdCAqLywgJ1NlbGVjdCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTI1IC8qIEFnYWluICovLCAnQWdhaW4nLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDEyNiAvKiBVbmRvICovLCAnVW5kbycsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTI3IC8qIEN1dCAqLywgJ0N1dCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTI4IC8qIENvcHkgKi8sICdDb3B5JywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMjkgLyogUGFzdGUgKi8sICdQYXN0ZScsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTMwIC8qIEZpbmQgKi8sICdGaW5kJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMzEgLyogQXVkaW9Wb2x1bWVNdXRlICovLCAnQXVkaW9Wb2x1bWVNdXRlJywgMTEyIC8qIEF1ZGlvVm9sdW1lTXV0ZSAqLywgJ0F1ZGlvVm9sdW1lTXV0ZScsIDE3MywgJ1ZLX1ZPTFVNRV9NVVRFJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDEzMiAvKiBBdWRpb1ZvbHVtZVVwICovLCAnQXVkaW9Wb2x1bWVVcCcsIDExMyAvKiBBdWRpb1ZvbHVtZVVwICovLCAnQXVkaW9Wb2x1bWVVcCcsIDE3NSwgJ1ZLX1ZPTFVNRV9VUCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMzMgLyogQXVkaW9Wb2x1bWVEb3duICovLCAnQXVkaW9Wb2x1bWVEb3duJywgMTE0IC8qIEF1ZGlvVm9sdW1lRG93biAqLywgJ0F1ZGlvVm9sdW1lRG93bicsIDE3NCwgJ1ZLX1ZPTFVNRV9ET1dOJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzEwNSwgMSwgMTM0IC8qIE51bXBhZENvbW1hICovLCAnTnVtcGFkQ29tbWEnLCAxMDUgLyogTlVNUEFEX1NFUEFSQVRPUiAqLywgJ051bVBhZF9TZXBhcmF0b3InLCAxMDgsICdWS19TRVBBUkFUT1InLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTEwLCAwLCAxMzUgLyogSW50bFJvICovLCAnSW50bFJvJywgMTEwIC8qIEFCTlRfQzEgKi8sICdBQk5UX0MxJywgMTkzLCAnVktfQUJOVF9DMScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMzYgLyogS2FuYU1vZGUgKi8sICdLYW5hTW9kZScsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMCwgMTM3IC8qIEludGxZZW4gKi8sICdJbnRsWWVuJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxMzggLyogQ29udmVydCAqLywgJ0NvbnZlcnQnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDEzOSAvKiBOb25Db252ZXJ0ICovLCAnTm9uQ29udmVydCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTQwIC8qIExhbmcxICovLCAnTGFuZzEnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE0MSAvKiBMYW5nMiAqLywgJ0xhbmcyJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNDIgLyogTGFuZzMgKi8sICdMYW5nMycsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTQzIC8qIExhbmc0ICovLCAnTGFuZzQnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE0NCAvKiBMYW5nNSAqLywgJ0xhbmc1JywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNDUgLyogQWJvcnQgKi8sICdBYm9ydCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTQ2IC8qIFByb3BzICovLCAnUHJvcHMnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE0NyAvKiBOdW1wYWRQYXJlbkxlZnQgKi8sICdOdW1wYWRQYXJlbkxlZnQnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE0OCAvKiBOdW1wYWRQYXJlblJpZ2h0ICovLCAnTnVtcGFkUGFyZW5SaWdodCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTQ5IC8qIE51bXBhZEJhY2tzcGFjZSAqLywgJ051bXBhZEJhY2tzcGFjZScsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTUwIC8qIE51bXBhZE1lbW9yeVN0b3JlICovLCAnTnVtcGFkTWVtb3J5U3RvcmUnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE1MSAvKiBOdW1wYWRNZW1vcnlSZWNhbGwgKi8sICdOdW1wYWRNZW1vcnlSZWNhbGwnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE1MiAvKiBOdW1wYWRNZW1vcnlDbGVhciAqLywgJ051bXBhZE1lbW9yeUNsZWFyJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNTMgLyogTnVtcGFkTWVtb3J5QWRkICovLCAnTnVtcGFkTWVtb3J5QWRkJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNTQgLyogTnVtcGFkTWVtb3J5U3VidHJhY3QgKi8sICdOdW1wYWRNZW1vcnlTdWJ0cmFjdCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTU1IC8qIE51bXBhZENsZWFyICovLCAnTnVtcGFkQ2xlYXInLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE1NiAvKiBOdW1wYWRDbGVhckVudHJ5ICovLCAnTnVtcGFkQ2xlYXJFbnRyeScsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNSwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgNSAvKiBDdHJsICovLCAnQ3RybCcsIDE3LCAnVktfQ09OVFJPTCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0LCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCA0IC8qIFNoaWZ0ICovLCAnU2hpZnQnLCAxNiwgJ1ZLX1NISUZUJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzYsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDYgLyogQWx0ICovLCAnQWx0JywgMTgsICdWS19NRU5VJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzU3LCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCA1NyAvKiBNZXRhICovLCAnTWV0YScsIDAsICdWS19DT01NQU5EJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzUsIDEsIDE1NyAvKiBDb250cm9sTGVmdCAqLywgJ0NvbnRyb2xMZWZ0JywgNSAvKiBDdHJsICovLCBlbXB0eSwgMCwgJ1ZLX0xDT05UUk9MJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzQsIDEsIDE1OCAvKiBTaGlmdExlZnQgKi8sICdTaGlmdExlZnQnLCA0IC8qIFNoaWZ0ICovLCBlbXB0eSwgMCwgJ1ZLX0xTSElGVCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs2LCAxLCAxNTkgLyogQWx0TGVmdCAqLywgJ0FsdExlZnQnLCA2IC8qIEFsdCAqLywgZW1wdHksIDAsICdWS19MTUVOVScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs1NywgMSwgMTYwIC8qIE1ldGFMZWZ0ICovLCAnTWV0YUxlZnQnLCA1NyAvKiBNZXRhICovLCBlbXB0eSwgMCwgJ1ZLX0xXSU4nLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbNSwgMSwgMTYxIC8qIENvbnRyb2xSaWdodCAqLywgJ0NvbnRyb2xSaWdodCcsIDUgLyogQ3RybCAqLywgZW1wdHksIDAsICdWS19SQ09OVFJPTCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs0LCAxLCAxNjIgLyogU2hpZnRSaWdodCAqLywgJ1NoaWZ0UmlnaHQnLCA0IC8qIFNoaWZ0ICovLCBlbXB0eSwgMCwgJ1ZLX1JTSElGVCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFs2LCAxLCAxNjMgLyogQWx0UmlnaHQgKi8sICdBbHRSaWdodCcsIDYgLyogQWx0ICovLCBlbXB0eSwgMCwgJ1ZLX1JNRU5VJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzU3LCAxLCAxNjQgLyogTWV0YVJpZ2h0ICovLCAnTWV0YVJpZ2h0JywgNTcgLyogTWV0YSAqLywgZW1wdHksIDAsICdWS19SV0lOJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE2NSAvKiBCcmlnaHRuZXNzVXAgKi8sICdCcmlnaHRuZXNzVXAnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE2NiAvKiBCcmlnaHRuZXNzRG93biAqLywgJ0JyaWdodG5lc3NEb3duJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNjcgLyogTWVkaWFQbGF5ICovLCAnTWVkaWFQbGF5JywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNjggLyogTWVkaWFSZWNvcmQgKi8sICdNZWRpYVJlY29yZCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTY5IC8qIE1lZGlhRmFzdEZvcndhcmQgKi8sICdNZWRpYUZhc3RGb3J3YXJkJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNzAgLyogTWVkaWFSZXdpbmQgKi8sICdNZWRpYVJld2luZCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTE0LCAxLCAxNzEgLyogTWVkaWFUcmFja05leHQgKi8sICdNZWRpYVRyYWNrTmV4dCcsIDExOSAvKiBNZWRpYVRyYWNrTmV4dCAqLywgJ01lZGlhVHJhY2tOZXh0JywgMTc2LCAnVktfTUVESUFfTkVYVF9UUkFDSycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMTUsIDEsIDE3MiAvKiBNZWRpYVRyYWNrUHJldmlvdXMgKi8sICdNZWRpYVRyYWNrUHJldmlvdXMnLCAxMjAgLyogTWVkaWFUcmFja1ByZXZpb3VzICovLCAnTWVkaWFUcmFja1ByZXZpb3VzJywgMTc3LCAnVktfTUVESUFfUFJFVl9UUkFDSycsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMTYsIDEsIDE3MyAvKiBNZWRpYVN0b3AgKi8sICdNZWRpYVN0b3AnLCAxMjEgLyogTWVkaWFTdG9wICovLCAnTWVkaWFTdG9wJywgMTc4LCAnVktfTUVESUFfU1RPUCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNzQgLyogRWplY3QgKi8sICdFamVjdCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTE3LCAxLCAxNzUgLyogTWVkaWFQbGF5UGF1c2UgKi8sICdNZWRpYVBsYXlQYXVzZScsIDEyMiAvKiBNZWRpYVBsYXlQYXVzZSAqLywgJ01lZGlhUGxheVBhdXNlJywgMTc5LCAnVktfTUVESUFfUExBWV9QQVVTRScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNzYgLyogTWVkaWFTZWxlY3QgKi8sICdNZWRpYVNlbGVjdCcsIDEyMyAvKiBMYXVuY2hNZWRpYVBsYXllciAqLywgJ0xhdW5jaE1lZGlhUGxheWVyJywgMTgxLCAnVktfTUVESUFfTEFVTkNIX01FRElBX1NFTEVDVCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNzcgLyogTGF1bmNoTWFpbCAqLywgJ0xhdW5jaE1haWwnLCAxMjQgLyogTGF1bmNoTWFpbCAqLywgJ0xhdW5jaE1haWwnLCAxODAsICdWS19NRURJQV9MQVVOQ0hfTUFJTCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNzggLyogTGF1bmNoQXBwMiAqLywgJ0xhdW5jaEFwcDInLCAxMjUgLyogTGF1bmNoQXBwMiAqLywgJ0xhdW5jaEFwcDInLCAxODMsICdWS19NRURJQV9MQVVOQ0hfQVBQMicsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxNzkgLyogTGF1bmNoQXBwMSAqLywgJ0xhdW5jaEFwcDEnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfTUVESUFfTEFVTkNIX0FQUDEnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTgwIC8qIFNlbGVjdFRhc2sgKi8sICdTZWxlY3RUYXNrJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxODEgLyogTGF1bmNoU2NyZWVuU2F2ZXIgKi8sICdMYXVuY2hTY3JlZW5TYXZlcicsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTgyIC8qIEJyb3dzZXJTZWFyY2ggKi8sICdCcm93c2VyU2VhcmNoJywgMTE1IC8qIEJyb3dzZXJTZWFyY2ggKi8sICdCcm93c2VyU2VhcmNoJywgMTcwLCAnVktfQlJPV1NFUl9TRUFSQ0gnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTgzIC8qIEJyb3dzZXJIb21lICovLCAnQnJvd3NlckhvbWUnLCAxMTYgLyogQnJvd3NlckhvbWUgKi8sICdCcm93c2VySG9tZScsIDE3MiwgJ1ZLX0JST1dTRVJfSE9NRScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMTIsIDEsIDE4NCAvKiBCcm93c2VyQmFjayAqLywgJ0Jyb3dzZXJCYWNrJywgMTE3IC8qIEJyb3dzZXJCYWNrICovLCAnQnJvd3NlckJhY2snLCAxNjYsICdWS19CUk9XU0VSX0JBQ0snLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMTEzLCAxLCAxODUgLyogQnJvd3NlckZvcndhcmQgKi8sICdCcm93c2VyRm9yd2FyZCcsIDExOCAvKiBCcm93c2VyRm9yd2FyZCAqLywgJ0Jyb3dzZXJGb3J3YXJkJywgMTY3LCAnVktfQlJPV1NFUl9GT1JXQVJEJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE4NiAvKiBCcm93c2VyU3RvcCAqLywgJ0Jyb3dzZXJTdG9wJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0JST1dTRVJfU1RPUCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAxODcgLyogQnJvd3NlclJlZnJlc2ggKi8sICdCcm93c2VyUmVmcmVzaCcsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19CUk9XU0VSX1JFRlJFU0gnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTg4IC8qIEJyb3dzZXJGYXZvcml0ZXMgKi8sICdCcm93c2VyRmF2b3JpdGVzJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0JST1dTRVJfRkFWT1JJVEVTJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE4OSAvKiBab29tVG9nZ2xlICovLCAnWm9vbVRvZ2dsZScsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTkwIC8qIE1haWxSZXBseSAqLywgJ01haWxSZXBseScsIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsIGVtcHR5LCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMTkxIC8qIE1haWxGb3J3YXJkICovLCAnTWFpbEZvcndhcmQnLCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCBlbXB0eSwgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDE5MiAvKiBNYWlsU2VuZCAqLywgJ01haWxTZW5kJywgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2xpc3RzLnczLm9yZy9BcmNoaXZlcy9QdWJsaWMvd3d3LWRvbS8yMDEwSnVsU2VwL2F0dC0wMTgyL2tleUNvZGUtc3BlYy5odG1sCiAgICAgICAgICAgIC8vIElmIGFuIElucHV0IE1ldGhvZCBFZGl0b3IgaXMgcHJvY2Vzc2luZyBrZXkgaW5wdXQgYW5kIHRoZSBldmVudCBpcyBrZXlkb3duLCByZXR1cm4gMjI5LgogICAgICAgICAgICBbMTA5LCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAxMDkgLyogS0VZX0lOX0NPTVBPU0lUSU9OICovLCAnS2V5SW5Db21wb3NpdGlvbicsIDIyOSwgZW1wdHksIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFsxMTEsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDExMSAvKiBBQk5UX0MyICovLCAnQUJOVF9DMicsIDE5NCwgJ1ZLX0FCTlRfQzInLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbOTEsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDkxIC8qIE9FTV84ICovLCAnT0VNXzgnLCAyMjMsICdWS19PRU1fOCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfQ0xFQVInLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0tBTkEnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0hBTkdVTCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfSlVOSkEnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0ZJTkFMJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19IQU5KQScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfS0FOSkknLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0NPTlZFUlQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX05PTkNPTlZFUlQnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0FDQ0VQVCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfTU9ERUNIQU5HRScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfU0VMRUNUJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19QUklOVCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfRVhFQ1VURScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfU05BUFNIT1QnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0hFTFAnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0FQUFMnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX1BST0NFU1NLRVknLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX1BBQ0tFVCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfREJFX1NCQ1NDSEFSJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19EQkVfREJDU0NIQVInLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0FUVE4nLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX0NSU0VMJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19FWFNFTCcsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfRVJFT0YnLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX1BMQVknLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX1pPT00nLCBlbXB0eSwgZW1wdHldLAogICAgICAgICAgICBbMCwgMSwgMCAvKiBOb25lICovLCBlbXB0eSwgMCAvKiBVbmtub3duICovLCBlbXB0eSwgMCwgJ1ZLX05PTkFNRScsIGVtcHR5LCBlbXB0eV0sCiAgICAgICAgICAgIFswLCAxLCAwIC8qIE5vbmUgKi8sIGVtcHR5LCAwIC8qIFVua25vd24gKi8sIGVtcHR5LCAwLCAnVktfUEExJywgZW1wdHksIGVtcHR5XSwKICAgICAgICAgICAgWzAsIDEsIDAgLyogTm9uZSAqLywgZW1wdHksIDAgLyogVW5rbm93biAqLywgZW1wdHksIDAsICdWS19PRU1fQ0xFQVInLCBlbXB0eSwgZW1wdHldLAogICAgICAgIF07CiAgICAgICAgbGV0IHNlZW5LZXlDb2RlID0gW107CiAgICAgICAgbGV0IHNlZW5TY2FuQ29kZSA9IFtdOwogICAgICAgIGZvciAoY29uc3QgbWFwcGluZyBvZiBtYXBwaW5ncykgewogICAgICAgICAgICBjb25zdCBbX2tleUNvZGVPcmQsIGltbXV0YWJsZSwgc2NhbkNvZGUsIHNjYW5Db2RlU3RyLCBrZXlDb2RlLCBrZXlDb2RlU3RyLCBldmVudEtleUNvZGUsIHZrZXksIHVzVXNlclNldHRpbmdzTGFiZWwsIGdlbmVyYWxVc2VyU2V0dGluZ3NMYWJlbF0gPSBtYXBwaW5nOwogICAgICAgICAgICBpZiAoIXNlZW5TY2FuQ29kZVtzY2FuQ29kZV0pIHsKICAgICAgICAgICAgICAgIHNlZW5TY2FuQ29kZVtzY2FuQ29kZV0gPSB0cnVlOwogICAgICAgICAgICAgICAgc2NhbkNvZGVJbnRUb1N0cltzY2FuQ29kZV0gPSBzY2FuQ29kZVN0cjsKICAgICAgICAgICAgICAgIHNjYW5Db2RlU3RyVG9JbnRbc2NhbkNvZGVTdHJdID0gc2NhbkNvZGU7CiAgICAgICAgICAgICAgICBzY2FuQ29kZUxvd2VyQ2FzZVN0clRvSW50W3NjYW5Db2RlU3RyLnRvTG93ZXJDYXNlKCldID0gc2NhbkNvZGU7CiAgICAgICAgICAgICAgICBpZiAoaW1tdXRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgSU1NVVRBQkxFX0NPREVfVE9fS0VZX0NPREVbc2NhbkNvZGVdID0ga2V5Q29kZTsKICAgICAgICAgICAgICAgICAgICBpZiAoKGtleUNvZGUgIT09IDAgLyogVW5rbm93biAqLykKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGtleUNvZGUgIT09IDMgLyogRW50ZXIgKi8pCiAgICAgICAgICAgICAgICAgICAgICAgICYmIChrZXlDb2RlICE9PSA1IC8qIEN0cmwgKi8pCiAgICAgICAgICAgICAgICAgICAgICAgICYmIChrZXlDb2RlICE9PSA0IC8qIFNoaWZ0ICovKQogICAgICAgICAgICAgICAgICAgICAgICAmJiAoa2V5Q29kZSAhPT0gNiAvKiBBbHQgKi8pCiAgICAgICAgICAgICAgICAgICAgICAgICYmIChrZXlDb2RlICE9PSA1NyAvKiBNZXRhICovKSkgewogICAgICAgICAgICAgICAgICAgICAgICBJTU1VVEFCTEVfS0VZX0NPREVfVE9fQ09ERVtrZXlDb2RlXSA9IHNjYW5Db2RlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlZW5LZXlDb2RlW2tleUNvZGVdKSB7CiAgICAgICAgICAgICAgICBzZWVuS2V5Q29kZVtrZXlDb2RlXSA9IHRydWU7CiAgICAgICAgICAgICAgICBpZiAoIWtleUNvZGVTdHIpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0cmluZyByZXByZXNlbnRhdGlvbiBtaXNzaW5nIGZvciBrZXkgY29kZSAke2tleUNvZGV9IGFyb3VuZCBzY2FuIGNvZGUgJHtzY2FuQ29kZVN0cn1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVpTWFwLmRlZmluZShrZXlDb2RlLCBrZXlDb2RlU3RyKTsKICAgICAgICAgICAgICAgIHVzZXJTZXR0aW5nc1VTTWFwLmRlZmluZShrZXlDb2RlLCB1c1VzZXJTZXR0aW5nc0xhYmVsIHx8IGtleUNvZGVTdHIpOwogICAgICAgICAgICAgICAgdXNlclNldHRpbmdzR2VuZXJhbE1hcC5kZWZpbmUoa2V5Q29kZSwgZ2VuZXJhbFVzZXJTZXR0aW5nc0xhYmVsIHx8IHVzVXNlclNldHRpbmdzTGFiZWwgfHwga2V5Q29kZVN0cik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGV2ZW50S2V5Q29kZSkgewogICAgICAgICAgICAgICAgRVZFTlRfS0VZX0NPREVfTUFQW2V2ZW50S2V5Q29kZV0gPSBrZXlDb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2a2V5KSB7CiAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XU19LRVlfQ09ERV9UT19LRVlfQ09ERVt2a2V5XSA9IGtleUNvZGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gTWFudWFsbHkgYWRkZWQgZHVlIHRvIHRoZSBleGNsdXNpb24gYWJvdmUgKGR1ZSB0byBkdXBsaWNhdGlvbiB3aXRoIE51bXBhZEVudGVyKQogICAgICAgIElNTVVUQUJMRV9LRVlfQ09ERV9UT19DT0RFWzMgLyogRW50ZXIgKi9dID0gNDYgLyogRW50ZXIgKi87CiAgICB9KSgpOwogICAgdmFyIEtleUNvZGVVdGlsczsKICAgIChmdW5jdGlvbiAoS2V5Q29kZVV0aWxzKSB7CiAgICAgICAgZnVuY3Rpb24gdG9TdHJpbmcoa2V5Q29kZSkgewogICAgICAgICAgICByZXR1cm4gdWlNYXAua2V5Q29kZVRvU3RyKGtleUNvZGUpOwogICAgICAgIH0KICAgICAgICBLZXlDb2RlVXRpbHMudG9TdHJpbmcgPSB0b1N0cmluZzsKICAgICAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKGtleSkgewogICAgICAgICAgICByZXR1cm4gdWlNYXAuc3RyVG9LZXlDb2RlKGtleSk7CiAgICAgICAgfQogICAgICAgIEtleUNvZGVVdGlscy5mcm9tU3RyaW5nID0gZnJvbVN0cmluZzsKICAgICAgICBmdW5jdGlvbiB0b1VzZXJTZXR0aW5nc1VTKGtleUNvZGUpIHsKICAgICAgICAgICAgcmV0dXJuIHVzZXJTZXR0aW5nc1VTTWFwLmtleUNvZGVUb1N0cihrZXlDb2RlKTsKICAgICAgICB9CiAgICAgICAgS2V5Q29kZVV0aWxzLnRvVXNlclNldHRpbmdzVVMgPSB0b1VzZXJTZXR0aW5nc1VTOwogICAgICAgIGZ1bmN0aW9uIHRvVXNlclNldHRpbmdzR2VuZXJhbChrZXlDb2RlKSB7CiAgICAgICAgICAgIHJldHVybiB1c2VyU2V0dGluZ3NHZW5lcmFsTWFwLmtleUNvZGVUb1N0cihrZXlDb2RlKTsKICAgICAgICB9CiAgICAgICAgS2V5Q29kZVV0aWxzLnRvVXNlclNldHRpbmdzR2VuZXJhbCA9IHRvVXNlclNldHRpbmdzR2VuZXJhbDsKICAgICAgICBmdW5jdGlvbiBmcm9tVXNlclNldHRpbmdzKGtleSkgewogICAgICAgICAgICByZXR1cm4gdXNlclNldHRpbmdzVVNNYXAuc3RyVG9LZXlDb2RlKGtleSkgfHwgdXNlclNldHRpbmdzR2VuZXJhbE1hcC5zdHJUb0tleUNvZGUoa2V5KTsKICAgICAgICB9CiAgICAgICAgS2V5Q29kZVV0aWxzLmZyb21Vc2VyU2V0dGluZ3MgPSBmcm9tVXNlclNldHRpbmdzOwogICAgICAgIGZ1bmN0aW9uIHRvRWxlY3Ryb25BY2NlbGVyYXRvcihrZXlDb2RlKSB7CiAgICAgICAgICAgIGlmIChrZXlDb2RlID49IDkzIC8qIE51bXBhZDAgKi8gJiYga2V5Q29kZSA8PSAxMDggLyogTnVtcGFkRGl2aWRlICovKSB7CiAgICAgICAgICAgICAgICAvLyBbRWxlY3Ryb24gQWNjZWxlcmF0b3JzXSBFbGVjdHJvbiBpcyBhYmxlIHRvIHBhcnNlIG51bXBhZCBrZXlzLCBidXQgdW5mb3J0dW5hdGVseSBpdAogICAgICAgICAgICAgICAgLy8gcmVuZGVycyB0aGVtIGp1c3QgYXMgcmVndWxhciBrZXlzIGluIG1lbnVzLiBGb3IgZXhhbXBsZSwgbnVtMCBpcyByZW5kZXJlZCBhcyAiMCIsCiAgICAgICAgICAgICAgICAvLyBudW1kaXYgaXMgcmVuZGVyZWQgYXMgIi8iLCBudW1zdWIgaXMgcmVuZGVyZWQgYXMgIi0iLgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIGxlYWQgdG8gaW5jcmVkaWJsZSBjb25mdXNpb24sIGFzIGl0IG1ha2VzIG51bXBhZCBiYXNlZCBrZXliaW5kaW5ncyBpbmRpc3Rpbmd1aXNoYWJsZQogICAgICAgICAgICAgICAgLy8gZnJvbSBrZXliaW5kaW5ncyBiYXNlZCBvbiByZWd1bGFyIGtleXMuCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gV2UgdGhlcmVmb3JlIG5lZWQgdG8gZmFsbCBiYWNrIHRvIGN1c3RvbSByZW5kZXJpbmcgZm9yIG51bXBhZCBrZXlzLgogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CiAgICAgICAgICAgICAgICBjYXNlIDE2IC8qIFVwQXJyb3cgKi86CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdVcCc7CiAgICAgICAgICAgICAgICBjYXNlIDE4IC8qIERvd25BcnJvdyAqLzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0Rvd24nOwogICAgICAgICAgICAgICAgY2FzZSAxNSAvKiBMZWZ0QXJyb3cgKi86CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdMZWZ0JzsKICAgICAgICAgICAgICAgIGNhc2UgMTcgLyogUmlnaHRBcnJvdyAqLzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1JpZ2h0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdWlNYXAua2V5Q29kZVRvU3RyKGtleUNvZGUpOwogICAgICAgIH0KICAgICAgICBLZXlDb2RlVXRpbHMudG9FbGVjdHJvbkFjY2VsZXJhdG9yID0gdG9FbGVjdHJvbkFjY2VsZXJhdG9yOwogICAgfSkoS2V5Q29kZVV0aWxzIHx8IChLZXlDb2RlVXRpbHMgPSB7fSkpOwogICAgZnVuY3Rpb24gS2V5Q2hvcmQoZmlyc3RQYXJ0LCBzZWNvbmRQYXJ0KSB7CiAgICAgICAgY29uc3QgY2hvcmRQYXJ0ID0gKChzZWNvbmRQYXJ0ICYgMHgwMDAwRkZGRikgPDwgMTYpID4+PiAwOwogICAgICAgIHJldHVybiAoZmlyc3RQYXJ0IHwgY2hvcmRQYXJ0KSA+Pj4gMDsKICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIC8qKgogICAgICogQSBzZWxlY3Rpb24gaW4gdGhlIGVkaXRvci4KICAgICAqIFRoZSBzZWxlY3Rpb24gaXMgYSByYW5nZSB0aGF0IGhhcyBhbiBvcmllbnRhdGlvbi4KICAgICAqLwogICAgY2xhc3MgU2VsZWN0aW9uIGV4dGVuZHMgUmFuZ2UkMSB7CiAgICAgICAgY29uc3RydWN0b3Ioc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyLCBzZWxlY3Rpb25TdGFydENvbHVtbiwgcG9zaXRpb25MaW5lTnVtYmVyLCBwb3NpdGlvbkNvbHVtbikgewogICAgICAgICAgICBzdXBlcihzZWxlY3Rpb25TdGFydExpbmVOdW1iZXIsIHNlbGVjdGlvblN0YXJ0Q29sdW1uLCBwb3NpdGlvbkxpbmVOdW1iZXIsIHBvc2l0aW9uQ29sdW1uKTsKICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIgPSBzZWxlY3Rpb25TdGFydExpbmVOdW1iZXI7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnRDb2x1bW4gPSBzZWxlY3Rpb25TdGFydENvbHVtbjsKICAgICAgICAgICAgdGhpcy5wb3NpdGlvbkxpbmVOdW1iZXIgPSBwb3NpdGlvbkxpbmVOdW1iZXI7CiAgICAgICAgICAgIHRoaXMucG9zaXRpb25Db2x1bW4gPSBwb3NpdGlvbkNvbHVtbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVHJhbnNmb3JtIHRvIGEgaHVtYW4tcmVhZGFibGUgcmVwcmVzZW50YXRpb24uCiAgICAgICAgICovCiAgICAgICAgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgIHJldHVybiAnWycgKyB0aGlzLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciArICcsJyArIHRoaXMuc2VsZWN0aW9uU3RhcnRDb2x1bW4gKyAnIC0+ICcgKyB0aGlzLnBvc2l0aW9uTGluZU51bWJlciArICcsJyArIHRoaXMucG9zaXRpb25Db2x1bW4gKyAnXSc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgZXF1YWxzIG90aGVyIHNlbGVjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBlcXVhbHNTZWxlY3Rpb24ob3RoZXIpIHsKICAgICAgICAgICAgcmV0dXJuIChTZWxlY3Rpb24uc2VsZWN0aW9uc0VxdWFsKHRoaXMsIG90aGVyKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3QgaWYgdGhlIHR3byBzZWxlY3Rpb25zIGFyZSBlcXVhbC4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgc2VsZWN0aW9uc0VxdWFsKGEsIGIpIHsKICAgICAgICAgICAgcmV0dXJuIChhLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciA9PT0gYi5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIgJiYKICAgICAgICAgICAgICAgIGEuc2VsZWN0aW9uU3RhcnRDb2x1bW4gPT09IGIuc2VsZWN0aW9uU3RhcnRDb2x1bW4gJiYKICAgICAgICAgICAgICAgIGEucG9zaXRpb25MaW5lTnVtYmVyID09PSBiLnBvc2l0aW9uTGluZU51bWJlciAmJgogICAgICAgICAgICAgICAgYS5wb3NpdGlvbkNvbHVtbiA9PT0gYi5wb3NpdGlvbkNvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldCBkaXJlY3Rpb25zIChMVFIgb3IgUlRMKS4KICAgICAgICAgKi8KICAgICAgICBnZXREaXJlY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciA9PT0gdGhpcy5zdGFydExpbmVOdW1iZXIgJiYgdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbiA9PT0gdGhpcy5zdGFydENvbHVtbikgewogICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogTFRSICovOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAxIC8qIFJUTCAqLzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlIGEgbmV3IHNlbGVjdGlvbiB3aXRoIGEgZGlmZmVyZW50IGBwb3NpdGlvbkxpbmVOdW1iZXJgIGFuZCBgcG9zaXRpb25Db2x1bW5gLgogICAgICAgICAqLwogICAgICAgIHNldEVuZFBvc2l0aW9uKGVuZExpbmVOdW1iZXIsIGVuZENvbHVtbikgewogICAgICAgICAgICBpZiAodGhpcy5nZXREaXJlY3Rpb24oKSA9PT0gMCAvKiBMVFIgKi8pIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuc3RhcnRMaW5lTnVtYmVyLCB0aGlzLnN0YXJ0Q29sdW1uLCBlbmRMaW5lTnVtYmVyLCBlbmRDb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKGVuZExpbmVOdW1iZXIsIGVuZENvbHVtbiwgdGhpcy5zdGFydExpbmVOdW1iZXIsIHRoaXMuc3RhcnRDb2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIGF0IGBwb3NpdGlvbkxpbmVOdW1iZXJgIGFuZCBgcG9zaXRpb25Db2x1bW5gLgogICAgICAgICAqLwogICAgICAgIGdldFBvc2l0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFBvc2l0aW9uJDEodGhpcy5wb3NpdGlvbkxpbmVOdW1iZXIsIHRoaXMucG9zaXRpb25Db2x1bW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgc2VsZWN0aW9uLgogICAgICAgICovCiAgICAgICAgZ2V0U2VsZWN0aW9uU3RhcnQoKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUG9zaXRpb24kMSh0aGlzLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciwgdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZSBhIG5ldyBzZWxlY3Rpb24gd2l0aCBhIGRpZmZlcmVudCBgc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyYCBhbmQgYHNlbGVjdGlvblN0YXJ0Q29sdW1uYC4KICAgICAgICAgKi8KICAgICAgICBzZXRTdGFydFBvc2l0aW9uKHN0YXJ0TGluZU51bWJlciwgc3RhcnRDb2x1bW4pIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0RGlyZWN0aW9uKCkgPT09IDAgLyogTFRSICovKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uLCB0aGlzLmVuZExpbmVOdW1iZXIsIHRoaXMuZW5kQ29sdW1uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLmVuZExpbmVOdW1iZXIsIHRoaXMuZW5kQ29sdW1uLCBzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLy8gLS0tLQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZSBhIGBTZWxlY3Rpb25gIGZyb20gb25lIG9yIHR3byBwb3NpdGlvbnMKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgZnJvbVBvc2l0aW9ucyhzdGFydCwgZW5kID0gc3RhcnQpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3RhcnQubGluZU51bWJlciwgc3RhcnQuY29sdW1uLCBlbmQubGluZU51bWJlciwgZW5kLmNvbHVtbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBgU2VsZWN0aW9uYCBmcm9tIGEgcmFuZ2UsIGdpdmVuIGEgZGlyZWN0aW9uLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBmcm9tUmFuZ2UocmFuZ2UsIGRpcmVjdGlvbikgewogICAgICAgICAgICBpZiAoZGlyZWN0aW9uID09PSAwIC8qIExUUiAqLykgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24ocmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLCByYW5nZS5zdGFydENvbHVtbiwgcmFuZ2UuZW5kTGluZU51bWJlciwgcmFuZ2UuZW5kQ29sdW1uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHJhbmdlLmVuZExpbmVOdW1iZXIsIHJhbmdlLmVuZENvbHVtbiwgcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLCByYW5nZS5zdGFydENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlIGEgYFNlbGVjdGlvbmAgZnJvbSBhbiBgSVNlbGVjdGlvbmAuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGxpZnRTZWxlY3Rpb24oc2VsKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHNlbC5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIsIHNlbC5zZWxlY3Rpb25TdGFydENvbHVtbiwgc2VsLnBvc2l0aW9uTGluZU51bWJlciwgc2VsLnBvc2l0aW9uQ29sdW1uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogYGFgIGVxdWFscyBgYmAuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIHNlbGVjdGlvbnNBcnJFcXVhbChhLCBiKSB7CiAgICAgICAgICAgIGlmIChhICYmICFiIHx8ICFhICYmIGIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWEgJiYgIWIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYS5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGlvbnNFcXVhbChhW2ldLCBiW2ldKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCBpZiBgb2JqYCBpcyBhbiBgSVNlbGVjdGlvbmAuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGlzSVNlbGVjdGlvbihvYmopIHsKICAgICAgICAgICAgcmV0dXJuIChvYmoKICAgICAgICAgICAgICAgICYmICh0eXBlb2Ygb2JqLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciA9PT0gJ251bWJlcicpCiAgICAgICAgICAgICAgICAmJiAodHlwZW9mIG9iai5zZWxlY3Rpb25TdGFydENvbHVtbiA9PT0gJ251bWJlcicpCiAgICAgICAgICAgICAgICAmJiAodHlwZW9mIG9iai5wb3NpdGlvbkxpbmVOdW1iZXIgPT09ICdudW1iZXInKQogICAgICAgICAgICAgICAgJiYgKHR5cGVvZiBvYmoucG9zaXRpb25Db2x1bW4gPT09ICdudW1iZXInKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZSB3aXRoIGEgZGlyZWN0aW9uLgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGVXaXRoRGlyZWN0aW9uKHN0YXJ0TGluZU51bWJlciwgc3RhcnRDb2x1bW4sIGVuZExpbmVOdW1iZXIsIGVuZENvbHVtbiwgZGlyZWN0aW9uKSB7CiAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT09IDAgLyogTFRSICovKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdGFydExpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uLCBlbmRMaW5lTnVtYmVyLCBlbmRDb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKGVuZExpbmVOdW1iZXIsIGVuZENvbHVtbiwgc3RhcnRMaW5lTnVtYmVyLCBzdGFydENvbHVtbik7CiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgY2xhc3MgVG9rZW4gewogICAgICAgIGNvbnN0cnVjdG9yKG9mZnNldCwgdHlwZSwgbGFuZ3VhZ2UpIHsKICAgICAgICAgICAgdGhpcy5fdG9rZW5CcmFuZCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgICAgICAgIHRoaXMubGFuZ3VhZ2UgPSBsYW5ndWFnZTsKICAgICAgICB9CiAgICAgICAgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgIHJldHVybiAnKCcgKyB0aGlzLm9mZnNldCArICcsICcgKyB0aGlzLnR5cGUgKyAnKSc7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgVG9rZW5pemF0aW9uUmVzdWx0IHsKICAgICAgICBjb25zdHJ1Y3Rvcih0b2tlbnMsIGVuZFN0YXRlKSB7CiAgICAgICAgICAgIHRoaXMuX3Rva2VuaXphdGlvblJlc3VsdEJyYW5kID0gdW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLnRva2VucyA9IHRva2VuczsKICAgICAgICAgICAgdGhpcy5lbmRTdGF0ZSA9IGVuZFN0YXRlOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFRva2VuaXphdGlvblJlc3VsdDIgewogICAgICAgIGNvbnN0cnVjdG9yKHRva2VucywgZW5kU3RhdGUpIHsKICAgICAgICAgICAgdGhpcy5fdG9rZW5pemF0aW9uUmVzdWx0MkJyYW5kID0gdW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLnRva2VucyA9IHRva2VuczsKICAgICAgICAgICAgdGhpcy5lbmRTdGF0ZSA9IGVuZFN0YXRlOwogICAgICAgIH0KICAgIH0KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIC8vIFRISVMgSVMgQSBHRU5FUkFURUQgRklMRS4gRE8gTk9UIEVESVQgRElSRUNUTFkuCiAgICB2YXIgQWNjZXNzaWJpbGl0eVN1cHBvcnQ7CiAgICAoZnVuY3Rpb24gKEFjY2Vzc2liaWxpdHlTdXBwb3J0KSB7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBzaG91bGQgYmUgdGhlIGJyb3dzZXIgY2FzZSB3aGVyZSBpdCBpcyBub3Qga25vd24gaWYgYSBzY3JlZW4gcmVhZGVyIGlzIGF0dGFjaGVkIG9yIG5vLgogICAgICAgICAqLwogICAgICAgIEFjY2Vzc2liaWxpdHlTdXBwb3J0W0FjY2Vzc2liaWxpdHlTdXBwb3J0WyJVbmtub3duIl0gPSAwXSA9ICJVbmtub3duIjsKICAgICAgICBBY2Nlc3NpYmlsaXR5U3VwcG9ydFtBY2Nlc3NpYmlsaXR5U3VwcG9ydFsiRGlzYWJsZWQiXSA9IDFdID0gIkRpc2FibGVkIjsKICAgICAgICBBY2Nlc3NpYmlsaXR5U3VwcG9ydFtBY2Nlc3NpYmlsaXR5U3VwcG9ydFsiRW5hYmxlZCJdID0gMl0gPSAiRW5hYmxlZCI7CiAgICB9KShBY2Nlc3NpYmlsaXR5U3VwcG9ydCB8fCAoQWNjZXNzaWJpbGl0eVN1cHBvcnQgPSB7fSkpOwogICAgLyoqCiAgICAgKiBDb2xvciBzY2hlbWUgdXNlZCBieSB0aGUgT1MgYW5kIGJ5IGNvbG9yIHRoZW1lcy4KICAgICAqLwogICAgdmFyIENvbG9yU2NoZW1lOwogICAgKGZ1bmN0aW9uIChDb2xvclNjaGVtZSkgewogICAgICAgIENvbG9yU2NoZW1lWyJEQVJLIl0gPSAiZGFyayI7CiAgICAgICAgQ29sb3JTY2hlbWVbIkxJR0hUIl0gPSAibGlnaHQiOwogICAgICAgIENvbG9yU2NoZW1lWyJISUdIX0NPTlRSQVNUIl0gPSAiaGMiOwogICAgfSkoQ29sb3JTY2hlbWUgfHwgKENvbG9yU2NoZW1lID0ge30pKTsKICAgIHZhciBDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlOwogICAgKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQWRqdXN0IHdoaXRlc3BhY2UvaW5kZW50YXRpb24gb2YgbXVsdGlsaW5lIGluc2VydCB0ZXh0cyB0bwogICAgICAgICAqIG1hdGNoIHRoZSBjdXJyZW50IGxpbmUgaW5kZW50YXRpb24uCiAgICAgICAgICovCiAgICAgICAgQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZVtDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlWyJLZWVwV2hpdGVzcGFjZSJdID0gMV0gPSAiS2VlcFdoaXRlc3BhY2UiOwogICAgICAgIC8qKgogICAgICAgICAqIGBpbnNlcnRUZXh0YCBpcyBhIHNuaXBwZXQuCiAgICAgICAgICovCiAgICAgICAgQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZVtDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlWyJJbnNlcnRBc1NuaXBwZXQiXSA9IDRdID0gIkluc2VydEFzU25pcHBldCI7CiAgICB9KShDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlIHx8IChDb21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlID0ge30pKTsKICAgIHZhciBDb21wbGV0aW9uSXRlbUtpbmQkMTsKICAgIChmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1LaW5kKSB7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiTWV0aG9kIl0gPSAwXSA9ICJNZXRob2QiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIkZ1bmN0aW9uIl0gPSAxXSA9ICJGdW5jdGlvbiI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiQ29uc3RydWN0b3IiXSA9IDJdID0gIkNvbnN0cnVjdG9yIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJGaWVsZCJdID0gM10gPSAiRmllbGQiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIlZhcmlhYmxlIl0gPSA0XSA9ICJWYXJpYWJsZSI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiQ2xhc3MiXSA9IDVdID0gIkNsYXNzIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJTdHJ1Y3QiXSA9IDZdID0gIlN0cnVjdCI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiSW50ZXJmYWNlIl0gPSA3XSA9ICJJbnRlcmZhY2UiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIk1vZHVsZSJdID0gOF0gPSAiTW9kdWxlIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJQcm9wZXJ0eSJdID0gOV0gPSAiUHJvcGVydHkiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIkV2ZW50Il0gPSAxMF0gPSAiRXZlbnQiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIk9wZXJhdG9yIl0gPSAxMV0gPSAiT3BlcmF0b3IiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIlVuaXQiXSA9IDEyXSA9ICJVbml0IjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJWYWx1ZSJdID0gMTNdID0gIlZhbHVlIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJDb25zdGFudCJdID0gMTRdID0gIkNvbnN0YW50IjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJFbnVtIl0gPSAxNV0gPSAiRW51bSI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiRW51bU1lbWJlciJdID0gMTZdID0gIkVudW1NZW1iZXIiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIktleXdvcmQiXSA9IDE3XSA9ICJLZXl3b3JkIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJUZXh0Il0gPSAxOF0gPSAiVGV4dCI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiQ29sb3IiXSA9IDE5XSA9ICJDb2xvciI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiRmlsZSJdID0gMjBdID0gIkZpbGUiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIlJlZmVyZW5jZSJdID0gMjFdID0gIlJlZmVyZW5jZSI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiQ3VzdG9tY29sb3IiXSA9IDIyXSA9ICJDdXN0b21jb2xvciI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiRm9sZGVyIl0gPSAyM10gPSAiRm9sZGVyIjsKICAgICAgICBDb21wbGV0aW9uSXRlbUtpbmRbQ29tcGxldGlvbkl0ZW1LaW5kWyJUeXBlUGFyYW1ldGVyIl0gPSAyNF0gPSAiVHlwZVBhcmFtZXRlciI7CiAgICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kW0NvbXBsZXRpb25JdGVtS2luZFsiVXNlciJdID0gMjVdID0gIlVzZXIiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIklzc3VlIl0gPSAyNl0gPSAiSXNzdWUiOwogICAgICAgIENvbXBsZXRpb25JdGVtS2luZFtDb21wbGV0aW9uSXRlbUtpbmRbIlNuaXBwZXQiXSA9IDI3XSA9ICJTbmlwcGV0IjsKICAgIH0pKENvbXBsZXRpb25JdGVtS2luZCQxIHx8IChDb21wbGV0aW9uSXRlbUtpbmQkMSA9IHt9KSk7CiAgICB2YXIgQ29tcGxldGlvbkl0ZW1UYWckMTsKICAgIChmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1UYWcpIHsKICAgICAgICBDb21wbGV0aW9uSXRlbVRhZ1tDb21wbGV0aW9uSXRlbVRhZ1siRGVwcmVjYXRlZCJdID0gMV0gPSAiRGVwcmVjYXRlZCI7CiAgICB9KShDb21wbGV0aW9uSXRlbVRhZyQxIHx8IChDb21wbGV0aW9uSXRlbVRhZyQxID0ge30pKTsKICAgIC8qKgogICAgICogSG93IGEgc3VnZ2VzdCBwcm92aWRlciB3YXMgdHJpZ2dlcmVkLgogICAgICovCiAgICB2YXIgQ29tcGxldGlvblRyaWdnZXJLaW5kOwogICAgKGZ1bmN0aW9uIChDb21wbGV0aW9uVHJpZ2dlcktpbmQpIHsKICAgICAgICBDb21wbGV0aW9uVHJpZ2dlcktpbmRbQ29tcGxldGlvblRyaWdnZXJLaW5kWyJJbnZva2UiXSA9IDBdID0gIkludm9rZSI7CiAgICAgICAgQ29tcGxldGlvblRyaWdnZXJLaW5kW0NvbXBsZXRpb25UcmlnZ2VyS2luZFsiVHJpZ2dlckNoYXJhY3RlciJdID0gMV0gPSAiVHJpZ2dlckNoYXJhY3RlciI7CiAgICAgICAgQ29tcGxldGlvblRyaWdnZXJLaW5kW0NvbXBsZXRpb25UcmlnZ2VyS2luZFsiVHJpZ2dlckZvckluY29tcGxldGVDb21wbGV0aW9ucyJdID0gMl0gPSAiVHJpZ2dlckZvckluY29tcGxldGVDb21wbGV0aW9ucyI7CiAgICB9KShDb21wbGV0aW9uVHJpZ2dlcktpbmQgfHwgKENvbXBsZXRpb25UcmlnZ2VyS2luZCA9IHt9KSk7CiAgICB2YXIgQ29uZmlndXJhdGlvblNjb3BlOwogICAgKGZ1bmN0aW9uIChDb25maWd1cmF0aW9uU2NvcGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBBcHBsaWNhdGlvbiBzcGVjaWZpYyBjb25maWd1cmF0aW9uLCB3aGljaCBjYW4gYmUgY29uZmlndXJlZCBvbmx5IGluIGxvY2FsIHVzZXIgc2V0dGluZ3MuCiAgICAgICAgICovCiAgICAgICAgQ29uZmlndXJhdGlvblNjb3BlW0NvbmZpZ3VyYXRpb25TY29wZVsiQVBQTElDQVRJT04iXSA9IDFdID0gIkFQUExJQ0FUSU9OIjsKICAgICAgICAvKioKICAgICAgICAgKiBNYWNoaW5lIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24sIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkIG9ubHkgaW4gbG9jYWwgYW5kIHJlbW90ZSB1c2VyIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIENvbmZpZ3VyYXRpb25TY29wZVtDb25maWd1cmF0aW9uU2NvcGVbIk1BQ0hJTkUiXSA9IDJdID0gIk1BQ0hJTkUiOwogICAgICAgIC8qKgogICAgICAgICAqIFdpbmRvdyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLCB3aGljaCBjYW4gYmUgY29uZmlndXJlZCBpbiB0aGUgdXNlciBvciB3b3Jrc3BhY2Ugc2V0dGluZ3MuCiAgICAgICAgICovCiAgICAgICAgQ29uZmlndXJhdGlvblNjb3BlW0NvbmZpZ3VyYXRpb25TY29wZVsiV0lORE9XIl0gPSAzXSA9ICJXSU5ET1ciOwogICAgICAgIC8qKgogICAgICAgICAqIFJlc291cmNlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24sIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkIGluIHRoZSB1c2VyLCB3b3Jrc3BhY2Ugb3IgZm9sZGVyIHNldHRpbmdzLgogICAgICAgICAqLwogICAgICAgIENvbmZpZ3VyYXRpb25TY29wZVtDb25maWd1cmF0aW9uU2NvcGVbIlJFU09VUkNFIl0gPSA0XSA9ICJSRVNPVVJDRSI7CiAgICAgICAgLyoqCiAgICAgICAgICogUmVzb3VyY2Ugc3BlY2lmaWMgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBiZSBjb25maWd1cmVkIGluIGxhbmd1YWdlIHNwZWNpZmljIHNldHRpbmdzCiAgICAgICAgICovCiAgICAgICAgQ29uZmlndXJhdGlvblNjb3BlW0NvbmZpZ3VyYXRpb25TY29wZVsiTEFOR1VBR0VfT1ZFUlJJREFCTEUiXSA9IDVdID0gIkxBTkdVQUdFX09WRVJSSURBQkxFIjsKICAgICAgICAvKioKICAgICAgICAgKiBNYWNoaW5lIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gdGhhdCBjYW4gYWxzbyBiZSBjb25maWd1cmVkIGluIHdvcmtzcGFjZSBvciBmb2xkZXIgc2V0dGluZ3MuCiAgICAgICAgICovCiAgICAgICAgQ29uZmlndXJhdGlvblNjb3BlW0NvbmZpZ3VyYXRpb25TY29wZVsiTUFDSElORV9PVkVSUklEQUJMRSJdID0gNl0gPSAiTUFDSElORV9PVkVSUklEQUJMRSI7CiAgICB9KShDb25maWd1cmF0aW9uU2NvcGUgfHwgKENvbmZpZ3VyYXRpb25TY29wZSA9IHt9KSk7CiAgICB2YXIgQ29uZmlndXJhdGlvblRhcmdldDsKICAgIChmdW5jdGlvbiAoQ29uZmlndXJhdGlvblRhcmdldCkgewogICAgICAgIENvbmZpZ3VyYXRpb25UYXJnZXRbQ29uZmlndXJhdGlvblRhcmdldFsiVVNFUiJdID0gMV0gPSAiVVNFUiI7CiAgICAgICAgQ29uZmlndXJhdGlvblRhcmdldFtDb25maWd1cmF0aW9uVGFyZ2V0WyJVU0VSX0xPQ0FMIl0gPSAyXSA9ICJVU0VSX0xPQ0FMIjsKICAgICAgICBDb25maWd1cmF0aW9uVGFyZ2V0W0NvbmZpZ3VyYXRpb25UYXJnZXRbIlVTRVJfUkVNT1RFIl0gPSAzXSA9ICJVU0VSX1JFTU9URSI7CiAgICAgICAgQ29uZmlndXJhdGlvblRhcmdldFtDb25maWd1cmF0aW9uVGFyZ2V0WyJXT1JLU1BBQ0UiXSA9IDRdID0gIldPUktTUEFDRSI7CiAgICAgICAgQ29uZmlndXJhdGlvblRhcmdldFtDb25maWd1cmF0aW9uVGFyZ2V0WyJXT1JLU1BBQ0VfRk9MREVSIl0gPSA1XSA9ICJXT1JLU1BBQ0VfRk9MREVSIjsKICAgICAgICBDb25maWd1cmF0aW9uVGFyZ2V0W0NvbmZpZ3VyYXRpb25UYXJnZXRbIkRFRkFVTFQiXSA9IDZdID0gIkRFRkFVTFQiOwogICAgICAgIENvbmZpZ3VyYXRpb25UYXJnZXRbQ29uZmlndXJhdGlvblRhcmdldFsiTUVNT1JZIl0gPSA3XSA9ICJNRU1PUlkiOwogICAgfSkoQ29uZmlndXJhdGlvblRhcmdldCB8fCAoQ29uZmlndXJhdGlvblRhcmdldCA9IHt9KSk7CiAgICAvKioKICAgICAqIEEgcG9zaXRpb25pbmcgcHJlZmVyZW5jZSBmb3IgcmVuZGVyaW5nIGNvbnRlbnQgd2lkZ2V0cy4KICAgICAqLwogICAgdmFyIENvbnRlbnRXaWRnZXRQb3NpdGlvblByZWZlcmVuY2U7CiAgICAoZnVuY3Rpb24gKENvbnRlbnRXaWRnZXRQb3NpdGlvblByZWZlcmVuY2UpIHsKICAgICAgICAvKioKICAgICAgICAgKiBQbGFjZSB0aGUgY29udGVudCB3aWRnZXQgZXhhY3RseSBhdCBhIHBvc2l0aW9uCiAgICAgICAgICovCiAgICAgICAgQ29udGVudFdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVtDb250ZW50V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlWyJFWEFDVCJdID0gMF0gPSAiRVhBQ1QiOwogICAgICAgIC8qKgogICAgICAgICAqIFBsYWNlIHRoZSBjb250ZW50IHdpZGdldCBhYm92ZSBhIHBvc2l0aW9uCiAgICAgICAgICovCiAgICAgICAgQ29udGVudFdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVtDb250ZW50V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlWyJBQk9WRSJdID0gMV0gPSAiQUJPVkUiOwogICAgICAgIC8qKgogICAgICAgICAqIFBsYWNlIHRoZSBjb250ZW50IHdpZGdldCBiZWxvdyBhIHBvc2l0aW9uCiAgICAgICAgICovCiAgICAgICAgQ29udGVudFdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVtDb250ZW50V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlWyJCRUxPVyJdID0gMl0gPSAiQkVMT1ciOwogICAgfSkoQ29udGVudFdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZSB8fCAoQ29udGVudFdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZSA9IHt9KSk7CiAgICB2YXIgQ29udGV4dEtleUV4cHJUeXBlOwogICAgKGZ1bmN0aW9uIChDb250ZXh0S2V5RXhwclR5cGUpIHsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJGYWxzZSJdID0gMF0gPSAiRmFsc2UiOwogICAgICAgIENvbnRleHRLZXlFeHByVHlwZVtDb250ZXh0S2V5RXhwclR5cGVbIlRydWUiXSA9IDFdID0gIlRydWUiOwogICAgICAgIENvbnRleHRLZXlFeHByVHlwZVtDb250ZXh0S2V5RXhwclR5cGVbIkRlZmluZWQiXSA9IDJdID0gIkRlZmluZWQiOwogICAgICAgIENvbnRleHRLZXlFeHByVHlwZVtDb250ZXh0S2V5RXhwclR5cGVbIk5vdCJdID0gM10gPSAiTm90IjsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJFcXVhbHMiXSA9IDRdID0gIkVxdWFscyI7CiAgICAgICAgQ29udGV4dEtleUV4cHJUeXBlW0NvbnRleHRLZXlFeHByVHlwZVsiTm90RXF1YWxzIl0gPSA1XSA9ICJOb3RFcXVhbHMiOwogICAgICAgIENvbnRleHRLZXlFeHByVHlwZVtDb250ZXh0S2V5RXhwclR5cGVbIkFuZCJdID0gNl0gPSAiQW5kIjsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJSZWdleCJdID0gN10gPSAiUmVnZXgiOwogICAgICAgIENvbnRleHRLZXlFeHByVHlwZVtDb250ZXh0S2V5RXhwclR5cGVbIk5vdFJlZ2V4Il0gPSA4XSA9ICJOb3RSZWdleCI7CiAgICAgICAgQ29udGV4dEtleUV4cHJUeXBlW0NvbnRleHRLZXlFeHByVHlwZVsiT3IiXSA9IDldID0gIk9yIjsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJJbiJdID0gMTBdID0gIkluIjsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJOb3RJbiJdID0gMTFdID0gIk5vdEluIjsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJHcmVhdGVyIl0gPSAxMl0gPSAiR3JlYXRlciI7CiAgICAgICAgQ29udGV4dEtleUV4cHJUeXBlW0NvbnRleHRLZXlFeHByVHlwZVsiR3JlYXRlckVxdWFscyJdID0gMTNdID0gIkdyZWF0ZXJFcXVhbHMiOwogICAgICAgIENvbnRleHRLZXlFeHByVHlwZVtDb250ZXh0S2V5RXhwclR5cGVbIlNtYWxsZXIiXSA9IDE0XSA9ICJTbWFsbGVyIjsKICAgICAgICBDb250ZXh0S2V5RXhwclR5cGVbQ29udGV4dEtleUV4cHJUeXBlWyJTbWFsbGVyRXF1YWxzIl0gPSAxNV0gPSAiU21hbGxlckVxdWFscyI7CiAgICB9KShDb250ZXh0S2V5RXhwclR5cGUgfHwgKENvbnRleHRLZXlFeHByVHlwZSA9IHt9KSk7CiAgICAvKioKICAgICAqIERlc2NyaWJlcyB0aGUgcmVhc29uIHRoZSBjdXJzb3IgaGFzIGNoYW5nZWQgaXRzIHBvc2l0aW9uLgogICAgICovCiAgICB2YXIgQ3Vyc29yQ2hhbmdlUmVhc29uOwogICAgKGZ1bmN0aW9uIChDdXJzb3JDaGFuZ2VSZWFzb24pIHsKICAgICAgICAvKioKICAgICAgICAgKiBVbmtub3duIG9yIG5vdCBzZXQuCiAgICAgICAgICovCiAgICAgICAgQ3Vyc29yQ2hhbmdlUmVhc29uW0N1cnNvckNoYW5nZVJlYXNvblsiTm90U2V0Il0gPSAwXSA9ICJOb3RTZXQiOwogICAgICAgIC8qKgogICAgICAgICAqIEEgYG1vZGVsLnNldFZhbHVlKClgIHdhcyBjYWxsZWQuCiAgICAgICAgICovCiAgICAgICAgQ3Vyc29yQ2hhbmdlUmVhc29uW0N1cnNvckNoYW5nZVJlYXNvblsiQ29udGVudEZsdXNoIl0gPSAxXSA9ICJDb250ZW50Rmx1c2giOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBgbW9kZWxgIGhhcyBiZWVuIGNoYW5nZWQgb3V0c2lkZSBvZiB0aGlzIGN1cnNvciBhbmQgdGhlIGN1cnNvciByZWNvdmVycyBpdHMgcG9zaXRpb24gZnJvbSBhc3NvY2lhdGVkIG1hcmtlcnMuCiAgICAgICAgICovCiAgICAgICAgQ3Vyc29yQ2hhbmdlUmVhc29uW0N1cnNvckNoYW5nZVJlYXNvblsiUmVjb3ZlckZyb21NYXJrZXJzIl0gPSAyXSA9ICJSZWNvdmVyRnJvbU1hcmtlcnMiOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZXJlIHdhcyBhbiBleHBsaWNpdCB1c2VyIGdlc3R1cmUuCiAgICAgICAgICovCiAgICAgICAgQ3Vyc29yQ2hhbmdlUmVhc29uW0N1cnNvckNoYW5nZVJlYXNvblsiRXhwbGljaXQiXSA9IDNdID0gIkV4cGxpY2l0IjsKICAgICAgICAvKioKICAgICAgICAgKiBUaGVyZSB3YXMgYSBQYXN0ZS4KICAgICAgICAgKi8KICAgICAgICBDdXJzb3JDaGFuZ2VSZWFzb25bQ3Vyc29yQ2hhbmdlUmVhc29uWyJQYXN0ZSJdID0gNF0gPSAiUGFzdGUiOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZXJlIHdhcyBhbiBVbmRvLgogICAgICAgICAqLwogICAgICAgIEN1cnNvckNoYW5nZVJlYXNvbltDdXJzb3JDaGFuZ2VSZWFzb25bIlVuZG8iXSA9IDVdID0gIlVuZG8iOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZXJlIHdhcyBhIFJlZG8uCiAgICAgICAgICovCiAgICAgICAgQ3Vyc29yQ2hhbmdlUmVhc29uW0N1cnNvckNoYW5nZVJlYXNvblsiUmVkbyJdID0gNl0gPSAiUmVkbyI7CiAgICB9KShDdXJzb3JDaGFuZ2VSZWFzb24gfHwgKEN1cnNvckNoYW5nZVJlYXNvbiA9IHt9KSk7CiAgICAvKioKICAgICAqIFRoZSBkZWZhdWx0IGVuZCBvZiBsaW5lIHRvIHVzZSB3aGVuIGluc3RhbnRpYXRpbmcgbW9kZWxzLgogICAgICovCiAgICB2YXIgRGVmYXVsdEVuZE9mTGluZTsKICAgIChmdW5jdGlvbiAoRGVmYXVsdEVuZE9mTGluZSkgewogICAgICAgIC8qKgogICAgICAgICAqIFVzZSBsaW5lIGZlZWQgKFxuKSBhcyB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVyLgogICAgICAgICAqLwogICAgICAgIERlZmF1bHRFbmRPZkxpbmVbRGVmYXVsdEVuZE9mTGluZVsiTEYiXSA9IDFdID0gIkxGIjsKICAgICAgICAvKioKICAgICAgICAgKiBVc2UgY2FycmlhZ2UgcmV0dXJuIGFuZCBsaW5lIGZlZWQgKFxyXG4pIGFzIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIuCiAgICAgICAgICovCiAgICAgICAgRGVmYXVsdEVuZE9mTGluZVtEZWZhdWx0RW5kT2ZMaW5lWyJDUkxGIl0gPSAyXSA9ICJDUkxGIjsKICAgIH0pKERlZmF1bHRFbmRPZkxpbmUgfHwgKERlZmF1bHRFbmRPZkxpbmUgPSB7fSkpOwogICAgLyoqCiAgICAgKiBBIGRvY3VtZW50IGhpZ2hsaWdodCBraW5kLgogICAgICovCiAgICB2YXIgRG9jdW1lbnRIaWdobGlnaHRLaW5kJDE7CiAgICAoZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0S2luZCkgewogICAgICAgIC8qKgogICAgICAgICAqIEEgdGV4dHVhbCBvY2N1cnJlbmNlLgogICAgICAgICAqLwogICAgICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZFtEb2N1bWVudEhpZ2hsaWdodEtpbmRbIlRleHQiXSA9IDBdID0gIlRleHQiOwogICAgICAgIC8qKgogICAgICAgICAqIFJlYWQtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHJlYWRpbmcgYSB2YXJpYWJsZS4KICAgICAgICAgKi8KICAgICAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmRbRG9jdW1lbnRIaWdobGlnaHRLaW5kWyJSZWFkIl0gPSAxXSA9ICJSZWFkIjsKICAgICAgICAvKioKICAgICAgICAgKiBXcml0ZS1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2Ugd3JpdGluZyB0byBhIHZhcmlhYmxlLgogICAgICAgICAqLwogICAgICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZFtEb2N1bWVudEhpZ2hsaWdodEtpbmRbIldyaXRlIl0gPSAyXSA9ICJXcml0ZSI7CiAgICB9KShEb2N1bWVudEhpZ2hsaWdodEtpbmQkMSB8fCAoRG9jdW1lbnRIaWdobGlnaHRLaW5kJDEgPSB7fSkpOwogICAgdmFyIEVkaXRQcmVzZW50YXRpb25UeXBlczsKICAgIChmdW5jdGlvbiAoRWRpdFByZXNlbnRhdGlvblR5cGVzKSB7CiAgICAgICAgRWRpdFByZXNlbnRhdGlvblR5cGVzWyJNdWx0aWxpbmUiXSA9ICJtdWx0aWxpbmVUZXh0IjsKICAgICAgICBFZGl0UHJlc2VudGF0aW9uVHlwZXNbIlNpbmdsZWxpbmUiXSA9ICJzaW5nbGVsaW5lVGV4dCI7CiAgICB9KShFZGl0UHJlc2VudGF0aW9uVHlwZXMgfHwgKEVkaXRQcmVzZW50YXRpb25UeXBlcyA9IHt9KSk7CiAgICAvKioKICAgICAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgYXV0byBpbmRlbnRhdGlvbiBpbiB0aGUgZWRpdG9yCiAgICAgKi8KICAgIHZhciBFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3k7CiAgICAoZnVuY3Rpb24gKEVkaXRvckF1dG9JbmRlbnRTdHJhdGVneSkgewogICAgICAgIEVkaXRvckF1dG9JbmRlbnRTdHJhdGVneVtFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3lbIk5vbmUiXSA9IDBdID0gIk5vbmUiOwogICAgICAgIEVkaXRvckF1dG9JbmRlbnRTdHJhdGVneVtFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3lbIktlZXAiXSA9IDFdID0gIktlZXAiOwogICAgICAgIEVkaXRvckF1dG9JbmRlbnRTdHJhdGVneVtFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3lbIkJyYWNrZXRzIl0gPSAyXSA9ICJCcmFja2V0cyI7CiAgICAgICAgRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5W0VkaXRvckF1dG9JbmRlbnRTdHJhdGVneVsiQWR2YW5jZWQiXSA9IDNdID0gIkFkdmFuY2VkIjsKICAgICAgICBFZGl0b3JBdXRvSW5kZW50U3RyYXRlZ3lbRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5WyJGdWxsIl0gPSA0XSA9ICJGdWxsIjsKICAgIH0pKEVkaXRvckF1dG9JbmRlbnRTdHJhdGVneSB8fCAoRWRpdG9yQXV0b0luZGVudFN0cmF0ZWd5ID0ge30pKTsKICAgIHZhciBFZGl0b3JPcHRpb247CiAgICAoZnVuY3Rpb24gKEVkaXRvck9wdGlvbikgewogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImFjY2VwdFN1Z2dlc3Rpb25PbkNvbW1pdENoYXJhY3RlciJdID0gMF0gPSAiYWNjZXB0U3VnZ2VzdGlvbk9uQ29tbWl0Q2hhcmFjdGVyIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJhY2NlcHRTdWdnZXN0aW9uT25FbnRlciJdID0gMV0gPSAiYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXIiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImFjY2Vzc2liaWxpdHlTdXBwb3J0Il0gPSAyXSA9ICJhY2Nlc3NpYmlsaXR5U3VwcG9ydCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiYWNjZXNzaWJpbGl0eVBhZ2VTaXplIl0gPSAzXSA9ICJhY2Nlc3NpYmlsaXR5UGFnZVNpemUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImFyaWFMYWJlbCJdID0gNF0gPSAiYXJpYUxhYmVsIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJhdXRvQ2xvc2luZ0JyYWNrZXRzIl0gPSA1XSA9ICJhdXRvQ2xvc2luZ0JyYWNrZXRzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJhdXRvQ2xvc2luZ0RlbGV0ZSJdID0gNl0gPSAiYXV0b0Nsb3NpbmdEZWxldGUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImF1dG9DbG9zaW5nT3ZlcnR5cGUiXSA9IDddID0gImF1dG9DbG9zaW5nT3ZlcnR5cGUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImF1dG9DbG9zaW5nUXVvdGVzIl0gPSA4XSA9ICJhdXRvQ2xvc2luZ1F1b3RlcyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiYXV0b0luZGVudCJdID0gOV0gPSAiYXV0b0luZGVudCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiYXV0b21hdGljTGF5b3V0Il0gPSAxMF0gPSAiYXV0b21hdGljTGF5b3V0IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJhdXRvU3Vycm91bmQiXSA9IDExXSA9ICJhdXRvU3Vycm91bmQiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImJyYWNrZXRQYWlyQ29sb3JpemF0aW9uIl0gPSAxMl0gPSAiYnJhY2tldFBhaXJDb2xvcml6YXRpb24iOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImd1aWRlcyJdID0gMTNdID0gImd1aWRlcyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiY29kZUxlbnMiXSA9IDE0XSA9ICJjb2RlTGVucyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiY29kZUxlbnNGb250RmFtaWx5Il0gPSAxNV0gPSAiY29kZUxlbnNGb250RmFtaWx5IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJjb2RlTGVuc0ZvbnRTaXplIl0gPSAxNl0gPSAiY29kZUxlbnNGb250U2l6ZSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiY29sb3JEZWNvcmF0b3JzIl0gPSAxN10gPSAiY29sb3JEZWNvcmF0b3JzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJjb2x1bW5TZWxlY3Rpb24iXSA9IDE4XSA9ICJjb2x1bW5TZWxlY3Rpb24iOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImNvbW1lbnRzIl0gPSAxOV0gPSAiY29tbWVudHMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImNvbnRleHRtZW51Il0gPSAyMF0gPSAiY29udGV4dG1lbnUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImNvcHlXaXRoU3ludGF4SGlnaGxpZ2h0aW5nIl0gPSAyMV0gPSAiY29weVdpdGhTeW50YXhIaWdobGlnaHRpbmciOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImN1cnNvckJsaW5raW5nIl0gPSAyMl0gPSAiY3Vyc29yQmxpbmtpbmciOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImN1cnNvclNtb290aENhcmV0QW5pbWF0aW9uIl0gPSAyM10gPSAiY3Vyc29yU21vb3RoQ2FyZXRBbmltYXRpb24iOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImN1cnNvclN0eWxlIl0gPSAyNF0gPSAiY3Vyc29yU3R5bGUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImN1cnNvclN1cnJvdW5kaW5nTGluZXMiXSA9IDI1XSA9ICJjdXJzb3JTdXJyb3VuZGluZ0xpbmVzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJjdXJzb3JTdXJyb3VuZGluZ0xpbmVzU3R5bGUiXSA9IDI2XSA9ICJjdXJzb3JTdXJyb3VuZGluZ0xpbmVzU3R5bGUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImN1cnNvcldpZHRoIl0gPSAyN10gPSAiY3Vyc29yV2lkdGgiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImRpc2FibGVMYXllckhpbnRpbmciXSA9IDI4XSA9ICJkaXNhYmxlTGF5ZXJIaW50aW5nIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJkaXNhYmxlTW9ub3NwYWNlT3B0aW1pemF0aW9ucyJdID0gMjldID0gImRpc2FibGVNb25vc3BhY2VPcHRpbWl6YXRpb25zIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJkb21SZWFkT25seSJdID0gMzBdID0gImRvbVJlYWRPbmx5IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJkcmFnQW5kRHJvcCJdID0gMzFdID0gImRyYWdBbmREcm9wIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJlbXB0eVNlbGVjdGlvbkNsaXBib2FyZCJdID0gMzJdID0gImVtcHR5U2VsZWN0aW9uQ2xpcGJvYXJkIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJleHRyYUVkaXRvckNsYXNzTmFtZSJdID0gMzNdID0gImV4dHJhRWRpdG9yQ2xhc3NOYW1lIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJmYXN0U2Nyb2xsU2Vuc2l0aXZpdHkiXSA9IDM0XSA9ICJmYXN0U2Nyb2xsU2Vuc2l0aXZpdHkiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImZpbmQiXSA9IDM1XSA9ICJmaW5kIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJmaXhlZE92ZXJmbG93V2lkZ2V0cyJdID0gMzZdID0gImZpeGVkT3ZlcmZsb3dXaWRnZXRzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJmb2xkaW5nIl0gPSAzN10gPSAiZm9sZGluZyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZm9sZGluZ1N0cmF0ZWd5Il0gPSAzOF0gPSAiZm9sZGluZ1N0cmF0ZWd5IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJmb2xkaW5nSGlnaGxpZ2h0Il0gPSAzOV0gPSAiZm9sZGluZ0hpZ2hsaWdodCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZm9sZGluZ0ltcG9ydHNCeURlZmF1bHQiXSA9IDQwXSA9ICJmb2xkaW5nSW1wb3J0c0J5RGVmYXVsdCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsidW5mb2xkT25DbGlja0FmdGVyRW5kT2ZMaW5lIl0gPSA0MV0gPSAidW5mb2xkT25DbGlja0FmdGVyRW5kT2ZMaW5lIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJmb250RmFtaWx5Il0gPSA0Ml0gPSAiZm9udEZhbWlseSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZm9udEluZm8iXSA9IDQzXSA9ICJmb250SW5mbyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZm9udExpZ2F0dXJlcyJdID0gNDRdID0gImZvbnRMaWdhdHVyZXMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImZvbnRTaXplIl0gPSA0NV0gPSAiZm9udFNpemUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImZvbnRXZWlnaHQiXSA9IDQ2XSA9ICJmb250V2VpZ2h0IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJmb3JtYXRPblBhc3RlIl0gPSA0N10gPSAiZm9ybWF0T25QYXN0ZSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsiZm9ybWF0T25UeXBlIl0gPSA0OF0gPSAiZm9ybWF0T25UeXBlIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJnbHlwaE1hcmdpbiJdID0gNDldID0gImdseXBoTWFyZ2luIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJnb3RvTG9jYXRpb24iXSA9IDUwXSA9ICJnb3RvTG9jYXRpb24iOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImhpZGVDdXJzb3JJbk92ZXJ2aWV3UnVsZXIiXSA9IDUxXSA9ICJoaWRlQ3Vyc29ySW5PdmVydmlld1J1bGVyIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJob3ZlciJdID0gNTJdID0gImhvdmVyIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJpbkRpZmZFZGl0b3IiXSA9IDUzXSA9ICJpbkRpZmZFZGl0b3IiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImlubGluZVN1Z2dlc3QiXSA9IDU0XSA9ICJpbmxpbmVTdWdnZXN0IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJsZXR0ZXJTcGFjaW5nIl0gPSA1NV0gPSAibGV0dGVyU3BhY2luZyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsibGlnaHRidWxiIl0gPSA1Nl0gPSAibGlnaHRidWxiIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJsaW5lRGVjb3JhdGlvbnNXaWR0aCJdID0gNTddID0gImxpbmVEZWNvcmF0aW9uc1dpZHRoIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJsaW5lSGVpZ2h0Il0gPSA1OF0gPSAibGluZUhlaWdodCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsibGluZU51bWJlcnMiXSA9IDU5XSA9ICJsaW5lTnVtYmVycyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsibGluZU51bWJlcnNNaW5DaGFycyJdID0gNjBdID0gImxpbmVOdW1iZXJzTWluQ2hhcnMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImxpbmtlZEVkaXRpbmciXSA9IDYxXSA9ICJsaW5rZWRFZGl0aW5nIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJsaW5rcyJdID0gNjJdID0gImxpbmtzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJtYXRjaEJyYWNrZXRzIl0gPSA2M10gPSAibWF0Y2hCcmFja2V0cyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsibWluaW1hcCJdID0gNjRdID0gIm1pbmltYXAiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIm1vdXNlU3R5bGUiXSA9IDY1XSA9ICJtb3VzZVN0eWxlIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJtb3VzZVdoZWVsU2Nyb2xsU2Vuc2l0aXZpdHkiXSA9IDY2XSA9ICJtb3VzZVdoZWVsU2Nyb2xsU2Vuc2l0aXZpdHkiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIm1vdXNlV2hlZWxab29tIl0gPSA2N10gPSAibW91c2VXaGVlbFpvb20iOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIm11bHRpQ3Vyc29yTWVyZ2VPdmVybGFwcGluZyJdID0gNjhdID0gIm11bHRpQ3Vyc29yTWVyZ2VPdmVybGFwcGluZyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsibXVsdGlDdXJzb3JNb2RpZmllciJdID0gNjldID0gIm11bHRpQ3Vyc29yTW9kaWZpZXIiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIm11bHRpQ3Vyc29yUGFzdGUiXSA9IDcwXSA9ICJtdWx0aUN1cnNvclBhc3RlIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJvY2N1cnJlbmNlc0hpZ2hsaWdodCJdID0gNzFdID0gIm9jY3VycmVuY2VzSGlnaGxpZ2h0IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJvdmVydmlld1J1bGVyQm9yZGVyIl0gPSA3Ml0gPSAib3ZlcnZpZXdSdWxlckJvcmRlciI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsib3ZlcnZpZXdSdWxlckxhbmVzIl0gPSA3M10gPSAib3ZlcnZpZXdSdWxlckxhbmVzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJwYWRkaW5nIl0gPSA3NF0gPSAicGFkZGluZyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsicGFyYW1ldGVySGludHMiXSA9IDc1XSA9ICJwYXJhbWV0ZXJIaW50cyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsicGVla1dpZGdldERlZmF1bHRGb2N1cyJdID0gNzZdID0gInBlZWtXaWRnZXREZWZhdWx0Rm9jdXMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImRlZmluaXRpb25MaW5rT3BlbnNJblBlZWsiXSA9IDc3XSA9ICJkZWZpbml0aW9uTGlua09wZW5zSW5QZWVrIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJxdWlja1N1Z2dlc3Rpb25zIl0gPSA3OF0gPSAicXVpY2tTdWdnZXN0aW9ucyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsicXVpY2tTdWdnZXN0aW9uc0RlbGF5Il0gPSA3OV0gPSAicXVpY2tTdWdnZXN0aW9uc0RlbGF5IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJyZWFkT25seSJdID0gODBdID0gInJlYWRPbmx5IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJyZW5hbWVPblR5cGUiXSA9IDgxXSA9ICJyZW5hbWVPblR5cGUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInJlbmRlckNvbnRyb2xDaGFyYWN0ZXJzIl0gPSA4Ml0gPSAicmVuZGVyQ29udHJvbENoYXJhY3RlcnMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInJlbmRlckZpbmFsTmV3bGluZSJdID0gODNdID0gInJlbmRlckZpbmFsTmV3bGluZSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsicmVuZGVyTGluZUhpZ2hsaWdodCJdID0gODRdID0gInJlbmRlckxpbmVIaWdobGlnaHQiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInJlbmRlckxpbmVIaWdobGlnaHRPbmx5V2hlbkZvY3VzIl0gPSA4NV0gPSAicmVuZGVyTGluZUhpZ2hsaWdodE9ubHlXaGVuRm9jdXMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInJlbmRlclZhbGlkYXRpb25EZWNvcmF0aW9ucyJdID0gODZdID0gInJlbmRlclZhbGlkYXRpb25EZWNvcmF0aW9ucyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsicmVuZGVyV2hpdGVzcGFjZSJdID0gODddID0gInJlbmRlcldoaXRlc3BhY2UiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInJldmVhbEhvcml6b250YWxSaWdodFBhZGRpbmciXSA9IDg4XSA9ICJyZXZlYWxIb3Jpem9udGFsUmlnaHRQYWRkaW5nIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJyb3VuZGVkU2VsZWN0aW9uIl0gPSA4OV0gPSAicm91bmRlZFNlbGVjdGlvbiI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsicnVsZXJzIl0gPSA5MF0gPSAicnVsZXJzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzY3JvbGxiYXIiXSA9IDkxXSA9ICJzY3JvbGxiYXIiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInNjcm9sbEJleW9uZExhc3RDb2x1bW4iXSA9IDkyXSA9ICJzY3JvbGxCZXlvbmRMYXN0Q29sdW1uIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzY3JvbGxCZXlvbmRMYXN0TGluZSJdID0gOTNdID0gInNjcm9sbEJleW9uZExhc3RMaW5lIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzY3JvbGxQcmVkb21pbmFudEF4aXMiXSA9IDk0XSA9ICJzY3JvbGxQcmVkb21pbmFudEF4aXMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInNlbGVjdGlvbkNsaXBib2FyZCJdID0gOTVdID0gInNlbGVjdGlvbkNsaXBib2FyZCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic2VsZWN0aW9uSGlnaGxpZ2h0Il0gPSA5Nl0gPSAic2VsZWN0aW9uSGlnaGxpZ2h0IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzZWxlY3RPbkxpbmVOdW1iZXJzIl0gPSA5N10gPSAic2VsZWN0T25MaW5lTnVtYmVycyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic2hvd0ZvbGRpbmdDb250cm9scyJdID0gOThdID0gInNob3dGb2xkaW5nQ29udHJvbHMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInNob3dVbnVzZWQiXSA9IDk5XSA9ICJzaG93VW51c2VkIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzbmlwcGV0U3VnZ2VzdGlvbnMiXSA9IDEwMF0gPSAic25pcHBldFN1Z2dlc3Rpb25zIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzbWFydFNlbGVjdCJdID0gMTAxXSA9ICJzbWFydFNlbGVjdCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic21vb3RoU2Nyb2xsaW5nIl0gPSAxMDJdID0gInNtb290aFNjcm9sbGluZyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic3RpY2t5VGFiU3RvcHMiXSA9IDEwM10gPSAic3RpY2t5VGFiU3RvcHMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInN0b3BSZW5kZXJpbmdMaW5lQWZ0ZXIiXSA9IDEwNF0gPSAic3RvcFJlbmRlcmluZ0xpbmVBZnRlciI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic3VnZ2VzdCJdID0gMTA1XSA9ICJzdWdnZXN0IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzdWdnZXN0Rm9udFNpemUiXSA9IDEwNl0gPSAic3VnZ2VzdEZvbnRTaXplIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJzdWdnZXN0TGluZUhlaWdodCJdID0gMTA3XSA9ICJzdWdnZXN0TGluZUhlaWdodCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsic3VnZ2VzdE9uVHJpZ2dlckNoYXJhY3RlcnMiXSA9IDEwOF0gPSAic3VnZ2VzdE9uVHJpZ2dlckNoYXJhY3RlcnMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInN1Z2dlc3RTZWxlY3Rpb24iXSA9IDEwOV0gPSAic3VnZ2VzdFNlbGVjdGlvbiI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsidGFiQ29tcGxldGlvbiJdID0gMTEwXSA9ICJ0YWJDb21wbGV0aW9uIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJ0YWJJbmRleCJdID0gMTExXSA9ICJ0YWJJbmRleCI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsidW5pY29kZUhpZ2hsaWdodGluZyJdID0gMTEyXSA9ICJ1bmljb2RlSGlnaGxpZ2h0aW5nIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJ1bnVzdWFsTGluZVRlcm1pbmF0b3JzIl0gPSAxMTNdID0gInVudXN1YWxMaW5lVGVybWluYXRvcnMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInVzZVNoYWRvd0RPTSJdID0gMTE0XSA9ICJ1c2VTaGFkb3dET00iOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInVzZVRhYlN0b3BzIl0gPSAxMTVdID0gInVzZVRhYlN0b3BzIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJ3b3JkU2VwYXJhdG9ycyJdID0gMTE2XSA9ICJ3b3JkU2VwYXJhdG9ycyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsid29yZFdyYXAiXSA9IDExN10gPSAid29yZFdyYXAiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIndvcmRXcmFwQnJlYWtBZnRlckNoYXJhY3RlcnMiXSA9IDExOF0gPSAid29yZFdyYXBCcmVha0FmdGVyQ2hhcmFjdGVycyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsid29yZFdyYXBCcmVha0JlZm9yZUNoYXJhY3RlcnMiXSA9IDExOV0gPSAid29yZFdyYXBCcmVha0JlZm9yZUNoYXJhY3RlcnMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIndvcmRXcmFwQ29sdW1uIl0gPSAxMjBdID0gIndvcmRXcmFwQ29sdW1uIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJ3b3JkV3JhcE92ZXJyaWRlMSJdID0gMTIxXSA9ICJ3b3JkV3JhcE92ZXJyaWRlMSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsid29yZFdyYXBPdmVycmlkZTIiXSA9IDEyMl0gPSAid29yZFdyYXBPdmVycmlkZTIiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bIndyYXBwaW5nSW5kZW50Il0gPSAxMjNdID0gIndyYXBwaW5nSW5kZW50IjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJ3cmFwcGluZ1N0cmF0ZWd5Il0gPSAxMjRdID0gIndyYXBwaW5nU3RyYXRlZ3kiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInNob3dEZXByZWNhdGVkIl0gPSAxMjVdID0gInNob3dEZXByZWNhdGVkIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJpbmxheUhpbnRzIl0gPSAxMjZdID0gImlubGF5SGludHMiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bImVkaXRvckNsYXNzTmFtZSJdID0gMTI3XSA9ICJlZGl0b3JDbGFzc05hbWUiOwogICAgICAgIEVkaXRvck9wdGlvbltFZGl0b3JPcHRpb25bInBpeGVsUmF0aW8iXSA9IDEyOF0gPSAicGl4ZWxSYXRpbyI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsidGFiRm9jdXNNb2RlIl0gPSAxMjldID0gInRhYkZvY3VzTW9kZSI7CiAgICAgICAgRWRpdG9yT3B0aW9uW0VkaXRvck9wdGlvblsibGF5b3V0SW5mbyJdID0gMTMwXSA9ICJsYXlvdXRJbmZvIjsKICAgICAgICBFZGl0b3JPcHRpb25bRWRpdG9yT3B0aW9uWyJ3cmFwcGluZ0luZm8iXSA9IDEzMV0gPSAid3JhcHBpbmdJbmZvIjsKICAgIH0pKEVkaXRvck9wdGlvbiB8fCAoRWRpdG9yT3B0aW9uID0ge30pKTsKICAgIC8qKgogICAgICogRW5kIG9mIGxpbmUgY2hhcmFjdGVyIHByZWZlcmVuY2UuCiAgICAgKi8KICAgIHZhciBFbmRPZkxpbmVQcmVmZXJlbmNlOwogICAgKGZ1bmN0aW9uIChFbmRPZkxpbmVQcmVmZXJlbmNlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIgaWRlbnRpZmllZCBpbiB0aGUgdGV4dCBidWZmZXIuCiAgICAgICAgICovCiAgICAgICAgRW5kT2ZMaW5lUHJlZmVyZW5jZVtFbmRPZkxpbmVQcmVmZXJlbmNlWyJUZXh0RGVmaW5lZCJdID0gMF0gPSAiVGV4dERlZmluZWQiOwogICAgICAgIC8qKgogICAgICAgICAqIFVzZSBsaW5lIGZlZWQgKFxuKSBhcyB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVyLgogICAgICAgICAqLwogICAgICAgIEVuZE9mTGluZVByZWZlcmVuY2VbRW5kT2ZMaW5lUHJlZmVyZW5jZVsiTEYiXSA9IDFdID0gIkxGIjsKICAgICAgICAvKioKICAgICAgICAgKiBVc2UgY2FycmlhZ2UgcmV0dXJuIGFuZCBsaW5lIGZlZWQgKFxyXG4pIGFzIHRoZSBlbmQgb2YgbGluZSBjaGFyYWN0ZXIuCiAgICAgICAgICovCiAgICAgICAgRW5kT2ZMaW5lUHJlZmVyZW5jZVtFbmRPZkxpbmVQcmVmZXJlbmNlWyJDUkxGIl0gPSAyXSA9ICJDUkxGIjsKICAgIH0pKEVuZE9mTGluZVByZWZlcmVuY2UgfHwgKEVuZE9mTGluZVByZWZlcmVuY2UgPSB7fSkpOwogICAgLyoqCiAgICAgKiBFbmQgb2YgbGluZSBjaGFyYWN0ZXIgcHJlZmVyZW5jZS4KICAgICAqLwogICAgdmFyIEVuZE9mTGluZVNlcXVlbmNlOwogICAgKGZ1bmN0aW9uIChFbmRPZkxpbmVTZXF1ZW5jZSkgewogICAgICAgIC8qKgogICAgICAgICAqIFVzZSBsaW5lIGZlZWQgKFxuKSBhcyB0aGUgZW5kIG9mIGxpbmUgY2hhcmFjdGVyLgogICAgICAgICAqLwogICAgICAgIEVuZE9mTGluZVNlcXVlbmNlW0VuZE9mTGluZVNlcXVlbmNlWyJMRiJdID0gMF0gPSAiTEYiOwogICAgICAgIC8qKgogICAgICAgICAqIFVzZSBjYXJyaWFnZSByZXR1cm4gYW5kIGxpbmUgZmVlZCAoXHJcbikgYXMgdGhlIGVuZCBvZiBsaW5lIGNoYXJhY3Rlci4KICAgICAgICAgKi8KICAgICAgICBFbmRPZkxpbmVTZXF1ZW5jZVtFbmRPZkxpbmVTZXF1ZW5jZVsiQ1JMRiJdID0gMV0gPSAiQ1JMRiI7CiAgICB9KShFbmRPZkxpbmVTZXF1ZW5jZSB8fCAoRW5kT2ZMaW5lU2VxdWVuY2UgPSB7fSkpOwogICAgdmFyIEV4dGVuc2lvblR5cGU7CiAgICAoZnVuY3Rpb24gKEV4dGVuc2lvblR5cGUpIHsKICAgICAgICBFeHRlbnNpb25UeXBlW0V4dGVuc2lvblR5cGVbIlN5c3RlbSJdID0gMF0gPSAiU3lzdGVtIjsKICAgICAgICBFeHRlbnNpb25UeXBlW0V4dGVuc2lvblR5cGVbIlVzZXIiXSA9IDFdID0gIlVzZXIiOwogICAgfSkoRXh0ZW5zaW9uVHlwZSB8fCAoRXh0ZW5zaW9uVHlwZSA9IHt9KSk7CiAgICAvKioKICAgICAqIERlc2NyaWJlcyB3aGF0IHRvIGRvIHdpdGggdGhlIGluZGVudGF0aW9uIHdoZW4gcHJlc3NpbmcgRW50ZXIuCiAgICAgKi8KICAgIHZhciBJbmRlbnRBY3Rpb247CiAgICAoZnVuY3Rpb24gKEluZGVudEFjdGlvbikgewogICAgICAgIC8qKgogICAgICAgICAqIEluc2VydCBuZXcgbGluZSBhbmQgY29weSB0aGUgcHJldmlvdXMgbGluZSdzIGluZGVudGF0aW9uLgogICAgICAgICAqLwogICAgICAgIEluZGVudEFjdGlvbltJbmRlbnRBY3Rpb25bIk5vbmUiXSA9IDBdID0gIk5vbmUiOwogICAgICAgIC8qKgogICAgICAgICAqIEluc2VydCBuZXcgbGluZSBhbmQgaW5kZW50IG9uY2UgKHJlbGF0aXZlIHRvIHRoZSBwcmV2aW91cyBsaW5lJ3MgaW5kZW50YXRpb24pLgogICAgICAgICAqLwogICAgICAgIEluZGVudEFjdGlvbltJbmRlbnRBY3Rpb25bIkluZGVudCJdID0gMV0gPSAiSW5kZW50IjsKICAgICAgICAvKioKICAgICAgICAgKiBJbnNlcnQgdHdvIG5ldyBsaW5lczoKICAgICAgICAgKiAgLSB0aGUgZmlyc3Qgb25lIGluZGVudGVkIHdoaWNoIHdpbGwgaG9sZCB0aGUgY3Vyc29yCiAgICAgICAgICogIC0gdGhlIHNlY29uZCBvbmUgYXQgdGhlIHNhbWUgaW5kZW50YXRpb24gbGV2ZWwKICAgICAgICAgKi8KICAgICAgICBJbmRlbnRBY3Rpb25bSW5kZW50QWN0aW9uWyJJbmRlbnRPdXRkZW50Il0gPSAyXSA9ICJJbmRlbnRPdXRkZW50IjsKICAgICAgICAvKioKICAgICAgICAgKiBJbnNlcnQgbmV3IGxpbmUgYW5kIG91dGRlbnQgb25jZSAocmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIGxpbmUncyBpbmRlbnRhdGlvbikuCiAgICAgICAgICovCiAgICAgICAgSW5kZW50QWN0aW9uW0luZGVudEFjdGlvblsiT3V0ZGVudCJdID0gM10gPSAiT3V0ZGVudCI7CiAgICB9KShJbmRlbnRBY3Rpb24gfHwgKEluZGVudEFjdGlvbiA9IHt9KSk7CiAgICB2YXIgSW5sYXlIaW50S2luZDsKICAgIChmdW5jdGlvbiAoSW5sYXlIaW50S2luZCkgewogICAgICAgIElubGF5SGludEtpbmRbSW5sYXlIaW50S2luZFsiT3RoZXIiXSA9IDBdID0gIk90aGVyIjsKICAgICAgICBJbmxheUhpbnRLaW5kW0lubGF5SGludEtpbmRbIlR5cGUiXSA9IDFdID0gIlR5cGUiOwogICAgICAgIElubGF5SGludEtpbmRbSW5sYXlIaW50S2luZFsiUGFyYW1ldGVyIl0gPSAyXSA9ICJQYXJhbWV0ZXIiOwogICAgfSkoSW5sYXlIaW50S2luZCB8fCAoSW5sYXlIaW50S2luZCA9IHt9KSk7CiAgICAvKioKICAgICAqIEhvdyBhbiB7QGxpbmsgSW5saW5lQ29tcGxldGlvbnNQcm92aWRlciBpbmxpbmUgY29tcGxldGlvbiBwcm92aWRlcn0gd2FzIHRyaWdnZXJlZC4KICAgICAqLwogICAgdmFyIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZDsKICAgIChmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkgd2hpbGUgZWRpdGluZy4KICAgICAgICAgKiBJdCBpcyBzdWZmaWNpZW50IHRvIHJldHVybiBhIHNpbmdsZSBjb21wbGV0aW9uIGl0ZW0gaW4gdGhpcyBjYXNlLgogICAgICAgICAqLwogICAgICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZFtJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmRbIkF1dG9tYXRpYyJdID0gMF0gPSAiQXV0b21hdGljIjsKICAgICAgICAvKioKICAgICAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgZXhwbGljaXRseSBieSBhIHVzZXIgZ2VzdHVyZS4KICAgICAgICAgKiBSZXR1cm4gbXVsdGlwbGUgY29tcGxldGlvbiBpdGVtcyB0byBlbmFibGUgY3ljbGluZyB0aHJvdWdoIHRoZW0uCiAgICAgICAgICovCiAgICAgICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kW0lubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZFsiRXhwbGljaXQiXSA9IDFdID0gIkV4cGxpY2l0IjsKICAgIH0pKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCB8fCAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kID0ge30pKTsKICAgIC8qKgogICAgICogVmlydHVhbCBLZXkgQ29kZXMsIHRoZSB2YWx1ZSBkb2VzIG5vdCBob2xkIGFueSBpbmhlcmVudCBtZWFuaW5nLgogICAgICogSW5zcGlyZWQgc29tZXdoYXQgZnJvbSBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9kZDM3NTczMSh2PXZzLjg1KS5hc3B4CiAgICAgKiBCdXQgdGhlc2UgYXJlICJtb3JlIGdlbmVyYWwiLCBhcyB0aGV5IHNob3VsZCB3b3JrIGFjcm9zcyBicm93c2VycyAmIE9TYHMuCiAgICAgKi8KICAgIHZhciBLZXlDb2RlOwogICAgKGZ1bmN0aW9uIChLZXlDb2RlKSB7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJEZXBlbmRzT25LYkxheW91dCJdID0gLTFdID0gIkRlcGVuZHNPbktiTGF5b3V0IjsKICAgICAgICAvKioKICAgICAgICAgKiBQbGFjZWQgZmlyc3QgdG8gY292ZXIgdGhlIDAgdmFsdWUgb2YgdGhlIGVudW0uCiAgICAgICAgICovCiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJVbmtub3duIl0gPSAwXSA9ICJVbmtub3duIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkJhY2tzcGFjZSJdID0gMV0gPSAiQmFja3NwYWNlIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIlRhYiJdID0gMl0gPSAiVGFiIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkVudGVyIl0gPSAzXSA9ICJFbnRlciI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJTaGlmdCJdID0gNF0gPSAiU2hpZnQiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiQ3RybCJdID0gNV0gPSAiQ3RybCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJBbHQiXSA9IDZdID0gIkFsdCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJQYXVzZUJyZWFrIl0gPSA3XSA9ICJQYXVzZUJyZWFrIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkNhcHNMb2NrIl0gPSA4XSA9ICJDYXBzTG9jayI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJFc2NhcGUiXSA9IDldID0gIkVzY2FwZSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJTcGFjZSJdID0gMTBdID0gIlNwYWNlIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIlBhZ2VVcCJdID0gMTFdID0gIlBhZ2VVcCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJQYWdlRG93biJdID0gMTJdID0gIlBhZ2VEb3duIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkVuZCJdID0gMTNdID0gIkVuZCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJIb21lIl0gPSAxNF0gPSAiSG9tZSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJMZWZ0QXJyb3ciXSA9IDE1XSA9ICJMZWZ0QXJyb3ciOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiVXBBcnJvdyJdID0gMTZdID0gIlVwQXJyb3ciOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiUmlnaHRBcnJvdyJdID0gMTddID0gIlJpZ2h0QXJyb3ciOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRG93bkFycm93Il0gPSAxOF0gPSAiRG93bkFycm93IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkluc2VydCJdID0gMTldID0gIkluc2VydCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJEZWxldGUiXSA9IDIwXSA9ICJEZWxldGUiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRGlnaXQwIl0gPSAyMV0gPSAiRGlnaXQwIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkRpZ2l0MSJdID0gMjJdID0gIkRpZ2l0MSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJEaWdpdDIiXSA9IDIzXSA9ICJEaWdpdDIiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRGlnaXQzIl0gPSAyNF0gPSAiRGlnaXQzIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkRpZ2l0NCJdID0gMjVdID0gIkRpZ2l0NCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJEaWdpdDUiXSA9IDI2XSA9ICJEaWdpdDUiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRGlnaXQ2Il0gPSAyN10gPSAiRGlnaXQ2IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkRpZ2l0NyJdID0gMjhdID0gIkRpZ2l0NyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJEaWdpdDgiXSA9IDI5XSA9ICJEaWdpdDgiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRGlnaXQ5Il0gPSAzMF0gPSAiRGlnaXQ5IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleUEiXSA9IDMxXSA9ICJLZXlBIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleUIiXSA9IDMyXSA9ICJLZXlCIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleUMiXSA9IDMzXSA9ICJLZXlDIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleUQiXSA9IDM0XSA9ICJLZXlEIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleUUiXSA9IDM1XSA9ICJLZXlFIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleUYiXSA9IDM2XSA9ICJLZXlGIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleUciXSA9IDM3XSA9ICJLZXlHIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleUgiXSA9IDM4XSA9ICJLZXlIIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleUkiXSA9IDM5XSA9ICJLZXlJIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleUoiXSA9IDQwXSA9ICJLZXlKIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleUsiXSA9IDQxXSA9ICJLZXlLIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleUwiXSA9IDQyXSA9ICJLZXlMIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleU0iXSA9IDQzXSA9ICJLZXlNIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleU4iXSA9IDQ0XSA9ICJLZXlOIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleU8iXSA9IDQ1XSA9ICJLZXlPIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleVAiXSA9IDQ2XSA9ICJLZXlQIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleVEiXSA9IDQ3XSA9ICJLZXlRIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleVIiXSA9IDQ4XSA9ICJLZXlSIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleVMiXSA9IDQ5XSA9ICJLZXlTIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleVQiXSA9IDUwXSA9ICJLZXlUIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleVUiXSA9IDUxXSA9ICJLZXlVIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleVYiXSA9IDUyXSA9ICJLZXlWIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleVciXSA9IDUzXSA9ICJLZXlXIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleVgiXSA9IDU0XSA9ICJLZXlYIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleVkiXSA9IDU1XSA9ICJLZXlZIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIktleVoiXSA9IDU2XSA9ICJLZXlaIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk1ldGEiXSA9IDU3XSA9ICJNZXRhIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkNvbnRleHRNZW51Il0gPSA1OF0gPSAiQ29udGV4dE1lbnUiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjEiXSA9IDU5XSA9ICJGMSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJGMiJdID0gNjBdID0gIkYyIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkYzIl0gPSA2MV0gPSAiRjMiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjQiXSA9IDYyXSA9ICJGNCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJGNSJdID0gNjNdID0gIkY1IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkY2Il0gPSA2NF0gPSAiRjYiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjciXSA9IDY1XSA9ICJGNyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJGOCJdID0gNjZdID0gIkY4IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkY5Il0gPSA2N10gPSAiRjkiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjEwIl0gPSA2OF0gPSAiRjEwIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkYxMSJdID0gNjldID0gIkYxMSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJGMTIiXSA9IDcwXSA9ICJGMTIiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjEzIl0gPSA3MV0gPSAiRjEzIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkYxNCJdID0gNzJdID0gIkYxNCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJGMTUiXSA9IDczXSA9ICJGMTUiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjE2Il0gPSA3NF0gPSAiRjE2IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkYxNyJdID0gNzVdID0gIkYxNyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJGMTgiXSA9IDc2XSA9ICJGMTgiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRjE5Il0gPSA3N10gPSAiRjE5IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bUxvY2siXSA9IDc4XSA9ICJOdW1Mb2NrIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIlNjcm9sbExvY2siXSA9IDc5XSA9ICJTY3JvbGxMb2NrIjsKICAgICAgICAvKioKICAgICAgICAgKiBVc2VkIGZvciBtaXNjZWxsYW5lb3VzIGNoYXJhY3RlcnM7IGl0IGNhbiB2YXJ5IGJ5IGtleWJvYXJkLgogICAgICAgICAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnOzonIGtleQogICAgICAgICAqLwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiU2VtaWNvbG9uIl0gPSA4MF0gPSAiU2VtaWNvbG9uIjsKICAgICAgICAvKioKICAgICAgICAgKiBGb3IgYW55IGNvdW50cnkvcmVnaW9uLCB0aGUgJysnIGtleQogICAgICAgICAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnPSsnIGtleQogICAgICAgICAqLwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiRXF1YWwiXSA9IDgxXSA9ICJFcXVhbCI7CiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGFueSBjb3VudHJ5L3JlZ2lvbiwgdGhlICcsJyBrZXkKICAgICAgICAgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJyw8JyBrZXkKICAgICAgICAgKi8KICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkNvbW1hIl0gPSA4Ml0gPSAiQ29tbWEiOwogICAgICAgIC8qKgogICAgICAgICAqIEZvciBhbnkgY291bnRyeS9yZWdpb24sIHRoZSAnLScga2V5CiAgICAgICAgICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICctXycga2V5CiAgICAgICAgICovCiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJNaW51cyJdID0gODNdID0gIk1pbnVzIjsKICAgICAgICAvKioKICAgICAgICAgKiBGb3IgYW55IGNvdW50cnkvcmVnaW9uLCB0aGUgJy4nIGtleQogICAgICAgICAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnLj4nIGtleQogICAgICAgICAqLwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiUGVyaW9kIl0gPSA4NF0gPSAiUGVyaW9kIjsKICAgICAgICAvKioKICAgICAgICAgKiBVc2VkIGZvciBtaXNjZWxsYW5lb3VzIGNoYXJhY3RlcnM7IGl0IGNhbiB2YXJ5IGJ5IGtleWJvYXJkLgogICAgICAgICAqIEZvciB0aGUgVVMgc3RhbmRhcmQga2V5Ym9hcmQsIHRoZSAnLz8nIGtleQogICAgICAgICAqLwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiU2xhc2giXSA9IDg1XSA9ICJTbGFzaCI7CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlZCBmb3IgbWlzY2VsbGFuZW91cyBjaGFyYWN0ZXJzOyBpdCBjYW4gdmFyeSBieSBrZXlib2FyZC4KICAgICAgICAgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJ2B+JyBrZXkKICAgICAgICAgKi8KICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkJhY2txdW90ZSJdID0gODZdID0gIkJhY2txdW90ZSI7CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlZCBmb3IgbWlzY2VsbGFuZW91cyBjaGFyYWN0ZXJzOyBpdCBjYW4gdmFyeSBieSBrZXlib2FyZC4KICAgICAgICAgKiBGb3IgdGhlIFVTIHN0YW5kYXJkIGtleWJvYXJkLCB0aGUgJ1t7JyBrZXkKICAgICAgICAgKi8KICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkJyYWNrZXRMZWZ0Il0gPSA4N10gPSAiQnJhY2tldExlZnQiOwogICAgICAgIC8qKgogICAgICAgICAqIFVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgY2hhcmFjdGVyczsgaXQgY2FuIHZhcnkgYnkga2V5Ym9hcmQuCiAgICAgICAgICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICdcfCcga2V5CiAgICAgICAgICovCiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJCYWNrc2xhc2giXSA9IDg4XSA9ICJCYWNrc2xhc2giOwogICAgICAgIC8qKgogICAgICAgICAqIFVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgY2hhcmFjdGVyczsgaXQgY2FuIHZhcnkgYnkga2V5Ym9hcmQuCiAgICAgICAgICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICddfScga2V5CiAgICAgICAgICovCiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJCcmFja2V0UmlnaHQiXSA9IDg5XSA9ICJCcmFja2V0UmlnaHQiOwogICAgICAgIC8qKgogICAgICAgICAqIFVzZWQgZm9yIG1pc2NlbGxhbmVvdXMgY2hhcmFjdGVyczsgaXQgY2FuIHZhcnkgYnkga2V5Ym9hcmQuCiAgICAgICAgICogRm9yIHRoZSBVUyBzdGFuZGFyZCBrZXlib2FyZCwgdGhlICcnIicga2V5CiAgICAgICAgICovCiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJRdW90ZSJdID0gOTBdID0gIlF1b3RlIjsKICAgICAgICAvKioKICAgICAgICAgKiBVc2VkIGZvciBtaXNjZWxsYW5lb3VzIGNoYXJhY3RlcnM7IGl0IGNhbiB2YXJ5IGJ5IGtleWJvYXJkLgogICAgICAgICAqLwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiT0VNXzgiXSA9IDkxXSA9ICJPRU1fOCI7CiAgICAgICAgLyoqCiAgICAgICAgICogRWl0aGVyIHRoZSBhbmdsZSBicmFja2V0IGtleSBvciB0aGUgYmFja3NsYXNoIGtleSBvbiB0aGUgUlQgMTAyLWtleSBrZXlib2FyZC4KICAgICAgICAgKi8KICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkludGxCYWNrc2xhc2giXSA9IDkyXSA9ICJJbnRsQmFja3NsYXNoIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZDAiXSA9IDkzXSA9ICJOdW1wYWQwIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZDEiXSA9IDk0XSA9ICJOdW1wYWQxIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZDIiXSA9IDk1XSA9ICJOdW1wYWQyIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZDMiXSA9IDk2XSA9ICJOdW1wYWQzIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZDQiXSA9IDk3XSA9ICJOdW1wYWQ0IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZDUiXSA9IDk4XSA9ICJOdW1wYWQ1IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZDYiXSA9IDk5XSA9ICJOdW1wYWQ2IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZDciXSA9IDEwMF0gPSAiTnVtcGFkNyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWQ4Il0gPSAxMDFdID0gIk51bXBhZDgiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiTnVtcGFkOSJdID0gMTAyXSA9ICJOdW1wYWQ5IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZE11bHRpcGx5Il0gPSAxMDNdID0gIk51bXBhZE11bHRpcGx5IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZEFkZCJdID0gMTA0XSA9ICJOdW1wYWRBZGQiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiTlVNUEFEX1NFUEFSQVRPUiJdID0gMTA1XSA9ICJOVU1QQURfU0VQQVJBVE9SIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZFN1YnRyYWN0Il0gPSAxMDZdID0gIk51bXBhZFN1YnRyYWN0IjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk51bXBhZERlY2ltYWwiXSA9IDEwN10gPSAiTnVtcGFkRGVjaW1hbCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJOdW1wYWREaXZpZGUiXSA9IDEwOF0gPSAiTnVtcGFkRGl2aWRlIjsKICAgICAgICAvKioKICAgICAgICAgKiBDb3ZlciBhbGwga2V5IGNvZGVzIHdoZW4gSU1FIGlzIHByb2Nlc3NpbmcgaW5wdXQuCiAgICAgICAgICovCiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJLRVlfSU5fQ09NUE9TSVRJT04iXSA9IDEwOV0gPSAiS0VZX0lOX0NPTVBPU0lUSU9OIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkFCTlRfQzEiXSA9IDExMF0gPSAiQUJOVF9DMSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJBQk5UX0MyIl0gPSAxMTFdID0gIkFCTlRfQzIiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiQXVkaW9Wb2x1bWVNdXRlIl0gPSAxMTJdID0gIkF1ZGlvVm9sdW1lTXV0ZSI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJBdWRpb1ZvbHVtZVVwIl0gPSAxMTNdID0gIkF1ZGlvVm9sdW1lVXAiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiQXVkaW9Wb2x1bWVEb3duIl0gPSAxMTRdID0gIkF1ZGlvVm9sdW1lRG93biI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJCcm93c2VyU2VhcmNoIl0gPSAxMTVdID0gIkJyb3dzZXJTZWFyY2giOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiQnJvd3NlckhvbWUiXSA9IDExNl0gPSAiQnJvd3NlckhvbWUiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiQnJvd3NlckJhY2siXSA9IDExN10gPSAiQnJvd3NlckJhY2siOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiQnJvd3NlckZvcndhcmQiXSA9IDExOF0gPSAiQnJvd3NlckZvcndhcmQiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiTWVkaWFUcmFja05leHQiXSA9IDExOV0gPSAiTWVkaWFUcmFja05leHQiOwogICAgICAgIEtleUNvZGVbS2V5Q29kZVsiTWVkaWFUcmFja1ByZXZpb3VzIl0gPSAxMjBdID0gIk1lZGlhVHJhY2tQcmV2aW91cyI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJNZWRpYVN0b3AiXSA9IDEyMV0gPSAiTWVkaWFTdG9wIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk1lZGlhUGxheVBhdXNlIl0gPSAxMjJdID0gIk1lZGlhUGxheVBhdXNlIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkxhdW5jaE1lZGlhUGxheWVyIl0gPSAxMjNdID0gIkxhdW5jaE1lZGlhUGxheWVyIjsKICAgICAgICBLZXlDb2RlW0tleUNvZGVbIkxhdW5jaE1haWwiXSA9IDEyNF0gPSAiTGF1bmNoTWFpbCI7CiAgICAgICAgS2V5Q29kZVtLZXlDb2RlWyJMYXVuY2hBcHAyIl0gPSAxMjVdID0gIkxhdW5jaEFwcDIiOwogICAgICAgIC8qKgogICAgICAgICAqIFBsYWNlZCBsYXN0IHRvIGNvdmVyIHRoZSBsZW5ndGggb2YgdGhlIGVudW0uCiAgICAgICAgICogUGxlYXNlIGRvIG5vdCBkZXBlbmQgb24gdGhpcyB2YWx1ZSEKICAgICAgICAgKi8KICAgICAgICBLZXlDb2RlW0tleUNvZGVbIk1BWF9WQUxVRSJdID0gMTI2XSA9ICJNQVhfVkFMVUUiOwogICAgfSkoS2V5Q29kZSB8fCAoS2V5Q29kZSA9IHt9KSk7CiAgICB2YXIgS2V5YmluZGluZ1NvdXJjZTsKICAgIChmdW5jdGlvbiAoS2V5YmluZGluZ1NvdXJjZSkgewogICAgICAgIEtleWJpbmRpbmdTb3VyY2VbS2V5YmluZGluZ1NvdXJjZVsiRGVmYXVsdCJdID0gMV0gPSAiRGVmYXVsdCI7CiAgICAgICAgS2V5YmluZGluZ1NvdXJjZVtLZXliaW5kaW5nU291cmNlWyJVc2VyIl0gPSAyXSA9ICJVc2VyIjsKICAgIH0pKEtleWJpbmRpbmdTb3VyY2UgfHwgKEtleWJpbmRpbmdTb3VyY2UgPSB7fSkpOwogICAgdmFyIEtleWJpbmRpbmdXZWlnaHQ7CiAgICAoZnVuY3Rpb24gKEtleWJpbmRpbmdXZWlnaHQpIHsKICAgICAgICBLZXliaW5kaW5nV2VpZ2h0W0tleWJpbmRpbmdXZWlnaHRbIkVkaXRvckNvcmUiXSA9IDBdID0gIkVkaXRvckNvcmUiOwogICAgICAgIEtleWJpbmRpbmdXZWlnaHRbS2V5YmluZGluZ1dlaWdodFsiRWRpdG9yQ29udHJpYiJdID0gMTAwXSA9ICJFZGl0b3JDb250cmliIjsKICAgICAgICBLZXliaW5kaW5nV2VpZ2h0W0tleWJpbmRpbmdXZWlnaHRbIldvcmtiZW5jaENvbnRyaWIiXSA9IDIwMF0gPSAiV29ya2JlbmNoQ29udHJpYiI7CiAgICAgICAgS2V5YmluZGluZ1dlaWdodFtLZXliaW5kaW5nV2VpZ2h0WyJCdWlsdGluRXh0ZW5zaW9uIl0gPSAzMDBdID0gIkJ1aWx0aW5FeHRlbnNpb24iOwogICAgICAgIEtleWJpbmRpbmdXZWlnaHRbS2V5YmluZGluZ1dlaWdodFsiRXh0ZXJuYWxFeHRlbnNpb24iXSA9IDQwMF0gPSAiRXh0ZXJuYWxFeHRlbnNpb24iOwogICAgfSkoS2V5YmluZGluZ1dlaWdodCB8fCAoS2V5YmluZGluZ1dlaWdodCA9IHt9KSk7CiAgICAvKioKICAgICAqIE9wZW4gZW5kZWQgZW51bSBhdCBydW50aW1lCiAgICAgKi8KICAgIHZhciBMYW5ndWFnZUlkOwogICAgKGZ1bmN0aW9uIChMYW5ndWFnZUlkKSB7CiAgICAgICAgTGFuZ3VhZ2VJZFtMYW5ndWFnZUlkWyJOdWxsIl0gPSAwXSA9ICJOdWxsIjsKICAgICAgICBMYW5ndWFnZUlkW0xhbmd1YWdlSWRbIlBsYWluVGV4dCJdID0gMV0gPSAiUGxhaW5UZXh0IjsKICAgIH0pKExhbmd1YWdlSWQgfHwgKExhbmd1YWdlSWQgPSB7fSkpOwogICAgdmFyIExvZ0xldmVsJDE7CiAgICAoZnVuY3Rpb24gKExvZ0xldmVsKSB7CiAgICAgICAgTG9nTGV2ZWxbTG9nTGV2ZWxbIlRyYWNlIl0gPSAwXSA9ICJUcmFjZSI7CiAgICAgICAgTG9nTGV2ZWxbTG9nTGV2ZWxbIkRlYnVnIl0gPSAxXSA9ICJEZWJ1ZyI7CiAgICAgICAgTG9nTGV2ZWxbTG9nTGV2ZWxbIkluZm8iXSA9IDJdID0gIkluZm8iOwogICAgICAgIExvZ0xldmVsW0xvZ0xldmVsWyJXYXJuaW5nIl0gPSAzXSA9ICJXYXJuaW5nIjsKICAgICAgICBMb2dMZXZlbFtMb2dMZXZlbFsiRXJyb3IiXSA9IDRdID0gIkVycm9yIjsKICAgICAgICBMb2dMZXZlbFtMb2dMZXZlbFsiQ3JpdGljYWwiXSA9IDVdID0gIkNyaXRpY2FsIjsKICAgICAgICBMb2dMZXZlbFtMb2dMZXZlbFsiT2ZmIl0gPSA2XSA9ICJPZmYiOwogICAgfSkoTG9nTGV2ZWwkMSB8fCAoTG9nTGV2ZWwkMSA9IHt9KSk7CiAgICB2YXIgTWFya2Rvd25TdHJpbmdUZXh0TmV3bGluZVN0eWxlOwogICAgKGZ1bmN0aW9uIChNYXJrZG93blN0cmluZ1RleHROZXdsaW5lU3R5bGUpIHsKICAgICAgICBNYXJrZG93blN0cmluZ1RleHROZXdsaW5lU3R5bGVbTWFya2Rvd25TdHJpbmdUZXh0TmV3bGluZVN0eWxlWyJQYXJhZ3JhcGgiXSA9IDBdID0gIlBhcmFncmFwaCI7CiAgICAgICAgTWFya2Rvd25TdHJpbmdUZXh0TmV3bGluZVN0eWxlW01hcmtkb3duU3RyaW5nVGV4dE5ld2xpbmVTdHlsZVsiQnJlYWsiXSA9IDFdID0gIkJyZWFrIjsKICAgIH0pKE1hcmtkb3duU3RyaW5nVGV4dE5ld2xpbmVTdHlsZSB8fCAoTWFya2Rvd25TdHJpbmdUZXh0TmV3bGluZVN0eWxlID0ge30pKTsKICAgIHZhciBNYXJrZXJTZXZlcml0eTsKICAgIChmdW5jdGlvbiAoTWFya2VyU2V2ZXJpdHkpIHsKICAgICAgICBNYXJrZXJTZXZlcml0eVtNYXJrZXJTZXZlcml0eVsiSGludCJdID0gMV0gPSAiSGludCI7CiAgICAgICAgTWFya2VyU2V2ZXJpdHlbTWFya2VyU2V2ZXJpdHlbIkluZm8iXSA9IDJdID0gIkluZm8iOwogICAgICAgIE1hcmtlclNldmVyaXR5W01hcmtlclNldmVyaXR5WyJXYXJuaW5nIl0gPSA0XSA9ICJXYXJuaW5nIjsKICAgICAgICBNYXJrZXJTZXZlcml0eVtNYXJrZXJTZXZlcml0eVsiRXJyb3IiXSA9IDhdID0gIkVycm9yIjsKICAgIH0pKE1hcmtlclNldmVyaXR5IHx8IChNYXJrZXJTZXZlcml0eSA9IHt9KSk7CiAgICB2YXIgTWFya2VyVGFnOwogICAgKGZ1bmN0aW9uIChNYXJrZXJUYWcpIHsKICAgICAgICBNYXJrZXJUYWdbTWFya2VyVGFnWyJVbm5lY2Vzc2FyeSJdID0gMV0gPSAiVW5uZWNlc3NhcnkiOwogICAgICAgIE1hcmtlclRhZ1tNYXJrZXJUYWdbIkRlcHJlY2F0ZWQiXSA9IDJdID0gIkRlcHJlY2F0ZWQiOwogICAgfSkoTWFya2VyVGFnIHx8IChNYXJrZXJUYWcgPSB7fSkpOwogICAgLyoqCiAgICAgKiBQb3NpdGlvbiBpbiB0aGUgbWluaW1hcCB0byByZW5kZXIgdGhlIGRlY29yYXRpb24uCiAgICAgKi8KICAgIHZhciBNaW5pbWFwUG9zaXRpb24kMTsKICAgIChmdW5jdGlvbiAoTWluaW1hcFBvc2l0aW9uKSB7CiAgICAgICAgTWluaW1hcFBvc2l0aW9uW01pbmltYXBQb3NpdGlvblsiSW5saW5lIl0gPSAxXSA9ICJJbmxpbmUiOwogICAgICAgIE1pbmltYXBQb3NpdGlvbltNaW5pbWFwUG9zaXRpb25bIkd1dHRlciJdID0gMl0gPSAiR3V0dGVyIjsKICAgIH0pKE1pbmltYXBQb3NpdGlvbiQxIHx8IChNaW5pbWFwUG9zaXRpb24kMSA9IHt9KSk7CiAgICAvKioKICAgICAqIFR5cGUgb2YgaGl0IGVsZW1lbnQgd2l0aCB0aGUgbW91c2UgaW4gdGhlIGVkaXRvci4KICAgICAqLwogICAgdmFyIE1vdXNlVGFyZ2V0VHlwZTsKICAgIChmdW5jdGlvbiAoTW91c2VUYXJnZXRUeXBlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogTW91c2UgaXMgb24gdG9wIG9mIGFuIHVua25vd24gZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlWyJVTktOT1dOIl0gPSAwXSA9ICJVTktOT1dOIjsKICAgICAgICAvKioKICAgICAgICAgKiBNb3VzZSBpcyBvbiB0b3Agb2YgdGhlIHRleHRhcmVhIHVzZWQgZm9yIGlucHV0LgogICAgICAgICAqLwogICAgICAgIE1vdXNlVGFyZ2V0VHlwZVtNb3VzZVRhcmdldFR5cGVbIlRFWFRBUkVBIl0gPSAxXSA9ICJURVhUQVJFQSI7CiAgICAgICAgLyoqCiAgICAgICAgICogTW91c2UgaXMgb24gdG9wIG9mIHRoZSBnbHlwaCBtYXJnaW4KICAgICAgICAgKi8KICAgICAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlWyJHVVRURVJfR0xZUEhfTUFSR0lOIl0gPSAyXSA9ICJHVVRURVJfR0xZUEhfTUFSR0lOIjsKICAgICAgICAvKioKICAgICAgICAgKiBNb3VzZSBpcyBvbiB0b3Agb2YgdGhlIGxpbmUgbnVtYmVycwogICAgICAgICAqLwogICAgICAgIE1vdXNlVGFyZ2V0VHlwZVtNb3VzZVRhcmdldFR5cGVbIkdVVFRFUl9MSU5FX05VTUJFUlMiXSA9IDNdID0gIkdVVFRFUl9MSU5FX05VTUJFUlMiOwogICAgICAgIC8qKgogICAgICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiB0aGUgbGluZSBkZWNvcmF0aW9ucwogICAgICAgICAqLwogICAgICAgIE1vdXNlVGFyZ2V0VHlwZVtNb3VzZVRhcmdldFR5cGVbIkdVVFRFUl9MSU5FX0RFQ09SQVRJT05TIl0gPSA0XSA9ICJHVVRURVJfTElORV9ERUNPUkFUSU9OUyI7CiAgICAgICAgLyoqCiAgICAgICAgICogTW91c2UgaXMgb24gdG9wIG9mIHRoZSB3aGl0ZXNwYWNlIGxlZnQgaW4gdGhlIGd1dHRlciBieSBhIHZpZXcgem9uZS4KICAgICAgICAgKi8KICAgICAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlWyJHVVRURVJfVklFV19aT05FIl0gPSA1XSA9ICJHVVRURVJfVklFV19aT05FIjsKICAgICAgICAvKioKICAgICAgICAgKiBNb3VzZSBpcyBvbiB0b3Agb2YgdGV4dCBpbiB0aGUgY29udGVudC4KICAgICAgICAgKi8KICAgICAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlWyJDT05URU5UX1RFWFQiXSA9IDZdID0gIkNPTlRFTlRfVEVYVCI7CiAgICAgICAgLyoqCiAgICAgICAgICogTW91c2UgaXMgb24gdG9wIG9mIGVtcHR5IHNwYWNlIGluIHRoZSBjb250ZW50IChlLmcuIGFmdGVyIGxpbmUgdGV4dCBvciBiZWxvdyBsYXN0IGxpbmUpCiAgICAgICAgICovCiAgICAgICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVsiQ09OVEVOVF9FTVBUWSJdID0gN10gPSAiQ09OVEVOVF9FTVBUWSI7CiAgICAgICAgLyoqCiAgICAgICAgICogTW91c2UgaXMgb24gdG9wIG9mIGEgdmlldyB6b25lIGluIHRoZSBjb250ZW50LgogICAgICAgICAqLwogICAgICAgIE1vdXNlVGFyZ2V0VHlwZVtNb3VzZVRhcmdldFR5cGVbIkNPTlRFTlRfVklFV19aT05FIl0gPSA4XSA9ICJDT05URU5UX1ZJRVdfWk9ORSI7CiAgICAgICAgLyoqCiAgICAgICAgICogTW91c2UgaXMgb24gdG9wIG9mIGEgY29udGVudCB3aWRnZXQuCiAgICAgICAgICovCiAgICAgICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVsiQ09OVEVOVF9XSURHRVQiXSA9IDldID0gIkNPTlRFTlRfV0lER0VUIjsKICAgICAgICAvKioKICAgICAgICAgKiBNb3VzZSBpcyBvbiB0b3Agb2YgdGhlIGRlY29yYXRpb25zIG92ZXJ2aWV3IHJ1bGVyLgogICAgICAgICAqLwogICAgICAgIE1vdXNlVGFyZ2V0VHlwZVtNb3VzZVRhcmdldFR5cGVbIk9WRVJWSUVXX1JVTEVSIl0gPSAxMF0gPSAiT1ZFUlZJRVdfUlVMRVIiOwogICAgICAgIC8qKgogICAgICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiBhIHNjcm9sbGJhci4KICAgICAgICAgKi8KICAgICAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlWyJTQ1JPTExCQVIiXSA9IDExXSA9ICJTQ1JPTExCQVIiOwogICAgICAgIC8qKgogICAgICAgICAqIE1vdXNlIGlzIG9uIHRvcCBvZiBhbiBvdmVybGF5IHdpZGdldC4KICAgICAgICAgKi8KICAgICAgICBNb3VzZVRhcmdldFR5cGVbTW91c2VUYXJnZXRUeXBlWyJPVkVSTEFZX1dJREdFVCJdID0gMTJdID0gIk9WRVJMQVlfV0lER0VUIjsKICAgICAgICAvKioKICAgICAgICAgKiBNb3VzZSBpcyBvdXRzaWRlIG9mIHRoZSBlZGl0b3IuCiAgICAgICAgICovCiAgICAgICAgTW91c2VUYXJnZXRUeXBlW01vdXNlVGFyZ2V0VHlwZVsiT1VUU0lERV9FRElUT1IiXSA9IDEzXSA9ICJPVVRTSURFX0VESVRPUiI7CiAgICB9KShNb3VzZVRhcmdldFR5cGUgfHwgKE1vdXNlVGFyZ2V0VHlwZSA9IHt9KSk7CiAgICB2YXIgT3BlcmF0aW5nU3lzdGVtOwogICAgKGZ1bmN0aW9uIChPcGVyYXRpbmdTeXN0ZW0pIHsKICAgICAgICBPcGVyYXRpbmdTeXN0ZW1bT3BlcmF0aW5nU3lzdGVtWyJXaW5kb3dzIl0gPSAxXSA9ICJXaW5kb3dzIjsKICAgICAgICBPcGVyYXRpbmdTeXN0ZW1bT3BlcmF0aW5nU3lzdGVtWyJNYWNpbnRvc2giXSA9IDJdID0gIk1hY2ludG9zaCI7CiAgICAgICAgT3BlcmF0aW5nU3lzdGVtW09wZXJhdGluZ1N5c3RlbVsiTGludXgiXSA9IDNdID0gIkxpbnV4IjsKICAgIH0pKE9wZXJhdGluZ1N5c3RlbSB8fCAoT3BlcmF0aW5nU3lzdGVtID0ge30pKTsKICAgIC8qKgogICAgICogQSBwb3NpdGlvbmluZyBwcmVmZXJlbmNlIGZvciByZW5kZXJpbmcgb3ZlcmxheSB3aWRnZXRzLgogICAgICovCiAgICB2YXIgT3ZlcmxheVdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZTsKICAgIChmdW5jdGlvbiAoT3ZlcmxheVdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZSkgewogICAgICAgIC8qKgogICAgICAgICAqIFBvc2l0aW9uIHRoZSBvdmVybGF5IHdpZGdldCBpbiB0aGUgdG9wIHJpZ2h0IGNvcm5lcgogICAgICAgICAqLwogICAgICAgIE92ZXJsYXlXaWRnZXRQb3NpdGlvblByZWZlcmVuY2VbT3ZlcmxheVdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVsiVE9QX1JJR0hUX0NPUk5FUiJdID0gMF0gPSAiVE9QX1JJR0hUX0NPUk5FUiI7CiAgICAgICAgLyoqCiAgICAgICAgICogUG9zaXRpb24gdGhlIG92ZXJsYXkgd2lkZ2V0IGluIHRoZSBib3R0b20gcmlnaHQgY29ybmVyCiAgICAgICAgICovCiAgICAgICAgT3ZlcmxheVdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZVtPdmVybGF5V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlWyJCT1RUT01fUklHSFRfQ09STkVSIl0gPSAxXSA9ICJCT1RUT01fUklHSFRfQ09STkVSIjsKICAgICAgICAvKioKICAgICAgICAgKiBQb3NpdGlvbiB0aGUgb3ZlcmxheSB3aWRnZXQgaW4gdGhlIHRvcCBjZW50ZXIKICAgICAgICAgKi8KICAgICAgICBPdmVybGF5V2lkZ2V0UG9zaXRpb25QcmVmZXJlbmNlW092ZXJsYXlXaWRnZXRQb3NpdGlvblByZWZlcmVuY2VbIlRPUF9DRU5URVIiXSA9IDJdID0gIlRPUF9DRU5URVIiOwogICAgfSkoT3ZlcmxheVdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZSB8fCAoT3ZlcmxheVdpZGdldFBvc2l0aW9uUHJlZmVyZW5jZSA9IHt9KSk7CiAgICAvKioKICAgICAqIFZlcnRpY2FsIExhbmUgaW4gdGhlIG92ZXJ2aWV3IHJ1bGVyIG9mIHRoZSBlZGl0b3IuCiAgICAgKi8KICAgIHZhciBPdmVydmlld1J1bGVyTGFuZSQxOwogICAgKGZ1bmN0aW9uIChPdmVydmlld1J1bGVyTGFuZSkgewogICAgICAgIE92ZXJ2aWV3UnVsZXJMYW5lW092ZXJ2aWV3UnVsZXJMYW5lWyJMZWZ0Il0gPSAxXSA9ICJMZWZ0IjsKICAgICAgICBPdmVydmlld1J1bGVyTGFuZVtPdmVydmlld1J1bGVyTGFuZVsiQ2VudGVyIl0gPSAyXSA9ICJDZW50ZXIiOwogICAgICAgIE92ZXJ2aWV3UnVsZXJMYW5lW092ZXJ2aWV3UnVsZXJMYW5lWyJSaWdodCJdID0gNF0gPSAiUmlnaHQiOwogICAgICAgIE92ZXJ2aWV3UnVsZXJMYW5lW092ZXJ2aWV3UnVsZXJMYW5lWyJGdWxsIl0gPSA3XSA9ICJGdWxsIjsKICAgIH0pKE92ZXJ2aWV3UnVsZXJMYW5lJDEgfHwgKE92ZXJ2aWV3UnVsZXJMYW5lJDEgPSB7fSkpOwogICAgdmFyIFByb2dyZXNzTG9jYXRpb247CiAgICAoZnVuY3Rpb24gKFByb2dyZXNzTG9jYXRpb24pIHsKICAgICAgICBQcm9ncmVzc0xvY2F0aW9uW1Byb2dyZXNzTG9jYXRpb25bIkV4cGxvcmVyIl0gPSAxXSA9ICJFeHBsb3JlciI7CiAgICAgICAgUHJvZ3Jlc3NMb2NhdGlvbltQcm9ncmVzc0xvY2F0aW9uWyJTY20iXSA9IDNdID0gIlNjbSI7CiAgICAgICAgUHJvZ3Jlc3NMb2NhdGlvbltQcm9ncmVzc0xvY2F0aW9uWyJFeHRlbnNpb25zIl0gPSA1XSA9ICJFeHRlbnNpb25zIjsKICAgICAgICBQcm9ncmVzc0xvY2F0aW9uW1Byb2dyZXNzTG9jYXRpb25bIldpbmRvdyJdID0gMTBdID0gIldpbmRvdyI7CiAgICAgICAgUHJvZ3Jlc3NMb2NhdGlvbltQcm9ncmVzc0xvY2F0aW9uWyJOb3RpZmljYXRpb24iXSA9IDE1XSA9ICJOb3RpZmljYXRpb24iOwogICAgICAgIFByb2dyZXNzTG9jYXRpb25bUHJvZ3Jlc3NMb2NhdGlvblsiRGlhbG9nIl0gPSAyMF0gPSAiRGlhbG9nIjsKICAgIH0pKFByb2dyZXNzTG9jYXRpb24gfHwgKFByb2dyZXNzTG9jYXRpb24gPSB7fSkpOwogICAgdmFyIFJlbmRlckxpbmVOdW1iZXJzVHlwZTsKICAgIChmdW5jdGlvbiAoUmVuZGVyTGluZU51bWJlcnNUeXBlKSB7CiAgICAgICAgUmVuZGVyTGluZU51bWJlcnNUeXBlW1JlbmRlckxpbmVOdW1iZXJzVHlwZVsiT2ZmIl0gPSAwXSA9ICJPZmYiOwogICAgICAgIFJlbmRlckxpbmVOdW1iZXJzVHlwZVtSZW5kZXJMaW5lTnVtYmVyc1R5cGVbIk9uIl0gPSAxXSA9ICJPbiI7CiAgICAgICAgUmVuZGVyTGluZU51bWJlcnNUeXBlW1JlbmRlckxpbmVOdW1iZXJzVHlwZVsiUmVsYXRpdmUiXSA9IDJdID0gIlJlbGF0aXZlIjsKICAgICAgICBSZW5kZXJMaW5lTnVtYmVyc1R5cGVbUmVuZGVyTGluZU51bWJlcnNUeXBlWyJJbnRlcnZhbCJdID0gM10gPSAiSW50ZXJ2YWwiOwogICAgICAgIFJlbmRlckxpbmVOdW1iZXJzVHlwZVtSZW5kZXJMaW5lTnVtYmVyc1R5cGVbIkN1c3RvbSJdID0gNF0gPSAiQ3VzdG9tIjsKICAgIH0pKFJlbmRlckxpbmVOdW1iZXJzVHlwZSB8fCAoUmVuZGVyTGluZU51bWJlcnNUeXBlID0ge30pKTsKICAgIHZhciBSZW5kZXJNaW5pbWFwOwogICAgKGZ1bmN0aW9uIChSZW5kZXJNaW5pbWFwKSB7CiAgICAgICAgUmVuZGVyTWluaW1hcFtSZW5kZXJNaW5pbWFwWyJOb25lIl0gPSAwXSA9ICJOb25lIjsKICAgICAgICBSZW5kZXJNaW5pbWFwW1JlbmRlck1pbmltYXBbIlRleHQiXSA9IDFdID0gIlRleHQiOwogICAgICAgIFJlbmRlck1pbmltYXBbUmVuZGVyTWluaW1hcFsiQmxvY2tzIl0gPSAyXSA9ICJCbG9ja3MiOwogICAgfSkoUmVuZGVyTWluaW1hcCB8fCAoUmVuZGVyTWluaW1hcCA9IHt9KSk7CiAgICAvKioKICAgICAqIGtleWJvYXJkRXZlbnQuY29kZQogICAgICovCiAgICB2YXIgU2NhbkNvZGU7CiAgICAoZnVuY3Rpb24gKFNjYW5Db2RlKSB7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkRlcGVuZHNPbktiTGF5b3V0Il0gPSAtMV0gPSAiRGVwZW5kc09uS2JMYXlvdXQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOb25lIl0gPSAwXSA9ICJOb25lIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiSHlwZXIiXSA9IDFdID0gIkh5cGVyIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiU3VwZXIiXSA9IDJdID0gIlN1cGVyIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRm4iXSA9IDNdID0gIkZuIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRm5Mb2NrIl0gPSA0XSA9ICJGbkxvY2siOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJTdXNwZW5kIl0gPSA1XSA9ICJTdXNwZW5kIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiUmVzdW1lIl0gPSA2XSA9ICJSZXN1bWUiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJUdXJibyJdID0gN10gPSAiVHVyYm8iOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJTbGVlcCJdID0gOF0gPSAiU2xlZXAiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJXYWtlVXAiXSA9IDldID0gIldha2VVcCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleUEiXSA9IDEwXSA9ICJLZXlBIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5QiJdID0gMTFdID0gIktleUIiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlDIl0gPSAxMl0gPSAiS2V5QyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleUQiXSA9IDEzXSA9ICJLZXlEIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5RSJdID0gMTRdID0gIktleUUiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlGIl0gPSAxNV0gPSAiS2V5RiI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleUciXSA9IDE2XSA9ICJLZXlHIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5SCJdID0gMTddID0gIktleUgiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlJIl0gPSAxOF0gPSAiS2V5SSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleUoiXSA9IDE5XSA9ICJLZXlKIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5SyJdID0gMjBdID0gIktleUsiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlMIl0gPSAyMV0gPSAiS2V5TCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleU0iXSA9IDIyXSA9ICJLZXlNIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5TiJdID0gMjNdID0gIktleU4iOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlPIl0gPSAyNF0gPSAiS2V5TyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleVAiXSA9IDI1XSA9ICJLZXlQIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5USJdID0gMjZdID0gIktleVEiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlSIl0gPSAyN10gPSAiS2V5UiI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleVMiXSA9IDI4XSA9ICJLZXlTIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5VCJdID0gMjldID0gIktleVQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlVIl0gPSAzMF0gPSAiS2V5VSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleVYiXSA9IDMxXSA9ICJLZXlWIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5VyJdID0gMzJdID0gIktleVciOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJLZXlYIl0gPSAzM10gPSAiS2V5WCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIktleVkiXSA9IDM0XSA9ICJLZXlZIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiS2V5WiJdID0gMzVdID0gIktleVoiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJEaWdpdDEiXSA9IDM2XSA9ICJEaWdpdDEiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJEaWdpdDIiXSA9IDM3XSA9ICJEaWdpdDIiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJEaWdpdDMiXSA9IDM4XSA9ICJEaWdpdDMiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJEaWdpdDQiXSA9IDM5XSA9ICJEaWdpdDQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJEaWdpdDUiXSA9IDQwXSA9ICJEaWdpdDUiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJEaWdpdDYiXSA9IDQxXSA9ICJEaWdpdDYiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJEaWdpdDciXSA9IDQyXSA9ICJEaWdpdDciOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJEaWdpdDgiXSA9IDQzXSA9ICJEaWdpdDgiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJEaWdpdDkiXSA9IDQ0XSA9ICJEaWdpdDkiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJEaWdpdDAiXSA9IDQ1XSA9ICJEaWdpdDAiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJFbnRlciJdID0gNDZdID0gIkVudGVyIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRXNjYXBlIl0gPSA0N10gPSAiRXNjYXBlIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQmFja3NwYWNlIl0gPSA0OF0gPSAiQmFja3NwYWNlIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiVGFiIl0gPSA0OV0gPSAiVGFiIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiU3BhY2UiXSA9IDUwXSA9ICJTcGFjZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk1pbnVzIl0gPSA1MV0gPSAiTWludXMiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJFcXVhbCJdID0gNTJdID0gIkVxdWFsIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQnJhY2tldExlZnQiXSA9IDUzXSA9ICJCcmFja2V0TGVmdCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkJyYWNrZXRSaWdodCJdID0gNTRdID0gIkJyYWNrZXRSaWdodCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkJhY2tzbGFzaCJdID0gNTVdID0gIkJhY2tzbGFzaCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkludGxIYXNoIl0gPSA1Nl0gPSAiSW50bEhhc2giOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJTZW1pY29sb24iXSA9IDU3XSA9ICJTZW1pY29sb24iOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJRdW90ZSJdID0gNThdID0gIlF1b3RlIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQmFja3F1b3RlIl0gPSA1OV0gPSAiQmFja3F1b3RlIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQ29tbWEiXSA9IDYwXSA9ICJDb21tYSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlBlcmlvZCJdID0gNjFdID0gIlBlcmlvZCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlNsYXNoIl0gPSA2Ml0gPSAiU2xhc2giOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJDYXBzTG9jayJdID0gNjNdID0gIkNhcHNMb2NrIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjEiXSA9IDY0XSA9ICJGMSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYyIl0gPSA2NV0gPSAiRjIiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGMyJdID0gNjZdID0gIkYzIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjQiXSA9IDY3XSA9ICJGNCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkY1Il0gPSA2OF0gPSAiRjUiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGNiJdID0gNjldID0gIkY2IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjciXSA9IDcwXSA9ICJGNyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkY4Il0gPSA3MV0gPSAiRjgiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGOSJdID0gNzJdID0gIkY5IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjEwIl0gPSA3M10gPSAiRjEwIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjExIl0gPSA3NF0gPSAiRjExIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjEyIl0gPSA3NV0gPSAiRjEyIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiUHJpbnRTY3JlZW4iXSA9IDc2XSA9ICJQcmludFNjcmVlbiI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlNjcm9sbExvY2siXSA9IDc3XSA9ICJTY3JvbGxMb2NrIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiUGF1c2UiXSA9IDc4XSA9ICJQYXVzZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkluc2VydCJdID0gNzldID0gIkluc2VydCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkhvbWUiXSA9IDgwXSA9ICJIb21lIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiUGFnZVVwIl0gPSA4MV0gPSAiUGFnZVVwIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRGVsZXRlIl0gPSA4Ml0gPSAiRGVsZXRlIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRW5kIl0gPSA4M10gPSAiRW5kIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiUGFnZURvd24iXSA9IDg0XSA9ICJQYWdlRG93biI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkFycm93UmlnaHQiXSA9IDg1XSA9ICJBcnJvd1JpZ2h0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQXJyb3dMZWZ0Il0gPSA4Nl0gPSAiQXJyb3dMZWZ0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQXJyb3dEb3duIl0gPSA4N10gPSAiQXJyb3dEb3duIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQXJyb3dVcCJdID0gODhdID0gIkFycm93VXAiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1Mb2NrIl0gPSA4OV0gPSAiTnVtTG9jayI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZERpdmlkZSJdID0gOTBdID0gIk51bXBhZERpdmlkZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZE11bHRpcGx5Il0gPSA5MV0gPSAiTnVtcGFkTXVsdGlwbHkiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWRTdWJ0cmFjdCJdID0gOTJdID0gIk51bXBhZFN1YnRyYWN0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkQWRkIl0gPSA5M10gPSAiTnVtcGFkQWRkIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkRW50ZXIiXSA9IDk0XSA9ICJOdW1wYWRFbnRlciI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZDEiXSA9IDk1XSA9ICJOdW1wYWQxIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkMiJdID0gOTZdID0gIk51bXBhZDIiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWQzIl0gPSA5N10gPSAiTnVtcGFkMyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZDQiXSA9IDk4XSA9ICJOdW1wYWQ0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkNSJdID0gOTldID0gIk51bXBhZDUiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWQ2Il0gPSAxMDBdID0gIk51bXBhZDYiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWQ3Il0gPSAxMDFdID0gIk51bXBhZDciOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWQ4Il0gPSAxMDJdID0gIk51bXBhZDgiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWQ5Il0gPSAxMDNdID0gIk51bXBhZDkiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWQwIl0gPSAxMDRdID0gIk51bXBhZDAiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWREZWNpbWFsIl0gPSAxMDVdID0gIk51bXBhZERlY2ltYWwiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJJbnRsQmFja3NsYXNoIl0gPSAxMDZdID0gIkludGxCYWNrc2xhc2giOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJDb250ZXh0TWVudSJdID0gMTA3XSA9ICJDb250ZXh0TWVudSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlBvd2VyIl0gPSAxMDhdID0gIlBvd2VyIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkRXF1YWwiXSA9IDEwOV0gPSAiTnVtcGFkRXF1YWwiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGMTMiXSA9IDExMF0gPSAiRjEzIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjE0Il0gPSAxMTFdID0gIkYxNCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYxNSJdID0gMTEyXSA9ICJGMTUiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGMTYiXSA9IDExM10gPSAiRjE2IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjE3Il0gPSAxMTRdID0gIkYxNyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYxOCJdID0gMTE1XSA9ICJGMTgiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGMTkiXSA9IDExNl0gPSAiRjE5IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjIwIl0gPSAxMTddID0gIkYyMCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYyMSJdID0gMTE4XSA9ICJGMjEiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGMjIiXSA9IDExOV0gPSAiRjIyIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiRjIzIl0gPSAxMjBdID0gIkYyMyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkYyNCJdID0gMTIxXSA9ICJGMjQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJPcGVuIl0gPSAxMjJdID0gIk9wZW4iOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJIZWxwIl0gPSAxMjNdID0gIkhlbHAiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJTZWxlY3QiXSA9IDEyNF0gPSAiU2VsZWN0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQWdhaW4iXSA9IDEyNV0gPSAiQWdhaW4iOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJVbmRvIl0gPSAxMjZdID0gIlVuZG8iOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJDdXQiXSA9IDEyN10gPSAiQ3V0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQ29weSJdID0gMTI4XSA9ICJDb3B5IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiUGFzdGUiXSA9IDEyOV0gPSAiUGFzdGUiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJGaW5kIl0gPSAxMzBdID0gIkZpbmQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJBdWRpb1ZvbHVtZU11dGUiXSA9IDEzMV0gPSAiQXVkaW9Wb2x1bWVNdXRlIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQXVkaW9Wb2x1bWVVcCJdID0gMTMyXSA9ICJBdWRpb1ZvbHVtZVVwIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQXVkaW9Wb2x1bWVEb3duIl0gPSAxMzNdID0gIkF1ZGlvVm9sdW1lRG93biI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZENvbW1hIl0gPSAxMzRdID0gIk51bXBhZENvbW1hIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiSW50bFJvIl0gPSAxMzVdID0gIkludGxSbyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkthbmFNb2RlIl0gPSAxMzZdID0gIkthbmFNb2RlIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiSW50bFllbiJdID0gMTM3XSA9ICJJbnRsWWVuIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQ29udmVydCJdID0gMTM4XSA9ICJDb252ZXJ0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTm9uQ29udmVydCJdID0gMTM5XSA9ICJOb25Db252ZXJ0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTGFuZzEiXSA9IDE0MF0gPSAiTGFuZzEiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJMYW5nMiJdID0gMTQxXSA9ICJMYW5nMiI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkxhbmczIl0gPSAxNDJdID0gIkxhbmczIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTGFuZzQiXSA9IDE0M10gPSAiTGFuZzQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJMYW5nNSJdID0gMTQ0XSA9ICJMYW5nNSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkFib3J0Il0gPSAxNDVdID0gIkFib3J0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiUHJvcHMiXSA9IDE0Nl0gPSAiUHJvcHMiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWRQYXJlbkxlZnQiXSA9IDE0N10gPSAiTnVtcGFkUGFyZW5MZWZ0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkUGFyZW5SaWdodCJdID0gMTQ4XSA9ICJOdW1wYWRQYXJlblJpZ2h0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkQmFja3NwYWNlIl0gPSAxNDldID0gIk51bXBhZEJhY2tzcGFjZSI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZE1lbW9yeVN0b3JlIl0gPSAxNTBdID0gIk51bXBhZE1lbW9yeVN0b3JlIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkTWVtb3J5UmVjYWxsIl0gPSAxNTFdID0gIk51bXBhZE1lbW9yeVJlY2FsbCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZE1lbW9yeUNsZWFyIl0gPSAxNTJdID0gIk51bXBhZE1lbW9yeUNsZWFyIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkTWVtb3J5QWRkIl0gPSAxNTNdID0gIk51bXBhZE1lbW9yeUFkZCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk51bXBhZE1lbW9yeVN1YnRyYWN0Il0gPSAxNTRdID0gIk51bXBhZE1lbW9yeVN1YnRyYWN0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTnVtcGFkQ2xlYXIiXSA9IDE1NV0gPSAiTnVtcGFkQ2xlYXIiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJOdW1wYWRDbGVhckVudHJ5Il0gPSAxNTZdID0gIk51bXBhZENsZWFyRW50cnkiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJDb250cm9sTGVmdCJdID0gMTU3XSA9ICJDb250cm9sTGVmdCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIlNoaWZ0TGVmdCJdID0gMTU4XSA9ICJTaGlmdExlZnQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJBbHRMZWZ0Il0gPSAxNTldID0gIkFsdExlZnQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJNZXRhTGVmdCJdID0gMTYwXSA9ICJNZXRhTGVmdCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkNvbnRyb2xSaWdodCJdID0gMTYxXSA9ICJDb250cm9sUmlnaHQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJTaGlmdFJpZ2h0Il0gPSAxNjJdID0gIlNoaWZ0UmlnaHQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJBbHRSaWdodCJdID0gMTYzXSA9ICJBbHRSaWdodCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk1ldGFSaWdodCJdID0gMTY0XSA9ICJNZXRhUmlnaHQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJCcmlnaHRuZXNzVXAiXSA9IDE2NV0gPSAiQnJpZ2h0bmVzc1VwIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQnJpZ2h0bmVzc0Rvd24iXSA9IDE2Nl0gPSAiQnJpZ2h0bmVzc0Rvd24iOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJNZWRpYVBsYXkiXSA9IDE2N10gPSAiTWVkaWFQbGF5IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTWVkaWFSZWNvcmQiXSA9IDE2OF0gPSAiTWVkaWFSZWNvcmQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJNZWRpYUZhc3RGb3J3YXJkIl0gPSAxNjldID0gIk1lZGlhRmFzdEZvcndhcmQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJNZWRpYVJld2luZCJdID0gMTcwXSA9ICJNZWRpYVJld2luZCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk1lZGlhVHJhY2tOZXh0Il0gPSAxNzFdID0gIk1lZGlhVHJhY2tOZXh0IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTWVkaWFUcmFja1ByZXZpb3VzIl0gPSAxNzJdID0gIk1lZGlhVHJhY2tQcmV2aW91cyI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk1lZGlhU3RvcCJdID0gMTczXSA9ICJNZWRpYVN0b3AiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJFamVjdCJdID0gMTc0XSA9ICJFamVjdCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk1lZGlhUGxheVBhdXNlIl0gPSAxNzVdID0gIk1lZGlhUGxheVBhdXNlIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTWVkaWFTZWxlY3QiXSA9IDE3Nl0gPSAiTWVkaWFTZWxlY3QiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJMYXVuY2hNYWlsIl0gPSAxNzddID0gIkxhdW5jaE1haWwiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJMYXVuY2hBcHAyIl0gPSAxNzhdID0gIkxhdW5jaEFwcDIiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJMYXVuY2hBcHAxIl0gPSAxNzldID0gIkxhdW5jaEFwcDEiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJTZWxlY3RUYXNrIl0gPSAxODBdID0gIlNlbGVjdFRhc2siOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJMYXVuY2hTY3JlZW5TYXZlciJdID0gMTgxXSA9ICJMYXVuY2hTY3JlZW5TYXZlciI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkJyb3dzZXJTZWFyY2giXSA9IDE4Ml0gPSAiQnJvd3NlclNlYXJjaCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkJyb3dzZXJIb21lIl0gPSAxODNdID0gIkJyb3dzZXJIb21lIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQnJvd3NlckJhY2siXSA9IDE4NF0gPSAiQnJvd3NlckJhY2siOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJCcm93c2VyRm9yd2FyZCJdID0gMTg1XSA9ICJCcm93c2VyRm9yd2FyZCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIkJyb3dzZXJTdG9wIl0gPSAxODZdID0gIkJyb3dzZXJTdG9wIjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiQnJvd3NlclJlZnJlc2giXSA9IDE4N10gPSAiQnJvd3NlclJlZnJlc2giOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJCcm93c2VyRmF2b3JpdGVzIl0gPSAxODhdID0gIkJyb3dzZXJGYXZvcml0ZXMiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJab29tVG9nZ2xlIl0gPSAxODldID0gIlpvb21Ub2dnbGUiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJNYWlsUmVwbHkiXSA9IDE5MF0gPSAiTWFpbFJlcGx5IjsKICAgICAgICBTY2FuQ29kZVtTY2FuQ29kZVsiTWFpbEZvcndhcmQiXSA9IDE5MV0gPSAiTWFpbEZvcndhcmQiOwogICAgICAgIFNjYW5Db2RlW1NjYW5Db2RlWyJNYWlsU2VuZCJdID0gMTkyXSA9ICJNYWlsU2VuZCI7CiAgICAgICAgU2NhbkNvZGVbU2NhbkNvZGVbIk1BWF9WQUxVRSJdID0gMTkzXSA9ICJNQVhfVkFMVUUiOwogICAgfSkoU2NhbkNvZGUgfHwgKFNjYW5Db2RlID0ge30pKTsKICAgIHZhciBTY3JvbGxUeXBlOwogICAgKGZ1bmN0aW9uIChTY3JvbGxUeXBlKSB7CiAgICAgICAgU2Nyb2xsVHlwZVtTY3JvbGxUeXBlWyJTbW9vdGgiXSA9IDBdID0gIlNtb290aCI7CiAgICAgICAgU2Nyb2xsVHlwZVtTY3JvbGxUeXBlWyJJbW1lZGlhdGUiXSA9IDFdID0gIkltbWVkaWF0ZSI7CiAgICB9KShTY3JvbGxUeXBlIHx8IChTY3JvbGxUeXBlID0ge30pKTsKICAgIHZhciBTY3JvbGxiYXJWaXNpYmlsaXR5OwogICAgKGZ1bmN0aW9uIChTY3JvbGxiYXJWaXNpYmlsaXR5KSB7CiAgICAgICAgU2Nyb2xsYmFyVmlzaWJpbGl0eVtTY3JvbGxiYXJWaXNpYmlsaXR5WyJBdXRvIl0gPSAxXSA9ICJBdXRvIjsKICAgICAgICBTY3JvbGxiYXJWaXNpYmlsaXR5W1Njcm9sbGJhclZpc2liaWxpdHlbIkhpZGRlbiJdID0gMl0gPSAiSGlkZGVuIjsKICAgICAgICBTY3JvbGxiYXJWaXNpYmlsaXR5W1Njcm9sbGJhclZpc2liaWxpdHlbIlZpc2libGUiXSA9IDNdID0gIlZpc2libGUiOwogICAgfSkoU2Nyb2xsYmFyVmlzaWJpbGl0eSB8fCAoU2Nyb2xsYmFyVmlzaWJpbGl0eSA9IHt9KSk7CiAgICAvKioKICAgICAqIFRoZSBkaXJlY3Rpb24gb2YgYSBzZWxlY3Rpb24uCiAgICAgKi8KICAgIHZhciBTZWxlY3Rpb25EaXJlY3Rpb247CiAgICAoZnVuY3Rpb24gKFNlbGVjdGlvbkRpcmVjdGlvbikgewogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBzZWxlY3Rpb24gc3RhcnRzIGFib3ZlIHdoZXJlIGl0IGVuZHMuCiAgICAgICAgICovCiAgICAgICAgU2VsZWN0aW9uRGlyZWN0aW9uW1NlbGVjdGlvbkRpcmVjdGlvblsiTFRSIl0gPSAwXSA9ICJMVFIiOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBzZWxlY3Rpb24gc3RhcnRzIGJlbG93IHdoZXJlIGl0IGVuZHMuCiAgICAgICAgICovCiAgICAgICAgU2VsZWN0aW9uRGlyZWN0aW9uW1NlbGVjdGlvbkRpcmVjdGlvblsiUlRMIl0gPSAxXSA9ICJSVEwiOwogICAgfSkoU2VsZWN0aW9uRGlyZWN0aW9uIHx8IChTZWxlY3Rpb25EaXJlY3Rpb24gPSB7fSkpOwogICAgdmFyIFNpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZDsKICAgIChmdW5jdGlvbiAoU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kKSB7CiAgICAgICAgU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kW1NpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZFsiSW52b2tlIl0gPSAxXSA9ICJJbnZva2UiOwogICAgICAgIFNpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZFtTaWduYXR1cmVIZWxwVHJpZ2dlcktpbmRbIlRyaWdnZXJDaGFyYWN0ZXIiXSA9IDJdID0gIlRyaWdnZXJDaGFyYWN0ZXIiOwogICAgICAgIFNpZ25hdHVyZUhlbHBUcmlnZ2VyS2luZFtTaWduYXR1cmVIZWxwVHJpZ2dlcktpbmRbIkNvbnRlbnRDaGFuZ2UiXSA9IDNdID0gIkNvbnRlbnRDaGFuZ2UiOwogICAgfSkoU2lnbmF0dXJlSGVscFRyaWdnZXJLaW5kIHx8IChTaWduYXR1cmVIZWxwVHJpZ2dlcktpbmQgPSB7fSkpOwogICAgdmFyIFNuaXBwZXRTb3J0T3JkZXI7CiAgICAoZnVuY3Rpb24gKFNuaXBwZXRTb3J0T3JkZXIpIHsKICAgICAgICBTbmlwcGV0U29ydE9yZGVyW1NuaXBwZXRTb3J0T3JkZXJbIlRvcCJdID0gMF0gPSAiVG9wIjsKICAgICAgICBTbmlwcGV0U29ydE9yZGVyW1NuaXBwZXRTb3J0T3JkZXJbIklubGluZSJdID0gMV0gPSAiSW5saW5lIjsKICAgICAgICBTbmlwcGV0U29ydE9yZGVyW1NuaXBwZXRTb3J0T3JkZXJbIkJvdHRvbSJdID0gMl0gPSAiQm90dG9tIjsKICAgIH0pKFNuaXBwZXRTb3J0T3JkZXIgfHwgKFNuaXBwZXRTb3J0T3JkZXIgPSB7fSkpOwogICAgdmFyIFNuaXBwZXRTb3VyY2U7CiAgICAoZnVuY3Rpb24gKFNuaXBwZXRTb3VyY2UpIHsKICAgICAgICBTbmlwcGV0U291cmNlW1NuaXBwZXRTb3VyY2VbIlVzZXIiXSA9IDFdID0gIlVzZXIiOwogICAgICAgIFNuaXBwZXRTb3VyY2VbU25pcHBldFNvdXJjZVsiV29ya3NwYWNlIl0gPSAyXSA9ICJXb3Jrc3BhY2UiOwogICAgICAgIFNuaXBwZXRTb3VyY2VbU25pcHBldFNvdXJjZVsiRXh0ZW5zaW9uIl0gPSAzXSA9ICJFeHRlbnNpb24iOwogICAgfSkoU25pcHBldFNvdXJjZSB8fCAoU25pcHBldFNvdXJjZSA9IHt9KSk7CiAgICAvKioKICAgICAqIEEgc3RhbmRhcmQgdG9rZW4gdHlwZS4gVmFsdWVzIGFyZSAyXnggc3VjaCB0aGF0IGEgYml0IG1hc2sgY2FuIGJlIHVzZWQuCiAgICAgKi8KICAgIHZhciBTdGFuZGFyZFRva2VuVHlwZTsKICAgIChmdW5jdGlvbiAoU3RhbmRhcmRUb2tlblR5cGUpIHsKICAgICAgICBTdGFuZGFyZFRva2VuVHlwZVtTdGFuZGFyZFRva2VuVHlwZVsiT3RoZXIiXSA9IDBdID0gIk90aGVyIjsKICAgICAgICBTdGFuZGFyZFRva2VuVHlwZVtTdGFuZGFyZFRva2VuVHlwZVsiQ29tbWVudCJdID0gMV0gPSAiQ29tbWVudCI7CiAgICAgICAgU3RhbmRhcmRUb2tlblR5cGVbU3RhbmRhcmRUb2tlblR5cGVbIlN0cmluZyJdID0gMl0gPSAiU3RyaW5nIjsKICAgICAgICBTdGFuZGFyZFRva2VuVHlwZVtTdGFuZGFyZFRva2VuVHlwZVsiUmVnRXgiXSA9IDRdID0gIlJlZ0V4IjsKICAgIH0pKFN0YW5kYXJkVG9rZW5UeXBlIHx8IChTdGFuZGFyZFRva2VuVHlwZSA9IHt9KSk7CiAgICAvKioKICAgICAqIEEgc3ltYm9sIGtpbmQuCiAgICAgKi8KICAgIHZhciBTeW1ib2xLaW5kJDE7CiAgICAoZnVuY3Rpb24gKFN5bWJvbEtpbmQpIHsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIkZpbGUiXSA9IDBdID0gIkZpbGUiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiTW9kdWxlIl0gPSAxXSA9ICJNb2R1bGUiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiTmFtZXNwYWNlIl0gPSAyXSA9ICJOYW1lc3BhY2UiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiUGFja2FnZSJdID0gM10gPSAiUGFja2FnZSI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJDbGFzcyJdID0gNF0gPSAiQ2xhc3MiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiTWV0aG9kIl0gPSA1XSA9ICJNZXRob2QiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiUHJvcGVydHkiXSA9IDZdID0gIlByb3BlcnR5IjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIkZpZWxkIl0gPSA3XSA9ICJGaWVsZCI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJDb25zdHJ1Y3RvciJdID0gOF0gPSAiQ29uc3RydWN0b3IiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiRW51bSJdID0gOV0gPSAiRW51bSI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJJbnRlcmZhY2UiXSA9IDEwXSA9ICJJbnRlcmZhY2UiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiRnVuY3Rpb24iXSA9IDExXSA9ICJGdW5jdGlvbiI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJWYXJpYWJsZSJdID0gMTJdID0gIlZhcmlhYmxlIjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIkNvbnN0YW50Il0gPSAxM10gPSAiQ29uc3RhbnQiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiU3RyaW5nIl0gPSAxNF0gPSAiU3RyaW5nIjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIk51bWJlciJdID0gMTVdID0gIk51bWJlciI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJCb29sZWFuIl0gPSAxNl0gPSAiQm9vbGVhbiI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJBcnJheSJdID0gMTddID0gIkFycmF5IjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIk9iamVjdCJdID0gMThdID0gIk9iamVjdCI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJLZXkiXSA9IDE5XSA9ICJLZXkiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiTnVsbCJdID0gMjBdID0gIk51bGwiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiRW51bU1lbWJlciJdID0gMjFdID0gIkVudW1NZW1iZXIiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiU3RydWN0Il0gPSAyMl0gPSAiU3RydWN0IjsKICAgICAgICBTeW1ib2xLaW5kW1N5bWJvbEtpbmRbIkV2ZW50Il0gPSAyM10gPSAiRXZlbnQiOwogICAgICAgIFN5bWJvbEtpbmRbU3ltYm9sS2luZFsiT3BlcmF0b3IiXSA9IDI0XSA9ICJPcGVyYXRvciI7CiAgICAgICAgU3ltYm9sS2luZFtTeW1ib2xLaW5kWyJUeXBlUGFyYW1ldGVyIl0gPSAyNV0gPSAiVHlwZVBhcmFtZXRlciI7CiAgICB9KShTeW1ib2xLaW5kJDEgfHwgKFN5bWJvbEtpbmQkMSA9IHt9KSk7CiAgICB2YXIgU3ltYm9sVGFnJDE7CiAgICAoZnVuY3Rpb24gKFN5bWJvbFRhZykgewogICAgICAgIFN5bWJvbFRhZ1tTeW1ib2xUYWdbIkRlcHJlY2F0ZWQiXSA9IDFdID0gIkRlcHJlY2F0ZWQiOwogICAgfSkoU3ltYm9sVGFnJDEgfHwgKFN5bWJvbFRhZyQxID0ge30pKTsKICAgIC8qKgogICAgICogVGhlIGtpbmQgb2YgYW5pbWF0aW9uIGluIHdoaWNoIHRoZSBlZGl0b3IncyBjdXJzb3Igc2hvdWxkIGJlIHJlbmRlcmVkLgogICAgICovCiAgICB2YXIgVGV4dEVkaXRvckN1cnNvckJsaW5raW5nU3R5bGU7CiAgICAoZnVuY3Rpb24gKFRleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZGVuCiAgICAgICAgICovCiAgICAgICAgVGV4dEVkaXRvckN1cnNvckJsaW5raW5nU3R5bGVbVGV4dEVkaXRvckN1cnNvckJsaW5raW5nU3R5bGVbIkhpZGRlbiJdID0gMF0gPSAiSGlkZGVuIjsKICAgICAgICAvKioKICAgICAgICAgKiBCbGlua2luZwogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlW1RleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlWyJCbGluayJdID0gMV0gPSAiQmxpbmsiOwogICAgICAgIC8qKgogICAgICAgICAqIEJsaW5raW5nIHdpdGggc21vb3RoIGZhZGluZwogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlW1RleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlWyJTbW9vdGgiXSA9IDJdID0gIlNtb290aCI7CiAgICAgICAgLyoqCiAgICAgICAgICogQmxpbmtpbmcgd2l0aCBwcm9sb25nZWQgZmlsbGVkIHN0YXRlIGFuZCBzbW9vdGggZmFkaW5nCiAgICAgICAgICovCiAgICAgICAgVGV4dEVkaXRvckN1cnNvckJsaW5raW5nU3R5bGVbVGV4dEVkaXRvckN1cnNvckJsaW5raW5nU3R5bGVbIlBoYXNlIl0gPSAzXSA9ICJQaGFzZSI7CiAgICAgICAgLyoqCiAgICAgICAgICogRXhwYW5kIGNvbGxhcHNlIGFuaW1hdGlvbiBvbiB0aGUgeSBheGlzCiAgICAgICAgICovCiAgICAgICAgVGV4dEVkaXRvckN1cnNvckJsaW5raW5nU3R5bGVbVGV4dEVkaXRvckN1cnNvckJsaW5raW5nU3R5bGVbIkV4cGFuZCJdID0gNF0gPSAiRXhwYW5kIjsKICAgICAgICAvKioKICAgICAgICAgKiBOby1CbGlua2luZwogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlW1RleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlWyJTb2xpZCJdID0gNV0gPSAiU29saWQiOwogICAgfSkoVGV4dEVkaXRvckN1cnNvckJsaW5raW5nU3R5bGUgfHwgKFRleHRFZGl0b3JDdXJzb3JCbGlua2luZ1N0eWxlID0ge30pKTsKICAgIC8qKgogICAgICogVGhlIHN0eWxlIGluIHdoaWNoIHRoZSBlZGl0b3IncyBjdXJzb3Igc2hvdWxkIGJlIHJlbmRlcmVkLgogICAgICovCiAgICB2YXIgVGV4dEVkaXRvckN1cnNvclN0eWxlOwogICAgKGZ1bmN0aW9uIChUZXh0RWRpdG9yQ3Vyc29yU3R5bGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBBcyBhIHZlcnRpY2FsIGxpbmUgKHNpdHRpbmcgYmV0d2VlbiB0d28gY2hhcmFjdGVycykuCiAgICAgICAgICovCiAgICAgICAgVGV4dEVkaXRvckN1cnNvclN0eWxlW1RleHRFZGl0b3JDdXJzb3JTdHlsZVsiTGluZSJdID0gMV0gPSAiTGluZSI7CiAgICAgICAgLyoqCiAgICAgICAgICogQXMgYSBibG9jayAoc2l0dGluZyBvbiB0b3Agb2YgYSBjaGFyYWN0ZXIpLgogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JDdXJzb3JTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yU3R5bGVbIkJsb2NrIl0gPSAyXSA9ICJCbG9jayI7CiAgICAgICAgLyoqCiAgICAgICAgICogQXMgYSBob3Jpem9udGFsIGxpbmUgKHNpdHRpbmcgdW5kZXIgYSBjaGFyYWN0ZXIpLgogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JDdXJzb3JTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yU3R5bGVbIlVuZGVybGluZSJdID0gM10gPSAiVW5kZXJsaW5lIjsKICAgICAgICAvKioKICAgICAgICAgKiBBcyBhIHRoaW4gdmVydGljYWwgbGluZSAoc2l0dGluZyBiZXR3ZWVuIHR3byBjaGFyYWN0ZXJzKS4KICAgICAgICAgKi8KICAgICAgICBUZXh0RWRpdG9yQ3Vyc29yU3R5bGVbVGV4dEVkaXRvckN1cnNvclN0eWxlWyJMaW5lVGhpbiJdID0gNF0gPSAiTGluZVRoaW4iOwogICAgICAgIC8qKgogICAgICAgICAqIEFzIGFuIG91dGxpbmVkIGJsb2NrIChzaXR0aW5nIG9uIHRvcCBvZiBhIGNoYXJhY3RlcikuCiAgICAgICAgICovCiAgICAgICAgVGV4dEVkaXRvckN1cnNvclN0eWxlW1RleHRFZGl0b3JDdXJzb3JTdHlsZVsiQmxvY2tPdXRsaW5lIl0gPSA1XSA9ICJCbG9ja091dGxpbmUiOwogICAgICAgIC8qKgogICAgICAgICAqIEFzIGEgdGhpbiBob3Jpem9udGFsIGxpbmUgKHNpdHRpbmcgdW5kZXIgYSBjaGFyYWN0ZXIpLgogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JDdXJzb3JTdHlsZVtUZXh0RWRpdG9yQ3Vyc29yU3R5bGVbIlVuZGVybGluZVRoaW4iXSA9IDZdID0gIlVuZGVybGluZVRoaW4iOwogICAgfSkoVGV4dEVkaXRvckN1cnNvclN0eWxlIHx8IChUZXh0RWRpdG9yQ3Vyc29yU3R5bGUgPSB7fSkpOwogICAgdmFyIFRleHRFZGl0b3JTZWxlY3Rpb25SZXZlYWxUeXBlOwogICAgKGZ1bmN0aW9uIChUZXh0RWRpdG9yU2VsZWN0aW9uUmV2ZWFsVHlwZSkgewogICAgICAgIC8qKgogICAgICAgICAqIE9wdGlvbiB0byBzY3JvbGwgdmVydGljYWxseSBvciBob3Jpem9udGFsbHkgYXMgbmVjZXNzYXJ5IGFuZCByZXZlYWwgYSByYW5nZSBjZW50ZXJlZCB2ZXJ0aWNhbGx5LgogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JTZWxlY3Rpb25SZXZlYWxUeXBlW1RleHRFZGl0b3JTZWxlY3Rpb25SZXZlYWxUeXBlWyJDZW50ZXIiXSA9IDBdID0gIkNlbnRlciI7CiAgICAgICAgLyoqCiAgICAgICAgICogT3B0aW9uIHRvIHNjcm9sbCB2ZXJ0aWNhbGx5IG9yIGhvcml6b250YWxseSBhcyBuZWNlc3NhcnkgYW5kIHJldmVhbCBhIHJhbmdlIGNlbnRlcmVkIHZlcnRpY2FsbHkgb25seSBpZiBpdCBsaWVzIG91dHNpZGUgdGhlIHZpZXdwb3J0LgogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JTZWxlY3Rpb25SZXZlYWxUeXBlW1RleHRFZGl0b3JTZWxlY3Rpb25SZXZlYWxUeXBlWyJDZW50ZXJJZk91dHNpZGVWaWV3cG9ydCJdID0gMV0gPSAiQ2VudGVySWZPdXRzaWRlVmlld3BvcnQiOwogICAgICAgIC8qKgogICAgICAgICAqIE9wdGlvbiB0byBzY3JvbGwgdmVydGljYWxseSBvciBob3Jpem9udGFsbHkgYXMgbmVjZXNzYXJ5IGFuZCByZXZlYWwgYSByYW5nZSBjbG9zZSB0byB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydCwgYnV0IG5vdCBxdWl0ZSBhdCB0aGUgdG9wLgogICAgICAgICAqLwogICAgICAgIFRleHRFZGl0b3JTZWxlY3Rpb25SZXZlYWxUeXBlW1RleHRFZGl0b3JTZWxlY3Rpb25SZXZlYWxUeXBlWyJOZWFyVG9wIl0gPSAyXSA9ICJOZWFyVG9wIjsKICAgICAgICAvKioKICAgICAgICAgKiBPcHRpb24gdG8gc2Nyb2xsIHZlcnRpY2FsbHkgb3IgaG9yaXpvbnRhbGx5IGFzIG5lY2Vzc2FyeSBhbmQgcmV2ZWFsIGEgcmFuZ2UgY2xvc2UgdG8gdGhlIHRvcCBvZiB0aGUgdmlld3BvcnQsIGJ1dCBub3QgcXVpdGUgYXQgdGhlIHRvcC4KICAgICAgICAgKiBPbmx5IGlmIGl0IGxpZXMgb3V0c2lkZSB0aGUgdmlld3BvcnQKICAgICAgICAgKi8KICAgICAgICBUZXh0RWRpdG9yU2VsZWN0aW9uUmV2ZWFsVHlwZVtUZXh0RWRpdG9yU2VsZWN0aW9uUmV2ZWFsVHlwZVsiTmVhclRvcElmT3V0c2lkZVZpZXdwb3J0Il0gPSAzXSA9ICJOZWFyVG9wSWZPdXRzaWRlVmlld3BvcnQiOwogICAgfSkoVGV4dEVkaXRvclNlbGVjdGlvblJldmVhbFR5cGUgfHwgKFRleHRFZGl0b3JTZWxlY3Rpb25SZXZlYWxUeXBlID0ge30pKTsKICAgIC8qKgogICAgICogRGVzY3JpYmVzIHRoZSBiZWhhdmlvciBvZiBkZWNvcmF0aW9ucyB3aGVuIHR5cGluZy9lZGl0aW5nIG5lYXIgdGhlaXIgZWRnZXMuCiAgICAgKiBOb3RlOiBQbGVhc2UgZG8gbm90IGVkaXQgdGhlIHZhbHVlcywgYXMgdGhleSB2ZXJ5IGNhcmVmdWxseSBtYXRjaCBgRGVjb3JhdGlvblJhbmdlQmVoYXZpb3JgCiAgICAgKi8KICAgIHZhciBUcmFja2VkUmFuZ2VTdGlja2luZXNzOwogICAgKGZ1bmN0aW9uIChUcmFja2VkUmFuZ2VTdGlja2luZXNzKSB7CiAgICAgICAgVHJhY2tlZFJhbmdlU3RpY2tpbmVzc1tUcmFja2VkUmFuZ2VTdGlja2luZXNzWyJBbHdheXNHcm93c1doZW5UeXBpbmdBdEVkZ2VzIl0gPSAwXSA9ICJBbHdheXNHcm93c1doZW5UeXBpbmdBdEVkZ2VzIjsKICAgICAgICBUcmFja2VkUmFuZ2VTdGlja2luZXNzW1RyYWNrZWRSYW5nZVN0aWNraW5lc3NbIk5ldmVyR3Jvd3NXaGVuVHlwaW5nQXRFZGdlcyJdID0gMV0gPSAiTmV2ZXJHcm93c1doZW5UeXBpbmdBdEVkZ2VzIjsKICAgICAgICBUcmFja2VkUmFuZ2VTdGlja2luZXNzW1RyYWNrZWRSYW5nZVN0aWNraW5lc3NbIkdyb3dzT25seVdoZW5UeXBpbmdCZWZvcmUiXSA9IDJdID0gIkdyb3dzT25seVdoZW5UeXBpbmdCZWZvcmUiOwogICAgICAgIFRyYWNrZWRSYW5nZVN0aWNraW5lc3NbVHJhY2tlZFJhbmdlU3RpY2tpbmVzc1siR3Jvd3NPbmx5V2hlblR5cGluZ0FmdGVyIl0gPSAzXSA9ICJHcm93c09ubHlXaGVuVHlwaW5nQWZ0ZXIiOwogICAgfSkoVHJhY2tlZFJhbmdlU3RpY2tpbmVzcyB8fCAoVHJhY2tlZFJhbmdlU3RpY2tpbmVzcyA9IHt9KSk7CiAgICAvKioKICAgICAqIERlc2NyaWJlcyBob3cgdG8gaW5kZW50IHdyYXBwZWQgbGluZXMuCiAgICAgKi8KICAgIHZhciBXcmFwcGluZ0luZGVudDsKICAgIChmdW5jdGlvbiAoV3JhcHBpbmdJbmRlbnQpIHsKICAgICAgICAvKioKICAgICAgICAgKiBObyBpbmRlbnRhdGlvbiA9PiB3cmFwcGVkIGxpbmVzIGJlZ2luIGF0IGNvbHVtbiAxLgogICAgICAgICAqLwogICAgICAgIFdyYXBwaW5nSW5kZW50W1dyYXBwaW5nSW5kZW50WyJOb25lIl0gPSAwXSA9ICJOb25lIjsKICAgICAgICAvKioKICAgICAgICAgKiBTYW1lID0+IHdyYXBwZWQgbGluZXMgZ2V0IHRoZSBzYW1lIGluZGVudGF0aW9uIGFzIHRoZSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgV3JhcHBpbmdJbmRlbnRbV3JhcHBpbmdJbmRlbnRbIlNhbWUiXSA9IDFdID0gIlNhbWUiOwogICAgICAgIC8qKgogICAgICAgICAqIEluZGVudCA9PiB3cmFwcGVkIGxpbmVzIGdldCArMSBpbmRlbnRhdGlvbiB0b3dhcmQgdGhlIHBhcmVudC4KICAgICAgICAgKi8KICAgICAgICBXcmFwcGluZ0luZGVudFtXcmFwcGluZ0luZGVudFsiSW5kZW50Il0gPSAyXSA9ICJJbmRlbnQiOwogICAgICAgIC8qKgogICAgICAgICAqIERlZXBJbmRlbnQgPT4gd3JhcHBlZCBsaW5lcyBnZXQgKzIgaW5kZW50YXRpb24gdG93YXJkIHRoZSBwYXJlbnQuCiAgICAgICAgICovCiAgICAgICAgV3JhcHBpbmdJbmRlbnRbV3JhcHBpbmdJbmRlbnRbIkRlZXBJbmRlbnQiXSA9IDNdID0gIkRlZXBJbmRlbnQiOwogICAgfSkoV3JhcHBpbmdJbmRlbnQgfHwgKFdyYXBwaW5nSW5kZW50ID0ge30pKTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGNsYXNzIFJlZ2lzdHJ5IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5faWNvbnMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIHRoaXMuX29uRGlkUmVnaXN0ZXIgPSBuZXcgRW1pdHRlcigpOwogICAgICAgIH0KICAgICAgICBhZGQoaWNvbikgewogICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX2ljb25zLmdldChpY29uLmlkKTsKICAgICAgICAgICAgaWYgKCFleGlzdGluZykgewogICAgICAgICAgICAgICAgdGhpcy5faWNvbnMuc2V0KGljb24uaWQsIGljb24pOwogICAgICAgICAgICAgICAgdGhpcy5fb25EaWRSZWdpc3Rlci5maXJlKGljb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGljb24uZGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIGV4aXN0aW5nLmRlc2NyaXB0aW9uID0gaWNvbi5kZXNjcmlwdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYER1cGxpY2F0ZSByZWdpc3RyYXRpb24gb2YgY29kaWNvbiAke2ljb24uaWR9YCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZ2V0KGlkKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pY29ucy5nZXQoaWQpOwogICAgICAgIH0KICAgICAgICBnZXQgYWxsKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faWNvbnMudmFsdWVzKCk7CiAgICAgICAgfQogICAgICAgIGdldCBvbkRpZFJlZ2lzdGVyKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fb25EaWRSZWdpc3Rlci5ldmVudDsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCBfcmVnaXN0cnkgPSBuZXcgUmVnaXN0cnkoKTsKICAgIC8qKgogICAgICogVGhlIENvZGljb24gbGlicmFyeSBpcyBhIHNldCBvZiBkZWZhdWx0IGljb25zIHRoYXQgYXJlIGJ1aWx0LWluIGluIFZTIENvZGUuCiAgICAgKgogICAgICogSW4gdGhlIHByb2R1Y3QgKG91dHNpZGUgb2YgYmFzZSkgQ29kaWNvbnMgc2hvdWxkIG9ubHkgYmUgdXNlZCBhcyBkZWZhdWx0cy4gSW4gb3JkZXIgdG8gaGF2ZSBhbGwgaWNvbnMgaW4gVlMgQ29kZQogICAgICogdGhlbWVhYmxlLCBjb21wb25lbnQgc2hvdWxkIGlzZSBkZWZpbmUgbmV3LCBjb21wb25lbnQgc3BlY2lmaWMgaWNvbnMgdXNpbmcgYGljb25SZWdpc3RyeS5yZWdpc3Rlckljb25gLgogICAgICogSW4gdGhhdCBjYWxsIGEgQ29kaWNvbiBjYW4gYmUgbmFtZXMgYXMgZGVmYXVsdC4KICAgICAqLwogICAgY2xhc3MgQ29kaWNvbiB7CiAgICAgICAgY29uc3RydWN0b3IoaWQsIGRlZmluaXRpb24sIGRlc2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKICAgICAgICAgICAgdGhpcy5kZWZpbml0aW9uID0gZGVmaW5pdGlvbjsKICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwogICAgICAgICAgICBfcmVnaXN0cnkuYWRkKHRoaXMpOwogICAgICAgIH0KICAgICAgICBnZXQgY2xhc3NOYW1lcygpIHsgcmV0dXJuICdjb2RpY29uIGNvZGljb24tJyArIHRoaXMuaWQ7IH0KICAgICAgICAvLyBjbGFzc05hbWVzQXJyYXkgaXMgdXNlZnVsIGZvciBtaWdyYXRpbmcgdG8gRVM2IGNsYXNzbGlzdAogICAgICAgIGdldCBjbGFzc05hbWVzQXJyYXkoKSB7IHJldHVybiBbJ2NvZGljb24nLCAnY29kaWNvbi0nICsgdGhpcy5pZF07IH0KICAgICAgICBnZXQgY3NzU2VsZWN0b3IoKSB7IHJldHVybiAnLmNvZGljb24uY29kaWNvbi0nICsgdGhpcy5pZDsgfQogICAgfQogICAgLy8gYnVpbHQtaW4gaWNvbnMsIHdpdGggaW1hZ2UgbmFtZQogICAgQ29kaWNvbi5hZGQgPSBuZXcgQ29kaWNvbignYWRkJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTYwJyB9KTsKICAgIENvZGljb24ubGlnaHRCdWxiID0gbmV3IENvZGljb24oJ2xpZ2h0LWJ1bGInLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhNjEnIH0pOwogICAgQ29kaWNvbi53YXJuaW5nID0gbmV3IENvZGljb24oJ3dhcm5pbmcnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhNmMnIH0pOwogICAgQ29kaWNvbi5pbmZvID0gbmV3IENvZGljb24oJ2luZm8nLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhNzQnIH0pOwogICAgQ29kaWNvbi5jbG9zZSA9IG5ldyBDb2RpY29uKCdjbG9zZScsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE3NicgfSk7CiAgICBDb2RpY29uLnN5bmMgPSBuZXcgQ29kaWNvbignc3luYycsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE3NycgfSk7CiAgICBDb2RpY29uLnN5bWJvbEZvbGRlciA9IG5ldyBDb2RpY29uKCdzeW1ib2wtZm9sZGVyJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTgzJyB9KTsKICAgIENvZGljb24uc3ltYm9sRXZlbnQgPSBuZXcgQ29kaWNvbignc3ltYm9sLWV2ZW50JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTg2JyB9KTsKICAgIENvZGljb24uZXJyb3IgPSBuZXcgQ29kaWNvbignZXJyb3InLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhODcnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xWYXJpYWJsZSA9IG5ldyBDb2RpY29uKCdzeW1ib2wtdmFyaWFibGUnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhODgnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xBcnJheSA9IG5ldyBDb2RpY29uKCdzeW1ib2wtYXJyYXknLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOGEnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xNb2R1bGUgPSBuZXcgQ29kaWNvbignc3ltYm9sLW1vZHVsZScsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE4YicgfSk7CiAgICBDb2RpY29uLnN5bWJvbFBhY2thZ2UgPSBuZXcgQ29kaWNvbignc3ltYm9sLXBhY2thZ2UnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOGInIH0pOwogICAgQ29kaWNvbi5zeW1ib2xOYW1lc3BhY2UgPSBuZXcgQ29kaWNvbignc3ltYm9sLW5hbWVzcGFjZScsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE4YicgfSk7CiAgICBDb2RpY29uLnN5bWJvbE9iamVjdCA9IG5ldyBDb2RpY29uKCdzeW1ib2wtb2JqZWN0JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYThiJyB9KTsKICAgIENvZGljb24uc3ltYm9sTWV0aG9kID0gbmV3IENvZGljb24oJ3N5bWJvbC1tZXRob2QnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOGMnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xGdW5jdGlvbiA9IG5ldyBDb2RpY29uKCdzeW1ib2wtZnVuY3Rpb24nLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOGMnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xDb25zdHJ1Y3RvciA9IG5ldyBDb2RpY29uKCdzeW1ib2wtY29uc3RydWN0b3InLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOGMnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xCb29sZWFuID0gbmV3IENvZGljb24oJ3N5bWJvbC1ib29sZWFuJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYThmJyB9KTsKICAgIENvZGljb24uc3ltYm9sTnVsbCA9IG5ldyBDb2RpY29uKCdzeW1ib2wtbnVsbCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE4ZicgfSk7CiAgICBDb2RpY29uLnN5bWJvbE51bWJlciA9IG5ldyBDb2RpY29uKCdzeW1ib2wtbnVtYmVyJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTkwJyB9KTsKICAgIENvZGljb24uc3ltYm9sU3RydWN0ID0gbmV3IENvZGljb24oJ3N5bWJvbC1zdHJ1Y3QnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOTEnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xUeXBlUGFyYW1ldGVyID0gbmV3IENvZGljb24oJ3N5bWJvbC10eXBlLXBhcmFtZXRlcicsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE5MicgfSk7CiAgICBDb2RpY29uLnN5bWJvbEtleSA9IG5ldyBDb2RpY29uKCdzeW1ib2wta2V5JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTkzJyB9KTsKICAgIENvZGljb24uc3ltYm9sVGV4dCA9IG5ldyBDb2RpY29uKCdzeW1ib2wtdGV4dCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE5MycgfSk7CiAgICBDb2RpY29uLnN5bWJvbFJlZmVyZW5jZSA9IG5ldyBDb2RpY29uKCdzeW1ib2wtcmVmZXJlbmNlJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTk0JyB9KTsKICAgIENvZGljb24uc3ltYm9sRW51bSA9IG5ldyBDb2RpY29uKCdzeW1ib2wtZW51bScsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE5NScgfSk7CiAgICBDb2RpY29uLnN5bWJvbFZhbHVlID0gbmV3IENvZGljb24oJ3N5bWJvbC12YWx1ZScsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE5NScgfSk7CiAgICBDb2RpY29uLnN5bWJvbFVuaXQgPSBuZXcgQ29kaWNvbignc3ltYm9sLXVuaXQnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhOTYnIH0pOwogICAgQ29kaWNvbi5hcnJvd0Rvd24gPSBuZXcgQ29kaWNvbignYXJyb3ctZG93bicsIHsgZm9udENoYXJhY3RlcjogJ1xcZWE5YScgfSk7CiAgICBDb2RpY29uLmFycm93TGVmdCA9IG5ldyBDb2RpY29uKCdhcnJvdy1sZWZ0JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYTliJyB9KTsKICAgIENvZGljb24uYXJyb3dVcCA9IG5ldyBDb2RpY29uKCdhcnJvdy11cCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWFhMScgfSk7CiAgICBDb2RpY29uLmNhc2VTZW5zaXRpdmUgPSBuZXcgQ29kaWNvbignY2FzZS1zZW5zaXRpdmUnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhYjEnIH0pOwogICAgQ29kaWNvbi5jaGVjayA9IG5ldyBDb2RpY29uKCdjaGVjaycsIHsgZm9udENoYXJhY3RlcjogJ1xcZWFiMicgfSk7CiAgICBDb2RpY29uLmNoZXZyb25Eb3duID0gbmV3IENvZGljb24oJ2NoZXZyb24tZG93bicsIHsgZm9udENoYXJhY3RlcjogJ1xcZWFiNCcgfSk7CiAgICBDb2RpY29uLmNoZXZyb25SaWdodCA9IG5ldyBDb2RpY29uKCdjaGV2cm9uLXJpZ2h0JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYWI2JyB9KTsKICAgIENvZGljb24uY2hldnJvblVwID0gbmV3IENvZGljb24oJ2NoZXZyb24tdXAnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGVhYjcnIH0pOwogICAgQ29kaWNvbi5saWdodGJ1bGJBdXRvZml4ID0gbmV3IENvZGljb24oJ2xpZ2h0YnVsYi1hdXRvZml4JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjEzJyB9KTsKICAgIENvZGljb24ubG9hZGluZyA9IG5ldyBDb2RpY29uKCdsb2FkaW5nJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjE5JyB9KTsKICAgIENvZGljb24ucHJlc2VydmVDYXNlID0gbmV3IENvZGljb24oJ3ByZXNlcnZlLWNhc2UnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViMmUnIH0pOwogICAgQ29kaWNvbi5yZWdleCA9IG5ldyBDb2RpY29uKCdyZWdleCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWIzOCcgfSk7CiAgICBDb2RpY29uLnJlbW92ZSA9IG5ldyBDb2RpY29uKCdyZW1vdmUnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViM2InIH0pOwogICAgQ29kaWNvbi5yZXBsYWNlQWxsID0gbmV3IENvZGljb24oJ3JlcGxhY2UtYWxsJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjNjJyB9KTsKICAgIENvZGljb24ucmVwbGFjZSA9IG5ldyBDb2RpY29uKCdyZXBsYWNlJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjNkJyB9KTsKICAgIENvZGljb24uc3BsaXRIb3Jpem9udGFsID0gbmV3IENvZGljb24oJ3NwbGl0LWhvcml6b250YWwnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViNTYnIH0pOwogICAgQ29kaWNvbi5zcGxpdFZlcnRpY2FsID0gbmV3IENvZGljb24oJ3NwbGl0LXZlcnRpY2FsJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjU3JyB9KTsKICAgIENvZGljb24uc3ltYm9sQ2xhc3MgPSBuZXcgQ29kaWNvbignc3ltYm9sLWNsYXNzJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjViJyB9KTsKICAgIENvZGljb24uc3ltYm9sQ29sb3IgPSBuZXcgQ29kaWNvbignc3ltYm9sLWNvbG9yJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjVjJyB9KTsKICAgIENvZGljb24uc3ltYm9sQ29uc3RhbnQgPSBuZXcgQ29kaWNvbignc3ltYm9sLWNvbnN0YW50JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjVkJyB9KTsKICAgIENvZGljb24uc3ltYm9sRW51bU1lbWJlciA9IG5ldyBDb2RpY29uKCdzeW1ib2wtZW51bS1tZW1iZXInLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViNWUnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xGaWVsZCA9IG5ldyBDb2RpY29uKCdzeW1ib2wtZmllbGQnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViNWYnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xGaWxlID0gbmV3IENvZGljb24oJ3N5bWJvbC1maWxlJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjYwJyB9KTsKICAgIENvZGljb24uc3ltYm9sSW50ZXJmYWNlID0gbmV3IENvZGljb24oJ3N5bWJvbC1pbnRlcmZhY2UnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViNjEnIH0pOwogICAgQ29kaWNvbi5zeW1ib2xLZXl3b3JkID0gbmV3IENvZGljb24oJ3N5bWJvbC1rZXl3b3JkJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjYyJyB9KTsKICAgIENvZGljb24uc3ltYm9sT3BlcmF0b3IgPSBuZXcgQ29kaWNvbignc3ltYm9sLW9wZXJhdG9yJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjY0JyB9KTsKICAgIENvZGljb24uc3ltYm9sUHJvcGVydHkgPSBuZXcgQ29kaWNvbignc3ltYm9sLXByb3BlcnR5JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjY1JyB9KTsKICAgIENvZGljb24uc3ltYm9sU25pcHBldCA9IG5ldyBDb2RpY29uKCdzeW1ib2wtc25pcHBldCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI2NicgfSk7CiAgICBDb2RpY29uLnRyaWFuZ2xlRG93biA9IG5ldyBDb2RpY29uKCd0cmlhbmdsZS1kb3duJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjZlJyB9KTsKICAgIENvZGljb24udHJpYW5nbGVMZWZ0ID0gbmV3IENvZGljb24oJ3RyaWFuZ2xlLWxlZnQnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViNmYnIH0pOwogICAgQ29kaWNvbi50cmlhbmdsZVJpZ2h0ID0gbmV3IENvZGljb24oJ3RyaWFuZ2xlLXJpZ2h0JywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjcwJyB9KTsKICAgIENvZGljb24udHJpYW5nbGVVcCA9IG5ldyBDb2RpY29uKCd0cmlhbmdsZS11cCcsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI3MScgfSk7CiAgICBDb2RpY29uLndob2xlV29yZCA9IG5ldyBDb2RpY29uKCd3aG9sZS13b3JkJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjdlJyB9KTsKICAgIENvZGljb24ubGlzdEZpbHRlciA9IG5ldyBDb2RpY29uKCdsaXN0LWZpbHRlcicsIHsgZm9udENoYXJhY3RlcjogJ1xcZWI4MycgfSk7CiAgICBDb2RpY29uLmxpc3RTZWxlY3Rpb24gPSBuZXcgQ29kaWNvbignbGlzdC1zZWxlY3Rpb24nLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViODUnIH0pOwogICAgQ29kaWNvbi5zZWxlY3Rpb24gPSBuZXcgQ29kaWNvbignc2VsZWN0aW9uJywgeyBmb250Q2hhcmFjdGVyOiAnXFxlYjg1JyB9KTsKICAgIENvZGljb24uc3ltYm9sU3RyaW5nID0gbmV3IENvZGljb24oJ3N5bWJvbC1zdHJpbmcnLCB7IGZvbnRDaGFyYWN0ZXI6ICdcXGViOGQnIH0pOwogICAgQ29kaWNvbi50cmVlSXRlbUV4cGFuZGVkID0gbmV3IENvZGljb24oJ3RyZWUtaXRlbS1leHBhbmRlZCcsIENvZGljb24uY2hldnJvbkRvd24uZGVmaW5pdGlvbik7IC8vIGNvbGxhcHNlZCBpcyBkb25lIHdpdGggcm90YXRpb24KICAgIENvZGljb24udHJlZUZpbHRlck9uVHlwZU9uID0gbmV3IENvZGljb24oJ3RyZWUtZmlsdGVyLW9uLXR5cGUtb24nLCBDb2RpY29uLmxpc3RGaWx0ZXIuZGVmaW5pdGlvbik7CiAgICBDb2RpY29uLnRyZWVGaWx0ZXJPblR5cGVPZmYgPSBuZXcgQ29kaWNvbigndHJlZS1maWx0ZXItb24tdHlwZS1vZmYnLCBDb2RpY29uLmxpc3RTZWxlY3Rpb24uZGVmaW5pdGlvbik7CiAgICBDb2RpY29uLnRyZWVGaWx0ZXJDbGVhciA9IG5ldyBDb2RpY29uKCd0cmVlLWZpbHRlci1jbGVhcicsIENvZGljb24uY2xvc2UuZGVmaW5pdGlvbik7CiAgICBDb2RpY29uLnRyZWVJdGVtTG9hZGluZyA9IG5ldyBDb2RpY29uKCd0cmVlLWl0ZW0tbG9hZGluZycsIENvZGljb24ubG9hZGluZy5kZWZpbml0aW9uKTsKICAgIENvZGljb24ubWVudVNlbGVjdGlvbiA9IG5ldyBDb2RpY29uKCdtZW51LXNlbGVjdGlvbicsIENvZGljb24uY2hlY2suZGVmaW5pdGlvbik7CiAgICBDb2RpY29uLm1lbnVTdWJtZW51ID0gbmV3IENvZGljb24oJ21lbnUtc3VibWVudScsIENvZGljb24uY2hldnJvblJpZ2h0LmRlZmluaXRpb24pOwogICAgQ29kaWNvbi5zY3JvbGxiYXJCdXR0b25MZWZ0ID0gbmV3IENvZGljb24oJ3Njcm9sbGJhci1idXR0b24tbGVmdCcsIENvZGljb24udHJpYW5nbGVMZWZ0LmRlZmluaXRpb24pOwogICAgQ29kaWNvbi5zY3JvbGxiYXJCdXR0b25SaWdodCA9IG5ldyBDb2RpY29uKCdzY3JvbGxiYXItYnV0dG9uLXJpZ2h0JywgQ29kaWNvbi50cmlhbmdsZVJpZ2h0LmRlZmluaXRpb24pOwogICAgQ29kaWNvbi5zY3JvbGxiYXJCdXR0b25VcCA9IG5ldyBDb2RpY29uKCdzY3JvbGxiYXItYnV0dG9uLXVwJywgQ29kaWNvbi50cmlhbmdsZVVwLmRlZmluaXRpb24pOwogICAgQ29kaWNvbi5zY3JvbGxiYXJCdXR0b25Eb3duID0gbmV3IENvZGljb24oJ3Njcm9sbGJhci1idXR0b24tZG93bicsIENvZGljb24udHJpYW5nbGVEb3duLmRlZmluaXRpb24pOwogICAgQ29kaWNvbi5xdWlja0lucHV0QmFjayA9IG5ldyBDb2RpY29uKCdxdWljay1pbnB1dC1iYWNrJywgQ29kaWNvbi5hcnJvd0xlZnQuZGVmaW5pdGlvbik7CiAgICB2YXIgQ1NTSWNvbjsKICAgIChmdW5jdGlvbiAoQ1NTSWNvbikgewogICAgICAgIENTU0ljb24uaWNvbk5hbWVTZWdtZW50ID0gJ1tBLVphLXowLTldKyc7CiAgICAgICAgQ1NTSWNvbi5pY29uTmFtZUV4cHJlc3Npb24gPSAnW0EtWmEtejAtOS1dKyc7CiAgICAgICAgQ1NTSWNvbi5pY29uTW9kaWZpZXJFeHByZXNzaW9uID0gJ35bQS1aYS16XSsnOwogICAgICAgIENTU0ljb24uaWNvbk5hbWVDaGFyYWN0ZXIgPSAnW0EtWmEtejAtOX4tXSc7CiAgICAgICAgY29uc3QgY3NzSWNvbklkUmVnZXggPSBuZXcgUmVnRXhwKGBeKCR7Q1NTSWNvbi5pY29uTmFtZUV4cHJlc3Npb259KSgke0NTU0ljb24uaWNvbk1vZGlmaWVyRXhwcmVzc2lvbn0pPyRgKTsKICAgICAgICBmdW5jdGlvbiBhc0NsYXNzTmFtZUFycmF5KGljb24pIHsKICAgICAgICAgICAgaWYgKGljb24gaW5zdGFuY2VvZiBDb2RpY29uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gWydjb2RpY29uJywgJ2NvZGljb24tJyArIGljb24uaWRdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY3NzSWNvbklkUmVnZXguZXhlYyhpY29uLmlkKTsKICAgICAgICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFzQ2xhc3NOYW1lQXJyYXkoQ29kaWNvbi5lcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IFssIGlkLCBtb2RpZmllcl0gPSBtYXRjaDsKICAgICAgICAgICAgY29uc3QgY2xhc3NOYW1lcyA9IFsnY29kaWNvbicsICdjb2RpY29uLScgKyBpZF07CiAgICAgICAgICAgIGlmIChtb2RpZmllcikgewogICAgICAgICAgICAgICAgY2xhc3NOYW1lcy5wdXNoKCdjb2RpY29uLW1vZGlmaWVyLScgKyBtb2RpZmllci5zdWJzdHIoMSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWVzOwogICAgICAgIH0KICAgICAgICBDU1NJY29uLmFzQ2xhc3NOYW1lQXJyYXkgPSBhc0NsYXNzTmFtZUFycmF5OwogICAgICAgIGZ1bmN0aW9uIGFzQ2xhc3NOYW1lKGljb24pIHsKICAgICAgICAgICAgcmV0dXJuIGFzQ2xhc3NOYW1lQXJyYXkoaWNvbikuam9pbignICcpOwogICAgICAgIH0KICAgICAgICBDU1NJY29uLmFzQ2xhc3NOYW1lID0gYXNDbGFzc05hbWU7CiAgICAgICAgZnVuY3Rpb24gYXNDU1NTZWxlY3RvcihpY29uKSB7CiAgICAgICAgICAgIHJldHVybiAnLicgKyBhc0NsYXNzTmFtZUFycmF5KGljb24pLmpvaW4oJy4nKTsKICAgICAgICB9CiAgICAgICAgQ1NTSWNvbi5hc0NTU1NlbGVjdG9yID0gYXNDU1NTZWxlY3RvcjsKICAgIH0pKENTU0ljb24gfHwgKENTU0ljb24gPSB7fSkpOwoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdmFyIF9iOwogICAgY2xhc3MgTGlua2VkTWFwIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpc1tfYl0gPSAnTGlua2VkTWFwJzsKICAgICAgICAgICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLl9zaXplID0gMDsKICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAwOwogICAgICAgIH0KICAgICAgICBjbGVhcigpIHsKICAgICAgICAgICAgdGhpcy5fbWFwLmNsZWFyKCk7CiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMuX3NpemUgPSAwOwogICAgICAgICAgICB0aGlzLl9zdGF0ZSsrOwogICAgICAgIH0KICAgICAgICBpc0VtcHR5KCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWw7CiAgICAgICAgfQogICAgICAgIGdldCBzaXplKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTsKICAgICAgICB9CiAgICAgICAgZ2V0IGZpcnN0KCkgewogICAgICAgICAgICB2YXIgX2M7CiAgICAgICAgICAgIHJldHVybiAoX2MgPSB0aGlzLl9oZWFkKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudmFsdWU7CiAgICAgICAgfQogICAgICAgIGdldCBsYXN0KCkgewogICAgICAgICAgICB2YXIgX2M7CiAgICAgICAgICAgIHJldHVybiAoX2MgPSB0aGlzLl90YWlsKSA9PT0gbnVsbCB8fCBfYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2MudmFsdWU7CiAgICAgICAgfQogICAgICAgIGhhcyhrZXkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5oYXMoa2V5KTsKICAgICAgICB9CiAgICAgICAgZ2V0KGtleSwgdG91Y2ggPSAwIC8qIE5vbmUgKi8pIHsKICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTsKICAgICAgICAgICAgaWYgKCFpdGVtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gMCAvKiBOb25lICovKSB7CiAgICAgICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTsKICAgICAgICB9CiAgICAgICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gMCAvKiBOb25lICovKSB7CiAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpOwogICAgICAgICAgICBpZiAoaXRlbSkgewogICAgICAgICAgICAgICAgaXRlbS52YWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgaWYgKHRvdWNoICE9PSAwIC8qIE5vbmUgKi8pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGl0ZW0gPSB7IGtleSwgdmFsdWUsIG5leHQ6IHVuZGVmaW5lZCwgcHJldmlvdXM6IHVuZGVmaW5lZCB9OwogICAgICAgICAgICAgICAgc3dpdGNoICh0b3VjaCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBOb25lICovOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEgLyogQXNPbGQgKi86CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbUZpcnN0KGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDIgLyogQXNOZXcgKi86CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbUxhc3QoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbUxhc3QoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fbWFwLnNldChrZXksIGl0ZW0pOwogICAgICAgICAgICAgICAgdGhpcy5fc2l6ZSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBkZWxldGUoa2V5KSB7CiAgICAgICAgICAgIHJldHVybiAhIXRoaXMucmVtb3ZlKGtleSk7CiAgICAgICAgfQogICAgICAgIHJlbW92ZShrZXkpIHsKICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTsKICAgICAgICAgICAgaWYgKCFpdGVtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX21hcC5kZWxldGUoa2V5KTsKICAgICAgICAgICAgdGhpcy5yZW1vdmVJdGVtKGl0ZW0pOwogICAgICAgICAgICB0aGlzLl9zaXplLS07CiAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlOwogICAgICAgIH0KICAgICAgICBzaGlmdCgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5faGVhZDsKICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShpdGVtLmtleSk7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTsKICAgICAgICAgICAgdGhpcy5fc2l6ZS0tOwogICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTsKICAgICAgICB9CiAgICAgICAgZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnKSB7CiAgICAgICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7CiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzQXJnKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tmbi5iaW5kKHRoaXNBcmcpKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4oY3VycmVudC52YWx1ZSwgY3VycmVudC5rZXksIHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBrZXlzKCkgewogICAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzOwogICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlOwogICAgICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7CiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gewogICAgICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG5leHQoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5fc3RhdGUgIT09IHN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTsKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjsKICAgICAgICB9CiAgICAgICAgdmFsdWVzKCkgewogICAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzOwogICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlOwogICAgICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7CiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gewogICAgICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG5leHQoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5fc3RhdGUgIT09IHN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LnZhbHVlLCBkb25lOiBmYWxzZSB9OwogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwogICAgICAgIH0KICAgICAgICBlbnRyaWVzKCkgewogICAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzOwogICAgICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlOwogICAgICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7CiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9yID0gewogICAgICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIG5leHQoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5fc3RhdGUgIT09IHN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBbY3VycmVudC5rZXksIGN1cnJlbnQudmFsdWVdLCBkb25lOiBmYWxzZSB9OwogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yOwogICAgICAgIH0KICAgICAgICBbKF9iID0gU3ltYm9sLnRvU3RyaW5nVGFnLCBTeW1ib2wuaXRlcmF0b3IpXSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50cmllcygpOwogICAgICAgIH0KICAgICAgICB0cmltT2xkKG5ld1NpemUpIHsKICAgICAgICAgICAgaWYgKG5ld1NpemUgPj0gdGhpcy5zaXplKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5ld1NpemUgPT09IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7CiAgICAgICAgICAgIGxldCBjdXJyZW50U2l6ZSA9IHRoaXMuc2l6ZTsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgJiYgY3VycmVudFNpemUgPiBuZXdTaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGN1cnJlbnQua2V5KTsKICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7CiAgICAgICAgICAgICAgICBjdXJyZW50U2l6ZS0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBjdXJyZW50OwogICAgICAgICAgICB0aGlzLl9zaXplID0gY3VycmVudFNpemU7CiAgICAgICAgICAgIGlmIChjdXJyZW50KSB7CiAgICAgICAgICAgICAgICBjdXJyZW50LnByZXZpb3VzID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3N0YXRlKys7CiAgICAgICAgfQogICAgICAgIGFkZEl0ZW1GaXJzdChpdGVtKSB7CiAgICAgICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0CiAgICAgICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkgewogICAgICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuX2hlYWQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpdGVtLm5leHQgPSB0aGlzLl9oZWFkOwogICAgICAgICAgICAgICAgdGhpcy5faGVhZC5wcmV2aW91cyA9IGl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07CiAgICAgICAgICAgIHRoaXMuX3N0YXRlKys7CiAgICAgICAgfQogICAgICAgIGFkZEl0ZW1MYXN0KGl0ZW0pIHsKICAgICAgICAgICAgLy8gRmlyc3QgdGltZSBJbnNlcnQKICAgICAgICAgICAgaWYgKCF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9oZWFkID0gaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5fdGFpbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGl0ZW0ucHJldmlvdXMgPSB0aGlzLl90YWlsOwogICAgICAgICAgICAgICAgdGhpcy5fdGFpbC5uZXh0ID0gaXRlbTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl90YWlsID0gaXRlbTsKICAgICAgICAgICAgdGhpcy5fc3RhdGUrKzsKICAgICAgICB9CiAgICAgICAgcmVtb3ZlSXRlbShpdGVtKSB7CiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl9oZWFkICYmIGl0ZW0gPT09IHRoaXMuX3RhaWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0gPT09IHRoaXMuX2hlYWQpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlZAogICAgICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ubmV4dCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpdGVtLm5leHQucHJldmlvdXMgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9oZWFkID0gaXRlbS5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGl0ZW0gPT09IHRoaXMuX3RhaWwpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlZAogICAgICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuCiAgICAgICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0OwogICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzOwogICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7CiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMuX3N0YXRlKys7CiAgICAgICAgfQogICAgICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoKHRvdWNoICE9PSAxIC8qIEFzT2xkICovICYmIHRvdWNoICE9PSAyIC8qIEFzTmV3ICovKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0b3VjaCA9PT0gMSAvKiBBc09sZCAqLykgewogICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IHRoaXMuX2hlYWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0OwogICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzOwogICAgICAgICAgICAgICAgLy8gVW5saW5rIHRoZSBpdGVtCiAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkgewogICAgICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIG11c3QgYmUgZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBub3QgaGVhZCBidXQgaXMgdGFpbAogICAgICAgICAgICAgICAgICAgIC8vIFNvIHRoZXJlIGFyZSBtb3JlIHRoYW4gb24gaXRlbSBpbiB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubmV4dCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90YWlsID0gcHJldmlvdXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5leHQgYW5kIHByZXZpb3VzIGFyZSBub3QgdW5kZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5laXRoZXIgaGVhZCBub3IgdGFpbC4KICAgICAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7CiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubmV4dCA9IG5leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBJbnNlcnQgdGhlIG5vZGUgYXQgaGVhZAogICAgICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGl0ZW0ubmV4dCA9IHRoaXMuX2hlYWQ7CiAgICAgICAgICAgICAgICB0aGlzLl9oZWFkLnByZXZpb3VzID0gaXRlbTsKICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtOwogICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0b3VjaCA9PT0gMiAvKiBBc05ldyAqLykgewogICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IHRoaXMuX3RhaWwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0OwogICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzOwogICAgICAgICAgICAgICAgLy8gVW5saW5rIHRoZSBpdGVtLgogICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09IHRoaXMuX2hlYWQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IG11c3QgYmUgZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBub3QgdGFpbCBidXQgaXMgaGVhZAogICAgICAgICAgICAgICAgICAgIC8vIFNvIHRoZXJlIGFyZSBtb3JlIHRoYW4gb24gaXRlbSBpbiB0aGUgbWFwCiAgICAgICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9oZWFkID0gbmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLgogICAgICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91czsKICAgICAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGl0ZW0ubmV4dCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGl0ZW0ucHJldmlvdXMgPSB0aGlzLl90YWlsOwogICAgICAgICAgICAgICAgdGhpcy5fdGFpbC5uZXh0ID0gaXRlbTsKICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtOwogICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0b0pTT04oKSB7CiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBbXTsKICAgICAgICAgICAgdGhpcy5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7CiAgICAgICAgICAgICAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KICAgICAgICBmcm9tSlNPTihkYXRhKSB7CiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZGF0YSkgewogICAgICAgICAgICAgICAgdGhpcy5zZXQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBMUlVDYWNoZSBleHRlbmRzIExpbmtlZE1hcCB7CiAgICAgICAgY29uc3RydWN0b3IobGltaXQsIHJhdGlvID0gMSkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9saW1pdCA9IGxpbWl0OwogICAgICAgICAgICB0aGlzLl9yYXRpbyA9IE1hdGgubWluKE1hdGgubWF4KDAsIHJhdGlvKSwgMSk7CiAgICAgICAgfQogICAgICAgIGdldCBsaW1pdCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpbWl0OwogICAgICAgIH0KICAgICAgICBzZXQgbGltaXQobGltaXQpIHsKICAgICAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDsKICAgICAgICAgICAgdGhpcy5jaGVja1RyaW0oKTsKICAgICAgICB9CiAgICAgICAgZ2V0KGtleSwgdG91Y2ggPSAyIC8qIEFzTmV3ICovKSB7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7CiAgICAgICAgfQogICAgICAgIHBlZWsoa2V5KSB7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCAwIC8qIE5vbmUgKi8pOwogICAgICAgIH0KICAgICAgICBzZXQoa2V5LCB2YWx1ZSkgewogICAgICAgICAgICBzdXBlci5zZXQoa2V5LCB2YWx1ZSwgMiAvKiBBc05ldyAqLyk7CiAgICAgICAgICAgIHRoaXMuY2hlY2tUcmltKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBjaGVja1RyaW0oKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNpemUgPiB0aGlzLl9saW1pdCkgewogICAgICAgICAgICAgICAgdGhpcy50cmltT2xkKE1hdGgucm91bmQodGhpcy5fbGltaXQgKiB0aGlzLl9yYXRpbykpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgLy8gUHJlZml4CiAgICBfbWF0Y2hlc1ByZWZpeC5iaW5kKHVuZGVmaW5lZCwgZmFsc2UpOwogICAgX21hdGNoZXNQcmVmaXguYmluZCh1bmRlZmluZWQsIHRydWUpOwogICAgZnVuY3Rpb24gX21hdGNoZXNQcmVmaXgoaWdub3JlQ2FzZSwgd29yZCwgd29yZFRvTWF0Y2hBZ2FpbnN0KSB7CiAgICAgICAgaWYgKCF3b3JkVG9NYXRjaEFnYWluc3QgfHwgd29yZFRvTWF0Y2hBZ2FpbnN0Lmxlbmd0aCA8IHdvcmQubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBsZXQgbWF0Y2hlczsKICAgICAgICBpZiAoaWdub3JlQ2FzZSkgewogICAgICAgICAgICBtYXRjaGVzID0gc3RhcnRzV2l0aElnbm9yZUNhc2Uod29yZFRvTWF0Y2hBZ2FpbnN0LCB3b3JkKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG1hdGNoZXMgPSB3b3JkVG9NYXRjaEFnYWluc3QuaW5kZXhPZih3b3JkKSA9PT0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFtYXRjaGVzKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gd29yZC5sZW5ndGggPiAwID8gW3sgc3RhcnQ6IDAsIGVuZDogd29yZC5sZW5ndGggfV0gOiBbXTsKICAgIH0KICAgIGNvbnN0IHdvcmRTZXBhcmF0b3JzID0gbmV3IFNldCgpOwogICAgLy8gVGhlc2UgYXJlIGNob3NlbiBhcyBuYXR1cmFsIHdvcmQgc2VwYXJhdG9ycyBiYXNlZCBvbiB3cml0ZW4gdGV4dC4KICAgIC8vIEl0IGlzIGEgc3Vic2V0IG9mIHRoZSB3b3JkIHNlcGFyYXRvcnMgdXNlZCBieSB0aGUgbW9uYWNvIGVkaXRvci4KICAgICcoKVtde308PmBcJyItLzs6LC4/IScKICAgICAgICAuc3BsaXQoJycpCiAgICAgICAgLmZvckVhY2gocyA9PiB3b3JkU2VwYXJhdG9ycy5hZGQocy5jaGFyQ29kZUF0KDApKSk7CiAgICBuZXcgTFJVQ2FjaGUoMTAwMDApOyAvLyBib3VuZGVkIHRvIDEwMDAwIGVsZW1lbnRzCiAgICBjb25zdCBfbWF4TGVuID0gMTI4OwogICAgZnVuY3Rpb24gaW5pdFRhYmxlKCkgewogICAgICAgIGNvbnN0IHRhYmxlID0gW107CiAgICAgICAgY29uc3Qgcm93ID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gX21heExlbjsgaSsrKSB7CiAgICAgICAgICAgIHJvd1tpXSA9IDA7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IF9tYXhMZW47IGkrKykgewogICAgICAgICAgICB0YWJsZS5wdXNoKHJvdy5zbGljZSgwKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0YWJsZTsKICAgIH0KICAgIGZ1bmN0aW9uIGluaXRBcnIobWF4TGVuKSB7CiAgICAgICAgY29uc3Qgcm93ID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbWF4TGVuOyBpKyspIHsKICAgICAgICAgICAgcm93W2ldID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJvdzsKICAgIH0KICAgIGluaXRBcnIoMiAqIF9tYXhMZW4pOyAvLyBtaW4gd29yZCBwb3NpdGlvbiBmb3IgYSBjZXJ0YWluIHBhdHRlcm4gcG9zaXRpb24KICAgIGluaXRBcnIoMiAqIF9tYXhMZW4pOyAvLyBtYXggd29yZCBwb3NpdGlvbiBmb3IgYSBjZXJ0YWluIHBhdHRlcm4gcG9zaXRpb24KICAgIGluaXRUYWJsZSgpOyAvLyB0aGUgbGVuZ3RoIG9mIGEgY29udGlndW91cyBkaWFnb25hbCBtYXRjaAogICAgaW5pdFRhYmxlKCk7CiAgICBpbml0VGFibGUoKTsKICAgIHZhciBGdXp6eVNjb3JlOwogICAgKGZ1bmN0aW9uIChGdXp6eVNjb3JlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogTm8gbWF0Y2hlcyBhbmQgdmFsdWUgYC0xMDBgCiAgICAgICAgICovCiAgICAgICAgRnV6enlTY29yZS5EZWZhdWx0ID0gKFstMTAwLCAwXSk7CiAgICAgICAgZnVuY3Rpb24gaXNEZWZhdWx0KHNjb3JlKSB7CiAgICAgICAgICAgIHJldHVybiAhc2NvcmUgfHwgKHNjb3JlLmxlbmd0aCA9PT0gMiAmJiBzY29yZVswXSA9PT0gLTEwMCAmJiBzY29yZVsxXSA9PT0gMCk7CiAgICAgICAgfQogICAgICAgIEZ1enp5U2NvcmUuaXNEZWZhdWx0ID0gaXNEZWZhdWx0OwogICAgfSkoRnV6enlTY29yZSB8fCAoRnV6enlTY29yZSA9IHt9KSk7CiAgICAvLyNlbmRyZWdpb24KCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGNvbnN0IGljb25zUmVnZXggPSBuZXcgUmVnRXhwKGBcXCRcXCgke0NTU0ljb24uaWNvbk5hbWVFeHByZXNzaW9ufSg/OiR7Q1NTSWNvbi5pY29uTW9kaWZpZXJFeHByZXNzaW9ufSk/XFwpYCwgJ2cnKTsgLy8gbm8gY2FwdHVyaW5nIGdyb3VwcwogICAgbmV3IFJlZ0V4cChDU1NJY29uLmljb25OYW1lQ2hhcmFjdGVyKTsKICAgIGNvbnN0IGVzY2FwZUljb25zUmVnZXggPSBuZXcgUmVnRXhwKGAoXFxcXCk/JHtpY29uc1JlZ2V4LnNvdXJjZX1gLCAnZycpOwogICAgZnVuY3Rpb24gZXNjYXBlSWNvbnModGV4dCkgewogICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoZXNjYXBlSWNvbnNSZWdleCwgKG1hdGNoLCBlc2NhcGVkKSA9PiBlc2NhcGVkID8gbWF0Y2ggOiBgXFwke21hdGNofWApOwogICAgfQogICAgbmV3IFJlZ0V4cChgXFxcXCR7aWNvbnNSZWdleC5zb3VyY2V9YCwgJ2cnKTsKICAgIG5ldyBSZWdFeHAoYChcXHMpPyhcXFxcKT8ke2ljb25zUmVnZXguc291cmNlfShcXHMpP2AsICdnJyk7CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjbGFzcyBNYXJrZG93blN0cmluZyB7CiAgICAgICAgY29uc3RydWN0b3IodmFsdWUgPSAnJywgaXNUcnVzdGVkT3JPcHRpb25zID0gZmFsc2UpIHsKICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2M7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnZhbHVlICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgdGhyb3cgaWxsZWdhbEFyZ3VtZW50KCd2YWx1ZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgaXNUcnVzdGVkT3JPcHRpb25zID09PSAnYm9vbGVhbicpIHsKICAgICAgICAgICAgICAgIHRoaXMuaXNUcnVzdGVkID0gaXNUcnVzdGVkT3JPcHRpb25zOwogICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0VGhlbWVJY29ucyA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0SHRtbCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5pc1RydXN0ZWQgPSAoX2EgPSBpc1RydXN0ZWRPck9wdGlvbnMuaXNUcnVzdGVkKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB0aGlzLnN1cHBvcnRUaGVtZUljb25zID0gKF9iID0gaXNUcnVzdGVkT3JPcHRpb25zLnN1cHBvcnRUaGVtZUljb25zKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydEh0bWwgPSAoX2MgPSBpc1RydXN0ZWRPck9wdGlvbnMuc3VwcG9ydEh0bWwpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFwcGVuZFRleHQodmFsdWUsIG5ld2xpbmVTdHlsZSA9IDAgLyogUGFyYWdyYXBoICovKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gZXNjYXBlTWFya2Rvd25TeW50YXhUb2tlbnModGhpcy5zdXBwb3J0VGhlbWVJY29ucyA/IGVzY2FwZUljb25zKHZhbHVlKSA6IHZhbHVlKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoLyhbIFx0XSspL2csIChfbWF0Y2gsIGcxKSA9PiAnJm5ic3A7Jy5yZXBlYXQoZzEubGVuZ3RoKSkKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cPi9nbSwgJ1xcPicpCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXG4vZywgbmV3bGluZVN0eWxlID09PSAxIC8qIEJyZWFrICovID8gJ1xcXG4nIDogJ1xuXG4nKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIGFwcGVuZE1hcmtkb3duKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gdmFsdWU7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBhcHBlbmRDb2RlYmxvY2sobGFuZ0lkLCBjb2RlKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gJ1xuYGBgJzsKICAgICAgICAgICAgdGhpcy52YWx1ZSArPSBsYW5nSWQ7CiAgICAgICAgICAgIHRoaXMudmFsdWUgKz0gJ1xuJzsKICAgICAgICAgICAgdGhpcy52YWx1ZSArPSBjb2RlOwogICAgICAgICAgICB0aGlzLnZhbHVlICs9ICdcbmBgYFxuJzsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZXNjYXBlTWFya2Rvd25TeW50YXhUb2tlbnModGV4dCkgewogICAgICAgIC8vIGVzY2FwZSBtYXJrZG93biBzeW50YXggdG9rZW5zOiBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCNiYWNrc2xhc2gKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9bXFxgKl97fVtcXSgpIytcLSFdL2csICdcXCQmJyk7CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAvLyAtLS0tLS0gaW50ZXJuYWwgdXRpbAogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgdmFyIF91dGlsOwogICAgKGZ1bmN0aW9uIChfdXRpbCkgewogICAgICAgIC8qKgogICAgICAgICAqIEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIF91dGlsLnNlcnZpY2VJZHMgPSBuZXcgTWFwKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgX3V0aWwuRElfVEFSR0VUID0gJyRkaSR0YXJnZXQnOwogICAgICAgIC8qKgogICAgICAgICAqIEBpbnRlcm5hbAogICAgICAgICAqLwogICAgICAgIF91dGlsLkRJX0RFUEVOREVOQ0lFUyA9ICckZGkkZGVwZW5kZW5jaWVzJzsKICAgICAgICAvKioKICAgICAgICAgKiBAaW50ZXJuYWwKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRTZXJ2aWNlRGVwZW5kZW5jaWVzKGN0b3IpIHsKICAgICAgICAgICAgcmV0dXJuIGN0b3JbX3V0aWwuRElfREVQRU5ERU5DSUVTXSB8fCBbXTsKICAgICAgICB9CiAgICAgICAgX3V0aWwuZ2V0U2VydmljZURlcGVuZGVuY2llcyA9IGdldFNlcnZpY2VEZXBlbmRlbmNpZXM7CiAgICB9KShfdXRpbCB8fCAoX3V0aWwgPSB7fSkpOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY3JlYXRlRGVjb3JhdG9yKCdpbnN0YW50aWF0aW9uU2VydmljZScpOwogICAgZnVuY3Rpb24gc3RvcmVTZXJ2aWNlRGVwZW5kZW5jeShpZCwgdGFyZ2V0LCBpbmRleCwgb3B0aW9uYWwpIHsKICAgICAgICBpZiAodGFyZ2V0W191dGlsLkRJX1RBUkdFVF0gPT09IHRhcmdldCkgewogICAgICAgICAgICB0YXJnZXRbX3V0aWwuRElfREVQRU5ERU5DSUVTXS5wdXNoKHsgaWQsIGluZGV4LCBvcHRpb25hbCB9KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRhcmdldFtfdXRpbC5ESV9ERVBFTkRFTkNJRVNdID0gW3sgaWQsIGluZGV4LCBvcHRpb25hbCB9XTsKICAgICAgICAgICAgdGFyZ2V0W191dGlsLkRJX1RBUkdFVF0gPSB0YXJnZXQ7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUaGUgKm9ubHkqIHZhbGlkIHdheSB0byBjcmVhdGUgYSB7e1NlcnZpY2VJZGVudGlmaWVyfX0uCiAgICAgKi8KICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZURlY29yYXRvcihzZXJ2aWNlSWQpIHsKICAgICAgICBpZiAoX3V0aWwuc2VydmljZUlkcy5oYXMoc2VydmljZUlkKSkgewogICAgICAgICAgICByZXR1cm4gX3V0aWwuc2VydmljZUlkcy5nZXQoc2VydmljZUlkKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgaWQgPSBmdW5jdGlvbiAodGFyZ2V0LCBrZXksIGluZGV4KSB7CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoICE9PSAzKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0BJU2VydmljZU5hbWUtZGVjb3JhdG9yIGNhbiBvbmx5IGJlIHVzZWQgdG8gZGVjb3JhdGUgYSBwYXJhbWV0ZXInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdG9yZVNlcnZpY2VEZXBlbmRlbmN5KGlkLCB0YXJnZXQsIGluZGV4LCBmYWxzZSk7CiAgICAgICAgfTsKICAgICAgICBpZC50b1N0cmluZyA9ICgpID0+IHNlcnZpY2VJZDsKICAgICAgICBfdXRpbC5zZXJ2aWNlSWRzLnNldChzZXJ2aWNlSWQsIGlkKTsKICAgICAgICByZXR1cm4gaWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY3JlYXRlRGVjb3JhdG9yKCdsb2dTZXJ2aWNlJyk7CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjcmVhdGVEZWNvcmF0b3IoJ2xvZ2dlclNlcnZpY2UnKTsKICAgIHZhciBMb2dMZXZlbDsKICAgIChmdW5jdGlvbiAoTG9nTGV2ZWwpIHsKICAgICAgICBMb2dMZXZlbFtMb2dMZXZlbFsiVHJhY2UiXSA9IDBdID0gIlRyYWNlIjsKICAgICAgICBMb2dMZXZlbFtMb2dMZXZlbFsiRGVidWciXSA9IDFdID0gIkRlYnVnIjsKICAgICAgICBMb2dMZXZlbFtMb2dMZXZlbFsiSW5mbyJdID0gMl0gPSAiSW5mbyI7CiAgICAgICAgTG9nTGV2ZWxbTG9nTGV2ZWxbIldhcm5pbmciXSA9IDNdID0gIldhcm5pbmciOwogICAgICAgIExvZ0xldmVsW0xvZ0xldmVsWyJFcnJvciJdID0gNF0gPSAiRXJyb3IiOwogICAgICAgIExvZ0xldmVsW0xvZ0xldmVsWyJDcml0aWNhbCJdID0gNV0gPSAiQ3JpdGljYWwiOwogICAgICAgIExvZ0xldmVsW0xvZ0xldmVsWyJPZmYiXSA9IDZdID0gIk9mZiI7CiAgICB9KShMb2dMZXZlbCB8fCAoTG9nTGV2ZWwgPSB7fSkpOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgY29uc3QgREVGQVVMVF9MT0dfTEVWRUwgPSBMb2dMZXZlbC5JbmZvOwogICAgY2xhc3MgQWJzdHJhY3RMb2dnZXIgZXh0ZW5kcyBEaXNwb3NhYmxlIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5sZXZlbCA9IERFRkFVTFRfTE9HX0xFVkVMOwogICAgICAgICAgICB0aGlzLl9vbkRpZENoYW5nZUxvZ0xldmVsID0gdGhpcy5fcmVnaXN0ZXIobmV3IEVtaXR0ZXIoKSk7CiAgICAgICAgICAgIHRoaXMub25EaWRDaGFuZ2VMb2dMZXZlbCA9IHRoaXMuX29uRGlkQ2hhbmdlTG9nTGV2ZWwuZXZlbnQ7CiAgICAgICAgfQogICAgICAgIHNldExldmVsKGxldmVsKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmxldmVsICE9PSBsZXZlbCkgewogICAgICAgICAgICAgICAgdGhpcy5sZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgICAgdGhpcy5fb25EaWRDaGFuZ2VMb2dMZXZlbC5maXJlKHRoaXMubGV2ZWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdldExldmVsKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5sZXZlbDsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBDb25zb2xlTG9nZ2VyIGV4dGVuZHMgQWJzdHJhY3RMb2dnZXIgewogICAgICAgIGNvbnN0cnVjdG9yKGxvZ0xldmVsID0gREVGQVVMVF9MT0dfTEVWRUwpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5zZXRMZXZlbChsb2dMZXZlbCk7CiAgICAgICAgfQogICAgICAgIHRyYWNlKG1lc3NhZ2UsIC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TGV2ZWwoKSA8PSBMb2dMZXZlbC5UcmFjZSkgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyVjVFJBQ0UnLCAnY29sb3I6ICM4ODgnLCBtZXNzYWdlLCAuLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkZWJ1ZyhtZXNzYWdlLCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmdldExldmVsKCkgPD0gTG9nTGV2ZWwuRGVidWcpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCclY0RFQlVHJywgJ2JhY2tncm91bmQ6ICNlZWU7IGNvbG9yOiAjODg4JywgbWVzc2FnZSwgLi4uYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW5mbyhtZXNzYWdlLCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmdldExldmVsKCkgPD0gTG9nTGV2ZWwuSW5mbykgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyVjIElORk8nLCAnY29sb3I6ICMzM2YnLCBtZXNzYWdlLCAuLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3YXJuKG1lc3NhZ2UsIC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TGV2ZWwoKSA8PSBMb2dMZXZlbC5XYXJuaW5nKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnJWMgV0FSTicsICdjb2xvcjogIzk5MycsIG1lc3NhZ2UsIC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVycm9yKG1lc3NhZ2UsIC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZ2V0TGV2ZWwoKSA8PSBMb2dMZXZlbC5FcnJvcikgewogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyVjICBFUlInLCAnY29sb3I6ICNmMzMnLCBtZXNzYWdlLCAuLi5hcmdzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjcml0aWNhbChtZXNzYWdlLCAuLi5hcmdzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmdldExldmVsKCkgPD0gTG9nTGV2ZWwuQ3JpdGljYWwpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCclY0NSSVRJJywgJ2JhY2tncm91bmQ6ICNmMzM7IGNvbG9yOiB3aGl0ZScsIG1lc3NhZ2UsIC4uLmFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgIC8vIG5vb3AKICAgICAgICB9CiAgICAgICAgZmx1c2goKSB7CiAgICAgICAgICAgIC8vIG5vb3AKICAgICAgICB9CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjbGFzcyBLZXlNb2QgewogICAgICAgIHN0YXRpYyBjaG9yZChmaXJzdFBhcnQsIHNlY29uZFBhcnQpIHsKICAgICAgICAgICAgcmV0dXJuIEtleUNob3JkKGZpcnN0UGFydCwgc2Vjb25kUGFydCk7CiAgICAgICAgfQogICAgfQogICAgS2V5TW9kLkN0cmxDbWQgPSAyMDQ4IC8qIEN0cmxDbWQgKi87CiAgICBLZXlNb2QuU2hpZnQgPSAxMDI0IC8qIFNoaWZ0ICovOwogICAgS2V5TW9kLkFsdCA9IDUxMiAvKiBBbHQgKi87CiAgICBLZXlNb2QuV2luQ3RybCA9IDI1NiAvKiBXaW5DdHJsICovOwogICAgZnVuY3Rpb24gY3JlYXRlTW9uYWNvQmFzZUFQSSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBlZGl0b3I6IHVuZGVmaW5lZCwKICAgICAgICAgICAgbGFuZ3VhZ2VzOiB1bmRlZmluZWQsCiAgICAgICAgICAgIGV4dHJhOiB1bmRlZmluZWQsCiAgICAgICAgICAgIENhbmNlbGxhdGlvblRva2VuU291cmNlOiBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSwKICAgICAgICAgICAgRW1pdHRlcjogRW1pdHRlciwKICAgICAgICAgICAgS2V5Q29kZTogS2V5Q29kZSwKICAgICAgICAgICAgS2V5TW9kOiBLZXlNb2QsCiAgICAgICAgICAgIFBvc2l0aW9uOiBQb3NpdGlvbiQxLAogICAgICAgICAgICBSYW5nZTogUmFuZ2UkMSwKICAgICAgICAgICAgU2VsZWN0aW9uOiBTZWxlY3Rpb24sCiAgICAgICAgICAgIFVyaTogVVJJJDEsCiAgICAgICAgICAgIFRva2VuOiBUb2tlbiwKICAgICAgICAgICAgLy8gY2xhc3NlcwogICAgICAgICAgICBNYXJrZG93blN0cmluZzogTWFya2Rvd25TdHJpbmcsCiAgICAgICAgICAgIERpc3Bvc2FibGU6IERpc3Bvc2FibGUsCiAgICAgICAgICAgIERpc3Bvc2FibGVTdG9yZTogRGlzcG9zYWJsZVN0b3JlLAogICAgICAgICAgICBFcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlciwKICAgICAgICAgICAgQWJzdHJhY3RMb2dnZXI6IEFic3RyYWN0TG9nZ2VyLAogICAgICAgICAgICBDb25zb2xlTG9nZ2VyOiBDb25zb2xlTG9nZ2VyLAogICAgICAgICAgICBUb2tlbml6YXRpb25SZXN1bHQ6IFRva2VuaXphdGlvblJlc3VsdCwKICAgICAgICAgICAgVG9rZW5pemF0aW9uUmVzdWx0MjogVG9rZW5pemF0aW9uUmVzdWx0MiwKICAgICAgICAgICAgLy8gZW51bXMKICAgICAgICAgICAgU2VsZWN0aW9uRGlyZWN0aW9uOiBTZWxlY3Rpb25EaXJlY3Rpb24sCiAgICAgICAgICAgIE1hcmtlclNldmVyaXR5OiBNYXJrZXJTZXZlcml0eSwKICAgICAgICAgICAgTWFya2VyVGFnOiBNYXJrZXJUYWcsCiAgICAgICAgICAgIE1hcmtkb3duU3RyaW5nVGV4dE5ld2xpbmVTdHlsZTogTWFya2Rvd25TdHJpbmdUZXh0TmV3bGluZVN0eWxlLAogICAgICAgICAgICBMb2dMZXZlbDogTG9nTGV2ZWwkMSwKICAgICAgICAgICAgLy8gQ29uc3RhbnRzCiAgICAgICAgICAgIGVycm9ySGFuZGxlcgogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBWZXJ0aWNhbCBMYW5lIGluIHRoZSBvdmVydmlldyBydWxlciBvZiB0aGUgZWRpdG9yLgogICAgICovCiAgICB2YXIgT3ZlcnZpZXdSdWxlckxhbmU7CiAgICAoZnVuY3Rpb24gKE92ZXJ2aWV3UnVsZXJMYW5lKSB7CiAgICAgICAgT3ZlcnZpZXdSdWxlckxhbmVbT3ZlcnZpZXdSdWxlckxhbmVbIkxlZnQiXSA9IDFdID0gIkxlZnQiOwogICAgICAgIE92ZXJ2aWV3UnVsZXJMYW5lW092ZXJ2aWV3UnVsZXJMYW5lWyJDZW50ZXIiXSA9IDJdID0gIkNlbnRlciI7CiAgICAgICAgT3ZlcnZpZXdSdWxlckxhbmVbT3ZlcnZpZXdSdWxlckxhbmVbIlJpZ2h0Il0gPSA0XSA9ICJSaWdodCI7CiAgICAgICAgT3ZlcnZpZXdSdWxlckxhbmVbT3ZlcnZpZXdSdWxlckxhbmVbIkZ1bGwiXSA9IDddID0gIkZ1bGwiOwogICAgfSkoT3ZlcnZpZXdSdWxlckxhbmUgfHwgKE92ZXJ2aWV3UnVsZXJMYW5lID0ge30pKTsKICAgIC8qKgogICAgICogUG9zaXRpb24gaW4gdGhlIG1pbmltYXAgdG8gcmVuZGVyIHRoZSBkZWNvcmF0aW9uLgogICAgICovCiAgICB2YXIgTWluaW1hcFBvc2l0aW9uOwogICAgKGZ1bmN0aW9uIChNaW5pbWFwUG9zaXRpb24pIHsKICAgICAgICBNaW5pbWFwUG9zaXRpb25bTWluaW1hcFBvc2l0aW9uWyJJbmxpbmUiXSA9IDFdID0gIklubGluZSI7CiAgICAgICAgTWluaW1hcFBvc2l0aW9uW01pbmltYXBQb3NpdGlvblsiR3V0dGVyIl0gPSAyXSA9ICJHdXR0ZXIiOwogICAgfSkoTWluaW1hcFBvc2l0aW9uIHx8IChNaW5pbWFwUG9zaXRpb24gPSB7fSkpOwogICAgLyoqCiAgICAgKiBAaW50ZXJuYWwKICAgICAqLwogICAgdmFyIEhvcml6b250YWxHdWlkZXNTdGF0ZTsKICAgIChmdW5jdGlvbiAoSG9yaXpvbnRhbEd1aWRlc1N0YXRlKSB7CiAgICAgICAgSG9yaXpvbnRhbEd1aWRlc1N0YXRlW0hvcml6b250YWxHdWlkZXNTdGF0ZVsiRGlzYWJsZWQiXSA9IDBdID0gIkRpc2FibGVkIjsKICAgICAgICBIb3Jpem9udGFsR3VpZGVzU3RhdGVbSG9yaXpvbnRhbEd1aWRlc1N0YXRlWyJFbmFibGVkRm9yQWN0aXZlIl0gPSAxXSA9ICJFbmFibGVkRm9yQWN0aXZlIjsKICAgICAgICBIb3Jpem9udGFsR3VpZGVzU3RhdGVbSG9yaXpvbnRhbEd1aWRlc1N0YXRlWyJFbmFibGVkIl0gPSAyXSA9ICJFbmFibGVkIjsKICAgIH0pKEhvcml6b250YWxHdWlkZXNTdGF0ZSB8fCAoSG9yaXpvbnRhbEd1aWRlc1N0YXRlID0ge30pKTsKCiAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uCiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGZ1bmN0aW9uIGxlZnRJc1dvcmRCb3VuZGF5KHdvcmRTZXBhcmF0b3JzLCB0ZXh0LCB0ZXh0TGVuZ3RoLCBtYXRjaFN0YXJ0SW5kZXgsIG1hdGNoTGVuZ3RoKSB7CiAgICAgICAgaWYgKG1hdGNoU3RhcnRJbmRleCA9PT0gMCkgewogICAgICAgICAgICAvLyBNYXRjaCBzdGFydHMgYXQgc3RhcnQgb2Ygc3RyaW5nCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBjaGFyQmVmb3JlID0gdGV4dC5jaGFyQ29kZUF0KG1hdGNoU3RhcnRJbmRleCAtIDEpOwogICAgICAgIGlmICh3b3JkU2VwYXJhdG9ycy5nZXQoY2hhckJlZm9yZSkgIT09IDAgLyogUmVndWxhciAqLykgewogICAgICAgICAgICAvLyBUaGUgY2hhcmFjdGVyIGJlZm9yZSB0aGUgbWF0Y2ggaXMgYSB3b3JkIHNlcGFyYXRvcgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNoYXJCZWZvcmUgPT09IDEzIC8qIENhcnJpYWdlUmV0dXJuICovIHx8IGNoYXJCZWZvcmUgPT09IDEwIC8qIExpbmVGZWVkICovKSB7CiAgICAgICAgICAgIC8vIFRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBtYXRjaCBpcyBsaW5lIGJyZWFrIG9yIGNhcnJpYWdlIHJldHVybi4KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChtYXRjaExlbmd0aCA+IDApIHsKICAgICAgICAgICAgY29uc3QgZmlyc3RDaGFySW5NYXRjaCA9IHRleHQuY2hhckNvZGVBdChtYXRjaFN0YXJ0SW5kZXgpOwogICAgICAgICAgICBpZiAod29yZFNlcGFyYXRvcnMuZ2V0KGZpcnN0Q2hhckluTWF0Y2gpICE9PSAwIC8qIFJlZ3VsYXIgKi8pIHsKICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBjaGFyYWN0ZXIgaW5zaWRlIHRoZSBtYXRjaCBpcyBhIHdvcmQgc2VwYXJhdG9yCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiByaWdodElzV29yZEJvdW5kYXkod29yZFNlcGFyYXRvcnMsIHRleHQsIHRleHRMZW5ndGgsIG1hdGNoU3RhcnRJbmRleCwgbWF0Y2hMZW5ndGgpIHsKICAgICAgICBpZiAobWF0Y2hTdGFydEluZGV4ICsgbWF0Y2hMZW5ndGggPT09IHRleHRMZW5ndGgpIHsKICAgICAgICAgICAgLy8gTWF0Y2ggZW5kcyBhdCBlbmQgb2Ygc3RyaW5nCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBjb25zdCBjaGFyQWZ0ZXIgPSB0ZXh0LmNoYXJDb2RlQXQobWF0Y2hTdGFydEluZGV4ICsgbWF0Y2hMZW5ndGgpOwogICAgICAgIGlmICh3b3JkU2VwYXJhdG9ycy5nZXQoY2hhckFmdGVyKSAhPT0gMCAvKiBSZWd1bGFyICovKSB7CiAgICAgICAgICAgIC8vIFRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIG1hdGNoIGlzIGEgd29yZCBzZXBhcmF0b3IKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChjaGFyQWZ0ZXIgPT09IDEzIC8qIENhcnJpYWdlUmV0dXJuICovIHx8IGNoYXJBZnRlciA9PT0gMTAgLyogTGluZUZlZWQgKi8pIHsKICAgICAgICAgICAgLy8gVGhlIGNoYXJhY3RlciBhZnRlciB0aGUgbWF0Y2ggaXMgbGluZSBicmVhayBvciBjYXJyaWFnZSByZXR1cm4uCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAobWF0Y2hMZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGNvbnN0IGxhc3RDaGFySW5NYXRjaCA9IHRleHQuY2hhckNvZGVBdChtYXRjaFN0YXJ0SW5kZXggKyBtYXRjaExlbmd0aCAtIDEpOwogICAgICAgICAgICBpZiAod29yZFNlcGFyYXRvcnMuZ2V0KGxhc3RDaGFySW5NYXRjaCkgIT09IDAgLyogUmVndWxhciAqLykgewogICAgICAgICAgICAgICAgLy8gVGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBtYXRjaCBpcyBhIHdvcmQgc2VwYXJhdG9yCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiBpc1ZhbGlkTWF0Y2god29yZFNlcGFyYXRvcnMsIHRleHQsIHRleHRMZW5ndGgsIG1hdGNoU3RhcnRJbmRleCwgbWF0Y2hMZW5ndGgpIHsKICAgICAgICByZXR1cm4gKGxlZnRJc1dvcmRCb3VuZGF5KHdvcmRTZXBhcmF0b3JzLCB0ZXh0LCB0ZXh0TGVuZ3RoLCBtYXRjaFN0YXJ0SW5kZXgsIG1hdGNoTGVuZ3RoKQogICAgICAgICAgICAmJiByaWdodElzV29yZEJvdW5kYXkod29yZFNlcGFyYXRvcnMsIHRleHQsIHRleHRMZW5ndGgsIG1hdGNoU3RhcnRJbmRleCwgbWF0Y2hMZW5ndGgpKTsKICAgIH0KICAgIGNsYXNzIFNlYXJjaGVyIHsKICAgICAgICBjb25zdHJ1Y3Rvcih3b3JkU2VwYXJhdG9ycywgc2VhcmNoUmVnZXgpIHsKICAgICAgICAgICAgdGhpcy5fd29yZFNlcGFyYXRvcnMgPSB3b3JkU2VwYXJhdG9yczsKICAgICAgICAgICAgdGhpcy5fc2VhcmNoUmVnZXggPSBzZWFyY2hSZWdleDsKICAgICAgICAgICAgdGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleCA9IC0xOwogICAgICAgICAgICB0aGlzLl9wcmV2TWF0Y2hMZW5ndGggPSAwOwogICAgICAgIH0KICAgICAgICByZXNldChsYXN0SW5kZXgpIHsKICAgICAgICAgICAgdGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4ID0gbGFzdEluZGV4OwogICAgICAgICAgICB0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4ID0gLTE7CiAgICAgICAgICAgIHRoaXMuX3ByZXZNYXRjaExlbmd0aCA9IDA7CiAgICAgICAgfQogICAgICAgIG5leHQodGV4dCkgewogICAgICAgICAgICBjb25zdCB0ZXh0TGVuZ3RoID0gdGV4dC5sZW5ndGg7CiAgICAgICAgICAgIGxldCBtOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleCArIHRoaXMuX3ByZXZNYXRjaExlbmd0aCA9PT0gdGV4dExlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIC8vIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgbGluZQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbSA9IHRoaXMuX3NlYXJjaFJlZ2V4LmV4ZWModGV4dCk7CiAgICAgICAgICAgICAgICBpZiAoIW0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoU3RhcnRJbmRleCA9IG0uaW5kZXg7CiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaExlbmd0aCA9IG1bMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoU3RhcnRJbmRleCA9PT0gdGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleCAmJiBtYXRjaExlbmd0aCA9PT0gdGhpcy5fcHJldk1hdGNoTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoTGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzZWFyY2ggcmVzdWx0IGlzIGFuIGVtcHR5IHN0cmluZyBhbmQgd29uJ3QgYWR2YW5jZSBgcmVnZXgubGFzdEluZGV4YCwgc28gYHJlZ2V4LmV4ZWNgIHdpbGwgc3R1Y2sgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhdHRlbXB0IHRvIHJlY292ZXIgZnJvbSB0aGF0IGJ5IGFkdmFuY2luZyBieSB0d28gaWYgc3Vycm9nYXRlIHBhaXIgZm91bmQgYW5kIGJ5IG9uZSBvdGhlcndpc2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdldE5leHRDb2RlUG9pbnQodGV4dCwgdGV4dExlbmd0aCwgdGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4KSA+IDB4RkZGRikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4ICs9IDI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWFyY2hSZWdleC5sYXN0SW5kZXggKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gRXhpdCBlYXJseSBpZiB0aGUgcmVnZXggbWF0Y2hlcyB0aGUgc2FtZSByYW5nZSB0d2ljZQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleCA9IG1hdGNoU3RhcnRJbmRleDsKICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZNYXRjaExlbmd0aCA9IG1hdGNoTGVuZ3RoOwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl93b3JkU2VwYXJhdG9ycyB8fCBpc1ZhbGlkTWF0Y2godGhpcy5fd29yZFNlcGFyYXRvcnMsIHRleHQsIHRleHRMZW5ndGgsIG1hdGNoU3RhcnRJbmRleCwgbWF0Y2hMZW5ndGgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gd2hpbGUgKG0pOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLgogICAgICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICBjbGFzcyBVbmljb2RlVGV4dE1vZGVsSGlnaGxpZ2h0ZXIgewogICAgICAgIHN0YXRpYyBjb21wdXRlVW5pY29kZUhpZ2hsaWdodHMobW9kZWwsIG9wdGlvbnMsIHJhbmdlKSB7CiAgICAgICAgICAgIGNvbnN0IHN0YXJ0TGluZSA9IHJhbmdlID8gcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIDogMTsKICAgICAgICAgICAgY29uc3QgZW5kTGluZSA9IHJhbmdlID8gcmFuZ2UuZW5kTGluZU51bWJlciA6IG1vZGVsLmdldExpbmVDb3VudCgpOwogICAgICAgICAgICBjb25zdCBjb2RlUG9pbnRIaWdobGlnaHRlciA9IG5ldyBDb2RlUG9pbnRIaWdobGlnaHRlcihvcHRpb25zKTsKICAgICAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IGNvZGVQb2ludEhpZ2hsaWdodGVyLmdldENhbmRpZGF0ZUNvZGVQb2ludHMoKTsKICAgICAgICAgICAgbGV0IHJlZ2V4OwogICAgICAgICAgICBpZiAoY2FuZGlkYXRlcyA9PT0gJ2FsbE5vbkJhc2ljQXNjaWknKSB7CiAgICAgICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAoJ1teXFx0XFxuXFxyXFx4MjAtXFx4N0VdJywgJ2cnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cChgJHtidWlsZFJlZ0V4cENoYXJDbGFzc0V4cHIoQXJyYXkuZnJvbShjYW5kaWRhdGVzKSl9YCwgJ2cnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzZWFyY2hlciA9IG5ldyBTZWFyY2hlcihudWxsLCByZWdleCk7CiAgICAgICAgICAgIGNvbnN0IHJhbmdlcyA9IFtdOwogICAgICAgICAgICBsZXQgaGFzTW9yZSA9IGZhbHNlOwogICAgICAgICAgICBsZXQgbTsKICAgICAgICAgICAgbGV0IGFtYmlndW91c0NoYXJhY3RlckNvdW50ID0gMDsKICAgICAgICAgICAgbGV0IGludmlzaWJsZUNoYXJhY3RlckNvdW50ID0gMDsKICAgICAgICAgICAgbGV0IG5vbkJhc2ljQXNjaWlDaGFyYWN0ZXJDb3VudCA9IDA7CiAgICAgICAgICAgIGZvckxvb3A6IGZvciAobGV0IGxpbmVOdW1iZXIgPSBzdGFydExpbmUsIGxpbmVDb3VudCA9IGVuZExpbmU7IGxpbmVOdW1iZXIgPD0gbGluZUNvdW50OyBsaW5lTnVtYmVyKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpbmVDb250ZW50ID0gbW9kZWwuZ2V0TGluZUNvbnRlbnQobGluZU51bWJlcik7CiAgICAgICAgICAgICAgICBjb25zdCBsaW5lTGVuZ3RoID0gbGluZUNvbnRlbnQubGVuZ3RoOwogICAgICAgICAgICAgICAgLy8gUmVzZXQgcmVnZXggdG8gc2VhcmNoIGZyb20gdGhlIGJlZ2lubmluZwogICAgICAgICAgICAgICAgc2VhcmNoZXIucmVzZXQoMCk7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgbSA9IHNlYXJjaGVyLm5leHQobGluZUNvbnRlbnQpOwogICAgICAgICAgICAgICAgICAgIGlmIChtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gbS5pbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVuZEluZGV4ID0gbS5pbmRleCArIG1bMF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRlbmQgcmFuZ2UgdG8gZW50aXJlIGNvZGUgcG9pbnQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0SW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyQ29kZUJlZm9yZSA9IGxpbmVDb250ZW50LmNoYXJDb2RlQXQoc3RhcnRJbmRleCAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZShjaGFyQ29kZUJlZm9yZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEluZGV4LS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4ICsgMSA8IGxpbmVMZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXJDb2RlQmVmb3JlID0gbGluZUNvbnRlbnQuY2hhckNvZGVBdChlbmRJbmRleCAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSGlnaFN1cnJvZ2F0ZShjaGFyQ29kZUJlZm9yZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRJbmRleCsrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ciA9IGxpbmVDb250ZW50LnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZ2hsaWdodFJlYXNvbiA9IGNvZGVQb2ludEhpZ2hsaWdodGVyLnNob3VsZEhpZ2hsaWdodE5vbkJhc2ljQVNDSUkoc3RyKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpZ2hsaWdodFJlYXNvbiAhPT0gMCAvKiBOb25lICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlnaGxpZ2h0UmVhc29uID09PSAzIC8qIEFtYmlndW91cyAqLykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtYmlndW91c0NoYXJhY3RlckNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoaWdobGlnaHRSZWFzb24gPT09IDIgLyogSW52aXNpYmxlICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52aXNpYmxlQ2hhcmFjdGVyQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhpZ2hsaWdodFJlYXNvbiA9PT0gMSAvKiBOb25CYXNpY0FTQ0lJICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uQmFzaWNBc2NpaUNoYXJhY3RlckNvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnROZXZlcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUFYX1JFU1VMVF9MRU5HVEggPSAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlcy5sZW5ndGggPj0gTUFYX1JFU1VMVF9MRU5HVEgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBmb3JMb29wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLnB1c2gobmV3IFJhbmdlJDEobGluZU51bWJlciwgc3RhcnRJbmRleCArIDEsIGxpbmVOdW1iZXIsIGVuZEluZGV4ICsgMSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSB3aGlsZSAobSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJhbmdlcywKICAgICAgICAgICAgICAgIGhhc01vcmUsCiAgICAgICAgICAgICAgICBhbWJpZ3VvdXNDaGFyYWN0ZXJDb3VudCwKICAgICAgICAgICAgICAgIGludmlzaWJsZUNoYXJhY3RlckNvdW50LAogICAgICAgICAgICAgICAgbm9uQmFzaWNBc2NpaUNoYXJhY3RlckNvdW50CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBjb21wdXRlVW5pY29kZUhpZ2hsaWdodFJlYXNvbihjaGFyLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGNvbnN0IGNvZGVQb2ludEhpZ2hsaWdodGVyID0gbmV3IENvZGVQb2ludEhpZ2hsaWdodGVyKG9wdGlvbnMpOwogICAgICAgICAgICBjb25zdCByZWFzb24gPSBjb2RlUG9pbnRIaWdobGlnaHRlci5zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKGNoYXIpOwogICAgICAgICAgICBzd2l0Y2ggKHJlYXNvbikgewogICAgICAgICAgICAgICAgY2FzZSAwIC8qIE5vbmUgKi86CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICBjYXNlIDIgLyogSW52aXNpYmxlICovOgogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGtpbmQ6IDEgLyogSW52aXNpYmxlICovIH07CiAgICAgICAgICAgICAgICBjYXNlIDMgLyogQW1iaWd1b3VzICovOgogICAgICAgICAgICAgICAgICAgIGNvbnN0IHByaW1hcnlDb25mdXNhYmxlID0gQW1iaWd1b3VzQ2hhcmFjdGVycy5nZXRQcmltYXJ5Q29uZnVzYWJsZShjaGFyLmNvZGVQb2ludEF0KDApKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBraW5kOiAwIC8qIEFtYmlndW91cyAqLywgY29uZnVzYWJsZVdpdGg6IFN0cmluZy5mcm9tQ29kZVBvaW50KHByaW1hcnlDb25mdXNhYmxlKSB9OwogICAgICAgICAgICAgICAgY2FzZSAxIC8qIE5vbkJhc2ljQVNDSUkgKi86CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsga2luZDogMiAvKiBOb25CYXNpY0FzY2lpICovIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBidWlsZFJlZ0V4cENoYXJDbGFzc0V4cHIoY29kZVBvaW50cywgZmxhZ3MpIHsKICAgICAgICBjb25zdCBzcmMgPSBgWyR7ZXNjYXBlUmVnRXhwQ2hhcmFjdGVycyhjb2RlUG9pbnRzLm1hcCgoaSkgPT4gU3RyaW5nLmZyb21Db2RlUG9pbnQoaSkpLmpvaW4oJycpKX1dYDsKICAgICAgICByZXR1cm4gc3JjOwogICAgfQogICAgY2xhc3MgQ29kZVBvaW50SGlnaGxpZ2h0ZXIgewogICAgICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgdGhpcy5hbGxvd2VkQ29kZVBvaW50cyA9IG5ldyBTZXQob3B0aW9ucy5hbGxvd2VkQ29kZVBvaW50cyk7CiAgICAgICAgfQogICAgICAgIGdldENhbmRpZGF0ZUNvZGVQb2ludHMoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubm9uQmFzaWNBU0NJSSkgewogICAgICAgICAgICAgICAgcmV0dXJuICdhbGxOb25CYXNpY0FzY2lpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuaW52aXNpYmxlQ2hhcmFjdGVycykgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiBJbnZpc2libGVDaGFyYWN0ZXJzLmNvZGVQb2ludHMpIHsKICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKGNwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFtYmlndW91c0NoYXJhY3RlcnMpIHsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgQW1iaWd1b3VzQ2hhcmFjdGVycy5nZXRQcmltYXJ5Q29uZnVzYWJsZUNvZGVQb2ludHMoKSkgewogICAgICAgICAgICAgICAgICAgIHNldC5hZGQoY3ApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgdGhpcy5hbGxvd2VkQ29kZVBvaW50cykgewogICAgICAgICAgICAgICAgc2V0LmRlbGV0ZShjcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNldDsKICAgICAgICB9CiAgICAgICAgc2hvdWxkSGlnaGxpZ2h0Tm9uQmFzaWNBU0NJSShjaGFyYWN0ZXIpIHsKICAgICAgICAgICAgY29uc3QgY29kZVBvaW50ID0gY2hhcmFjdGVyLmNvZGVQb2ludEF0KDApOwogICAgICAgICAgICBpZiAodGhpcy5hbGxvd2VkQ29kZVBvaW50cy5oYXMoY29kZVBvaW50KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDAgLyogTm9uZSAqLzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm5vbkJhc2ljQVNDSUkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxIC8qIE5vbkJhc2ljQVNDSUkgKi87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5pbnZpc2libGVDaGFyYWN0ZXJzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBpc0FsbG93ZWRJbnZpc2libGVDaGFyYWN0ZXIgPSBjaGFyYWN0ZXIgPT09ICcgJyB8fCBjaGFyYWN0ZXIgPT09ICdcbicgfHwgY2hhcmFjdGVyID09PSAnXHQnOwogICAgICAgICAgICAgICAgLy8gVE9ETyBjaGVjayBmb3IgZW1vamlzCiAgICAgICAgICAgICAgICBpZiAoIWlzQWxsb3dlZEludmlzaWJsZUNoYXJhY3RlciAmJiBJbnZpc2libGVDaGFyYWN0ZXJzLmlzSW52aXNpYmxlQ2hhcmFjdGVyKGNvZGVQb2ludCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMiAvKiBJbnZpc2libGUgKi87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbWJpZ3VvdXNDaGFyYWN0ZXJzKSB7CiAgICAgICAgICAgICAgICBpZiAoQW1iaWd1b3VzQ2hhcmFjdGVycy5pc0FtYmlndW91cyhjb2RlUG9pbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDMgLyogQW1iaWd1b3VzICovOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAwIC8qIE5vbmUgKi87CiAgICAgICAgfQogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgdmFyIF9fYXdhaXRlciA9ICh1bmRlZmluZWQgJiYgdW5kZWZpbmVkLl9fYXdhaXRlcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgewogICAgICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfQogICAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH0KICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOwogICAgICAgIH0pOwogICAgfTsKICAgIC8qKgogICAgICogQGludGVybmFsCiAgICAgKi8KICAgIGNsYXNzIE1pcnJvck1vZGVsIGV4dGVuZHMgTWlycm9yVGV4dE1vZGVsIHsKICAgICAgICBnZXQgdXJpKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdXJpOwogICAgICAgIH0KICAgICAgICBnZXQgZW9sKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZW9sOwogICAgICAgIH0KICAgICAgICBnZXRWYWx1ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VGV4dCgpOwogICAgICAgIH0KICAgICAgICBnZXRMaW5lc0NvbnRlbnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW5lcy5zbGljZSgwKTsKICAgICAgICB9CiAgICAgICAgZ2V0TGluZUNvdW50KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbGluZXMubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBnZXRMaW5lQ29udGVudChsaW5lTnVtYmVyKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9saW5lc1tsaW5lTnVtYmVyIC0gMV07CiAgICAgICAgfQogICAgICAgIGdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uLCB3b3JkRGVmaW5pdGlvbikgewogICAgICAgICAgICBsZXQgd29yZEF0VGV4dCA9IGdldFdvcmRBdFRleHQocG9zaXRpb24uY29sdW1uLCBlbnN1cmVWYWxpZFdvcmREZWZpbml0aW9uKHdvcmREZWZpbml0aW9uKSwgdGhpcy5fbGluZXNbcG9zaXRpb24ubGluZU51bWJlciAtIDFdLCAwKTsKICAgICAgICAgICAgaWYgKHdvcmRBdFRleHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UkMShwb3NpdGlvbi5saW5lTnVtYmVyLCB3b3JkQXRUZXh0LnN0YXJ0Q29sdW1uLCBwb3NpdGlvbi5saW5lTnVtYmVyLCB3b3JkQXRUZXh0LmVuZENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHdvcmRzKHdvcmREZWZpbml0aW9uKSB7CiAgICAgICAgICAgIGNvbnN0IGxpbmVzID0gdGhpcy5fbGluZXM7CiAgICAgICAgICAgIGNvbnN0IHdvcmRlbml6ZSA9IHRoaXMuX3dvcmRlbml6ZS5iaW5kKHRoaXMpOwogICAgICAgICAgICBsZXQgbGluZU51bWJlciA9IDA7CiAgICAgICAgICAgIGxldCBsaW5lVGV4dCA9ICcnOwogICAgICAgICAgICBsZXQgd29yZFJhbmdlc0lkeCA9IDA7CiAgICAgICAgICAgIGxldCB3b3JkUmFuZ2VzID0gW107CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdvcmRSYW5nZXNJZHggPCB3b3JkUmFuZ2VzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBsaW5lVGV4dC5zdWJzdHJpbmcod29yZFJhbmdlc1t3b3JkUmFuZ2VzSWR4XS5zdGFydCwgd29yZFJhbmdlc1t3b3JkUmFuZ2VzSWR4XS5lbmQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZFJhbmdlc0lkeCArPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZU51bWJlciA8IGxpbmVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVUZXh0ID0gbGluZXNbbGluZU51bWJlcl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZFJhbmdlcyA9IHdvcmRlbml6ZShsaW5lVGV4dCwgd29yZERlZmluaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRSYW5nZXNJZHggPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgKz0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBnZXRMaW5lV29yZHMobGluZU51bWJlciwgd29yZERlZmluaXRpb24pIHsKICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLl9saW5lc1tsaW5lTnVtYmVyIC0gMV07CiAgICAgICAgICAgIGxldCByYW5nZXMgPSB0aGlzLl93b3JkZW5pemUoY29udGVudCwgd29yZERlZmluaXRpb24pOwogICAgICAgICAgICBsZXQgd29yZHMgPSBbXTsKICAgICAgICAgICAgZm9yIChjb25zdCByYW5nZSBvZiByYW5nZXMpIHsKICAgICAgICAgICAgICAgIHdvcmRzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHdvcmQ6IGNvbnRlbnQuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpLAogICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiByYW5nZS5zdGFydCArIDEsCiAgICAgICAgICAgICAgICAgICAgZW5kQ29sdW1uOiByYW5nZS5lbmQgKyAxCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gd29yZHM7CiAgICAgICAgfQogICAgICAgIF93b3JkZW5pemUoY29udGVudCwgd29yZERlZmluaXRpb24pIHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgICAgIGxldCBtYXRjaDsKICAgICAgICAgICAgd29yZERlZmluaXRpb24ubGFzdEluZGV4ID0gMDsgLy8gcmVzZXQgbGFzdEluZGV4IGp1c3QgdG8gYmUgc3VyZQogICAgICAgICAgICB3aGlsZSAobWF0Y2ggPSB3b3JkRGVmaW5pdGlvbi5leGVjKGNvbnRlbnQpKSB7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMF0ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaXQgZGlkIG1hdGNoIHRoZSBlbXB0eSBzdHJpbmcKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgc3RhcnQ6IG1hdGNoLmluZGV4LCBlbmQ6IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGdldFZhbHVlSW5SYW5nZShyYW5nZSkgewogICAgICAgICAgICByYW5nZSA9IHRoaXMuX3ZhbGlkYXRlUmFuZ2UocmFuZ2UpOwogICAgICAgICAgICBpZiAocmFuZ2Uuc3RhcnRMaW5lTnVtYmVyID09PSByYW5nZS5lbmRMaW5lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGluZXNbcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyIC0gMV0uc3Vic3RyaW5nKHJhbmdlLnN0YXJ0Q29sdW1uIC0gMSwgcmFuZ2UuZW5kQ29sdW1uIC0gMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGxpbmVFbmRpbmcgPSB0aGlzLl9lb2w7CiAgICAgICAgICAgIGxldCBzdGFydExpbmVJbmRleCA9IHJhbmdlLnN0YXJ0TGluZU51bWJlciAtIDE7CiAgICAgICAgICAgIGxldCBlbmRMaW5lSW5kZXggPSByYW5nZS5lbmRMaW5lTnVtYmVyIC0gMTsKICAgICAgICAgICAgbGV0IHJlc3VsdExpbmVzID0gW107CiAgICAgICAgICAgIHJlc3VsdExpbmVzLnB1c2godGhpcy5fbGluZXNbc3RhcnRMaW5lSW5kZXhdLnN1YnN0cmluZyhyYW5nZS5zdGFydENvbHVtbiAtIDEpKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0TGluZUluZGV4ICsgMTsgaSA8IGVuZExpbmVJbmRleDsgaSsrKSB7CiAgICAgICAgICAgICAgICByZXN1bHRMaW5lcy5wdXNoKHRoaXMuX2xpbmVzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHRMaW5lcy5wdXNoKHRoaXMuX2xpbmVzW2VuZExpbmVJbmRleF0uc3Vic3RyaW5nKDAsIHJhbmdlLmVuZENvbHVtbiAtIDEpKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdExpbmVzLmpvaW4obGluZUVuZGluZyk7CiAgICAgICAgfQogICAgICAgIG9mZnNldEF0KHBvc2l0aW9uKSB7CiAgICAgICAgICAgIHBvc2l0aW9uID0gdGhpcy5fdmFsaWRhdGVQb3NpdGlvbihwb3NpdGlvbik7CiAgICAgICAgICAgIHRoaXMuX2Vuc3VyZUxpbmVTdGFydHMoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVTdGFydHMuZ2V0UHJlZml4U3VtKHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAyKSArIChwb3NpdGlvbi5jb2x1bW4gLSAxKTsKICAgICAgICB9CiAgICAgICAgcG9zaXRpb25BdChvZmZzZXQpIHsKICAgICAgICAgICAgb2Zmc2V0ID0gTWF0aC5mbG9vcihvZmZzZXQpOwogICAgICAgICAgICBvZmZzZXQgPSBNYXRoLm1heCgwLCBvZmZzZXQpOwogICAgICAgICAgICB0aGlzLl9lbnN1cmVMaW5lU3RhcnRzKCk7CiAgICAgICAgICAgIGxldCBvdXQgPSB0aGlzLl9saW5lU3RhcnRzLmdldEluZGV4T2Yob2Zmc2V0KTsKICAgICAgICAgICAgbGV0IGxpbmVMZW5ndGggPSB0aGlzLl9saW5lc1tvdXQuaW5kZXhdLmxlbmd0aDsKICAgICAgICAgICAgLy8gRW5zdXJlIHdlIHJldHVybiBhIHZhbGlkIHBvc2l0aW9uCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyOiAxICsgb3V0LmluZGV4LAogICAgICAgICAgICAgICAgY29sdW1uOiAxICsgTWF0aC5taW4ob3V0LnJlbWFpbmRlciwgbGluZUxlbmd0aCkKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgX3ZhbGlkYXRlUmFuZ2UocmFuZ2UpIHsKICAgICAgICAgICAgY29uc3Qgc3RhcnQgPSB0aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHsgbGluZU51bWJlcjogcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLCBjb2x1bW46IHJhbmdlLnN0YXJ0Q29sdW1uIH0pOwogICAgICAgICAgICBjb25zdCBlbmQgPSB0aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHsgbGluZU51bWJlcjogcmFuZ2UuZW5kTGluZU51bWJlciwgY29sdW1uOiByYW5nZS5lbmRDb2x1bW4gfSk7CiAgICAgICAgICAgIGlmIChzdGFydC5saW5lTnVtYmVyICE9PSByYW5nZS5zdGFydExpbmVOdW1iZXIKICAgICAgICAgICAgICAgIHx8IHN0YXJ0LmNvbHVtbiAhPT0gcmFuZ2Uuc3RhcnRDb2x1bW4KICAgICAgICAgICAgICAgIHx8IGVuZC5saW5lTnVtYmVyICE9PSByYW5nZS5lbmRMaW5lTnVtYmVyCiAgICAgICAgICAgICAgICB8fCBlbmQuY29sdW1uICE9PSByYW5nZS5lbmRDb2x1bW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBzdGFydC5saW5lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiBzdGFydC5jb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgZW5kTGluZU51bWJlcjogZW5kLmxpbmVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgZW5kQ29sdW1uOiBlbmQuY29sdW1uCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICB9CiAgICAgICAgX3ZhbGlkYXRlUG9zaXRpb24ocG9zaXRpb24pIHsKICAgICAgICAgICAgaWYgKCFQb3NpdGlvbiQxLmlzSVBvc2l0aW9uKHBvc2l0aW9uKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgcG9zaXRpb24nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgeyBsaW5lTnVtYmVyLCBjb2x1bW4gfSA9IHBvc2l0aW9uOwogICAgICAgICAgICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAobGluZU51bWJlciA8IDEpIHsKICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSAxOwogICAgICAgICAgICAgICAgY29sdW1uID0gMTsKICAgICAgICAgICAgICAgIGhhc0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGxpbmVOdW1iZXIgPiB0aGlzLl9saW5lcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGxpbmVOdW1iZXIgPSB0aGlzLl9saW5lcy5sZW5ndGg7CiAgICAgICAgICAgICAgICBjb2x1bW4gPSB0aGlzLl9saW5lc1tsaW5lTnVtYmVyIC0gMV0ubGVuZ3RoICsgMTsKICAgICAgICAgICAgICAgIGhhc0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGV0IG1heENoYXJhY3RlciA9IHRoaXMuX2xpbmVzW2xpbmVOdW1iZXIgLSAxXS5sZW5ndGggKyAxOwogICAgICAgICAgICAgICAgaWYgKGNvbHVtbiA8IDEpIHsKICAgICAgICAgICAgICAgICAgICBjb2x1bW4gPSAxOwogICAgICAgICAgICAgICAgICAgIGhhc0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY29sdW1uID4gbWF4Q2hhcmFjdGVyKSB7CiAgICAgICAgICAgICAgICAgICAgY29sdW1uID0gbWF4Q2hhcmFjdGVyOwogICAgICAgICAgICAgICAgICAgIGhhc0NoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaGFzQ2hhbmdlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgbGluZU51bWJlciwgY29sdW1uIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBjbGFzcyBFZGl0b3JTaW1wbGVXb3JrZXIgewogICAgICAgIGNvbnN0cnVjdG9yKGhvc3QsIGZvcmVpZ25Nb2R1bGVGYWN0b3J5KSB7CiAgICAgICAgICAgIHRoaXMuX2hvc3QgPSBob3N0OwogICAgICAgICAgICB0aGlzLl9tb2RlbHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICB0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeSA9IGZvcmVpZ25Nb2R1bGVGYWN0b3J5OwogICAgICAgICAgICB0aGlzLl9mb3JlaWduTW9kdWxlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgZGlzcG9zZSgpIHsKICAgICAgICAgICAgdGhpcy5fbW9kZWxzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB9CiAgICAgICAgX2dldE1vZGVsKHVyaSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbW9kZWxzW3VyaV07CiAgICAgICAgfQogICAgICAgIF9nZXRNb2RlbHMoKSB7CiAgICAgICAgICAgIGxldCBhbGwgPSBbXTsKICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5fbW9kZWxzKS5mb3JFYWNoKChrZXkpID0+IGFsbC5wdXNoKHRoaXMuX21vZGVsc1trZXldKSk7CiAgICAgICAgICAgIHJldHVybiBhbGw7CiAgICAgICAgfQogICAgICAgIGFjY2VwdE5ld01vZGVsKGRhdGEpIHsKICAgICAgICAgICAgdGhpcy5fbW9kZWxzW2RhdGEudXJsXSA9IG5ldyBNaXJyb3JNb2RlbChVUkkkMS5wYXJzZShkYXRhLnVybCksIGRhdGEubGluZXMsIGRhdGEuRU9MLCBkYXRhLnZlcnNpb25JZCk7CiAgICAgICAgfQogICAgICAgIGFjY2VwdE1vZGVsQ2hhbmdlZChzdHJVUkwsIGUpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9tb2RlbHNbc3RyVVJMXSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBtb2RlbCA9IHRoaXMuX21vZGVsc1tzdHJVUkxdOwogICAgICAgICAgICBtb2RlbC5vbkV2ZW50cyhlKTsKICAgICAgICB9CiAgICAgICAgYWNjZXB0UmVtb3ZlZE1vZGVsKHN0clVSTCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX21vZGVsc1tzdHJVUkxdKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVsZXRlIHRoaXMuX21vZGVsc1tzdHJVUkxdOwogICAgICAgIH0KICAgICAgICBjb21wdXRlVW5pY29kZUhpZ2hsaWdodHModXJsLCBvcHRpb25zLCByYW5nZSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9nZXRNb2RlbCh1cmwpOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJhbmdlczogW10sIGhhc01vcmU6IGZhbHNlLCBhbWJpZ3VvdXNDaGFyYWN0ZXJDb3VudDogMCwgaW52aXNpYmxlQ2hhcmFjdGVyQ291bnQ6IDAsIG5vbkJhc2ljQXNjaWlDaGFyYWN0ZXJDb3VudDogMCB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFVuaWNvZGVUZXh0TW9kZWxIaWdobGlnaHRlci5jb21wdXRlVW5pY29kZUhpZ2hsaWdodHMobW9kZWwsIG9wdGlvbnMsIHJhbmdlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0gQkVHSU4gZGlmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIGNvbXB1dGVEaWZmKG9yaWdpbmFsVXJsLCBtb2RpZmllZFVybCwgaWdub3JlVHJpbVdoaXRlc3BhY2UsIG1heENvbXB1dGF0aW9uVGltZSkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWwgPSB0aGlzLl9nZXRNb2RlbChvcmlnaW5hbFVybCk7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZCA9IHRoaXMuX2dldE1vZGVsKG1vZGlmaWVkVXJsKTsKICAgICAgICAgICAgICAgIGlmICghb3JpZ2luYWwgfHwgIW1vZGlmaWVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbExpbmVzID0gb3JpZ2luYWwuZ2V0TGluZXNDb250ZW50KCk7CiAgICAgICAgICAgICAgICBjb25zdCBtb2RpZmllZExpbmVzID0gbW9kaWZpZWQuZ2V0TGluZXNDb250ZW50KCk7CiAgICAgICAgICAgICAgICBjb25zdCBkaWZmQ29tcHV0ZXIgPSBuZXcgRGlmZkNvbXB1dGVyKG9yaWdpbmFsTGluZXMsIG1vZGlmaWVkTGluZXMsIHsKICAgICAgICAgICAgICAgICAgICBzaG91bGRDb21wdXRlQ2hhckNoYW5nZXM6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZTogaWdub3JlVHJpbVdoaXRlc3BhY2UsCiAgICAgICAgICAgICAgICAgICAgc2hvdWxkTWFrZVByZXR0eURpZmY6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgbWF4Q29tcHV0YXRpb25UaW1lOiBtYXhDb21wdXRhdGlvblRpbWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY29uc3QgZGlmZlJlc3VsdCA9IGRpZmZDb21wdXRlci5jb21wdXRlRGlmZigpOwogICAgICAgICAgICAgICAgY29uc3QgaWRlbnRpY2FsID0gKGRpZmZSZXN1bHQuY2hhbmdlcy5sZW5ndGggPiAwID8gZmFsc2UgOiB0aGlzLl9tb2RlbHNBcmVJZGVudGljYWwob3JpZ2luYWwsIG1vZGlmaWVkKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHF1aXRFYXJseTogZGlmZlJlc3VsdC5xdWl0RWFybHksCiAgICAgICAgICAgICAgICAgICAgaWRlbnRpY2FsOiBpZGVudGljYWwsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlczogZGlmZlJlc3VsdC5jaGFuZ2VzCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX21vZGVsc0FyZUlkZW50aWNhbChvcmlnaW5hbCwgbW9kaWZpZWQpIHsKICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxMaW5lQ291bnQgPSBvcmlnaW5hbC5nZXRMaW5lQ291bnQoKTsKICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRMaW5lQ291bnQgPSBtb2RpZmllZC5nZXRMaW5lQ291bnQoKTsKICAgICAgICAgICAgaWYgKG9yaWdpbmFsTGluZUNvdW50ICE9PSBtb2RpZmllZExpbmVDb3VudCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAobGV0IGxpbmUgPSAxOyBsaW5lIDw9IG9yaWdpbmFsTGluZUNvdW50OyBsaW5lKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTGluZSA9IG9yaWdpbmFsLmdldExpbmVDb250ZW50KGxpbmUpOwogICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZWRMaW5lID0gbW9kaWZpZWQuZ2V0TGluZUNvbnRlbnQobGluZSk7CiAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxMaW5lICE9PSBtb2RpZmllZExpbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGNvbXB1dGVNb3JlTWluaW1hbEVkaXRzKG1vZGVsVXJsLCBlZGl0cykgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9nZXRNb2RlbChtb2RlbFVybCk7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVkaXRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgICAgICAgICBsZXQgbGFzdEVvbCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGVkaXRzID0gZWRpdHMuc2xpY2UoMCkuc29ydCgoYSwgYikgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChhLnJhbmdlICYmIGIucmFuZ2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJhbmdlJDEuY29tcGFyZVJhbmdlc1VzaW5nU3RhcnRzKGEucmFuZ2UsIGIucmFuZ2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBlb2wgb25seSBjaGFuZ2VzIHNob3VsZCBnbyB0byB0aGUgZW5kCiAgICAgICAgICAgICAgICAgICAgbGV0IGFSbmcgPSBhLnJhbmdlID8gMCA6IDE7CiAgICAgICAgICAgICAgICAgICAgbGV0IGJSbmcgPSBiLnJhbmdlID8gMCA6IDE7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFSbmcgLSBiUm5nOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCB7IHJhbmdlLCB0ZXh0LCBlb2wgfSBvZiBlZGl0cykgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZW9sID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBsYXN0RW9sID0gZW9sOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoUmFuZ2UkMS5pc0VtcHR5KHJhbmdlKSAmJiAhdGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBlbXB0eSBjaGFuZ2UKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsID0gbW9kZWwuZ2V0VmFsdWVJblJhbmdlKHJhbmdlKTsKICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cclxufFxufFxyL2csIG1vZGVsLmVvbCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsID09PSB0ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vb3AKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBkaWZmIHdvbid0IHRha2UgdG9vIGxvbmcKICAgICAgICAgICAgICAgICAgICBpZiAoTWF0aC5tYXgodGV4dC5sZW5ndGgsIG9yaWdpbmFsLmxlbmd0aCkgPiBFZGl0b3JTaW1wbGVXb3JrZXIuX2RpZmZMaW1pdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7IHJhbmdlLCB0ZXh0IH0pOwogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZSBkaWZmIGJldHdlZW4gb3JpZ2luYWwgYW5kIGVkaXQudGV4dAogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSBzdHJpbmdEaWZmKG9yaWdpbmFsLCB0ZXh0LCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRpdE9mZnNldCA9IG1vZGVsLm9mZnNldEF0KFJhbmdlJDEubGlmdChyYW5nZSkuZ2V0U3RhcnRQb3NpdGlvbigpKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGNoYW5nZSBvZiBjaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gbW9kZWwucG9zaXRpb25BdChlZGl0T2Zmc2V0ICsgY2hhbmdlLm9yaWdpbmFsU3RhcnQpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBtb2RlbC5wb3NpdGlvbkF0KGVkaXRPZmZzZXQgKyBjaGFuZ2Uub3JpZ2luYWxTdGFydCArIGNoYW5nZS5vcmlnaW5hbExlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0VkaXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LnN1YnN0cihjaGFuZ2UubW9kaWZpZWRTdGFydCwgY2hhbmdlLm1vZGlmaWVkTGVuZ3RoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0TGluZU51bWJlcjogc3RhcnQubGluZU51bWJlciwgc3RhcnRDb2x1bW46IHN0YXJ0LmNvbHVtbiwgZW5kTGluZU51bWJlcjogZW5kLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogZW5kLmNvbHVtbiB9CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5nZXRWYWx1ZUluUmFuZ2UobmV3RWRpdC5yYW5nZSkgIT09IG5ld0VkaXQudGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3RWRpdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxhc3RFb2wgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBlb2w6IGxhc3RFb2wsIHRleHQ6ICcnLCByYW5nZTogeyBzdGFydExpbmVOdW1iZXI6IDAsIHN0YXJ0Q29sdW1uOiAwLCBlbmRMaW5lTnVtYmVyOiAwLCBlbmRDb2x1bW46IDAgfSB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyAtLS0tIEVORCBtaW5pbWFsIGVkaXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIGNvbXB1dGVMaW5rcyhtb2RlbFVybCkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgbGV0IG1vZGVsID0gdGhpcy5fZ2V0TW9kZWwobW9kZWxVcmwpOwogICAgICAgICAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVMaW5rcyhtb2RlbCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB0ZXh0dWFsU3VnZ2VzdChtb2RlbFVybHMsIGxlYWRpbmdXb3JkLCB3b3JkRGVmLCB3b3JkRGVmRmxhZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHN3ID0gbmV3IFN0b3BXYXRjaCh0cnVlKTsKICAgICAgICAgICAgICAgIGNvbnN0IHdvcmREZWZSZWdFeHAgPSBuZXcgUmVnRXhwKHdvcmREZWYsIHdvcmREZWZGbGFncyk7CiAgICAgICAgICAgICAgICBjb25zdCBzZWVuID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgb3V0ZXI6IGZvciAobGV0IHVybCBvZiBtb2RlbFVybHMpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2RlbCA9IHRoaXMuX2dldE1vZGVsKHVybCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgd29yZCBvZiBtb2RlbC53b3Jkcyh3b3JkRGVmUmVnRXhwKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAod29yZCA9PT0gbGVhZGluZ1dvcmQgfHwgIWlzTmFOKE51bWJlcih3b3JkKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4uYWRkKHdvcmQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vlbi5zaXplID4gRWRpdG9yU2ltcGxlV29ya2VyLl9zdWdnZXN0aW9uc0xpbWl0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB7IHdvcmRzOiBBcnJheS5mcm9tKHNlZW4pLCBkdXJhdGlvbjogc3cuZWxhcHNlZCgpIH07CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvLyAtLS0tIEVORCBzdWdnZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgLy8jcmVnaW9uIC0tIHdvcmQgcmFuZ2VzIC0tCiAgICAgICAgY29tcHV0ZVdvcmRSYW5nZXMobW9kZWxVcmwsIHJhbmdlLCB3b3JkRGVmLCB3b3JkRGVmRmxhZ3MpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgIGxldCBtb2RlbCA9IHRoaXMuX2dldE1vZGVsKG1vZGVsVXJsKTsKICAgICAgICAgICAgICAgIGlmICghbW9kZWwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHdvcmREZWZSZWdFeHAgPSBuZXcgUmVnRXhwKHdvcmREZWYsIHdvcmREZWZGbGFncyk7CiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgbGluZSA9IHJhbmdlLnN0YXJ0TGluZU51bWJlcjsgbGluZSA8IHJhbmdlLmVuZExpbmVOdW1iZXI7IGxpbmUrKykgewogICAgICAgICAgICAgICAgICAgIGxldCB3b3JkcyA9IG1vZGVsLmdldExpbmVXb3JkcyhsaW5lLCB3b3JkRGVmUmVnRXhwKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHdvcmQgb2Ygd29yZHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihOdW1iZXIod29yZC53b3JkKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcnJheSA9IHJlc3VsdFt3b3JkLndvcmRdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W3dvcmQud29yZF0gPSBhcnJheTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiB3b3JkLnN0YXJ0Q29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kTGluZU51bWJlcjogbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZENvbHVtbjogd29yZC5lbmRDb2x1bW4KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vI2VuZHJlZ2lvbgogICAgICAgIG5hdmlnYXRlVmFsdWVTZXQobW9kZWxVcmwsIHJhbmdlLCB1cCwgd29yZERlZiwgd29yZERlZkZsYWdzKSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLl9nZXRNb2RlbChtb2RlbFVybCk7CiAgICAgICAgICAgICAgICBpZiAoIW1vZGVsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgd29yZERlZlJlZ0V4cCA9IG5ldyBSZWdFeHAod29yZERlZiwgd29yZERlZkZsYWdzKTsKICAgICAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydENvbHVtbiA9PT0gcmFuZ2UuZW5kQ29sdW1uKSB7CiAgICAgICAgICAgICAgICAgICAgcmFuZ2UgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogcmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvbHVtbjogcmFuZ2Uuc3RhcnRDb2x1bW4sCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6IHJhbmdlLmVuZExpbmVOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZENvbHVtbjogcmFuZ2UuZW5kQ29sdW1uICsgMQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0aW9uVGV4dCA9IG1vZGVsLmdldFZhbHVlSW5SYW5nZShyYW5nZSk7CiAgICAgICAgICAgICAgICBsZXQgd29yZFJhbmdlID0gbW9kZWwuZ2V0V29yZEF0UG9zaXRpb24oeyBsaW5lTnVtYmVyOiByYW5nZS5zdGFydExpbmVOdW1iZXIsIGNvbHVtbjogcmFuZ2Uuc3RhcnRDb2x1bW4gfSwgd29yZERlZlJlZ0V4cCk7CiAgICAgICAgICAgICAgICBpZiAoIXdvcmRSYW5nZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IHdvcmQgPSBtb2RlbC5nZXRWYWx1ZUluUmFuZ2Uod29yZFJhbmdlKTsKICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBCYXNpY0lucGxhY2VSZXBsYWNlLklOU1RBTkNFLm5hdmlnYXRlVmFsdWVTZXQocmFuZ2UsIHNlbGVjdGlvblRleHQsIHdvcmRSYW5nZSwgd29yZCwgdXApOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0gQkVHSU4gZm9yZWlnbiBtb2R1bGUgc3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIGxvYWRGb3JlaWduTW9kdWxlKG1vZHVsZUlkLCBjcmVhdGVEYXRhLCBmb3JlaWduSG9zdE1ldGhvZHMpIHsKICAgICAgICAgICAgY29uc3QgcHJveHlNZXRob2RSZXF1ZXN0ID0gKG1ldGhvZCwgYXJncykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2hvc3QuZmhyKG1ldGhvZCwgYXJncyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IGZvcmVpZ25Ib3N0ID0gY3JlYXRlUHJveHlPYmplY3QkMShmb3JlaWduSG9zdE1ldGhvZHMsIHByb3h5TWV0aG9kUmVxdWVzdCk7CiAgICAgICAgICAgIGxldCBjdHggPSB7CiAgICAgICAgICAgICAgICBob3N0OiBmb3JlaWduSG9zdCwKICAgICAgICAgICAgICAgIGdldE1pcnJvck1vZGVsczogKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRNb2RlbHMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHRoaXMuX2ZvcmVpZ25Nb2R1bGVGYWN0b3J5KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9mb3JlaWduTW9kdWxlID0gdGhpcy5fZm9yZWlnbk1vZHVsZUZhY3RvcnkoY3R4LCBjcmVhdGVEYXRhKTsKICAgICAgICAgICAgICAgIC8vIHN0YXRpYyBmb3JlaW5nIG1vZHVsZQogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShnZXRBbGxNZXRob2ROYW1lcyh0aGlzLl9mb3JlaWduTW9kdWxlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRVNNLWNvbW1lbnQtYmVnaW4KICAgICAgICAgICAgLy8gCQlyZXR1cm4gbmV3IFByb21pc2U8YW55PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIC8vIAkJCXJlcXVpcmUoW21vZHVsZUlkXSwgKGZvcmVpZ25Nb2R1bGU6IHsgY3JlYXRlOiBJRm9yZWlnbk1vZHVsZUZhY3RvcnkgfSkgPT4gewogICAgICAgICAgICAvLyAJCQkJdGhpcy5fZm9yZWlnbk1vZHVsZSA9IGZvcmVpZ25Nb2R1bGUuY3JlYXRlKGN0eCwgY3JlYXRlRGF0YSk7CiAgICAgICAgICAgIC8vIAogICAgICAgICAgICAvLyAJCQkJcmVzb2x2ZSh0eXBlcy5nZXRBbGxNZXRob2ROYW1lcyh0aGlzLl9mb3JlaWduTW9kdWxlKSk7CiAgICAgICAgICAgIC8vIAogICAgICAgICAgICAvLyAJCQl9LCByZWplY3QpOwogICAgICAgICAgICAvLyAJCX0pOwogICAgICAgICAgICAvLyBFU00tY29tbWVudC1lbmQKICAgICAgICAgICAgLy8gRVNNLXVuY29tbWVudC1iZWdpbgogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBVbmV4cGVjdGVkIHVzYWdlYCkpOwogICAgICAgICAgICAvLyBFU00tdW5jb21tZW50LWVuZAogICAgICAgIH0KICAgICAgICAvLyBmb3JlaWduIG1ldGhvZCByZXF1ZXN0CiAgICAgICAgZm1yKG1ldGhvZCwgYXJncykgewogICAgICAgICAgICBpZiAoIXRoaXMuX2ZvcmVpZ25Nb2R1bGUgfHwgdHlwZW9mIHRoaXMuX2ZvcmVpZ25Nb2R1bGVbbWV0aG9kXSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTWlzc2luZyByZXF1ZXN0SGFuZGxlciBvciBtZXRob2Q6ICcgKyBtZXRob2QpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9mb3JlaWduTW9kdWxlW21ldGhvZF0uYXBwbHkodGhpcy5fZm9yZWlnbk1vZHVsZSwgYXJncykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvLyAtLS0tIEVORCBkaWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyAtLS0tIEJFR0lOIG1pbmltYWwgZWRpdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBFZGl0b3JTaW1wbGVXb3JrZXIuX2RpZmZMaW1pdCA9IDEwMDAwMDsKICAgIC8vIC0tLS0gQkVHSU4gc3VnZ2VzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgRWRpdG9yU2ltcGxlV29ya2VyLl9zdWdnZXN0aW9uc0xpbWl0ID0gMTAwMDA7CiAgICBpZiAodHlwZW9mIGltcG9ydFNjcmlwdHMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAvLyBSdW5uaW5nIGluIGEgd2ViIHdvcmtlcgogICAgICAgIGdsb2JhbHMubW9uYWNvID0gY3JlYXRlTW9uYWNvQmFzZUFQSSgpOwogICAgfQoKICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4KICAgICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgbGV0IGluaXRpYWxpemVkID0gZmFsc2U7CiAgICBmdW5jdGlvbiBpbml0aWFsaXplKGZvcmVpZ25Nb2R1bGUpIHsKICAgICAgICBpZiAoaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgY29uc3Qgc2ltcGxlV29ya2VyID0gbmV3IFNpbXBsZVdvcmtlclNlcnZlcigobXNnKSA9PiB7CiAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2UobXNnKTsKICAgICAgICB9LCAoaG9zdCkgPT4gbmV3IEVkaXRvclNpbXBsZVdvcmtlcihob3N0LCBmb3JlaWduTW9kdWxlKSk7CiAgICAgICAgc2VsZi5vbm1lc3NhZ2UgPSAoZSkgPT4gewogICAgICAgICAgICBzaW1wbGVXb3JrZXIub25tZXNzYWdlKGUuZGF0YSk7CiAgICAgICAgfTsKICAgIH0KICAgIHNlbGYub25tZXNzYWdlID0gKGUpID0+IHsKICAgICAgICAvLyBJZ25vcmUgZmlyc3QgbWVzc2FnZSBpbiB0aGlzIGNhc2UgYW5kIGluaXRpYWxpemUgaWYgbm90IHlldCBpbml0aWFsaXplZAogICAgICAgIGlmICghaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgaW5pdGlhbGl6ZShudWxsKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qIS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFZlcnNpb246IDAuMzEuMShjOGQzNmM4N2U2ZmUxMTQ3ODcyYmE1M2YxOGY0MzA3NTJiZjBkNGVhKQogICAgICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlCiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L21vbmFjby1lZGl0b3IvYmxvYi9tYWluL0xJQ0VOU0UudHh0CiAgICAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVNjYW5uZXIodGV4dCwgaWdub3JlVHJpdmlhKSB7CiAgICAgIGlmIChpZ25vcmVUcml2aWEgPT09IHZvaWQgMCkgewogICAgICAgIGlnbm9yZVRyaXZpYSA9IGZhbHNlOwogICAgICB9CiAgICAgIHZhciBsZW4gPSB0ZXh0Lmxlbmd0aDsKICAgICAgdmFyIHBvcyA9IDAsIHZhbHVlID0gIiIsIHRva2VuT2Zmc2V0ID0gMCwgdG9rZW4gPSAxNiwgbGluZU51bWJlciA9IDAsIGxpbmVTdGFydE9mZnNldCA9IDAsIHRva2VuTGluZVN0YXJ0T2Zmc2V0ID0gMCwgcHJldlRva2VuTGluZVN0YXJ0T2Zmc2V0ID0gMCwgc2NhbkVycm9yID0gMDsKICAgICAgZnVuY3Rpb24gc2NhbkhleERpZ2l0cyhjb3VudCwgZXhhY3QpIHsKICAgICAgICB2YXIgZGlnaXRzID0gMDsKICAgICAgICB2YXIgdmFsdWUyID0gMDsKICAgICAgICB3aGlsZSAoZGlnaXRzIDwgY291bnQgfHwgIWV4YWN0KSB7CiAgICAgICAgICB2YXIgY2ggPSB0ZXh0LmNoYXJDb2RlQXQocG9zKTsKICAgICAgICAgIGlmIChjaCA+PSA0OCAmJiBjaCA8PSA1NykgewogICAgICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIgKiAxNiArIGNoIC0gNDg7CiAgICAgICAgICB9IGVsc2UgaWYgKGNoID49IDY1ICYmIGNoIDw9IDcwKSB7CiAgICAgICAgICAgIHZhbHVlMiA9IHZhbHVlMiAqIDE2ICsgY2ggLSA2NSArIDEwOwogICAgICAgICAgfSBlbHNlIGlmIChjaCA+PSA5NyAmJiBjaCA8PSAxMDIpIHsKICAgICAgICAgICAgdmFsdWUyID0gdmFsdWUyICogMTYgKyBjaCAtIDk3ICsgMTA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHBvcysrOwogICAgICAgICAgZGlnaXRzKys7CiAgICAgICAgfQogICAgICAgIGlmIChkaWdpdHMgPCBjb3VudCkgewogICAgICAgICAgdmFsdWUyID0gLTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTI7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gc2V0UG9zaXRpb24obmV3UG9zaXRpb24pIHsKICAgICAgICBwb3MgPSBuZXdQb3NpdGlvbjsKICAgICAgICB2YWx1ZSA9ICIiOwogICAgICAgIHRva2VuT2Zmc2V0ID0gMDsKICAgICAgICB0b2tlbiA9IDE2OwogICAgICAgIHNjYW5FcnJvciA9IDA7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gc2Nhbk51bWJlcigpIHsKICAgICAgICB2YXIgc3RhcnQgPSBwb3M7CiAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChwb3MpID09PSA0OCkgewogICAgICAgICAgcG9zKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBvcysrOwogICAgICAgICAgd2hpbGUgKHBvcyA8IHRleHQubGVuZ3RoICYmIGlzRGlnaXQodGV4dC5jaGFyQ29kZUF0KHBvcykpKSB7CiAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocG9zIDwgdGV4dC5sZW5ndGggJiYgdGV4dC5jaGFyQ29kZUF0KHBvcykgPT09IDQ2KSB7CiAgICAgICAgICBwb3MrKzsKICAgICAgICAgIGlmIChwb3MgPCB0ZXh0Lmxlbmd0aCAmJiBpc0RpZ2l0KHRleHQuY2hhckNvZGVBdChwb3MpKSkgewogICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgd2hpbGUgKHBvcyA8IHRleHQubGVuZ3RoICYmIGlzRGlnaXQodGV4dC5jaGFyQ29kZUF0KHBvcykpKSB7CiAgICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNjYW5FcnJvciA9IDM7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnN1YnN0cmluZyhzdGFydCwgcG9zKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIGVuZCA9IHBvczsKICAgICAgICBpZiAocG9zIDwgdGV4dC5sZW5ndGggJiYgKHRleHQuY2hhckNvZGVBdChwb3MpID09PSA2OSB8fCB0ZXh0LmNoYXJDb2RlQXQocG9zKSA9PT0gMTAxKSkgewogICAgICAgICAgcG9zKys7CiAgICAgICAgICBpZiAocG9zIDwgdGV4dC5sZW5ndGggJiYgdGV4dC5jaGFyQ29kZUF0KHBvcykgPT09IDQzIHx8IHRleHQuY2hhckNvZGVBdChwb3MpID09PSA0NSkgewogICAgICAgICAgICBwb3MrKzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwb3MgPCB0ZXh0Lmxlbmd0aCAmJiBpc0RpZ2l0KHRleHQuY2hhckNvZGVBdChwb3MpKSkgewogICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgd2hpbGUgKHBvcyA8IHRleHQubGVuZ3RoICYmIGlzRGlnaXQodGV4dC5jaGFyQ29kZUF0KHBvcykpKSB7CiAgICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZW5kID0gcG9zOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2NhbkVycm9yID0gMzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHNjYW5TdHJpbmcoKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9ICIiLCBzdGFydCA9IHBvczsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgaWYgKHBvcyA+PSBsZW4pIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBwb3MpOwogICAgICAgICAgICBzY2FuRXJyb3IgPSAyOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBjaCA9IHRleHQuY2hhckNvZGVBdChwb3MpOwogICAgICAgICAgaWYgKGNoID09PSAzNCkgewogICAgICAgICAgICByZXN1bHQgKz0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7CiAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjaCA9PT0gOTIpIHsKICAgICAgICAgICAgcmVzdWx0ICs9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBwb3MpOwogICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgaWYgKHBvcyA+PSBsZW4pIHsKICAgICAgICAgICAgICBzY2FuRXJyb3IgPSAyOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjaDIgPSB0ZXh0LmNoYXJDb2RlQXQocG9zKyspOwogICAgICAgICAgICBzd2l0Y2ggKGNoMikgewogICAgICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgICAgICByZXN1bHQgKz0gJyInOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA5MjoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiXFwiOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSA0NzoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiLyI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDk4OgogICAgICAgICAgICAgICAgcmVzdWx0ICs9ICJcYiI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDEwMjoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiXGYiOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAxMTA6CiAgICAgICAgICAgICAgICByZXN1bHQgKz0gIlxuIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgMTE0OgogICAgICAgICAgICAgICAgcmVzdWx0ICs9ICJcciI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDExNjoKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiCSI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlIDExNzoKICAgICAgICAgICAgICAgIHZhciBjaDMgPSBzY2FuSGV4RGlnaXRzKDQsIHRydWUpOwogICAgICAgICAgICAgICAgaWYgKGNoMyA+PSAwKSB7CiAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoMyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBzY2FuRXJyb3IgPSA0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHNjYW5FcnJvciA9IDU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhcnQgPSBwb3M7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNoID49IDAgJiYgY2ggPD0gMzEpIHsKICAgICAgICAgICAgaWYgKGlzTGluZUJyZWFrKGNoKSkgewogICAgICAgICAgICAgIHJlc3VsdCArPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgcG9zKTsKICAgICAgICAgICAgICBzY2FuRXJyb3IgPSAyOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHNjYW5FcnJvciA9IDY7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHBvcysrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHNjYW5OZXh0KCkgewogICAgICAgIHZhbHVlID0gIiI7CiAgICAgICAgc2NhbkVycm9yID0gMDsKICAgICAgICB0b2tlbk9mZnNldCA9IHBvczsKICAgICAgICBsaW5lU3RhcnRPZmZzZXQgPSBsaW5lTnVtYmVyOwogICAgICAgIHByZXZUb2tlbkxpbmVTdGFydE9mZnNldCA9IHRva2VuTGluZVN0YXJ0T2Zmc2V0OwogICAgICAgIGlmIChwb3MgPj0gbGVuKSB7CiAgICAgICAgICB0b2tlbk9mZnNldCA9IGxlbjsKICAgICAgICAgIHJldHVybiB0b2tlbiA9IDE3OwogICAgICAgIH0KICAgICAgICB2YXIgY29kZSA9IHRleHQuY2hhckNvZGVBdChwb3MpOwogICAgICAgIGlmIChpc1doaXRlU3BhY2UoY29kZSkpIHsKICAgICAgICAgIGRvIHsKICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgIHZhbHVlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7CiAgICAgICAgICAgIGNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQocG9zKTsKICAgICAgICAgIH0gd2hpbGUgKGlzV2hpdGVTcGFjZShjb2RlKSk7CiAgICAgICAgICByZXR1cm4gdG9rZW4gPSAxNTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzTGluZUJyZWFrKGNvZGUpKSB7CiAgICAgICAgICBwb3MrKzsKICAgICAgICAgIHZhbHVlICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7CiAgICAgICAgICBpZiAoY29kZSA9PT0gMTMgJiYgdGV4dC5jaGFyQ29kZUF0KHBvcykgPT09IDEwKSB7CiAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICB2YWx1ZSArPSAiXG4iOwogICAgICAgICAgfQogICAgICAgICAgbGluZU51bWJlcisrOwogICAgICAgICAgdG9rZW5MaW5lU3RhcnRPZmZzZXQgPSBwb3M7CiAgICAgICAgICByZXR1cm4gdG9rZW4gPSAxNDsKICAgICAgICB9CiAgICAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgICBjYXNlIDEyMzoKICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IDE7CiAgICAgICAgICBjYXNlIDEyNToKICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IDI7CiAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gMzsKICAgICAgICAgIGNhc2UgOTM6CiAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICByZXR1cm4gdG9rZW4gPSA0OwogICAgICAgICAgY2FzZSA1ODoKICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IDY7CiAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gNTsKICAgICAgICAgIGNhc2UgMzQ6CiAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICB2YWx1ZSA9IHNjYW5TdHJpbmcoKTsKICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gMTA7CiAgICAgICAgICBjYXNlIDQ3OgogICAgICAgICAgICB2YXIgc3RhcnQgPSBwb3MgLSAxOwogICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KHBvcyArIDEpID09PSA0NykgewogICAgICAgICAgICAgIHBvcyArPSAyOwogICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBsZW4pIHsKICAgICAgICAgICAgICAgIGlmIChpc0xpbmVCcmVhayh0ZXh0LmNoYXJDb2RlQXQocG9zKSkpIHsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFsdWUgPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgcG9zKTsKICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSAxMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KHBvcyArIDEpID09PSA0MikgewogICAgICAgICAgICAgIHBvcyArPSAyOwogICAgICAgICAgICAgIHZhciBzYWZlTGVuZ3RoID0gbGVuIC0gMTsKICAgICAgICAgICAgICB2YXIgY29tbWVudENsb3NlZCA9IGZhbHNlOwogICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBzYWZlTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB2YXIgY2ggPSB0ZXh0LmNoYXJDb2RlQXQocG9zKTsKICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gNDIgJiYgdGV4dC5jaGFyQ29kZUF0KHBvcyArIDEpID09PSA0NykgewogICAgICAgICAgICAgICAgICBwb3MgKz0gMjsKICAgICAgICAgICAgICAgICAgY29tbWVudENsb3NlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgICAgICBpZiAoaXNMaW5lQnJlYWsoY2gpKSB7CiAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gMTMgJiYgdGV4dC5jaGFyQ29kZUF0KHBvcykgPT09IDEwKSB7CiAgICAgICAgICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgbGluZU51bWJlcisrOwogICAgICAgICAgICAgICAgICB0b2tlbkxpbmVTdGFydE9mZnNldCA9IHBvczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCFjb21tZW50Q2xvc2VkKSB7CiAgICAgICAgICAgICAgICBwb3MrKzsKICAgICAgICAgICAgICAgIHNjYW5FcnJvciA9IDE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhbHVlID0gdGV4dC5zdWJzdHJpbmcoc3RhcnQsIHBvcyk7CiAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gMTM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFsdWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsKICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IDE2OwogICAgICAgICAgY2FzZSA0NToKICAgICAgICAgICAgdmFsdWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsKICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgIGlmIChwb3MgPT09IGxlbiB8fCAhaXNEaWdpdCh0ZXh0LmNoYXJDb2RlQXQocG9zKSkpIHsKICAgICAgICAgICAgICByZXR1cm4gdG9rZW4gPSAxNjsKICAgICAgICAgICAgfQogICAgICAgICAgY2FzZSA0ODoKICAgICAgICAgIGNhc2UgNDk6CiAgICAgICAgICBjYXNlIDUwOgogICAgICAgICAgY2FzZSA1MToKICAgICAgICAgIGNhc2UgNTI6CiAgICAgICAgICBjYXNlIDUzOgogICAgICAgICAgY2FzZSA1NDoKICAgICAgICAgIGNhc2UgNTU6CiAgICAgICAgICBjYXNlIDU2OgogICAgICAgICAgY2FzZSA1NzoKICAgICAgICAgICAgdmFsdWUgKz0gc2Nhbk51bWJlcigpOwogICAgICAgICAgICByZXR1cm4gdG9rZW4gPSAxMTsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdoaWxlIChwb3MgPCBsZW4gJiYgaXNVbmtub3duQ29udGVudENoYXJhY3Rlcihjb2RlKSkgewogICAgICAgICAgICAgIHBvcysrOwogICAgICAgICAgICAgIGNvZGUgPSB0ZXh0LmNoYXJDb2RlQXQocG9zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodG9rZW5PZmZzZXQgIT09IHBvcykgewogICAgICAgICAgICAgIHZhbHVlID0gdGV4dC5zdWJzdHJpbmcodG9rZW5PZmZzZXQsIHBvcyk7CiAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkgewogICAgICAgICAgICAgICAgY2FzZSAidHJ1ZSI6CiAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IDg7CiAgICAgICAgICAgICAgICBjYXNlICJmYWxzZSI6CiAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IDk7CiAgICAgICAgICAgICAgICBjYXNlICJudWxsIjoKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gNzsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHRva2VuID0gMTY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFsdWUgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsKICAgICAgICAgICAgcG9zKys7CiAgICAgICAgICAgIHJldHVybiB0b2tlbiA9IDE2OwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBpc1Vua25vd25Db250ZW50Q2hhcmFjdGVyKGNvZGUpIHsKICAgICAgICBpZiAoaXNXaGl0ZVNwYWNlKGNvZGUpIHx8IGlzTGluZUJyZWFrKGNvZGUpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICAgY2FzZSAxMjU6CiAgICAgICAgICBjYXNlIDkzOgogICAgICAgICAgY2FzZSAxMjM6CiAgICAgICAgICBjYXNlIDkxOgogICAgICAgICAgY2FzZSAzNDoKICAgICAgICAgIGNhc2UgNTg6CiAgICAgICAgICBjYXNlIDQ0OgogICAgICAgICAgY2FzZSA0NzoKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBzY2FuTmV4dE5vblRyaXZpYSgpIHsKICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgIGRvIHsKICAgICAgICAgIHJlc3VsdCA9IHNjYW5OZXh0KCk7CiAgICAgICAgfSB3aGlsZSAocmVzdWx0ID49IDEyICYmIHJlc3VsdCA8PSAxNSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIHNldFBvc2l0aW9uLAogICAgICAgIGdldFBvc2l0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBwb3M7CiAgICAgICAgfSwKICAgICAgICBzY2FuOiBpZ25vcmVUcml2aWEgPyBzY2FuTmV4dE5vblRyaXZpYSA6IHNjYW5OZXh0LAogICAgICAgIGdldFRva2VuOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICB9LAogICAgICAgIGdldFRva2VuVmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0sCiAgICAgICAgZ2V0VG9rZW5PZmZzZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRva2VuT2Zmc2V0OwogICAgICAgIH0sCiAgICAgICAgZ2V0VG9rZW5MZW5ndGg6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHBvcyAtIHRva2VuT2Zmc2V0OwogICAgICAgIH0sCiAgICAgICAgZ2V0VG9rZW5TdGFydExpbmU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGxpbmVTdGFydE9mZnNldDsKICAgICAgICB9LAogICAgICAgIGdldFRva2VuU3RhcnRDaGFyYWN0ZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRva2VuT2Zmc2V0IC0gcHJldlRva2VuTGluZVN0YXJ0T2Zmc2V0OwogICAgICAgIH0sCiAgICAgICAgZ2V0VG9rZW5FcnJvcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gc2NhbkVycm9yOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzV2hpdGVTcGFjZShjaCkgewogICAgICByZXR1cm4gY2ggPT09IDMyIHx8IGNoID09PSA5IHx8IGNoID09PSAxMSB8fCBjaCA9PT0gMTIgfHwgY2ggPT09IDE2MCB8fCBjaCA9PT0gNTc2MCB8fCBjaCA+PSA4MTkyICYmIGNoIDw9IDgyMDMgfHwgY2ggPT09IDgyMzkgfHwgY2ggPT09IDgyODcgfHwgY2ggPT09IDEyMjg4IHx8IGNoID09PSA2NTI3OTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTGluZUJyZWFrKGNoKSB7CiAgICAgIHJldHVybiBjaCA9PT0gMTAgfHwgY2ggPT09IDEzIHx8IGNoID09PSA4MjMyIHx8IGNoID09PSA4MjMzOwogICAgfQogICAgZnVuY3Rpb24gaXNEaWdpdChjaCkgewogICAgICByZXR1cm4gY2ggPj0gNDggJiYgY2ggPD0gNTc7CiAgICB9CiAgICBmdW5jdGlvbiBmb3JtYXQoZG9jdW1lbnRUZXh0LCByYW5nZSwgb3B0aW9ucykgewogICAgICB2YXIgaW5pdGlhbEluZGVudExldmVsOwogICAgICB2YXIgZm9ybWF0VGV4dDsKICAgICAgdmFyIGZvcm1hdFRleHRTdGFydDsKICAgICAgdmFyIHJhbmdlU3RhcnQ7CiAgICAgIHZhciByYW5nZUVuZDsKICAgICAgaWYgKHJhbmdlKSB7CiAgICAgICAgcmFuZ2VTdGFydCA9IHJhbmdlLm9mZnNldDsKICAgICAgICByYW5nZUVuZCA9IHJhbmdlU3RhcnQgKyByYW5nZS5sZW5ndGg7CiAgICAgICAgZm9ybWF0VGV4dFN0YXJ0ID0gcmFuZ2VTdGFydDsKICAgICAgICB3aGlsZSAoZm9ybWF0VGV4dFN0YXJ0ID4gMCAmJiAhaXNFT0woZG9jdW1lbnRUZXh0LCBmb3JtYXRUZXh0U3RhcnQgLSAxKSkgewogICAgICAgICAgZm9ybWF0VGV4dFN0YXJ0LS07CiAgICAgICAgfQogICAgICAgIHZhciBlbmRPZmZzZXQgPSByYW5nZUVuZDsKICAgICAgICB3aGlsZSAoZW5kT2Zmc2V0IDwgZG9jdW1lbnRUZXh0Lmxlbmd0aCAmJiAhaXNFT0woZG9jdW1lbnRUZXh0LCBlbmRPZmZzZXQpKSB7CiAgICAgICAgICBlbmRPZmZzZXQrKzsKICAgICAgICB9CiAgICAgICAgZm9ybWF0VGV4dCA9IGRvY3VtZW50VGV4dC5zdWJzdHJpbmcoZm9ybWF0VGV4dFN0YXJ0LCBlbmRPZmZzZXQpOwogICAgICAgIGluaXRpYWxJbmRlbnRMZXZlbCA9IGNvbXB1dGVJbmRlbnRMZXZlbChmb3JtYXRUZXh0LCBvcHRpb25zKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3JtYXRUZXh0ID0gZG9jdW1lbnRUZXh0OwogICAgICAgIGluaXRpYWxJbmRlbnRMZXZlbCA9IDA7CiAgICAgICAgZm9ybWF0VGV4dFN0YXJ0ID0gMDsKICAgICAgICByYW5nZVN0YXJ0ID0gMDsKICAgICAgICByYW5nZUVuZCA9IGRvY3VtZW50VGV4dC5sZW5ndGg7CiAgICAgIH0KICAgICAgdmFyIGVvbCA9IGdldEVPTChvcHRpb25zLCBkb2N1bWVudFRleHQpOwogICAgICB2YXIgbGluZUJyZWFrID0gZmFsc2U7CiAgICAgIHZhciBpbmRlbnRMZXZlbCA9IDA7CiAgICAgIHZhciBpbmRlbnRWYWx1ZTsKICAgICAgaWYgKG9wdGlvbnMuaW5zZXJ0U3BhY2VzKSB7CiAgICAgICAgaW5kZW50VmFsdWUgPSByZXBlYXQoIiAiLCBvcHRpb25zLnRhYlNpemUgfHwgNCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5kZW50VmFsdWUgPSAiCSI7CiAgICAgIH0KICAgICAgdmFyIHNjYW5uZXIyID0gY3JlYXRlU2Nhbm5lcihmb3JtYXRUZXh0LCBmYWxzZSk7CiAgICAgIHZhciBoYXNFcnJvciA9IGZhbHNlOwogICAgICBmdW5jdGlvbiBuZXdMaW5lQW5kSW5kZW50KCkgewogICAgICAgIHJldHVybiBlb2wgKyByZXBlYXQoaW5kZW50VmFsdWUsIGluaXRpYWxJbmRlbnRMZXZlbCArIGluZGVudExldmVsKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBzY2FuTmV4dCgpIHsKICAgICAgICB2YXIgdG9rZW4gPSBzY2FubmVyMi5zY2FuKCk7CiAgICAgICAgbGluZUJyZWFrID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKHRva2VuID09PSAxNSB8fCB0b2tlbiA9PT0gMTQpIHsKICAgICAgICAgIGxpbmVCcmVhayA9IGxpbmVCcmVhayB8fCB0b2tlbiA9PT0gMTQ7CiAgICAgICAgICB0b2tlbiA9IHNjYW5uZXIyLnNjYW4oKTsKICAgICAgICB9CiAgICAgICAgaGFzRXJyb3IgPSB0b2tlbiA9PT0gMTYgfHwgc2Nhbm5lcjIuZ2V0VG9rZW5FcnJvcigpICE9PSAwOwogICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgfQogICAgICB2YXIgZWRpdE9wZXJhdGlvbnMgPSBbXTsKICAgICAgZnVuY3Rpb24gYWRkRWRpdCh0ZXh0LCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0MikgewogICAgICAgIGlmICghaGFzRXJyb3IgJiYgKCFyYW5nZSB8fCBzdGFydE9mZnNldCA8IHJhbmdlRW5kICYmIGVuZE9mZnNldDIgPiByYW5nZVN0YXJ0KSAmJiBkb2N1bWVudFRleHQuc3Vic3RyaW5nKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQyKSAhPT0gdGV4dCkgewogICAgICAgICAgZWRpdE9wZXJhdGlvbnMucHVzaCh7IG9mZnNldDogc3RhcnRPZmZzZXQsIGxlbmd0aDogZW5kT2Zmc2V0MiAtIHN0YXJ0T2Zmc2V0LCBjb250ZW50OiB0ZXh0IH0pOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgZmlyc3RUb2tlbiA9IHNjYW5OZXh0KCk7CiAgICAgIGlmIChmaXJzdFRva2VuICE9PSAxNykgewogICAgICAgIHZhciBmaXJzdFRva2VuU3RhcnQgPSBzY2FubmVyMi5nZXRUb2tlbk9mZnNldCgpICsgZm9ybWF0VGV4dFN0YXJ0OwogICAgICAgIHZhciBpbml0aWFsSW5kZW50ID0gcmVwZWF0KGluZGVudFZhbHVlLCBpbml0aWFsSW5kZW50TGV2ZWwpOwogICAgICAgIGFkZEVkaXQoaW5pdGlhbEluZGVudCwgZm9ybWF0VGV4dFN0YXJ0LCBmaXJzdFRva2VuU3RhcnQpOwogICAgICB9CiAgICAgIHdoaWxlIChmaXJzdFRva2VuICE9PSAxNykgewogICAgICAgIHZhciBmaXJzdFRva2VuRW5kID0gc2Nhbm5lcjIuZ2V0VG9rZW5PZmZzZXQoKSArIHNjYW5uZXIyLmdldFRva2VuTGVuZ3RoKCkgKyBmb3JtYXRUZXh0U3RhcnQ7CiAgICAgICAgdmFyIHNlY29uZFRva2VuID0gc2Nhbk5leHQoKTsKICAgICAgICB2YXIgcmVwbGFjZUNvbnRlbnQgPSAiIjsKICAgICAgICB2YXIgbmVlZHNMaW5lQnJlYWsgPSBmYWxzZTsKICAgICAgICB3aGlsZSAoIWxpbmVCcmVhayAmJiAoc2Vjb25kVG9rZW4gPT09IDEyIHx8IHNlY29uZFRva2VuID09PSAxMykpIHsKICAgICAgICAgIHZhciBjb21tZW50VG9rZW5TdGFydCA9IHNjYW5uZXIyLmdldFRva2VuT2Zmc2V0KCkgKyBmb3JtYXRUZXh0U3RhcnQ7CiAgICAgICAgICBhZGRFZGl0KCIgIiwgZmlyc3RUb2tlbkVuZCwgY29tbWVudFRva2VuU3RhcnQpOwogICAgICAgICAgZmlyc3RUb2tlbkVuZCA9IHNjYW5uZXIyLmdldFRva2VuT2Zmc2V0KCkgKyBzY2FubmVyMi5nZXRUb2tlbkxlbmd0aCgpICsgZm9ybWF0VGV4dFN0YXJ0OwogICAgICAgICAgbmVlZHNMaW5lQnJlYWsgPSBzZWNvbmRUb2tlbiA9PT0gMTI7CiAgICAgICAgICByZXBsYWNlQ29udGVudCA9IG5lZWRzTGluZUJyZWFrID8gbmV3TGluZUFuZEluZGVudCgpIDogIiI7CiAgICAgICAgICBzZWNvbmRUb2tlbiA9IHNjYW5OZXh0KCk7CiAgICAgICAgfQogICAgICAgIGlmIChzZWNvbmRUb2tlbiA9PT0gMikgewogICAgICAgICAgaWYgKGZpcnN0VG9rZW4gIT09IDEpIHsKICAgICAgICAgICAgaW5kZW50TGV2ZWwtLTsKICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBuZXdMaW5lQW5kSW5kZW50KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRUb2tlbiA9PT0gNCkgewogICAgICAgICAgaWYgKGZpcnN0VG9rZW4gIT09IDMpIHsKICAgICAgICAgICAgaW5kZW50TGV2ZWwtLTsKICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBuZXdMaW5lQW5kSW5kZW50KCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN3aXRjaCAoZmlyc3RUb2tlbikgewogICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICBpbmRlbnRMZXZlbCsrOwogICAgICAgICAgICAgIHJlcGxhY2VDb250ZW50ID0gbmV3TGluZUFuZEluZGVudCgpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDU6CiAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBuZXdMaW5lQW5kSW5kZW50KCk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgaWYgKGxpbmVCcmVhaykgewogICAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBuZXdMaW5lQW5kSW5kZW50KCk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICghbmVlZHNMaW5lQnJlYWspIHsKICAgICAgICAgICAgICAgIHJlcGxhY2VDb250ZW50ID0gIiAiOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgIGlmICghbmVlZHNMaW5lQnJlYWspIHsKICAgICAgICAgICAgICAgIHJlcGxhY2VDb250ZW50ID0gIiAiOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgICBpZiAoc2Vjb25kVG9rZW4gPT09IDYpIHsKICAgICAgICAgICAgICAgIGlmICghbmVlZHNMaW5lQnJlYWspIHsKICAgICAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSAiIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgICAgaWYgKHNlY29uZFRva2VuID09PSAxMiB8fCBzZWNvbmRUb2tlbiA9PT0gMTMpIHsKICAgICAgICAgICAgICAgIGlmICghbmVlZHNMaW5lQnJlYWspIHsKICAgICAgICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSAiICI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWNvbmRUb2tlbiAhPT0gNSAmJiBzZWNvbmRUb2tlbiAhPT0gMTcpIHsKICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxpbmVCcmVhayAmJiAoc2Vjb25kVG9rZW4gPT09IDEyIHx8IHNlY29uZFRva2VuID09PSAxMykpIHsKICAgICAgICAgICAgcmVwbGFjZUNvbnRlbnQgPSBuZXdMaW5lQW5kSW5kZW50KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzZWNvbmRUb2tlbiA9PT0gMTcpIHsKICAgICAgICAgIHJlcGxhY2VDb250ZW50ID0gb3B0aW9ucy5pbnNlcnRGaW5hbE5ld2xpbmUgPyBlb2wgOiAiIjsKICAgICAgICB9CiAgICAgICAgdmFyIHNlY29uZFRva2VuU3RhcnQgPSBzY2FubmVyMi5nZXRUb2tlbk9mZnNldCgpICsgZm9ybWF0VGV4dFN0YXJ0OwogICAgICAgIGFkZEVkaXQocmVwbGFjZUNvbnRlbnQsIGZpcnN0VG9rZW5FbmQsIHNlY29uZFRva2VuU3RhcnQpOwogICAgICAgIGZpcnN0VG9rZW4gPSBzZWNvbmRUb2tlbjsKICAgICAgfQogICAgICByZXR1cm4gZWRpdE9wZXJhdGlvbnM7CiAgICB9CiAgICBmdW5jdGlvbiByZXBlYXQocywgY291bnQpIHsKICAgICAgdmFyIHJlc3VsdCA9ICIiOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICByZXN1bHQgKz0gczsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gY29tcHV0ZUluZGVudExldmVsKGNvbnRlbnQsIG9wdGlvbnMpIHsKICAgICAgdmFyIGkgPSAwOwogICAgICB2YXIgbkNoYXJzID0gMDsKICAgICAgdmFyIHRhYlNpemUgPSBvcHRpb25zLnRhYlNpemUgfHwgNDsKICAgICAgd2hpbGUgKGkgPCBjb250ZW50Lmxlbmd0aCkgewogICAgICAgIHZhciBjaCA9IGNvbnRlbnQuY2hhckF0KGkpOwogICAgICAgIGlmIChjaCA9PT0gIiAiKSB7CiAgICAgICAgICBuQ2hhcnMrKzsKICAgICAgICB9IGVsc2UgaWYgKGNoID09PSAiCSIpIHsKICAgICAgICAgIG5DaGFycyArPSB0YWJTaXplOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgICB9CiAgICAgIHJldHVybiBNYXRoLmZsb29yKG5DaGFycyAvIHRhYlNpemUpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0RU9MKG9wdGlvbnMsIHRleHQpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGNoID0gdGV4dC5jaGFyQXQoaSk7CiAgICAgICAgaWYgKGNoID09PSAiXHIiKSB7CiAgICAgICAgICBpZiAoaSArIDEgPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0LmNoYXJBdChpICsgMSkgPT09ICJcbiIpIHsKICAgICAgICAgICAgcmV0dXJuICJcclxuIjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAiXHIiOwogICAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICJcbiIpIHsKICAgICAgICAgIHJldHVybiAiXG4iOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb3B0aW9ucyAmJiBvcHRpb25zLmVvbCB8fCAiXG4iOwogICAgfQogICAgZnVuY3Rpb24gaXNFT0wodGV4dCwgb2Zmc2V0KSB7CiAgICAgIHJldHVybiAiXHJcbiIuaW5kZXhPZih0ZXh0LmNoYXJBdChvZmZzZXQpKSAhPT0gLTE7CiAgICB9CiAgICB2YXIgUGFyc2VPcHRpb25zOwogICAgKGZ1bmN0aW9uKFBhcnNlT3B0aW9uczIpIHsKICAgICAgUGFyc2VPcHRpb25zMi5ERUZBVUxUID0gewogICAgICAgIGFsbG93VHJhaWxpbmdDb21tYTogZmFsc2UKICAgICAgfTsKICAgIH0pKFBhcnNlT3B0aW9ucyB8fCAoUGFyc2VPcHRpb25zID0ge30pKTsKICAgIGZ1bmN0aW9uIHBhcnNlKHRleHQsIGVycm9ycywgb3B0aW9ucykgewogICAgICBpZiAoZXJyb3JzID09PSB2b2lkIDApIHsKICAgICAgICBlcnJvcnMgPSBbXTsKICAgICAgfQogICAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7CiAgICAgICAgb3B0aW9ucyA9IFBhcnNlT3B0aW9ucy5ERUZBVUxUOwogICAgICB9CiAgICAgIHZhciBjdXJyZW50UHJvcGVydHkgPSBudWxsOwogICAgICB2YXIgY3VycmVudFBhcmVudCA9IFtdOwogICAgICB2YXIgcHJldmlvdXNQYXJlbnRzID0gW107CiAgICAgIGZ1bmN0aW9uIG9uVmFsdWUodmFsdWUpIHsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50UGFyZW50KSkgewogICAgICAgICAgY3VycmVudFBhcmVudC5wdXNoKHZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRQcm9wZXJ0eSAhPT0gbnVsbCkgewogICAgICAgICAgY3VycmVudFBhcmVudFtjdXJyZW50UHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciB2aXNpdG9yID0gewogICAgICAgIG9uT2JqZWN0QmVnaW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIG9iamVjdCA9IHt9OwogICAgICAgICAgb25WYWx1ZShvYmplY3QpOwogICAgICAgICAgcHJldmlvdXNQYXJlbnRzLnB1c2goY3VycmVudFBhcmVudCk7CiAgICAgICAgICBjdXJyZW50UGFyZW50ID0gb2JqZWN0OwogICAgICAgICAgY3VycmVudFByb3BlcnR5ID0gbnVsbDsKICAgICAgICB9LAogICAgICAgIG9uT2JqZWN0UHJvcGVydHk6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eSA9IG5hbWU7CiAgICAgICAgfSwKICAgICAgICBvbk9iamVjdEVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBjdXJyZW50UGFyZW50ID0gcHJldmlvdXNQYXJlbnRzLnBvcCgpOwogICAgICAgIH0sCiAgICAgICAgb25BcnJheUJlZ2luOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBhcnJheSA9IFtdOwogICAgICAgICAgb25WYWx1ZShhcnJheSk7CiAgICAgICAgICBwcmV2aW91c1BhcmVudHMucHVzaChjdXJyZW50UGFyZW50KTsKICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBhcnJheTsKICAgICAgICAgIGN1cnJlbnRQcm9wZXJ0eSA9IG51bGw7CiAgICAgICAgfSwKICAgICAgICBvbkFycmF5RW5kOiBmdW5jdGlvbigpIHsKICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBwcmV2aW91c1BhcmVudHMucG9wKCk7CiAgICAgICAgfSwKICAgICAgICBvbkxpdGVyYWxWYWx1ZTogb25WYWx1ZSwKICAgICAgICBvbkVycm9yOiBmdW5jdGlvbihlcnJvciwgb2Zmc2V0LCBsZW5ndGgpIHsKICAgICAgICAgIGVycm9ycy5wdXNoKHsgZXJyb3IsIG9mZnNldCwgbGVuZ3RoIH0pOwogICAgICAgIH0KICAgICAgfTsKICAgICAgdmlzaXQodGV4dCwgdmlzaXRvciwgb3B0aW9ucyk7CiAgICAgIHJldHVybiBjdXJyZW50UGFyZW50WzBdOwogICAgfQogICAgZnVuY3Rpb24gZ2V0Tm9kZVBhdGgobm9kZSkgewogICAgICBpZiAoIW5vZGUucGFyZW50IHx8ICFub2RlLnBhcmVudC5jaGlsZHJlbikgewogICAgICAgIHJldHVybiBbXTsKICAgICAgfQogICAgICB2YXIgcGF0aCA9IGdldE5vZGVQYXRoKG5vZGUucGFyZW50KTsKICAgICAgaWYgKG5vZGUucGFyZW50LnR5cGUgPT09ICJwcm9wZXJ0eSIpIHsKICAgICAgICB2YXIga2V5ID0gbm9kZS5wYXJlbnQuY2hpbGRyZW5bMF0udmFsdWU7CiAgICAgICAgcGF0aC5wdXNoKGtleSk7CiAgICAgIH0gZWxzZSBpZiAobm9kZS5wYXJlbnQudHlwZSA9PT0gImFycmF5IikgewogICAgICAgIHZhciBpbmRleCA9IG5vZGUucGFyZW50LmNoaWxkcmVuLmluZGV4T2Yobm9kZSk7CiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgICAgcGF0aC5wdXNoKGluZGV4KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHBhdGg7CiAgICB9CiAgICBmdW5jdGlvbiBnZXROb2RlVmFsdWUobm9kZSkgewogICAgICBzd2l0Y2ggKG5vZGUudHlwZSkgewogICAgICAgIGNhc2UgImFycmF5IjoKICAgICAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLm1hcChnZXROb2RlVmFsdWUpOwogICAgICAgIGNhc2UgIm9iamVjdCI6CiAgICAgICAgICB2YXIgb2JqID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBub2RlLmNoaWxkcmVuOyBfaSA8IF9hLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICB2YXIgcHJvcCA9IF9hW19pXTsKICAgICAgICAgICAgdmFyIHZhbHVlTm9kZSA9IHByb3AuY2hpbGRyZW5bMV07CiAgICAgICAgICAgIGlmICh2YWx1ZU5vZGUpIHsKICAgICAgICAgICAgICBvYmpbcHJvcC5jaGlsZHJlblswXS52YWx1ZV0gPSBnZXROb2RlVmFsdWUodmFsdWVOb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICBjYXNlICJudWxsIjoKICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgIGNhc2UgIm51bWJlciI6CiAgICAgICAgY2FzZSAiYm9vbGVhbiI6CiAgICAgICAgICByZXR1cm4gbm9kZS52YWx1ZTsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnMobm9kZSwgb2Zmc2V0LCBpbmNsdWRlUmlnaHRCb3VuZCkgewogICAgICBpZiAoaW5jbHVkZVJpZ2h0Qm91bmQgPT09IHZvaWQgMCkgewogICAgICAgIGluY2x1ZGVSaWdodEJvdW5kID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIG9mZnNldCA+PSBub2RlLm9mZnNldCAmJiBvZmZzZXQgPCBub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoIHx8IGluY2x1ZGVSaWdodEJvdW5kICYmIG9mZnNldCA9PT0gbm9kZS5vZmZzZXQgKyBub2RlLmxlbmd0aDsKICAgIH0KICAgIGZ1bmN0aW9uIGZpbmROb2RlQXRPZmZzZXQobm9kZSwgb2Zmc2V0LCBpbmNsdWRlUmlnaHRCb3VuZCkgewogICAgICBpZiAoaW5jbHVkZVJpZ2h0Qm91bmQgPT09IHZvaWQgMCkgewogICAgICAgIGluY2x1ZGVSaWdodEJvdW5kID0gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGNvbnRhaW5zKG5vZGUsIG9mZnNldCwgaW5jbHVkZVJpZ2h0Qm91bmQpKSB7CiAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoICYmIGNoaWxkcmVuW2ldLm9mZnNldCA8PSBvZmZzZXQ7IGkrKykgewogICAgICAgICAgICB2YXIgaXRlbSA9IGZpbmROb2RlQXRPZmZzZXQoY2hpbGRyZW5baV0sIG9mZnNldCwgaW5jbHVkZVJpZ2h0Qm91bmQpOwogICAgICAgICAgICBpZiAoaXRlbSkgewogICAgICAgICAgICAgIHJldHVybiBpdGVtOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBub2RlOwogICAgICB9CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9CiAgICBmdW5jdGlvbiB2aXNpdCh0ZXh0LCB2aXNpdG9yLCBvcHRpb25zKSB7CiAgICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsKICAgICAgICBvcHRpb25zID0gUGFyc2VPcHRpb25zLkRFRkFVTFQ7CiAgICAgIH0KICAgICAgdmFyIF9zY2FubmVyID0gY3JlYXRlU2Nhbm5lcih0ZXh0LCBmYWxzZSk7CiAgICAgIGZ1bmN0aW9uIHRvTm9BcmdWaXNpdCh2aXNpdEZ1bmN0aW9uKSB7CiAgICAgICAgcmV0dXJuIHZpc2l0RnVuY3Rpb24gPyBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB2aXNpdEZ1bmN0aW9uKF9zY2FubmVyLmdldFRva2VuT2Zmc2V0KCksIF9zY2FubmVyLmdldFRva2VuTGVuZ3RoKCksIF9zY2FubmVyLmdldFRva2VuU3RhcnRMaW5lKCksIF9zY2FubmVyLmdldFRva2VuU3RhcnRDaGFyYWN0ZXIoKSk7CiAgICAgICAgfSA6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgICAgfQogICAgICBmdW5jdGlvbiB0b09uZUFyZ1Zpc2l0KHZpc2l0RnVuY3Rpb24pIHsKICAgICAgICByZXR1cm4gdmlzaXRGdW5jdGlvbiA/IGZ1bmN0aW9uKGFyZykgewogICAgICAgICAgcmV0dXJuIHZpc2l0RnVuY3Rpb24oYXJnLCBfc2Nhbm5lci5nZXRUb2tlbk9mZnNldCgpLCBfc2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpLCBfc2Nhbm5lci5nZXRUb2tlblN0YXJ0TGluZSgpLCBfc2Nhbm5lci5nZXRUb2tlblN0YXJ0Q2hhcmFjdGVyKCkpOwogICAgICAgIH0gOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CiAgICAgIH0KICAgICAgdmFyIG9uT2JqZWN0QmVnaW4gPSB0b05vQXJnVmlzaXQodmlzaXRvci5vbk9iamVjdEJlZ2luKSwgb25PYmplY3RQcm9wZXJ0eSA9IHRvT25lQXJnVmlzaXQodmlzaXRvci5vbk9iamVjdFByb3BlcnR5KSwgb25PYmplY3RFbmQgPSB0b05vQXJnVmlzaXQodmlzaXRvci5vbk9iamVjdEVuZCksIG9uQXJyYXlCZWdpbiA9IHRvTm9BcmdWaXNpdCh2aXNpdG9yLm9uQXJyYXlCZWdpbiksIG9uQXJyYXlFbmQgPSB0b05vQXJnVmlzaXQodmlzaXRvci5vbkFycmF5RW5kKSwgb25MaXRlcmFsVmFsdWUgPSB0b09uZUFyZ1Zpc2l0KHZpc2l0b3Iub25MaXRlcmFsVmFsdWUpLCBvblNlcGFyYXRvciA9IHRvT25lQXJnVmlzaXQodmlzaXRvci5vblNlcGFyYXRvciksIG9uQ29tbWVudCA9IHRvTm9BcmdWaXNpdCh2aXNpdG9yLm9uQ29tbWVudCksIG9uRXJyb3IgPSB0b09uZUFyZ1Zpc2l0KHZpc2l0b3Iub25FcnJvcik7CiAgICAgIHZhciBkaXNhbGxvd0NvbW1lbnRzID0gb3B0aW9ucyAmJiBvcHRpb25zLmRpc2FsbG93Q29tbWVudHM7CiAgICAgIHZhciBhbGxvd1RyYWlsaW5nQ29tbWEgPSBvcHRpb25zICYmIG9wdGlvbnMuYWxsb3dUcmFpbGluZ0NvbW1hOwogICAgICBmdW5jdGlvbiBzY2FuTmV4dCgpIHsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgdmFyIHRva2VuID0gX3NjYW5uZXIuc2NhbigpOwogICAgICAgICAgc3dpdGNoIChfc2Nhbm5lci5nZXRUb2tlbkVycm9yKCkpIHsKICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgIGhhbmRsZUVycm9yKDE0KTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgIGhhbmRsZUVycm9yKDE1KTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgIGhhbmRsZUVycm9yKDEzKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgIGlmICghZGlzYWxsb3dDb21tZW50cykgewogICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoMTEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgIGhhbmRsZUVycm9yKDEyKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSA2OgogICAgICAgICAgICAgIGhhbmRsZUVycm9yKDE2KTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgICAgY2FzZSAxMjoKICAgICAgICAgICAgY2FzZSAxMzoKICAgICAgICAgICAgICBpZiAoZGlzYWxsb3dDb21tZW50cykgewogICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoMTApOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvbkNvbW1lbnQoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoMSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMTU6CiAgICAgICAgICAgIGNhc2UgMTQ6CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBoYW5kbGVFcnJvcihlcnJvciwgc2tpcFVudGlsQWZ0ZXIsIHNraXBVbnRpbCkgewogICAgICAgIGlmIChza2lwVW50aWxBZnRlciA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBza2lwVW50aWxBZnRlciA9IFtdOwogICAgICAgIH0KICAgICAgICBpZiAoc2tpcFVudGlsID09PSB2b2lkIDApIHsKICAgICAgICAgIHNraXBVbnRpbCA9IFtdOwogICAgICAgIH0KICAgICAgICBvbkVycm9yKGVycm9yKTsKICAgICAgICBpZiAoc2tpcFVudGlsQWZ0ZXIubGVuZ3RoICsgc2tpcFVudGlsLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHZhciB0b2tlbiA9IF9zY2FubmVyLmdldFRva2VuKCk7CiAgICAgICAgICB3aGlsZSAodG9rZW4gIT09IDE3KSB7CiAgICAgICAgICAgIGlmIChza2lwVW50aWxBZnRlci5pbmRleE9mKHRva2VuKSAhPT0gLTEpIHsKICAgICAgICAgICAgICBzY2FuTmV4dCgpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9IGVsc2UgaWYgKHNraXBVbnRpbC5pbmRleE9mKHRva2VuKSAhPT0gLTEpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICB0b2tlbiA9IHNjYW5OZXh0KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBhcnNlU3RyaW5nKGlzVmFsdWUpIHsKICAgICAgICB2YXIgdmFsdWUgPSBfc2Nhbm5lci5nZXRUb2tlblZhbHVlKCk7CiAgICAgICAgaWYgKGlzVmFsdWUpIHsKICAgICAgICAgIG9uTGl0ZXJhbFZhbHVlKHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb25PYmplY3RQcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHNjYW5OZXh0KCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcGFyc2VMaXRlcmFsKCkgewogICAgICAgIHN3aXRjaCAoX3NjYW5uZXIuZ2V0VG9rZW4oKSkgewogICAgICAgICAgY2FzZSAxMToKICAgICAgICAgICAgdmFyIHRva2VuVmFsdWUgPSBfc2Nhbm5lci5nZXRUb2tlblZhbHVlKCk7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IE51bWJlcih0b2tlblZhbHVlKTsKICAgICAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSkgewogICAgICAgICAgICAgIGhhbmRsZUVycm9yKDIpOwogICAgICAgICAgICAgIHZhbHVlID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBvbkxpdGVyYWxWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSA3OgogICAgICAgICAgICBvbkxpdGVyYWxWYWx1ZShudWxsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIDg6CiAgICAgICAgICAgIG9uTGl0ZXJhbFZhbHVlKHRydWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgOToKICAgICAgICAgICAgb25MaXRlcmFsVmFsdWUoZmFsc2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc2Nhbk5leHQoKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBwYXJzZVByb3BlcnR5KCkgewogICAgICAgIGlmIChfc2Nhbm5lci5nZXRUb2tlbigpICE9PSAxMCkgewogICAgICAgICAgaGFuZGxlRXJyb3IoMywgW10sIFsyLCA1XSk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHBhcnNlU3RyaW5nKGZhbHNlKTsKICAgICAgICBpZiAoX3NjYW5uZXIuZ2V0VG9rZW4oKSA9PT0gNikgewogICAgICAgICAgb25TZXBhcmF0b3IoIjoiKTsKICAgICAgICAgIHNjYW5OZXh0KCk7CiAgICAgICAgICBpZiAoIXBhcnNlVmFsdWUoKSkgewogICAgICAgICAgICBoYW5kbGVFcnJvcig0LCBbXSwgWzIsIDVdKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaGFuZGxlRXJyb3IoNSwgW10sIFsyLCA1XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBhcnNlT2JqZWN0KCkgewogICAgICAgIG9uT2JqZWN0QmVnaW4oKTsKICAgICAgICBzY2FuTmV4dCgpOwogICAgICAgIHZhciBuZWVkc0NvbW1hID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKF9zY2FubmVyLmdldFRva2VuKCkgIT09IDIgJiYgX3NjYW5uZXIuZ2V0VG9rZW4oKSAhPT0gMTcpIHsKICAgICAgICAgIGlmIChfc2Nhbm5lci5nZXRUb2tlbigpID09PSA1KSB7CiAgICAgICAgICAgIGlmICghbmVlZHNDb21tYSkgewogICAgICAgICAgICAgIGhhbmRsZUVycm9yKDQsIFtdLCBbXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb25TZXBhcmF0b3IoIiwiKTsKICAgICAgICAgICAgc2Nhbk5leHQoKTsKICAgICAgICAgICAgaWYgKF9zY2FubmVyLmdldFRva2VuKCkgPT09IDIgJiYgYWxsb3dUcmFpbGluZ0NvbW1hKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAobmVlZHNDb21tYSkgewogICAgICAgICAgICBoYW5kbGVFcnJvcig2LCBbXSwgW10pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFwYXJzZVByb3BlcnR5KCkpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoNCwgW10sIFsyLCA1XSk7CiAgICAgICAgICB9CiAgICAgICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgb25PYmplY3RFbmQoKTsKICAgICAgICBpZiAoX3NjYW5uZXIuZ2V0VG9rZW4oKSAhPT0gMikgewogICAgICAgICAgaGFuZGxlRXJyb3IoNywgWzJdLCBbXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNjYW5OZXh0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBhcnNlQXJyYXkoKSB7CiAgICAgICAgb25BcnJheUJlZ2luKCk7CiAgICAgICAgc2Nhbk5leHQoKTsKICAgICAgICB2YXIgbmVlZHNDb21tYSA9IGZhbHNlOwogICAgICAgIHdoaWxlIChfc2Nhbm5lci5nZXRUb2tlbigpICE9PSA0ICYmIF9zY2FubmVyLmdldFRva2VuKCkgIT09IDE3KSB7CiAgICAgICAgICBpZiAoX3NjYW5uZXIuZ2V0VG9rZW4oKSA9PT0gNSkgewogICAgICAgICAgICBpZiAoIW5lZWRzQ29tbWEpIHsKICAgICAgICAgICAgICBoYW5kbGVFcnJvcig0LCBbXSwgW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG9uU2VwYXJhdG9yKCIsIik7CiAgICAgICAgICAgIHNjYW5OZXh0KCk7CiAgICAgICAgICAgIGlmIChfc2Nhbm5lci5nZXRUb2tlbigpID09PSA0ICYmIGFsbG93VHJhaWxpbmdDb21tYSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IoNiwgW10sIFtdKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghcGFyc2VWYWx1ZSgpKSB7CiAgICAgICAgICAgIGhhbmRsZUVycm9yKDQsIFtdLCBbNCwgNV0pOwogICAgICAgICAgfQogICAgICAgICAgbmVlZHNDb21tYSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIG9uQXJyYXlFbmQoKTsKICAgICAgICBpZiAoX3NjYW5uZXIuZ2V0VG9rZW4oKSAhPT0gNCkgewogICAgICAgICAgaGFuZGxlRXJyb3IoOCwgWzRdLCBbXSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNjYW5OZXh0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHBhcnNlVmFsdWUoKSB7CiAgICAgICAgc3dpdGNoIChfc2Nhbm5lci5nZXRUb2tlbigpKSB7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHJldHVybiBwYXJzZUFycmF5KCk7CiAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIHJldHVybiBwYXJzZU9iamVjdCgpOwogICAgICAgICAgY2FzZSAxMDoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nKHRydWUpOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHBhcnNlTGl0ZXJhbCgpOwogICAgICAgIH0KICAgICAgfQogICAgICBzY2FuTmV4dCgpOwogICAgICBpZiAoX3NjYW5uZXIuZ2V0VG9rZW4oKSA9PT0gMTcpIHsKICAgICAgICBpZiAob3B0aW9ucy5hbGxvd0VtcHR5Q29udGVudCkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGhhbmRsZUVycm9yKDQsIFtdLCBbXSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGlmICghcGFyc2VWYWx1ZSgpKSB7CiAgICAgICAgaGFuZGxlRXJyb3IoNCwgW10sIFtdKTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKF9zY2FubmVyLmdldFRva2VuKCkgIT09IDE3KSB7CiAgICAgICAgaGFuZGxlRXJyb3IoOSwgW10sIFtdKTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIHZhciBjcmVhdGVTY2FubmVyMiA9IGNyZWF0ZVNjYW5uZXI7CiAgICB2YXIgcGFyc2UyID0gcGFyc2U7CiAgICB2YXIgZmluZE5vZGVBdE9mZnNldDIgPSBmaW5kTm9kZUF0T2Zmc2V0OwogICAgdmFyIGdldE5vZGVQYXRoMiA9IGdldE5vZGVQYXRoOwogICAgdmFyIGdldE5vZGVWYWx1ZTIgPSBnZXROb2RlVmFsdWU7CiAgICBmdW5jdGlvbiBmb3JtYXQyKGRvY3VtZW50VGV4dCwgcmFuZ2UsIG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIGZvcm1hdChkb2N1bWVudFRleHQsIHJhbmdlLCBvcHRpb25zKTsKICAgIH0KCiAgICAvLyBub2RlX21vZHVsZXMvdnNjb2RlLWpzb24tbGFuZ3VhZ2VzZXJ2aWNlL2xpYi9lc20vdXRpbHMvb2JqZWN0cy5qcwogICAgZnVuY3Rpb24gZXF1YWxzKG9uZSwgb3RoZXIpIHsKICAgICAgaWYgKG9uZSA9PT0gb3RoZXIpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAob25lID09PSBudWxsIHx8IG9uZSA9PT0gdm9pZCAwIHx8IG90aGVyID09PSBudWxsIHx8IG90aGVyID09PSB2b2lkIDApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBvbmUgIT09IHR5cGVvZiBvdGhlcikgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIG9uZSAhPT0gIm9iamVjdCIpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKEFycmF5LmlzQXJyYXkob25lKSAhPT0gQXJyYXkuaXNBcnJheShvdGhlcikpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGksIGtleTsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkob25lKSkgewogICAgICAgIGlmIChvbmUubGVuZ3RoICE9PSBvdGhlci5sZW5ndGgpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG9uZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKCFlcXVhbHMob25lW2ldLCBvdGhlcltpXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgb25lS2V5cyA9IFtdOwogICAgICAgIGZvciAoa2V5IGluIG9uZSkgewogICAgICAgICAgb25lS2V5cy5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICAgIG9uZUtleXMuc29ydCgpOwogICAgICAgIHZhciBvdGhlcktleXMgPSBbXTsKICAgICAgICBmb3IgKGtleSBpbiBvdGhlcikgewogICAgICAgICAgb3RoZXJLZXlzLnB1c2goa2V5KTsKICAgICAgICB9CiAgICAgICAgb3RoZXJLZXlzLnNvcnQoKTsKICAgICAgICBpZiAoIWVxdWFscyhvbmVLZXlzLCBvdGhlcktleXMpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBvbmVLZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoIWVxdWFscyhvbmVbb25lS2V5c1tpXV0sIG90aGVyW29uZUtleXNbaV1dKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gaXNOdW1iZXIodmFsKSB7CiAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAibnVtYmVyIjsKICAgIH0KICAgIGZ1bmN0aW9uIGlzRGVmaW5lZCh2YWwpIHsKICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgIT09ICJ1bmRlZmluZWQiOwogICAgfQogICAgZnVuY3Rpb24gaXNCb29sZWFuKHZhbCkgewogICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gImJvb2xlYW4iOwogICAgfQogICAgZnVuY3Rpb24gaXNTdHJpbmcodmFsKSB7CiAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAic3RyaW5nIjsKICAgIH0KCiAgICAvLyBub2RlX21vZHVsZXMvdnNjb2RlLWpzb24tbGFuZ3VhZ2VzZXJ2aWNlL2xpYi9lc20vdXRpbHMvc3RyaW5ncy5qcwogICAgZnVuY3Rpb24gc3RhcnRzV2l0aChoYXlzdGFjaywgbmVlZGxlKSB7CiAgICAgIGlmIChoYXlzdGFjay5sZW5ndGggPCBuZWVkbGUubGVuZ3RoKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVlZGxlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGhheXN0YWNrW2ldICE9PSBuZWVkbGVbaV0pIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBmdW5jdGlvbiBlbmRzV2l0aChoYXlzdGFjaywgbmVlZGxlKSB7CiAgICAgIHZhciBkaWZmID0gaGF5c3RhY2subGVuZ3RoIC0gbmVlZGxlLmxlbmd0aDsKICAgICAgaWYgKGRpZmYgPiAwKSB7CiAgICAgICAgcmV0dXJuIGhheXN0YWNrLmxhc3RJbmRleE9mKG5lZWRsZSkgPT09IGRpZmY7CiAgICAgIH0gZWxzZSBpZiAoZGlmZiA9PT0gMCkgewogICAgICAgIHJldHVybiBoYXlzdGFjayA9PT0gbmVlZGxlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZXh0ZW5kZWRSZWdFeHAocGF0dGVybikgewogICAgICB2YXIgZmxhZ3MgPSAiIjsKICAgICAgaWYgKHN0YXJ0c1dpdGgocGF0dGVybiwgIig/aSkiKSkgewogICAgICAgIHBhdHRlcm4gPSBwYXR0ZXJuLnN1YnN0cmluZyg0KTsKICAgICAgICBmbGFncyA9ICJpIjsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzICsgInUiKTsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChwYXR0ZXJuLCBmbGFncyk7CiAgICAgICAgfSBjYXRjaCAoZTIpIHsKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICB2YXIgaW50ZWdlcjsKICAgIChmdW5jdGlvbihpbnRlZ2VyMikgewogICAgICBpbnRlZ2VyMi5NSU5fVkFMVUUgPSAtMjE0NzQ4MzY0ODsKICAgICAgaW50ZWdlcjIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NzsKICAgIH0pKGludGVnZXIgfHwgKGludGVnZXIgPSB7fSkpOwogICAgdmFyIHVpbnRlZ2VyOwogICAgKGZ1bmN0aW9uKHVpbnRlZ2VyMikgewogICAgICB1aW50ZWdlcjIuTUlOX1ZBTFVFID0gMDsKICAgICAgdWludGVnZXIyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7CiAgICB9KSh1aW50ZWdlciB8fCAodWludGVnZXIgPSB7fSkpOwogICAgdmFyIFBvc2l0aW9uOwogICAgKGZ1bmN0aW9uKFBvc2l0aW9uMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUobGluZSwgY2hhcmFjdGVyKSB7CiAgICAgICAgaWYgKGxpbmUgPT09IE51bWJlci5NQVhfVkFMVUUpIHsKICAgICAgICAgIGxpbmUgPSB1aW50ZWdlci5NQVhfVkFMVUU7CiAgICAgICAgfQogICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IE51bWJlci5NQVhfVkFMVUUpIHsKICAgICAgICAgIGNoYXJhY3RlciA9IHVpbnRlZ2VyLk1BWF9WQUxVRTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgbGluZSwgY2hhcmFjdGVyIH07CiAgICAgIH0KICAgICAgUG9zaXRpb24yLmNyZWF0ZSA9IGNyZWF0ZTsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmNoYXJhY3Rlcik7CiAgICAgIH0KICAgICAgUG9zaXRpb24yLmlzID0gaXM7CiAgICB9KShQb3NpdGlvbiB8fCAoUG9zaXRpb24gPSB7fSkpOwogICAgdmFyIFJhbmdlOwogICAgKGZ1bmN0aW9uKFJhbmdlMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUob25lLCB0d28sIHRocmVlLCBmb3VyKSB7CiAgICAgICAgaWYgKElzLnVpbnRlZ2VyKG9uZSkgJiYgSXMudWludGVnZXIodHdvKSAmJiBJcy51aW50ZWdlcih0aHJlZSkgJiYgSXMudWludGVnZXIoZm91cikpIHsKICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBQb3NpdGlvbi5jcmVhdGUob25lLCB0d28pLCBlbmQ6IFBvc2l0aW9uLmNyZWF0ZSh0aHJlZSwgZm91cikgfTsKICAgICAgICB9IGVsc2UgaWYgKFBvc2l0aW9uLmlzKG9uZSkgJiYgUG9zaXRpb24uaXModHdvKSkgewogICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG9uZSwgZW5kOiB0d28gfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJSYW5nZSNjcmVhdGUgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHNbIiArIG9uZSArICIsICIgKyB0d28gKyAiLCAiICsgdGhyZWUgKyAiLCAiICsgZm91ciArICJdIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIFJhbmdlMi5jcmVhdGUgPSBjcmVhdGU7CiAgICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnN0YXJ0KSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuZW5kKTsKICAgICAgfQogICAgICBSYW5nZTIuaXMgPSBpczsKICAgIH0pKFJhbmdlIHx8IChSYW5nZSA9IHt9KSk7CiAgICB2YXIgTG9jYXRpb247CiAgICAoZnVuY3Rpb24oTG9jYXRpb24yKSB7CiAgICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHsgdXJpLCByYW5nZSB9OwogICAgICB9CiAgICAgIExvY2F0aW9uMi5jcmVhdGUgPSBjcmVhdGU7CiAgICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUudXJpKSk7CiAgICAgIH0KICAgICAgTG9jYXRpb24yLmlzID0gaXM7CiAgICB9KShMb2NhdGlvbiB8fCAoTG9jYXRpb24gPSB7fSkpOwogICAgdmFyIExvY2F0aW9uTGluazsKICAgIChmdW5jdGlvbihMb2NhdGlvbkxpbmsyKSB7CiAgICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHsKICAgICAgICByZXR1cm4geyB0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UgfTsKICAgICAgfQogICAgICBMb2NhdGlvbkxpbmsyLmNyZWF0ZSA9IGNyZWF0ZTsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0UmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0VXJpKSAmJiAoUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFNlbGVjdGlvblJhbmdlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRhcmdldFNlbGVjdGlvblJhbmdlKSkgJiYgKFJhbmdlLmlzKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkpOwogICAgICB9CiAgICAgIExvY2F0aW9uTGluazIuaXMgPSBpczsKICAgIH0pKExvY2F0aW9uTGluayB8fCAoTG9jYXRpb25MaW5rID0ge30pKTsKICAgIHZhciBDb2xvcjsKICAgIChmdW5jdGlvbihDb2xvcjIpIHsKICAgICAgZnVuY3Rpb24gY3JlYXRlKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJlZCwKICAgICAgICAgIGdyZWVuLAogICAgICAgICAgYmx1ZSwKICAgICAgICAgIGFscGhhCiAgICAgICAgfTsKICAgICAgfQogICAgICBDb2xvcjIuY3JlYXRlID0gY3JlYXRlOwogICAgICBmdW5jdGlvbiBpcyh2YWx1ZSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSB2YWx1ZTsKICAgICAgICByZXR1cm4gSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLnJlZCwgMCwgMSkgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmdyZWVuLCAwLCAxKSAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYmx1ZSwgMCwgMSkgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmFscGhhLCAwLCAxKTsKICAgICAgfQogICAgICBDb2xvcjIuaXMgPSBpczsKICAgIH0pKENvbG9yIHx8IChDb2xvciA9IHt9KSk7CiAgICB2YXIgQ29sb3JJbmZvcm1hdGlvbjsKICAgIChmdW5jdGlvbihDb2xvckluZm9ybWF0aW9uMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGNvbG9yKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJhbmdlLAogICAgICAgICAgY29sb3IKICAgICAgICB9OwogICAgICB9CiAgICAgIENvbG9ySW5mb3JtYXRpb24yLmNyZWF0ZSA9IGNyZWF0ZTsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgQ29sb3IuaXMoY2FuZGlkYXRlLmNvbG9yKTsKICAgICAgfQogICAgICBDb2xvckluZm9ybWF0aW9uMi5pcyA9IGlzOwogICAgfSkoQ29sb3JJbmZvcm1hdGlvbiB8fCAoQ29sb3JJbmZvcm1hdGlvbiA9IHt9KSk7CiAgICB2YXIgQ29sb3JQcmVzZW50YXRpb247CiAgICAoZnVuY3Rpb24oQ29sb3JQcmVzZW50YXRpb24yKSB7CiAgICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgdGV4dEVkaXQsIGFkZGl0aW9uYWxUZXh0RWRpdHMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgbGFiZWwsCiAgICAgICAgICB0ZXh0RWRpdCwKICAgICAgICAgIGFkZGl0aW9uYWxUZXh0RWRpdHMKICAgICAgICB9OwogICAgICB9CiAgICAgIENvbG9yUHJlc2VudGF0aW9uMi5jcmVhdGUgPSBjcmVhdGU7CiAgICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50ZXh0RWRpdCkgfHwgVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cykgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cywgVGV4dEVkaXQuaXMpKTsKICAgICAgfQogICAgICBDb2xvclByZXNlbnRhdGlvbjIuaXMgPSBpczsKICAgIH0pKENvbG9yUHJlc2VudGF0aW9uIHx8IChDb2xvclByZXNlbnRhdGlvbiA9IHt9KSk7CiAgICB2YXIgRm9sZGluZ1JhbmdlS2luZDsKICAgIChmdW5jdGlvbihGb2xkaW5nUmFuZ2VLaW5kMikgewogICAgICBGb2xkaW5nUmFuZ2VLaW5kMlsiQ29tbWVudCJdID0gImNvbW1lbnQiOwogICAgICBGb2xkaW5nUmFuZ2VLaW5kMlsiSW1wb3J0cyJdID0gImltcG9ydHMiOwogICAgICBGb2xkaW5nUmFuZ2VLaW5kMlsiUmVnaW9uIl0gPSAicmVnaW9uIjsKICAgIH0pKEZvbGRpbmdSYW5nZUtpbmQgfHwgKEZvbGRpbmdSYW5nZUtpbmQgPSB7fSkpOwogICAgdmFyIEZvbGRpbmdSYW5nZTsKICAgIChmdW5jdGlvbihGb2xkaW5nUmFuZ2UyKSB7CiAgICAgIGZ1bmN0aW9uIGNyZWF0ZShzdGFydExpbmUsIGVuZExpbmUsIHN0YXJ0Q2hhcmFjdGVyLCBlbmRDaGFyYWN0ZXIsIGtpbmQpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgc3RhcnRMaW5lLAogICAgICAgICAgZW5kTGluZQogICAgICAgIH07CiAgICAgICAgaWYgKElzLmRlZmluZWQoc3RhcnRDaGFyYWN0ZXIpKSB7CiAgICAgICAgICByZXN1bHQuc3RhcnRDaGFyYWN0ZXIgPSBzdGFydENoYXJhY3RlcjsKICAgICAgICB9CiAgICAgICAgaWYgKElzLmRlZmluZWQoZW5kQ2hhcmFjdGVyKSkgewogICAgICAgICAgcmVzdWx0LmVuZENoYXJhY3RlciA9IGVuZENoYXJhY3RlcjsKICAgICAgICB9CiAgICAgICAgaWYgKElzLmRlZmluZWQoa2luZCkpIHsKICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBGb2xkaW5nUmFuZ2UyLmNyZWF0ZSA9IGNyZWF0ZTsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5raW5kKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKTsKICAgICAgfQogICAgICBGb2xkaW5nUmFuZ2UyLmlzID0gaXM7CiAgICB9KShGb2xkaW5nUmFuZ2UgfHwgKEZvbGRpbmdSYW5nZSA9IHt9KSk7CiAgICB2YXIgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbjsKICAgIChmdW5jdGlvbihEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUobG9jYXRpb24sIG1lc3NhZ2UpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgbG9jYXRpb24sCiAgICAgICAgICBtZXNzYWdlCiAgICAgICAgfTsKICAgICAgfQogICAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uMi5jcmVhdGUgPSBjcmVhdGU7CiAgICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpOwogICAgICB9CiAgICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24yLmlzID0gaXM7CiAgICB9KShEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIHx8IChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uID0ge30pKTsKICAgIHZhciBEaWFnbm9zdGljU2V2ZXJpdHk7CiAgICAoZnVuY3Rpb24oRGlhZ25vc3RpY1NldmVyaXR5MikgewogICAgICBEaWFnbm9zdGljU2V2ZXJpdHkyLkVycm9yID0gMTsKICAgICAgRGlhZ25vc3RpY1NldmVyaXR5Mi5XYXJuaW5nID0gMjsKICAgICAgRGlhZ25vc3RpY1NldmVyaXR5Mi5JbmZvcm1hdGlvbiA9IDM7CiAgICAgIERpYWdub3N0aWNTZXZlcml0eTIuSGludCA9IDQ7CiAgICB9KShEaWFnbm9zdGljU2V2ZXJpdHkgfHwgKERpYWdub3N0aWNTZXZlcml0eSA9IHt9KSk7CiAgICB2YXIgRGlhZ25vc3RpY1RhZzsKICAgIChmdW5jdGlvbihEaWFnbm9zdGljVGFnMikgewogICAgICBEaWFnbm9zdGljVGFnMi5Vbm5lY2Vzc2FyeSA9IDE7CiAgICAgIERpYWdub3N0aWNUYWcyLkRlcHJlY2F0ZWQgPSAyOwogICAgfSkoRGlhZ25vc3RpY1RhZyB8fCAoRGlhZ25vc3RpY1RhZyA9IHt9KSk7CiAgICB2YXIgQ29kZURlc2NyaXB0aW9uOwogICAgKGZ1bmN0aW9uKENvZGVEZXNjcmlwdGlvbjIpIHsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdm9pZCAwICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmhyZWYpOwogICAgICB9CiAgICAgIENvZGVEZXNjcmlwdGlvbjIuaXMgPSBpczsKICAgIH0pKENvZGVEZXNjcmlwdGlvbiB8fCAoQ29kZURlc2NyaXB0aW9uID0ge30pKTsKICAgIHZhciBEaWFnbm9zdGljOwogICAgKGZ1bmN0aW9uKERpYWdub3N0aWMyKSB7CiAgICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgbWVzc2FnZSwgc2V2ZXJpdHksIGNvZGUsIHNvdXJjZSwgcmVsYXRlZEluZm9ybWF0aW9uKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsgcmFuZ2UsIG1lc3NhZ2UgfTsKICAgICAgICBpZiAoSXMuZGVmaW5lZChzZXZlcml0eSkpIHsKICAgICAgICAgIHJlc3VsdC5zZXZlcml0eSA9IHNldmVyaXR5OwogICAgICAgIH0KICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2RlKSkgewogICAgICAgICAgcmVzdWx0LmNvZGUgPSBjb2RlOwogICAgICAgIH0KICAgICAgICBpZiAoSXMuZGVmaW5lZChzb3VyY2UpKSB7CiAgICAgICAgICByZXN1bHQuc291cmNlID0gc291cmNlOwogICAgICAgIH0KICAgICAgICBpZiAoSXMuZGVmaW5lZChyZWxhdGVkSW5mb3JtYXRpb24pKSB7CiAgICAgICAgICByZXN1bHQucmVsYXRlZEluZm9ybWF0aW9uID0gcmVsYXRlZEluZm9ybWF0aW9uOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIERpYWdub3N0aWMyLmNyZWF0ZSA9IGNyZWF0ZTsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgX2E7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpICYmIChJcy5udW1iZXIoY2FuZGlkYXRlLnNldmVyaXR5KSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNldmVyaXR5KSkgJiYgKElzLmludGVnZXIoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuY29kZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlKSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSB8fCBJcy5zdHJpbmcoKF9hID0gY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhyZWYpKSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5zb3VyY2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc291cmNlKSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24sIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMpKTsKICAgICAgfQogICAgICBEaWFnbm9zdGljMi5pcyA9IGlzOwogICAgfSkoRGlhZ25vc3RpYyB8fCAoRGlhZ25vc3RpYyA9IHt9KSk7CiAgICB2YXIgQ29tbWFuZDsKICAgIChmdW5jdGlvbihDb21tYW5kMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGNvbW1hbmQpIHsKICAgICAgICB2YXIgYXJncyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICBhcmdzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0geyB0aXRsZSwgY29tbWFuZCB9OwogICAgICAgIGlmIChJcy5kZWZpbmVkKGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMCkgewogICAgICAgICAgcmVzdWx0LmFyZ3VtZW50cyA9IGFyZ3M7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgQ29tbWFuZDIuY3JlYXRlID0gY3JlYXRlOwogICAgICBmdW5jdGlvbiBpcyh2YWx1ZSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSB2YWx1ZTsKICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuY29tbWFuZCk7CiAgICAgIH0KICAgICAgQ29tbWFuZDIuaXMgPSBpczsKICAgIH0pKENvbW1hbmQgfHwgKENvbW1hbmQgPSB7fSkpOwogICAgdmFyIFRleHRFZGl0OwogICAgKGZ1bmN0aW9uKFRleHRFZGl0MikgewogICAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0KSB7CiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQgfTsKICAgICAgfQogICAgICBUZXh0RWRpdDIucmVwbGFjZSA9IHJlcGxhY2U7CiAgICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCkgewogICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0IH07CiAgICAgIH0KICAgICAgVGV4dEVkaXQyLmluc2VydCA9IGluc2VydDsKICAgICAgZnVuY3Rpb24gZGVsKHJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICIiIH07CiAgICAgIH0KICAgICAgVGV4dEVkaXQyLmRlbCA9IGRlbDsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSk7CiAgICAgIH0KICAgICAgVGV4dEVkaXQyLmlzID0gaXM7CiAgICB9KShUZXh0RWRpdCB8fCAoVGV4dEVkaXQgPSB7fSkpOwogICAgdmFyIENoYW5nZUFubm90YXRpb247CiAgICAoZnVuY3Rpb24oQ2hhbmdlQW5ub3RhdGlvbjIpIHsKICAgICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBuZWVkc0NvbmZpcm1hdGlvbiwgZGVzY3JpcHRpb24pIHsKICAgICAgICB2YXIgcmVzdWx0ID0geyBsYWJlbCB9OwogICAgICAgIGlmIChuZWVkc0NvbmZpcm1hdGlvbiAhPT0gdm9pZCAwKSB7CiAgICAgICAgICByZXN1bHQubmVlZHNDb25maXJtYXRpb24gPSBuZWVkc0NvbmZpcm1hdGlvbjsKICAgICAgICB9CiAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9PSB2b2lkIDApIHsKICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIENoYW5nZUFubm90YXRpb24yLmNyZWF0ZSA9IGNyZWF0ZTsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdm9pZCAwICYmIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSAmJiAoSXMuYm9vbGVhbihjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24pIHx8IGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbiA9PT0gdm9pZCAwKSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB2b2lkIDApOwogICAgICB9CiAgICAgIENoYW5nZUFubm90YXRpb24yLmlzID0gaXM7CiAgICB9KShDaGFuZ2VBbm5vdGF0aW9uIHx8IChDaGFuZ2VBbm5vdGF0aW9uID0ge30pKTsKICAgIHZhciBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcjsKICAgIChmdW5jdGlvbihDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcjIpIHsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBjYW5kaWRhdGUgPT09ICJzdHJpbmciOwogICAgICB9CiAgICAgIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyMi5pcyA9IGlzOwogICAgfSkoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgfHwgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyID0ge30pKTsKICAgIHZhciBBbm5vdGF0ZWRUZXh0RWRpdDsKICAgIChmdW5jdGlvbihBbm5vdGF0ZWRUZXh0RWRpdDIpIHsKICAgICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikgewogICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTsKICAgICAgfQogICAgICBBbm5vdGF0ZWRUZXh0RWRpdDIucmVwbGFjZSA9IHJlcGxhY2U7CiAgICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikgewogICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTsKICAgICAgfQogICAgICBBbm5vdGF0ZWRUZXh0RWRpdDIuaW5zZXJ0ID0gaW5zZXJ0OwogICAgICBmdW5jdGlvbiBkZWwocmFuZ2UsIGFubm90YXRpb24pIHsKICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogIiIsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9OwogICAgICB9CiAgICAgIEFubm90YXRlZFRleHRFZGl0Mi5kZWwgPSBkZWw7CiAgICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpICYmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTsKICAgICAgfQogICAgICBBbm5vdGF0ZWRUZXh0RWRpdDIuaXMgPSBpczsKICAgIH0pKEFubm90YXRlZFRleHRFZGl0IHx8IChBbm5vdGF0ZWRUZXh0RWRpdCA9IHt9KSk7CiAgICB2YXIgVGV4dERvY3VtZW50RWRpdDsKICAgIChmdW5jdGlvbihUZXh0RG9jdW1lbnRFZGl0MikgewogICAgICBmdW5jdGlvbiBjcmVhdGUodGV4dERvY3VtZW50LCBlZGl0cykgewogICAgICAgIHJldHVybiB7IHRleHREb2N1bWVudCwgZWRpdHMgfTsKICAgICAgfQogICAgICBUZXh0RG9jdW1lbnRFZGl0Mi5jcmVhdGUgPSBjcmVhdGU7CiAgICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS50ZXh0RG9jdW1lbnQpICYmIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmVkaXRzKTsKICAgICAgfQogICAgICBUZXh0RG9jdW1lbnRFZGl0Mi5pcyA9IGlzOwogICAgfSkoVGV4dERvY3VtZW50RWRpdCB8fCAoVGV4dERvY3VtZW50RWRpdCA9IHt9KSk7CiAgICB2YXIgQ3JlYXRlRmlsZTsKICAgIChmdW5jdGlvbihDcmVhdGVGaWxlMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgIGtpbmQ6ICJjcmVhdGUiLAogICAgICAgICAgdXJpCiAgICAgICAgfTsKICAgICAgICBpZiAob3B0aW9ucyAhPT0gdm9pZCAwICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdm9pZCAwIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHZvaWQgMCkpIHsKICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9uczsKICAgICAgICB9CiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHZvaWQgMCkgewogICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgQ3JlYXRlRmlsZTIuY3JlYXRlID0gY3JlYXRlOwogICAgICBmdW5jdGlvbiBpcyh2YWx1ZSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSB2YWx1ZTsKICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAiY3JlYXRlIiAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB2b2lkIDAgfHwgKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdm9pZCAwIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB2b2lkIDAgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdm9pZCAwIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTsKICAgICAgfQogICAgICBDcmVhdGVGaWxlMi5pcyA9IGlzOwogICAgfSkoQ3JlYXRlRmlsZSB8fCAoQ3JlYXRlRmlsZSA9IHt9KSk7CiAgICB2YXIgUmVuYW1lRmlsZTsKICAgIChmdW5jdGlvbihSZW5hbWVGaWxlMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGFubm90YXRpb24pIHsKICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAga2luZDogInJlbmFtZSIsCiAgICAgICAgICBvbGRVcmksCiAgICAgICAgICBuZXdVcmkKICAgICAgICB9OwogICAgICAgIGlmIChvcHRpb25zICE9PSB2b2lkIDAgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB2b2lkIDAgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdm9pZCAwKSkgewogICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgIH0KICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdm9pZCAwKSB7CiAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBSZW5hbWVGaWxlMi5jcmVhdGUgPSBjcmVhdGU7CiAgICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICJyZW5hbWUiICYmIElzLnN0cmluZyhjYW5kaWRhdGUub2xkVXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1VyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB2b2lkIDAgfHwgKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdm9pZCAwIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB2b2lkIDAgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdm9pZCAwIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTsKICAgICAgfQogICAgICBSZW5hbWVGaWxlMi5pcyA9IGlzOwogICAgfSkoUmVuYW1lRmlsZSB8fCAoUmVuYW1lRmlsZSA9IHt9KSk7CiAgICB2YXIgRGVsZXRlRmlsZTsKICAgIChmdW5jdGlvbihEZWxldGVGaWxlMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgIGtpbmQ6ICJkZWxldGUiLAogICAgICAgICAgdXJpCiAgICAgICAgfTsKICAgICAgICBpZiAob3B0aW9ucyAhPT0gdm9pZCAwICYmIChvcHRpb25zLnJlY3Vyc2l2ZSAhPT0gdm9pZCAwIHx8IG9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgIT09IHZvaWQgMCkpIHsKICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9uczsKICAgICAgICB9CiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHZvaWQgMCkgewogICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgRGVsZXRlRmlsZTIuY3JlYXRlID0gY3JlYXRlOwogICAgICBmdW5jdGlvbiBpcyh2YWx1ZSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSB2YWx1ZTsKICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAiZGVsZXRlIiAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB2b2lkIDAgfHwgKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSA9PT0gdm9pZCAwIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzID09PSB2b2lkIDAgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cykpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdm9pZCAwIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTsKICAgICAgfQogICAgICBEZWxldGVGaWxlMi5pcyA9IGlzOwogICAgfSkoRGVsZXRlRmlsZSB8fCAoRGVsZXRlRmlsZSA9IHt9KSk7CiAgICB2YXIgV29ya3NwYWNlRWRpdDsKICAgIChmdW5jdGlvbihXb3Jrc3BhY2VFZGl0MikgewogICAgICBmdW5jdGlvbiBpcyh2YWx1ZSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSB2YWx1ZTsKICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChjYW5kaWRhdGUuY2hhbmdlcyAhPT0gdm9pZCAwIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgIT09IHZvaWQgMCkgJiYgKGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgPT09IHZvaWQgMCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzLmV2ZXJ5KGZ1bmN0aW9uKGNoYW5nZSkgewogICAgICAgICAgaWYgKElzLnN0cmluZyhjaGFuZ2Uua2luZCkpIHsKICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUZpbGUuaXMoY2hhbmdlKSB8fCBSZW5hbWVGaWxlLmlzKGNoYW5nZSkgfHwgRGVsZXRlRmlsZS5pcyhjaGFuZ2UpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKTsKICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgIH0KICAgICAgV29ya3NwYWNlRWRpdDIuaXMgPSBpczsKICAgIH0pKFdvcmtzcGFjZUVkaXQgfHwgKFdvcmtzcGFjZUVkaXQgPSB7fSkpOwogICAgdmFyIFRleHRFZGl0Q2hhbmdlSW1wbCA9IGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBUZXh0RWRpdENoYW5nZUltcGwyKGVkaXRzLCBjaGFuZ2VBbm5vdGF0aW9ucykgewogICAgICAgIHRoaXMuZWRpdHMgPSBlZGl0czsKICAgICAgICB0aGlzLmNoYW5nZUFubm90YXRpb25zID0gY2hhbmdlQW5ub3RhdGlvbnM7CiAgICAgIH0KICAgICAgVGV4dEVkaXRDaGFuZ2VJbXBsMi5wcm90b3R5cGUuaW5zZXJ0ID0gZnVuY3Rpb24ocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHsKICAgICAgICB2YXIgZWRpdDI7CiAgICAgICAgdmFyIGlkOwogICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB2b2lkIDApIHsKICAgICAgICAgIGVkaXQyID0gVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KTsKICAgICAgICB9IGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7CiAgICAgICAgICBpZCA9IGFubm90YXRpb247CiAgICAgICAgICBlZGl0MiA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7CiAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pOwogICAgICAgICAgZWRpdDIgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGlkKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQyKTsKICAgICAgICBpZiAoaWQgIT09IHZvaWQgMCkgewogICAgICAgICAgcmV0dXJuIGlkOwogICAgICAgIH0KICAgICAgfTsKICAgICAgVGV4dEVkaXRDaGFuZ2VJbXBsMi5wcm90b3R5cGUucmVwbGFjZSA9IGZ1bmN0aW9uKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7CiAgICAgICAgdmFyIGVkaXQyOwogICAgICAgIHZhciBpZDsKICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBlZGl0MiA9IFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQpOwogICAgICAgIH0gZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHsKICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjsKICAgICAgICAgIGVkaXQyID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7CiAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pOwogICAgICAgICAgZWRpdDIgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBpZCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0Mik7CiAgICAgICAgaWYgKGlkICE9PSB2b2lkIDApIHsKICAgICAgICAgIHJldHVybiBpZDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFRleHRFZGl0Q2hhbmdlSW1wbDIucHJvdG90eXBlLmRlbGV0ZSA9IGZ1bmN0aW9uKHJhbmdlLCBhbm5vdGF0aW9uKSB7CiAgICAgICAgdmFyIGVkaXQyOwogICAgICAgIHZhciBpZDsKICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBlZGl0MiA9IFRleHRFZGl0LmRlbChyYW5nZSk7CiAgICAgICAgfSBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkgewogICAgICAgICAgaWQgPSBhbm5vdGF0aW9uOwogICAgICAgICAgZWRpdDIgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGFubm90YXRpb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpOwogICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTsKICAgICAgICAgIGVkaXQyID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBpZCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0Mik7CiAgICAgICAgaWYgKGlkICE9PSB2b2lkIDApIHsKICAgICAgICAgIHJldHVybiBpZDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFRleHRFZGl0Q2hhbmdlSW1wbDIucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGVkaXQyKSB7CiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQyKTsKICAgICAgfTsKICAgICAgVGV4dEVkaXRDaGFuZ2VJbXBsMi5wcm90b3R5cGUuYWxsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdHM7CiAgICAgIH07CiAgICAgIFRleHRFZGl0Q2hhbmdlSW1wbDIucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5lZGl0cy5zcGxpY2UoMCwgdGhpcy5lZGl0cy5sZW5ndGgpOwogICAgICB9OwogICAgICBUZXh0RWRpdENoYW5nZUltcGwyLnByb3RvdHlwZS5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGV4dCBlZGl0IGNoYW5nZSBpcyBub3QgY29uZmlndXJlZCB0byBtYW5hZ2UgY2hhbmdlIGFubm90YXRpb25zLiIpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgcmV0dXJuIFRleHRFZGl0Q2hhbmdlSW1wbDI7CiAgICB9KCk7CiAgICB2YXIgQ2hhbmdlQW5ub3RhdGlvbnMgPSBmdW5jdGlvbigpIHsKICAgICAgZnVuY3Rpb24gQ2hhbmdlQW5ub3RhdGlvbnMyKGFubm90YXRpb25zKSB7CiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyA9PT0gdm9pZCAwID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IGFubm90YXRpb25zOwogICAgICAgIHRoaXMuX2NvdW50ZXIgPSAwOwogICAgICAgIHRoaXMuX3NpemUgPSAwOwogICAgICB9CiAgICAgIENoYW5nZUFubm90YXRpb25zMi5wcm90b3R5cGUuYWxsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zOwogICAgICB9OwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQ2hhbmdlQW5ub3RhdGlvbnMyLnByb3RvdHlwZSwgInNpemUiLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9zaXplOwogICAgICAgIH0sCiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgICBDaGFuZ2VBbm5vdGF0aW9uczIucHJvdG90eXBlLm1hbmFnZSA9IGZ1bmN0aW9uKGlkT3JBbm5vdGF0aW9uLCBhbm5vdGF0aW9uKSB7CiAgICAgICAgdmFyIGlkOwogICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhpZE9yQW5ub3RhdGlvbikpIHsKICAgICAgICAgIGlkID0gaWRPckFubm90YXRpb247CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlkID0gdGhpcy5uZXh0SWQoKTsKICAgICAgICAgIGFubm90YXRpb24gPSBpZE9yQW5ub3RhdGlvbjsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2Fubm90YXRpb25zW2lkXSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIklkICIgKyBpZCArICIgaXMgYWxyZWFkeSBpbiB1c2UuIik7CiAgICAgICAgfQogICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB2b2lkIDApIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTm8gYW5ub3RhdGlvbiBwcm92aWRlZCBmb3IgaWQgIiArIGlkKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnNbaWRdID0gYW5ub3RhdGlvbjsKICAgICAgICB0aGlzLl9zaXplKys7CiAgICAgICAgcmV0dXJuIGlkOwogICAgICB9OwogICAgICBDaGFuZ2VBbm5vdGF0aW9uczIucHJvdG90eXBlLm5leHRJZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2NvdW50ZXIrKzsKICAgICAgICByZXR1cm4gdGhpcy5fY291bnRlci50b1N0cmluZygpOwogICAgICB9OwogICAgICByZXR1cm4gQ2hhbmdlQW5ub3RhdGlvbnMyOwogICAgfSgpOwogICAgKGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBXb3Jrc3BhY2VDaGFuZ2UyKHdvcmtzcGFjZUVkaXQpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQgIT09IHZvaWQgMCkgewogICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHdvcmtzcGFjZUVkaXQ7CiAgICAgICAgICBpZiAod29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMpIHsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMod29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyk7CiAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTsKICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMuZm9yRWFjaChmdW5jdGlvbihjaGFuZ2UpIHsKICAgICAgICAgICAgICBpZiAoVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpKSB7CiAgICAgICAgICAgICAgICB2YXIgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGNoYW5nZS5lZGl0cywgX3RoaXMuX2NoYW5nZUFubm90YXRpb25zKTsKICAgICAgICAgICAgICAgIF90aGlzLl90ZXh0RWRpdENoYW5nZXNbY2hhbmdlLnRleHREb2N1bWVudC51cmldID0gdGV4dEVkaXRDaGFuZ2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSBpZiAod29ya3NwYWNlRWRpdC5jaGFuZ2VzKSB7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsKICAgICAgICAgICAgICB2YXIgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKHdvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldKTsKICAgICAgICAgICAgICBfdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSB0ZXh0RWRpdENoYW5nZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB7fTsKICAgICAgICB9CiAgICAgIH0KICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFdvcmtzcGFjZUNoYW5nZTIucHJvdG90eXBlLCAiZWRpdCIsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7CiAgICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgIT09IHZvaWQgMCkgewogICAgICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuc2l6ZSA9PT0gMCkgewogICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB2b2lkIDA7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NwYWNlRWRpdDsKICAgICAgICB9LAogICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9KTsKICAgICAgV29ya3NwYWNlQ2hhbmdlMi5wcm90b3R5cGUuZ2V0VGV4dEVkaXRDaGFuZ2UgPSBmdW5jdGlvbihrZXkpIHsKICAgICAgICBpZiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGtleSkpIHsKICAgICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpOwogICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB2b2lkIDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciB0ZXh0RG9jdW1lbnQgPSB7IHVyaToga2V5LnVyaSwgdmVyc2lvbjoga2V5LnZlcnNpb24gfTsKICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV07CiAgICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgICB2YXIgZWRpdHMgPSBbXTsKICAgICAgICAgICAgdmFyIHRleHREb2N1bWVudEVkaXQgPSB7CiAgICAgICAgICAgICAgdGV4dERvY3VtZW50LAogICAgICAgICAgICAgIGVkaXRzCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2godGV4dERvY3VtZW50RWRpdCk7CiAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTsKICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldID0gcmVzdWx0OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5pbml0Q2hhbmdlcygpOwogICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIG5vcm1hbCB0ZXh0IGVkaXQgY2hhbmdlcy4iKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XTsKICAgICAgICAgIGlmICghcmVzdWx0KSB7CiAgICAgICAgICAgIHZhciBlZGl0cyA9IFtdOwogICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSA9IGVkaXRzOwogICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzKTsKICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSByZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgfTsKICAgICAgV29ya3NwYWNlQ2hhbmdlMi5wcm90b3R5cGUuaW5pdERvY3VtZW50Q2hhbmdlcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdm9pZCAwICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucygpOwogICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPSBbXTsKICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFdvcmtzcGFjZUNoYW5nZTIucHJvdG90eXBlLmluaXRDaGFuZ2VzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB2b2lkIDAgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB2b2lkIDApIHsKICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgfQogICAgICB9OwogICAgICBXb3Jrc3BhY2VDaGFuZ2UyLnByb3RvdHlwZS5jcmVhdGVGaWxlID0gZnVuY3Rpb24odXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7CiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7CiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB2b2lkIDApIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuIik7CiAgICAgICAgfQogICAgICAgIHZhciBhbm5vdGF0aW9uOwogICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7CiAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247CiAgICAgICAgfQogICAgICAgIHZhciBvcGVyYXRpb247CiAgICAgICAgdmFyIGlkOwogICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB2b2lkIDApIHsKICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pOwogICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTsKICAgICAgICBpZiAoaWQgIT09IHZvaWQgMCkgewogICAgICAgICAgcmV0dXJuIGlkOwogICAgICAgIH0KICAgICAgfTsKICAgICAgV29ya3NwYWNlQ2hhbmdlMi5wcm90b3R5cGUucmVuYW1lRmlsZSA9IGZ1bmN0aW9uKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7CiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7CiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB2b2lkIDApIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuIik7CiAgICAgICAgfQogICAgICAgIHZhciBhbm5vdGF0aW9uOwogICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7CiAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247CiAgICAgICAgfQogICAgICAgIHZhciBvcGVyYXRpb247CiAgICAgICAgdmFyIGlkOwogICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB2b2lkIDApIHsKICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7CiAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgaWQpOwogICAgICAgIH0KICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7CiAgICAgICAgaWYgKGlkICE9PSB2b2lkIDApIHsKICAgICAgICAgIHJldHVybiBpZDsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFdvcmtzcGFjZUNoYW5nZTIucHJvdG90eXBlLmRlbGV0ZUZpbGUgPSBmdW5jdGlvbih1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHsKICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTsKICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHZvaWQgMCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4iKTsKICAgICAgICB9CiAgICAgICAgdmFyIGFubm90YXRpb247CiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHsKICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjsKICAgICAgICB9CiAgICAgICAgdmFyIG9wZXJhdGlvbjsKICAgICAgICB2YXIgaWQ7CiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHZvaWQgMCkgewogICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7CiAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pOwogICAgICAgIGlmIChpZCAhPT0gdm9pZCAwKSB7CiAgICAgICAgICByZXR1cm4gaWQ7CiAgICAgICAgfQogICAgICB9OwogICAgICByZXR1cm4gV29ya3NwYWNlQ2hhbmdlMjsKICAgIH0pKCk7CiAgICB2YXIgVGV4dERvY3VtZW50SWRlbnRpZmllcjsKICAgIChmdW5jdGlvbihUZXh0RG9jdW1lbnRJZGVudGlmaWVyMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUodXJpKSB7CiAgICAgICAgcmV0dXJuIHsgdXJpIH07CiAgICAgIH0KICAgICAgVGV4dERvY3VtZW50SWRlbnRpZmllcjIuY3JlYXRlID0gY3JlYXRlOwogICAgICBmdW5jdGlvbiBpcyh2YWx1ZSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSB2YWx1ZTsKICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKTsKICAgICAgfQogICAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyMi5pcyA9IGlzOwogICAgfSkoVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7CiAgICB2YXIgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjsKICAgIChmdW5jdGlvbihWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7CiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07CiAgICAgIH0KICAgICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjIuY3JlYXRlID0gY3JlYXRlOwogICAgICBmdW5jdGlvbiBpcyh2YWx1ZSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSB2YWx1ZTsKICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKTsKICAgICAgfQogICAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyMi5pcyA9IGlzOwogICAgfSkoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7CiAgICB2YXIgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyOwogICAgKGZ1bmN0aW9uKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjIpIHsKICAgICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikgewogICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9OwogICAgICB9CiAgICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjIuY3JlYXRlID0gY3JlYXRlOwogICAgICBmdW5jdGlvbiBpcyh2YWx1ZSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSB2YWx1ZTsKICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLnZlcnNpb24gPT09IG51bGwgfHwgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikpOwogICAgICB9CiAgICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjIuaXMgPSBpczsKICAgIH0pKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTsKICAgIHZhciBUZXh0RG9jdW1lbnRJdGVtOwogICAgKGZ1bmN0aW9uKFRleHREb2N1bWVudEl0ZW0yKSB7CiAgICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQpIHsKICAgICAgICByZXR1cm4geyB1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQgfTsKICAgICAgfQogICAgICBUZXh0RG9jdW1lbnRJdGVtMi5jcmVhdGUgPSBjcmVhdGU7CiAgICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTsKICAgICAgfQogICAgICBUZXh0RG9jdW1lbnRJdGVtMi5pcyA9IGlzOwogICAgfSkoVGV4dERvY3VtZW50SXRlbSB8fCAoVGV4dERvY3VtZW50SXRlbSA9IHt9KSk7CiAgICB2YXIgTWFya3VwS2luZDsKICAgIChmdW5jdGlvbihNYXJrdXBLaW5kMikgewogICAgICBNYXJrdXBLaW5kMi5QbGFpblRleHQgPSAicGxhaW50ZXh0IjsKICAgICAgTWFya3VwS2luZDIuTWFya2Rvd24gPSAibWFya2Rvd24iOwogICAgfSkoTWFya3VwS2luZCB8fCAoTWFya3VwS2luZCA9IHt9KSk7CiAgICAoZnVuY3Rpb24oTWFya3VwS2luZDIpIHsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZDIuUGxhaW5UZXh0IHx8IGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZDIuTWFya2Rvd247CiAgICAgIH0KICAgICAgTWFya3VwS2luZDIuaXMgPSBpczsKICAgIH0pKE1hcmt1cEtpbmQgfHwgKE1hcmt1cEtpbmQgPSB7fSkpOwogICAgdmFyIE1hcmt1cENvbnRlbnQ7CiAgICAoZnVuY3Rpb24oTWFya3VwQ29udGVudDIpIHsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwodmFsdWUpICYmIE1hcmt1cEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpOwogICAgICB9CiAgICAgIE1hcmt1cENvbnRlbnQyLmlzID0gaXM7CiAgICB9KShNYXJrdXBDb250ZW50IHx8IChNYXJrdXBDb250ZW50ID0ge30pKTsKICAgIHZhciBDb21wbGV0aW9uSXRlbUtpbmQ7CiAgICAoZnVuY3Rpb24oQ29tcGxldGlvbkl0ZW1LaW5kMikgewogICAgICBDb21wbGV0aW9uSXRlbUtpbmQyLlRleHQgPSAxOwogICAgICBDb21wbGV0aW9uSXRlbUtpbmQyLk1ldGhvZCA9IDI7CiAgICAgIENvbXBsZXRpb25JdGVtS2luZDIuRnVuY3Rpb24gPSAzOwogICAgICBDb21wbGV0aW9uSXRlbUtpbmQyLkNvbnN0cnVjdG9yID0gNDsKICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kMi5GaWVsZCA9IDU7CiAgICAgIENvbXBsZXRpb25JdGVtS2luZDIuVmFyaWFibGUgPSA2OwogICAgICBDb21wbGV0aW9uSXRlbUtpbmQyLkNsYXNzID0gNzsKICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kMi5JbnRlcmZhY2UgPSA4OwogICAgICBDb21wbGV0aW9uSXRlbUtpbmQyLk1vZHVsZSA9IDk7CiAgICAgIENvbXBsZXRpb25JdGVtS2luZDIuUHJvcGVydHkgPSAxMDsKICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kMi5Vbml0ID0gMTE7CiAgICAgIENvbXBsZXRpb25JdGVtS2luZDIuVmFsdWUgPSAxMjsKICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kMi5FbnVtID0gMTM7CiAgICAgIENvbXBsZXRpb25JdGVtS2luZDIuS2V5d29yZCA9IDE0OwogICAgICBDb21wbGV0aW9uSXRlbUtpbmQyLlNuaXBwZXQgPSAxNTsKICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kMi5Db2xvciA9IDE2OwogICAgICBDb21wbGV0aW9uSXRlbUtpbmQyLkZpbGUgPSAxNzsKICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kMi5SZWZlcmVuY2UgPSAxODsKICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kMi5Gb2xkZXIgPSAxOTsKICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kMi5FbnVtTWVtYmVyID0gMjA7CiAgICAgIENvbXBsZXRpb25JdGVtS2luZDIuQ29uc3RhbnQgPSAyMTsKICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kMi5TdHJ1Y3QgPSAyMjsKICAgICAgQ29tcGxldGlvbkl0ZW1LaW5kMi5FdmVudCA9IDIzOwogICAgICBDb21wbGV0aW9uSXRlbUtpbmQyLk9wZXJhdG9yID0gMjQ7CiAgICAgIENvbXBsZXRpb25JdGVtS2luZDIuVHlwZVBhcmFtZXRlciA9IDI1OwogICAgfSkoQ29tcGxldGlvbkl0ZW1LaW5kIHx8IChDb21wbGV0aW9uSXRlbUtpbmQgPSB7fSkpOwogICAgdmFyIEluc2VydFRleHRGb3JtYXQ7CiAgICAoZnVuY3Rpb24oSW5zZXJ0VGV4dEZvcm1hdDIpIHsKICAgICAgSW5zZXJ0VGV4dEZvcm1hdDIuUGxhaW5UZXh0ID0gMTsKICAgICAgSW5zZXJ0VGV4dEZvcm1hdDIuU25pcHBldCA9IDI7CiAgICB9KShJbnNlcnRUZXh0Rm9ybWF0IHx8IChJbnNlcnRUZXh0Rm9ybWF0ID0ge30pKTsKICAgIHZhciBDb21wbGV0aW9uSXRlbVRhZzsKICAgIChmdW5jdGlvbihDb21wbGV0aW9uSXRlbVRhZzIpIHsKICAgICAgQ29tcGxldGlvbkl0ZW1UYWcyLkRlcHJlY2F0ZWQgPSAxOwogICAgfSkoQ29tcGxldGlvbkl0ZW1UYWcgfHwgKENvbXBsZXRpb25JdGVtVGFnID0ge30pKTsKICAgIHZhciBJbnNlcnRSZXBsYWNlRWRpdDsKICAgIChmdW5jdGlvbihJbnNlcnRSZXBsYWNlRWRpdDIpIHsKICAgICAgZnVuY3Rpb24gY3JlYXRlKG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSkgewogICAgICAgIHJldHVybiB7IG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSB9OwogICAgICB9CiAgICAgIEluc2VydFJlcGxhY2VFZGl0Mi5jcmVhdGUgPSBjcmVhdGU7CiAgICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuaW5zZXJ0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmVwbGFjZSk7CiAgICAgIH0KICAgICAgSW5zZXJ0UmVwbGFjZUVkaXQyLmlzID0gaXM7CiAgICB9KShJbnNlcnRSZXBsYWNlRWRpdCB8fCAoSW5zZXJ0UmVwbGFjZUVkaXQgPSB7fSkpOwogICAgdmFyIEluc2VydFRleHRNb2RlOwogICAgKGZ1bmN0aW9uKEluc2VydFRleHRNb2RlMikgewogICAgICBJbnNlcnRUZXh0TW9kZTIuYXNJcyA9IDE7CiAgICAgIEluc2VydFRleHRNb2RlMi5hZGp1c3RJbmRlbnRhdGlvbiA9IDI7CiAgICB9KShJbnNlcnRUZXh0TW9kZSB8fCAoSW5zZXJ0VGV4dE1vZGUgPSB7fSkpOwogICAgdmFyIENvbXBsZXRpb25JdGVtOwogICAgKGZ1bmN0aW9uKENvbXBsZXRpb25JdGVtMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwpIHsKICAgICAgICByZXR1cm4geyBsYWJlbCB9OwogICAgICB9CiAgICAgIENvbXBsZXRpb25JdGVtMi5jcmVhdGUgPSBjcmVhdGU7CiAgICB9KShDb21wbGV0aW9uSXRlbSB8fCAoQ29tcGxldGlvbkl0ZW0gPSB7fSkpOwogICAgdmFyIENvbXBsZXRpb25MaXN0OwogICAgKGZ1bmN0aW9uKENvbXBsZXRpb25MaXN0MikgewogICAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMsIGlzSW5jb21wbGV0ZSkgewogICAgICAgIHJldHVybiB7IGl0ZW1zOiBpdGVtcyA/IGl0ZW1zIDogW10sIGlzSW5jb21wbGV0ZTogISFpc0luY29tcGxldGUgfTsKICAgICAgfQogICAgICBDb21wbGV0aW9uTGlzdDIuY3JlYXRlID0gY3JlYXRlOwogICAgfSkoQ29tcGxldGlvbkxpc3QgfHwgKENvbXBsZXRpb25MaXN0ID0ge30pKTsKICAgIHZhciBNYXJrZWRTdHJpbmc7CiAgICAoZnVuY3Rpb24oTWFya2VkU3RyaW5nMikgewogICAgICBmdW5jdGlvbiBmcm9tUGxhaW5UZXh0KHBsYWluVGV4dCkgewogICAgICAgIHJldHVybiBwbGFpblRleHQucmVwbGFjZSgvW1xcYCpfe31bXF0oKSMrXC0uIV0vZywgIlxcJCYiKTsKICAgICAgfQogICAgICBNYXJrZWRTdHJpbmcyLmZyb21QbGFpblRleHQgPSBmcm9tUGxhaW5UZXh0OwogICAgICBmdW5jdGlvbiBpcyh2YWx1ZSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSB2YWx1ZTsKICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSkgfHwgSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpOwogICAgICB9CiAgICAgIE1hcmtlZFN0cmluZzIuaXMgPSBpczsKICAgIH0pKE1hcmtlZFN0cmluZyB8fCAoTWFya2VkU3RyaW5nID0ge30pKTsKICAgIHZhciBIb3ZlcjsKICAgIChmdW5jdGlvbihIb3ZlcjIpIHsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuICEhY2FuZGlkYXRlICYmIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8IE1hcmtlZFN0cmluZy5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmNvbnRlbnRzLCBNYXJrZWRTdHJpbmcuaXMpKSAmJiAodmFsdWUucmFuZ2UgPT09IHZvaWQgMCB8fCBSYW5nZS5pcyh2YWx1ZS5yYW5nZSkpOwogICAgICB9CiAgICAgIEhvdmVyMi5pcyA9IGlzOwogICAgfSkoSG92ZXIgfHwgKEhvdmVyID0ge30pKTsKICAgIHZhciBQYXJhbWV0ZXJJbmZvcm1hdGlvbjsKICAgIChmdW5jdGlvbihQYXJhbWV0ZXJJbmZvcm1hdGlvbjIpIHsKICAgICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uKSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb24gPyB7IGxhYmVsLCBkb2N1bWVudGF0aW9uIH0gOiB7IGxhYmVsIH07CiAgICAgIH0KICAgICAgUGFyYW1ldGVySW5mb3JtYXRpb24yLmNyZWF0ZSA9IGNyZWF0ZTsKICAgIH0pKFBhcmFtZXRlckluZm9ybWF0aW9uIHx8IChQYXJhbWV0ZXJJbmZvcm1hdGlvbiA9IHt9KSk7CiAgICB2YXIgU2lnbmF0dXJlSW5mb3JtYXRpb247CiAgICAoZnVuY3Rpb24oU2lnbmF0dXJlSW5mb3JtYXRpb24yKSB7CiAgICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbikgewogICAgICAgIHZhciBwYXJhbWV0ZXJzID0gW107CiAgICAgICAgZm9yICh2YXIgX2kgPSAyOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgIHBhcmFtZXRlcnNbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSB7IGxhYmVsIH07CiAgICAgICAgaWYgKElzLmRlZmluZWQoZG9jdW1lbnRhdGlvbikpIHsKICAgICAgICAgIHJlc3VsdC5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjsKICAgICAgICB9CiAgICAgICAgaWYgKElzLmRlZmluZWQocGFyYW1ldGVycykpIHsKICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBbXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBTaWduYXR1cmVJbmZvcm1hdGlvbjIuY3JlYXRlID0gY3JlYXRlOwogICAgfSkoU2lnbmF0dXJlSW5mb3JtYXRpb24gfHwgKFNpZ25hdHVyZUluZm9ybWF0aW9uID0ge30pKTsKICAgIHZhciBEb2N1bWVudEhpZ2hsaWdodEtpbmQ7CiAgICAoZnVuY3Rpb24oRG9jdW1lbnRIaWdobGlnaHRLaW5kMikgewogICAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQyLlRleHQgPSAxOwogICAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQyLlJlYWQgPSAyOwogICAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQyLldyaXRlID0gMzsKICAgIH0pKERvY3VtZW50SGlnaGxpZ2h0S2luZCB8fCAoRG9jdW1lbnRIaWdobGlnaHRLaW5kID0ge30pKTsKICAgIHZhciBEb2N1bWVudEhpZ2hsaWdodDsKICAgIChmdW5jdGlvbihEb2N1bWVudEhpZ2hsaWdodDIpIHsKICAgICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBraW5kKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsgcmFuZ2UgfTsKICAgICAgICBpZiAoSXMubnVtYmVyKGtpbmQpKSB7CiAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgRG9jdW1lbnRIaWdobGlnaHQyLmNyZWF0ZSA9IGNyZWF0ZTsKICAgIH0pKERvY3VtZW50SGlnaGxpZ2h0IHx8IChEb2N1bWVudEhpZ2hsaWdodCA9IHt9KSk7CiAgICB2YXIgU3ltYm9sS2luZDsKICAgIChmdW5jdGlvbihTeW1ib2xLaW5kMikgewogICAgICBTeW1ib2xLaW5kMi5GaWxlID0gMTsKICAgICAgU3ltYm9sS2luZDIuTW9kdWxlID0gMjsKICAgICAgU3ltYm9sS2luZDIuTmFtZXNwYWNlID0gMzsKICAgICAgU3ltYm9sS2luZDIuUGFja2FnZSA9IDQ7CiAgICAgIFN5bWJvbEtpbmQyLkNsYXNzID0gNTsKICAgICAgU3ltYm9sS2luZDIuTWV0aG9kID0gNjsKICAgICAgU3ltYm9sS2luZDIuUHJvcGVydHkgPSA3OwogICAgICBTeW1ib2xLaW5kMi5GaWVsZCA9IDg7CiAgICAgIFN5bWJvbEtpbmQyLkNvbnN0cnVjdG9yID0gOTsKICAgICAgU3ltYm9sS2luZDIuRW51bSA9IDEwOwogICAgICBTeW1ib2xLaW5kMi5JbnRlcmZhY2UgPSAxMTsKICAgICAgU3ltYm9sS2luZDIuRnVuY3Rpb24gPSAxMjsKICAgICAgU3ltYm9sS2luZDIuVmFyaWFibGUgPSAxMzsKICAgICAgU3ltYm9sS2luZDIuQ29uc3RhbnQgPSAxNDsKICAgICAgU3ltYm9sS2luZDIuU3RyaW5nID0gMTU7CiAgICAgIFN5bWJvbEtpbmQyLk51bWJlciA9IDE2OwogICAgICBTeW1ib2xLaW5kMi5Cb29sZWFuID0gMTc7CiAgICAgIFN5bWJvbEtpbmQyLkFycmF5ID0gMTg7CiAgICAgIFN5bWJvbEtpbmQyLk9iamVjdCA9IDE5OwogICAgICBTeW1ib2xLaW5kMi5LZXkgPSAyMDsKICAgICAgU3ltYm9sS2luZDIuTnVsbCA9IDIxOwogICAgICBTeW1ib2xLaW5kMi5FbnVtTWVtYmVyID0gMjI7CiAgICAgIFN5bWJvbEtpbmQyLlN0cnVjdCA9IDIzOwogICAgICBTeW1ib2xLaW5kMi5FdmVudCA9IDI0OwogICAgICBTeW1ib2xLaW5kMi5PcGVyYXRvciA9IDI1OwogICAgICBTeW1ib2xLaW5kMi5UeXBlUGFyYW1ldGVyID0gMjY7CiAgICB9KShTeW1ib2xLaW5kIHx8IChTeW1ib2xLaW5kID0ge30pKTsKICAgIHZhciBTeW1ib2xUYWc7CiAgICAoZnVuY3Rpb24oU3ltYm9sVGFnMikgewogICAgICBTeW1ib2xUYWcyLkRlcHJlY2F0ZWQgPSAxOwogICAgfSkoU3ltYm9sVGFnIHx8IChTeW1ib2xUYWcgPSB7fSkpOwogICAgdmFyIFN5bWJvbEluZm9ybWF0aW9uOwogICAgKGZ1bmN0aW9uKFN5bWJvbEluZm9ybWF0aW9uMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgcmFuZ2UsIHVyaSwgY29udGFpbmVyTmFtZSkgewogICAgICAgIHZhciByZXN1bHQgPSB7CiAgICAgICAgICBuYW1lLAogICAgICAgICAga2luZCwKICAgICAgICAgIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfQogICAgICAgIH07CiAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUpIHsKICAgICAgICAgIHJlc3VsdC5jb250YWluZXJOYW1lID0gY29udGFpbmVyTmFtZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBTeW1ib2xJbmZvcm1hdGlvbjIuY3JlYXRlID0gY3JlYXRlOwogICAgfSkoU3ltYm9sSW5mb3JtYXRpb24gfHwgKFN5bWJvbEluZm9ybWF0aW9uID0ge30pKTsKICAgIHZhciBEb2N1bWVudFN5bWJvbDsKICAgIChmdW5jdGlvbihEb2N1bWVudFN5bWJvbDIpIHsKICAgICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGRldGFpbCwga2luZCwgcmFuZ2UsIHNlbGVjdGlvblJhbmdlLCBjaGlsZHJlbikgewogICAgICAgIHZhciByZXN1bHQgPSB7CiAgICAgICAgICBuYW1lLAogICAgICAgICAgZGV0YWlsLAogICAgICAgICAga2luZCwKICAgICAgICAgIHJhbmdlLAogICAgICAgICAgc2VsZWN0aW9uUmFuZ2UKICAgICAgICB9OwogICAgICAgIGlmIChjaGlsZHJlbiAhPT0gdm9pZCAwKSB7CiAgICAgICAgICByZXN1bHQuY2hpbGRyZW4gPSBjaGlsZHJlbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQogICAgICBEb2N1bWVudFN5bWJvbDIuY3JlYXRlID0gY3JlYXRlOwogICAgICBmdW5jdGlvbiBpcyh2YWx1ZSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSB2YWx1ZTsKICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSkgJiYgSXMubnVtYmVyKGNhbmRpZGF0ZS5raW5kKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5zZWxlY3Rpb25SYW5nZSkgJiYgKGNhbmRpZGF0ZS5kZXRhaWwgPT09IHZvaWQgMCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkpICYmIChjYW5kaWRhdGUuZGVwcmVjYXRlZCA9PT0gdm9pZCAwIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmRlcHJlY2F0ZWQpKSAmJiAoY2FuZGlkYXRlLmNoaWxkcmVuID09PSB2b2lkIDAgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuY2hpbGRyZW4pKSAmJiAoY2FuZGlkYXRlLnRhZ3MgPT09IHZvaWQgMCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS50YWdzKSk7CiAgICAgIH0KICAgICAgRG9jdW1lbnRTeW1ib2wyLmlzID0gaXM7CiAgICB9KShEb2N1bWVudFN5bWJvbCB8fCAoRG9jdW1lbnRTeW1ib2wgPSB7fSkpOwogICAgdmFyIENvZGVBY3Rpb25LaW5kOwogICAgKGZ1bmN0aW9uKENvZGVBY3Rpb25LaW5kMikgewogICAgICBDb2RlQWN0aW9uS2luZDIuRW1wdHkgPSAiIjsKICAgICAgQ29kZUFjdGlvbktpbmQyLlF1aWNrRml4ID0gInF1aWNrZml4IjsKICAgICAgQ29kZUFjdGlvbktpbmQyLlJlZmFjdG9yID0gInJlZmFjdG9yIjsKICAgICAgQ29kZUFjdGlvbktpbmQyLlJlZmFjdG9yRXh0cmFjdCA9ICJyZWZhY3Rvci5leHRyYWN0IjsKICAgICAgQ29kZUFjdGlvbktpbmQyLlJlZmFjdG9ySW5saW5lID0gInJlZmFjdG9yLmlubGluZSI7CiAgICAgIENvZGVBY3Rpb25LaW5kMi5SZWZhY3RvclJld3JpdGUgPSAicmVmYWN0b3IucmV3cml0ZSI7CiAgICAgIENvZGVBY3Rpb25LaW5kMi5Tb3VyY2UgPSAic291cmNlIjsKICAgICAgQ29kZUFjdGlvbktpbmQyLlNvdXJjZU9yZ2FuaXplSW1wb3J0cyA9ICJzb3VyY2Uub3JnYW5pemVJbXBvcnRzIjsKICAgICAgQ29kZUFjdGlvbktpbmQyLlNvdXJjZUZpeEFsbCA9ICJzb3VyY2UuZml4QWxsIjsKICAgIH0pKENvZGVBY3Rpb25LaW5kIHx8IChDb2RlQWN0aW9uS2luZCA9IHt9KSk7CiAgICB2YXIgQ29kZUFjdGlvbkNvbnRleHQ7CiAgICAoZnVuY3Rpb24oQ29kZUFjdGlvbkNvbnRleHQyKSB7CiAgICAgIGZ1bmN0aW9uIGNyZWF0ZShkaWFnbm9zdGljcywgb25seSkgewogICAgICAgIHZhciByZXN1bHQgPSB7IGRpYWdub3N0aWNzIH07CiAgICAgICAgaWYgKG9ubHkgIT09IHZvaWQgMCAmJiBvbmx5ICE9PSBudWxsKSB7CiAgICAgICAgICByZXN1bHQub25seSA9IG9ubHk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgQ29kZUFjdGlvbkNvbnRleHQyLmNyZWF0ZSA9IGNyZWF0ZTsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcykgJiYgKGNhbmRpZGF0ZS5vbmx5ID09PSB2b2lkIDAgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUub25seSwgSXMuc3RyaW5nKSk7CiAgICAgIH0KICAgICAgQ29kZUFjdGlvbkNvbnRleHQyLmlzID0gaXM7CiAgICB9KShDb2RlQWN0aW9uQ29udGV4dCB8fCAoQ29kZUFjdGlvbkNvbnRleHQgPSB7fSkpOwogICAgdmFyIENvZGVBY3Rpb247CiAgICAoZnVuY3Rpb24oQ29kZUFjdGlvbjIpIHsKICAgICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBraW5kT3JDb21tYW5kT3JFZGl0LCBraW5kKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsgdGl0bGUgfTsKICAgICAgICB2YXIgY2hlY2tLaW5kID0gdHJ1ZTsKICAgICAgICBpZiAodHlwZW9mIGtpbmRPckNvbW1hbmRPckVkaXQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICBjaGVja0tpbmQgPSBmYWxzZTsKICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDsKICAgICAgICB9IGVsc2UgaWYgKENvbW1hbmQuaXMoa2luZE9yQ29tbWFuZE9yRWRpdCkpIHsKICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0LmVkaXQgPSBraW5kT3JDb21tYW5kT3JFZGl0OwogICAgICAgIH0KICAgICAgICBpZiAoY2hlY2tLaW5kICYmIGtpbmQgIT09IHZvaWQgMCkgewogICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIENvZGVBY3Rpb24yLmNyZWF0ZSA9IGNyZWF0ZTsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJiAoY2FuZGlkYXRlLmRpYWdub3N0aWNzID09PSB2b2lkIDAgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpKSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHZvaWQgMCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKSAmJiAoY2FuZGlkYXRlLmVkaXQgIT09IHZvaWQgMCB8fCBjYW5kaWRhdGUuY29tbWFuZCAhPT0gdm9pZCAwKSAmJiAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHZvaWQgMCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSkgJiYgKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCA9PT0gdm9pZCAwIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmlzUHJlZmVycmVkKSkgJiYgKGNhbmRpZGF0ZS5lZGl0ID09PSB2b2lkIDAgfHwgV29ya3NwYWNlRWRpdC5pcyhjYW5kaWRhdGUuZWRpdCkpOwogICAgICB9CiAgICAgIENvZGVBY3Rpb24yLmlzID0gaXM7CiAgICB9KShDb2RlQWN0aW9uIHx8IChDb2RlQWN0aW9uID0ge30pKTsKICAgIHZhciBDb2RlTGVuczsKICAgIChmdW5jdGlvbihDb2RlTGVuczIpIHsKICAgICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBkYXRhKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsgcmFuZ2UgfTsKICAgICAgICBpZiAoSXMuZGVmaW5lZChkYXRhKSkgewogICAgICAgICAgcmVzdWx0LmRhdGEgPSBkYXRhOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIENvZGVMZW5zMi5jcmVhdGUgPSBjcmVhdGU7CiAgICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb21tYW5kKSB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7CiAgICAgIH0KICAgICAgQ29kZUxlbnMyLmlzID0gaXM7CiAgICB9KShDb2RlTGVucyB8fCAoQ29kZUxlbnMgPSB7fSkpOwogICAgdmFyIEZvcm1hdHRpbmdPcHRpb25zOwogICAgKGZ1bmN0aW9uKEZvcm1hdHRpbmdPcHRpb25zMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUodGFiU2l6ZSwgaW5zZXJ0U3BhY2VzKSB7CiAgICAgICAgcmV0dXJuIHsgdGFiU2l6ZSwgaW5zZXJ0U3BhY2VzIH07CiAgICAgIH0KICAgICAgRm9ybWF0dGluZ09wdGlvbnMyLmNyZWF0ZSA9IGNyZWF0ZTsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUudGFiU2l6ZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuaW5zZXJ0U3BhY2VzKTsKICAgICAgfQogICAgICBGb3JtYXR0aW5nT3B0aW9uczIuaXMgPSBpczsKICAgIH0pKEZvcm1hdHRpbmdPcHRpb25zIHx8IChGb3JtYXR0aW5nT3B0aW9ucyA9IHt9KSk7CiAgICB2YXIgRG9jdW1lbnRMaW5rOwogICAgKGZ1bmN0aW9uKERvY3VtZW50TGluazIpIHsKICAgICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0YXJnZXQsIGRhdGEpIHsKICAgICAgICByZXR1cm4geyByYW5nZSwgdGFyZ2V0LCBkYXRhIH07CiAgICAgIH0KICAgICAgRG9jdW1lbnRMaW5rMi5jcmVhdGUgPSBjcmVhdGU7CiAgICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7CiAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IHZhbHVlOwogICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50YXJnZXQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0KSk7CiAgICAgIH0KICAgICAgRG9jdW1lbnRMaW5rMi5pcyA9IGlzOwogICAgfSkoRG9jdW1lbnRMaW5rIHx8IChEb2N1bWVudExpbmsgPSB7fSkpOwogICAgdmFyIFNlbGVjdGlvblJhbmdlOwogICAgKGZ1bmN0aW9uKFNlbGVjdGlvblJhbmdlMikgewogICAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHBhcmVudCkgewogICAgICAgIHJldHVybiB7IHJhbmdlLCBwYXJlbnQgfTsKICAgICAgfQogICAgICBTZWxlY3Rpb25SYW5nZTIuY3JlYXRlID0gY3JlYXRlOwogICAgICBmdW5jdGlvbiBpcyh2YWx1ZSkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSB2YWx1ZTsKICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB2b2lkIDAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoY2FuZGlkYXRlLnBhcmVudCA9PT0gdm9pZCAwIHx8IFNlbGVjdGlvblJhbmdlMi5pcyhjYW5kaWRhdGUucGFyZW50KSk7CiAgICAgIH0KICAgICAgU2VsZWN0aW9uUmFuZ2UyLmlzID0gaXM7CiAgICB9KShTZWxlY3Rpb25SYW5nZSB8fCAoU2VsZWN0aW9uUmFuZ2UgPSB7fSkpOwogICAgdmFyIFRleHREb2N1bWVudDsKICAgIChmdW5jdGlvbihUZXh0RG9jdW1lbnQzKSB7CiAgICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHsKICAgICAgICByZXR1cm4gbmV3IEZ1bGxUZXh0RG9jdW1lbnQodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KTsKICAgICAgfQogICAgICBUZXh0RG9jdW1lbnQzLmNyZWF0ZSA9IGNyZWF0ZTsKICAgICAgZnVuY3Rpb24gaXModmFsdWUpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmVDb3VudCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZ2V0VGV4dCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUucG9zaXRpb25BdCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub2Zmc2V0QXQpID8gdHJ1ZSA6IGZhbHNlOwogICAgICB9CiAgICAgIFRleHREb2N1bWVudDMuaXMgPSBpczsKICAgICAgZnVuY3Rpb24gYXBwbHlFZGl0cyhkb2N1bWVudCwgZWRpdHMpIHsKICAgICAgICB2YXIgdGV4dCA9IGRvY3VtZW50LmdldFRleHQoKTsKICAgICAgICB2YXIgc29ydGVkRWRpdHMgPSBtZXJnZVNvcnQyKGVkaXRzLCBmdW5jdGlvbihhMiwgYikgewogICAgICAgICAgdmFyIGRpZmYgPSBhMi5yYW5nZS5zdGFydC5saW5lIC0gYi5yYW5nZS5zdGFydC5saW5lOwogICAgICAgICAgaWYgKGRpZmYgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIGEyLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciAtIGIucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGRpZmY7CiAgICAgICAgfSk7CiAgICAgICAgdmFyIGxhc3RNb2RpZmllZE9mZnNldCA9IHRleHQubGVuZ3RoOwogICAgICAgIGZvciAodmFyIGkgPSBzb3J0ZWRFZGl0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgdmFyIGUgPSBzb3J0ZWRFZGl0c1tpXTsKICAgICAgICAgIHZhciBzdGFydE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2Uuc3RhcnQpOwogICAgICAgICAgdmFyIGVuZE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2UuZW5kKTsKICAgICAgICAgIGlmIChlbmRPZmZzZXQgPD0gbGFzdE1vZGlmaWVkT2Zmc2V0KSB7CiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBzdGFydE9mZnNldCkgKyBlLm5ld1RleHQgKyB0ZXh0LnN1YnN0cmluZyhlbmRPZmZzZXQsIHRleHQubGVuZ3RoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiT3ZlcmxhcHBpbmcgZWRpdCIpOwogICAgICAgICAgfQogICAgICAgICAgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZXh0OwogICAgICB9CiAgICAgIFRleHREb2N1bWVudDMuYXBwbHlFZGl0cyA9IGFwcGx5RWRpdHM7CiAgICAgIGZ1bmN0aW9uIG1lcmdlU29ydDIoZGF0YSwgY29tcGFyZSkgewogICAgICAgIGlmIChkYXRhLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgICB9CiAgICAgICAgdmFyIHAgPSBkYXRhLmxlbmd0aCAvIDIgfCAwOwogICAgICAgIHZhciBsZWZ0ID0gZGF0YS5zbGljZSgwLCBwKTsKICAgICAgICB2YXIgcmlnaHQgPSBkYXRhLnNsaWNlKHApOwogICAgICAgIG1lcmdlU29ydDIobGVmdCwgY29tcGFyZSk7CiAgICAgICAgbWVyZ2VTb3J0MihyaWdodCwgY29tcGFyZSk7CiAgICAgICAgdmFyIGxlZnRJZHggPSAwOwogICAgICAgIHZhciByaWdodElkeCA9IDA7CiAgICAgICAgdmFyIGkgPSAwOwogICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGggJiYgcmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHsKICAgICAgICAgIHZhciByZXQgPSBjb21wYXJlKGxlZnRbbGVmdElkeF0sIHJpZ2h0W3JpZ2h0SWR4XSk7CiAgICAgICAgICBpZiAocmV0IDw9IDApIHsKICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGgpIHsKICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7CiAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgIH0KICAgIH0pKFRleHREb2N1bWVudCB8fCAoVGV4dERvY3VtZW50ID0ge30pKTsKICAgIHZhciBGdWxsVGV4dERvY3VtZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIEZ1bGxUZXh0RG9jdW1lbnQzKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkgewogICAgICAgIHRoaXMuX3VyaSA9IHVyaTsKICAgICAgICB0aGlzLl9sYW5ndWFnZUlkID0gbGFuZ3VhZ2VJZDsKICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjsKICAgICAgICB0aGlzLl9jb250ZW50ID0gY29udGVudDsKICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHZvaWQgMDsKICAgICAgfQogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVsbFRleHREb2N1bWVudDMucHJvdG90eXBlLCAidXJpIiwgewogICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fdXJpOwogICAgICAgIH0sCiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVsbFRleHREb2N1bWVudDMucHJvdG90eXBlLCAibGFuZ3VhZ2VJZCIsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlSWQ7CiAgICAgICAgfSwKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdWxsVGV4dERvY3VtZW50My5wcm90b3R5cGUsICJ2ZXJzaW9uIiwgewogICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjsKICAgICAgICB9LAogICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9KTsKICAgICAgRnVsbFRleHREb2N1bWVudDMucHJvdG90eXBlLmdldFRleHQgPSBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIGlmIChyYW5nZSkgewogICAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5vZmZzZXRBdChyYW5nZS5zdGFydCk7CiAgICAgICAgICB2YXIgZW5kID0gdGhpcy5vZmZzZXRBdChyYW5nZS5lbmQpOwogICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudDsKICAgICAgfTsKICAgICAgRnVsbFRleHREb2N1bWVudDMucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKGV2ZW50LCB2ZXJzaW9uKSB7CiAgICAgICAgdGhpcy5fY29udGVudCA9IGV2ZW50LnRleHQ7CiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247CiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB2b2lkIDA7CiAgICAgIH07CiAgICAgIEZ1bGxUZXh0RG9jdW1lbnQzLnByb3RvdHlwZS5nZXRMaW5lT2Zmc2V0cyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9saW5lT2Zmc2V0cyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICB2YXIgbGluZU9mZnNldHMgPSBbXTsKICAgICAgICAgIHZhciB0ZXh0ID0gdGhpcy5fY29udGVudDsKICAgICAgICAgIHZhciBpc0xpbmVTdGFydCA9IHRydWU7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0KSB7CiAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaChpKTsKICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjaCA9IHRleHQuY2hhckF0KGkpOwogICAgICAgICAgICBpc0xpbmVTdGFydCA9IGNoID09PSAiXHIiIHx8IGNoID09PSAiXG4iOwogICAgICAgICAgICBpZiAoY2ggPT09ICJcciIgJiYgaSArIDEgPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0LmNoYXJBdChpICsgMSkgPT09ICJcbiIpIHsKICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc0xpbmVTdGFydCAmJiB0ZXh0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaCh0ZXh0Lmxlbmd0aCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IGxpbmVPZmZzZXRzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fbGluZU9mZnNldHM7CiAgICAgIH07CiAgICAgIEZ1bGxUZXh0RG9jdW1lbnQzLnByb3RvdHlwZS5wb3NpdGlvbkF0ID0gZnVuY3Rpb24ob2Zmc2V0KSB7CiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoTWF0aC5taW4ob2Zmc2V0LCB0aGlzLl9jb250ZW50Lmxlbmd0aCksIDApOwogICAgICAgIHZhciBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTsKICAgICAgICB2YXIgbG93ID0gMCwgaGlnaCA9IGxpbmVPZmZzZXRzLmxlbmd0aDsKICAgICAgICBpZiAoaGlnaCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZSgwLCBvZmZzZXQpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkgewogICAgICAgICAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7CiAgICAgICAgICBpZiAobGluZU9mZnNldHNbbWlkXSA+IG9mZnNldCkgewogICAgICAgICAgICBoaWdoID0gbWlkOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIGxpbmUgPSBsb3cgLSAxOwogICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUobGluZSwgb2Zmc2V0IC0gbGluZU9mZnNldHNbbGluZV0pOwogICAgICB9OwogICAgICBGdWxsVGV4dERvY3VtZW50My5wcm90b3R5cGUub2Zmc2V0QXQgPSBmdW5jdGlvbihwb3NpdGlvbikgewogICAgICAgIHZhciBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTsKICAgICAgICBpZiAocG9zaXRpb24ubGluZSA+PSBsaW5lT2Zmc2V0cy5sZW5ndGgpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50Lmxlbmd0aDsKICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uLmxpbmUgPCAwKSB7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgdmFyIGxpbmVPZmZzZXQgPSBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lXTsKICAgICAgICB2YXIgbmV4dExpbmVPZmZzZXQgPSBwb3NpdGlvbi5saW5lICsgMSA8IGxpbmVPZmZzZXRzLmxlbmd0aCA/IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmUgKyAxXSA6IHRoaXMuX2NvbnRlbnQubGVuZ3RoOwogICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbihsaW5lT2Zmc2V0ICsgcG9zaXRpb24uY2hhcmFjdGVyLCBuZXh0TGluZU9mZnNldCksIGxpbmVPZmZzZXQpOwogICAgICB9OwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVsbFRleHREb2N1bWVudDMucHJvdG90eXBlLCAibGluZUNvdW50IiwgewogICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lT2Zmc2V0cygpLmxlbmd0aDsKICAgICAgICB9LAogICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9KTsKICAgICAgcmV0dXJuIEZ1bGxUZXh0RG9jdW1lbnQzOwogICAgfSgpOwogICAgdmFyIElzOwogICAgKGZ1bmN0aW9uKElzMikgewogICAgICB2YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nOwogICAgICBmdW5jdGlvbiBkZWZpbmVkKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gInVuZGVmaW5lZCI7CiAgICAgIH0KICAgICAgSXMyLmRlZmluZWQgPSBkZWZpbmVkOwogICAgICBmdW5jdGlvbiB1bmRlZmluZWQyKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gInVuZGVmaW5lZCI7CiAgICAgIH0KICAgICAgSXMyLnVuZGVmaW5lZCA9IHVuZGVmaW5lZDI7CiAgICAgIGZ1bmN0aW9uIGJvb2xlYW4odmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlOwogICAgICB9CiAgICAgIElzMi5ib29sZWFuID0gYm9vbGVhbjsKICAgICAgZnVuY3Rpb24gc3RyaW5nKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAiW29iamVjdCBTdHJpbmddIjsKICAgICAgfQogICAgICBJczIuc3RyaW5nID0gc3RyaW5nOwogICAgICBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHsKICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICJbb2JqZWN0IE51bWJlcl0iOwogICAgICB9CiAgICAgIElzMi5udW1iZXIgPSBudW1iZXI7CiAgICAgIGZ1bmN0aW9uIG51bWJlclJhbmdlKHZhbHVlLCBtaW4sIG1heCkgewogICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gIltvYmplY3QgTnVtYmVyXSIgJiYgbWluIDw9IHZhbHVlICYmIHZhbHVlIDw9IG1heDsKICAgICAgfQogICAgICBJczIubnVtYmVyUmFuZ2UgPSBudW1iZXJSYW5nZTsKICAgICAgZnVuY3Rpb24gaW50ZWdlcjIodmFsdWUpIHsKICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICJbb2JqZWN0IE51bWJlcl0iICYmIC0yMTQ3NDgzNjQ4IDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7CiAgICAgIH0KICAgICAgSXMyLmludGVnZXIgPSBpbnRlZ2VyMjsKICAgICAgZnVuY3Rpb24gdWludGVnZXIyKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAiW29iamVjdCBOdW1iZXJdIiAmJiAwIDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7CiAgICAgIH0KICAgICAgSXMyLnVpbnRlZ2VyID0gdWludGVnZXIyOwogICAgICBmdW5jdGlvbiBmdW5jKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAiW29iamVjdCBGdW5jdGlvbl0iOwogICAgICB9CiAgICAgIElzMi5mdW5jID0gZnVuYzsKICAgICAgZnVuY3Rpb24gb2JqZWN0TGl0ZXJhbCh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICJvYmplY3QiOwogICAgICB9CiAgICAgIElzMi5vYmplY3RMaXRlcmFsID0gb2JqZWN0TGl0ZXJhbDsKICAgICAgZnVuY3Rpb24gdHlwZWRBcnJheSh2YWx1ZSwgY2hlY2spIHsKICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoY2hlY2spOwogICAgICB9CiAgICAgIElzMi50eXBlZEFycmF5ID0gdHlwZWRBcnJheTsKICAgIH0pKElzIHx8IChJcyA9IHt9KSk7CiAgICB2YXIgX19zcHJlYWRBcnJheSA9IGZ1bmN0aW9uKHRvLCBmcm9tLCBwYWNrKSB7CiAgICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBmcm9tLmxlbmd0aCwgYXI7IGkgPCBsOyBpKyspIHsKICAgICAgICAgIGlmIChhciB8fCAhKGkgaW4gZnJvbSkpIHsKICAgICAgICAgICAgaWYgKCFhcikKICAgICAgICAgICAgICBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpOwogICAgICAgICAgICBhcltpXSA9IGZyb21baV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICByZXR1cm4gdG8uY29uY2F0KGFyIHx8IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20pKTsKICAgIH07CiAgICB2YXIgRnVsbFRleHREb2N1bWVudDIgPSBmdW5jdGlvbigpIHsKICAgICAgZnVuY3Rpb24gRnVsbFRleHREb2N1bWVudDModXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7CiAgICAgICAgdGhpcy5fdXJpID0gdXJpOwogICAgICAgIHRoaXMuX2xhbmd1YWdlSWQgPSBsYW5ndWFnZUlkOwogICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uOwogICAgICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50OwogICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdm9pZCAwOwogICAgICB9CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdWxsVGV4dERvY3VtZW50My5wcm90b3R5cGUsICJ1cmkiLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl91cmk7CiAgICAgICAgfSwKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGdWxsVGV4dERvY3VtZW50My5wcm90b3R5cGUsICJsYW5ndWFnZUlkIiwgewogICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VJZDsKICAgICAgICB9LAogICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9KTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bGxUZXh0RG9jdW1lbnQzLnByb3RvdHlwZSwgInZlcnNpb24iLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uOwogICAgICAgIH0sCiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgICBGdWxsVGV4dERvY3VtZW50My5wcm90b3R5cGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgaWYgKHJhbmdlKSB7CiAgICAgICAgICB2YXIgc3RhcnQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLnN0YXJ0KTsKICAgICAgICAgIHZhciBlbmQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLmVuZCk7CiAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50OwogICAgICB9OwogICAgICBGdWxsVGV4dERvY3VtZW50My5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oY2hhbmdlcywgdmVyc2lvbikgewogICAgICAgIGZvciAodmFyIF9pID0gMCwgY2hhbmdlc18xID0gY2hhbmdlczsgX2kgPCBjaGFuZ2VzXzEubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICB2YXIgY2hhbmdlID0gY2hhbmdlc18xW19pXTsKICAgICAgICAgIGlmIChGdWxsVGV4dERvY3VtZW50My5pc0luY3JlbWVudGFsKGNoYW5nZSkpIHsKICAgICAgICAgICAgdmFyIHJhbmdlID0gZ2V0V2VsbGZvcm1lZFJhbmdlKGNoYW5nZS5yYW5nZSk7CiAgICAgICAgICAgIHZhciBzdGFydE9mZnNldCA9IHRoaXMub2Zmc2V0QXQocmFuZ2Uuc3RhcnQpOwogICAgICAgICAgICB2YXIgZW5kT2Zmc2V0ID0gdGhpcy5vZmZzZXRBdChyYW5nZS5lbmQpOwogICAgICAgICAgICB0aGlzLl9jb250ZW50ID0gdGhpcy5fY29udGVudC5zdWJzdHJpbmcoMCwgc3RhcnRPZmZzZXQpICsgY2hhbmdlLnRleHQgKyB0aGlzLl9jb250ZW50LnN1YnN0cmluZyhlbmRPZmZzZXQsIHRoaXMuX2NvbnRlbnQubGVuZ3RoKTsKICAgICAgICAgICAgdmFyIHN0YXJ0TGluZSA9IE1hdGgubWF4KHJhbmdlLnN0YXJ0LmxpbmUsIDApOwogICAgICAgICAgICB2YXIgZW5kTGluZSA9IE1hdGgubWF4KHJhbmdlLmVuZC5saW5lLCAwKTsKICAgICAgICAgICAgdmFyIGxpbmVPZmZzZXRzID0gdGhpcy5fbGluZU9mZnNldHM7CiAgICAgICAgICAgIHZhciBhZGRlZExpbmVPZmZzZXRzID0gY29tcHV0ZUxpbmVPZmZzZXRzKGNoYW5nZS50ZXh0LCBmYWxzZSwgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICBpZiAoZW5kTGluZSAtIHN0YXJ0TGluZSA9PT0gYWRkZWRMaW5lT2Zmc2V0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gYWRkZWRMaW5lT2Zmc2V0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgbGluZU9mZnNldHNbaSArIHN0YXJ0TGluZSArIDFdID0gYWRkZWRMaW5lT2Zmc2V0c1tpXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKGFkZGVkTGluZU9mZnNldHMubGVuZ3RoIDwgMWU0KSB7CiAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5zcGxpY2UuYXBwbHkobGluZU9mZnNldHMsIF9fc3ByZWFkQXJyYXkoW3N0YXJ0TGluZSArIDEsIGVuZExpbmUgLSBzdGFydExpbmVdLCBhZGRlZExpbmVPZmZzZXRzLCBmYWxzZSkpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IGxpbmVPZmZzZXRzID0gbGluZU9mZnNldHMuc2xpY2UoMCwgc3RhcnRMaW5lICsgMSkuY29uY2F0KGFkZGVkTGluZU9mZnNldHMsIGxpbmVPZmZzZXRzLnNsaWNlKGVuZExpbmUgKyAxKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkaWZmID0gY2hhbmdlLnRleHQubGVuZ3RoIC0gKGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0KTsKICAgICAgICAgICAgaWYgKGRpZmYgIT09IDApIHsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRMaW5lICsgMSArIGFkZGVkTGluZU9mZnNldHMubGVuZ3RoLCBsZW4gPSBsaW5lT2Zmc2V0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgbGluZU9mZnNldHNbaV0gPSBsaW5lT2Zmc2V0c1tpXSArIGRpZmY7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKEZ1bGxUZXh0RG9jdW1lbnQzLmlzRnVsbChjaGFuZ2UpKSB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnQgPSBjaGFuZ2UudGV4dDsKICAgICAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB2b2lkIDA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY2hhbmdlIGV2ZW50IHJlY2VpdmVkIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uOwogICAgICB9OwogICAgICBGdWxsVGV4dERvY3VtZW50My5wcm90b3R5cGUuZ2V0TGluZU9mZnNldHMgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fbGluZU9mZnNldHMgPT09IHZvaWQgMCkgewogICAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSBjb21wdXRlTGluZU9mZnNldHModGhpcy5fY29udGVudCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9saW5lT2Zmc2V0czsKICAgICAgfTsKICAgICAgRnVsbFRleHREb2N1bWVudDMucHJvdG90eXBlLnBvc2l0aW9uQXQgPSBmdW5jdGlvbihvZmZzZXQpIHsKICAgICAgICBvZmZzZXQgPSBNYXRoLm1heChNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2NvbnRlbnQubGVuZ3RoKSwgMCk7CiAgICAgICAgdmFyIGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpOwogICAgICAgIHZhciBsb3cgPSAwLCBoaWdoID0gbGluZU9mZnNldHMubGVuZ3RoOwogICAgICAgIGlmIChoaWdoID09PSAwKSB7CiAgICAgICAgICByZXR1cm4geyBsaW5lOiAwLCBjaGFyYWN0ZXI6IG9mZnNldCB9OwogICAgICAgIH0KICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkgewogICAgICAgICAgdmFyIG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7CiAgICAgICAgICBpZiAobGluZU9mZnNldHNbbWlkXSA+IG9mZnNldCkgewogICAgICAgICAgICBoaWdoID0gbWlkOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIGxpbmUgPSBsb3cgLSAxOwogICAgICAgIHJldHVybiB7IGxpbmUsIGNoYXJhY3Rlcjogb2Zmc2V0IC0gbGluZU9mZnNldHNbbGluZV0gfTsKICAgICAgfTsKICAgICAgRnVsbFRleHREb2N1bWVudDMucHJvdG90eXBlLm9mZnNldEF0ID0gZnVuY3Rpb24ocG9zaXRpb24pIHsKICAgICAgICB2YXIgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7CiAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmUgPj0gbGluZU9mZnNldHMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5sZW5ndGg7CiAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbi5saW5lIDwgMCkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHZhciBsaW5lT2Zmc2V0ID0gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZV07CiAgICAgICAgdmFyIG5leHRMaW5lT2Zmc2V0ID0gcG9zaXRpb24ubGluZSArIDEgPCBsaW5lT2Zmc2V0cy5sZW5ndGggPyBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lICsgMV0gOiB0aGlzLl9jb250ZW50Lmxlbmd0aDsKICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4obGluZU9mZnNldCArIHBvc2l0aW9uLmNoYXJhY3RlciwgbmV4dExpbmVPZmZzZXQpLCBsaW5lT2Zmc2V0KTsKICAgICAgfTsKICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ1bGxUZXh0RG9jdW1lbnQzLnByb3RvdHlwZSwgImxpbmVDb3VudCIsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZU9mZnNldHMoKS5sZW5ndGg7CiAgICAgICAgfSwKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICAgIEZ1bGxUZXh0RG9jdW1lbnQzLmlzSW5jcmVtZW50YWwgPSBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciBjYW5kaWRhdGUgPSBldmVudDsKICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB2b2lkIDAgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIHR5cGVvZiBjYW5kaWRhdGUudGV4dCA9PT0gInN0cmluZyIgJiYgY2FuZGlkYXRlLnJhbmdlICE9PSB2b2lkIDAgJiYgKGNhbmRpZGF0ZS5yYW5nZUxlbmd0aCA9PT0gdm9pZCAwIHx8IHR5cGVvZiBjYW5kaWRhdGUucmFuZ2VMZW5ndGggPT09ICJudW1iZXIiKTsKICAgICAgfTsKICAgICAgRnVsbFRleHREb2N1bWVudDMuaXNGdWxsID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgY2FuZGlkYXRlID0gZXZlbnQ7CiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdm9pZCAwICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiB0eXBlb2YgY2FuZGlkYXRlLnRleHQgPT09ICJzdHJpbmciICYmIGNhbmRpZGF0ZS5yYW5nZSA9PT0gdm9pZCAwICYmIGNhbmRpZGF0ZS5yYW5nZUxlbmd0aCA9PT0gdm9pZCAwOwogICAgICB9OwogICAgICByZXR1cm4gRnVsbFRleHREb2N1bWVudDM7CiAgICB9KCk7CiAgICB2YXIgVGV4dERvY3VtZW50MjsKICAgIChmdW5jdGlvbihUZXh0RG9jdW1lbnQzKSB7CiAgICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHsKICAgICAgICByZXR1cm4gbmV3IEZ1bGxUZXh0RG9jdW1lbnQyKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCk7CiAgICAgIH0KICAgICAgVGV4dERvY3VtZW50My5jcmVhdGUgPSBjcmVhdGU7CiAgICAgIGZ1bmN0aW9uIHVwZGF0ZShkb2N1bWVudCwgY2hhbmdlcywgdmVyc2lvbikgewogICAgICAgIGlmIChkb2N1bWVudCBpbnN0YW5jZW9mIEZ1bGxUZXh0RG9jdW1lbnQyKSB7CiAgICAgICAgICBkb2N1bWVudC51cGRhdGUoY2hhbmdlcywgdmVyc2lvbik7CiAgICAgICAgICByZXR1cm4gZG9jdW1lbnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVGV4dERvY3VtZW50LnVwZGF0ZTogZG9jdW1lbnQgbXVzdCBiZSBjcmVhdGVkIGJ5IFRleHREb2N1bWVudC5jcmVhdGUiKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgVGV4dERvY3VtZW50My51cGRhdGUgPSB1cGRhdGU7CiAgICAgIGZ1bmN0aW9uIGFwcGx5RWRpdHMoZG9jdW1lbnQsIGVkaXRzKSB7CiAgICAgICAgdmFyIHRleHQgPSBkb2N1bWVudC5nZXRUZXh0KCk7CiAgICAgICAgdmFyIHNvcnRlZEVkaXRzID0gbWVyZ2VTb3J0KGVkaXRzLm1hcChnZXRXZWxsZm9ybWVkRWRpdCksIGZ1bmN0aW9uKGEyLCBiKSB7CiAgICAgICAgICB2YXIgZGlmZiA9IGEyLnJhbmdlLnN0YXJ0LmxpbmUgLSBiLnJhbmdlLnN0YXJ0LmxpbmU7CiAgICAgICAgICBpZiAoZGlmZiA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gYTIucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyIC0gYi5yYW5nZS5zdGFydC5jaGFyYWN0ZXI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZGlmZjsKICAgICAgICB9KTsKICAgICAgICB2YXIgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gMDsKICAgICAgICB2YXIgc3BhbnMgPSBbXTsKICAgICAgICBmb3IgKHZhciBfaSA9IDAsIHNvcnRlZEVkaXRzXzEgPSBzb3J0ZWRFZGl0czsgX2kgPCBzb3J0ZWRFZGl0c18xLmxlbmd0aDsgX2krKykgewogICAgICAgICAgdmFyIGUgPSBzb3J0ZWRFZGl0c18xW19pXTsKICAgICAgICAgIHZhciBzdGFydE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2Uuc3RhcnQpOwogICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0IDwgbGFzdE1vZGlmaWVkT2Zmc2V0KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiT3ZlcmxhcHBpbmcgZWRpdCIpOwogICAgICAgICAgfSBlbHNlIGlmIChzdGFydE9mZnNldCA+IGxhc3RNb2RpZmllZE9mZnNldCkgewogICAgICAgICAgICBzcGFucy5wdXNoKHRleHQuc3Vic3RyaW5nKGxhc3RNb2RpZmllZE9mZnNldCwgc3RhcnRPZmZzZXQpKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChlLm5ld1RleHQubGVuZ3RoKSB7CiAgICAgICAgICAgIHNwYW5zLnB1c2goZS5uZXdUZXh0KTsKICAgICAgICAgIH0KICAgICAgICAgIGxhc3RNb2RpZmllZE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2UuZW5kKTsKICAgICAgICB9CiAgICAgICAgc3BhbnMucHVzaCh0ZXh0LnN1YnN0cihsYXN0TW9kaWZpZWRPZmZzZXQpKTsKICAgICAgICByZXR1cm4gc3BhbnMuam9pbigiIik7CiAgICAgIH0KICAgICAgVGV4dERvY3VtZW50My5hcHBseUVkaXRzID0gYXBwbHlFZGl0czsKICAgIH0pKFRleHREb2N1bWVudDIgfHwgKFRleHREb2N1bWVudDIgPSB7fSkpOwogICAgZnVuY3Rpb24gbWVyZ2VTb3J0KGRhdGEsIGNvbXBhcmUpIHsKICAgICAgaWYgKGRhdGEubGVuZ3RoIDw9IDEpIHsKICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgfQogICAgICB2YXIgcCA9IGRhdGEubGVuZ3RoIC8gMiB8IDA7CiAgICAgIHZhciBsZWZ0ID0gZGF0YS5zbGljZSgwLCBwKTsKICAgICAgdmFyIHJpZ2h0ID0gZGF0YS5zbGljZShwKTsKICAgICAgbWVyZ2VTb3J0KGxlZnQsIGNvbXBhcmUpOwogICAgICBtZXJnZVNvcnQocmlnaHQsIGNvbXBhcmUpOwogICAgICB2YXIgbGVmdElkeCA9IDA7CiAgICAgIHZhciByaWdodElkeCA9IDA7CiAgICAgIHZhciBpID0gMDsKICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCAmJiByaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkgewogICAgICAgIHZhciByZXQgPSBjb21wYXJlKGxlZnRbbGVmdElkeF0sIHJpZ2h0W3JpZ2h0SWR4XSk7CiAgICAgICAgaWYgKHJldCA8PSAwKSB7CiAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdOwogICAgICAgIH0KICAgICAgfQogICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoKSB7CiAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdOwogICAgICB9CiAgICAgIHdoaWxlIChyaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkgewogICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdOwogICAgICB9CiAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgZnVuY3Rpb24gY29tcHV0ZUxpbmVPZmZzZXRzKHRleHQsIGlzQXRMaW5lU3RhcnQsIHRleHRPZmZzZXQpIHsKICAgICAgaWYgKHRleHRPZmZzZXQgPT09IHZvaWQgMCkgewogICAgICAgIHRleHRPZmZzZXQgPSAwOwogICAgICB9CiAgICAgIHZhciByZXN1bHQgPSBpc0F0TGluZVN0YXJ0ID8gW3RleHRPZmZzZXRdIDogW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjaCA9IHRleHQuY2hhckNvZGVBdChpKTsKICAgICAgICBpZiAoY2ggPT09IDEzIHx8IGNoID09PSAxMCkgewogICAgICAgICAgaWYgKGNoID09PSAxMyAmJiBpICsgMSA8IHRleHQubGVuZ3RoICYmIHRleHQuY2hhckNvZGVBdChpICsgMSkgPT09IDEwKSB7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdC5wdXNoKHRleHRPZmZzZXQgKyBpICsgMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXZWxsZm9ybWVkUmFuZ2UocmFuZ2UpIHsKICAgICAgdmFyIHN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7CiAgICAgIHZhciBlbmQgPSByYW5nZS5lbmQ7CiAgICAgIGlmIChzdGFydC5saW5lID4gZW5kLmxpbmUgfHwgc3RhcnQubGluZSA9PT0gZW5kLmxpbmUgJiYgc3RhcnQuY2hhcmFjdGVyID4gZW5kLmNoYXJhY3RlcikgewogICAgICAgIHJldHVybiB7IHN0YXJ0OiBlbmQsIGVuZDogc3RhcnQgfTsKICAgICAgfQogICAgICByZXR1cm4gcmFuZ2U7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRXZWxsZm9ybWVkRWRpdCh0ZXh0RWRpdCkgewogICAgICB2YXIgcmFuZ2UgPSBnZXRXZWxsZm9ybWVkUmFuZ2UodGV4dEVkaXQucmFuZ2UpOwogICAgICBpZiAocmFuZ2UgIT09IHRleHRFZGl0LnJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHsgbmV3VGV4dDogdGV4dEVkaXQubmV3VGV4dCwgcmFuZ2UgfTsKICAgICAgfQogICAgICByZXR1cm4gdGV4dEVkaXQ7CiAgICB9CgogICAgLy8gbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29uLWxhbmd1YWdlc2VydmljZS9saWIvZXNtL2pzb25MYW5ndWFnZVR5cGVzLmpzCiAgICB2YXIgRXJyb3JDb2RlOwogICAgKGZ1bmN0aW9uKEVycm9yQ29kZTIpIHsKICAgICAgRXJyb3JDb2RlMltFcnJvckNvZGUyWyJVbmRlZmluZWQiXSA9IDBdID0gIlVuZGVmaW5lZCI7CiAgICAgIEVycm9yQ29kZTJbRXJyb3JDb2RlMlsiRW51bVZhbHVlTWlzbWF0Y2giXSA9IDFdID0gIkVudW1WYWx1ZU1pc21hdGNoIjsKICAgICAgRXJyb3JDb2RlMltFcnJvckNvZGUyWyJEZXByZWNhdGVkIl0gPSAyXSA9ICJEZXByZWNhdGVkIjsKICAgICAgRXJyb3JDb2RlMltFcnJvckNvZGUyWyJVbmV4cGVjdGVkRW5kT2ZDb21tZW50Il0gPSAyNTddID0gIlVuZXhwZWN0ZWRFbmRPZkNvbW1lbnQiOwogICAgICBFcnJvckNvZGUyW0Vycm9yQ29kZTJbIlVuZXhwZWN0ZWRFbmRPZlN0cmluZyJdID0gMjU4XSA9ICJVbmV4cGVjdGVkRW5kT2ZTdHJpbmciOwogICAgICBFcnJvckNvZGUyW0Vycm9yQ29kZTJbIlVuZXhwZWN0ZWRFbmRPZk51bWJlciJdID0gMjU5XSA9ICJVbmV4cGVjdGVkRW5kT2ZOdW1iZXIiOwogICAgICBFcnJvckNvZGUyW0Vycm9yQ29kZTJbIkludmFsaWRVbmljb2RlIl0gPSAyNjBdID0gIkludmFsaWRVbmljb2RlIjsKICAgICAgRXJyb3JDb2RlMltFcnJvckNvZGUyWyJJbnZhbGlkRXNjYXBlQ2hhcmFjdGVyIl0gPSAyNjFdID0gIkludmFsaWRFc2NhcGVDaGFyYWN0ZXIiOwogICAgICBFcnJvckNvZGUyW0Vycm9yQ29kZTJbIkludmFsaWRDaGFyYWN0ZXIiXSA9IDI2Ml0gPSAiSW52YWxpZENoYXJhY3RlciI7CiAgICAgIEVycm9yQ29kZTJbRXJyb3JDb2RlMlsiUHJvcGVydHlFeHBlY3RlZCJdID0gNTEzXSA9ICJQcm9wZXJ0eUV4cGVjdGVkIjsKICAgICAgRXJyb3JDb2RlMltFcnJvckNvZGUyWyJDb21tYUV4cGVjdGVkIl0gPSA1MTRdID0gIkNvbW1hRXhwZWN0ZWQiOwogICAgICBFcnJvckNvZGUyW0Vycm9yQ29kZTJbIkNvbG9uRXhwZWN0ZWQiXSA9IDUxNV0gPSAiQ29sb25FeHBlY3RlZCI7CiAgICAgIEVycm9yQ29kZTJbRXJyb3JDb2RlMlsiVmFsdWVFeHBlY3RlZCJdID0gNTE2XSA9ICJWYWx1ZUV4cGVjdGVkIjsKICAgICAgRXJyb3JDb2RlMltFcnJvckNvZGUyWyJDb21tYU9yQ2xvc2VCYWNrZXRFeHBlY3RlZCJdID0gNTE3XSA9ICJDb21tYU9yQ2xvc2VCYWNrZXRFeHBlY3RlZCI7CiAgICAgIEVycm9yQ29kZTJbRXJyb3JDb2RlMlsiQ29tbWFPckNsb3NlQnJhY2VFeHBlY3RlZCJdID0gNTE4XSA9ICJDb21tYU9yQ2xvc2VCcmFjZUV4cGVjdGVkIjsKICAgICAgRXJyb3JDb2RlMltFcnJvckNvZGUyWyJUcmFpbGluZ0NvbW1hIl0gPSA1MTldID0gIlRyYWlsaW5nQ29tbWEiOwogICAgICBFcnJvckNvZGUyW0Vycm9yQ29kZTJbIkR1cGxpY2F0ZUtleSJdID0gNTIwXSA9ICJEdXBsaWNhdGVLZXkiOwogICAgICBFcnJvckNvZGUyW0Vycm9yQ29kZTJbIkNvbW1lbnROb3RQZXJtaXR0ZWQiXSA9IDUyMV0gPSAiQ29tbWVudE5vdFBlcm1pdHRlZCI7CiAgICAgIEVycm9yQ29kZTJbRXJyb3JDb2RlMlsiU2NoZW1hUmVzb2x2ZUVycm9yIl0gPSA3NjhdID0gIlNjaGVtYVJlc29sdmVFcnJvciI7CiAgICB9KShFcnJvckNvZGUgfHwgKEVycm9yQ29kZSA9IHt9KSk7CiAgICB2YXIgQ2xpZW50Q2FwYWJpbGl0aWVzOwogICAgKGZ1bmN0aW9uKENsaWVudENhcGFiaWxpdGllczIpIHsKICAgICAgQ2xpZW50Q2FwYWJpbGl0aWVzMi5MQVRFU1QgPSB7CiAgICAgICAgdGV4dERvY3VtZW50OiB7CiAgICAgICAgICBjb21wbGV0aW9uOiB7CiAgICAgICAgICAgIGNvbXBsZXRpb25JdGVtOiB7CiAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogW01hcmt1cEtpbmQuTWFya2Rvd24sIE1hcmt1cEtpbmQuUGxhaW5UZXh0XSwKICAgICAgICAgICAgICBjb21taXRDaGFyYWN0ZXJzU3VwcG9ydDogdHJ1ZQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgfSkoQ2xpZW50Q2FwYWJpbGl0aWVzIHx8IChDbGllbnRDYXBhYmlsaXRpZXMgPSB7fSkpOwoKICAgIC8vIGJ1aWxkL2ZpbGxlcnMvdnNjb2RlLW5scy50cwogICAgZnVuY3Rpb24gZm9ybWF0MyhtZXNzYWdlLCBhcmdzKSB7CiAgICAgIGxldCByZXN1bHQ7CiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJlc3VsdCA9IG1lc3NhZ2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVzdWx0ID0gbWVzc2FnZS5yZXBsYWNlKC9ceyhcZCspXH0vZywgKG1hdGNoLCByZXN0KSA9PiB7CiAgICAgICAgICBsZXQgaW5kZXggPSByZXN0WzBdOwogICAgICAgICAgcmV0dXJuIHR5cGVvZiBhcmdzW2luZGV4XSAhPT0gInVuZGVmaW5lZCIgPyBhcmdzW2luZGV4XSA6IG1hdGNoOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBmdW5jdGlvbiBsb2NhbGl6ZShrZXksIG1lc3NhZ2UsIC4uLmFyZ3MpIHsKICAgICAgcmV0dXJuIGZvcm1hdDMobWVzc2FnZSwgYXJncyk7CiAgICB9CiAgICBmdW5jdGlvbiBsb2FkTWVzc2FnZUJ1bmRsZShmaWxlKSB7CiAgICAgIHJldHVybiBsb2NhbGl6ZTsKICAgIH0KCiAgICAvLyBub2RlX21vZHVsZXMvdnNjb2RlLWpzb24tbGFuZ3VhZ2VzZXJ2aWNlL2xpYi9lc20vcGFyc2VyL2pzb25QYXJzZXIuanMKICAgIHZhciBfX2V4dGVuZHMgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBmdW5jdGlvbihkLCBiKSB7CiAgICAgICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKGQyLCBiMikgewogICAgICAgICAgZDIuX19wcm90b19fID0gYjI7CiAgICAgICAgfSB8fCBmdW5jdGlvbihkMiwgYjIpIHsKICAgICAgICAgIGZvciAodmFyIHAgaW4gYjIpCiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYjIsIHApKQogICAgICAgICAgICAgIGQyW3BdID0gYjJbcF07CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gZXh0ZW5kU3RhdGljcyhkLCBiKTsKICAgICAgfTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQsIGIpIHsKICAgICAgICBpZiAodHlwZW9mIGIgIT09ICJmdW5jdGlvbiIgJiYgYiAhPT0gbnVsbCkKICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkNsYXNzIGV4dGVuZHMgdmFsdWUgIiArIFN0cmluZyhiKSArICIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbCIpOwogICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgICAgZnVuY3Rpb24gX18oKSB7CiAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gZDsKICAgICAgICB9CiAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpOwogICAgICB9OwogICAgfSgpOwogICAgdmFyIGxvY2FsaXplMiA9IGxvYWRNZXNzYWdlQnVuZGxlKCk7CiAgICB2YXIgZm9ybWF0cyA9IHsKICAgICAgImNvbG9yLWhleCI6IHsgZXJyb3JNZXNzYWdlOiBsb2NhbGl6ZTIoImNvbG9ySGV4Rm9ybWF0V2FybmluZyIsICJJbnZhbGlkIGNvbG9yIGZvcm1hdC4gVXNlICNSR0IsICNSR0JBLCAjUlJHR0JCIG9yICNSUkdHQkJBQS4iKSwgcGF0dGVybjogL14jKFswLTlBLUZhLWZdezMsNH18KFswLTlBLUZhLWZdezJ9KXszLDR9KSQvIH0sCiAgICAgICJkYXRlLXRpbWUiOiB7IGVycm9yTWVzc2FnZTogbG9jYWxpemUyKCJkYXRlVGltZUZvcm1hdFdhcm5pbmciLCAiU3RyaW5nIGlzIG5vdCBhIFJGQzMzMzkgZGF0ZS10aW1lLiIpLCBwYXR0ZXJuOiAvXihcZHs0fSktKDBbMS05XXwxWzAtMl0pLSgwWzEtOV18WzEyXVswLTldfDNbMDFdKVQoWzAxXVswLTldfDJbMC0zXSk6KFswLTVdWzAtOV0pOihbMC01XVswLTldfDYwKShcLlswLTldKyk/KFp8KFwrfC0pKFswMV1bMC05XXwyWzAtM10pOihbMC01XVswLTldKSkkL2kgfSwKICAgICAgImRhdGUiOiB7IGVycm9yTWVzc2FnZTogbG9jYWxpemUyKCJkYXRlRm9ybWF0V2FybmluZyIsICJTdHJpbmcgaXMgbm90IGEgUkZDMzMzOSBkYXRlLiIpLCBwYXR0ZXJuOiAvXihcZHs0fSktKDBbMS05XXwxWzAtMl0pLSgwWzEtOV18WzEyXVswLTldfDNbMDFdKSQvaSB9LAogICAgICAidGltZSI6IHsgZXJyb3JNZXNzYWdlOiBsb2NhbGl6ZTIoInRpbWVGb3JtYXRXYXJuaW5nIiwgIlN0cmluZyBpcyBub3QgYSBSRkMzMzM5IHRpbWUuIiksIHBhdHRlcm46IC9eKFswMV1bMC05XXwyWzAtM10pOihbMC01XVswLTldKTooWzAtNV1bMC05XXw2MCkoXC5bMC05XSspPyhafChcK3wtKShbMDFdWzAtOV18MlswLTNdKTooWzAtNV1bMC05XSkpJC9pIH0sCiAgICAgICJlbWFpbCI6IHsgZXJyb3JNZXNzYWdlOiBsb2NhbGl6ZTIoImVtYWlsRm9ybWF0V2FybmluZyIsICJTdHJpbmcgaXMgbm90IGFuIGUtbWFpbCBhZGRyZXNzLiIpLCBwYXR0ZXJuOiAvXigoW148PigpXFtcXVxcLiw7OlxzQCJdKyhcLltePD4oKVxbXF1cXC4sOzpcc0AiXSspKil8KCIuKyIpKUAoKFxbWzAtOV17MSwzfVwuWzAtOV17MSwzfVwuWzAtOV17MSwzfVwuWzAtOV17MSwzfV0pfCgoW2EtekEtWlwtMC05XStcLikrW2EtekEtWl17Mix9KSkkLyB9CiAgICB9OwogICAgdmFyIEFTVE5vZGVJbXBsID0gZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIEFTVE5vZGVJbXBsMihwYXJlbnQsIG9mZnNldCwgbGVuZ3RoKSB7CiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBsZW5ndGggPSAwOwogICAgICAgIH0KICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICAgfQogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQVNUTm9kZUltcGwyLnByb3RvdHlwZSwgImNoaWxkcmVuIiwgewogICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICAgIEFTVE5vZGVJbXBsMi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gInR5cGU6ICIgKyB0aGlzLnR5cGUgKyAiICgiICsgdGhpcy5vZmZzZXQgKyAiLyIgKyB0aGlzLmxlbmd0aCArICIpIiArICh0aGlzLnBhcmVudCA/ICIgcGFyZW50OiB7IiArIHRoaXMucGFyZW50LnRvU3RyaW5nKCkgKyAifSIgOiAiIik7CiAgICAgIH07CiAgICAgIHJldHVybiBBU1ROb2RlSW1wbDI7CiAgICB9KCk7CiAgICB2YXIgTnVsbEFTVE5vZGVJbXBsID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhOdWxsQVNUTm9kZUltcGwyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBOdWxsQVNUTm9kZUltcGwyKHBhcmVudCwgb2Zmc2V0KSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcGFyZW50LCBvZmZzZXQpIHx8IHRoaXM7CiAgICAgICAgX3RoaXMudHlwZSA9ICJudWxsIjsKICAgICAgICBfdGhpcy52YWx1ZSA9IG51bGw7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIHJldHVybiBOdWxsQVNUTm9kZUltcGwyOwogICAgfShBU1ROb2RlSW1wbCk7CiAgICB2YXIgQm9vbGVhbkFTVE5vZGVJbXBsID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhCb29sZWFuQVNUTm9kZUltcGwyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBCb29sZWFuQVNUTm9kZUltcGwyKHBhcmVudCwgYm9vbFZhbHVlLCBvZmZzZXQpIHsKICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBwYXJlbnQsIG9mZnNldCkgfHwgdGhpczsKICAgICAgICBfdGhpcy50eXBlID0gImJvb2xlYW4iOwogICAgICAgIF90aGlzLnZhbHVlID0gYm9vbFZhbHVlOwogICAgICAgIHJldHVybiBfdGhpczsKICAgICAgfQogICAgICByZXR1cm4gQm9vbGVhbkFTVE5vZGVJbXBsMjsKICAgIH0oQVNUTm9kZUltcGwpOwogICAgdmFyIEFycmF5QVNUTm9kZUltcGwgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKEFycmF5QVNUTm9kZUltcGwyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBBcnJheUFTVE5vZGVJbXBsMihwYXJlbnQsIG9mZnNldCkgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBhcmVudCwgb2Zmc2V0KSB8fCB0aGlzOwogICAgICAgIF90aGlzLnR5cGUgPSAiYXJyYXkiOwogICAgICAgIF90aGlzLml0ZW1zID0gW107CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcnJheUFTVE5vZGVJbXBsMi5wcm90b3R5cGUsICJjaGlsZHJlbiIsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXM7CiAgICAgICAgfSwKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICAgIHJldHVybiBBcnJheUFTVE5vZGVJbXBsMjsKICAgIH0oQVNUTm9kZUltcGwpOwogICAgdmFyIE51bWJlckFTVE5vZGVJbXBsID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhOdW1iZXJBU1ROb2RlSW1wbDIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIE51bWJlckFTVE5vZGVJbXBsMihwYXJlbnQsIG9mZnNldCkgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBhcmVudCwgb2Zmc2V0KSB8fCB0aGlzOwogICAgICAgIF90aGlzLnR5cGUgPSAibnVtYmVyIjsKICAgICAgICBfdGhpcy5pc0ludGVnZXIgPSB0cnVlOwogICAgICAgIF90aGlzLnZhbHVlID0gTnVtYmVyLk5hTjsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgcmV0dXJuIE51bWJlckFTVE5vZGVJbXBsMjsKICAgIH0oQVNUTm9kZUltcGwpOwogICAgdmFyIFN0cmluZ0FTVE5vZGVJbXBsID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhTdHJpbmdBU1ROb2RlSW1wbDIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIFN0cmluZ0FTVE5vZGVJbXBsMihwYXJlbnQsIG9mZnNldCwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcGFyZW50LCBvZmZzZXQsIGxlbmd0aCkgfHwgdGhpczsKICAgICAgICBfdGhpcy50eXBlID0gInN0cmluZyI7CiAgICAgICAgX3RoaXMudmFsdWUgPSAiIjsKICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgIH0KICAgICAgcmV0dXJuIFN0cmluZ0FTVE5vZGVJbXBsMjsKICAgIH0oQVNUTm9kZUltcGwpOwogICAgdmFyIFByb3BlcnR5QVNUTm9kZUltcGwgPSBmdW5jdGlvbihfc3VwZXIpIHsKICAgICAgX19leHRlbmRzKFByb3BlcnR5QVNUTm9kZUltcGwyLCBfc3VwZXIpOwogICAgICBmdW5jdGlvbiBQcm9wZXJ0eUFTVE5vZGVJbXBsMihwYXJlbnQsIG9mZnNldCwga2V5Tm9kZSkgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBhcmVudCwgb2Zmc2V0KSB8fCB0aGlzOwogICAgICAgIF90aGlzLnR5cGUgPSAicHJvcGVydHkiOwogICAgICAgIF90aGlzLmNvbG9uT2Zmc2V0ID0gLTE7CiAgICAgICAgX3RoaXMua2V5Tm9kZSA9IGtleU5vZGU7CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShQcm9wZXJ0eUFTVE5vZGVJbXBsMi5wcm90b3R5cGUsICJjaGlsZHJlbiIsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVOb2RlID8gW3RoaXMua2V5Tm9kZSwgdGhpcy52YWx1ZU5vZGVdIDogW3RoaXMua2V5Tm9kZV07CiAgICAgICAgfSwKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICAgIHJldHVybiBQcm9wZXJ0eUFTVE5vZGVJbXBsMjsKICAgIH0oQVNUTm9kZUltcGwpOwogICAgdmFyIE9iamVjdEFTVE5vZGVJbXBsID0gZnVuY3Rpb24oX3N1cGVyKSB7CiAgICAgIF9fZXh0ZW5kcyhPYmplY3RBU1ROb2RlSW1wbDIsIF9zdXBlcik7CiAgICAgIGZ1bmN0aW9uIE9iamVjdEFTVE5vZGVJbXBsMihwYXJlbnQsIG9mZnNldCkgewogICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHBhcmVudCwgb2Zmc2V0KSB8fCB0aGlzOwogICAgICAgIF90aGlzLnR5cGUgPSAib2JqZWN0IjsKICAgICAgICBfdGhpcy5wcm9wZXJ0aWVzID0gW107CiAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICB9CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3RBU1ROb2RlSW1wbDIucHJvdG90eXBlLCAiY2hpbGRyZW4iLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXM7CiAgICAgICAgfSwKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICAgIHJldHVybiBPYmplY3RBU1ROb2RlSW1wbDI7CiAgICB9KEFTVE5vZGVJbXBsKTsKICAgIGZ1bmN0aW9uIGFzU2NoZW1hKHNjaGVtYSkgewogICAgICBpZiAoaXNCb29sZWFuKHNjaGVtYSkpIHsKICAgICAgICByZXR1cm4gc2NoZW1hID8ge30gOiB7ICJub3QiOiB7fSB9OwogICAgICB9CiAgICAgIHJldHVybiBzY2hlbWE7CiAgICB9CiAgICB2YXIgRW51bU1hdGNoOwogICAgKGZ1bmN0aW9uKEVudW1NYXRjaDIpIHsKICAgICAgRW51bU1hdGNoMltFbnVtTWF0Y2gyWyJLZXkiXSA9IDBdID0gIktleSI7CiAgICAgIEVudW1NYXRjaDJbRW51bU1hdGNoMlsiRW51bSJdID0gMV0gPSAiRW51bSI7CiAgICB9KShFbnVtTWF0Y2ggfHwgKEVudW1NYXRjaCA9IHt9KSk7CiAgICB2YXIgU2NoZW1hQ29sbGVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIFNjaGVtYUNvbGxlY3RvcjIoZm9jdXNPZmZzZXQsIGV4Y2x1ZGUpIHsKICAgICAgICBpZiAoZm9jdXNPZmZzZXQgPT09IHZvaWQgMCkgewogICAgICAgICAgZm9jdXNPZmZzZXQgPSAtMTsKICAgICAgICB9CiAgICAgICAgdGhpcy5mb2N1c09mZnNldCA9IGZvY3VzT2Zmc2V0OwogICAgICAgIHRoaXMuZXhjbHVkZSA9IGV4Y2x1ZGU7CiAgICAgICAgdGhpcy5zY2hlbWFzID0gW107CiAgICAgIH0KICAgICAgU2NoZW1hQ29sbGVjdG9yMi5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24oc2NoZW1hKSB7CiAgICAgICAgdGhpcy5zY2hlbWFzLnB1c2goc2NoZW1hKTsKICAgICAgfTsKICAgICAgU2NoZW1hQ29sbGVjdG9yMi5wcm90b3R5cGUubWVyZ2UgPSBmdW5jdGlvbihvdGhlcikgewogICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuc2NoZW1hcywgb3RoZXIuc2NoZW1hcyk7CiAgICAgIH07CiAgICAgIFNjaGVtYUNvbGxlY3RvcjIucHJvdG90eXBlLmluY2x1ZGUgPSBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLmZvY3VzT2Zmc2V0ID09PSAtMSB8fCBjb250YWluczIobm9kZSwgdGhpcy5mb2N1c09mZnNldCkpICYmIG5vZGUgIT09IHRoaXMuZXhjbHVkZTsKICAgICAgfTsKICAgICAgU2NoZW1hQ29sbGVjdG9yMi5wcm90b3R5cGUubmV3U3ViID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTY2hlbWFDb2xsZWN0b3IyKC0xLCB0aGlzLmV4Y2x1ZGUpOwogICAgICB9OwogICAgICByZXR1cm4gU2NoZW1hQ29sbGVjdG9yMjsKICAgIH0oKTsKICAgIHZhciBOb09wU2NoZW1hQ29sbGVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIE5vT3BTY2hlbWFDb2xsZWN0b3IyKCkgewogICAgICB9CiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShOb09wU2NoZW1hQ29sbGVjdG9yMi5wcm90b3R5cGUsICJzY2hlbWFzIiwgewogICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfSwKICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICAgIE5vT3BTY2hlbWFDb2xsZWN0b3IyLnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihzY2hlbWEpIHsKICAgICAgfTsKICAgICAgTm9PcFNjaGVtYUNvbGxlY3RvcjIucHJvdG90eXBlLm1lcmdlID0gZnVuY3Rpb24ob3RoZXIpIHsKICAgICAgfTsKICAgICAgTm9PcFNjaGVtYUNvbGxlY3RvcjIucHJvdG90eXBlLmluY2x1ZGUgPSBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH07CiAgICAgIE5vT3BTY2hlbWFDb2xsZWN0b3IyLnByb3RvdHlwZS5uZXdTdWIgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfTsKICAgICAgTm9PcFNjaGVtYUNvbGxlY3RvcjIuaW5zdGFuY2UgPSBuZXcgTm9PcFNjaGVtYUNvbGxlY3RvcjIoKTsKICAgICAgcmV0dXJuIE5vT3BTY2hlbWFDb2xsZWN0b3IyOwogICAgfSgpOwogICAgdmFyIFZhbGlkYXRpb25SZXN1bHQgPSBmdW5jdGlvbigpIHsKICAgICAgZnVuY3Rpb24gVmFsaWRhdGlvblJlc3VsdDIoKSB7CiAgICAgICAgdGhpcy5wcm9ibGVtcyA9IFtdOwogICAgICAgIHRoaXMucHJvcGVydGllc01hdGNoZXMgPSAwOwogICAgICAgIHRoaXMucHJvcGVydGllc1ZhbHVlTWF0Y2hlcyA9IDA7CiAgICAgICAgdGhpcy5wcmltYXJ5VmFsdWVNYXRjaGVzID0gMDsKICAgICAgICB0aGlzLmVudW1WYWx1ZU1hdGNoID0gZmFsc2U7CiAgICAgICAgdGhpcy5lbnVtVmFsdWVzID0gdm9pZCAwOwogICAgICB9CiAgICAgIFZhbGlkYXRpb25SZXN1bHQyLnByb3RvdHlwZS5oYXNQcm9ibGVtcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAhIXRoaXMucHJvYmxlbXMubGVuZ3RoOwogICAgICB9OwogICAgICBWYWxpZGF0aW9uUmVzdWx0Mi5wcm90b3R5cGUubWVyZ2VBbGwgPSBmdW5jdGlvbih2YWxpZGF0aW9uUmVzdWx0cykgewogICAgICAgIGZvciAodmFyIF9pID0gMCwgdmFsaWRhdGlvblJlc3VsdHNfMSA9IHZhbGlkYXRpb25SZXN1bHRzOyBfaSA8IHZhbGlkYXRpb25SZXN1bHRzXzEubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICB2YXIgdmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRpb25SZXN1bHRzXzFbX2ldOwogICAgICAgICAgdGhpcy5tZXJnZSh2YWxpZGF0aW9uUmVzdWx0KTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIFZhbGlkYXRpb25SZXN1bHQyLnByb3RvdHlwZS5tZXJnZSA9IGZ1bmN0aW9uKHZhbGlkYXRpb25SZXN1bHQpIHsKICAgICAgICB0aGlzLnByb2JsZW1zID0gdGhpcy5wcm9ibGVtcy5jb25jYXQodmFsaWRhdGlvblJlc3VsdC5wcm9ibGVtcyk7CiAgICAgIH07CiAgICAgIFZhbGlkYXRpb25SZXN1bHQyLnByb3RvdHlwZS5tZXJnZUVudW1WYWx1ZXMgPSBmdW5jdGlvbih2YWxpZGF0aW9uUmVzdWx0KSB7CiAgICAgICAgaWYgKCF0aGlzLmVudW1WYWx1ZU1hdGNoICYmICF2YWxpZGF0aW9uUmVzdWx0LmVudW1WYWx1ZU1hdGNoICYmIHRoaXMuZW51bVZhbHVlcyAmJiB2YWxpZGF0aW9uUmVzdWx0LmVudW1WYWx1ZXMpIHsKICAgICAgICAgIHRoaXMuZW51bVZhbHVlcyA9IHRoaXMuZW51bVZhbHVlcy5jb25jYXQodmFsaWRhdGlvblJlc3VsdC5lbnVtVmFsdWVzKTsKICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLnByb2JsZW1zOyBfaSA8IF9hLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICB2YXIgZXJyb3IgPSBfYVtfaV07CiAgICAgICAgICAgIGlmIChlcnJvci5jb2RlID09PSBFcnJvckNvZGUuRW51bVZhbHVlTWlzbWF0Y2gpIHsKICAgICAgICAgICAgICBlcnJvci5tZXNzYWdlID0gbG9jYWxpemUyKCJlbnVtV2FybmluZyIsICJWYWx1ZSBpcyBub3QgYWNjZXB0ZWQuIFZhbGlkIHZhbHVlczogezB9LiIsIHRoaXMuZW51bVZhbHVlcy5tYXAoZnVuY3Rpb24odikgewogICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHYpOwogICAgICAgICAgICAgIH0pLmpvaW4oIiwgIikpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBWYWxpZGF0aW9uUmVzdWx0Mi5wcm90b3R5cGUubWVyZ2VQcm9wZXJ0eU1hdGNoID0gZnVuY3Rpb24ocHJvcGVydHlWYWxpZGF0aW9uUmVzdWx0KSB7CiAgICAgICAgdGhpcy5tZXJnZShwcm9wZXJ0eVZhbGlkYXRpb25SZXN1bHQpOwogICAgICAgIHRoaXMucHJvcGVydGllc01hdGNoZXMrKzsKICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uUmVzdWx0LmVudW1WYWx1ZU1hdGNoIHx8ICFwcm9wZXJ0eVZhbGlkYXRpb25SZXN1bHQuaGFzUHJvYmxlbXMoKSAmJiBwcm9wZXJ0eVZhbGlkYXRpb25SZXN1bHQucHJvcGVydGllc01hdGNoZXMpIHsKICAgICAgICAgIHRoaXMucHJvcGVydGllc1ZhbHVlTWF0Y2hlcysrOwogICAgICAgIH0KICAgICAgICBpZiAocHJvcGVydHlWYWxpZGF0aW9uUmVzdWx0LmVudW1WYWx1ZU1hdGNoICYmIHByb3BlcnR5VmFsaWRhdGlvblJlc3VsdC5lbnVtVmFsdWVzICYmIHByb3BlcnR5VmFsaWRhdGlvblJlc3VsdC5lbnVtVmFsdWVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgdGhpcy5wcmltYXJ5VmFsdWVNYXRjaGVzKys7CiAgICAgICAgfQogICAgICB9OwogICAgICBWYWxpZGF0aW9uUmVzdWx0Mi5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uKG90aGVyKSB7CiAgICAgICAgdmFyIGhhc1Byb2JsZW1zID0gdGhpcy5oYXNQcm9ibGVtcygpOwogICAgICAgIGlmIChoYXNQcm9ibGVtcyAhPT0gb3RoZXIuaGFzUHJvYmxlbXMoKSkgewogICAgICAgICAgcmV0dXJuIGhhc1Byb2JsZW1zID8gLTEgOiAxOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5lbnVtVmFsdWVNYXRjaCAhPT0gb3RoZXIuZW51bVZhbHVlTWF0Y2gpIHsKICAgICAgICAgIHJldHVybiBvdGhlci5lbnVtVmFsdWVNYXRjaCA/IC0xIDogMTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMucHJpbWFyeVZhbHVlTWF0Y2hlcyAhPT0gb3RoZXIucHJpbWFyeVZhbHVlTWF0Y2hlcykgewogICAgICAgICAgcmV0dXJuIHRoaXMucHJpbWFyeVZhbHVlTWF0Y2hlcyAtIG90aGVyLnByaW1hcnlWYWx1ZU1hdGNoZXM7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMgIT09IG90aGVyLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMgLSBvdGhlci5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5wcm9wZXJ0aWVzTWF0Y2hlcyAtIG90aGVyLnByb3BlcnRpZXNNYXRjaGVzOwogICAgICB9OwogICAgICByZXR1cm4gVmFsaWRhdGlvblJlc3VsdDI7CiAgICB9KCk7CiAgICBmdW5jdGlvbiBuZXdKU09ORG9jdW1lbnQocm9vdCwgZGlhZ25vc3RpY3MpIHsKICAgICAgaWYgKGRpYWdub3N0aWNzID09PSB2b2lkIDApIHsKICAgICAgICBkaWFnbm9zdGljcyA9IFtdOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgSlNPTkRvY3VtZW50KHJvb3QsIGRpYWdub3N0aWNzLCBbXSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXROb2RlVmFsdWUzKG5vZGUpIHsKICAgICAgcmV0dXJuIGdldE5vZGVWYWx1ZTIobm9kZSk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXROb2RlUGF0aDMobm9kZSkgewogICAgICByZXR1cm4gZ2V0Tm9kZVBhdGgyKG5vZGUpOwogICAgfQogICAgZnVuY3Rpb24gY29udGFpbnMyKG5vZGUsIG9mZnNldCwgaW5jbHVkZVJpZ2h0Qm91bmQpIHsKICAgICAgaWYgKGluY2x1ZGVSaWdodEJvdW5kID09PSB2b2lkIDApIHsKICAgICAgICBpbmNsdWRlUmlnaHRCb3VuZCA9IGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiBvZmZzZXQgPj0gbm9kZS5vZmZzZXQgJiYgb2Zmc2V0IDwgbm9kZS5vZmZzZXQgKyBub2RlLmxlbmd0aCB8fCBpbmNsdWRlUmlnaHRCb3VuZCAmJiBvZmZzZXQgPT09IG5vZGUub2Zmc2V0ICsgbm9kZS5sZW5ndGg7CiAgICB9CiAgICB2YXIgSlNPTkRvY3VtZW50ID0gZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIEpTT05Eb2N1bWVudDIocm9vdCwgc3ludGF4RXJyb3JzLCBjb21tZW50cykgewogICAgICAgIGlmIChzeW50YXhFcnJvcnMgPT09IHZvaWQgMCkgewogICAgICAgICAgc3ludGF4RXJyb3JzID0gW107CiAgICAgICAgfQogICAgICAgIGlmIChjb21tZW50cyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBjb21tZW50cyA9IFtdOwogICAgICAgIH0KICAgICAgICB0aGlzLnJvb3QgPSByb290OwogICAgICAgIHRoaXMuc3ludGF4RXJyb3JzID0gc3ludGF4RXJyb3JzOwogICAgICAgIHRoaXMuY29tbWVudHMgPSBjb21tZW50czsKICAgICAgfQogICAgICBKU09ORG9jdW1lbnQyLnByb3RvdHlwZS5nZXROb2RlRnJvbU9mZnNldCA9IGZ1bmN0aW9uKG9mZnNldCwgaW5jbHVkZVJpZ2h0Qm91bmQpIHsKICAgICAgICBpZiAoaW5jbHVkZVJpZ2h0Qm91bmQgPT09IHZvaWQgMCkgewogICAgICAgICAgaW5jbHVkZVJpZ2h0Qm91bmQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMucm9vdCkgewogICAgICAgICAgcmV0dXJuIGZpbmROb2RlQXRPZmZzZXQyKHRoaXMucm9vdCwgb2Zmc2V0LCBpbmNsdWRlUmlnaHRCb3VuZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH07CiAgICAgIEpTT05Eb2N1bWVudDIucHJvdG90eXBlLnZpc2l0ID0gZnVuY3Rpb24odmlzaXRvcikgewogICAgICAgIGlmICh0aGlzLnJvb3QpIHsKICAgICAgICAgIHZhciBkb1Zpc2l0XzEgPSBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgICAgIHZhciBjdG4gPSB2aXNpdG9yKG5vZGUpOwogICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjaGlsZHJlbikpIHsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aCAmJiBjdG47IGkrKykgewogICAgICAgICAgICAgICAgY3RuID0gZG9WaXNpdF8xKGNoaWxkcmVuW2ldKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGN0bjsKICAgICAgICAgIH07CiAgICAgICAgICBkb1Zpc2l0XzEodGhpcy5yb290KTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEpTT05Eb2N1bWVudDIucHJvdG90eXBlLnZhbGlkYXRlID0gZnVuY3Rpb24odGV4dERvY3VtZW50LCBzY2hlbWEsIHNldmVyaXR5KSB7CiAgICAgICAgaWYgKHNldmVyaXR5ID09PSB2b2lkIDApIHsKICAgICAgICAgIHNldmVyaXR5ID0gRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnJvb3QgJiYgc2NoZW1hKSB7CiAgICAgICAgICB2YXIgdmFsaWRhdGlvblJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7CiAgICAgICAgICB2YWxpZGF0ZSh0aGlzLnJvb3QsIHNjaGVtYSwgdmFsaWRhdGlvblJlc3VsdCwgTm9PcFNjaGVtYUNvbGxlY3Rvci5pbnN0YW5jZSk7CiAgICAgICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5wcm9ibGVtcy5tYXAoZnVuY3Rpb24ocCkgewogICAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmNyZWF0ZSh0ZXh0RG9jdW1lbnQucG9zaXRpb25BdChwLmxvY2F0aW9uLm9mZnNldCksIHRleHREb2N1bWVudC5wb3NpdGlvbkF0KHAubG9jYXRpb24ub2Zmc2V0ICsgcC5sb2NhdGlvbi5sZW5ndGgpKTsKICAgICAgICAgICAgcmV0dXJuIERpYWdub3N0aWMuY3JlYXRlKHJhbmdlLCBwLm1lc3NhZ2UsIChfYSA9IHAuc2V2ZXJpdHkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHNldmVyaXR5LCBwLmNvZGUpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH07CiAgICAgIEpTT05Eb2N1bWVudDIucHJvdG90eXBlLmdldE1hdGNoaW5nU2NoZW1hcyA9IGZ1bmN0aW9uKHNjaGVtYSwgZm9jdXNPZmZzZXQsIGV4Y2x1ZGUpIHsKICAgICAgICBpZiAoZm9jdXNPZmZzZXQgPT09IHZvaWQgMCkgewogICAgICAgICAgZm9jdXNPZmZzZXQgPSAtMTsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoaW5nU2NoZW1hcyA9IG5ldyBTY2hlbWFDb2xsZWN0b3IoZm9jdXNPZmZzZXQsIGV4Y2x1ZGUpOwogICAgICAgIGlmICh0aGlzLnJvb3QgJiYgc2NoZW1hKSB7CiAgICAgICAgICB2YWxpZGF0ZSh0aGlzLnJvb3QsIHNjaGVtYSwgbmV3IFZhbGlkYXRpb25SZXN1bHQoKSwgbWF0Y2hpbmdTY2hlbWFzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1hdGNoaW5nU2NoZW1hcy5zY2hlbWFzOwogICAgICB9OwogICAgICByZXR1cm4gSlNPTkRvY3VtZW50MjsKICAgIH0oKTsKICAgIGZ1bmN0aW9uIHZhbGlkYXRlKG4sIHNjaGVtYSwgdmFsaWRhdGlvblJlc3VsdCwgbWF0Y2hpbmdTY2hlbWFzKSB7CiAgICAgIGlmICghbiB8fCAhbWF0Y2hpbmdTY2hlbWFzLmluY2x1ZGUobikpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIG5vZGUgPSBuOwogICAgICBzd2l0Y2ggKG5vZGUudHlwZSkgewogICAgICAgIGNhc2UgIm9iamVjdCI6CiAgICAgICAgICBfdmFsaWRhdGVPYmplY3ROb2RlKG5vZGUsIHNjaGVtYSwgdmFsaWRhdGlvblJlc3VsdCwgbWF0Y2hpbmdTY2hlbWFzKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgImFycmF5IjoKICAgICAgICAgIF92YWxpZGF0ZUFycmF5Tm9kZShub2RlLCBzY2hlbWEsIHZhbGlkYXRpb25SZXN1bHQsIG1hdGNoaW5nU2NoZW1hcyk7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgX3ZhbGlkYXRlU3RyaW5nTm9kZShub2RlLCBzY2hlbWEsIHZhbGlkYXRpb25SZXN1bHQpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAibnVtYmVyIjoKICAgICAgICAgIF92YWxpZGF0ZU51bWJlck5vZGUobm9kZSwgc2NoZW1hLCB2YWxpZGF0aW9uUmVzdWx0KTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgInByb3BlcnR5IjoKICAgICAgICAgIHJldHVybiB2YWxpZGF0ZShub2RlLnZhbHVlTm9kZSwgc2NoZW1hLCB2YWxpZGF0aW9uUmVzdWx0LCBtYXRjaGluZ1NjaGVtYXMpOwogICAgICB9CiAgICAgIF92YWxpZGF0ZU5vZGUoKTsKICAgICAgbWF0Y2hpbmdTY2hlbWFzLmFkZCh7IG5vZGUsIHNjaGVtYSB9KTsKICAgICAgZnVuY3Rpb24gX3ZhbGlkYXRlTm9kZSgpIHsKICAgICAgICBmdW5jdGlvbiBtYXRjaGVzVHlwZSh0eXBlKSB7CiAgICAgICAgICByZXR1cm4gbm9kZS50eXBlID09PSB0eXBlIHx8IHR5cGUgPT09ICJpbnRlZ2VyIiAmJiBub2RlLnR5cGUgPT09ICJudW1iZXIiICYmIG5vZGUuaXNJbnRlZ2VyOwogICAgICAgIH0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEudHlwZSkpIHsKICAgICAgICAgIGlmICghc2NoZW1hLnR5cGUuc29tZShtYXRjaGVzVHlwZSkpIHsKICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdC5wcm9ibGVtcy5wdXNoKHsKICAgICAgICAgICAgICBsb2NhdGlvbjogeyBvZmZzZXQ6IG5vZGUub2Zmc2V0LCBsZW5ndGg6IG5vZGUubGVuZ3RoIH0sCiAgICAgICAgICAgICAgbWVzc2FnZTogc2NoZW1hLmVycm9yTWVzc2FnZSB8fCBsb2NhbGl6ZTIoInR5cGVBcnJheU1pc21hdGNoV2FybmluZyIsICJJbmNvcnJlY3QgdHlwZS4gRXhwZWN0ZWQgb25lIG9mIHswfS4iLCBzY2hlbWEudHlwZS5qb2luKCIsICIpKQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS50eXBlKSB7CiAgICAgICAgICBpZiAoIW1hdGNoZXNUeXBlKHNjaGVtYS50eXBlKSkgewogICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnByb2JsZW1zLnB1c2goewogICAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZS5vZmZzZXQsIGxlbmd0aDogbm9kZS5sZW5ndGggfSwKICAgICAgICAgICAgICBtZXNzYWdlOiBzY2hlbWEuZXJyb3JNZXNzYWdlIHx8IGxvY2FsaXplMigidHlwZU1pc21hdGNoV2FybmluZyIsICdJbmNvcnJlY3QgdHlwZS4gRXhwZWN0ZWQgInswfSIuJywgc2NoZW1hLnR5cGUpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuYWxsT2YpKSB7CiAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gc2NoZW1hLmFsbE9mOyBfaSA8IF9hLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICB2YXIgc3ViU2NoZW1hUmVmID0gX2FbX2ldOwogICAgICAgICAgICB2YWxpZGF0ZShub2RlLCBhc1NjaGVtYShzdWJTY2hlbWFSZWYpLCB2YWxpZGF0aW9uUmVzdWx0LCBtYXRjaGluZ1NjaGVtYXMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgbm90U2NoZW1hID0gYXNTY2hlbWEoc2NoZW1hLm5vdCk7CiAgICAgICAgaWYgKG5vdFNjaGVtYSkgewogICAgICAgICAgdmFyIHN1YlZhbGlkYXRpb25SZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwogICAgICAgICAgdmFyIHN1Yk1hdGNoaW5nU2NoZW1hcyA9IG1hdGNoaW5nU2NoZW1hcy5uZXdTdWIoKTsKICAgICAgICAgIHZhbGlkYXRlKG5vZGUsIG5vdFNjaGVtYSwgc3ViVmFsaWRhdGlvblJlc3VsdCwgc3ViTWF0Y2hpbmdTY2hlbWFzKTsKICAgICAgICAgIGlmICghc3ViVmFsaWRhdGlvblJlc3VsdC5oYXNQcm9ibGVtcygpKSB7CiAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgICAgbG9jYXRpb246IHsgb2Zmc2V0OiBub2RlLm9mZnNldCwgbGVuZ3RoOiBub2RlLmxlbmd0aCB9LAogICAgICAgICAgICAgIG1lc3NhZ2U6IGxvY2FsaXplMigibm90U2NoZW1hV2FybmluZyIsICJNYXRjaGVzIGEgc2NoZW1hIHRoYXQgaXMgbm90IGFsbG93ZWQuIikKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHZhciBfYiA9IDAsIF9jID0gc3ViTWF0Y2hpbmdTY2hlbWFzLnNjaGVtYXM7IF9iIDwgX2MubGVuZ3RoOyBfYisrKSB7CiAgICAgICAgICAgIHZhciBtcyA9IF9jW19iXTsKICAgICAgICAgICAgbXMuaW52ZXJ0ZWQgPSAhbXMuaW52ZXJ0ZWQ7CiAgICAgICAgICAgIG1hdGNoaW5nU2NoZW1hcy5hZGQobXMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgdGVzdEFsdGVybmF0aXZlcyA9IGZ1bmN0aW9uKGFsdGVybmF0aXZlcywgbWF4T25lTWF0Y2gpIHsKICAgICAgICAgIHZhciBtYXRjaGVzID0gW107CiAgICAgICAgICB2YXIgYmVzdE1hdGNoID0gdm9pZCAwOwogICAgICAgICAgZm9yICh2YXIgX2kyID0gMCwgYWx0ZXJuYXRpdmVzXzEgPSBhbHRlcm5hdGl2ZXM7IF9pMiA8IGFsdGVybmF0aXZlc18xLmxlbmd0aDsgX2kyKyspIHsKICAgICAgICAgICAgdmFyIHN1YlNjaGVtYVJlZjIgPSBhbHRlcm5hdGl2ZXNfMVtfaTJdOwogICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gYXNTY2hlbWEoc3ViU2NoZW1hUmVmMik7CiAgICAgICAgICAgIHZhciBzdWJWYWxpZGF0aW9uUmVzdWx0MiA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7CiAgICAgICAgICAgIHZhciBzdWJNYXRjaGluZ1NjaGVtYXMyID0gbWF0Y2hpbmdTY2hlbWFzLm5ld1N1YigpOwogICAgICAgICAgICB2YWxpZGF0ZShub2RlLCBzdWJTY2hlbWEsIHN1YlZhbGlkYXRpb25SZXN1bHQyLCBzdWJNYXRjaGluZ1NjaGVtYXMyKTsKICAgICAgICAgICAgaWYgKCFzdWJWYWxpZGF0aW9uUmVzdWx0Mi5oYXNQcm9ibGVtcygpKSB7CiAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKHN1YlNjaGVtYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFiZXN0TWF0Y2gpIHsKICAgICAgICAgICAgICBiZXN0TWF0Y2ggPSB7IHNjaGVtYTogc3ViU2NoZW1hLCB2YWxpZGF0aW9uUmVzdWx0OiBzdWJWYWxpZGF0aW9uUmVzdWx0MiwgbWF0Y2hpbmdTY2hlbWFzOiBzdWJNYXRjaGluZ1NjaGVtYXMyIH07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKCFtYXhPbmVNYXRjaCAmJiAhc3ViVmFsaWRhdGlvblJlc3VsdDIuaGFzUHJvYmxlbXMoKSAmJiAhYmVzdE1hdGNoLnZhbGlkYXRpb25SZXN1bHQuaGFzUHJvYmxlbXMoKSkgewogICAgICAgICAgICAgICAgYmVzdE1hdGNoLm1hdGNoaW5nU2NoZW1hcy5tZXJnZShzdWJNYXRjaGluZ1NjaGVtYXMyKTsKICAgICAgICAgICAgICAgIGJlc3RNYXRjaC52YWxpZGF0aW9uUmVzdWx0LnByb3BlcnRpZXNNYXRjaGVzICs9IHN1YlZhbGlkYXRpb25SZXN1bHQyLnByb3BlcnRpZXNNYXRjaGVzOwogICAgICAgICAgICAgICAgYmVzdE1hdGNoLnZhbGlkYXRpb25SZXN1bHQucHJvcGVydGllc1ZhbHVlTWF0Y2hlcyArPSBzdWJWYWxpZGF0aW9uUmVzdWx0Mi5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgY29tcGFyZVJlc3VsdCA9IHN1YlZhbGlkYXRpb25SZXN1bHQyLmNvbXBhcmUoYmVzdE1hdGNoLnZhbGlkYXRpb25SZXN1bHQpOwogICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVSZXN1bHQgPiAwKSB7CiAgICAgICAgICAgICAgICAgIGJlc3RNYXRjaCA9IHsgc2NoZW1hOiBzdWJTY2hlbWEsIHZhbGlkYXRpb25SZXN1bHQ6IHN1YlZhbGlkYXRpb25SZXN1bHQyLCBtYXRjaGluZ1NjaGVtYXM6IHN1Yk1hdGNoaW5nU2NoZW1hczIgfTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcGFyZVJlc3VsdCA9PT0gMCkgewogICAgICAgICAgICAgICAgICBiZXN0TWF0Y2gubWF0Y2hpbmdTY2hlbWFzLm1lcmdlKHN1Yk1hdGNoaW5nU2NoZW1hczIpOwogICAgICAgICAgICAgICAgICBiZXN0TWF0Y2gudmFsaWRhdGlvblJlc3VsdC5tZXJnZUVudW1WYWx1ZXMoc3ViVmFsaWRhdGlvblJlc3VsdDIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID4gMSAmJiBtYXhPbmVNYXRjaCkgewogICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnByb2JsZW1zLnB1c2goewogICAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZS5vZmZzZXQsIGxlbmd0aDogMSB9LAogICAgICAgICAgICAgIG1lc3NhZ2U6IGxvY2FsaXplMigib25lT2ZXYXJuaW5nIiwgIk1hdGNoZXMgbXVsdGlwbGUgc2NoZW1hcyB3aGVuIG9ubHkgb25lIG11c3QgdmFsaWRhdGUuIikKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoYmVzdE1hdGNoKSB7CiAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQubWVyZ2UoYmVzdE1hdGNoLnZhbGlkYXRpb25SZXN1bHQpOwogICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnByb3BlcnRpZXNNYXRjaGVzICs9IGJlc3RNYXRjaC52YWxpZGF0aW9uUmVzdWx0LnByb3BlcnRpZXNNYXRjaGVzOwogICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMgKz0gYmVzdE1hdGNoLnZhbGlkYXRpb25SZXN1bHQucHJvcGVydGllc1ZhbHVlTWF0Y2hlczsKICAgICAgICAgICAgbWF0Y2hpbmdTY2hlbWFzLm1lcmdlKGJlc3RNYXRjaC5tYXRjaGluZ1NjaGVtYXMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG1hdGNoZXMubGVuZ3RoOwogICAgICAgIH07CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSkgewogICAgICAgICAgdGVzdEFsdGVybmF0aXZlcyhzY2hlbWEuYW55T2YsIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLm9uZU9mKSkgewogICAgICAgICAgdGVzdEFsdGVybmF0aXZlcyhzY2hlbWEub25lT2YsIHRydWUpOwogICAgICAgIH0KICAgICAgICB2YXIgdGVzdEJyYW5jaCA9IGZ1bmN0aW9uKHNjaGVtYTIpIHsKICAgICAgICAgIHZhciBzdWJWYWxpZGF0aW9uUmVzdWx0MiA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7CiAgICAgICAgICB2YXIgc3ViTWF0Y2hpbmdTY2hlbWFzMiA9IG1hdGNoaW5nU2NoZW1hcy5uZXdTdWIoKTsKICAgICAgICAgIHZhbGlkYXRlKG5vZGUsIGFzU2NoZW1hKHNjaGVtYTIpLCBzdWJWYWxpZGF0aW9uUmVzdWx0Miwgc3ViTWF0Y2hpbmdTY2hlbWFzMik7CiAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Lm1lcmdlKHN1YlZhbGlkYXRpb25SZXN1bHQyKTsKICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQucHJvcGVydGllc01hdGNoZXMgKz0gc3ViVmFsaWRhdGlvblJlc3VsdDIucHJvcGVydGllc01hdGNoZXM7CiAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMgKz0gc3ViVmFsaWRhdGlvblJlc3VsdDIucHJvcGVydGllc1ZhbHVlTWF0Y2hlczsKICAgICAgICAgIG1hdGNoaW5nU2NoZW1hcy5tZXJnZShzdWJNYXRjaGluZ1NjaGVtYXMyKTsKICAgICAgICB9OwogICAgICAgIHZhciB0ZXN0Q29uZGl0aW9uID0gZnVuY3Rpb24oaWZTY2hlbWEyLCB0aGVuU2NoZW1hLCBlbHNlU2NoZW1hKSB7CiAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gYXNTY2hlbWEoaWZTY2hlbWEyKTsKICAgICAgICAgIHZhciBzdWJWYWxpZGF0aW9uUmVzdWx0MiA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7CiAgICAgICAgICB2YXIgc3ViTWF0Y2hpbmdTY2hlbWFzMiA9IG1hdGNoaW5nU2NoZW1hcy5uZXdTdWIoKTsKICAgICAgICAgIHZhbGlkYXRlKG5vZGUsIHN1YlNjaGVtYSwgc3ViVmFsaWRhdGlvblJlc3VsdDIsIHN1Yk1hdGNoaW5nU2NoZW1hczIpOwogICAgICAgICAgbWF0Y2hpbmdTY2hlbWFzLm1lcmdlKHN1Yk1hdGNoaW5nU2NoZW1hczIpOwogICAgICAgICAgaWYgKCFzdWJWYWxpZGF0aW9uUmVzdWx0Mi5oYXNQcm9ibGVtcygpKSB7CiAgICAgICAgICAgIGlmICh0aGVuU2NoZW1hKSB7CiAgICAgICAgICAgICAgdGVzdEJyYW5jaCh0aGVuU2NoZW1hKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChlbHNlU2NoZW1hKSB7CiAgICAgICAgICAgIHRlc3RCcmFuY2goZWxzZVNjaGVtYSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgaWZTY2hlbWEgPSBhc1NjaGVtYShzY2hlbWEuaWYpOwogICAgICAgIGlmIChpZlNjaGVtYSkgewogICAgICAgICAgdGVzdENvbmRpdGlvbihpZlNjaGVtYSwgYXNTY2hlbWEoc2NoZW1hLnRoZW4pLCBhc1NjaGVtYShzY2hlbWEuZWxzZSkpOwogICAgICAgIH0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuZW51bSkpIHsKICAgICAgICAgIHZhciB2YWwgPSBnZXROb2RlVmFsdWUzKG5vZGUpOwogICAgICAgICAgdmFyIGVudW1WYWx1ZU1hdGNoID0gZmFsc2U7CiAgICAgICAgICBmb3IgKHZhciBfZCA9IDAsIF9lID0gc2NoZW1hLmVudW07IF9kIDwgX2UubGVuZ3RoOyBfZCsrKSB7CiAgICAgICAgICAgIHZhciBlID0gX2VbX2RdOwogICAgICAgICAgICBpZiAoZXF1YWxzKHZhbCwgZSkpIHsKICAgICAgICAgICAgICBlbnVtVmFsdWVNYXRjaCA9IHRydWU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQuZW51bVZhbHVlcyA9IHNjaGVtYS5lbnVtOwogICAgICAgICAgdmFsaWRhdGlvblJlc3VsdC5lbnVtVmFsdWVNYXRjaCA9IGVudW1WYWx1ZU1hdGNoOwogICAgICAgICAgaWYgKCFlbnVtVmFsdWVNYXRjaCkgewogICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnByb2JsZW1zLnB1c2goewogICAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZS5vZmZzZXQsIGxlbmd0aDogbm9kZS5sZW5ndGggfSwKICAgICAgICAgICAgICBjb2RlOiBFcnJvckNvZGUuRW51bVZhbHVlTWlzbWF0Y2gsCiAgICAgICAgICAgICAgbWVzc2FnZTogc2NoZW1hLmVycm9yTWVzc2FnZSB8fCBsb2NhbGl6ZTIoImVudW1XYXJuaW5nIiwgIlZhbHVlIGlzIG5vdCBhY2NlcHRlZC4gVmFsaWQgdmFsdWVzOiB7MH0uIiwgc2NoZW1hLmVudW0ubWFwKGZ1bmN0aW9uKHYpIHsKICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2KTsKICAgICAgICAgICAgICB9KS5qb2luKCIsICIpKQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzRGVmaW5lZChzY2hlbWEuY29uc3QpKSB7CiAgICAgICAgICB2YXIgdmFsID0gZ2V0Tm9kZVZhbHVlMyhub2RlKTsKICAgICAgICAgIGlmICghZXF1YWxzKHZhbCwgc2NoZW1hLmNvbnN0KSkgewogICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnByb2JsZW1zLnB1c2goewogICAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZS5vZmZzZXQsIGxlbmd0aDogbm9kZS5sZW5ndGggfSwKICAgICAgICAgICAgICBjb2RlOiBFcnJvckNvZGUuRW51bVZhbHVlTWlzbWF0Y2gsCiAgICAgICAgICAgICAgbWVzc2FnZTogc2NoZW1hLmVycm9yTWVzc2FnZSB8fCBsb2NhbGl6ZTIoImNvbnN0V2FybmluZyIsICJWYWx1ZSBtdXN0IGJlIHswfS4iLCBKU09OLnN0cmluZ2lmeShzY2hlbWEuY29uc3QpKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdC5lbnVtVmFsdWVNYXRjaCA9IGZhbHNlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdC5lbnVtVmFsdWVNYXRjaCA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LmVudW1WYWx1ZXMgPSBbc2NoZW1hLmNvbnN0XTsKICAgICAgICB9CiAgICAgICAgaWYgKHNjaGVtYS5kZXByZWNhdGlvbk1lc3NhZ2UgJiYgbm9kZS5wYXJlbnQpIHsKICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZS5wYXJlbnQub2Zmc2V0LCBsZW5ndGg6IG5vZGUucGFyZW50Lmxlbmd0aCB9LAogICAgICAgICAgICBzZXZlcml0eTogRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmcsCiAgICAgICAgICAgIG1lc3NhZ2U6IHNjaGVtYS5kZXByZWNhdGlvbk1lc3NhZ2UsCiAgICAgICAgICAgIGNvZGU6IEVycm9yQ29kZS5EZXByZWNhdGVkCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gX3ZhbGlkYXRlTnVtYmVyTm9kZShub2RlMiwgc2NoZW1hMiwgdmFsaWRhdGlvblJlc3VsdDIsIG1hdGNoaW5nU2NoZW1hczIpIHsKICAgICAgICB2YXIgdmFsID0gbm9kZTIudmFsdWU7CiAgICAgICAgZnVuY3Rpb24gbm9ybWFsaXplRmxvYXRzKGZsb2F0KSB7CiAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICB2YXIgcGFydHMgPSAvXigtP1xkKykoPzpcLihcZCspKT8oPzplKFstK11cZCspKT8kLy5leGVjKGZsb2F0LnRvU3RyaW5nKCkpOwogICAgICAgICAgcmV0dXJuIHBhcnRzICYmIHsKICAgICAgICAgICAgdmFsdWU6IE51bWJlcihwYXJ0c1sxXSArIChwYXJ0c1syXSB8fCAiIikpLAogICAgICAgICAgICBtdWx0aXBsaWVyOiAoKChfYSA9IHBhcnRzWzJdKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSB8fCAwKSAtIChwYXJzZUludChwYXJ0c1szXSkgfHwgMCkKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGlmIChpc051bWJlcihzY2hlbWEyLm11bHRpcGxlT2YpKSB7CiAgICAgICAgICB2YXIgcmVtYWluZGVyID0gLTE7CiAgICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcihzY2hlbWEyLm11bHRpcGxlT2YpKSB7CiAgICAgICAgICAgIHJlbWFpbmRlciA9IHZhbCAlIHNjaGVtYTIubXVsdGlwbGVPZjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBub3JtTXVsdGlwbGVPZiA9IG5vcm1hbGl6ZUZsb2F0cyhzY2hlbWEyLm11bHRpcGxlT2YpOwogICAgICAgICAgICB2YXIgbm9ybVZhbHVlID0gbm9ybWFsaXplRmxvYXRzKHZhbCk7CiAgICAgICAgICAgIGlmIChub3JtTXVsdGlwbGVPZiAmJiBub3JtVmFsdWUpIHsKICAgICAgICAgICAgICB2YXIgbXVsdGlwbGllciA9IE1hdGgucG93KDEwLCBNYXRoLmFicyhub3JtVmFsdWUubXVsdGlwbGllciAtIG5vcm1NdWx0aXBsZU9mLm11bHRpcGxpZXIpKTsKICAgICAgICAgICAgICBpZiAobm9ybVZhbHVlLm11bHRpcGxpZXIgPCBub3JtTXVsdGlwbGVPZi5tdWx0aXBsaWVyKSB7CiAgICAgICAgICAgICAgICBub3JtVmFsdWUudmFsdWUgKj0gbXVsdGlwbGllcjsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9ybU11bHRpcGxlT2YudmFsdWUgKj0gbXVsdGlwbGllcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmVtYWluZGVyID0gbm9ybVZhbHVlLnZhbHVlICUgbm9ybU11bHRpcGxlT2YudmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZW1haW5kZXIgIT09IDApIHsKICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgICAgbG9jYXRpb246IHsgb2Zmc2V0OiBub2RlMi5vZmZzZXQsIGxlbmd0aDogbm9kZTIubGVuZ3RoIH0sCiAgICAgICAgICAgICAgbWVzc2FnZTogbG9jYWxpemUyKCJtdWx0aXBsZU9mV2FybmluZyIsICJWYWx1ZSBpcyBub3QgZGl2aXNpYmxlIGJ5IHswfS4iLCBzY2hlbWEyLm11bHRpcGxlT2YpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZXRFeGNsdXNpdmVMaW1pdChsaW1pdCwgZXhjbHVzaXZlKSB7CiAgICAgICAgICBpZiAoaXNOdW1iZXIoZXhjbHVzaXZlKSkgewogICAgICAgICAgICByZXR1cm4gZXhjbHVzaXZlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzQm9vbGVhbihleGNsdXNpdmUpICYmIGV4Y2x1c2l2ZSkgewogICAgICAgICAgICByZXR1cm4gbGltaXQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBnZXRMaW1pdChsaW1pdCwgZXhjbHVzaXZlKSB7CiAgICAgICAgICBpZiAoIWlzQm9vbGVhbihleGNsdXNpdmUpIHx8ICFleGNsdXNpdmUpIHsKICAgICAgICAgICAgcmV0dXJuIGxpbWl0OwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgdmFyIGV4Y2x1c2l2ZU1pbmltdW0gPSBnZXRFeGNsdXNpdmVMaW1pdChzY2hlbWEyLm1pbmltdW0sIHNjaGVtYTIuZXhjbHVzaXZlTWluaW11bSk7CiAgICAgICAgaWYgKGlzTnVtYmVyKGV4Y2x1c2l2ZU1pbmltdW0pICYmIHZhbCA8PSBleGNsdXNpdmVNaW5pbXVtKSB7CiAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5wcm9ibGVtcy5wdXNoKHsKICAgICAgICAgICAgbG9jYXRpb246IHsgb2Zmc2V0OiBub2RlMi5vZmZzZXQsIGxlbmd0aDogbm9kZTIubGVuZ3RoIH0sCiAgICAgICAgICAgIG1lc3NhZ2U6IGxvY2FsaXplMigiZXhjbHVzaXZlTWluaW11bVdhcm5pbmciLCAiVmFsdWUgaXMgYmVsb3cgdGhlIGV4Y2x1c2l2ZSBtaW5pbXVtIG9mIHswfS4iLCBleGNsdXNpdmVNaW5pbXVtKQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHZhciBleGNsdXNpdmVNYXhpbXVtID0gZ2V0RXhjbHVzaXZlTGltaXQoc2NoZW1hMi5tYXhpbXVtLCBzY2hlbWEyLmV4Y2x1c2l2ZU1heGltdW0pOwogICAgICAgIGlmIChpc051bWJlcihleGNsdXNpdmVNYXhpbXVtKSAmJiB2YWwgPj0gZXhjbHVzaXZlTWF4aW11bSkgewogICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZTIub2Zmc2V0LCBsZW5ndGg6IG5vZGUyLmxlbmd0aCB9LAogICAgICAgICAgICBtZXNzYWdlOiBsb2NhbGl6ZTIoImV4Y2x1c2l2ZU1heGltdW1XYXJuaW5nIiwgIlZhbHVlIGlzIGFib3ZlIHRoZSBleGNsdXNpdmUgbWF4aW11bSBvZiB7MH0uIiwgZXhjbHVzaXZlTWF4aW11bSkKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICB2YXIgbWluaW11bSA9IGdldExpbWl0KHNjaGVtYTIubWluaW11bSwgc2NoZW1hMi5leGNsdXNpdmVNaW5pbXVtKTsKICAgICAgICBpZiAoaXNOdW1iZXIobWluaW11bSkgJiYgdmFsIDwgbWluaW11bSkgewogICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZTIub2Zmc2V0LCBsZW5ndGg6IG5vZGUyLmxlbmd0aCB9LAogICAgICAgICAgICBtZXNzYWdlOiBsb2NhbGl6ZTIoIm1pbmltdW1XYXJuaW5nIiwgIlZhbHVlIGlzIGJlbG93IHRoZSBtaW5pbXVtIG9mIHswfS4iLCBtaW5pbXVtKQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHZhciBtYXhpbXVtID0gZ2V0TGltaXQoc2NoZW1hMi5tYXhpbXVtLCBzY2hlbWEyLmV4Y2x1c2l2ZU1heGltdW0pOwogICAgICAgIGlmIChpc051bWJlcihtYXhpbXVtKSAmJiB2YWwgPiBtYXhpbXVtKSB7CiAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5wcm9ibGVtcy5wdXNoKHsKICAgICAgICAgICAgbG9jYXRpb246IHsgb2Zmc2V0OiBub2RlMi5vZmZzZXQsIGxlbmd0aDogbm9kZTIubGVuZ3RoIH0sCiAgICAgICAgICAgIG1lc3NhZ2U6IGxvY2FsaXplMigibWF4aW11bVdhcm5pbmciLCAiVmFsdWUgaXMgYWJvdmUgdGhlIG1heGltdW0gb2YgezB9LiIsIG1heGltdW0pCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gX3ZhbGlkYXRlU3RyaW5nTm9kZShub2RlMiwgc2NoZW1hMiwgdmFsaWRhdGlvblJlc3VsdDIsIG1hdGNoaW5nU2NoZW1hczIpIHsKICAgICAgICBpZiAoaXNOdW1iZXIoc2NoZW1hMi5taW5MZW5ndGgpICYmIG5vZGUyLnZhbHVlLmxlbmd0aCA8IHNjaGVtYTIubWluTGVuZ3RoKSB7CiAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5wcm9ibGVtcy5wdXNoKHsKICAgICAgICAgICAgbG9jYXRpb246IHsgb2Zmc2V0OiBub2RlMi5vZmZzZXQsIGxlbmd0aDogbm9kZTIubGVuZ3RoIH0sCiAgICAgICAgICAgIG1lc3NhZ2U6IGxvY2FsaXplMigibWluTGVuZ3RoV2FybmluZyIsICJTdHJpbmcgaXMgc2hvcnRlciB0aGFuIHRoZSBtaW5pbXVtIGxlbmd0aCBvZiB7MH0uIiwgc2NoZW1hMi5taW5MZW5ndGgpCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzTnVtYmVyKHNjaGVtYTIubWF4TGVuZ3RoKSAmJiBub2RlMi52YWx1ZS5sZW5ndGggPiBzY2hlbWEyLm1heExlbmd0aCkgewogICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZTIub2Zmc2V0LCBsZW5ndGg6IG5vZGUyLmxlbmd0aCB9LAogICAgICAgICAgICBtZXNzYWdlOiBsb2NhbGl6ZTIoIm1heExlbmd0aFdhcm5pbmciLCAiU3RyaW5nIGlzIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB7MH0uIiwgc2NoZW1hMi5tYXhMZW5ndGgpCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzU3RyaW5nKHNjaGVtYTIucGF0dGVybikpIHsKICAgICAgICAgIHZhciByZWdleCA9IGV4dGVuZGVkUmVnRXhwKHNjaGVtYTIucGF0dGVybik7CiAgICAgICAgICBpZiAoIShyZWdleCA9PT0gbnVsbCB8fCByZWdleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVnZXgudGVzdChub2RlMi52YWx1ZSkpKSB7CiAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQyLnByb2JsZW1zLnB1c2goewogICAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZTIub2Zmc2V0LCBsZW5ndGg6IG5vZGUyLmxlbmd0aCB9LAogICAgICAgICAgICAgIG1lc3NhZ2U6IHNjaGVtYTIucGF0dGVybkVycm9yTWVzc2FnZSB8fCBzY2hlbWEyLmVycm9yTWVzc2FnZSB8fCBsb2NhbGl6ZTIoInBhdHRlcm5XYXJuaW5nIiwgJ1N0cmluZyBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVybiBvZiAiezB9Ii4nLCBzY2hlbWEyLnBhdHRlcm4pCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc2NoZW1hMi5mb3JtYXQpIHsKICAgICAgICAgIHN3aXRjaCAoc2NoZW1hMi5mb3JtYXQpIHsKICAgICAgICAgICAgY2FzZSAidXJpIjoKICAgICAgICAgICAgY2FzZSAidXJpLXJlZmVyZW5jZSI6CiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdmFyIGVycm9yTWVzc2FnZSA9IHZvaWQgMDsKICAgICAgICAgICAgICAgIGlmICghbm9kZTIudmFsdWUpIHsKICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gbG9jYWxpemUyKCJ1cmlFbXB0eSIsICJVUkkgZXhwZWN0ZWQuIik7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSAvXigoW146Lz8jXSs/KTopPyhcL1wvKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/Ly5leGVjKG5vZGUyLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGxvY2FsaXplMigidXJpTWlzc2luZyIsICJVUkkgaXMgZXhwZWN0ZWQuIik7CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1hdGNoWzJdICYmIHNjaGVtYTIuZm9ybWF0ID09PSAidXJpIikgewogICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGxvY2FsaXplMigidXJpU2NoZW1lTWlzc2luZyIsICJVUkkgd2l0aCBhIHNjaGVtZSBpcyBleHBlY3RlZC4iKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSkgewogICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5wcm9ibGVtcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogeyBvZmZzZXQ6IG5vZGUyLm9mZnNldCwgbGVuZ3RoOiBub2RlMi5sZW5ndGggfSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBzY2hlbWEyLnBhdHRlcm5FcnJvck1lc3NhZ2UgfHwgc2NoZW1hMi5lcnJvck1lc3NhZ2UgfHwgbG9jYWxpemUyKCJ1cmlGb3JtYXRXYXJuaW5nIiwgIlN0cmluZyBpcyBub3QgYSBVUkk6IHswfSIsIGVycm9yTWVzc2FnZSkKICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJjb2xvci1oZXgiOgogICAgICAgICAgICBjYXNlICJkYXRlLXRpbWUiOgogICAgICAgICAgICBjYXNlICJkYXRlIjoKICAgICAgICAgICAgY2FzZSAidGltZSI6CiAgICAgICAgICAgIGNhc2UgImVtYWlsIjoKICAgICAgICAgICAgICB2YXIgZm9ybWF0NCA9IGZvcm1hdHNbc2NoZW1hMi5mb3JtYXRdOwogICAgICAgICAgICAgIGlmICghbm9kZTIudmFsdWUgfHwgIWZvcm1hdDQucGF0dGVybi5leGVjKG5vZGUyLnZhbHVlKSkgewogICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZTIub2Zmc2V0LCBsZW5ndGg6IG5vZGUyLmxlbmd0aCB9LAogICAgICAgICAgICAgICAgICBtZXNzYWdlOiBzY2hlbWEyLnBhdHRlcm5FcnJvck1lc3NhZ2UgfHwgc2NoZW1hMi5lcnJvck1lc3NhZ2UgfHwgZm9ybWF0NC5lcnJvck1lc3NhZ2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gX3ZhbGlkYXRlQXJyYXlOb2RlKG5vZGUyLCBzY2hlbWEyLCB2YWxpZGF0aW9uUmVzdWx0MiwgbWF0Y2hpbmdTY2hlbWFzMikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYTIuaXRlbXMpKSB7CiAgICAgICAgICB2YXIgc3ViU2NoZW1hcyA9IHNjaGVtYTIuaXRlbXM7CiAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc3ViU2NoZW1hcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgdmFyIHN1YlNjaGVtYVJlZiA9IHN1YlNjaGVtYXNbaW5kZXhdOwogICAgICAgICAgICB2YXIgc3ViU2NoZW1hID0gYXNTY2hlbWEoc3ViU2NoZW1hUmVmKTsKICAgICAgICAgICAgdmFyIGl0ZW1WYWxpZGF0aW9uUmVzdWx0ID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKICAgICAgICAgICAgdmFyIGl0ZW0gPSBub2RlMi5pdGVtc1tpbmRleF07CiAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgdmFsaWRhdGUoaXRlbSwgc3ViU2NoZW1hLCBpdGVtVmFsaWRhdGlvblJlc3VsdCwgbWF0Y2hpbmdTY2hlbWFzMik7CiAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIubWVyZ2VQcm9wZXJ0eU1hdGNoKGl0ZW1WYWxpZGF0aW9uUmVzdWx0KTsKICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlMi5pdGVtcy5sZW5ndGggPj0gc3ViU2NoZW1hcy5sZW5ndGgpIHsKICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzKys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChub2RlMi5pdGVtcy5sZW5ndGggPiBzdWJTY2hlbWFzLmxlbmd0aCkgewogICAgICAgICAgICBpZiAodHlwZW9mIHNjaGVtYTIuYWRkaXRpb25hbEl0ZW1zID09PSAib2JqZWN0IikgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSBzdWJTY2hlbWFzLmxlbmd0aDsgaSA8IG5vZGUyLml0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgaXRlbVZhbGlkYXRpb25SZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwogICAgICAgICAgICAgICAgdmFsaWRhdGUobm9kZTIuaXRlbXNbaV0sIHNjaGVtYTIuYWRkaXRpb25hbEl0ZW1zLCBpdGVtVmFsaWRhdGlvblJlc3VsdCwgbWF0Y2hpbmdTY2hlbWFzMik7CiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5tZXJnZVByb3BlcnR5TWF0Y2goaXRlbVZhbGlkYXRpb25SZXN1bHQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWEyLmFkZGl0aW9uYWxJdGVtcyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5wcm9ibGVtcy5wdXNoKHsKICAgICAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZTIub2Zmc2V0LCBsZW5ndGg6IG5vZGUyLmxlbmd0aCB9LAogICAgICAgICAgICAgICAgbWVzc2FnZTogbG9jYWxpemUyKCJhZGRpdGlvbmFsSXRlbXNXYXJuaW5nIiwgIkFycmF5IGhhcyB0b28gbWFueSBpdGVtcyBhY2NvcmRpbmcgdG8gc2NoZW1hLiBFeHBlY3RlZCB7MH0gb3IgZmV3ZXIuIiwgc3ViU2NoZW1hcy5sZW5ndGgpCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGl0ZW1TY2hlbWEgPSBhc1NjaGVtYShzY2hlbWEyLml0ZW1zKTsKICAgICAgICAgIGlmIChpdGVtU2NoZW1hKSB7CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBub2RlMi5pdGVtczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICB2YXIgaXRlbSA9IF9hW19pXTsKICAgICAgICAgICAgICB2YXIgaXRlbVZhbGlkYXRpb25SZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwogICAgICAgICAgICAgIHZhbGlkYXRlKGl0ZW0sIGl0ZW1TY2hlbWEsIGl0ZW1WYWxpZGF0aW9uUmVzdWx0LCBtYXRjaGluZ1NjaGVtYXMyKTsKICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5tZXJnZVByb3BlcnR5TWF0Y2goaXRlbVZhbGlkYXRpb25SZXN1bHQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBjb250YWluc1NjaGVtYSA9IGFzU2NoZW1hKHNjaGVtYTIuY29udGFpbnMpOwogICAgICAgIGlmIChjb250YWluc1NjaGVtYSkgewogICAgICAgICAgdmFyIGRvZXNDb250YWluID0gbm9kZTIuaXRlbXMuc29tZShmdW5jdGlvbihpdGVtMikgewogICAgICAgICAgICB2YXIgaXRlbVZhbGlkYXRpb25SZXN1bHQyID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKICAgICAgICAgICAgdmFsaWRhdGUoaXRlbTIsIGNvbnRhaW5zU2NoZW1hLCBpdGVtVmFsaWRhdGlvblJlc3VsdDIsIE5vT3BTY2hlbWFDb2xsZWN0b3IuaW5zdGFuY2UpOwogICAgICAgICAgICByZXR1cm4gIWl0ZW1WYWxpZGF0aW9uUmVzdWx0Mi5oYXNQcm9ibGVtcygpOwogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoIWRvZXNDb250YWluKSB7CiAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQyLnByb2JsZW1zLnB1c2goewogICAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZTIub2Zmc2V0LCBsZW5ndGg6IG5vZGUyLmxlbmd0aCB9LAogICAgICAgICAgICAgIG1lc3NhZ2U6IHNjaGVtYTIuZXJyb3JNZXNzYWdlIHx8IGxvY2FsaXplMigicmVxdWlyZWRJdGVtTWlzc2luZ1dhcm5pbmciLCAiQXJyYXkgZG9lcyBub3QgY29udGFpbiByZXF1aXJlZCBpdGVtLiIpCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaXNOdW1iZXIoc2NoZW1hMi5taW5JdGVtcykgJiYgbm9kZTIuaXRlbXMubGVuZ3RoIDwgc2NoZW1hMi5taW5JdGVtcykgewogICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZTIub2Zmc2V0LCBsZW5ndGg6IG5vZGUyLmxlbmd0aCB9LAogICAgICAgICAgICBtZXNzYWdlOiBsb2NhbGl6ZTIoIm1pbkl0ZW1zV2FybmluZyIsICJBcnJheSBoYXMgdG9vIGZldyBpdGVtcy4gRXhwZWN0ZWQgezB9IG9yIG1vcmUuIiwgc2NoZW1hMi5taW5JdGVtcykKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoaXNOdW1iZXIoc2NoZW1hMi5tYXhJdGVtcykgJiYgbm9kZTIuaXRlbXMubGVuZ3RoID4gc2NoZW1hMi5tYXhJdGVtcykgewogICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZTIub2Zmc2V0LCBsZW5ndGg6IG5vZGUyLmxlbmd0aCB9LAogICAgICAgICAgICBtZXNzYWdlOiBsb2NhbGl6ZTIoIm1heEl0ZW1zV2FybmluZyIsICJBcnJheSBoYXMgdG9vIG1hbnkgaXRlbXMuIEV4cGVjdGVkIHswfSBvciBmZXdlci4iLCBzY2hlbWEyLm1heEl0ZW1zKQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGlmIChzY2hlbWEyLnVuaXF1ZUl0ZW1zID09PSB0cnVlKSB7CiAgICAgICAgICB2YXIgdmFsdWVzXzEgPSBnZXROb2RlVmFsdWUzKG5vZGUyKTsKICAgICAgICAgIHZhciBkdXBsaWNhdGVzID0gdmFsdWVzXzEuc29tZShmdW5jdGlvbih2YWx1ZSwgaW5kZXgyKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRleDIgIT09IHZhbHVlc18xLmxhc3RJbmRleE9mKHZhbHVlKTsKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKGR1cGxpY2F0ZXMpIHsKICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgICAgbG9jYXRpb246IHsgb2Zmc2V0OiBub2RlMi5vZmZzZXQsIGxlbmd0aDogbm9kZTIubGVuZ3RoIH0sCiAgICAgICAgICAgICAgbWVzc2FnZTogbG9jYWxpemUyKCJ1bmlxdWVJdGVtc1dhcm5pbmciLCAiQXJyYXkgaGFzIGR1cGxpY2F0ZSBpdGVtcy4iKQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gX3ZhbGlkYXRlT2JqZWN0Tm9kZShub2RlMiwgc2NoZW1hMiwgdmFsaWRhdGlvblJlc3VsdDIsIG1hdGNoaW5nU2NoZW1hczIpIHsKICAgICAgICB2YXIgc2VlbktleXMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIHZhciB1bnByb2Nlc3NlZFByb3BlcnRpZXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gbm9kZTIucHJvcGVydGllczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgIHZhciBwcm9wZXJ0eU5vZGUgPSBfYVtfaV07CiAgICAgICAgICB2YXIga2V5ID0gcHJvcGVydHlOb2RlLmtleU5vZGUudmFsdWU7CiAgICAgICAgICBzZWVuS2V5c1trZXldID0gcHJvcGVydHlOb2RlLnZhbHVlTm9kZTsKICAgICAgICAgIHVucHJvY2Vzc2VkUHJvcGVydGllcy5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYTIucmVxdWlyZWQpKSB7CiAgICAgICAgICBmb3IgKHZhciBfYiA9IDAsIF9jID0gc2NoZW1hMi5yZXF1aXJlZDsgX2IgPCBfYy5sZW5ndGg7IF9iKyspIHsKICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZSA9IF9jW19iXTsKICAgICAgICAgICAgaWYgKCFzZWVuS2V5c1twcm9wZXJ0eU5hbWVdKSB7CiAgICAgICAgICAgICAgdmFyIGtleU5vZGUgPSBub2RlMi5wYXJlbnQgJiYgbm9kZTIucGFyZW50LnR5cGUgPT09ICJwcm9wZXJ0eSIgJiYgbm9kZTIucGFyZW50LmtleU5vZGU7CiAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0ga2V5Tm9kZSA/IHsgb2Zmc2V0OiBrZXlOb2RlLm9mZnNldCwgbGVuZ3RoOiBrZXlOb2RlLmxlbmd0aCB9IDogeyBvZmZzZXQ6IG5vZGUyLm9mZnNldCwgbGVuZ3RoOiAxIH07CiAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgICAgICBsb2NhdGlvbiwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvY2FsaXplMigiTWlzc2luZ1JlcXVpcmVkUHJvcFdhcm5pbmciLCAnTWlzc2luZyBwcm9wZXJ0eSAiezB9Ii4nLCBwcm9wZXJ0eU5hbWUpCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHByb3BlcnR5UHJvY2Vzc2VkID0gZnVuY3Rpb24ocHJvcDIpIHsKICAgICAgICAgIHZhciBpbmRleCA9IHVucHJvY2Vzc2VkUHJvcGVydGllcy5pbmRleE9mKHByb3AyKTsKICAgICAgICAgIHdoaWxlIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgIHVucHJvY2Vzc2VkUHJvcGVydGllcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICBpbmRleCA9IHVucHJvY2Vzc2VkUHJvcGVydGllcy5pbmRleE9mKHByb3AyKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGlmIChzY2hlbWEyLnByb3BlcnRpZXMpIHsKICAgICAgICAgIGZvciAodmFyIF9kID0gMCwgX2UgPSBPYmplY3Qua2V5cyhzY2hlbWEyLnByb3BlcnRpZXMpOyBfZCA8IF9lLmxlbmd0aDsgX2QrKykgewogICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gX2VbX2RdOwogICAgICAgICAgICBwcm9wZXJ0eVByb2Nlc3NlZChwcm9wZXJ0eU5hbWUpOwogICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBzY2hlbWEyLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXTsKICAgICAgICAgICAgdmFyIGNoaWxkID0gc2VlbktleXNbcHJvcGVydHlOYW1lXTsKICAgICAgICAgICAgaWYgKGNoaWxkKSB7CiAgICAgICAgICAgICAgaWYgKGlzQm9vbGVhbihwcm9wZXJ0eVNjaGVtYSkpIHsKICAgICAgICAgICAgICAgIGlmICghcHJvcGVydHlTY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5Tm9kZSA9IGNoaWxkLnBhcmVudDsKICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IHsgb2Zmc2V0OiBwcm9wZXJ0eU5vZGUua2V5Tm9kZS5vZmZzZXQsIGxlbmd0aDogcHJvcGVydHlOb2RlLmtleU5vZGUubGVuZ3RoIH0sCiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogc2NoZW1hMi5lcnJvck1lc3NhZ2UgfHwgbG9jYWxpemUyKCJEaXNhbGxvd2VkRXh0cmFQcm9wV2FybmluZyIsICJQcm9wZXJ0eSB7MH0gaXMgbm90IGFsbG93ZWQuIiwgcHJvcGVydHlOYW1lKQogICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQyLnByb3BlcnRpZXNNYXRjaGVzKys7CiAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQyLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5VmFsaWRhdGlvblJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7CiAgICAgICAgICAgICAgICB2YWxpZGF0ZShjaGlsZCwgcHJvcGVydHlTY2hlbWEsIHByb3BlcnR5VmFsaWRhdGlvblJlc3VsdCwgbWF0Y2hpbmdTY2hlbWFzMik7CiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5tZXJnZVByb3BlcnR5TWF0Y2gocHJvcGVydHlWYWxpZGF0aW9uUmVzdWx0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHNjaGVtYTIucGF0dGVyblByb3BlcnRpZXMpIHsKICAgICAgICAgIGZvciAodmFyIF9mID0gMCwgX2cgPSBPYmplY3Qua2V5cyhzY2hlbWEyLnBhdHRlcm5Qcm9wZXJ0aWVzKTsgX2YgPCBfZy5sZW5ndGg7IF9mKyspIHsKICAgICAgICAgICAgdmFyIHByb3BlcnR5UGF0dGVybiA9IF9nW19mXTsKICAgICAgICAgICAgdmFyIHJlZ2V4ID0gZXh0ZW5kZWRSZWdFeHAocHJvcGVydHlQYXR0ZXJuKTsKICAgICAgICAgICAgZm9yICh2YXIgX2ggPSAwLCBfaiA9IHVucHJvY2Vzc2VkUHJvcGVydGllcy5zbGljZSgwKTsgX2ggPCBfai5sZW5ndGg7IF9oKyspIHsKICAgICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gX2pbX2hdOwogICAgICAgICAgICAgIGlmIChyZWdleCA9PT0gbnVsbCB8fCByZWdleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVnZXgudGVzdChwcm9wZXJ0eU5hbWUpKSB7CiAgICAgICAgICAgICAgICBwcm9wZXJ0eVByb2Nlc3NlZChwcm9wZXJ0eU5hbWUpOwogICAgICAgICAgICAgICAgdmFyIGNoaWxkID0gc2VlbktleXNbcHJvcGVydHlOYW1lXTsKICAgICAgICAgICAgICAgIGlmIChjaGlsZCkgewogICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBzY2hlbWEyLnBhdHRlcm5Qcm9wZXJ0aWVzW3Byb3BlcnR5UGF0dGVybl07CiAgICAgICAgICAgICAgICAgIGlmIChpc0Jvb2xlYW4ocHJvcGVydHlTY2hlbWEpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm9wZXJ0eVNjaGVtYSkgewogICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5Tm9kZSA9IGNoaWxkLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQyLnByb2JsZW1zLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogeyBvZmZzZXQ6IHByb3BlcnR5Tm9kZS5rZXlOb2RlLm9mZnNldCwgbGVuZ3RoOiBwcm9wZXJ0eU5vZGUua2V5Tm9kZS5sZW5ndGggfSwKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogc2NoZW1hMi5lcnJvck1lc3NhZ2UgfHwgbG9jYWxpemUyKCJEaXNhbGxvd2VkRXh0cmFQcm9wV2FybmluZyIsICJQcm9wZXJ0eSB7MH0gaXMgbm90IGFsbG93ZWQuIiwgcHJvcGVydHlOYW1lKQogICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQyLnByb3BlcnRpZXNNYXRjaGVzKys7CiAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eVZhbGlkYXRpb25SZXN1bHQgPSBuZXcgVmFsaWRhdGlvblJlc3VsdCgpOwogICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlKGNoaWxkLCBwcm9wZXJ0eVNjaGVtYSwgcHJvcGVydHlWYWxpZGF0aW9uUmVzdWx0LCBtYXRjaGluZ1NjaGVtYXMyKTsKICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5tZXJnZVByb3BlcnR5TWF0Y2gocHJvcGVydHlWYWxpZGF0aW9uUmVzdWx0KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIHNjaGVtYTIuYWRkaXRpb25hbFByb3BlcnRpZXMgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICBmb3IgKHZhciBfayA9IDAsIHVucHJvY2Vzc2VkUHJvcGVydGllc18xID0gdW5wcm9jZXNzZWRQcm9wZXJ0aWVzOyBfayA8IHVucHJvY2Vzc2VkUHJvcGVydGllc18xLmxlbmd0aDsgX2srKykgewogICAgICAgICAgICB2YXIgcHJvcGVydHlOYW1lID0gdW5wcm9jZXNzZWRQcm9wZXJ0aWVzXzFbX2tdOwogICAgICAgICAgICB2YXIgY2hpbGQgPSBzZWVuS2V5c1twcm9wZXJ0eU5hbWVdOwogICAgICAgICAgICBpZiAoY2hpbGQpIHsKICAgICAgICAgICAgICB2YXIgcHJvcGVydHlWYWxpZGF0aW9uUmVzdWx0ID0gbmV3IFZhbGlkYXRpb25SZXN1bHQoKTsKICAgICAgICAgICAgICB2YWxpZGF0ZShjaGlsZCwgc2NoZW1hMi5hZGRpdGlvbmFsUHJvcGVydGllcywgcHJvcGVydHlWYWxpZGF0aW9uUmVzdWx0LCBtYXRjaGluZ1NjaGVtYXMyKTsKICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5tZXJnZVByb3BlcnR5TWF0Y2gocHJvcGVydHlWYWxpZGF0aW9uUmVzdWx0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hMi5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gZmFsc2UpIHsKICAgICAgICAgIGlmICh1bnByb2Nlc3NlZFByb3BlcnRpZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICBmb3IgKHZhciBfbCA9IDAsIHVucHJvY2Vzc2VkUHJvcGVydGllc18yID0gdW5wcm9jZXNzZWRQcm9wZXJ0aWVzOyBfbCA8IHVucHJvY2Vzc2VkUHJvcGVydGllc18yLmxlbmd0aDsgX2wrKykgewogICAgICAgICAgICAgIHZhciBwcm9wZXJ0eU5hbWUgPSB1bnByb2Nlc3NlZFByb3BlcnRpZXNfMltfbF07CiAgICAgICAgICAgICAgdmFyIGNoaWxkID0gc2VlbktleXNbcHJvcGVydHlOYW1lXTsKICAgICAgICAgICAgICBpZiAoY2hpbGQpIHsKICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eU5vZGUgPSBjaGlsZC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5wcm9ibGVtcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgbG9jYXRpb246IHsgb2Zmc2V0OiBwcm9wZXJ0eU5vZGUua2V5Tm9kZS5vZmZzZXQsIGxlbmd0aDogcHJvcGVydHlOb2RlLmtleU5vZGUubGVuZ3RoIH0sCiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHNjaGVtYTIuZXJyb3JNZXNzYWdlIHx8IGxvY2FsaXplMigiRGlzYWxsb3dlZEV4dHJhUHJvcFdhcm5pbmciLCAiUHJvcGVydHkgezB9IGlzIG5vdCBhbGxvd2VkLiIsIHByb3BlcnR5TmFtZSkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaXNOdW1iZXIoc2NoZW1hMi5tYXhQcm9wZXJ0aWVzKSkgewogICAgICAgICAgaWYgKG5vZGUyLnByb3BlcnRpZXMubGVuZ3RoID4gc2NoZW1hMi5tYXhQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQyLnByb2JsZW1zLnB1c2goewogICAgICAgICAgICAgIGxvY2F0aW9uOiB7IG9mZnNldDogbm9kZTIub2Zmc2V0LCBsZW5ndGg6IG5vZGUyLmxlbmd0aCB9LAogICAgICAgICAgICAgIG1lc3NhZ2U6IGxvY2FsaXplMigiTWF4UHJvcFdhcm5pbmciLCAiT2JqZWN0IGhhcyBtb3JlIHByb3BlcnRpZXMgdGhhbiBsaW1pdCBvZiB7MH0uIiwgc2NoZW1hMi5tYXhQcm9wZXJ0aWVzKQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzTnVtYmVyKHNjaGVtYTIubWluUHJvcGVydGllcykpIHsKICAgICAgICAgIGlmIChub2RlMi5wcm9wZXJ0aWVzLmxlbmd0aCA8IHNjaGVtYTIubWluUHJvcGVydGllcykgewogICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0Mi5wcm9ibGVtcy5wdXNoKHsKICAgICAgICAgICAgICBsb2NhdGlvbjogeyBvZmZzZXQ6IG5vZGUyLm9mZnNldCwgbGVuZ3RoOiBub2RlMi5sZW5ndGggfSwKICAgICAgICAgICAgICBtZXNzYWdlOiBsb2NhbGl6ZTIoIk1pblByb3BXYXJuaW5nIiwgIk9iamVjdCBoYXMgZmV3ZXIgcHJvcGVydGllcyB0aGFuIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgezB9Iiwgc2NoZW1hMi5taW5Qcm9wZXJ0aWVzKQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHNjaGVtYTIuZGVwZW5kZW5jaWVzKSB7CiAgICAgICAgICBmb3IgKHZhciBfbSA9IDAsIF9vID0gT2JqZWN0LmtleXMoc2NoZW1hMi5kZXBlbmRlbmNpZXMpOyBfbSA8IF9vLmxlbmd0aDsgX20rKykgewogICAgICAgICAgICB2YXIga2V5ID0gX29bX21dOwogICAgICAgICAgICB2YXIgcHJvcCA9IHNlZW5LZXlzW2tleV07CiAgICAgICAgICAgIGlmIChwcm9wKSB7CiAgICAgICAgICAgICAgdmFyIHByb3BlcnR5RGVwID0gc2NoZW1hMi5kZXBlbmRlbmNpZXNba2V5XTsKICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0eURlcCkpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIF9wID0gMCwgcHJvcGVydHlEZXBfMSA9IHByb3BlcnR5RGVwOyBfcCA8IHByb3BlcnR5RGVwXzEubGVuZ3RoOyBfcCsrKSB7CiAgICAgICAgICAgICAgICAgIHZhciByZXF1aXJlZFByb3AgPSBwcm9wZXJ0eURlcF8xW19wXTsKICAgICAgICAgICAgICAgICAgaWYgKCFzZWVuS2V5c1tyZXF1aXJlZFByb3BdKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIucHJvYmxlbXMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogeyBvZmZzZXQ6IG5vZGUyLm9mZnNldCwgbGVuZ3RoOiBub2RlMi5sZW5ndGggfSwKICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGxvY2FsaXplMigiUmVxdWlyZWREZXBlbmRlbnRQcm9wV2FybmluZyIsICJPYmplY3QgaXMgbWlzc2luZyBwcm9wZXJ0eSB7MH0gcmVxdWlyZWQgYnkgcHJvcGVydHkgezF9LiIsIHJlcXVpcmVkUHJvcCwga2V5KQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQyLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMrKzsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBhc1NjaGVtYShwcm9wZXJ0eURlcCk7CiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEpIHsKICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5VmFsaWRhdGlvblJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uUmVzdWx0KCk7CiAgICAgICAgICAgICAgICAgIHZhbGlkYXRlKG5vZGUyLCBwcm9wZXJ0eVNjaGVtYSwgcHJvcGVydHlWYWxpZGF0aW9uUmVzdWx0LCBtYXRjaGluZ1NjaGVtYXMyKTsKICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdDIubWVyZ2VQcm9wZXJ0eU1hdGNoKHByb3BlcnR5VmFsaWRhdGlvblJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBwcm9wZXJ0eU5hbWVzID0gYXNTY2hlbWEoc2NoZW1hMi5wcm9wZXJ0eU5hbWVzKTsKICAgICAgICBpZiAocHJvcGVydHlOYW1lcykgewogICAgICAgICAgZm9yICh2YXIgX3EgPSAwLCBfciA9IG5vZGUyLnByb3BlcnRpZXM7IF9xIDwgX3IubGVuZ3RoOyBfcSsrKSB7CiAgICAgICAgICAgIHZhciBmMiA9IF9yW19xXTsKICAgICAgICAgICAgdmFyIGtleSA9IGYyLmtleU5vZGU7CiAgICAgICAgICAgIGlmIChrZXkpIHsKICAgICAgICAgICAgICB2YWxpZGF0ZShrZXksIHByb3BlcnR5TmFtZXMsIHZhbGlkYXRpb25SZXN1bHQyLCBOb09wU2NoZW1hQ29sbGVjdG9yLmluc3RhbmNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcGFyc2UzKHRleHREb2N1bWVudCwgY29uZmlnKSB7CiAgICAgIHZhciBwcm9ibGVtcyA9IFtdOwogICAgICB2YXIgbGFzdFByb2JsZW1PZmZzZXQgPSAtMTsKICAgICAgdmFyIHRleHQgPSB0ZXh0RG9jdW1lbnQuZ2V0VGV4dCgpOwogICAgICB2YXIgc2Nhbm5lcjIgPSBjcmVhdGVTY2FubmVyMih0ZXh0LCBmYWxzZSk7CiAgICAgIHZhciBjb21tZW50UmFuZ2VzID0gY29uZmlnICYmIGNvbmZpZy5jb2xsZWN0Q29tbWVudHMgPyBbXSA6IHZvaWQgMDsKICAgICAgZnVuY3Rpb24gX3NjYW5OZXh0KCkgewogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICB2YXIgdG9rZW5fMSA9IHNjYW5uZXIyLnNjYW4oKTsKICAgICAgICAgIF9jaGVja1NjYW5FcnJvcigpOwogICAgICAgICAgc3dpdGNoICh0b2tlbl8xKSB7CiAgICAgICAgICAgIGNhc2UgMTI6CiAgICAgICAgICAgIGNhc2UgMTM6CiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29tbWVudFJhbmdlcykpIHsKICAgICAgICAgICAgICAgIGNvbW1lbnRSYW5nZXMucHVzaChSYW5nZS5jcmVhdGUodGV4dERvY3VtZW50LnBvc2l0aW9uQXQoc2Nhbm5lcjIuZ2V0VG9rZW5PZmZzZXQoKSksIHRleHREb2N1bWVudC5wb3NpdGlvbkF0KHNjYW5uZXIyLmdldFRva2VuT2Zmc2V0KCkgKyBzY2FubmVyMi5nZXRUb2tlbkxlbmd0aCgpKSkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAxNToKICAgICAgICAgICAgY2FzZSAxNDoKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICByZXR1cm4gdG9rZW5fMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gX2Vycm9yQXRSYW5nZShtZXNzYWdlLCBjb2RlLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0LCBzZXZlcml0eSkgewogICAgICAgIGlmIChzZXZlcml0eSA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBzZXZlcml0eSA9IERpYWdub3N0aWNTZXZlcml0eS5FcnJvcjsKICAgICAgICB9CiAgICAgICAgaWYgKHByb2JsZW1zLmxlbmd0aCA9PT0gMCB8fCBzdGFydE9mZnNldCAhPT0gbGFzdFByb2JsZW1PZmZzZXQpIHsKICAgICAgICAgIHZhciByYW5nZSA9IFJhbmdlLmNyZWF0ZSh0ZXh0RG9jdW1lbnQucG9zaXRpb25BdChzdGFydE9mZnNldCksIHRleHREb2N1bWVudC5wb3NpdGlvbkF0KGVuZE9mZnNldCkpOwogICAgICAgICAgcHJvYmxlbXMucHVzaChEaWFnbm9zdGljLmNyZWF0ZShyYW5nZSwgbWVzc2FnZSwgc2V2ZXJpdHksIGNvZGUsIHRleHREb2N1bWVudC5sYW5ndWFnZUlkKSk7CiAgICAgICAgICBsYXN0UHJvYmxlbU9mZnNldCA9IHN0YXJ0T2Zmc2V0OwogICAgICAgIH0KICAgICAgfQogICAgICBmdW5jdGlvbiBfZXJyb3IobWVzc2FnZSwgY29kZSwgbm9kZSwgc2tpcFVudGlsQWZ0ZXIsIHNraXBVbnRpbCkgewogICAgICAgIGlmIChub2RlID09PSB2b2lkIDApIHsKICAgICAgICAgIG5vZGUgPSB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmIChza2lwVW50aWxBZnRlciA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBza2lwVW50aWxBZnRlciA9IFtdOwogICAgICAgIH0KICAgICAgICBpZiAoc2tpcFVudGlsID09PSB2b2lkIDApIHsKICAgICAgICAgIHNraXBVbnRpbCA9IFtdOwogICAgICAgIH0KICAgICAgICB2YXIgc3RhcnQgPSBzY2FubmVyMi5nZXRUb2tlbk9mZnNldCgpOwogICAgICAgIHZhciBlbmQgPSBzY2FubmVyMi5nZXRUb2tlbk9mZnNldCgpICsgc2Nhbm5lcjIuZ2V0VG9rZW5MZW5ndGgoKTsKICAgICAgICBpZiAoc3RhcnQgPT09IGVuZCAmJiBzdGFydCA+IDApIHsKICAgICAgICAgIHN0YXJ0LS07CiAgICAgICAgICB3aGlsZSAoc3RhcnQgPiAwICYmIC9ccy8udGVzdCh0ZXh0LmNoYXJBdChzdGFydCkpKSB7CiAgICAgICAgICAgIHN0YXJ0LS07CiAgICAgICAgICB9CiAgICAgICAgICBlbmQgPSBzdGFydCArIDE7CiAgICAgICAgfQogICAgICAgIF9lcnJvckF0UmFuZ2UobWVzc2FnZSwgY29kZSwgc3RhcnQsIGVuZCk7CiAgICAgICAgaWYgKG5vZGUpIHsKICAgICAgICAgIF9maW5hbGl6ZShub2RlLCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIGlmIChza2lwVW50aWxBZnRlci5sZW5ndGggKyBza2lwVW50aWwubGVuZ3RoID4gMCkgewogICAgICAgICAgdmFyIHRva2VuXzIgPSBzY2FubmVyMi5nZXRUb2tlbigpOwogICAgICAgICAgd2hpbGUgKHRva2VuXzIgIT09IDE3KSB7CiAgICAgICAgICAgIGlmIChza2lwVW50aWxBZnRlci5pbmRleE9mKHRva2VuXzIpICE9PSAtMSkgewogICAgICAgICAgICAgIF9zY2FuTmV4dCgpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9IGVsc2UgaWYgKHNraXBVbnRpbC5pbmRleE9mKHRva2VuXzIpICE9PSAtMSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRva2VuXzIgPSBfc2Nhbk5leHQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gX2NoZWNrU2NhbkVycm9yKCkgewogICAgICAgIHN3aXRjaCAoc2Nhbm5lcjIuZ2V0VG9rZW5FcnJvcigpKSB7CiAgICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIF9lcnJvcihsb2NhbGl6ZTIoIkludmFsaWRVbmljb2RlIiwgIkludmFsaWQgdW5pY29kZSBzZXF1ZW5jZSBpbiBzdHJpbmcuIiksIEVycm9yQ29kZS5JbnZhbGlkVW5pY29kZSk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICBfZXJyb3IobG9jYWxpemUyKCJJbnZhbGlkRXNjYXBlQ2hhcmFjdGVyIiwgIkludmFsaWQgZXNjYXBlIGNoYXJhY3RlciBpbiBzdHJpbmcuIiksIEVycm9yQ29kZS5JbnZhbGlkRXNjYXBlQ2hhcmFjdGVyKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIF9lcnJvcihsb2NhbGl6ZTIoIlVuZXhwZWN0ZWRFbmRPZk51bWJlciIsICJVbmV4cGVjdGVkIGVuZCBvZiBudW1iZXIuIiksIEVycm9yQ29kZS5VbmV4cGVjdGVkRW5kT2ZOdW1iZXIpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgX2Vycm9yKGxvY2FsaXplMigiVW5leHBlY3RlZEVuZE9mQ29tbWVudCIsICJVbmV4cGVjdGVkIGVuZCBvZiBjb21tZW50LiIpLCBFcnJvckNvZGUuVW5leHBlY3RlZEVuZE9mQ29tbWVudCk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICBfZXJyb3IobG9jYWxpemUyKCJVbmV4cGVjdGVkRW5kT2ZTdHJpbmciLCAiVW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nLiIpLCBFcnJvckNvZGUuVW5leHBlY3RlZEVuZE9mU3RyaW5nKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICBjYXNlIDY6CiAgICAgICAgICAgIF9lcnJvcihsb2NhbGl6ZTIoIkludmFsaWRDaGFyYWN0ZXIiLCAiSW52YWxpZCBjaGFyYWN0ZXJzIGluIHN0cmluZy4gQ29udHJvbCBjaGFyYWN0ZXJzIG11c3QgYmUgZXNjYXBlZC4iKSwgRXJyb3JDb2RlLkludmFsaWRDaGFyYWN0ZXIpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIF9maW5hbGl6ZShub2RlLCBzY2FuTmV4dCkgewogICAgICAgIG5vZGUubGVuZ3RoID0gc2Nhbm5lcjIuZ2V0VG9rZW5PZmZzZXQoKSArIHNjYW5uZXIyLmdldFRva2VuTGVuZ3RoKCkgLSBub2RlLm9mZnNldDsKICAgICAgICBpZiAoc2Nhbk5leHQpIHsKICAgICAgICAgIF9zY2FuTmV4dCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBfcGFyc2VBcnJheShwYXJlbnQpIHsKICAgICAgICBpZiAoc2Nhbm5lcjIuZ2V0VG9rZW4oKSAhPT0gMykgewogICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgICAgdmFyIG5vZGUgPSBuZXcgQXJyYXlBU1ROb2RlSW1wbChwYXJlbnQsIHNjYW5uZXIyLmdldFRva2VuT2Zmc2V0KCkpOwogICAgICAgIF9zY2FuTmV4dCgpOwogICAgICAgIHZhciBuZWVkc0NvbW1hID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKHNjYW5uZXIyLmdldFRva2VuKCkgIT09IDQgJiYgc2Nhbm5lcjIuZ2V0VG9rZW4oKSAhPT0gMTcpIHsKICAgICAgICAgIGlmIChzY2FubmVyMi5nZXRUb2tlbigpID09PSA1KSB7CiAgICAgICAgICAgIGlmICghbmVlZHNDb21tYSkgewogICAgICAgICAgICAgIF9lcnJvcihsb2NhbGl6ZTIoIlZhbHVlRXhwZWN0ZWQiLCAiVmFsdWUgZXhwZWN0ZWQiKSwgRXJyb3JDb2RlLlZhbHVlRXhwZWN0ZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjb21tYU9mZnNldCA9IHNjYW5uZXIyLmdldFRva2VuT2Zmc2V0KCk7CiAgICAgICAgICAgIF9zY2FuTmV4dCgpOwogICAgICAgICAgICBpZiAoc2Nhbm5lcjIuZ2V0VG9rZW4oKSA9PT0gNCkgewogICAgICAgICAgICAgIGlmIChuZWVkc0NvbW1hKSB7CiAgICAgICAgICAgICAgICBfZXJyb3JBdFJhbmdlKGxvY2FsaXplMigiVHJhaWxpbmdDb21tYSIsICJUcmFpbGluZyBjb21tYSIpLCBFcnJvckNvZGUuVHJhaWxpbmdDb21tYSwgY29tbWFPZmZzZXQsIGNvbW1hT2Zmc2V0ICsgMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICAgICAgX2Vycm9yKGxvY2FsaXplMigiRXhwZWN0ZWRDb21tYSIsICJFeHBlY3RlZCBjb21tYSIpLCBFcnJvckNvZGUuQ29tbWFFeHBlY3RlZCk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgaXRlbSA9IF9wYXJzZVZhbHVlKG5vZGUpOwogICAgICAgICAgaWYgKCFpdGVtKSB7CiAgICAgICAgICAgIF9lcnJvcihsb2NhbGl6ZTIoIlByb3BlcnR5RXhwZWN0ZWQiLCAiVmFsdWUgZXhwZWN0ZWQiKSwgRXJyb3JDb2RlLlZhbHVlRXhwZWN0ZWQsIHZvaWQgMCwgW10sIFs0LCA1XSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlLml0ZW1zLnB1c2goaXRlbSk7CiAgICAgICAgICB9CiAgICAgICAgICBuZWVkc0NvbW1hID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHNjYW5uZXIyLmdldFRva2VuKCkgIT09IDQpIHsKICAgICAgICAgIHJldHVybiBfZXJyb3IobG9jYWxpemUyKCJFeHBlY3RlZENsb3NlQnJhY2tldCIsICJFeHBlY3RlZCBjb21tYSBvciBjbG9zaW5nIGJyYWNrZXQiKSwgRXJyb3JDb2RlLkNvbW1hT3JDbG9zZUJhY2tldEV4cGVjdGVkLCBub2RlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9maW5hbGl6ZShub2RlLCB0cnVlKTsKICAgICAgfQogICAgICB2YXIga2V5UGxhY2Vob2xkZXIgPSBuZXcgU3RyaW5nQVNUTm9kZUltcGwodm9pZCAwLCAwLCAwKTsKICAgICAgZnVuY3Rpb24gX3BhcnNlUHJvcGVydHkocGFyZW50LCBrZXlzU2VlbikgewogICAgICAgIHZhciBub2RlID0gbmV3IFByb3BlcnR5QVNUTm9kZUltcGwocGFyZW50LCBzY2FubmVyMi5nZXRUb2tlbk9mZnNldCgpLCBrZXlQbGFjZWhvbGRlcik7CiAgICAgICAgdmFyIGtleSA9IF9wYXJzZVN0cmluZyhub2RlKTsKICAgICAgICBpZiAoIWtleSkgewogICAgICAgICAgaWYgKHNjYW5uZXIyLmdldFRva2VuKCkgPT09IDE2KSB7CiAgICAgICAgICAgIF9lcnJvcihsb2NhbGl6ZTIoIkRvdWJsZVF1b3Rlc0V4cGVjdGVkIiwgIlByb3BlcnR5IGtleXMgbXVzdCBiZSBkb3VibGVxdW90ZWQiKSwgRXJyb3JDb2RlLlVuZGVmaW5lZCk7CiAgICAgICAgICAgIHZhciBrZXlOb2RlID0gbmV3IFN0cmluZ0FTVE5vZGVJbXBsKG5vZGUsIHNjYW5uZXIyLmdldFRva2VuT2Zmc2V0KCksIHNjYW5uZXIyLmdldFRva2VuTGVuZ3RoKCkpOwogICAgICAgICAgICBrZXlOb2RlLnZhbHVlID0gc2Nhbm5lcjIuZ2V0VG9rZW5WYWx1ZSgpOwogICAgICAgICAgICBrZXkgPSBrZXlOb2RlOwogICAgICAgICAgICBfc2Nhbk5leHQoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5vZGUua2V5Tm9kZSA9IGtleTsKICAgICAgICB2YXIgc2VlbiA9IGtleXNTZWVuW2tleS52YWx1ZV07CiAgICAgICAgaWYgKHNlZW4pIHsKICAgICAgICAgIF9lcnJvckF0UmFuZ2UobG9jYWxpemUyKCJEdXBsaWNhdGVLZXlXYXJuaW5nIiwgIkR1cGxpY2F0ZSBvYmplY3Qga2V5IiksIEVycm9yQ29kZS5EdXBsaWNhdGVLZXksIG5vZGUua2V5Tm9kZS5vZmZzZXQsIG5vZGUua2V5Tm9kZS5vZmZzZXQgKyBub2RlLmtleU5vZGUubGVuZ3RoLCBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZyk7CiAgICAgICAgICBpZiAodHlwZW9mIHNlZW4gPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIF9lcnJvckF0UmFuZ2UobG9jYWxpemUyKCJEdXBsaWNhdGVLZXlXYXJuaW5nIiwgIkR1cGxpY2F0ZSBvYmplY3Qga2V5IiksIEVycm9yQ29kZS5EdXBsaWNhdGVLZXksIHNlZW4ua2V5Tm9kZS5vZmZzZXQsIHNlZW4ua2V5Tm9kZS5vZmZzZXQgKyBzZWVuLmtleU5vZGUubGVuZ3RoLCBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZyk7CiAgICAgICAgICB9CiAgICAgICAgICBrZXlzU2VlbltrZXkudmFsdWVdID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAga2V5c1NlZW5ba2V5LnZhbHVlXSA9IG5vZGU7CiAgICAgICAgfQogICAgICAgIGlmIChzY2FubmVyMi5nZXRUb2tlbigpID09PSA2KSB7CiAgICAgICAgICBub2RlLmNvbG9uT2Zmc2V0ID0gc2Nhbm5lcjIuZ2V0VG9rZW5PZmZzZXQoKTsKICAgICAgICAgIF9zY2FuTmV4dCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBfZXJyb3IobG9jYWxpemUyKCJDb2xvbkV4cGVjdGVkIiwgIkNvbG9uIGV4cGVjdGVkIiksIEVycm9yQ29kZS5Db2xvbkV4cGVjdGVkKTsKICAgICAgICAgIGlmIChzY2FubmVyMi5nZXRUb2tlbigpID09PSAxMCAmJiB0ZXh0RG9jdW1lbnQucG9zaXRpb25BdChrZXkub2Zmc2V0ICsga2V5Lmxlbmd0aCkubGluZSA8IHRleHREb2N1bWVudC5wb3NpdGlvbkF0KHNjYW5uZXIyLmdldFRva2VuT2Zmc2V0KCkpLmxpbmUpIHsKICAgICAgICAgICAgbm9kZS5sZW5ndGggPSBrZXkubGVuZ3RoOwogICAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHZhbHVlID0gX3BhcnNlVmFsdWUobm9kZSk7CiAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIF9lcnJvcihsb2NhbGl6ZTIoIlZhbHVlRXhwZWN0ZWQiLCAiVmFsdWUgZXhwZWN0ZWQiKSwgRXJyb3JDb2RlLlZhbHVlRXhwZWN0ZWQsIG5vZGUsIFtdLCBbMiwgNV0pOwogICAgICAgIH0KICAgICAgICBub2RlLnZhbHVlTm9kZSA9IHZhbHVlOwogICAgICAgIG5vZGUubGVuZ3RoID0gdmFsdWUub2Zmc2V0ICsgdmFsdWUubGVuZ3RoIC0gbm9kZS5vZmZzZXQ7CiAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gX3BhcnNlT2JqZWN0KHBhcmVudCkgewogICAgICAgIGlmIChzY2FubmVyMi5nZXRUb2tlbigpICE9PSAxKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICB2YXIgbm9kZSA9IG5ldyBPYmplY3RBU1ROb2RlSW1wbChwYXJlbnQsIHNjYW5uZXIyLmdldFRva2VuT2Zmc2V0KCkpOwogICAgICAgIHZhciBrZXlzU2VlbiA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgICAgX3NjYW5OZXh0KCk7CiAgICAgICAgdmFyIG5lZWRzQ29tbWEgPSBmYWxzZTsKICAgICAgICB3aGlsZSAoc2Nhbm5lcjIuZ2V0VG9rZW4oKSAhPT0gMiAmJiBzY2FubmVyMi5nZXRUb2tlbigpICE9PSAxNykgewogICAgICAgICAgaWYgKHNjYW5uZXIyLmdldFRva2VuKCkgPT09IDUpIHsKICAgICAgICAgICAgaWYgKCFuZWVkc0NvbW1hKSB7CiAgICAgICAgICAgICAgX2Vycm9yKGxvY2FsaXplMigiUHJvcGVydHlFeHBlY3RlZCIsICJQcm9wZXJ0eSBleHBlY3RlZCIpLCBFcnJvckNvZGUuUHJvcGVydHlFeHBlY3RlZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGNvbW1hT2Zmc2V0ID0gc2Nhbm5lcjIuZ2V0VG9rZW5PZmZzZXQoKTsKICAgICAgICAgICAgX3NjYW5OZXh0KCk7CiAgICAgICAgICAgIGlmIChzY2FubmVyMi5nZXRUb2tlbigpID09PSAyKSB7CiAgICAgICAgICAgICAgaWYgKG5lZWRzQ29tbWEpIHsKICAgICAgICAgICAgICAgIF9lcnJvckF0UmFuZ2UobG9jYWxpemUyKCJUcmFpbGluZ0NvbW1hIiwgIlRyYWlsaW5nIGNvbW1hIiksIEVycm9yQ29kZS5UcmFpbGluZ0NvbW1hLCBjb21tYU9mZnNldCwgY29tbWFPZmZzZXQgKyAxKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAobmVlZHNDb21tYSkgewogICAgICAgICAgICBfZXJyb3IobG9jYWxpemUyKCJFeHBlY3RlZENvbW1hIiwgIkV4cGVjdGVkIGNvbW1hIiksIEVycm9yQ29kZS5Db21tYUV4cGVjdGVkKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IF9wYXJzZVByb3BlcnR5KG5vZGUsIGtleXNTZWVuKTsKICAgICAgICAgIGlmICghcHJvcGVydHkpIHsKICAgICAgICAgICAgX2Vycm9yKGxvY2FsaXplMigiUHJvcGVydHlFeHBlY3RlZCIsICJQcm9wZXJ0eSBleHBlY3RlZCIpLCBFcnJvckNvZGUuUHJvcGVydHlFeHBlY3RlZCwgdm9pZCAwLCBbXSwgWzIsIDVdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5vZGUucHJvcGVydGllcy5wdXNoKHByb3BlcnR5KTsKICAgICAgICAgIH0KICAgICAgICAgIG5lZWRzQ29tbWEgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoc2Nhbm5lcjIuZ2V0VG9rZW4oKSAhPT0gMikgewogICAgICAgICAgcmV0dXJuIF9lcnJvcihsb2NhbGl6ZTIoIkV4cGVjdGVkQ2xvc2VCcmFjZSIsICJFeHBlY3RlZCBjb21tYSBvciBjbG9zaW5nIGJyYWNlIiksIEVycm9yQ29kZS5Db21tYU9yQ2xvc2VCcmFjZUV4cGVjdGVkLCBub2RlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9maW5hbGl6ZShub2RlLCB0cnVlKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBfcGFyc2VTdHJpbmcocGFyZW50KSB7CiAgICAgICAgaWYgKHNjYW5uZXIyLmdldFRva2VuKCkgIT09IDEwKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICB2YXIgbm9kZSA9IG5ldyBTdHJpbmdBU1ROb2RlSW1wbChwYXJlbnQsIHNjYW5uZXIyLmdldFRva2VuT2Zmc2V0KCkpOwogICAgICAgIG5vZGUudmFsdWUgPSBzY2FubmVyMi5nZXRUb2tlblZhbHVlKCk7CiAgICAgICAgcmV0dXJuIF9maW5hbGl6ZShub2RlLCB0cnVlKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBfcGFyc2VOdW1iZXIocGFyZW50KSB7CiAgICAgICAgaWYgKHNjYW5uZXIyLmdldFRva2VuKCkgIT09IDExKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICB2YXIgbm9kZSA9IG5ldyBOdW1iZXJBU1ROb2RlSW1wbChwYXJlbnQsIHNjYW5uZXIyLmdldFRva2VuT2Zmc2V0KCkpOwogICAgICAgIGlmIChzY2FubmVyMi5nZXRUb2tlbkVycm9yKCkgPT09IDApIHsKICAgICAgICAgIHZhciB0b2tlblZhbHVlID0gc2Nhbm5lcjIuZ2V0VG9rZW5WYWx1ZSgpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIG51bWJlclZhbHVlID0gSlNPTi5wYXJzZSh0b2tlblZhbHVlKTsKICAgICAgICAgICAgaWYgKCFpc051bWJlcihudW1iZXJWYWx1ZSkpIHsKICAgICAgICAgICAgICByZXR1cm4gX2Vycm9yKGxvY2FsaXplMigiSW52YWxpZE51bWJlckZvcm1hdCIsICJJbnZhbGlkIG51bWJlciBmb3JtYXQuIiksIEVycm9yQ29kZS5VbmRlZmluZWQsIG5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGUudmFsdWUgPSBudW1iZXJWYWx1ZTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgcmV0dXJuIF9lcnJvcihsb2NhbGl6ZTIoIkludmFsaWROdW1iZXJGb3JtYXQiLCAiSW52YWxpZCBudW1iZXIgZm9ybWF0LiIpLCBFcnJvckNvZGUuVW5kZWZpbmVkLCBub2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIG5vZGUuaXNJbnRlZ2VyID0gdG9rZW5WYWx1ZS5pbmRleE9mKCIuIikgPT09IC0xOwogICAgICAgIH0KICAgICAgICByZXR1cm4gX2ZpbmFsaXplKG5vZGUsIHRydWUpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIF9wYXJzZUxpdGVyYWwocGFyZW50KSB7CiAgICAgICAgc3dpdGNoIChzY2FubmVyMi5nZXRUb2tlbigpKSB7CiAgICAgICAgICBjYXNlIDc6CiAgICAgICAgICAgIHJldHVybiBfZmluYWxpemUobmV3IE51bGxBU1ROb2RlSW1wbChwYXJlbnQsIHNjYW5uZXIyLmdldFRva2VuT2Zmc2V0KCkpLCB0cnVlKTsKICAgICAgICAgIGNhc2UgODoKICAgICAgICAgICAgcmV0dXJuIF9maW5hbGl6ZShuZXcgQm9vbGVhbkFTVE5vZGVJbXBsKHBhcmVudCwgdHJ1ZSwgc2Nhbm5lcjIuZ2V0VG9rZW5PZmZzZXQoKSksIHRydWUpOwogICAgICAgICAgY2FzZSA5OgogICAgICAgICAgICByZXR1cm4gX2ZpbmFsaXplKG5ldyBCb29sZWFuQVNUTm9kZUltcGwocGFyZW50LCBmYWxzZSwgc2Nhbm5lcjIuZ2V0VG9rZW5PZmZzZXQoKSksIHRydWUpOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gX3BhcnNlVmFsdWUocGFyZW50KSB7CiAgICAgICAgcmV0dXJuIF9wYXJzZUFycmF5KHBhcmVudCkgfHwgX3BhcnNlT2JqZWN0KHBhcmVudCkgfHwgX3BhcnNlU3RyaW5nKHBhcmVudCkgfHwgX3BhcnNlTnVtYmVyKHBhcmVudCkgfHwgX3BhcnNlTGl0ZXJhbChwYXJlbnQpOwogICAgICB9CiAgICAgIHZhciBfcm9vdCA9IHZvaWQgMDsKICAgICAgdmFyIHRva2VuID0gX3NjYW5OZXh0KCk7CiAgICAgIGlmICh0b2tlbiAhPT0gMTcpIHsKICAgICAgICBfcm9vdCA9IF9wYXJzZVZhbHVlKF9yb290KTsKICAgICAgICBpZiAoIV9yb290KSB7CiAgICAgICAgICBfZXJyb3IobG9jYWxpemUyKCJJbnZhbGlkIHN5bWJvbCIsICJFeHBlY3RlZCBhIEpTT04gb2JqZWN0LCBhcnJheSBvciBsaXRlcmFsLiIpLCBFcnJvckNvZGUuVW5kZWZpbmVkKTsKICAgICAgICB9IGVsc2UgaWYgKHNjYW5uZXIyLmdldFRva2VuKCkgIT09IDE3KSB7CiAgICAgICAgICBfZXJyb3IobG9jYWxpemUyKCJFbmQgb2YgZmlsZSBleHBlY3RlZCIsICJFbmQgb2YgZmlsZSBleHBlY3RlZC4iKSwgRXJyb3JDb2RlLlVuZGVmaW5lZCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBuZXcgSlNPTkRvY3VtZW50KF9yb290LCBwcm9ibGVtcywgY29tbWVudFJhbmdlcyk7CiAgICB9CgogICAgLy8gbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29uLWxhbmd1YWdlc2VydmljZS9saWIvZXNtL3V0aWxzL2pzb24uanMKICAgIGZ1bmN0aW9uIHN0cmluZ2lmeU9iamVjdChvYmosIGluZGVudCwgc3RyaW5naWZ5TGl0ZXJhbCkgewogICAgICBpZiAob2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICJvYmplY3QiKSB7CiAgICAgICAgdmFyIG5ld0luZGVudCA9IGluZGVudCArICIJIjsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7CiAgICAgICAgICBpZiAob2JqLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gIltdIjsKICAgICAgICAgIH0KICAgICAgICAgIHZhciByZXN1bHQgPSAiW1xuIjsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSBuZXdJbmRlbnQgKyBzdHJpbmdpZnlPYmplY3Qob2JqW2ldLCBuZXdJbmRlbnQsIHN0cmluZ2lmeUxpdGVyYWwpOwogICAgICAgICAgICBpZiAoaSA8IG9iai5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgcmVzdWx0ICs9ICIsIjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQgKz0gIlxuIjsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdCArPSBpbmRlbnQgKyAiXSI7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7CiAgICAgICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuICJ7fSI7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcmVzdWx0ID0gIntcbiI7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07CiAgICAgICAgICAgIHJlc3VsdCArPSBuZXdJbmRlbnQgKyBKU09OLnN0cmluZ2lmeShrZXkpICsgIjogIiArIHN0cmluZ2lmeU9iamVjdChvYmpba2V5XSwgbmV3SW5kZW50LCBzdHJpbmdpZnlMaXRlcmFsKTsKICAgICAgICAgICAgaWYgKGkgPCBrZXlzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICByZXN1bHQgKz0gIiwiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc3VsdCArPSAiXG4iOwogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0ICs9IGluZGVudCArICJ9IjsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzdHJpbmdpZnlMaXRlcmFsKG9iaik7CiAgICB9CgogICAgLy8gbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29uLWxhbmd1YWdlc2VydmljZS9saWIvZXNtL3NlcnZpY2VzL2pzb25Db21wbGV0aW9uLmpzCiAgICB2YXIgbG9jYWxpemUzID0gbG9hZE1lc3NhZ2VCdW5kbGUoKTsKICAgIHZhciBKU09OQ29tcGxldGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBKU09OQ29tcGxldGlvbjIoc2NoZW1hU2VydmljZSwgY29udHJpYnV0aW9ucywgcHJvbWlzZUNvbnN0cnVjdG9yLCBjbGllbnRDYXBhYmlsaXRpZXMpIHsKICAgICAgICBpZiAoY29udHJpYnV0aW9ucyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBjb250cmlidXRpb25zID0gW107CiAgICAgICAgfQogICAgICAgIGlmIChwcm9taXNlQ29uc3RydWN0b3IgPT09IHZvaWQgMCkgewogICAgICAgICAgcHJvbWlzZUNvbnN0cnVjdG9yID0gUHJvbWlzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGNsaWVudENhcGFiaWxpdGllcyA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBjbGllbnRDYXBhYmlsaXRpZXMgPSB7fTsKICAgICAgICB9CiAgICAgICAgdGhpcy5zY2hlbWFTZXJ2aWNlID0gc2NoZW1hU2VydmljZTsKICAgICAgICB0aGlzLmNvbnRyaWJ1dGlvbnMgPSBjb250cmlidXRpb25zOwogICAgICAgIHRoaXMucHJvbWlzZUNvbnN0cnVjdG9yID0gcHJvbWlzZUNvbnN0cnVjdG9yOwogICAgICAgIHRoaXMuY2xpZW50Q2FwYWJpbGl0aWVzID0gY2xpZW50Q2FwYWJpbGl0aWVzOwogICAgICB9CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZG9SZXNvbHZlID0gZnVuY3Rpb24oaXRlbSkgewogICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmNvbnRyaWJ1dGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgIHZhciByZXNvbHZlQ29tcGxldGlvbiA9IHRoaXMuY29udHJpYnV0aW9uc1tpXS5yZXNvbHZlQ29tcGxldGlvbjsKICAgICAgICAgIGlmIChyZXNvbHZlQ29tcGxldGlvbikgewogICAgICAgICAgICB2YXIgcmVzb2x2ZXIgPSByZXNvbHZlQ29tcGxldGlvbihpdGVtKTsKICAgICAgICAgICAgaWYgKHJlc29sdmVyKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnByb21pc2VDb25zdHJ1Y3Rvci5yZXNvbHZlKGl0ZW0pOwogICAgICB9OwogICAgICBKU09OQ29tcGxldGlvbjIucHJvdG90eXBlLmRvQ29tcGxldGUgPSBmdW5jdGlvbihkb2N1bWVudCwgcG9zaXRpb24sIGRvYykgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgIGl0ZW1zOiBbXSwKICAgICAgICAgIGlzSW5jb21wbGV0ZTogZmFsc2UKICAgICAgICB9OwogICAgICAgIHZhciB0ZXh0ID0gZG9jdW1lbnQuZ2V0VGV4dCgpOwogICAgICAgIHZhciBvZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChwb3NpdGlvbik7CiAgICAgICAgdmFyIG5vZGUgPSBkb2MuZ2V0Tm9kZUZyb21PZmZzZXQob2Zmc2V0LCB0cnVlKTsKICAgICAgICBpZiAodGhpcy5pc0luQ29tbWVudChkb2N1bWVudCwgbm9kZSA/IG5vZGUub2Zmc2V0IDogMCwgb2Zmc2V0KSkgewogICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHQpOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZSAmJiBvZmZzZXQgPT09IG5vZGUub2Zmc2V0ICsgbm9kZS5sZW5ndGggJiYgb2Zmc2V0ID4gMCkgewogICAgICAgICAgdmFyIGNoID0gdGV4dFtvZmZzZXQgLSAxXTsKICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICJvYmplY3QiICYmIGNoID09PSAifSIgfHwgbm9kZS50eXBlID09PSAiYXJyYXkiICYmIGNoID09PSAiXSIpIHsKICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgY3VycmVudFdvcmQgPSB0aGlzLmdldEN1cnJlbnRXb3JkKGRvY3VtZW50LCBvZmZzZXQpOwogICAgICAgIHZhciBvdmVyd3JpdGVSYW5nZTsKICAgICAgICBpZiAobm9kZSAmJiAobm9kZS50eXBlID09PSAic3RyaW5nIiB8fCBub2RlLnR5cGUgPT09ICJudW1iZXIiIHx8IG5vZGUudHlwZSA9PT0gImJvb2xlYW4iIHx8IG5vZGUudHlwZSA9PT0gIm51bGwiKSkgewogICAgICAgICAgb3ZlcndyaXRlUmFuZ2UgPSBSYW5nZS5jcmVhdGUoZG9jdW1lbnQucG9zaXRpb25BdChub2RlLm9mZnNldCksIGRvY3VtZW50LnBvc2l0aW9uQXQobm9kZS5vZmZzZXQgKyBub2RlLmxlbmd0aCkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgb3ZlcndyaXRlU3RhcnQgPSBvZmZzZXQgLSBjdXJyZW50V29yZC5sZW5ndGg7CiAgICAgICAgICBpZiAob3ZlcndyaXRlU3RhcnQgPiAwICYmIHRleHRbb3ZlcndyaXRlU3RhcnQgLSAxXSA9PT0gJyInKSB7CiAgICAgICAgICAgIG92ZXJ3cml0ZVN0YXJ0LS07CiAgICAgICAgICB9CiAgICAgICAgICBvdmVyd3JpdGVSYW5nZSA9IFJhbmdlLmNyZWF0ZShkb2N1bWVudC5wb3NpdGlvbkF0KG92ZXJ3cml0ZVN0YXJ0KSwgcG9zaXRpb24pOwogICAgICAgIH0KICAgICAgICB2YXIgcHJvcG9zZWQgPSB7fTsKICAgICAgICB2YXIgY29sbGVjdG9yID0gewogICAgICAgICAgYWRkOiBmdW5jdGlvbihzdWdnZXN0aW9uKSB7CiAgICAgICAgICAgIHZhciBsYWJlbCA9IHN1Z2dlc3Rpb24ubGFiZWw7CiAgICAgICAgICAgIHZhciBleGlzdGluZyA9IHByb3Bvc2VkW2xhYmVsXTsKICAgICAgICAgICAgaWYgKCFleGlzdGluZykgewogICAgICAgICAgICAgIGxhYmVsID0gbGFiZWwucmVwbGFjZSgvW1xuXS9nLCAiXHUyMUI1Iik7CiAgICAgICAgICAgICAgaWYgKGxhYmVsLmxlbmd0aCA+IDYwKSB7CiAgICAgICAgICAgICAgICB2YXIgc2hvcnRlbmRlZExhYmVsID0gbGFiZWwuc3Vic3RyKDAsIDU3KS50cmltKCkgKyAiLi4uIjsKICAgICAgICAgICAgICAgIGlmICghcHJvcG9zZWRbc2hvcnRlbmRlZExhYmVsXSkgewogICAgICAgICAgICAgICAgICBsYWJlbCA9IHNob3J0ZW5kZWRMYWJlbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKG92ZXJ3cml0ZVJhbmdlICYmIHN1Z2dlc3Rpb24uaW5zZXJ0VGV4dCAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uLnRleHRFZGl0ID0gVGV4dEVkaXQucmVwbGFjZShvdmVyd3JpdGVSYW5nZSwgc3VnZ2VzdGlvbi5pbnNlcnRUZXh0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3VnZ2VzdGlvbi5sYWJlbCA9IGxhYmVsOwogICAgICAgICAgICAgIHByb3Bvc2VkW2xhYmVsXSA9IHN1Z2dlc3Rpb247CiAgICAgICAgICAgICAgcmVzdWx0Lml0ZW1zLnB1c2goc3VnZ2VzdGlvbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKCFleGlzdGluZy5kb2N1bWVudGF0aW9uKSB7CiAgICAgICAgICAgICAgICBleGlzdGluZy5kb2N1bWVudGF0aW9uID0gc3VnZ2VzdGlvbi5kb2N1bWVudGF0aW9uOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoIWV4aXN0aW5nLmRldGFpbCkgewogICAgICAgICAgICAgICAgZXhpc3RpbmcuZGV0YWlsID0gc3VnZ2VzdGlvbi5kZXRhaWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgc2V0QXNJbmNvbXBsZXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmVzdWx0LmlzSW5jb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICB9LAogICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTsKICAgICAgICAgIH0sCiAgICAgICAgICBsb2c6IGZ1bmN0aW9uKG1lc3NhZ2UpIHsKICAgICAgICAgICAgY29uc29sZS5sb2cobWVzc2FnZSk7CiAgICAgICAgICB9LAogICAgICAgICAgZ2V0TnVtYmVyT2ZQcm9wb3NhbHM6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0Lml0ZW1zLmxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiB0aGlzLnNjaGVtYVNlcnZpY2UuZ2V0U2NoZW1hRm9yUmVzb3VyY2UoZG9jdW1lbnQudXJpLCBkb2MpLnRoZW4oZnVuY3Rpb24oc2NoZW1hKSB7CiAgICAgICAgICB2YXIgY29sbGVjdGlvblByb21pc2VzID0gW107CiAgICAgICAgICB2YXIgYWRkVmFsdWUgPSB0cnVlOwogICAgICAgICAgdmFyIGN1cnJlbnRLZXkgPSAiIjsKICAgICAgICAgIHZhciBjdXJyZW50UHJvcGVydHkgPSB2b2lkIDA7CiAgICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudDsKICAgICAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC50eXBlID09PSAicHJvcGVydHkiICYmIHBhcmVudC5rZXlOb2RlID09PSBub2RlKSB7CiAgICAgICAgICAgICAgICBhZGRWYWx1ZSA9ICFwYXJlbnQudmFsdWVOb2RlOwogICAgICAgICAgICAgICAgY3VycmVudFByb3BlcnR5ID0gcGFyZW50OwogICAgICAgICAgICAgICAgY3VycmVudEtleSA9IHRleHQuc3Vic3RyKG5vZGUub2Zmc2V0ICsgMSwgbm9kZS5sZW5ndGggLSAyKTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobm9kZSAmJiBub2RlLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIGlmIChub2RlLm9mZnNldCA9PT0gb2Zmc2V0KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcHJvcGVydGllcyA9IG5vZGUucHJvcGVydGllczsKICAgICAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKHApIHsKICAgICAgICAgICAgICBpZiAoIWN1cnJlbnRQcm9wZXJ0eSB8fCBjdXJyZW50UHJvcGVydHkgIT09IHApIHsKICAgICAgICAgICAgICAgIHByb3Bvc2VkW3Aua2V5Tm9kZS52YWx1ZV0gPSBDb21wbGV0aW9uSXRlbS5jcmVhdGUoIl9fIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIHNlcGFyYXRvckFmdGVyXzEgPSAiIjsKICAgICAgICAgICAgaWYgKGFkZFZhbHVlKSB7CiAgICAgICAgICAgICAgc2VwYXJhdG9yQWZ0ZXJfMSA9IF90aGlzLmV2YWx1YXRlU2VwYXJhdG9yQWZ0ZXIoZG9jdW1lbnQsIGRvY3VtZW50Lm9mZnNldEF0KG92ZXJ3cml0ZVJhbmdlLmVuZCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzY2hlbWEpIHsKICAgICAgICAgICAgICBfdGhpcy5nZXRQcm9wZXJ0eUNvbXBsZXRpb25zKHNjaGVtYSwgZG9jLCBub2RlLCBhZGRWYWx1ZSwgc2VwYXJhdG9yQWZ0ZXJfMSwgY29sbGVjdG9yKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBfdGhpcy5nZXRTY2hlbWFMZXNzUHJvcGVydHlDb21wbGV0aW9ucyhkb2MsIG5vZGUsIGN1cnJlbnRLZXksIGNvbGxlY3Rvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGxvY2F0aW9uXzEgPSBnZXROb2RlUGF0aDMobm9kZSk7CiAgICAgICAgICAgIF90aGlzLmNvbnRyaWJ1dGlvbnMuZm9yRWFjaChmdW5jdGlvbihjb250cmlidXRpb24pIHsKICAgICAgICAgICAgICB2YXIgY29sbGVjdFByb21pc2UgPSBjb250cmlidXRpb24uY29sbGVjdFByb3BlcnR5Q29tcGxldGlvbnMoZG9jdW1lbnQudXJpLCBsb2NhdGlvbl8xLCBjdXJyZW50V29yZCwgYWRkVmFsdWUsIHNlcGFyYXRvckFmdGVyXzEgPT09ICIiLCBjb2xsZWN0b3IpOwogICAgICAgICAgICAgIGlmIChjb2xsZWN0UHJvbWlzZSkgewogICAgICAgICAgICAgICAgY29sbGVjdGlvblByb21pc2VzLnB1c2goY29sbGVjdFByb21pc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICghc2NoZW1hICYmIGN1cnJlbnRXb3JkLmxlbmd0aCA+IDAgJiYgdGV4dC5jaGFyQXQob2Zmc2V0IC0gY3VycmVudFdvcmQubGVuZ3RoIC0gMSkgIT09ICciJykgewogICAgICAgICAgICAgIGNvbGxlY3Rvci5hZGQoewogICAgICAgICAgICAgICAga2luZDogQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5LAogICAgICAgICAgICAgICAgbGFiZWw6IF90aGlzLmdldExhYmVsRm9yVmFsdWUoY3VycmVudFdvcmQpLAogICAgICAgICAgICAgICAgaW5zZXJ0VGV4dDogX3RoaXMuZ2V0SW5zZXJ0VGV4dEZvclByb3BlcnR5KGN1cnJlbnRXb3JkLCB2b2lkIDAsIGZhbHNlLCBzZXBhcmF0b3JBZnRlcl8xKSwKICAgICAgICAgICAgICAgIGluc2VydFRleHRGb3JtYXQ6IEluc2VydFRleHRGb3JtYXQuU25pcHBldCwKICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb246ICIiCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgY29sbGVjdG9yLnNldEFzSW5jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgdHlwZXMgPSB7fTsKICAgICAgICAgIGlmIChzY2hlbWEpIHsKICAgICAgICAgICAgX3RoaXMuZ2V0VmFsdWVDb21wbGV0aW9ucyhzY2hlbWEsIGRvYywgbm9kZSwgb2Zmc2V0LCBkb2N1bWVudCwgY29sbGVjdG9yLCB0eXBlcyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBfdGhpcy5nZXRTY2hlbWFMZXNzVmFsdWVDb21wbGV0aW9ucyhkb2MsIG5vZGUsIG9mZnNldCwgZG9jdW1lbnQsIGNvbGxlY3Rvcik7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoX3RoaXMuY29udHJpYnV0aW9ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIF90aGlzLmdldENvbnRyaWJ1dGVkVmFsdWVDb21wbGV0aW9ucyhkb2MsIG5vZGUsIG9mZnNldCwgZG9jdW1lbnQsIGNvbGxlY3RvciwgY29sbGVjdGlvblByb21pc2VzKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBfdGhpcy5wcm9taXNlQ29uc3RydWN0b3IuYWxsKGNvbGxlY3Rpb25Qcm9taXNlcykudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKGNvbGxlY3Rvci5nZXROdW1iZXJPZlByb3Bvc2FscygpID09PSAwKSB7CiAgICAgICAgICAgICAgdmFyIG9mZnNldEZvclNlcGFyYXRvciA9IG9mZnNldDsKICAgICAgICAgICAgICBpZiAobm9kZSAmJiAobm9kZS50eXBlID09PSAic3RyaW5nIiB8fCBub2RlLnR5cGUgPT09ICJudW1iZXIiIHx8IG5vZGUudHlwZSA9PT0gImJvb2xlYW4iIHx8IG5vZGUudHlwZSA9PT0gIm51bGwiKSkgewogICAgICAgICAgICAgICAgb2Zmc2V0Rm9yU2VwYXJhdG9yID0gbm9kZS5vZmZzZXQgKyBub2RlLmxlbmd0aDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIHNlcGFyYXRvckFmdGVyID0gX3RoaXMuZXZhbHVhdGVTZXBhcmF0b3JBZnRlcihkb2N1bWVudCwgb2Zmc2V0Rm9yU2VwYXJhdG9yKTsKICAgICAgICAgICAgICBfdGhpcy5hZGRGaWxsZXJWYWx1ZUNvbXBsZXRpb25zKHR5cGVzLCBzZXBhcmF0b3JBZnRlciwgY29sbGVjdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZ2V0UHJvcGVydHlDb21wbGV0aW9ucyA9IGZ1bmN0aW9uKHNjaGVtYSwgZG9jLCBub2RlLCBhZGRWYWx1ZSwgc2VwYXJhdG9yQWZ0ZXIsIGNvbGxlY3RvcikgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIG1hdGNoaW5nU2NoZW1hcyA9IGRvYy5nZXRNYXRjaGluZ1NjaGVtYXMoc2NoZW1hLnNjaGVtYSwgbm9kZS5vZmZzZXQpOwogICAgICAgIG1hdGNoaW5nU2NoZW1hcy5mb3JFYWNoKGZ1bmN0aW9uKHMpIHsKICAgICAgICAgIGlmIChzLm5vZGUgPT09IG5vZGUgJiYgIXMuaW52ZXJ0ZWQpIHsKICAgICAgICAgICAgdmFyIHNjaGVtYVByb3BlcnRpZXNfMSA9IHMuc2NoZW1hLnByb3BlcnRpZXM7CiAgICAgICAgICAgIGlmIChzY2hlbWFQcm9wZXJ0aWVzXzEpIHsKICAgICAgICAgICAgICBPYmplY3Qua2V5cyhzY2hlbWFQcm9wZXJ0aWVzXzEpLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBzY2hlbWFQcm9wZXJ0aWVzXzFba2V5XTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHlTY2hlbWEgPT09ICJvYmplY3QiICYmICFwcm9wZXJ0eVNjaGVtYS5kZXByZWNhdGlvbk1lc3NhZ2UgJiYgIXByb3BlcnR5U2NoZW1hLmRvTm90U3VnZ2VzdCkgewogICAgICAgICAgICAgICAgICB2YXIgcHJvcG9zYWwgPSB7CiAgICAgICAgICAgICAgICAgICAga2luZDogQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5LAogICAgICAgICAgICAgICAgICAgIGxhYmVsOiBrZXksCiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VGV4dDogX3RoaXMuZ2V0SW5zZXJ0VGV4dEZvclByb3BlcnR5KGtleSwgcHJvcGVydHlTY2hlbWEsIGFkZFZhbHVlLCBzZXBhcmF0b3JBZnRlciksCiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VGV4dEZvcm1hdDogSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0LAogICAgICAgICAgICAgICAgICAgIGZpbHRlclRleHQ6IF90aGlzLmdldEZpbHRlclRleHRGb3JWYWx1ZShrZXkpLAogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb246IF90aGlzLmZyb21NYXJrdXAocHJvcGVydHlTY2hlbWEubWFya2Rvd25EZXNjcmlwdGlvbikgfHwgcHJvcGVydHlTY2hlbWEuZGVzY3JpcHRpb24gfHwgIiIKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hLnN1Z2dlc3RTb3J0VGV4dCAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICAgICAgcHJvcG9zYWwuc29ydFRleHQgPSBwcm9wZXJ0eVNjaGVtYS5zdWdnZXN0U29ydFRleHQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKHByb3Bvc2FsLmluc2VydFRleHQgJiYgZW5kc1dpdGgocHJvcG9zYWwuaW5zZXJ0VGV4dCwgIiQxIiArIHNlcGFyYXRvckFmdGVyKSkgewogICAgICAgICAgICAgICAgICAgIHByb3Bvc2FsLmNvbW1hbmQgPSB7CiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogIlN1Z2dlc3QiLAogICAgICAgICAgICAgICAgICAgICAgY29tbWFuZDogImVkaXRvci5hY3Rpb24udHJpZ2dlclN1Z2dlc3QiCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBjb2xsZWN0b3IuYWRkKHByb3Bvc2FsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2NoZW1hUHJvcGVydHlOYW1lc18xID0gcy5zY2hlbWEucHJvcGVydHlOYW1lczsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzY2hlbWFQcm9wZXJ0eU5hbWVzXzEgPT09ICJvYmplY3QiICYmICFzY2hlbWFQcm9wZXJ0eU5hbWVzXzEuZGVwcmVjYXRpb25NZXNzYWdlICYmICFzY2hlbWFQcm9wZXJ0eU5hbWVzXzEuZG9Ob3RTdWdnZXN0KSB7CiAgICAgICAgICAgICAgdmFyIHByb3BlcnR5TmFtZUNvbXBsZXRpb25JdGVtID0gZnVuY3Rpb24obmFtZSwgZW51bURlc2NyaXB0aW9uMikgewogICAgICAgICAgICAgICAgaWYgKGVudW1EZXNjcmlwdGlvbjIgPT09IHZvaWQgMCkgewogICAgICAgICAgICAgICAgICBlbnVtRGVzY3JpcHRpb24yID0gdm9pZCAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHByb3Bvc2FsID0gewogICAgICAgICAgICAgICAgICBraW5kOiBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHksCiAgICAgICAgICAgICAgICAgIGxhYmVsOiBuYW1lLAogICAgICAgICAgICAgICAgICBpbnNlcnRUZXh0OiBfdGhpcy5nZXRJbnNlcnRUZXh0Rm9yUHJvcGVydHkobmFtZSwgdm9pZCAwLCBhZGRWYWx1ZSwgc2VwYXJhdG9yQWZ0ZXIpLAogICAgICAgICAgICAgICAgICBpbnNlcnRUZXh0Rm9ybWF0OiBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQsCiAgICAgICAgICAgICAgICAgIGZpbHRlclRleHQ6IF90aGlzLmdldEZpbHRlclRleHRGb3JWYWx1ZShuYW1lKSwKICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogZW51bURlc2NyaXB0aW9uMiB8fCBfdGhpcy5mcm9tTWFya3VwKHNjaGVtYVByb3BlcnR5TmFtZXNfMS5tYXJrZG93bkRlc2NyaXB0aW9uKSB8fCBzY2hlbWFQcm9wZXJ0eU5hbWVzXzEuZGVzY3JpcHRpb24gfHwgIiIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBpZiAoc2NoZW1hUHJvcGVydHlOYW1lc18xLnN1Z2dlc3RTb3J0VGV4dCAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICAgIHByb3Bvc2FsLnNvcnRUZXh0ID0gc2NoZW1hUHJvcGVydHlOYW1lc18xLnN1Z2dlc3RTb3J0VGV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwcm9wb3NhbC5pbnNlcnRUZXh0ICYmIGVuZHNXaXRoKHByb3Bvc2FsLmluc2VydFRleHQsICIkMSIgKyBzZXBhcmF0b3JBZnRlcikpIHsKICAgICAgICAgICAgICAgICAgcHJvcG9zYWwuY29tbWFuZCA9IHsKICAgICAgICAgICAgICAgICAgICB0aXRsZTogIlN1Z2dlc3QiLAogICAgICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICJlZGl0b3IuYWN0aW9uLnRyaWdnZXJTdWdnZXN0IgogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29sbGVjdG9yLmFkZChwcm9wb3NhbCk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBpZiAoc2NoZW1hUHJvcGVydHlOYW1lc18xLmVudW0pIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2NoZW1hUHJvcGVydHlOYW1lc18xLmVudW0ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgdmFyIGVudW1EZXNjcmlwdGlvbiA9IHZvaWQgMDsKICAgICAgICAgICAgICAgICAgaWYgKHNjaGVtYVByb3BlcnR5TmFtZXNfMS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnMgJiYgaSA8IHNjaGVtYVByb3BlcnR5TmFtZXNfMS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgZW51bURlc2NyaXB0aW9uID0gX3RoaXMuZnJvbU1hcmt1cChzY2hlbWFQcm9wZXJ0eU5hbWVzXzEubWFya2Rvd25FbnVtRGVzY3JpcHRpb25zW2ldKTsKICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzY2hlbWFQcm9wZXJ0eU5hbWVzXzEuZW51bURlc2NyaXB0aW9ucyAmJiBpIDwgc2NoZW1hUHJvcGVydHlOYW1lc18xLmVudW1EZXNjcmlwdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgZW51bURlc2NyaXB0aW9uID0gc2NoZW1hUHJvcGVydHlOYW1lc18xLmVudW1EZXNjcmlwdGlvbnNbaV07CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lQ29tcGxldGlvbkl0ZW0oc2NoZW1hUHJvcGVydHlOYW1lc18xLmVudW1baV0sIGVudW1EZXNjcmlwdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChzY2hlbWFQcm9wZXJ0eU5hbWVzXzEuY29uc3QpIHsKICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUNvbXBsZXRpb25JdGVtKHNjaGVtYVByb3BlcnR5TmFtZXNfMS5jb25zdCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZ2V0U2NoZW1hTGVzc1Byb3BlcnR5Q29tcGxldGlvbnMgPSBmdW5jdGlvbihkb2MsIG5vZGUsIGN1cnJlbnRLZXksIGNvbGxlY3RvcikgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdmFyIGNvbGxlY3RDb21wbGV0aW9uc0ZvclNpbWlsYXJPYmplY3QgPSBmdW5jdGlvbihvYmopIHsKICAgICAgICAgIG9iai5wcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24ocCkgewogICAgICAgICAgICB2YXIga2V5ID0gcC5rZXlOb2RlLnZhbHVlOwogICAgICAgICAgICBjb2xsZWN0b3IuYWRkKHsKICAgICAgICAgICAgICBraW5kOiBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHksCiAgICAgICAgICAgICAgbGFiZWw6IGtleSwKICAgICAgICAgICAgICBpbnNlcnRUZXh0OiBfdGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoa2V5LCAiIiksCiAgICAgICAgICAgICAgaW5zZXJ0VGV4dEZvcm1hdDogSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0LAogICAgICAgICAgICAgIGZpbHRlclRleHQ6IF90aGlzLmdldEZpbHRlclRleHRGb3JWYWx1ZShrZXkpLAogICAgICAgICAgICAgIGRvY3VtZW50YXRpb246ICIiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHsKICAgICAgICAgIGlmIChub2RlLnBhcmVudC50eXBlID09PSAicHJvcGVydHkiKSB7CiAgICAgICAgICAgIHZhciBwYXJlbnRLZXlfMSA9IG5vZGUucGFyZW50LmtleU5vZGUudmFsdWU7CiAgICAgICAgICAgIGRvYy52aXNpdChmdW5jdGlvbihuKSB7CiAgICAgICAgICAgICAgaWYgKG4udHlwZSA9PT0gInByb3BlcnR5IiAmJiBuICE9PSBub2RlLnBhcmVudCAmJiBuLmtleU5vZGUudmFsdWUgPT09IHBhcmVudEtleV8xICYmIG4udmFsdWVOb2RlICYmIG4udmFsdWVOb2RlLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgICAgICBjb2xsZWN0Q29tcGxldGlvbnNGb3JTaW1pbGFyT2JqZWN0KG4udmFsdWVOb2RlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIGlmIChub2RlLnBhcmVudC50eXBlID09PSAiYXJyYXkiKSB7CiAgICAgICAgICAgIG5vZGUucGFyZW50Lml0ZW1zLmZvckVhY2goZnVuY3Rpb24obikgewogICAgICAgICAgICAgIGlmIChuLnR5cGUgPT09ICJvYmplY3QiICYmIG4gIT09IG5vZGUpIHsKICAgICAgICAgICAgICAgIGNvbGxlY3RDb21wbGV0aW9uc0ZvclNpbWlsYXJPYmplY3Qobik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIGNvbGxlY3Rvci5hZGQoewogICAgICAgICAgICBraW5kOiBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHksCiAgICAgICAgICAgIGxhYmVsOiAiJHNjaGVtYSIsCiAgICAgICAgICAgIGluc2VydFRleHQ6IHRoaXMuZ2V0SW5zZXJ0VGV4dEZvclByb3BlcnR5KCIkc2NoZW1hIiwgdm9pZCAwLCB0cnVlLCAiIiksCiAgICAgICAgICAgIGluc2VydFRleHRGb3JtYXQ6IEluc2VydFRleHRGb3JtYXQuU25pcHBldCwKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogIiIsCiAgICAgICAgICAgIGZpbHRlclRleHQ6IHRoaXMuZ2V0RmlsdGVyVGV4dEZvclZhbHVlKCIkc2NoZW1hIikKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5nZXRTY2hlbWFMZXNzVmFsdWVDb21wbGV0aW9ucyA9IGZ1bmN0aW9uKGRvYywgbm9kZSwgb2Zmc2V0LCBkb2N1bWVudCwgY29sbGVjdG9yKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICB2YXIgb2Zmc2V0Rm9yU2VwYXJhdG9yID0gb2Zmc2V0OwogICAgICAgIGlmIChub2RlICYmIChub2RlLnR5cGUgPT09ICJzdHJpbmciIHx8IG5vZGUudHlwZSA9PT0gIm51bWJlciIgfHwgbm9kZS50eXBlID09PSAiYm9vbGVhbiIgfHwgbm9kZS50eXBlID09PSAibnVsbCIpKSB7CiAgICAgICAgICBvZmZzZXRGb3JTZXBhcmF0b3IgPSBub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoOwogICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50OwogICAgICAgIH0KICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgIGNvbGxlY3Rvci5hZGQoewogICAgICAgICAgICBraW5kOiB0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKCJvYmplY3QiKSwKICAgICAgICAgICAgbGFiZWw6ICJFbXB0eSBvYmplY3QiLAogICAgICAgICAgICBpbnNlcnRUZXh0OiB0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZSh7fSwgIiIpLAogICAgICAgICAgICBpbnNlcnRUZXh0Rm9ybWF0OiBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQsCiAgICAgICAgICAgIGRvY3VtZW50YXRpb246ICIiCiAgICAgICAgICB9KTsKICAgICAgICAgIGNvbGxlY3Rvci5hZGQoewogICAgICAgICAgICBraW5kOiB0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKCJhcnJheSIpLAogICAgICAgICAgICBsYWJlbDogIkVtcHR5IGFycmF5IiwKICAgICAgICAgICAgaW5zZXJ0VGV4dDogdGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoW10sICIiKSwKICAgICAgICAgICAgaW5zZXJ0VGV4dEZvcm1hdDogSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0LAogICAgICAgICAgICBkb2N1bWVudGF0aW9uOiAiIgogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBzZXBhcmF0b3JBZnRlciA9IHRoaXMuZXZhbHVhdGVTZXBhcmF0b3JBZnRlcihkb2N1bWVudCwgb2Zmc2V0Rm9yU2VwYXJhdG9yKTsKICAgICAgICB2YXIgY29sbGVjdFN1Z2dlc3Rpb25zRm9yVmFsdWVzID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGlmICh2YWx1ZS5wYXJlbnQgJiYgIWNvbnRhaW5zMih2YWx1ZS5wYXJlbnQsIG9mZnNldCwgdHJ1ZSkpIHsKICAgICAgICAgICAgY29sbGVjdG9yLmFkZCh7CiAgICAgICAgICAgICAga2luZDogX3RoaXMuZ2V0U3VnZ2VzdGlvbktpbmQodmFsdWUudHlwZSksCiAgICAgICAgICAgICAgbGFiZWw6IF90aGlzLmdldExhYmVsVGV4dEZvck1hdGNoaW5nTm9kZSh2YWx1ZSwgZG9jdW1lbnQpLAogICAgICAgICAgICAgIGluc2VydFRleHQ6IF90aGlzLmdldEluc2VydFRleHRGb3JNYXRjaGluZ05vZGUodmFsdWUsIGRvY3VtZW50LCBzZXBhcmF0b3JBZnRlciksCiAgICAgICAgICAgICAgaW5zZXJ0VGV4dEZvcm1hdDogSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0LAogICAgICAgICAgICAgIGRvY3VtZW50YXRpb246ICIiCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHZhbHVlLnR5cGUgPT09ICJib29sZWFuIikgewogICAgICAgICAgICBfdGhpcy5hZGRCb29sZWFuVmFsdWVDb21wbGV0aW9uKCF2YWx1ZS52YWx1ZSwgc2VwYXJhdG9yQWZ0ZXIsIGNvbGxlY3Rvcik7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBpZiAobm9kZS50eXBlID09PSAicHJvcGVydHkiKSB7CiAgICAgICAgICBpZiAob2Zmc2V0ID4gKG5vZGUuY29sb25PZmZzZXQgfHwgMCkpIHsKICAgICAgICAgICAgdmFyIHZhbHVlTm9kZSA9IG5vZGUudmFsdWVOb2RlOwogICAgICAgICAgICBpZiAodmFsdWVOb2RlICYmIChvZmZzZXQgPiB2YWx1ZU5vZGUub2Zmc2V0ICsgdmFsdWVOb2RlLmxlbmd0aCB8fCB2YWx1ZU5vZGUudHlwZSA9PT0gIm9iamVjdCIgfHwgdmFsdWVOb2RlLnR5cGUgPT09ICJhcnJheSIpKSB7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwYXJlbnRLZXlfMiA9IG5vZGUua2V5Tm9kZS52YWx1ZTsKICAgICAgICAgICAgZG9jLnZpc2l0KGZ1bmN0aW9uKG4pIHsKICAgICAgICAgICAgICBpZiAobi50eXBlID09PSAicHJvcGVydHkiICYmIG4ua2V5Tm9kZS52YWx1ZSA9PT0gcGFyZW50S2V5XzIgJiYgbi52YWx1ZU5vZGUpIHsKICAgICAgICAgICAgICAgIGNvbGxlY3RTdWdnZXN0aW9uc0ZvclZhbHVlcyhuLnZhbHVlTm9kZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKHBhcmVudEtleV8yID09PSAiJHNjaGVtYSIgJiYgbm9kZS5wYXJlbnQgJiYgIW5vZGUucGFyZW50LnBhcmVudCkgewogICAgICAgICAgICAgIHRoaXMuYWRkRG9sbGFyU2NoZW1hQ29tcGxldGlvbnMoc2VwYXJhdG9yQWZ0ZXIsIGNvbGxlY3Rvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgaWYgKG5vZGUucGFyZW50ICYmIG5vZGUucGFyZW50LnR5cGUgPT09ICJwcm9wZXJ0eSIpIHsKICAgICAgICAgICAgdmFyIHBhcmVudEtleV8zID0gbm9kZS5wYXJlbnQua2V5Tm9kZS52YWx1ZTsKICAgICAgICAgICAgZG9jLnZpc2l0KGZ1bmN0aW9uKG4pIHsKICAgICAgICAgICAgICBpZiAobi50eXBlID09PSAicHJvcGVydHkiICYmIG4ua2V5Tm9kZS52YWx1ZSA9PT0gcGFyZW50S2V5XzMgJiYgbi52YWx1ZU5vZGUgJiYgbi52YWx1ZU5vZGUudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICAgICAgbi52YWx1ZU5vZGUuaXRlbXMuZm9yRWFjaChjb2xsZWN0U3VnZ2VzdGlvbnNGb3JWYWx1ZXMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlLml0ZW1zLmZvckVhY2goY29sbGVjdFN1Z2dlc3Rpb25zRm9yVmFsdWVzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZ2V0VmFsdWVDb21wbGV0aW9ucyA9IGZ1bmN0aW9uKHNjaGVtYSwgZG9jLCBub2RlLCBvZmZzZXQsIGRvY3VtZW50LCBjb2xsZWN0b3IsIHR5cGVzKSB7CiAgICAgICAgdmFyIG9mZnNldEZvclNlcGFyYXRvciA9IG9mZnNldDsKICAgICAgICB2YXIgcGFyZW50S2V5ID0gdm9pZCAwOwogICAgICAgIHZhciB2YWx1ZU5vZGUgPSB2b2lkIDA7CiAgICAgICAgaWYgKG5vZGUgJiYgKG5vZGUudHlwZSA9PT0gInN0cmluZyIgfHwgbm9kZS50eXBlID09PSAibnVtYmVyIiB8fCBub2RlLnR5cGUgPT09ICJib29sZWFuIiB8fCBub2RlLnR5cGUgPT09ICJudWxsIikpIHsKICAgICAgICAgIG9mZnNldEZvclNlcGFyYXRvciA9IG5vZGUub2Zmc2V0ICsgbm9kZS5sZW5ndGg7CiAgICAgICAgICB2YWx1ZU5vZGUgPSBub2RlOwogICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50OwogICAgICAgIH0KICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgIHRoaXMuYWRkU2NoZW1hVmFsdWVDb21wbGV0aW9ucyhzY2hlbWEuc2NoZW1hLCAiIiwgY29sbGVjdG9yLCB0eXBlcyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChub2RlLnR5cGUgPT09ICJwcm9wZXJ0eSIgJiYgb2Zmc2V0ID4gKG5vZGUuY29sb25PZmZzZXQgfHwgMCkpIHsKICAgICAgICAgIHZhciB2YWx1ZU5vZGVfMSA9IG5vZGUudmFsdWVOb2RlOwogICAgICAgICAgaWYgKHZhbHVlTm9kZV8xICYmIG9mZnNldCA+IHZhbHVlTm9kZV8xLm9mZnNldCArIHZhbHVlTm9kZV8xLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBwYXJlbnRLZXkgPSBub2RlLmtleU5vZGUudmFsdWU7CiAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnQ7CiAgICAgICAgfQogICAgICAgIGlmIChub2RlICYmIChwYXJlbnRLZXkgIT09IHZvaWQgMCB8fCBub2RlLnR5cGUgPT09ICJhcnJheSIpKSB7CiAgICAgICAgICB2YXIgc2VwYXJhdG9yQWZ0ZXIgPSB0aGlzLmV2YWx1YXRlU2VwYXJhdG9yQWZ0ZXIoZG9jdW1lbnQsIG9mZnNldEZvclNlcGFyYXRvcik7CiAgICAgICAgICB2YXIgbWF0Y2hpbmdTY2hlbWFzID0gZG9jLmdldE1hdGNoaW5nU2NoZW1hcyhzY2hlbWEuc2NoZW1hLCBub2RlLm9mZnNldCwgdmFsdWVOb2RlKTsKICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgbWF0Y2hpbmdTY2hlbWFzXzEgPSBtYXRjaGluZ1NjaGVtYXM7IF9pIDwgbWF0Y2hpbmdTY2hlbWFzXzEubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgIHZhciBzID0gbWF0Y2hpbmdTY2hlbWFzXzFbX2ldOwogICAgICAgICAgICBpZiAocy5ub2RlID09PSBub2RlICYmICFzLmludmVydGVkICYmIHMuc2NoZW1hKSB7CiAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gImFycmF5IiAmJiBzLnNjaGVtYS5pdGVtcykgewogICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocy5zY2hlbWEuaXRlbXMpKSB7CiAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IHRoaXMuZmluZEl0ZW1BdE9mZnNldChub2RlLCBkb2N1bWVudCwgb2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgcy5zY2hlbWEuaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKHMuc2NoZW1hLml0ZW1zW2luZGV4XSwgc2VwYXJhdG9yQWZ0ZXIsIGNvbGxlY3RvciwgdHlwZXMpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICB0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMocy5zY2hlbWEuaXRlbXMsIHNlcGFyYXRvckFmdGVyLCBjb2xsZWN0b3IsIHR5cGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHBhcmVudEtleSAhPT0gdm9pZCAwKSB7CiAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlNYXRjaGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAocy5zY2hlbWEucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBzLnNjaGVtYS5wcm9wZXJ0aWVzW3BhcmVudEtleV07CiAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eVNjaGVtYSkgewogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWF0Y2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKHByb3BlcnR5U2NoZW1hLCBzZXBhcmF0b3JBZnRlciwgY29sbGVjdG9yLCB0eXBlcyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzLnNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyAmJiAhcHJvcGVydHlNYXRjaGVkKSB7CiAgICAgICAgICAgICAgICAgIGZvciAodmFyIF9hID0gMCwgX2IgPSBPYmplY3Qua2V5cyhzLnNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyk7IF9hIDwgX2IubGVuZ3RoOyBfYSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhdHRlcm4gPSBfYltfYV07CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZ2V4ID0gZXh0ZW5kZWRSZWdFeHAocGF0dGVybik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZ2V4ID09PSBudWxsIHx8IHJlZ2V4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiByZWdleC50ZXN0KHBhcmVudEtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWF0Y2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcGVydHlTY2hlbWEgPSBzLnNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1twYXR0ZXJuXTsKICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU2NoZW1hVmFsdWVDb21wbGV0aW9ucyhwcm9wZXJ0eVNjaGVtYSwgc2VwYXJhdG9yQWZ0ZXIsIGNvbGxlY3RvciwgdHlwZXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHMuc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzICYmICFwcm9wZXJ0eU1hdGNoZWQpIHsKICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5U2NoZW1hID0gcy5zY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXM7CiAgICAgICAgICAgICAgICAgIHRoaXMuYWRkU2NoZW1hVmFsdWVDb21wbGV0aW9ucyhwcm9wZXJ0eVNjaGVtYSwgc2VwYXJhdG9yQWZ0ZXIsIGNvbGxlY3RvciwgdHlwZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHBhcmVudEtleSA9PT0gIiRzY2hlbWEiICYmICFub2RlLnBhcmVudCkgewogICAgICAgICAgICB0aGlzLmFkZERvbGxhclNjaGVtYUNvbXBsZXRpb25zKHNlcGFyYXRvckFmdGVyLCBjb2xsZWN0b3IpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVzWyJib29sZWFuIl0pIHsKICAgICAgICAgICAgdGhpcy5hZGRCb29sZWFuVmFsdWVDb21wbGV0aW9uKHRydWUsIHNlcGFyYXRvckFmdGVyLCBjb2xsZWN0b3IpOwogICAgICAgICAgICB0aGlzLmFkZEJvb2xlYW5WYWx1ZUNvbXBsZXRpb24oZmFsc2UsIHNlcGFyYXRvckFmdGVyLCBjb2xsZWN0b3IpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVzWyJudWxsIl0pIHsKICAgICAgICAgICAgdGhpcy5hZGROdWxsVmFsdWVDb21wbGV0aW9uKHNlcGFyYXRvckFmdGVyLCBjb2xsZWN0b3IpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5nZXRDb250cmlidXRlZFZhbHVlQ29tcGxldGlvbnMgPSBmdW5jdGlvbihkb2MsIG5vZGUsIG9mZnNldCwgZG9jdW1lbnQsIGNvbGxlY3RvciwgY29sbGVjdGlvblByb21pc2VzKSB7CiAgICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgICB0aGlzLmNvbnRyaWJ1dGlvbnMuZm9yRWFjaChmdW5jdGlvbihjb250cmlidXRpb24pIHsKICAgICAgICAgICAgdmFyIGNvbGxlY3RQcm9taXNlID0gY29udHJpYnV0aW9uLmNvbGxlY3REZWZhdWx0Q29tcGxldGlvbnMoZG9jdW1lbnQudXJpLCBjb2xsZWN0b3IpOwogICAgICAgICAgICBpZiAoY29sbGVjdFByb21pc2UpIHsKICAgICAgICAgICAgICBjb2xsZWN0aW9uUHJvbWlzZXMucHVzaChjb2xsZWN0UHJvbWlzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAic3RyaW5nIiB8fCBub2RlLnR5cGUgPT09ICJudW1iZXIiIHx8IG5vZGUudHlwZSA9PT0gImJvb2xlYW4iIHx8IG5vZGUudHlwZSA9PT0gIm51bGwiKSB7CiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChub2RlICYmIG5vZGUudHlwZSA9PT0gInByb3BlcnR5IiAmJiBvZmZzZXQgPiAobm9kZS5jb2xvbk9mZnNldCB8fCAwKSkgewogICAgICAgICAgICB2YXIgcGFyZW50S2V5XzQgPSBub2RlLmtleU5vZGUudmFsdWU7CiAgICAgICAgICAgIHZhciB2YWx1ZU5vZGUgPSBub2RlLnZhbHVlTm9kZTsKICAgICAgICAgICAgaWYgKCghdmFsdWVOb2RlIHx8IG9mZnNldCA8PSB2YWx1ZU5vZGUub2Zmc2V0ICsgdmFsdWVOb2RlLmxlbmd0aCkgJiYgbm9kZS5wYXJlbnQpIHsKICAgICAgICAgICAgICB2YXIgbG9jYXRpb25fMiA9IGdldE5vZGVQYXRoMyhub2RlLnBhcmVudCk7CiAgICAgICAgICAgICAgdGhpcy5jb250cmlidXRpb25zLmZvckVhY2goZnVuY3Rpb24oY29udHJpYnV0aW9uKSB7CiAgICAgICAgICAgICAgICB2YXIgY29sbGVjdFByb21pc2UgPSBjb250cmlidXRpb24uY29sbGVjdFZhbHVlQ29tcGxldGlvbnMoZG9jdW1lbnQudXJpLCBsb2NhdGlvbl8yLCBwYXJlbnRLZXlfNCwgY29sbGVjdG9yKTsKICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0UHJvbWlzZSkgewogICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uUHJvbWlzZXMucHVzaChjb2xsZWN0UHJvbWlzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuYWRkU2NoZW1hVmFsdWVDb21wbGV0aW9ucyA9IGZ1bmN0aW9uKHNjaGVtYSwgc2VwYXJhdG9yQWZ0ZXIsIGNvbGxlY3RvciwgdHlwZXMpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSAib2JqZWN0IikgewogICAgICAgICAgdGhpcy5hZGRFbnVtVmFsdWVDb21wbGV0aW9ucyhzY2hlbWEsIHNlcGFyYXRvckFmdGVyLCBjb2xsZWN0b3IpOwogICAgICAgICAgdGhpcy5hZGREZWZhdWx0VmFsdWVDb21wbGV0aW9ucyhzY2hlbWEsIHNlcGFyYXRvckFmdGVyLCBjb2xsZWN0b3IpOwogICAgICAgICAgdGhpcy5jb2xsZWN0VHlwZXMoc2NoZW1hLCB0eXBlcyk7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuYWxsT2YpKSB7CiAgICAgICAgICAgIHNjaGVtYS5hbGxPZi5mb3JFYWNoKGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuYWRkU2NoZW1hVmFsdWVDb21wbGV0aW9ucyhzLCBzZXBhcmF0b3JBZnRlciwgY29sbGVjdG9yLCB0eXBlcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmFueU9mKSkgewogICAgICAgICAgICBzY2hlbWEuYW55T2YuZm9yRWFjaChmdW5jdGlvbihzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMocywgc2VwYXJhdG9yQWZ0ZXIsIGNvbGxlY3RvciwgdHlwZXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHNjaGVtYS5vbmVPZikpIHsKICAgICAgICAgICAgc2NoZW1hLm9uZU9mLmZvckVhY2goZnVuY3Rpb24ocykgewogICAgICAgICAgICAgIHJldHVybiBfdGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKHMsIHNlcGFyYXRvckFmdGVyLCBjb2xsZWN0b3IsIHR5cGVzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBKU09OQ29tcGxldGlvbjIucHJvdG90eXBlLmFkZERlZmF1bHRWYWx1ZUNvbXBsZXRpb25zID0gZnVuY3Rpb24oc2NoZW1hLCBzZXBhcmF0b3JBZnRlciwgY29sbGVjdG9yLCBhcnJheURlcHRoKSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAoYXJyYXlEZXB0aCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBhcnJheURlcHRoID0gMDsKICAgICAgICB9CiAgICAgICAgdmFyIGhhc1Byb3Bvc2FscyA9IGZhbHNlOwogICAgICAgIGlmIChpc0RlZmluZWQoc2NoZW1hLmRlZmF1bHQpKSB7CiAgICAgICAgICB2YXIgdHlwZSA9IHNjaGVtYS50eXBlOwogICAgICAgICAgdmFyIHZhbHVlID0gc2NoZW1hLmRlZmF1bHQ7CiAgICAgICAgICBmb3IgKHZhciBpID0gYXJyYXlEZXB0aDsgaSA+IDA7IGktLSkgewogICAgICAgICAgICB2YWx1ZSA9IFt2YWx1ZV07CiAgICAgICAgICAgIHR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgfQogICAgICAgICAgY29sbGVjdG9yLmFkZCh7CiAgICAgICAgICAgIGtpbmQ6IHRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQodHlwZSksCiAgICAgICAgICAgIGxhYmVsOiB0aGlzLmdldExhYmVsRm9yVmFsdWUodmFsdWUpLAogICAgICAgICAgICBpbnNlcnRUZXh0OiB0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZSh2YWx1ZSwgc2VwYXJhdG9yQWZ0ZXIpLAogICAgICAgICAgICBpbnNlcnRUZXh0Rm9ybWF0OiBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQsCiAgICAgICAgICAgIGRldGFpbDogbG9jYWxpemUzKCJqc29uLnN1Z2dlc3QuZGVmYXVsdCIsICJEZWZhdWx0IHZhbHVlIikKICAgICAgICAgIH0pOwogICAgICAgICAgaGFzUHJvcG9zYWxzID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmV4YW1wbGVzKSkgewogICAgICAgICAgc2NoZW1hLmV4YW1wbGVzLmZvckVhY2goZnVuY3Rpb24oZXhhbXBsZSkgewogICAgICAgICAgICB2YXIgdHlwZTIgPSBzY2hlbWEudHlwZTsKICAgICAgICAgICAgdmFyIHZhbHVlMiA9IGV4YW1wbGU7CiAgICAgICAgICAgIGZvciAodmFyIGkyID0gYXJyYXlEZXB0aDsgaTIgPiAwOyBpMi0tKSB7CiAgICAgICAgICAgICAgdmFsdWUyID0gW3ZhbHVlMl07CiAgICAgICAgICAgICAgdHlwZTIgPSAiYXJyYXkiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbGxlY3Rvci5hZGQoewogICAgICAgICAgICAgIGtpbmQ6IF90aGlzLmdldFN1Z2dlc3Rpb25LaW5kKHR5cGUyKSwKICAgICAgICAgICAgICBsYWJlbDogX3RoaXMuZ2V0TGFiZWxGb3JWYWx1ZSh2YWx1ZTIpLAogICAgICAgICAgICAgIGluc2VydFRleHQ6IF90aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZSh2YWx1ZTIsIHNlcGFyYXRvckFmdGVyKSwKICAgICAgICAgICAgICBpbnNlcnRUZXh0Rm9ybWF0OiBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGhhc1Byb3Bvc2FscyA9IHRydWU7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmRlZmF1bHRTbmlwcGV0cykpIHsKICAgICAgICAgIHNjaGVtYS5kZWZhdWx0U25pcHBldHMuZm9yRWFjaChmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHZhciB0eXBlMiA9IHNjaGVtYS50eXBlOwogICAgICAgICAgICB2YXIgdmFsdWUyID0gcy5ib2R5OwogICAgICAgICAgICB2YXIgbGFiZWwgPSBzLmxhYmVsOwogICAgICAgICAgICB2YXIgaW5zZXJ0VGV4dDsKICAgICAgICAgICAgdmFyIGZpbHRlclRleHQ7CiAgICAgICAgICAgIGlmIChpc0RlZmluZWQodmFsdWUyKSkgewogICAgICAgICAgICAgIHNjaGVtYS50eXBlOwogICAgICAgICAgICAgIGZvciAodmFyIGkyID0gYXJyYXlEZXB0aDsgaTIgPiAwOyBpMi0tKSB7CiAgICAgICAgICAgICAgICB2YWx1ZTIgPSBbdmFsdWUyXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaW5zZXJ0VGV4dCA9IF90aGlzLmdldEluc2VydFRleHRGb3JTbmlwcGV0VmFsdWUodmFsdWUyLCBzZXBhcmF0b3JBZnRlcik7CiAgICAgICAgICAgICAgZmlsdGVyVGV4dCA9IF90aGlzLmdldEZpbHRlclRleHRGb3JTbmlwcGV0VmFsdWUodmFsdWUyKTsKICAgICAgICAgICAgICBsYWJlbCA9IGxhYmVsIHx8IF90aGlzLmdldExhYmVsRm9yU25pcHBldFZhbHVlKHZhbHVlMik7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHMuYm9keVRleHQgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgICAgdmFyIHByZWZpeCA9ICIiLCBzdWZmaXggPSAiIiwgaW5kZW50ID0gIiI7CiAgICAgICAgICAgICAgZm9yICh2YXIgaTIgPSBhcnJheURlcHRoOyBpMiA+IDA7IGkyLS0pIHsKICAgICAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeCArIGluZGVudCArICJbXG4iOwogICAgICAgICAgICAgICAgc3VmZml4ID0gc3VmZml4ICsgIlxuIiArIGluZGVudCArICJdIjsKICAgICAgICAgICAgICAgIGluZGVudCArPSAiCSI7CiAgICAgICAgICAgICAgICB0eXBlMiA9ICJhcnJheSI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGluc2VydFRleHQgPSBwcmVmaXggKyBpbmRlbnQgKyBzLmJvZHlUZXh0LnNwbGl0KCJcbiIpLmpvaW4oIlxuIiArIGluZGVudCkgKyBzdWZmaXggKyBzZXBhcmF0b3JBZnRlcjsKICAgICAgICAgICAgICBsYWJlbCA9IGxhYmVsIHx8IGluc2VydFRleHQsIGZpbHRlclRleHQgPSBpbnNlcnRUZXh0LnJlcGxhY2UoL1tcbl0vZywgIiIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb2xsZWN0b3IuYWRkKHsKICAgICAgICAgICAgICBraW5kOiBfdGhpcy5nZXRTdWdnZXN0aW9uS2luZCh0eXBlMiksCiAgICAgICAgICAgICAgbGFiZWwsCiAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogX3RoaXMuZnJvbU1hcmt1cChzLm1hcmtkb3duRGVzY3JpcHRpb24pIHx8IHMuZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgaW5zZXJ0VGV4dCwKICAgICAgICAgICAgICBpbnNlcnRUZXh0Rm9ybWF0OiBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQsCiAgICAgICAgICAgICAgZmlsdGVyVGV4dAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaGFzUHJvcG9zYWxzID0gdHJ1ZTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBpZiAoIWhhc1Byb3Bvc2FscyAmJiB0eXBlb2Ygc2NoZW1hLml0ZW1zID09PSAib2JqZWN0IiAmJiAhQXJyYXkuaXNBcnJheShzY2hlbWEuaXRlbXMpICYmIGFycmF5RGVwdGggPCA1KSB7CiAgICAgICAgICB0aGlzLmFkZERlZmF1bHRWYWx1ZUNvbXBsZXRpb25zKHNjaGVtYS5pdGVtcywgc2VwYXJhdG9yQWZ0ZXIsIGNvbGxlY3RvciwgYXJyYXlEZXB0aCArIDEpOwogICAgICAgIH0KICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5hZGRFbnVtVmFsdWVDb21wbGV0aW9ucyA9IGZ1bmN0aW9uKHNjaGVtYSwgc2VwYXJhdG9yQWZ0ZXIsIGNvbGxlY3RvcikgewogICAgICAgIGlmIChpc0RlZmluZWQoc2NoZW1hLmNvbnN0KSkgewogICAgICAgICAgY29sbGVjdG9yLmFkZCh7CiAgICAgICAgICAgIGtpbmQ6IHRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoc2NoZW1hLnR5cGUpLAogICAgICAgICAgICBsYWJlbDogdGhpcy5nZXRMYWJlbEZvclZhbHVlKHNjaGVtYS5jb25zdCksCiAgICAgICAgICAgIGluc2VydFRleHQ6IHRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKHNjaGVtYS5jb25zdCwgc2VwYXJhdG9yQWZ0ZXIpLAogICAgICAgICAgICBpbnNlcnRUZXh0Rm9ybWF0OiBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQsCiAgICAgICAgICAgIGRvY3VtZW50YXRpb246IHRoaXMuZnJvbU1hcmt1cChzY2hlbWEubWFya2Rvd25EZXNjcmlwdGlvbikgfHwgc2NoZW1hLmRlc2NyaXB0aW9uCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmVudW0pKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gc2NoZW1hLmVudW0ubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGVubSA9IHNjaGVtYS5lbnVtW2ldOwogICAgICAgICAgICB2YXIgZG9jdW1lbnRhdGlvbiA9IHRoaXMuZnJvbU1hcmt1cChzY2hlbWEubWFya2Rvd25EZXNjcmlwdGlvbikgfHwgc2NoZW1hLmRlc2NyaXB0aW9uOwogICAgICAgICAgICBpZiAoc2NoZW1hLm1hcmtkb3duRW51bURlc2NyaXB0aW9ucyAmJiBpIDwgc2NoZW1hLm1hcmtkb3duRW51bURlc2NyaXB0aW9ucy5sZW5ndGggJiYgdGhpcy5kb2VzU3VwcG9ydE1hcmtkb3duKCkpIHsKICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uID0gdGhpcy5mcm9tTWFya3VwKHNjaGVtYS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnNbaV0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYS5lbnVtRGVzY3JpcHRpb25zICYmIGkgPCBzY2hlbWEuZW51bURlc2NyaXB0aW9ucy5sZW5ndGgpIHsKICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uID0gc2NoZW1hLmVudW1EZXNjcmlwdGlvbnNbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29sbGVjdG9yLmFkZCh7CiAgICAgICAgICAgICAga2luZDogdGhpcy5nZXRTdWdnZXN0aW9uS2luZChzY2hlbWEudHlwZSksCiAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuZ2V0TGFiZWxGb3JWYWx1ZShlbm0pLAogICAgICAgICAgICAgIGluc2VydFRleHQ6IHRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKGVubSwgc2VwYXJhdG9yQWZ0ZXIpLAogICAgICAgICAgICAgIGluc2VydFRleHRGb3JtYXQ6IEluc2VydFRleHRGb3JtYXQuU25pcHBldCwKICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5jb2xsZWN0VHlwZXMgPSBmdW5jdGlvbihzY2hlbWEsIHR5cGVzKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hLmVudW0pIHx8IGlzRGVmaW5lZChzY2hlbWEuY29uc3QpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciB0eXBlID0gc2NoZW1hLnR5cGU7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodHlwZSkpIHsKICAgICAgICAgIHR5cGUuZm9yRWFjaChmdW5jdGlvbih0KSB7CiAgICAgICAgICAgIHJldHVybiB0eXBlc1t0XSA9IHRydWU7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUpIHsKICAgICAgICAgIHR5cGVzW3R5cGVdID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuYWRkRmlsbGVyVmFsdWVDb21wbGV0aW9ucyA9IGZ1bmN0aW9uKHR5cGVzLCBzZXBhcmF0b3JBZnRlciwgY29sbGVjdG9yKSB7CiAgICAgICAgaWYgKHR5cGVzWyJvYmplY3QiXSkgewogICAgICAgICAgY29sbGVjdG9yLmFkZCh7CiAgICAgICAgICAgIGtpbmQ6IHRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoIm9iamVjdCIpLAogICAgICAgICAgICBsYWJlbDogInt9IiwKICAgICAgICAgICAgaW5zZXJ0VGV4dDogdGhpcy5nZXRJbnNlcnRUZXh0Rm9yR3Vlc3NlZFZhbHVlKHt9LCBzZXBhcmF0b3JBZnRlciksCiAgICAgICAgICAgIGluc2VydFRleHRGb3JtYXQ6IEluc2VydFRleHRGb3JtYXQuU25pcHBldCwKICAgICAgICAgICAgZGV0YWlsOiBsb2NhbGl6ZTMoImRlZmF1bHRzLm9iamVjdCIsICJOZXcgb2JqZWN0IiksCiAgICAgICAgICAgIGRvY3VtZW50YXRpb246ICIiCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVzWyJhcnJheSJdKSB7CiAgICAgICAgICBjb2xsZWN0b3IuYWRkKHsKICAgICAgICAgICAga2luZDogdGhpcy5nZXRTdWdnZXN0aW9uS2luZCgiYXJyYXkiKSwKICAgICAgICAgICAgbGFiZWw6ICJbXSIsCiAgICAgICAgICAgIGluc2VydFRleHQ6IHRoaXMuZ2V0SW5zZXJ0VGV4dEZvckd1ZXNzZWRWYWx1ZShbXSwgc2VwYXJhdG9yQWZ0ZXIpLAogICAgICAgICAgICBpbnNlcnRUZXh0Rm9ybWF0OiBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQsCiAgICAgICAgICAgIGRldGFpbDogbG9jYWxpemUzKCJkZWZhdWx0cy5hcnJheSIsICJOZXcgYXJyYXkiKSwKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogIiIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5hZGRCb29sZWFuVmFsdWVDb21wbGV0aW9uID0gZnVuY3Rpb24odmFsdWUsIHNlcGFyYXRvckFmdGVyLCBjb2xsZWN0b3IpIHsKICAgICAgICBjb2xsZWN0b3IuYWRkKHsKICAgICAgICAgIGtpbmQ6IHRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoImJvb2xlYW4iKSwKICAgICAgICAgIGxhYmVsOiB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIsCiAgICAgICAgICBpbnNlcnRUZXh0OiB0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZSh2YWx1ZSwgc2VwYXJhdG9yQWZ0ZXIpLAogICAgICAgICAgaW5zZXJ0VGV4dEZvcm1hdDogSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0LAogICAgICAgICAgZG9jdW1lbnRhdGlvbjogIiIKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5hZGROdWxsVmFsdWVDb21wbGV0aW9uID0gZnVuY3Rpb24oc2VwYXJhdG9yQWZ0ZXIsIGNvbGxlY3RvcikgewogICAgICAgIGNvbGxlY3Rvci5hZGQoewogICAgICAgICAga2luZDogdGhpcy5nZXRTdWdnZXN0aW9uS2luZCgibnVsbCIpLAogICAgICAgICAgbGFiZWw6ICJudWxsIiwKICAgICAgICAgIGluc2VydFRleHQ6ICJudWxsIiArIHNlcGFyYXRvckFmdGVyLAogICAgICAgICAgaW5zZXJ0VGV4dEZvcm1hdDogSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0LAogICAgICAgICAgZG9jdW1lbnRhdGlvbjogIiIKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5hZGREb2xsYXJTY2hlbWFDb21wbGV0aW9ucyA9IGZ1bmN0aW9uKHNlcGFyYXRvckFmdGVyLCBjb2xsZWN0b3IpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHZhciBzY2hlbWFJZHMgPSB0aGlzLnNjaGVtYVNlcnZpY2UuZ2V0UmVnaXN0ZXJlZFNjaGVtYUlkcyhmdW5jdGlvbihzY2hlbWEpIHsKICAgICAgICAgIHJldHVybiBzY2hlbWEgPT09ICJodHRwIiB8fCBzY2hlbWEgPT09ICJodHRwcyI7CiAgICAgICAgfSk7CiAgICAgICAgc2NoZW1hSWRzLmZvckVhY2goZnVuY3Rpb24oc2NoZW1hSWQpIHsKICAgICAgICAgIHJldHVybiBjb2xsZWN0b3IuYWRkKHsKICAgICAgICAgICAga2luZDogQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZSwKICAgICAgICAgICAgbGFiZWw6IF90aGlzLmdldExhYmVsRm9yVmFsdWUoc2NoZW1hSWQpLAogICAgICAgICAgICBmaWx0ZXJUZXh0OiBfdGhpcy5nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUoc2NoZW1hSWQpLAogICAgICAgICAgICBpbnNlcnRUZXh0OiBfdGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoc2NoZW1hSWQsIHNlcGFyYXRvckFmdGVyKSwKICAgICAgICAgICAgaW5zZXJ0VGV4dEZvcm1hdDogSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0LAogICAgICAgICAgICBkb2N1bWVudGF0aW9uOiAiIgogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZ2V0TGFiZWxGb3JWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTsKICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZ2V0RmlsdGVyVGV4dEZvclNuaXBwZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9cJFx7XGQrOihbXn1dKylcfXxcJFxkKy9nLCAiJDEiKTsKICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5nZXRMYWJlbEZvclNuaXBwZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFyIGxhYmVsID0gSlNPTi5zdHJpbmdpZnkodmFsdWUpOwogICAgICAgIHJldHVybiBsYWJlbC5yZXBsYWNlKC9cJFx7XGQrOihbXn1dKylcfXxcJFxkKy9nLCAiJDEiKTsKICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5nZXRJbnNlcnRUZXh0Rm9yUGxhaW5UZXh0ID0gZnVuY3Rpb24odGV4dCkgewogICAgICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1tcXFwkXH1dL2csICJcXCQmIik7CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlID0gZnVuY3Rpb24odmFsdWUsIHNlcGFyYXRvckFmdGVyKSB7CiAgICAgICAgdmFyIHRleHQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSwgbnVsbCwgIgkiKTsKICAgICAgICBpZiAodGV4dCA9PT0gInt9IikgewogICAgICAgICAgcmV0dXJuICJ7JDF9IiArIHNlcGFyYXRvckFmdGVyOwogICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PT0gIltdIikgewogICAgICAgICAgcmV0dXJuICJbJDFdIiArIHNlcGFyYXRvckFmdGVyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yUGxhaW5UZXh0KHRleHQgKyBzZXBhcmF0b3JBZnRlcik7CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZ2V0SW5zZXJ0VGV4dEZvclNuaXBwZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlLCBzZXBhcmF0b3JBZnRlcikgewogICAgICAgIHZhciByZXBsYWNlciA9IGZ1bmN0aW9uKHZhbHVlMikgewogICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZTIgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZTJbMF0gPT09ICJeIikgewogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTIuc3Vic3RyKDEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUyKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBzdHJpbmdpZnlPYmplY3QodmFsdWUsICIiLCByZXBsYWNlcikgKyBzZXBhcmF0b3JBZnRlcjsKICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5nZXRJbnNlcnRUZXh0Rm9yR3Vlc3NlZFZhbHVlID0gZnVuY3Rpb24odmFsdWUsIHNlcGFyYXRvckFmdGVyKSB7CiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKICAgICAgICAgIGNhc2UgIm9iamVjdCI6CiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgIHJldHVybiAiJHsxOm51bGx9IiArIHNlcGFyYXRvckFmdGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZSh2YWx1ZSwgc2VwYXJhdG9yQWZ0ZXIpOwogICAgICAgICAgY2FzZSAic3RyaW5nIjoKICAgICAgICAgICAgdmFyIHNuaXBwZXRWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTsKICAgICAgICAgICAgc25pcHBldFZhbHVlID0gc25pcHBldFZhbHVlLnN1YnN0cigxLCBzbmlwcGV0VmFsdWUubGVuZ3RoIC0gMik7CiAgICAgICAgICAgIHNuaXBwZXRWYWx1ZSA9IHRoaXMuZ2V0SW5zZXJ0VGV4dEZvclBsYWluVGV4dChzbmlwcGV0VmFsdWUpOwogICAgICAgICAgICByZXR1cm4gJyIkezE6JyArIHNuaXBwZXRWYWx1ZSArICd9IicgKyBzZXBhcmF0b3JBZnRlcjsKICAgICAgICAgIGNhc2UgIm51bWJlciI6CiAgICAgICAgICBjYXNlICJib29sZWFuIjoKICAgICAgICAgICAgcmV0dXJuICIkezE6IiArIEpTT04uc3RyaW5naWZ5KHZhbHVlKSArICJ9IiArIHNlcGFyYXRvckFmdGVyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUodmFsdWUsIHNlcGFyYXRvckFmdGVyKTsKICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5nZXRTdWdnZXN0aW9uS2luZCA9IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0eXBlKSkgewogICAgICAgICAgdmFyIGFycmF5ID0gdHlwZTsKICAgICAgICAgIHR5cGUgPSBhcnJheS5sZW5ndGggPiAwID8gYXJyYXlbMF0gOiB2b2lkIDA7CiAgICAgICAgfQogICAgICAgIGlmICghdHlwZSkgewogICAgICAgICAgcmV0dXJuIENvbXBsZXRpb25JdGVtS2luZC5WYWx1ZTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgICByZXR1cm4gQ29tcGxldGlvbkl0ZW1LaW5kLlZhbHVlOwogICAgICAgICAgY2FzZSAib2JqZWN0IjoKICAgICAgICAgICAgcmV0dXJuIENvbXBsZXRpb25JdGVtS2luZC5Nb2R1bGU7CiAgICAgICAgICBjYXNlICJwcm9wZXJ0eSI6CiAgICAgICAgICAgIHJldHVybiBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXR1cm4gQ29tcGxldGlvbkl0ZW1LaW5kLlZhbHVlOwogICAgICAgIH0KICAgICAgfTsKICAgICAgSlNPTkNvbXBsZXRpb24yLnByb3RvdHlwZS5nZXRMYWJlbFRleHRGb3JNYXRjaGluZ05vZGUgPSBmdW5jdGlvbihub2RlLCBkb2N1bWVudCkgewogICAgICAgIHN3aXRjaCAobm9kZS50eXBlKSB7CiAgICAgICAgICBjYXNlICJhcnJheSI6CiAgICAgICAgICAgIHJldHVybiAiW10iOwogICAgICAgICAgY2FzZSAib2JqZWN0IjoKICAgICAgICAgICAgcmV0dXJuICJ7fSI7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB2YXIgY29udGVudCA9IGRvY3VtZW50LmdldFRleHQoKS5zdWJzdHIobm9kZS5vZmZzZXQsIG5vZGUubGVuZ3RoKTsKICAgICAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CiAgICAgICAgfQogICAgICB9OwogICAgICBKU09OQ29tcGxldGlvbjIucHJvdG90eXBlLmdldEluc2VydFRleHRGb3JNYXRjaGluZ05vZGUgPSBmdW5jdGlvbihub2RlLCBkb2N1bWVudCwgc2VwYXJhdG9yQWZ0ZXIpIHsKICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkgewogICAgICAgICAgY2FzZSAiYXJyYXkiOgogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoW10sIHNlcGFyYXRvckFmdGVyKTsKICAgICAgICAgIGNhc2UgIm9iamVjdCI6CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZSh7fSwgc2VwYXJhdG9yQWZ0ZXIpOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5nZXRUZXh0KCkuc3Vic3RyKG5vZGUub2Zmc2V0LCBub2RlLmxlbmd0aCkgKyBzZXBhcmF0b3JBZnRlcjsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0SW5zZXJ0VGV4dEZvclBsYWluVGV4dChjb250ZW50KTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZ2V0SW5zZXJ0VGV4dEZvclByb3BlcnR5ID0gZnVuY3Rpb24oa2V5LCBwcm9wZXJ0eVNjaGVtYSwgYWRkVmFsdWUsIHNlcGFyYXRvckFmdGVyKSB7CiAgICAgICAgdmFyIHByb3BlcnR5VGV4dCA9IHRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKGtleSwgIiIpOwogICAgICAgIGlmICghYWRkVmFsdWUpIHsKICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVRleHQ7CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHRUZXh0ID0gcHJvcGVydHlUZXh0ICsgIjogIjsKICAgICAgICB2YXIgdmFsdWU7CiAgICAgICAgdmFyIG5WYWx1ZVByb3Bvc2FscyA9IDA7CiAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0eVNjaGVtYS5kZWZhdWx0U25pcHBldHMpKSB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eVNjaGVtYS5kZWZhdWx0U25pcHBldHMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgdmFyIGJvZHkgPSBwcm9wZXJ0eVNjaGVtYS5kZWZhdWx0U25pcHBldHNbMF0uYm9keTsKICAgICAgICAgICAgICBpZiAoaXNEZWZpbmVkKGJvZHkpKSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0SW5zZXJ0VGV4dEZvclNuaXBwZXRWYWx1ZShib2R5LCAiIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5WYWx1ZVByb3Bvc2FscyArPSBwcm9wZXJ0eVNjaGVtYS5kZWZhdWx0U25pcHBldHMubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHByb3BlcnR5U2NoZW1hLmVudW0pIHsKICAgICAgICAgICAgaWYgKCF2YWx1ZSAmJiBwcm9wZXJ0eVNjaGVtYS5lbnVtLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yR3Vlc3NlZFZhbHVlKHByb3BlcnR5U2NoZW1hLmVudW1bMF0sICIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuVmFsdWVQcm9wb3NhbHMgKz0gcHJvcGVydHlTY2hlbWEuZW51bS5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNEZWZpbmVkKHByb3BlcnR5U2NoZW1hLmRlZmF1bHQpKSB7CiAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0SW5zZXJ0VGV4dEZvckd1ZXNzZWRWYWx1ZShwcm9wZXJ0eVNjaGVtYS5kZWZhdWx0LCAiIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgblZhbHVlUHJvcG9zYWxzKys7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm9wZXJ0eVNjaGVtYS5leGFtcGxlcykgJiYgcHJvcGVydHlTY2hlbWEuZXhhbXBsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuZ2V0SW5zZXJ0VGV4dEZvckd1ZXNzZWRWYWx1ZShwcm9wZXJ0eVNjaGVtYS5leGFtcGxlc1swXSwgIiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5WYWx1ZVByb3Bvc2FscyArPSBwcm9wZXJ0eVNjaGVtYS5leGFtcGxlcy5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoblZhbHVlUHJvcG9zYWxzID09PSAwKSB7CiAgICAgICAgICAgIHZhciB0eXBlID0gQXJyYXkuaXNBcnJheShwcm9wZXJ0eVNjaGVtYS50eXBlKSA/IHByb3BlcnR5U2NoZW1hLnR5cGVbMF0gOiBwcm9wZXJ0eVNjaGVtYS50eXBlOwogICAgICAgICAgICBpZiAoIXR5cGUpIHsKICAgICAgICAgICAgICBpZiAocHJvcGVydHlTY2hlbWEucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgdHlwZSA9ICJvYmplY3QiOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHlTY2hlbWEuaXRlbXMpIHsKICAgICAgICAgICAgICAgIHR5cGUgPSAiYXJyYXkiOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgICBjYXNlICJib29sZWFuIjoKICAgICAgICAgICAgICAgIHZhbHVlID0gIiQxIjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgInN0cmluZyI6CiAgICAgICAgICAgICAgICB2YWx1ZSA9ICciJDEiJzsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgIm9iamVjdCI6CiAgICAgICAgICAgICAgICB2YWx1ZSA9ICJ7JDF9IjsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgImFycmF5IjoKICAgICAgICAgICAgICAgIHZhbHVlID0gIlskMV0iOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgY2FzZSAibnVtYmVyIjoKICAgICAgICAgICAgICBjYXNlICJpbnRlZ2VyIjoKICAgICAgICAgICAgICAgIHZhbHVlID0gIiR7MTowfSI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBjYXNlICJudWxsIjoKICAgICAgICAgICAgICAgIHZhbHVlID0gIiR7MTpudWxsfSI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5VGV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIXZhbHVlIHx8IG5WYWx1ZVByb3Bvc2FscyA+IDEpIHsKICAgICAgICAgIHZhbHVlID0gIiQxIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdFRleHQgKyB2YWx1ZSArIHNlcGFyYXRvckFmdGVyOwogICAgICB9OwogICAgICBKU09OQ29tcGxldGlvbjIucHJvdG90eXBlLmdldEN1cnJlbnRXb3JkID0gZnVuY3Rpb24oZG9jdW1lbnQsIG9mZnNldCkgewogICAgICAgIHZhciBpID0gb2Zmc2V0IC0gMTsKICAgICAgICB2YXIgdGV4dCA9IGRvY3VtZW50LmdldFRleHQoKTsKICAgICAgICB3aGlsZSAoaSA+PSAwICYmICcgCVxuXHJcdiI6e1ssXX0nLmluZGV4T2YodGV4dC5jaGFyQXQoaSkpID09PSAtMSkgewogICAgICAgICAgaS0tOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoaSArIDEsIG9mZnNldCk7CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZXZhbHVhdGVTZXBhcmF0b3JBZnRlciA9IGZ1bmN0aW9uKGRvY3VtZW50LCBvZmZzZXQpIHsKICAgICAgICB2YXIgc2Nhbm5lcjIgPSBjcmVhdGVTY2FubmVyMihkb2N1bWVudC5nZXRUZXh0KCksIHRydWUpOwogICAgICAgIHNjYW5uZXIyLnNldFBvc2l0aW9uKG9mZnNldCk7CiAgICAgICAgdmFyIHRva2VuID0gc2Nhbm5lcjIuc2NhbigpOwogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgNToKICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgIGNhc2UgMTc6CiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiAiLCI7CiAgICAgICAgfQogICAgICB9OwogICAgICBKU09OQ29tcGxldGlvbjIucHJvdG90eXBlLmZpbmRJdGVtQXRPZmZzZXQgPSBmdW5jdGlvbihub2RlLCBkb2N1bWVudCwgb2Zmc2V0KSB7CiAgICAgICAgdmFyIHNjYW5uZXIyID0gY3JlYXRlU2Nhbm5lcjIoZG9jdW1lbnQuZ2V0VGV4dCgpLCB0cnVlKTsKICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLml0ZW1zOwogICAgICAgIGZvciAodmFyIGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07CiAgICAgICAgICBpZiAob2Zmc2V0ID4gY2hpbGQub2Zmc2V0ICsgY2hpbGQubGVuZ3RoKSB7CiAgICAgICAgICAgIHNjYW5uZXIyLnNldFBvc2l0aW9uKGNoaWxkLm9mZnNldCArIGNoaWxkLmxlbmd0aCk7CiAgICAgICAgICAgIHZhciB0b2tlbiA9IHNjYW5uZXIyLnNjYW4oKTsKICAgICAgICAgICAgaWYgKHRva2VuID09PSA1ICYmIG9mZnNldCA+PSBzY2FubmVyMi5nZXRUb2tlbk9mZnNldCgpICsgc2Nhbm5lcjIuZ2V0VG9rZW5MZW5ndGgoKSkgewogICAgICAgICAgICAgIHJldHVybiBpICsgMTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0ID49IGNoaWxkLm9mZnNldCkgewogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuaXNJbkNvbW1lbnQgPSBmdW5jdGlvbihkb2N1bWVudCwgc3RhcnQsIG9mZnNldCkgewogICAgICAgIHZhciBzY2FubmVyMiA9IGNyZWF0ZVNjYW5uZXIyKGRvY3VtZW50LmdldFRleHQoKSwgZmFsc2UpOwogICAgICAgIHNjYW5uZXIyLnNldFBvc2l0aW9uKHN0YXJ0KTsKICAgICAgICB2YXIgdG9rZW4gPSBzY2FubmVyMi5zY2FuKCk7CiAgICAgICAgd2hpbGUgKHRva2VuICE9PSAxNyAmJiBzY2FubmVyMi5nZXRUb2tlbk9mZnNldCgpICsgc2Nhbm5lcjIuZ2V0VG9rZW5MZW5ndGgoKSA8IG9mZnNldCkgewogICAgICAgICAgdG9rZW4gPSBzY2FubmVyMi5zY2FuKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAodG9rZW4gPT09IDEyIHx8IHRva2VuID09PSAxMykgJiYgc2Nhbm5lcjIuZ2V0VG9rZW5PZmZzZXQoKSA8PSBvZmZzZXQ7CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZnJvbU1hcmt1cCA9IGZ1bmN0aW9uKG1hcmt1cFN0cmluZykgewogICAgICAgIGlmIChtYXJrdXBTdHJpbmcgJiYgdGhpcy5kb2VzU3VwcG9ydE1hcmtkb3duKCkpIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGtpbmQ6IE1hcmt1cEtpbmQuTWFya2Rvd24sCiAgICAgICAgICAgIHZhbHVlOiBtYXJrdXBTdHJpbmcKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZG9lc1N1cHBvcnRNYXJrZG93biA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghaXNEZWZpbmVkKHRoaXMuc3VwcG9ydHNNYXJrZG93bikpIHsKICAgICAgICAgIHZhciBjb21wbGV0aW9uID0gdGhpcy5jbGllbnRDYXBhYmlsaXRpZXMudGV4dERvY3VtZW50ICYmIHRoaXMuY2xpZW50Q2FwYWJpbGl0aWVzLnRleHREb2N1bWVudC5jb21wbGV0aW9uOwogICAgICAgICAgdGhpcy5zdXBwb3J0c01hcmtkb3duID0gY29tcGxldGlvbiAmJiBjb21wbGV0aW9uLmNvbXBsZXRpb25JdGVtICYmIEFycmF5LmlzQXJyYXkoY29tcGxldGlvbi5jb21wbGV0aW9uSXRlbS5kb2N1bWVudGF0aW9uRm9ybWF0KSAmJiBjb21wbGV0aW9uLmNvbXBsZXRpb25JdGVtLmRvY3VtZW50YXRpb25Gb3JtYXQuaW5kZXhPZihNYXJrdXBLaW5kLk1hcmtkb3duKSAhPT0gLTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN1cHBvcnRzTWFya2Rvd247CiAgICAgIH07CiAgICAgIEpTT05Db21wbGV0aW9uMi5wcm90b3R5cGUuZG9lc1N1cHBvcnRzQ29tbWl0Q2hhcmFjdGVycyA9IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghaXNEZWZpbmVkKHRoaXMuc3VwcG9ydHNDb21taXRDaGFyYWN0ZXJzKSkgewogICAgICAgICAgdmFyIGNvbXBsZXRpb24gPSB0aGlzLmNsaWVudENhcGFiaWxpdGllcy50ZXh0RG9jdW1lbnQgJiYgdGhpcy5jbGllbnRDYXBhYmlsaXRpZXMudGV4dERvY3VtZW50LmNvbXBsZXRpb247CiAgICAgICAgICB0aGlzLnN1cHBvcnRzQ29tbWl0Q2hhcmFjdGVycyA9IGNvbXBsZXRpb24gJiYgY29tcGxldGlvbi5jb21wbGV0aW9uSXRlbSAmJiAhIWNvbXBsZXRpb24uY29tcGxldGlvbkl0ZW0uY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnN1cHBvcnRzQ29tbWl0Q2hhcmFjdGVyczsKICAgICAgfTsKICAgICAgcmV0dXJuIEpTT05Db21wbGV0aW9uMjsKICAgIH0oKTsKCiAgICAvLyBub2RlX21vZHVsZXMvdnNjb2RlLWpzb24tbGFuZ3VhZ2VzZXJ2aWNlL2xpYi9lc20vc2VydmljZXMvanNvbkhvdmVyLmpzCiAgICB2YXIgSlNPTkhvdmVyID0gZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIEpTT05Ib3ZlcjIoc2NoZW1hU2VydmljZSwgY29udHJpYnV0aW9ucywgcHJvbWlzZUNvbnN0cnVjdG9yKSB7CiAgICAgICAgaWYgKGNvbnRyaWJ1dGlvbnMgPT09IHZvaWQgMCkgewogICAgICAgICAgY29udHJpYnV0aW9ucyA9IFtdOwogICAgICAgIH0KICAgICAgICB0aGlzLnNjaGVtYVNlcnZpY2UgPSBzY2hlbWFTZXJ2aWNlOwogICAgICAgIHRoaXMuY29udHJpYnV0aW9ucyA9IGNvbnRyaWJ1dGlvbnM7CiAgICAgICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZUNvbnN0cnVjdG9yIHx8IFByb21pc2U7CiAgICAgIH0KICAgICAgSlNPTkhvdmVyMi5wcm90b3R5cGUuZG9Ib3ZlciA9IGZ1bmN0aW9uKGRvY3VtZW50LCBwb3NpdGlvbiwgZG9jKSB7CiAgICAgICAgdmFyIG9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KHBvc2l0aW9uKTsKICAgICAgICB2YXIgbm9kZSA9IGRvYy5nZXROb2RlRnJvbU9mZnNldChvZmZzZXQpOwogICAgICAgIGlmICghbm9kZSB8fCAobm9kZS50eXBlID09PSAib2JqZWN0IiB8fCBub2RlLnR5cGUgPT09ICJhcnJheSIpICYmIG9mZnNldCA+IG5vZGUub2Zmc2V0ICsgMSAmJiBvZmZzZXQgPCBub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoIC0gMSkgewogICAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgICAgIH0KICAgICAgICB2YXIgaG92ZXJSYW5nZU5vZGUgPSBub2RlOwogICAgICAgIGlmIChub2RlLnR5cGUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7CiAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC50eXBlID09PSAicHJvcGVydHkiICYmIHBhcmVudC5rZXlOb2RlID09PSBub2RlKSB7CiAgICAgICAgICAgIG5vZGUgPSBwYXJlbnQudmFsdWVOb2RlOwogICAgICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlLnJlc29sdmUobnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIGhvdmVyUmFuZ2UgPSBSYW5nZS5jcmVhdGUoZG9jdW1lbnQucG9zaXRpb25BdChob3ZlclJhbmdlTm9kZS5vZmZzZXQpLCBkb2N1bWVudC5wb3NpdGlvbkF0KGhvdmVyUmFuZ2VOb2RlLm9mZnNldCArIGhvdmVyUmFuZ2VOb2RlLmxlbmd0aCkpOwogICAgICAgIHZhciBjcmVhdGVIb3ZlciA9IGZ1bmN0aW9uKGNvbnRlbnRzKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gewogICAgICAgICAgICBjb250ZW50cywKICAgICAgICAgICAgcmFuZ2U6IGhvdmVyUmFuZ2UKICAgICAgICAgIH07CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH07CiAgICAgICAgdmFyIGxvY2F0aW9uID0gZ2V0Tm9kZVBhdGgzKG5vZGUpOwogICAgICAgIGZvciAodmFyIGkgPSB0aGlzLmNvbnRyaWJ1dGlvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgIHZhciBjb250cmlidXRpb24gPSB0aGlzLmNvbnRyaWJ1dGlvbnNbaV07CiAgICAgICAgICB2YXIgcHJvbWlzZSA9IGNvbnRyaWJ1dGlvbi5nZXRJbmZvQ29udHJpYnV0aW9uKGRvY3VtZW50LnVyaSwgbG9jYXRpb24pOwogICAgICAgICAgaWYgKHByb21pc2UpIHsKICAgICAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbihmdW5jdGlvbihodG1sQ29udGVudCkgewogICAgICAgICAgICAgIHJldHVybiBjcmVhdGVIb3ZlcihodG1sQ29udGVudCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWFTZXJ2aWNlLmdldFNjaGVtYUZvclJlc291cmNlKGRvY3VtZW50LnVyaSwgZG9jKS50aGVuKGZ1bmN0aW9uKHNjaGVtYSkgewogICAgICAgICAgaWYgKHNjaGVtYSAmJiBub2RlKSB7CiAgICAgICAgICAgIHZhciBtYXRjaGluZ1NjaGVtYXMgPSBkb2MuZ2V0TWF0Y2hpbmdTY2hlbWFzKHNjaGVtYS5zY2hlbWEsIG5vZGUub2Zmc2V0KTsKICAgICAgICAgICAgdmFyIHRpdGxlXzEgPSB2b2lkIDA7CiAgICAgICAgICAgIHZhciBtYXJrZG93bkRlc2NyaXB0aW9uXzEgPSB2b2lkIDA7CiAgICAgICAgICAgIHZhciBtYXJrZG93bkVudW1WYWx1ZURlc2NyaXB0aW9uXzEgPSB2b2lkIDAsIGVudW1WYWx1ZV8xID0gdm9pZCAwOwogICAgICAgICAgICBtYXRjaGluZ1NjaGVtYXMuZXZlcnkoZnVuY3Rpb24ocykgewogICAgICAgICAgICAgIGlmIChzLm5vZGUgPT09IG5vZGUgJiYgIXMuaW52ZXJ0ZWQgJiYgcy5zY2hlbWEpIHsKICAgICAgICAgICAgICAgIHRpdGxlXzEgPSB0aXRsZV8xIHx8IHMuc2NoZW1hLnRpdGxlOwogICAgICAgICAgICAgICAgbWFya2Rvd25EZXNjcmlwdGlvbl8xID0gbWFya2Rvd25EZXNjcmlwdGlvbl8xIHx8IHMuc2NoZW1hLm1hcmtkb3duRGVzY3JpcHRpb24gfHwgdG9NYXJrZG93bihzLnNjaGVtYS5kZXNjcmlwdGlvbik7CiAgICAgICAgICAgICAgICBpZiAocy5zY2hlbWEuZW51bSkgewogICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gcy5zY2hlbWEuZW51bS5pbmRleE9mKGdldE5vZGVWYWx1ZTMobm9kZSkpOwogICAgICAgICAgICAgICAgICBpZiAocy5zY2hlbWEubWFya2Rvd25FbnVtRGVzY3JpcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgbWFya2Rvd25FbnVtVmFsdWVEZXNjcmlwdGlvbl8xID0gcy5zY2hlbWEubWFya2Rvd25FbnVtRGVzY3JpcHRpb25zW2lkeF07CiAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocy5zY2hlbWEuZW51bURlc2NyaXB0aW9ucykgewogICAgICAgICAgICAgICAgICAgIG1hcmtkb3duRW51bVZhbHVlRGVzY3JpcHRpb25fMSA9IHRvTWFya2Rvd24ocy5zY2hlbWEuZW51bURlc2NyaXB0aW9uc1tpZHhdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobWFya2Rvd25FbnVtVmFsdWVEZXNjcmlwdGlvbl8xKSB7CiAgICAgICAgICAgICAgICAgICAgZW51bVZhbHVlXzEgPSBzLnNjaGVtYS5lbnVtW2lkeF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbnVtVmFsdWVfMSAhPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICAgIGVudW1WYWx1ZV8xID0gSlNPTi5zdHJpbmdpZnkoZW51bVZhbHVlXzEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSAiIjsKICAgICAgICAgICAgaWYgKHRpdGxlXzEpIHsKICAgICAgICAgICAgICByZXN1bHQgPSB0b01hcmtkb3duKHRpdGxlXzEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtYXJrZG93bkRlc2NyaXB0aW9uXzEpIHsKICAgICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAiXG5cbiI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJlc3VsdCArPSBtYXJrZG93bkRlc2NyaXB0aW9uXzE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1hcmtkb3duRW51bVZhbHVlRGVzY3JpcHRpb25fMSkgewogICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgcmVzdWx0ICs9ICJcblxuIjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmVzdWx0ICs9ICJgIiArIHRvTWFya2Rvd25Db2RlQmxvY2soZW51bVZhbHVlXzEpICsgImA6ICIgKyBtYXJrZG93bkVudW1WYWx1ZURlc2NyaXB0aW9uXzE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUhvdmVyKFtyZXN1bHRdKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pOwogICAgICB9OwogICAgICByZXR1cm4gSlNPTkhvdmVyMjsKICAgIH0oKTsKICAgIGZ1bmN0aW9uIHRvTWFya2Rvd24ocGxhaW4pIHsKICAgICAgaWYgKHBsYWluKSB7CiAgICAgICAgdmFyIHJlcyA9IHBsYWluLnJlcGxhY2UoLyhbXlxuXHJdKShccj9cbikoW15cblxyXSkvZ20sICIkMVxuXG4kMyIpOwogICAgICAgIHJldHVybiByZXMucmVwbGFjZSgvW1xcYCpfe31bXF0oKSMrXC0uIV0vZywgIlxcJCYiKTsKICAgICAgfQogICAgICByZXR1cm4gdm9pZCAwOwogICAgfQogICAgZnVuY3Rpb24gdG9NYXJrZG93bkNvZGVCbG9jayhjb250ZW50KSB7CiAgICAgIGlmIChjb250ZW50LmluZGV4T2YoImAiKSAhPT0gLTEpIHsKICAgICAgICByZXR1cm4gImBgICIgKyBjb250ZW50ICsgIiBgYCI7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnRlbnQ7CiAgICB9CgogICAgLy8gbm9kZV9tb2R1bGVzL3ZzY29kZS11cmkvbGliL2VzbS9pbmRleC5qcwogICAgdmFyIExJQjsKICAgIExJQiA9ICgoKSA9PiB7CiAgICAgIHZhciB0ID0geyA0NzA6ICh0MikgPT4gewogICAgICAgIGZ1bmN0aW9uIGUyKHQzKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHQzICE9ICJzdHJpbmciKQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCJQYXRoIG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkICIgKyBKU09OLnN0cmluZ2lmeSh0MykpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiByMih0MywgZTMpIHsKICAgICAgICAgIGZvciAodmFyIHIzLCBuMiA9ICIiLCBvID0gMCwgaSA9IC0xLCBhMiA9IDAsIGggPSAwOyBoIDw9IHQzLmxlbmd0aDsgKytoKSB7CiAgICAgICAgICAgIGlmIChoIDwgdDMubGVuZ3RoKQogICAgICAgICAgICAgIHIzID0gdDMuY2hhckNvZGVBdChoKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgaWYgKHIzID09PSA0NykKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIHIzID0gNDc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHIzID09PSA0NykgewogICAgICAgICAgICAgIGlmIChpID09PSBoIC0gMSB8fCBhMiA9PT0gMSkKICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgICBlbHNlIGlmIChpICE9PSBoIC0gMSAmJiBhMiA9PT0gMikgewogICAgICAgICAgICAgICAgaWYgKG4yLmxlbmd0aCA8IDIgfHwgbyAhPT0gMiB8fCBuMi5jaGFyQ29kZUF0KG4yLmxlbmd0aCAtIDEpICE9PSA0NiB8fCBuMi5jaGFyQ29kZUF0KG4yLmxlbmd0aCAtIDIpICE9PSA0NikgewogICAgICAgICAgICAgICAgICBpZiAobjIubGVuZ3RoID4gMikgewogICAgICAgICAgICAgICAgICAgIHZhciBzID0gbjIubGFzdEluZGV4T2YoIi8iKTsKICAgICAgICAgICAgICAgICAgICBpZiAocyAhPT0gbjIubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcyA9PT0gLTEgPyAobjIgPSAiIiwgbyA9IDApIDogbyA9IChuMiA9IG4yLnNsaWNlKDAsIHMpKS5sZW5ndGggLSAxIC0gbjIubGFzdEluZGV4T2YoIi8iKSwgaSA9IGgsIGEyID0gMDsKICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuMi5sZW5ndGggPT09IDIgfHwgbjIubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgbjIgPSAiIiwgbyA9IDAsIGkgPSBoLCBhMiA9IDA7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGUzICYmIChuMi5sZW5ndGggPiAwID8gbjIgKz0gIi8uLiIgOiBuMiA9ICIuLiIsIG8gPSAyKTsKICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIG4yLmxlbmd0aCA+IDAgPyBuMiArPSAiLyIgKyB0My5zbGljZShpICsgMSwgaCkgOiBuMiA9IHQzLnNsaWNlKGkgKyAxLCBoKSwgbyA9IGggLSBpIC0gMTsKICAgICAgICAgICAgICBpID0gaCwgYTIgPSAwOwogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICByMyA9PT0gNDYgJiYgYTIgIT09IC0xID8gKythMiA6IGEyID0gLTE7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbjI7CiAgICAgICAgfQogICAgICAgIHZhciBuID0geyByZXNvbHZlOiBmdW5jdGlvbigpIHsKICAgICAgICAgIGZvciAodmFyIHQzLCBuMiA9ICIiLCBvID0gZmFsc2UsIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhbzsgaS0tKSB7CiAgICAgICAgICAgIHZhciBhMjsKICAgICAgICAgICAgaSA+PSAwID8gYTIgPSBhcmd1bWVudHNbaV0gOiAodDMgPT09IHZvaWQgMCAmJiAodDMgPSBwcm9jZXNzLmN3ZCgpKSwgYTIgPSB0MyksIGUyKGEyKSwgYTIubGVuZ3RoICE9PSAwICYmIChuMiA9IGEyICsgIi8iICsgbjIsIG8gPSBhMi5jaGFyQ29kZUF0KDApID09PSA0Nyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbjIgPSByMihuMiwgIW8pLCBvID8gbjIubGVuZ3RoID4gMCA/ICIvIiArIG4yIDogIi8iIDogbjIubGVuZ3RoID4gMCA/IG4yIDogIi4iOwogICAgICAgIH0sIG5vcm1hbGl6ZTogZnVuY3Rpb24odDMpIHsKICAgICAgICAgIGlmIChlMih0MyksIHQzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuICIuIjsKICAgICAgICAgIHZhciBuMiA9IHQzLmNoYXJDb2RlQXQoMCkgPT09IDQ3LCBvID0gdDMuY2hhckNvZGVBdCh0My5sZW5ndGggLSAxKSA9PT0gNDc7CiAgICAgICAgICByZXR1cm4gKHQzID0gcjIodDMsICFuMikpLmxlbmd0aCAhPT0gMCB8fCBuMiB8fCAodDMgPSAiLiIpLCB0My5sZW5ndGggPiAwICYmIG8gJiYgKHQzICs9ICIvIiksIG4yID8gIi8iICsgdDMgOiB0MzsKICAgICAgICB9LCBpc0Fic29sdXRlOiBmdW5jdGlvbih0MykgewogICAgICAgICAgcmV0dXJuIGUyKHQzKSwgdDMubGVuZ3RoID4gMCAmJiB0My5jaGFyQ29kZUF0KDApID09PSA0NzsKICAgICAgICB9LCBqb2luOiBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKQogICAgICAgICAgICByZXR1cm4gIi4iOwogICAgICAgICAgZm9yICh2YXIgdDMsIHIzID0gMDsgcjMgPCBhcmd1bWVudHMubGVuZ3RoOyArK3IzKSB7CiAgICAgICAgICAgIHZhciBvID0gYXJndW1lbnRzW3IzXTsKICAgICAgICAgICAgZTIobyksIG8ubGVuZ3RoID4gMCAmJiAodDMgPT09IHZvaWQgMCA/IHQzID0gbyA6IHQzICs9ICIvIiArIG8pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHQzID09PSB2b2lkIDAgPyAiLiIgOiBuLm5vcm1hbGl6ZSh0Myk7CiAgICAgICAgfSwgcmVsYXRpdmU6IGZ1bmN0aW9uKHQzLCByMykgewogICAgICAgICAgaWYgKGUyKHQzKSwgZTIocjMpLCB0MyA9PT0gcjMpCiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgIGlmICgodDMgPSBuLnJlc29sdmUodDMpKSA9PT0gKHIzID0gbi5yZXNvbHZlKHIzKSkpCiAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgIGZvciAodmFyIG8gPSAxOyBvIDwgdDMubGVuZ3RoICYmIHQzLmNoYXJDb2RlQXQobykgPT09IDQ3OyArK28pCiAgICAgICAgICAgIDsKICAgICAgICAgIGZvciAodmFyIGkgPSB0My5sZW5ndGgsIGEyID0gaSAtIG8sIGggPSAxOyBoIDwgcjMubGVuZ3RoICYmIHIzLmNoYXJDb2RlQXQoaCkgPT09IDQ3OyArK2gpCiAgICAgICAgICAgIDsKICAgICAgICAgIGZvciAodmFyIHMgPSByMy5sZW5ndGggLSBoLCBmMiA9IGEyIDwgcyA/IGEyIDogcywgdSA9IC0xLCBjID0gMDsgYyA8PSBmMjsgKytjKSB7CiAgICAgICAgICAgIGlmIChjID09PSBmMikgewogICAgICAgICAgICAgIGlmIChzID4gZjIpIHsKICAgICAgICAgICAgICAgIGlmIChyMy5jaGFyQ29kZUF0KGggKyBjKSA9PT0gNDcpCiAgICAgICAgICAgICAgICAgIHJldHVybiByMy5zbGljZShoICsgYyArIDEpOwogICAgICAgICAgICAgICAgaWYgKGMgPT09IDApCiAgICAgICAgICAgICAgICAgIHJldHVybiByMy5zbGljZShoICsgYyk7CiAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAgICBhMiA+IGYyICYmICh0My5jaGFyQ29kZUF0KG8gKyBjKSA9PT0gNDcgPyB1ID0gYyA6IGMgPT09IDAgJiYgKHUgPSAwKSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGwgPSB0My5jaGFyQ29kZUF0KG8gKyBjKTsKICAgICAgICAgICAgaWYgKGwgIT09IHIzLmNoYXJDb2RlQXQoaCArIGMpKQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBsID09PSA0NyAmJiAodSA9IGMpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHAgPSAiIjsKICAgICAgICAgIGZvciAoYyA9IG8gKyB1ICsgMTsgYyA8PSBpOyArK2MpCiAgICAgICAgICAgIGMgIT09IGkgJiYgdDMuY2hhckNvZGVBdChjKSAhPT0gNDcgfHwgKHAubGVuZ3RoID09PSAwID8gcCArPSAiLi4iIDogcCArPSAiLy4uIik7CiAgICAgICAgICByZXR1cm4gcC5sZW5ndGggPiAwID8gcCArIHIzLnNsaWNlKGggKyB1KSA6IChoICs9IHUsIHIzLmNoYXJDb2RlQXQoaCkgPT09IDQ3ICYmICsraCwgcjMuc2xpY2UoaCkpOwogICAgICAgIH0sIF9tYWtlTG9uZzogZnVuY3Rpb24odDMpIHsKICAgICAgICAgIHJldHVybiB0MzsKICAgICAgICB9LCBkaXJuYW1lOiBmdW5jdGlvbih0MykgewogICAgICAgICAgaWYgKGUyKHQzKSwgdDMubGVuZ3RoID09PSAwKQogICAgICAgICAgICByZXR1cm4gIi4iOwogICAgICAgICAgZm9yICh2YXIgcjMgPSB0My5jaGFyQ29kZUF0KDApLCBuMiA9IHIzID09PSA0NywgbyA9IC0xLCBpID0gdHJ1ZSwgYTIgPSB0My5sZW5ndGggLSAxOyBhMiA+PSAxOyAtLWEyKQogICAgICAgICAgICBpZiAoKHIzID0gdDMuY2hhckNvZGVBdChhMikpID09PSA0NykgewogICAgICAgICAgICAgIGlmICghaSkgewogICAgICAgICAgICAgICAgbyA9IGEyOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICBpID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gbyA9PT0gLTEgPyBuMiA/ICIvIiA6ICIuIiA6IG4yICYmIG8gPT09IDEgPyAiLy8iIDogdDMuc2xpY2UoMCwgbyk7CiAgICAgICAgfSwgYmFzZW5hbWU6IGZ1bmN0aW9uKHQzLCByMykgewogICAgICAgICAgaWYgKHIzICE9PSB2b2lkIDAgJiYgdHlwZW9mIHIzICE9ICJzdHJpbmciKQogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCciZXh0IiBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJyk7CiAgICAgICAgICBlMih0Myk7CiAgICAgICAgICB2YXIgbjIsIG8gPSAwLCBpID0gLTEsIGEyID0gdHJ1ZTsKICAgICAgICAgIGlmIChyMyAhPT0gdm9pZCAwICYmIHIzLmxlbmd0aCA+IDAgJiYgcjMubGVuZ3RoIDw9IHQzLmxlbmd0aCkgewogICAgICAgICAgICBpZiAocjMubGVuZ3RoID09PSB0My5sZW5ndGggJiYgcjMgPT09IHQzKQogICAgICAgICAgICAgIHJldHVybiAiIjsKICAgICAgICAgICAgdmFyIGggPSByMy5sZW5ndGggLSAxLCBzID0gLTE7CiAgICAgICAgICAgIGZvciAobjIgPSB0My5sZW5ndGggLSAxOyBuMiA+PSAwOyAtLW4yKSB7CiAgICAgICAgICAgICAgdmFyIGYyID0gdDMuY2hhckNvZGVBdChuMik7CiAgICAgICAgICAgICAgaWYgKGYyID09PSA0NykgewogICAgICAgICAgICAgICAgaWYgKCFhMikgewogICAgICAgICAgICAgICAgICBvID0gbjIgKyAxOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9IGVsc2UKICAgICAgICAgICAgICAgIHMgPT09IC0xICYmIChhMiA9IGZhbHNlLCBzID0gbjIgKyAxKSwgaCA+PSAwICYmIChmMiA9PT0gcjMuY2hhckNvZGVBdChoKSA/IC0taCA9PSAtMSAmJiAoaSA9IG4yKSA6IChoID0gLTEsIGkgPSBzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG8gPT09IGkgPyBpID0gcyA6IGkgPT09IC0xICYmIChpID0gdDMubGVuZ3RoKSwgdDMuc2xpY2UobywgaSk7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKG4yID0gdDMubGVuZ3RoIC0gMTsgbjIgPj0gMDsgLS1uMikKICAgICAgICAgICAgaWYgKHQzLmNoYXJDb2RlQXQobjIpID09PSA0NykgewogICAgICAgICAgICAgIGlmICghYTIpIHsKICAgICAgICAgICAgICAgIG8gPSBuMiArIDE7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZQogICAgICAgICAgICAgIGkgPT09IC0xICYmIChhMiA9IGZhbHNlLCBpID0gbjIgKyAxKTsKICAgICAgICAgIHJldHVybiBpID09PSAtMSA/ICIiIDogdDMuc2xpY2UobywgaSk7CiAgICAgICAgfSwgZXh0bmFtZTogZnVuY3Rpb24odDMpIHsKICAgICAgICAgIGUyKHQzKTsKICAgICAgICAgIGZvciAodmFyIHIzID0gLTEsIG4yID0gMCwgbyA9IC0xLCBpID0gdHJ1ZSwgYTIgPSAwLCBoID0gdDMubGVuZ3RoIC0gMTsgaCA+PSAwOyAtLWgpIHsKICAgICAgICAgICAgdmFyIHMgPSB0My5jaGFyQ29kZUF0KGgpOwogICAgICAgICAgICBpZiAocyAhPT0gNDcpCiAgICAgICAgICAgICAgbyA9PT0gLTEgJiYgKGkgPSBmYWxzZSwgbyA9IGggKyAxKSwgcyA9PT0gNDYgPyByMyA9PT0gLTEgPyByMyA9IGggOiBhMiAhPT0gMSAmJiAoYTIgPSAxKSA6IHIzICE9PSAtMSAmJiAoYTIgPSAtMSk7CiAgICAgICAgICAgIGVsc2UgaWYgKCFpKSB7CiAgICAgICAgICAgICAgbjIgPSBoICsgMTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHIzID09PSAtMSB8fCBvID09PSAtMSB8fCBhMiA9PT0gMCB8fCBhMiA9PT0gMSAmJiByMyA9PT0gbyAtIDEgJiYgcjMgPT09IG4yICsgMSA/ICIiIDogdDMuc2xpY2UocjMsIG8pOwogICAgICAgIH0sIGZvcm1hdDogZnVuY3Rpb24odDMpIHsKICAgICAgICAgIGlmICh0MyA9PT0gbnVsbCB8fCB0eXBlb2YgdDMgIT0gIm9iamVjdCIpCiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAicGF0aE9iamVjdCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnICsgdHlwZW9mIHQzKTsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0NCwgZTMpIHsKICAgICAgICAgICAgdmFyIHIzID0gZTMuZGlyIHx8IGUzLnJvb3QsIG4yID0gZTMuYmFzZSB8fCAoZTMubmFtZSB8fCAiIikgKyAoZTMuZXh0IHx8ICIiKTsKICAgICAgICAgICAgcmV0dXJuIHIzID8gcjMgPT09IGUzLnJvb3QgPyByMyArIG4yIDogcjMgKyAiLyIgKyBuMiA6IG4yOwogICAgICAgICAgfSgwLCB0Myk7CiAgICAgICAgfSwgcGFyc2U6IGZ1bmN0aW9uKHQzKSB7CiAgICAgICAgICBlMih0Myk7CiAgICAgICAgICB2YXIgcjMgPSB7IHJvb3Q6ICIiLCBkaXI6ICIiLCBiYXNlOiAiIiwgZXh0OiAiIiwgbmFtZTogIiIgfTsKICAgICAgICAgIGlmICh0My5sZW5ndGggPT09IDApCiAgICAgICAgICAgIHJldHVybiByMzsKICAgICAgICAgIHZhciBuMiwgbyA9IHQzLmNoYXJDb2RlQXQoMCksIGkgPSBvID09PSA0NzsKICAgICAgICAgIGkgPyAocjMucm9vdCA9ICIvIiwgbjIgPSAxKSA6IG4yID0gMDsKICAgICAgICAgIGZvciAodmFyIGEyID0gLTEsIGggPSAwLCBzID0gLTEsIGYyID0gdHJ1ZSwgdSA9IHQzLmxlbmd0aCAtIDEsIGMgPSAwOyB1ID49IG4yOyAtLXUpCiAgICAgICAgICAgIGlmICgobyA9IHQzLmNoYXJDb2RlQXQodSkpICE9PSA0NykKICAgICAgICAgICAgICBzID09PSAtMSAmJiAoZjIgPSBmYWxzZSwgcyA9IHUgKyAxKSwgbyA9PT0gNDYgPyBhMiA9PT0gLTEgPyBhMiA9IHUgOiBjICE9PSAxICYmIChjID0gMSkgOiBhMiAhPT0gLTEgJiYgKGMgPSAtMSk7CiAgICAgICAgICAgIGVsc2UgaWYgKCFmMikgewogICAgICAgICAgICAgIGggPSB1ICsgMTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGEyID09PSAtMSB8fCBzID09PSAtMSB8fCBjID09PSAwIHx8IGMgPT09IDEgJiYgYTIgPT09IHMgLSAxICYmIGEyID09PSBoICsgMSA/IHMgIT09IC0xICYmIChyMy5iYXNlID0gcjMubmFtZSA9IGggPT09IDAgJiYgaSA/IHQzLnNsaWNlKDEsIHMpIDogdDMuc2xpY2UoaCwgcykpIDogKGggPT09IDAgJiYgaSA/IChyMy5uYW1lID0gdDMuc2xpY2UoMSwgYTIpLCByMy5iYXNlID0gdDMuc2xpY2UoMSwgcykpIDogKHIzLm5hbWUgPSB0My5zbGljZShoLCBhMiksIHIzLmJhc2UgPSB0My5zbGljZShoLCBzKSksIHIzLmV4dCA9IHQzLnNsaWNlKGEyLCBzKSksIGggPiAwID8gcjMuZGlyID0gdDMuc2xpY2UoMCwgaCAtIDEpIDogaSAmJiAocjMuZGlyID0gIi8iKSwgcjM7CiAgICAgICAgfSwgc2VwOiAiLyIsIGRlbGltaXRlcjogIjoiLCB3aW4zMjogbnVsbCwgcG9zaXg6IG51bGwgfTsKICAgICAgICBuLnBvc2l4ID0gbiwgdDIuZXhwb3J0cyA9IG47CiAgICAgIH0sIDQ0NzogKHQyLCBlMiwgcjIpID0+IHsKICAgICAgICB2YXIgbjsKICAgICAgICBpZiAocjIucihlMiksIHIyLmQoZTIsIHsgVVJJOiAoKSA9PiBnLCBVdGlsczogKCkgPT4gTyB9KSwgdHlwZW9mIHByb2Nlc3MgPT0gIm9iamVjdCIpCiAgICAgICAgICBuID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gIndpbjMyIjsKICAgICAgICBlbHNlIGlmICh0eXBlb2YgbmF2aWdhdG9yID09ICJvYmplY3QiKSB7CiAgICAgICAgICB2YXIgbyA9IG5hdmlnYXRvci51c2VyQWdlbnQ7CiAgICAgICAgICBuID0gby5pbmRleE9mKCJXaW5kb3dzIikgPj0gMDsKICAgICAgICB9CiAgICAgICAgdmFyIGksIGEyLCBoID0gKGkgPSBmdW5jdGlvbih0MywgZTMpIHsKICAgICAgICAgIHJldHVybiAoaSA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCB7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uKHQ0LCBlNCkgewogICAgICAgICAgICB0NC5fX3Byb3RvX18gPSBlNDsKICAgICAgICAgIH0gfHwgZnVuY3Rpb24odDQsIGU0KSB7CiAgICAgICAgICAgIGZvciAodmFyIHIzIGluIGU0KQogICAgICAgICAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlNCwgcjMpICYmICh0NFtyM10gPSBlNFtyM10pOwogICAgICAgICAgfSkodDMsIGUzKTsKICAgICAgICB9LCBmdW5jdGlvbih0MywgZTMpIHsKICAgICAgICAgIGZ1bmN0aW9uIHIzKCkgewogICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yID0gdDM7CiAgICAgICAgICB9CiAgICAgICAgICBpKHQzLCBlMyksIHQzLnByb3RvdHlwZSA9IGUzID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShlMykgOiAocjMucHJvdG90eXBlID0gZTMucHJvdG90eXBlLCBuZXcgcjMoKSk7CiAgICAgICAgfSksIHMgPSAvXlx3W1x3XGQrLi1dKiQvLCBmMiA9IC9eXC8vLCB1ID0gL15cL1wvLywgYyA9ICIiLCBsID0gIi8iLCBwID0gL14oKFteOi8/I10rPyk6KT8oXC9cLyhbXi8/I10qKSk/KFtePyNdKikoXD8oW14jXSopKT8oIyguKikpPy8sIGcgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGZ1bmN0aW9uIHQzKHQ0LCBlMywgcjMsIG4yLCBvMiwgaTIpIHsKICAgICAgICAgICAgaTIgPT09IHZvaWQgMCAmJiAoaTIgPSBmYWxzZSksIHR5cGVvZiB0NCA9PSAib2JqZWN0IiA/ICh0aGlzLnNjaGVtZSA9IHQ0LnNjaGVtZSB8fCBjLCB0aGlzLmF1dGhvcml0eSA9IHQ0LmF1dGhvcml0eSB8fCBjLCB0aGlzLnBhdGggPSB0NC5wYXRoIHx8IGMsIHRoaXMucXVlcnkgPSB0NC5xdWVyeSB8fCBjLCB0aGlzLmZyYWdtZW50ID0gdDQuZnJhZ21lbnQgfHwgYykgOiAodGhpcy5zY2hlbWUgPSBmdW5jdGlvbih0NSwgZTQpIHsKICAgICAgICAgICAgICByZXR1cm4gdDUgfHwgZTQgPyB0NSA6ICJmaWxlIjsKICAgICAgICAgICAgfSh0NCwgaTIpLCB0aGlzLmF1dGhvcml0eSA9IGUzIHx8IGMsIHRoaXMucGF0aCA9IGZ1bmN0aW9uKHQ1LCBlNCkgewogICAgICAgICAgICAgIHN3aXRjaCAodDUpIHsKICAgICAgICAgICAgICAgIGNhc2UgImh0dHBzIjoKICAgICAgICAgICAgICAgIGNhc2UgImh0dHAiOgogICAgICAgICAgICAgICAgY2FzZSAiZmlsZSI6CiAgICAgICAgICAgICAgICAgIGU0ID8gZTRbMF0gIT09IGwgJiYgKGU0ID0gbCArIGU0KSA6IGU0ID0gbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIGU0OwogICAgICAgICAgICB9KHRoaXMuc2NoZW1lLCByMyB8fCBjKSwgdGhpcy5xdWVyeSA9IG4yIHx8IGMsIHRoaXMuZnJhZ21lbnQgPSBvMiB8fCBjLCBmdW5jdGlvbih0NSwgZTQpIHsKICAgICAgICAgICAgICBpZiAoIXQ1LnNjaGVtZSAmJiBlNCkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignW1VyaUVycm9yXTogU2NoZW1lIGlzIG1pc3Npbmc6IHtzY2hlbWU6ICIiLCBhdXRob3JpdHk6ICInICsgdDUuYXV0aG9yaXR5ICsgJyIsIHBhdGg6ICInICsgdDUucGF0aCArICciLCBxdWVyeTogIicgKyB0NS5xdWVyeSArICciLCBmcmFnbWVudDogIicgKyB0NS5mcmFnbWVudCArICcifScpOwogICAgICAgICAgICAgIGlmICh0NS5zY2hlbWUgJiYgIXMudGVzdCh0NS5zY2hlbWUpKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJbVXJpRXJyb3JdOiBTY2hlbWUgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzLiIpOwogICAgICAgICAgICAgIGlmICh0NS5wYXRoKSB7CiAgICAgICAgICAgICAgICBpZiAodDUuYXV0aG9yaXR5KSB7CiAgICAgICAgICAgICAgICAgIGlmICghZjIudGVzdCh0NS5wYXRoKSkKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGNvbnRhaW5zIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY29tcG9uZW50IG11c3QgZWl0aGVyIGJlIGVtcHR5IG9yIGJlZ2luIHdpdGggYSBzbGFzaCAoIi8iKSBjaGFyYWN0ZXInKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodS50ZXN0KHQ1LnBhdGgpKQogICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGRvZXMgbm90IGNvbnRhaW4gYW4gYXV0aG9yaXR5IGNvbXBvbmVudCwgdGhlbiB0aGUgcGF0aCBjYW5ub3QgYmVnaW4gd2l0aCB0d28gc2xhc2ggY2hhcmFjdGVycyAoIi8vIiknKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0odGhpcywgaTIpKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0My5pc1VyaSA9IGZ1bmN0aW9uKGUzKSB7CiAgICAgICAgICAgIHJldHVybiBlMyBpbnN0YW5jZW9mIHQzIHx8ICEhZTMgJiYgdHlwZW9mIGUzLmF1dGhvcml0eSA9PSAic3RyaW5nIiAmJiB0eXBlb2YgZTMuZnJhZ21lbnQgPT0gInN0cmluZyIgJiYgdHlwZW9mIGUzLnBhdGggPT0gInN0cmluZyIgJiYgdHlwZW9mIGUzLnF1ZXJ5ID09ICJzdHJpbmciICYmIHR5cGVvZiBlMy5zY2hlbWUgPT0gInN0cmluZyIgJiYgdHlwZW9mIGUzLmZzUGF0aCA9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBlMy53aXRoID09ICJmdW5jdGlvbiIgJiYgdHlwZW9mIGUzLnRvU3RyaW5nID09ICJmdW5jdGlvbiI7CiAgICAgICAgICB9LCBPYmplY3QuZGVmaW5lUHJvcGVydHkodDMucHJvdG90eXBlLCAiZnNQYXRoIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gQyh0aGlzLCBmYWxzZSk7CiAgICAgICAgICB9LCBlbnVtZXJhYmxlOiBmYWxzZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pLCB0My5wcm90b3R5cGUud2l0aCA9IGZ1bmN0aW9uKHQ0KSB7CiAgICAgICAgICAgIGlmICghdDQpCiAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIHZhciBlMyA9IHQ0LnNjaGVtZSwgcjMgPSB0NC5hdXRob3JpdHksIG4yID0gdDQucGF0aCwgbzIgPSB0NC5xdWVyeSwgaTIgPSB0NC5mcmFnbWVudDsKICAgICAgICAgICAgcmV0dXJuIGUzID09PSB2b2lkIDAgPyBlMyA9IHRoaXMuc2NoZW1lIDogZTMgPT09IG51bGwgJiYgKGUzID0gYyksIHIzID09PSB2b2lkIDAgPyByMyA9IHRoaXMuYXV0aG9yaXR5IDogcjMgPT09IG51bGwgJiYgKHIzID0gYyksIG4yID09PSB2b2lkIDAgPyBuMiA9IHRoaXMucGF0aCA6IG4yID09PSBudWxsICYmIChuMiA9IGMpLCBvMiA9PT0gdm9pZCAwID8gbzIgPSB0aGlzLnF1ZXJ5IDogbzIgPT09IG51bGwgJiYgKG8yID0gYyksIGkyID09PSB2b2lkIDAgPyBpMiA9IHRoaXMuZnJhZ21lbnQgOiBpMiA9PT0gbnVsbCAmJiAoaTIgPSBjKSwgZTMgPT09IHRoaXMuc2NoZW1lICYmIHIzID09PSB0aGlzLmF1dGhvcml0eSAmJiBuMiA9PT0gdGhpcy5wYXRoICYmIG8yID09PSB0aGlzLnF1ZXJ5ICYmIGkyID09PSB0aGlzLmZyYWdtZW50ID8gdGhpcyA6IG5ldyB2KGUzLCByMywgbjIsIG8yLCBpMik7CiAgICAgICAgICB9LCB0My5wYXJzZSA9IGZ1bmN0aW9uKHQ0LCBlMykgewogICAgICAgICAgICBlMyA9PT0gdm9pZCAwICYmIChlMyA9IGZhbHNlKTsKICAgICAgICAgICAgdmFyIHIzID0gcC5leGVjKHQ0KTsKICAgICAgICAgICAgcmV0dXJuIHIzID8gbmV3IHYocjNbMl0gfHwgYywgeChyM1s0XSB8fCBjKSwgeChyM1s1XSB8fCBjKSwgeChyM1s3XSB8fCBjKSwgeChyM1s5XSB8fCBjKSwgZTMpIDogbmV3IHYoYywgYywgYywgYywgYyk7CiAgICAgICAgICB9LCB0My5maWxlID0gZnVuY3Rpb24odDQpIHsKICAgICAgICAgICAgdmFyIGUzID0gYzsKICAgICAgICAgICAgaWYgKG4gJiYgKHQ0ID0gdDQucmVwbGFjZSgvXFwvZywgbCkpLCB0NFswXSA9PT0gbCAmJiB0NFsxXSA9PT0gbCkgewogICAgICAgICAgICAgIHZhciByMyA9IHQ0LmluZGV4T2YobCwgMik7CiAgICAgICAgICAgICAgcjMgPT09IC0xID8gKGUzID0gdDQuc3Vic3RyaW5nKDIpLCB0NCA9IGwpIDogKGUzID0gdDQuc3Vic3RyaW5nKDIsIHIzKSwgdDQgPSB0NC5zdWJzdHJpbmcocjMpIHx8IGwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgdigiZmlsZSIsIGUzLCB0NCwgYywgYyk7CiAgICAgICAgICB9LCB0My5mcm9tID0gZnVuY3Rpb24odDQpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyB2KHQ0LnNjaGVtZSwgdDQuYXV0aG9yaXR5LCB0NC5wYXRoLCB0NC5xdWVyeSwgdDQuZnJhZ21lbnQpOwogICAgICAgICAgfSwgdDMucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24odDQpIHsKICAgICAgICAgICAgcmV0dXJuIHQ0ID09PSB2b2lkIDAgJiYgKHQ0ID0gZmFsc2UpLCBBMih0aGlzLCB0NCk7CiAgICAgICAgICB9LCB0My5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgfSwgdDMucmV2aXZlID0gZnVuY3Rpb24oZTMpIHsKICAgICAgICAgICAgaWYgKGUzKSB7CiAgICAgICAgICAgICAgaWYgKGUzIGluc3RhbmNlb2YgdDMpCiAgICAgICAgICAgICAgICByZXR1cm4gZTM7CiAgICAgICAgICAgICAgdmFyIHIzID0gbmV3IHYoZTMpOwogICAgICAgICAgICAgIHJldHVybiByMy5fZm9ybWF0dGVkID0gZTMuZXh0ZXJuYWwsIHIzLl9mc1BhdGggPSBlMy5fc2VwID09PSBkID8gZTMuZnNQYXRoIDogbnVsbCwgcjM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGUzOwogICAgICAgICAgfSwgdDM7CiAgICAgICAgfSgpLCBkID0gbiA/IDEgOiB2b2lkIDAsIHYgPSBmdW5jdGlvbih0MykgewogICAgICAgICAgZnVuY3Rpb24gZTMoKSB7CiAgICAgICAgICAgIHZhciBlNCA9IHQzICE9PSBudWxsICYmIHQzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICAgICAgcmV0dXJuIGU0Ll9mb3JtYXR0ZWQgPSBudWxsLCBlNC5fZnNQYXRoID0gbnVsbCwgZTQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaChlMywgdDMpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoZTMucHJvdG90eXBlLCAiZnNQYXRoIiwgeyBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZnNQYXRoIHx8ICh0aGlzLl9mc1BhdGggPSBDKHRoaXMsIGZhbHNlKSksIHRoaXMuX2ZzUGF0aDsKICAgICAgICAgIH0sIGVudW1lcmFibGU6IGZhbHNlLCBjb25maWd1cmFibGU6IHRydWUgfSksIGUzLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKHQ0KSB7CiAgICAgICAgICAgIHJldHVybiB0NCA9PT0gdm9pZCAwICYmICh0NCA9IGZhbHNlKSwgdDQgPyBBMih0aGlzLCB0cnVlKSA6ICh0aGlzLl9mb3JtYXR0ZWQgfHwgKHRoaXMuX2Zvcm1hdHRlZCA9IEEyKHRoaXMsIGZhbHNlKSksIHRoaXMuX2Zvcm1hdHRlZCk7CiAgICAgICAgICB9LCBlMy5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciB0NCA9IHsgJG1pZDogMSB9OwogICAgICAgICAgICByZXR1cm4gdGhpcy5fZnNQYXRoICYmICh0NC5mc1BhdGggPSB0aGlzLl9mc1BhdGgsIHQ0Ll9zZXAgPSBkKSwgdGhpcy5fZm9ybWF0dGVkICYmICh0NC5leHRlcm5hbCA9IHRoaXMuX2Zvcm1hdHRlZCksIHRoaXMucGF0aCAmJiAodDQucGF0aCA9IHRoaXMucGF0aCksIHRoaXMuc2NoZW1lICYmICh0NC5zY2hlbWUgPSB0aGlzLnNjaGVtZSksIHRoaXMuYXV0aG9yaXR5ICYmICh0NC5hdXRob3JpdHkgPSB0aGlzLmF1dGhvcml0eSksIHRoaXMucXVlcnkgJiYgKHQ0LnF1ZXJ5ID0gdGhpcy5xdWVyeSksIHRoaXMuZnJhZ21lbnQgJiYgKHQ0LmZyYWdtZW50ID0gdGhpcy5mcmFnbWVudCksIHQ0OwogICAgICAgICAgfSwgZTM7CiAgICAgICAgfShnKSwgbSA9ICgoYTIgPSB7fSlbNThdID0gIiUzQSIsIGEyWzQ3XSA9ICIlMkYiLCBhMls2M10gPSAiJTNGIiwgYTJbMzVdID0gIiUyMyIsIGEyWzkxXSA9ICIlNUIiLCBhMls5M10gPSAiJTVEIiwgYTJbNjRdID0gIiU0MCIsIGEyWzMzXSA9ICIlMjEiLCBhMlszNl0gPSAiJTI0IiwgYTJbMzhdID0gIiUyNiIsIGEyWzM5XSA9ICIlMjciLCBhMls0MF0gPSAiJTI4IiwgYTJbNDFdID0gIiUyOSIsIGEyWzQyXSA9ICIlMkEiLCBhMls0M10gPSAiJTJCIiwgYTJbNDRdID0gIiUyQyIsIGEyWzU5XSA9ICIlM0IiLCBhMls2MV0gPSAiJTNEIiwgYTJbMzJdID0gIiUyMCIsIGEyKTsKICAgICAgICBmdW5jdGlvbiB5KHQzLCBlMykgewogICAgICAgICAgZm9yICh2YXIgcjMgPSB2b2lkIDAsIG4yID0gLTEsIG8yID0gMDsgbzIgPCB0My5sZW5ndGg7IG8yKyspIHsKICAgICAgICAgICAgdmFyIGkyID0gdDMuY2hhckNvZGVBdChvMik7CiAgICAgICAgICAgIGlmIChpMiA+PSA5NyAmJiBpMiA8PSAxMjIgfHwgaTIgPj0gNjUgJiYgaTIgPD0gOTAgfHwgaTIgPj0gNDggJiYgaTIgPD0gNTcgfHwgaTIgPT09IDQ1IHx8IGkyID09PSA0NiB8fCBpMiA9PT0gOTUgfHwgaTIgPT09IDEyNiB8fCBlMyAmJiBpMiA9PT0gNDcpCiAgICAgICAgICAgICAgbjIgIT09IC0xICYmIChyMyArPSBlbmNvZGVVUklDb21wb25lbnQodDMuc3Vic3RyaW5nKG4yLCBvMikpLCBuMiA9IC0xKSwgcjMgIT09IHZvaWQgMCAmJiAocjMgKz0gdDMuY2hhckF0KG8yKSk7CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIHIzID09PSB2b2lkIDAgJiYgKHIzID0gdDMuc3Vic3RyKDAsIG8yKSk7CiAgICAgICAgICAgICAgdmFyIGEzID0gbVtpMl07CiAgICAgICAgICAgICAgYTMgIT09IHZvaWQgMCA/IChuMiAhPT0gLTEgJiYgKHIzICs9IGVuY29kZVVSSUNvbXBvbmVudCh0My5zdWJzdHJpbmcobjIsIG8yKSksIG4yID0gLTEpLCByMyArPSBhMykgOiBuMiA9PT0gLTEgJiYgKG4yID0gbzIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbjIgIT09IC0xICYmIChyMyArPSBlbmNvZGVVUklDb21wb25lbnQodDMuc3Vic3RyaW5nKG4yKSkpLCByMyAhPT0gdm9pZCAwID8gcjMgOiB0MzsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gYih0MykgewogICAgICAgICAgZm9yICh2YXIgZTMgPSB2b2lkIDAsIHIzID0gMDsgcjMgPCB0My5sZW5ndGg7IHIzKyspIHsKICAgICAgICAgICAgdmFyIG4yID0gdDMuY2hhckNvZGVBdChyMyk7CiAgICAgICAgICAgIG4yID09PSAzNSB8fCBuMiA9PT0gNjMgPyAoZTMgPT09IHZvaWQgMCAmJiAoZTMgPSB0My5zdWJzdHIoMCwgcjMpKSwgZTMgKz0gbVtuMl0pIDogZTMgIT09IHZvaWQgMCAmJiAoZTMgKz0gdDNbcjNdKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBlMyAhPT0gdm9pZCAwID8gZTMgOiB0MzsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gQyh0MywgZTMpIHsKICAgICAgICAgIHZhciByMzsKICAgICAgICAgIHJldHVybiByMyA9IHQzLmF1dGhvcml0eSAmJiB0My5wYXRoLmxlbmd0aCA+IDEgJiYgdDMuc2NoZW1lID09PSAiZmlsZSIgPyAiLy8iICsgdDMuYXV0aG9yaXR5ICsgdDMucGF0aCA6IHQzLnBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgJiYgKHQzLnBhdGguY2hhckNvZGVBdCgxKSA+PSA2NSAmJiB0My5wYXRoLmNoYXJDb2RlQXQoMSkgPD0gOTAgfHwgdDMucGF0aC5jaGFyQ29kZUF0KDEpID49IDk3ICYmIHQzLnBhdGguY2hhckNvZGVBdCgxKSA8PSAxMjIpICYmIHQzLnBhdGguY2hhckNvZGVBdCgyKSA9PT0gNTggPyBlMyA/IHQzLnBhdGguc3Vic3RyKDEpIDogdDMucGF0aFsxXS50b0xvd2VyQ2FzZSgpICsgdDMucGF0aC5zdWJzdHIoMikgOiB0My5wYXRoLCBuICYmIChyMyA9IHIzLnJlcGxhY2UoL1wvL2csICJcXCIpKSwgcjM7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIEEyKHQzLCBlMykgewogICAgICAgICAgdmFyIHIzID0gZTMgPyBiIDogeSwgbjIgPSAiIiwgbzIgPSB0My5zY2hlbWUsIGkyID0gdDMuYXV0aG9yaXR5LCBhMyA9IHQzLnBhdGgsIGgyID0gdDMucXVlcnksIHMyID0gdDMuZnJhZ21lbnQ7CiAgICAgICAgICBpZiAobzIgJiYgKG4yICs9IG8yLCBuMiArPSAiOiIpLCAoaTIgfHwgbzIgPT09ICJmaWxlIikgJiYgKG4yICs9IGwsIG4yICs9IGwpLCBpMikgewogICAgICAgICAgICB2YXIgZjMgPSBpMi5pbmRleE9mKCJAIik7CiAgICAgICAgICAgIGlmIChmMyAhPT0gLTEpIHsKICAgICAgICAgICAgICB2YXIgdTIgPSBpMi5zdWJzdHIoMCwgZjMpOwogICAgICAgICAgICAgIGkyID0gaTIuc3Vic3RyKGYzICsgMSksIChmMyA9IHUyLmluZGV4T2YoIjoiKSkgPT09IC0xID8gbjIgKz0gcjModTIsIGZhbHNlKSA6IChuMiArPSByMyh1Mi5zdWJzdHIoMCwgZjMpLCBmYWxzZSksIG4yICs9ICI6IiwgbjIgKz0gcjModTIuc3Vic3RyKGYzICsgMSksIGZhbHNlKSksIG4yICs9ICJAIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAoZjMgPSAoaTIgPSBpMi50b0xvd2VyQ2FzZSgpKS5pbmRleE9mKCI6IikpID09PSAtMSA/IG4yICs9IHIzKGkyLCBmYWxzZSkgOiAobjIgKz0gcjMoaTIuc3Vic3RyKDAsIGYzKSwgZmFsc2UpLCBuMiArPSBpMi5zdWJzdHIoZjMpKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhMykgewogICAgICAgICAgICBpZiAoYTMubGVuZ3RoID49IDMgJiYgYTMuY2hhckNvZGVBdCgwKSA9PT0gNDcgJiYgYTMuY2hhckNvZGVBdCgyKSA9PT0gNTgpCiAgICAgICAgICAgICAgKGMyID0gYTMuY2hhckNvZGVBdCgxKSkgPj0gNjUgJiYgYzIgPD0gOTAgJiYgKGEzID0gIi8iICsgU3RyaW5nLmZyb21DaGFyQ29kZShjMiArIDMyKSArICI6IiArIGEzLnN1YnN0cigzKSk7CiAgICAgICAgICAgIGVsc2UgaWYgKGEzLmxlbmd0aCA+PSAyICYmIGEzLmNoYXJDb2RlQXQoMSkgPT09IDU4KSB7CiAgICAgICAgICAgICAgdmFyIGMyOwogICAgICAgICAgICAgIChjMiA9IGEzLmNoYXJDb2RlQXQoMCkpID49IDY1ICYmIGMyIDw9IDkwICYmIChhMyA9IFN0cmluZy5mcm9tQ2hhckNvZGUoYzIgKyAzMikgKyAiOiIgKyBhMy5zdWJzdHIoMikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG4yICs9IHIzKGEzLCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBoMiAmJiAobjIgKz0gIj8iLCBuMiArPSByMyhoMiwgZmFsc2UpKSwgczIgJiYgKG4yICs9ICIjIiwgbjIgKz0gZTMgPyBzMiA6IHkoczIsIGZhbHNlKSksIG4yOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiB3KHQzKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHQzKTsKICAgICAgICAgIH0gY2F0Y2ggKGUzKSB7CiAgICAgICAgICAgIHJldHVybiB0My5sZW5ndGggPiAzID8gdDMuc3Vic3RyKDAsIDMpICsgdyh0My5zdWJzdHIoMykpIDogdDM7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBfID0gLyglWzAtOUEtWmEtel1bMC05QS1aYS16XSkrL2c7CiAgICAgICAgZnVuY3Rpb24geCh0MykgewogICAgICAgICAgcmV0dXJuIHQzLm1hdGNoKF8pID8gdDMucmVwbGFjZShfLCBmdW5jdGlvbih0NCkgewogICAgICAgICAgICByZXR1cm4gdyh0NCk7CiAgICAgICAgICB9KSA6IHQzOwogICAgICAgIH0KICAgICAgICB2YXIgTywgUCA9IHIyKDQ3MCksIGogPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGZvciAodmFyIHQzID0gMCwgZTMgPSAwLCByMyA9IGFyZ3VtZW50cy5sZW5ndGg7IGUzIDwgcjM7IGUzKyspCiAgICAgICAgICAgIHQzICs9IGFyZ3VtZW50c1tlM10ubGVuZ3RoOwogICAgICAgICAgdmFyIG4yID0gQXJyYXkodDMpLCBvMiA9IDA7CiAgICAgICAgICBmb3IgKGUzID0gMDsgZTMgPCByMzsgZTMrKykKICAgICAgICAgICAgZm9yICh2YXIgaTIgPSBhcmd1bWVudHNbZTNdLCBhMyA9IDAsIGgyID0gaTIubGVuZ3RoOyBhMyA8IGgyOyBhMysrLCBvMisrKQogICAgICAgICAgICAgIG4yW28yXSA9IGkyW2EzXTsKICAgICAgICAgIHJldHVybiBuMjsKICAgICAgICB9LCBVID0gUC5wb3NpeCB8fCBQOwogICAgICAgICFmdW5jdGlvbih0MykgewogICAgICAgICAgdDMuam9pblBhdGggPSBmdW5jdGlvbih0NCkgewogICAgICAgICAgICBmb3IgKHZhciBlMyA9IFtdLCByMyA9IDE7IHIzIDwgYXJndW1lbnRzLmxlbmd0aDsgcjMrKykKICAgICAgICAgICAgICBlM1tyMyAtIDFdID0gYXJndW1lbnRzW3IzXTsKICAgICAgICAgICAgcmV0dXJuIHQ0LndpdGgoeyBwYXRoOiBVLmpvaW4uYXBwbHkoVSwgaihbdDQucGF0aF0sIGUzKSkgfSk7CiAgICAgICAgICB9LCB0My5yZXNvbHZlUGF0aCA9IGZ1bmN0aW9uKHQ0KSB7CiAgICAgICAgICAgIGZvciAodmFyIGUzID0gW10sIHIzID0gMTsgcjMgPCBhcmd1bWVudHMubGVuZ3RoOyByMysrKQogICAgICAgICAgICAgIGUzW3IzIC0gMV0gPSBhcmd1bWVudHNbcjNdOwogICAgICAgICAgICB2YXIgbjIgPSB0NC5wYXRoIHx8ICIvIjsKICAgICAgICAgICAgcmV0dXJuIHQ0LndpdGgoeyBwYXRoOiBVLnJlc29sdmUuYXBwbHkoVSwgaihbbjJdLCBlMykpIH0pOwogICAgICAgICAgfSwgdDMuZGlybmFtZSA9IGZ1bmN0aW9uKHQ0KSB7CiAgICAgICAgICAgIHZhciBlMyA9IFUuZGlybmFtZSh0NC5wYXRoKTsKICAgICAgICAgICAgcmV0dXJuIGUzLmxlbmd0aCA9PT0gMSAmJiBlMy5jaGFyQ29kZUF0KDApID09PSA0NiA/IHQ0IDogdDQud2l0aCh7IHBhdGg6IGUzIH0pOwogICAgICAgICAgfSwgdDMuYmFzZW5hbWUgPSBmdW5jdGlvbih0NCkgewogICAgICAgICAgICByZXR1cm4gVS5iYXNlbmFtZSh0NC5wYXRoKTsKICAgICAgICAgIH0sIHQzLmV4dG5hbWUgPSBmdW5jdGlvbih0NCkgewogICAgICAgICAgICByZXR1cm4gVS5leHRuYW1lKHQ0LnBhdGgpOwogICAgICAgICAgfTsKICAgICAgICB9KE8gfHwgKE8gPSB7fSkpOwogICAgICB9IH0sIGUgPSB7fTsKICAgICAgZnVuY3Rpb24gcihuKSB7CiAgICAgICAgaWYgKGVbbl0pCiAgICAgICAgICByZXR1cm4gZVtuXS5leHBvcnRzOwogICAgICAgIHZhciBvID0gZVtuXSA9IHsgZXhwb3J0czoge30gfTsKICAgICAgICByZXR1cm4gdFtuXShvLCBvLmV4cG9ydHMsIHIpLCBvLmV4cG9ydHM7CiAgICAgIH0KICAgICAgcmV0dXJuIHIuZCA9ICh0MiwgZTIpID0+IHsKICAgICAgICBmb3IgKHZhciBuIGluIGUyKQogICAgICAgICAgci5vKGUyLCBuKSAmJiAhci5vKHQyLCBuKSAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodDIsIG4sIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBlMltuXSB9KTsKICAgICAgfSwgci5vID0gKHQyLCBlMikgPT4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQyLCBlMiksIHIuciA9ICh0MikgPT4gewogICAgICAgIHR5cGVvZiBTeW1ib2wgIT0gInVuZGVmaW5lZCIgJiYgU3ltYm9sLnRvU3RyaW5nVGFnICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0MiwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAiTW9kdWxlIiB9KSwgT2JqZWN0LmRlZmluZVByb3BlcnR5KHQyLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICAgIH0sIHIoNDQ3KTsKICAgIH0pKCk7CiAgICB2YXIgeyBVUkksIFV0aWxzIH0gPSBMSUI7CgogICAgLy8gbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29uLWxhbmd1YWdlc2VydmljZS9saWIvZXNtL3V0aWxzL2dsb2IuanMKICAgIGZ1bmN0aW9uIGNyZWF0ZVJlZ2V4KGdsb2IsIG9wdHMpIHsKICAgICAgaWYgKHR5cGVvZiBnbG9iICE9PSAic3RyaW5nIikgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgc3RyaW5nIik7CiAgICAgIH0KICAgICAgdmFyIHN0ciA9IFN0cmluZyhnbG9iKTsKICAgICAgdmFyIHJlU3RyID0gIiI7CiAgICAgIHZhciBleHRlbmRlZCA9IG9wdHMgPyAhIW9wdHMuZXh0ZW5kZWQgOiBmYWxzZTsKICAgICAgdmFyIGdsb2JzdGFyID0gb3B0cyA/ICEhb3B0cy5nbG9ic3RhciA6IGZhbHNlOwogICAgICB2YXIgaW5Hcm91cCA9IGZhbHNlOwogICAgICB2YXIgZmxhZ3MgPSBvcHRzICYmIHR5cGVvZiBvcHRzLmZsYWdzID09PSAic3RyaW5nIiA/IG9wdHMuZmxhZ3MgOiAiIjsKICAgICAgdmFyIGM7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSBzdHIubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICBjID0gc3RyW2ldOwogICAgICAgIHN3aXRjaCAoYykgewogICAgICAgICAgY2FzZSAiLyI6CiAgICAgICAgICBjYXNlICIkIjoKICAgICAgICAgIGNhc2UgIl4iOgogICAgICAgICAgY2FzZSAiKyI6CiAgICAgICAgICBjYXNlICIuIjoKICAgICAgICAgIGNhc2UgIigiOgogICAgICAgICAgY2FzZSAiKSI6CiAgICAgICAgICBjYXNlICI9IjoKICAgICAgICAgIGNhc2UgIiEiOgogICAgICAgICAgY2FzZSAifCI6CiAgICAgICAgICAgIHJlU3RyICs9ICJcXCIgKyBjOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgIj8iOgogICAgICAgICAgICBpZiAoZXh0ZW5kZWQpIHsKICAgICAgICAgICAgICByZVN0ciArPSAiLiI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgIlsiOgogICAgICAgICAgY2FzZSAiXSI6CiAgICAgICAgICAgIGlmIChleHRlbmRlZCkgewogICAgICAgICAgICAgIHJlU3RyICs9IGM7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgInsiOgogICAgICAgICAgICBpZiAoZXh0ZW5kZWQpIHsKICAgICAgICAgICAgICBpbkdyb3VwID0gdHJ1ZTsKICAgICAgICAgICAgICByZVN0ciArPSAiKCI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgIn0iOgogICAgICAgICAgICBpZiAoZXh0ZW5kZWQpIHsKICAgICAgICAgICAgICBpbkdyb3VwID0gZmFsc2U7CiAgICAgICAgICAgICAgcmVTdHIgKz0gIikiOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICBjYXNlICIsIjoKICAgICAgICAgICAgaWYgKGluR3JvdXApIHsKICAgICAgICAgICAgICByZVN0ciArPSAifCI7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVTdHIgKz0gIlxcIiArIGM7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAiKiI6CiAgICAgICAgICAgIHZhciBwcmV2Q2hhciA9IHN0cltpIC0gMV07CiAgICAgICAgICAgIHZhciBzdGFyQ291bnQgPSAxOwogICAgICAgICAgICB3aGlsZSAoc3RyW2kgKyAxXSA9PT0gIioiKSB7CiAgICAgICAgICAgICAgc3RhckNvdW50Kys7CiAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBuZXh0Q2hhciA9IHN0cltpICsgMV07CiAgICAgICAgICAgIGlmICghZ2xvYnN0YXIpIHsKICAgICAgICAgICAgICByZVN0ciArPSAiLioiOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHZhciBpc0dsb2JzdGFyID0gc3RhckNvdW50ID4gMSAmJiAocHJldkNoYXIgPT09ICIvIiB8fCBwcmV2Q2hhciA9PT0gdm9pZCAwIHx8IHByZXZDaGFyID09PSAieyIgfHwgcHJldkNoYXIgPT09ICIsIikgJiYgKG5leHRDaGFyID09PSAiLyIgfHwgbmV4dENoYXIgPT09IHZvaWQgMCB8fCBuZXh0Q2hhciA9PT0gIiwiIHx8IG5leHRDaGFyID09PSAifSIpOwogICAgICAgICAgICAgIGlmIChpc0dsb2JzdGFyKSB7CiAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgPT09ICIvIikgewogICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZXZDaGFyID09PSAiLyIgJiYgcmVTdHIuZW5kc1dpdGgoIlxcLyIpKSB7CiAgICAgICAgICAgICAgICAgIHJlU3RyID0gcmVTdHIuc3Vic3RyKDAsIHJlU3RyLmxlbmd0aCAtIDIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVTdHIgKz0gIigoPzpbXi9dKig/Oi98JCkpKikiOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZVN0ciArPSAiKFteL10qKSI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmVTdHIgKz0gYzsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFmbGFncyB8fCAhfmZsYWdzLmluZGV4T2YoImciKSkgewogICAgICAgIHJlU3RyID0gIl4iICsgcmVTdHIgKyAiJCI7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBSZWdFeHAocmVTdHIsIGZsYWdzKTsKICAgIH0KCiAgICAvLyBub2RlX21vZHVsZXMvdnNjb2RlLWpzb24tbGFuZ3VhZ2VzZXJ2aWNlL2xpYi9lc20vc2VydmljZXMvanNvblNjaGVtYVNlcnZpY2UuanMKICAgIHZhciBsb2NhbGl6ZTQgPSBsb2FkTWVzc2FnZUJ1bmRsZSgpOwogICAgdmFyIEJBTkcgPSAiISI7CiAgICB2YXIgUEFUSF9TRVAgPSAiLyI7CiAgICB2YXIgRmlsZVBhdHRlcm5Bc3NvY2lhdGlvbiA9IGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBGaWxlUGF0dGVybkFzc29jaWF0aW9uMihwYXR0ZXJuLCB1cmlzKSB7CiAgICAgICAgdGhpcy5nbG9iV3JhcHBlcnMgPSBbXTsKICAgICAgICB0cnkgewogICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBwYXR0ZXJuXzEgPSBwYXR0ZXJuOyBfaSA8IHBhdHRlcm5fMS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgdmFyIHBhdHRlcm5TdHJpbmcgPSBwYXR0ZXJuXzFbX2ldOwogICAgICAgICAgICB2YXIgaW5jbHVkZSA9IHBhdHRlcm5TdHJpbmdbMF0gIT09IEJBTkc7CiAgICAgICAgICAgIGlmICghaW5jbHVkZSkgewogICAgICAgICAgICAgIHBhdHRlcm5TdHJpbmcgPSBwYXR0ZXJuU3RyaW5nLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocGF0dGVyblN0cmluZy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgaWYgKHBhdHRlcm5TdHJpbmdbMF0gPT09IFBBVEhfU0VQKSB7CiAgICAgICAgICAgICAgICBwYXR0ZXJuU3RyaW5nID0gcGF0dGVyblN0cmluZy5zdWJzdHJpbmcoMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHRoaXMuZ2xvYldyYXBwZXJzLnB1c2goewogICAgICAgICAgICAgICAgcmVnZXhwOiBjcmVhdGVSZWdleCgiKiovIiArIHBhdHRlcm5TdHJpbmcsIHsgZXh0ZW5kZWQ6IHRydWUsIGdsb2JzdGFyOiB0cnVlIH0pLAogICAgICAgICAgICAgICAgaW5jbHVkZQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICA7CiAgICAgICAgICB0aGlzLnVyaXMgPSB1cmlzOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHRoaXMuZ2xvYldyYXBwZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgICB0aGlzLnVyaXMgPSBbXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgRmlsZVBhdHRlcm5Bc3NvY2lhdGlvbjIucHJvdG90eXBlLm1hdGNoZXNQYXR0ZXJuID0gZnVuY3Rpb24oZmlsZU5hbWUpIHsKICAgICAgICB2YXIgbWF0Y2ggPSBmYWxzZTsKICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy5nbG9iV3JhcHBlcnM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICB2YXIgX2IgPSBfYVtfaV0sIHJlZ2V4cCA9IF9iLnJlZ2V4cCwgaW5jbHVkZSA9IF9iLmluY2x1ZGU7CiAgICAgICAgICBpZiAocmVnZXhwLnRlc3QoZmlsZU5hbWUpKSB7CiAgICAgICAgICAgIG1hdGNoID0gaW5jbHVkZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICB9OwogICAgICBGaWxlUGF0dGVybkFzc29jaWF0aW9uMi5wcm90b3R5cGUuZ2V0VVJJcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnVyaXM7CiAgICAgIH07CiAgICAgIHJldHVybiBGaWxlUGF0dGVybkFzc29jaWF0aW9uMjsKICAgIH0oKTsKICAgIHZhciBTY2hlbWFIYW5kbGUgPSBmdW5jdGlvbigpIHsKICAgICAgZnVuY3Rpb24gU2NoZW1hSGFuZGxlMihzZXJ2aWNlLCB1cmwsIHVucmVzb2x2ZWRTY2hlbWFDb250ZW50KSB7CiAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKICAgICAgICB0aGlzLnVybCA9IHVybDsKICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IHt9OwogICAgICAgIGlmICh1bnJlc29sdmVkU2NoZW1hQ29udGVudCkgewogICAgICAgICAgdGhpcy51bnJlc29sdmVkU2NoZW1hID0gdGhpcy5zZXJ2aWNlLnByb21pc2UucmVzb2x2ZShuZXcgVW5yZXNvbHZlZFNjaGVtYSh1bnJlc29sdmVkU2NoZW1hQ29udGVudCkpOwogICAgICAgIH0KICAgICAgfQogICAgICBTY2hlbWFIYW5kbGUyLnByb3RvdHlwZS5nZXRVbnJlc29sdmVkU2NoZW1hID0gZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLnVucmVzb2x2ZWRTY2hlbWEpIHsKICAgICAgICAgIHRoaXMudW5yZXNvbHZlZFNjaGVtYSA9IHRoaXMuc2VydmljZS5sb2FkU2NoZW1hKHRoaXMudXJsKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMudW5yZXNvbHZlZFNjaGVtYTsKICAgICAgfTsKICAgICAgU2NoZW1hSGFuZGxlMi5wcm90b3R5cGUuZ2V0UmVzb2x2ZWRTY2hlbWEgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIGlmICghdGhpcy5yZXNvbHZlZFNjaGVtYSkgewogICAgICAgICAgdGhpcy5yZXNvbHZlZFNjaGVtYSA9IHRoaXMuZ2V0VW5yZXNvbHZlZFNjaGVtYSgpLnRoZW4oZnVuY3Rpb24odW5yZXNvbHZlZCkgewogICAgICAgICAgICByZXR1cm4gX3RoaXMuc2VydmljZS5yZXNvbHZlU2NoZW1hQ29udGVudCh1bnJlc29sdmVkLCBfdGhpcy51cmwsIF90aGlzLmRlcGVuZGVuY2llcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMucmVzb2x2ZWRTY2hlbWE7CiAgICAgIH07CiAgICAgIFNjaGVtYUhhbmRsZTIucHJvdG90eXBlLmNsZWFyU2NoZW1hID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yZXNvbHZlZFNjaGVtYSA9IHZvaWQgMDsKICAgICAgICB0aGlzLnVucmVzb2x2ZWRTY2hlbWEgPSB2b2lkIDA7CiAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMgPSB7fTsKICAgICAgfTsKICAgICAgcmV0dXJuIFNjaGVtYUhhbmRsZTI7CiAgICB9KCk7CiAgICB2YXIgVW5yZXNvbHZlZFNjaGVtYSA9IGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBVbnJlc29sdmVkU2NoZW1hMihzY2hlbWEsIGVycm9ycykgewogICAgICAgIGlmIChlcnJvcnMgPT09IHZvaWQgMCkgewogICAgICAgICAgZXJyb3JzID0gW107CiAgICAgICAgfQogICAgICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwogICAgICAgIHRoaXMuZXJyb3JzID0gZXJyb3JzOwogICAgICB9CiAgICAgIHJldHVybiBVbnJlc29sdmVkU2NoZW1hMjsKICAgIH0oKTsKICAgIHZhciBSZXNvbHZlZFNjaGVtYSA9IGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBSZXNvbHZlZFNjaGVtYTIoc2NoZW1hLCBlcnJvcnMpIHsKICAgICAgICBpZiAoZXJyb3JzID09PSB2b2lkIDApIHsKICAgICAgICAgIGVycm9ycyA9IFtdOwogICAgICAgIH0KICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTsKICAgICAgICB0aGlzLmVycm9ycyA9IGVycm9yczsKICAgICAgfQogICAgICBSZXNvbHZlZFNjaGVtYTIucHJvdG90eXBlLmdldFNlY3Rpb24gPSBmdW5jdGlvbihwYXRoKSB7CiAgICAgICAgdmFyIHNjaGVtYVJlZiA9IHRoaXMuZ2V0U2VjdGlvblJlY3Vyc2l2ZShwYXRoLCB0aGlzLnNjaGVtYSk7CiAgICAgICAgaWYgKHNjaGVtYVJlZikgewogICAgICAgICAgcmV0dXJuIGFzU2NoZW1hKHNjaGVtYVJlZik7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH07CiAgICAgIFJlc29sdmVkU2NoZW1hMi5wcm90b3R5cGUuZ2V0U2VjdGlvblJlY3Vyc2l2ZSA9IGZ1bmN0aW9uKHBhdGgsIHNjaGVtYSkgewogICAgICAgIGlmICghc2NoZW1hIHx8IHR5cGVvZiBzY2hlbWEgPT09ICJib29sZWFuIiB8fCBwYXRoLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuIHNjaGVtYTsKICAgICAgICB9CiAgICAgICAgdmFyIG5leHQgPSBwYXRoLnNoaWZ0KCk7CiAgICAgICAgaWYgKHNjaGVtYS5wcm9wZXJ0aWVzICYmIHR5cGVvZiBzY2hlbWEucHJvcGVydGllc1tuZXh0XSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VjdGlvblJlY3Vyc2l2ZShwYXRoLCBzY2hlbWEucHJvcGVydGllc1tuZXh0XSk7CiAgICAgICAgfSBlbHNlIGlmIChzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpIHsKICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBPYmplY3Qua2V5cyhzY2hlbWEucGF0dGVyblByb3BlcnRpZXMpOyBfaSA8IF9hLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICB2YXIgcGF0dGVybiA9IF9hW19pXTsKICAgICAgICAgICAgdmFyIHJlZ2V4ID0gZXh0ZW5kZWRSZWdFeHAocGF0dGVybik7CiAgICAgICAgICAgIGlmIChyZWdleCA9PT0gbnVsbCB8fCByZWdleCA9PT0gdm9pZCAwID8gdm9pZCAwIDogcmVnZXgudGVzdChuZXh0KSkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNlY3Rpb25SZWN1cnNpdmUocGF0aCwgc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzW3BhdHRlcm5dKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmdldFNlY3Rpb25SZWN1cnNpdmUocGF0aCwgc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKTsKICAgICAgICB9IGVsc2UgaWYgKG5leHQubWF0Y2goIlswLTldKyIpKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzY2hlbWEuaXRlbXMpKSB7CiAgICAgICAgICAgIHZhciBpbmRleCA9IHBhcnNlSW50KG5leHQsIDEwKTsKICAgICAgICAgICAgaWYgKCFpc05hTihpbmRleCkgJiYgc2NoZW1hLml0ZW1zW2luZGV4XSkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNlY3Rpb25SZWN1cnNpdmUocGF0aCwgc2NoZW1hLml0ZW1zW2luZGV4XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoc2NoZW1hLml0ZW1zKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFNlY3Rpb25SZWN1cnNpdmUocGF0aCwgc2NoZW1hLml0ZW1zKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfTsKICAgICAgcmV0dXJuIFJlc29sdmVkU2NoZW1hMjsKICAgIH0oKTsKICAgIHZhciBKU09OU2NoZW1hU2VydmljZSA9IGZ1bmN0aW9uKCkgewogICAgICBmdW5jdGlvbiBKU09OU2NoZW1hU2VydmljZTIocmVxdWVzdFNlcnZpY2UsIGNvbnRleHRTZXJ2aWNlLCBwcm9taXNlQ29uc3RydWN0b3IpIHsKICAgICAgICB0aGlzLmNvbnRleHRTZXJ2aWNlID0gY29udGV4dFNlcnZpY2U7CiAgICAgICAgdGhpcy5yZXF1ZXN0U2VydmljZSA9IHJlcXVlc3RTZXJ2aWNlOwogICAgICAgIHRoaXMucHJvbWlzZUNvbnN0cnVjdG9yID0gcHJvbWlzZUNvbnN0cnVjdG9yIHx8IFByb21pc2U7CiAgICAgICAgdGhpcy5jYWxsT25EaXNwb3NlID0gW107CiAgICAgICAgdGhpcy5jb250cmlidXRpb25TY2hlbWFzID0ge307CiAgICAgICAgdGhpcy5jb250cmlidXRpb25Bc3NvY2lhdGlvbnMgPSBbXTsKICAgICAgICB0aGlzLnNjaGVtYXNCeUlkID0ge307CiAgICAgICAgdGhpcy5maWxlUGF0dGVybkFzc29jaWF0aW9ucyA9IFtdOwogICAgICAgIHRoaXMucmVnaXN0ZXJlZFNjaGVtYXNJZHMgPSB7fTsKICAgICAgfQogICAgICBKU09OU2NoZW1hU2VydmljZTIucHJvdG90eXBlLmdldFJlZ2lzdGVyZWRTY2hlbWFJZHMgPSBmdW5jdGlvbihmaWx0ZXIpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZWdpc3RlcmVkU2NoZW1hc0lkcykuZmlsdGVyKGZ1bmN0aW9uKGlkKSB7CiAgICAgICAgICB2YXIgc2NoZW1lID0gVVJJLnBhcnNlKGlkKS5zY2hlbWU7CiAgICAgICAgICByZXR1cm4gc2NoZW1lICE9PSAic2NoZW1hc2VydmljZSIgJiYgKCFmaWx0ZXIgfHwgZmlsdGVyKHNjaGVtZSkpOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoSlNPTlNjaGVtYVNlcnZpY2UyLnByb3RvdHlwZSwgInByb21pc2UiLCB7CiAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnByb21pc2VDb25zdHJ1Y3RvcjsKICAgICAgICB9LAogICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICB9KTsKICAgICAgSlNPTlNjaGVtYVNlcnZpY2UyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgd2hpbGUgKHRoaXMuY2FsbE9uRGlzcG9zZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICB0aGlzLmNhbGxPbkRpc3Bvc2UucG9wKCkoKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEpTT05TY2hlbWFTZXJ2aWNlMi5wcm90b3R5cGUub25SZXNvdXJjZUNoYW5nZSA9IGZ1bmN0aW9uKHVyaSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdGhpcy5jYWNoZWRTY2hlbWFGb3JSZXNvdXJjZSA9IHZvaWQgMDsKICAgICAgICB2YXIgaGFzQ2hhbmdlcyA9IGZhbHNlOwogICAgICAgIHVyaSA9IG5vcm1hbGl6ZUlkKHVyaSk7CiAgICAgICAgdmFyIHRvV2FsayA9IFt1cmldOwogICAgICAgIHZhciBhbGwgPSBPYmplY3Qua2V5cyh0aGlzLnNjaGVtYXNCeUlkKS5tYXAoZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICByZXR1cm4gX3RoaXMuc2NoZW1hc0J5SWRba2V5XTsKICAgICAgICB9KTsKICAgICAgICB3aGlsZSAodG9XYWxrLmxlbmd0aCkgewogICAgICAgICAgdmFyIGN1cnIgPSB0b1dhbGsucG9wKCk7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsbC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgaGFuZGxlID0gYWxsW2ldOwogICAgICAgICAgICBpZiAoaGFuZGxlICYmIChoYW5kbGUudXJsID09PSBjdXJyIHx8IGhhbmRsZS5kZXBlbmRlbmNpZXNbY3Vycl0pKSB7CiAgICAgICAgICAgICAgaWYgKGhhbmRsZS51cmwgIT09IGN1cnIpIHsKICAgICAgICAgICAgICAgIHRvV2Fsay5wdXNoKGhhbmRsZS51cmwpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBoYW5kbGUuY2xlYXJTY2hlbWEoKTsKICAgICAgICAgICAgICBhbGxbaV0gPSB2b2lkIDA7CiAgICAgICAgICAgICAgaGFzQ2hhbmdlcyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGhhc0NoYW5nZXM7CiAgICAgIH07CiAgICAgIEpTT05TY2hlbWFTZXJ2aWNlMi5wcm90b3R5cGUuc2V0U2NoZW1hQ29udHJpYnV0aW9ucyA9IGZ1bmN0aW9uKHNjaGVtYUNvbnRyaWJ1dGlvbnMyKSB7CiAgICAgICAgaWYgKHNjaGVtYUNvbnRyaWJ1dGlvbnMyLnNjaGVtYXMpIHsKICAgICAgICAgIHZhciBzY2hlbWFzID0gc2NoZW1hQ29udHJpYnV0aW9uczIuc2NoZW1hczsKICAgICAgICAgIGZvciAodmFyIGlkIGluIHNjaGVtYXMpIHsKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRJZCA9IG5vcm1hbGl6ZUlkKGlkKTsKICAgICAgICAgICAgdGhpcy5jb250cmlidXRpb25TY2hlbWFzW25vcm1hbGl6ZWRJZF0gPSB0aGlzLmFkZFNjaGVtYUhhbmRsZShub3JtYWxpemVkSWQsIHNjaGVtYXNbaWRdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hQ29udHJpYnV0aW9uczIuc2NoZW1hQXNzb2NpYXRpb25zKSkgewogICAgICAgICAgdmFyIHNjaGVtYUFzc29jaWF0aW9ucyA9IHNjaGVtYUNvbnRyaWJ1dGlvbnMyLnNjaGVtYUFzc29jaWF0aW9uczsKICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgc2NoZW1hQXNzb2NpYXRpb25zXzEgPSBzY2hlbWFBc3NvY2lhdGlvbnM7IF9pIDwgc2NoZW1hQXNzb2NpYXRpb25zXzEubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWFBc3NvY2lhdGlvbiA9IHNjaGVtYUFzc29jaWF0aW9uc18xW19pXTsKICAgICAgICAgICAgdmFyIHVyaXMgPSBzY2hlbWFBc3NvY2lhdGlvbi51cmlzLm1hcChub3JtYWxpemVJZCk7CiAgICAgICAgICAgIHZhciBhc3NvY2lhdGlvbiA9IHRoaXMuYWRkRmlsZVBhdHRlcm5Bc3NvY2lhdGlvbihzY2hlbWFBc3NvY2lhdGlvbi5wYXR0ZXJuLCB1cmlzKTsKICAgICAgICAgICAgdGhpcy5jb250cmlidXRpb25Bc3NvY2lhdGlvbnMucHVzaChhc3NvY2lhdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBKU09OU2NoZW1hU2VydmljZTIucHJvdG90eXBlLmFkZFNjaGVtYUhhbmRsZSA9IGZ1bmN0aW9uKGlkLCB1bnJlc29sdmVkU2NoZW1hQ29udGVudCkgewogICAgICAgIHZhciBzY2hlbWFIYW5kbGUgPSBuZXcgU2NoZW1hSGFuZGxlKHRoaXMsIGlkLCB1bnJlc29sdmVkU2NoZW1hQ29udGVudCk7CiAgICAgICAgdGhpcy5zY2hlbWFzQnlJZFtpZF0gPSBzY2hlbWFIYW5kbGU7CiAgICAgICAgcmV0dXJuIHNjaGVtYUhhbmRsZTsKICAgICAgfTsKICAgICAgSlNPTlNjaGVtYVNlcnZpY2UyLnByb3RvdHlwZS5nZXRPckFkZFNjaGVtYUhhbmRsZSA9IGZ1bmN0aW9uKGlkLCB1bnJlc29sdmVkU2NoZW1hQ29udGVudCkgewogICAgICAgIHJldHVybiB0aGlzLnNjaGVtYXNCeUlkW2lkXSB8fCB0aGlzLmFkZFNjaGVtYUhhbmRsZShpZCwgdW5yZXNvbHZlZFNjaGVtYUNvbnRlbnQpOwogICAgICB9OwogICAgICBKU09OU2NoZW1hU2VydmljZTIucHJvdG90eXBlLmFkZEZpbGVQYXR0ZXJuQXNzb2NpYXRpb24gPSBmdW5jdGlvbihwYXR0ZXJuLCB1cmlzKSB7CiAgICAgICAgdmFyIGZwYSA9IG5ldyBGaWxlUGF0dGVybkFzc29jaWF0aW9uKHBhdHRlcm4sIHVyaXMpOwogICAgICAgIHRoaXMuZmlsZVBhdHRlcm5Bc3NvY2lhdGlvbnMucHVzaChmcGEpOwogICAgICAgIHJldHVybiBmcGE7CiAgICAgIH07CiAgICAgIEpTT05TY2hlbWFTZXJ2aWNlMi5wcm90b3R5cGUucmVnaXN0ZXJFeHRlcm5hbFNjaGVtYSA9IGZ1bmN0aW9uKHVyaSwgZmlsZVBhdHRlcm5zLCB1bnJlc29sdmVkU2NoZW1hQ29udGVudCkgewogICAgICAgIHZhciBpZCA9IG5vcm1hbGl6ZUlkKHVyaSk7CiAgICAgICAgdGhpcy5yZWdpc3RlcmVkU2NoZW1hc0lkc1tpZF0gPSB0cnVlOwogICAgICAgIHRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2UgPSB2b2lkIDA7CiAgICAgICAgaWYgKGZpbGVQYXR0ZXJucykgewogICAgICAgICAgdGhpcy5hZGRGaWxlUGF0dGVybkFzc29jaWF0aW9uKGZpbGVQYXR0ZXJucywgW2lkXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1bnJlc29sdmVkU2NoZW1hQ29udGVudCA/IHRoaXMuYWRkU2NoZW1hSGFuZGxlKGlkLCB1bnJlc29sdmVkU2NoZW1hQ29udGVudCkgOiB0aGlzLmdldE9yQWRkU2NoZW1hSGFuZGxlKGlkKTsKICAgICAgfTsKICAgICAgSlNPTlNjaGVtYVNlcnZpY2UyLnByb3RvdHlwZS5jbGVhckV4dGVybmFsU2NoZW1hcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc2NoZW1hc0J5SWQgPSB7fTsKICAgICAgICB0aGlzLmZpbGVQYXR0ZXJuQXNzb2NpYXRpb25zID0gW107CiAgICAgICAgdGhpcy5yZWdpc3RlcmVkU2NoZW1hc0lkcyA9IHt9OwogICAgICAgIHRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2UgPSB2b2lkIDA7CiAgICAgICAgZm9yICh2YXIgaWQgaW4gdGhpcy5jb250cmlidXRpb25TY2hlbWFzKSB7CiAgICAgICAgICB0aGlzLnNjaGVtYXNCeUlkW2lkXSA9IHRoaXMuY29udHJpYnV0aW9uU2NoZW1hc1tpZF07CiAgICAgICAgICB0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzSWRzW2lkXSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSB0aGlzLmNvbnRyaWJ1dGlvbkFzc29jaWF0aW9uczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgIHZhciBjb250cmlidXRpb25Bc3NvY2lhdGlvbiA9IF9hW19pXTsKICAgICAgICAgIHRoaXMuZmlsZVBhdHRlcm5Bc3NvY2lhdGlvbnMucHVzaChjb250cmlidXRpb25Bc3NvY2lhdGlvbik7CiAgICAgICAgfQogICAgICB9OwogICAgICBKU09OU2NoZW1hU2VydmljZTIucHJvdG90eXBlLmdldFJlc29sdmVkU2NoZW1hID0gZnVuY3Rpb24oc2NoZW1hSWQpIHsKICAgICAgICB2YXIgaWQgPSBub3JtYWxpemVJZChzY2hlbWFJZCk7CiAgICAgICAgdmFyIHNjaGVtYUhhbmRsZSA9IHRoaXMuc2NoZW1hc0J5SWRbaWRdOwogICAgICAgIGlmIChzY2hlbWFIYW5kbGUpIHsKICAgICAgICAgIHJldHVybiBzY2hlbWFIYW5kbGUuZ2V0UmVzb2x2ZWRTY2hlbWEoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZS5yZXNvbHZlKHZvaWQgMCk7CiAgICAgIH07CiAgICAgIEpTT05TY2hlbWFTZXJ2aWNlMi5wcm90b3R5cGUubG9hZFNjaGVtYSA9IGZ1bmN0aW9uKHVybCkgewogICAgICAgIGlmICghdGhpcy5yZXF1ZXN0U2VydmljZSkgewogICAgICAgICAgdmFyIGVycm9yTWVzc2FnZSA9IGxvY2FsaXplNCgianNvbi5zY2hlbWEubm9yZXF1ZXN0c2VydmljZSIsICJVbmFibGUgdG8gbG9hZCBzY2hlbWEgZnJvbSAnezB9Jy4gTm8gc2NoZW1hIHJlcXVlc3Qgc2VydmljZSBhdmFpbGFibGUiLCB0b0Rpc3BsYXlTdHJpbmcodXJsKSk7CiAgICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlLnJlc29sdmUobmV3IFVucmVzb2x2ZWRTY2hlbWEoe30sIFtlcnJvck1lc3NhZ2VdKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RTZXJ2aWNlKHVybCkudGhlbihmdW5jdGlvbihjb250ZW50KSB7CiAgICAgICAgICBpZiAoIWNvbnRlbnQpIHsKICAgICAgICAgICAgdmFyIGVycm9yTWVzc2FnZTIgPSBsb2NhbGl6ZTQoImpzb24uc2NoZW1hLm5vY29udGVudCIsICJVbmFibGUgdG8gbG9hZCBzY2hlbWEgZnJvbSAnezB9JzogTm8gY29udGVudC4iLCB0b0Rpc3BsYXlTdHJpbmcodXJsKSk7CiAgICAgICAgICAgIHJldHVybiBuZXcgVW5yZXNvbHZlZFNjaGVtYSh7fSwgW2Vycm9yTWVzc2FnZTJdKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBzY2hlbWFDb250ZW50ID0ge307CiAgICAgICAgICB2YXIganNvbkVycm9ycyA9IFtdOwogICAgICAgICAgc2NoZW1hQ29udGVudCA9IHBhcnNlMihjb250ZW50LCBqc29uRXJyb3JzKTsKICAgICAgICAgIHZhciBlcnJvcnMgPSBqc29uRXJyb3JzLmxlbmd0aCA/IFtsb2NhbGl6ZTQoImpzb24uc2NoZW1hLmludmFsaWRGb3JtYXQiLCAiVW5hYmxlIHRvIHBhcnNlIGNvbnRlbnQgZnJvbSAnezB9JzogUGFyc2UgZXJyb3IgYXQgb2Zmc2V0IHsxfS4iLCB0b0Rpc3BsYXlTdHJpbmcodXJsKSwganNvbkVycm9yc1swXS5vZmZzZXQpXSA6IFtdOwogICAgICAgICAgcmV0dXJuIG5ldyBVbnJlc29sdmVkU2NoZW1hKHNjaGVtYUNvbnRlbnQsIGVycm9ycyk7CiAgICAgICAgfSwgZnVuY3Rpb24oZXJyb3IpIHsKICAgICAgICAgIHZhciBlcnJvck1lc3NhZ2UyID0gZXJyb3IudG9TdHJpbmcoKTsKICAgICAgICAgIHZhciBlcnJvclNwbGl0ID0gZXJyb3IudG9TdHJpbmcoKS5zcGxpdCgiRXJyb3I6ICIpOwogICAgICAgICAgaWYgKGVycm9yU3BsaXQubGVuZ3RoID4gMSkgewogICAgICAgICAgICBlcnJvck1lc3NhZ2UyID0gZXJyb3JTcGxpdFsxXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChlbmRzV2l0aChlcnJvck1lc3NhZ2UyLCAiLiIpKSB7CiAgICAgICAgICAgIGVycm9yTWVzc2FnZTIgPSBlcnJvck1lc3NhZ2UyLnN1YnN0cigwLCBlcnJvck1lc3NhZ2UyLmxlbmd0aCAtIDEpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5ldyBVbnJlc29sdmVkU2NoZW1hKHt9LCBbbG9jYWxpemU0KCJqc29uLnNjaGVtYS5ub2NvbnRlbnQiLCAiVW5hYmxlIHRvIGxvYWQgc2NoZW1hIGZyb20gJ3swfSc6IHsxfS4iLCB0b0Rpc3BsYXlTdHJpbmcodXJsKSwgZXJyb3JNZXNzYWdlMildKTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgSlNPTlNjaGVtYVNlcnZpY2UyLnByb3RvdHlwZS5yZXNvbHZlU2NoZW1hQ29udGVudCA9IGZ1bmN0aW9uKHNjaGVtYVRvUmVzb2x2ZSwgc2NoZW1hVVJMLCBkZXBlbmRlbmNpZXMpIHsKICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgIHZhciByZXNvbHZlRXJyb3JzID0gc2NoZW1hVG9SZXNvbHZlLmVycm9ycy5zbGljZSgwKTsKICAgICAgICB2YXIgc2NoZW1hID0gc2NoZW1hVG9SZXNvbHZlLnNjaGVtYTsKICAgICAgICBpZiAoc2NoZW1hLiRzY2hlbWEpIHsKICAgICAgICAgIHZhciBpZCA9IG5vcm1hbGl6ZUlkKHNjaGVtYS4kc2NoZW1hKTsKICAgICAgICAgIGlmIChpZCA9PT0gImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDMvc2NoZW1hIikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlLnJlc29sdmUobmV3IFJlc29sdmVkU2NoZW1hKHt9LCBbbG9jYWxpemU0KCJqc29uLnNjaGVtYS5kcmFmdDAzLm5vdHN1cHBvcnRlZCIsICJEcmFmdC0wMyBzY2hlbWFzIGFyZSBub3Qgc3VwcG9ydGVkLiIpXSkpOwogICAgICAgICAgfSBlbHNlIGlmIChpZCA9PT0gImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMTktMDkvc2NoZW1hIikgewogICAgICAgICAgICByZXNvbHZlRXJyb3JzLnB1c2gobG9jYWxpemU0KCJqc29uLnNjaGVtYS5kcmFmdDIwMTkwOS5ub3RzdXBwb3J0ZWQiLCAiRHJhZnQgMjAxOS0wOSBzY2hlbWFzIGFyZSBub3QgeWV0IGZ1bGx5IHN1cHBvcnRlZC4iKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBjb250ZXh0U2VydmljZSA9IHRoaXMuY29udGV4dFNlcnZpY2U7CiAgICAgICAgdmFyIGZpbmRTZWN0aW9uID0gZnVuY3Rpb24oc2NoZW1hMiwgcGF0aCkgewogICAgICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgICAgIHJldHVybiBzY2hlbWEyOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGN1cnJlbnQgPSBzY2hlbWEyOwogICAgICAgICAgaWYgKHBhdGhbMF0gPT09ICIvIikgewogICAgICAgICAgICBwYXRoID0gcGF0aC5zdWJzdHIoMSk7CiAgICAgICAgICB9CiAgICAgICAgICBwYXRoLnNwbGl0KCIvIikuc29tZShmdW5jdGlvbihwYXJ0KSB7CiAgICAgICAgICAgIHBhcnQgPSBwYXJ0LnJlcGxhY2UoL34xL2csICIvIikucmVwbGFjZSgvfjAvZywgIn4iKTsKICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnRbcGFydF07CiAgICAgICAgICAgIHJldHVybiAhY3VycmVudDsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICAgICAgfTsKICAgICAgICB2YXIgbWVyZ2UgPSBmdW5jdGlvbih0YXJnZXQsIHNvdXJjZVJvb3QsIHNvdXJjZVVSSSwgcmVmU2VnbWVudCkgewogICAgICAgICAgdmFyIHBhdGggPSByZWZTZWdtZW50ID8gZGVjb2RlVVJJQ29tcG9uZW50KHJlZlNlZ21lbnQpIDogdm9pZCAwOwogICAgICAgICAgdmFyIHNlY3Rpb24gPSBmaW5kU2VjdGlvbihzb3VyY2VSb290LCBwYXRoKTsKICAgICAgICAgIGlmIChzZWN0aW9uKSB7CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBzZWN0aW9uKSB7CiAgICAgICAgICAgICAgaWYgKHNlY3Rpb24uaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhdGFyZ2V0Lmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgIHRhcmdldFtrZXldID0gc2VjdGlvbltrZXldOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmVzb2x2ZUVycm9ycy5wdXNoKGxvY2FsaXplNCgianNvbi5zY2hlbWEuaW52YWxpZHJlZiIsICIkcmVmICd7MH0nIGluICd7MX0nIGNhbiBub3QgYmUgcmVzb2x2ZWQuIiwgcGF0aCwgc291cmNlVVJJKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICB2YXIgcmVzb2x2ZUV4dGVybmFsTGluayA9IGZ1bmN0aW9uKG5vZGUsIHVyaSwgcmVmU2VnbWVudCwgcGFyZW50U2NoZW1hVVJMLCBwYXJlbnRTY2hlbWFEZXBlbmRlbmNpZXMpIHsKICAgICAgICAgIGlmIChjb250ZXh0U2VydmljZSAmJiAhL15bQS1aYS16XVtBLVphLXowLTkrXC0uK10qOlwvXC8uKi8udGVzdCh1cmkpKSB7CiAgICAgICAgICAgIHVyaSA9IGNvbnRleHRTZXJ2aWNlLnJlc29sdmVSZWxhdGl2ZVBhdGgodXJpLCBwYXJlbnRTY2hlbWFVUkwpOwogICAgICAgICAgfQogICAgICAgICAgdXJpID0gbm9ybWFsaXplSWQodXJpKTsKICAgICAgICAgIHZhciByZWZlcmVuY2VkSGFuZGxlID0gX3RoaXMuZ2V0T3JBZGRTY2hlbWFIYW5kbGUodXJpKTsKICAgICAgICAgIHJldHVybiByZWZlcmVuY2VkSGFuZGxlLmdldFVucmVzb2x2ZWRTY2hlbWEoKS50aGVuKGZ1bmN0aW9uKHVucmVzb2x2ZWRTY2hlbWEpIHsKICAgICAgICAgICAgcGFyZW50U2NoZW1hRGVwZW5kZW5jaWVzW3VyaV0gPSB0cnVlOwogICAgICAgICAgICBpZiAodW5yZXNvbHZlZFNjaGVtYS5lcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgdmFyIGxvYyA9IHJlZlNlZ21lbnQgPyB1cmkgKyAiIyIgKyByZWZTZWdtZW50IDogdXJpOwogICAgICAgICAgICAgIHJlc29sdmVFcnJvcnMucHVzaChsb2NhbGl6ZTQoImpzb24uc2NoZW1hLnByb2JsZW1sb2FkaW5ncmVmIiwgIlByb2JsZW1zIGxvYWRpbmcgcmVmZXJlbmNlICd7MH0nOiB7MX0iLCBsb2MsIHVucmVzb2x2ZWRTY2hlbWEuZXJyb3JzWzBdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWVyZ2Uobm9kZSwgdW5yZXNvbHZlZFNjaGVtYS5zY2hlbWEsIHVyaSwgcmVmU2VnbWVudCk7CiAgICAgICAgICAgIHJldHVybiByZXNvbHZlUmVmcyhub2RlLCB1bnJlc29sdmVkU2NoZW1hLnNjaGVtYSwgdXJpLCByZWZlcmVuY2VkSGFuZGxlLmRlcGVuZGVuY2llcyk7CiAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHZhciByZXNvbHZlUmVmcyA9IGZ1bmN0aW9uKG5vZGUsIHBhcmVudFNjaGVtYSwgcGFyZW50U2NoZW1hVVJMLCBwYXJlbnRTY2hlbWFEZXBlbmRlbmNpZXMpIHsKICAgICAgICAgIGlmICghbm9kZSB8fCB0eXBlb2Ygbm9kZSAhPT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciB0b1dhbGsgPSBbbm9kZV07CiAgICAgICAgICB2YXIgc2VlbiA9IFtdOwogICAgICAgICAgdmFyIG9wZW5Qcm9taXNlcyA9IFtdOwogICAgICAgICAgdmFyIGNvbGxlY3RFbnRyaWVzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBlbnRyaWVzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgZW50cmllc1tfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIF9hID0gMCwgZW50cmllc18xID0gZW50cmllczsgX2EgPCBlbnRyaWVzXzEubGVuZ3RoOyBfYSsrKSB7CiAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc18xW19hXTsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAib2JqZWN0IikgewogICAgICAgICAgICAgICAgdG9XYWxrLnB1c2goZW50cnkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIHZhciBjb2xsZWN0TWFwRW50cmllcyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgbWFwcyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgIG1hcHNbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBfYSA9IDAsIG1hcHNfMSA9IG1hcHM7IF9hIDwgbWFwc18xLmxlbmd0aDsgX2ErKykgewogICAgICAgICAgICAgIHZhciBtYXAgPSBtYXBzXzFbX2FdOwogICAgICAgICAgICAgIGlmICh0eXBlb2YgbWFwID09PSAib2JqZWN0IikgewogICAgICAgICAgICAgICAgZm9yICh2YXIgayBpbiBtYXApIHsKICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGs7CiAgICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IG1hcFtrZXldOwogICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAib2JqZWN0IikgewogICAgICAgICAgICAgICAgICAgIHRvV2Fsay5wdXNoKGVudHJ5KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIHZhciBjb2xsZWN0QXJyYXlFbnRyaWVzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBhcnJheXMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICBhcnJheXNbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBfYSA9IDAsIGFycmF5c18xID0gYXJyYXlzOyBfYSA8IGFycmF5c18xLmxlbmd0aDsgX2ErKykgewogICAgICAgICAgICAgIHZhciBhcnJheSA9IGFycmF5c18xW19hXTsKICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcnJheSkpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gMCwgYXJyYXlfMSA9IGFycmF5OyBfYiA8IGFycmF5XzEubGVuZ3RoOyBfYisrKSB7CiAgICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IGFycmF5XzFbX2JdOwogICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAib2JqZWN0IikgewogICAgICAgICAgICAgICAgICAgIHRvV2Fsay5wdXNoKGVudHJ5KTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIHZhciBoYW5kbGVSZWYgPSBmdW5jdGlvbihuZXh0MikgewogICAgICAgICAgICB2YXIgc2VlblJlZnMgPSBbXTsKICAgICAgICAgICAgd2hpbGUgKG5leHQyLiRyZWYpIHsKICAgICAgICAgICAgICB2YXIgcmVmID0gbmV4dDIuJHJlZjsKICAgICAgICAgICAgICB2YXIgc2VnbWVudHMgPSByZWYuc3BsaXQoIiMiLCAyKTsKICAgICAgICAgICAgICBkZWxldGUgbmV4dDIuJHJlZjsKICAgICAgICAgICAgICBpZiAoc2VnbWVudHNbMF0ubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgb3BlblByb21pc2VzLnB1c2gocmVzb2x2ZUV4dGVybmFsTGluayhuZXh0Miwgc2VnbWVudHNbMF0sIHNlZ21lbnRzWzFdLCBwYXJlbnRTY2hlbWFVUkwsIHBhcmVudFNjaGVtYURlcGVuZGVuY2llcykpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoc2VlblJlZnMuaW5kZXhPZihyZWYpID09PSAtMSkgewogICAgICAgICAgICAgICAgICBtZXJnZShuZXh0MiwgcGFyZW50U2NoZW1hLCBwYXJlbnRTY2hlbWFVUkwsIHNlZ21lbnRzWzFdKTsKICAgICAgICAgICAgICAgICAgc2VlblJlZnMucHVzaChyZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb2xsZWN0RW50cmllcyhuZXh0Mi5pdGVtcywgbmV4dDIuYWRkaXRpb25hbEl0ZW1zLCBuZXh0Mi5hZGRpdGlvbmFsUHJvcGVydGllcywgbmV4dDIubm90LCBuZXh0Mi5jb250YWlucywgbmV4dDIucHJvcGVydHlOYW1lcywgbmV4dDIuaWYsIG5leHQyLnRoZW4sIG5leHQyLmVsc2UpOwogICAgICAgICAgICBjb2xsZWN0TWFwRW50cmllcyhuZXh0Mi5kZWZpbml0aW9ucywgbmV4dDIucHJvcGVydGllcywgbmV4dDIucGF0dGVyblByb3BlcnRpZXMsIG5leHQyLmRlcGVuZGVuY2llcyk7CiAgICAgICAgICAgIGNvbGxlY3RBcnJheUVudHJpZXMobmV4dDIuYW55T2YsIG5leHQyLmFsbE9mLCBuZXh0Mi5vbmVPZiwgbmV4dDIuaXRlbXMpOwogICAgICAgICAgfTsKICAgICAgICAgIHdoaWxlICh0b1dhbGsubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciBuZXh0ID0gdG9XYWxrLnBvcCgpOwogICAgICAgICAgICBpZiAoc2Vlbi5pbmRleE9mKG5leHQpID49IDApIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZWVuLnB1c2gobmV4dCk7CiAgICAgICAgICAgIGhhbmRsZVJlZihuZXh0KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBfdGhpcy5wcm9taXNlLmFsbChvcGVuUHJvbWlzZXMpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHJlc29sdmVSZWZzKHNjaGVtYSwgc2NoZW1hLCBzY2hlbWFVUkwsIGRlcGVuZGVuY2llcykudGhlbihmdW5jdGlvbihfKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkU2NoZW1hKHNjaGVtYSwgcmVzb2x2ZUVycm9ycyk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIEpTT05TY2hlbWFTZXJ2aWNlMi5wcm90b3R5cGUuZ2V0U2NoZW1hRm9yUmVzb3VyY2UgPSBmdW5jdGlvbihyZXNvdXJjZSwgZG9jdW1lbnQpIHsKICAgICAgICBpZiAoZG9jdW1lbnQgJiYgZG9jdW1lbnQucm9vdCAmJiBkb2N1bWVudC5yb290LnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICB2YXIgc2NoZW1hUHJvcGVydGllcyA9IGRvY3VtZW50LnJvb3QucHJvcGVydGllcy5maWx0ZXIoZnVuY3Rpb24ocCkgewogICAgICAgICAgICByZXR1cm4gcC5rZXlOb2RlLnZhbHVlID09PSAiJHNjaGVtYSIgJiYgcC52YWx1ZU5vZGUgJiYgcC52YWx1ZU5vZGUudHlwZSA9PT0gInN0cmluZyI7CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmIChzY2hlbWFQcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgdmFyIHZhbHVlTm9kZSA9IHNjaGVtYVByb3BlcnRpZXNbMF0udmFsdWVOb2RlOwogICAgICAgICAgICBpZiAodmFsdWVOb2RlICYmIHZhbHVlTm9kZS50eXBlID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgIHZhciBzY2hlbWVJZCA9IGdldE5vZGVWYWx1ZTModmFsdWVOb2RlKTsKICAgICAgICAgICAgICBpZiAoc2NoZW1lSWQgJiYgc3RhcnRzV2l0aChzY2hlbWVJZCwgIi4iKSAmJiB0aGlzLmNvbnRleHRTZXJ2aWNlKSB7CiAgICAgICAgICAgICAgICBzY2hlbWVJZCA9IHRoaXMuY29udGV4dFNlcnZpY2UucmVzb2x2ZVJlbGF0aXZlUGF0aChzY2hlbWVJZCwgcmVzb3VyY2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc2NoZW1lSWQpIHsKICAgICAgICAgICAgICAgIHZhciBpZCA9IG5vcm1hbGl6ZUlkKHNjaGVtZUlkKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmdldE9yQWRkU2NoZW1hSGFuZGxlKGlkKS5nZXRSZXNvbHZlZFNjaGVtYSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5jYWNoZWRTY2hlbWFGb3JSZXNvdXJjZSAmJiB0aGlzLmNhY2hlZFNjaGVtYUZvclJlc291cmNlLnJlc291cmNlID09PSByZXNvdXJjZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2UucmVzb2x2ZWRTY2hlbWE7CiAgICAgICAgfQogICAgICAgIHZhciBzZWVuID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB2YXIgc2NoZW1hcyA9IFtdOwogICAgICAgIHZhciBub3JtYWxpemVkUmVzb3VyY2UgPSBub3JtYWxpemVSZXNvdXJjZUZvck1hdGNoaW5nKHJlc291cmNlKTsKICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gdGhpcy5maWxlUGF0dGVybkFzc29jaWF0aW9uczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgIHZhciBlbnRyeSA9IF9hW19pXTsKICAgICAgICAgIGlmIChlbnRyeS5tYXRjaGVzUGF0dGVybihub3JtYWxpemVkUmVzb3VyY2UpKSB7CiAgICAgICAgICAgIGZvciAodmFyIF9iID0gMCwgX2MgPSBlbnRyeS5nZXRVUklzKCk7IF9iIDwgX2MubGVuZ3RoOyBfYisrKSB7CiAgICAgICAgICAgICAgdmFyIHNjaGVtYUlkID0gX2NbX2JdOwogICAgICAgICAgICAgIGlmICghc2VlbltzY2hlbWFJZF0pIHsKICAgICAgICAgICAgICAgIHNjaGVtYXMucHVzaChzY2hlbWFJZCk7CiAgICAgICAgICAgICAgICBzZWVuW3NjaGVtYUlkXSA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciByZXNvbHZlZFNjaGVtYSA9IHNjaGVtYXMubGVuZ3RoID4gMCA/IHRoaXMuY3JlYXRlQ29tYmluZWRTY2hlbWEocmVzb3VyY2UsIHNjaGVtYXMpLmdldFJlc29sdmVkU2NoZW1hKCkgOiB0aGlzLnByb21pc2UucmVzb2x2ZSh2b2lkIDApOwogICAgICAgIHRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2UgPSB7IHJlc291cmNlLCByZXNvbHZlZFNjaGVtYSB9OwogICAgICAgIHJldHVybiByZXNvbHZlZFNjaGVtYTsKICAgICAgfTsKICAgICAgSlNPTlNjaGVtYVNlcnZpY2UyLnByb3RvdHlwZS5jcmVhdGVDb21iaW5lZFNjaGVtYSA9IGZ1bmN0aW9uKHJlc291cmNlLCBzY2hlbWFJZHMpIHsKICAgICAgICBpZiAoc2NoZW1hSWRzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0T3JBZGRTY2hlbWFIYW5kbGUoc2NoZW1hSWRzWzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGNvbWJpbmVkU2NoZW1hSWQgPSAic2NoZW1hc2VydmljZTovL2NvbWJpbmVkU2NoZW1hLyIgKyBlbmNvZGVVUklDb21wb25lbnQocmVzb3VyY2UpOwogICAgICAgICAgdmFyIGNvbWJpbmVkU2NoZW1hID0gewogICAgICAgICAgICBhbGxPZjogc2NoZW1hSWRzLm1hcChmdW5jdGlvbihzY2hlbWFJZCkgewogICAgICAgICAgICAgIHJldHVybiB7ICRyZWY6IHNjaGVtYUlkIH07CiAgICAgICAgICAgIH0pCiAgICAgICAgICB9OwogICAgICAgICAgcmV0dXJuIHRoaXMuYWRkU2NoZW1hSGFuZGxlKGNvbWJpbmVkU2NoZW1hSWQsIGNvbWJpbmVkU2NoZW1hKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEpTT05TY2hlbWFTZXJ2aWNlMi5wcm90b3R5cGUuZ2V0TWF0Y2hpbmdTY2hlbWFzID0gZnVuY3Rpb24oZG9jdW1lbnQsIGpzb25Eb2N1bWVudCwgc2NoZW1hKSB7CiAgICAgICAgaWYgKHNjaGVtYSkgewogICAgICAgICAgdmFyIGlkID0gc2NoZW1hLmlkIHx8ICJzY2hlbWFzZXJ2aWNlOi8vdW50aXRsZWQvbWF0Y2hpbmdTY2hlbWFzLyIgKyBpZENvdW50ZXIrKzsKICAgICAgICAgIHJldHVybiB0aGlzLnJlc29sdmVTY2hlbWFDb250ZW50KG5ldyBVbnJlc29sdmVkU2NoZW1hKHNjaGVtYSksIGlkLCB7fSkudGhlbihmdW5jdGlvbihyZXNvbHZlZFNjaGVtYSkgewogICAgICAgICAgICByZXR1cm4ganNvbkRvY3VtZW50LmdldE1hdGNoaW5nU2NoZW1hcyhyZXNvbHZlZFNjaGVtYS5zY2hlbWEpLmZpbHRlcihmdW5jdGlvbihzKSB7CiAgICAgICAgICAgICAgcmV0dXJuICFzLmludmVydGVkOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5nZXRTY2hlbWFGb3JSZXNvdXJjZShkb2N1bWVudC51cmksIGpzb25Eb2N1bWVudCkudGhlbihmdW5jdGlvbihzY2hlbWEyKSB7CiAgICAgICAgICBpZiAoc2NoZW1hMikgewogICAgICAgICAgICByZXR1cm4ganNvbkRvY3VtZW50LmdldE1hdGNoaW5nU2NoZW1hcyhzY2hlbWEyLnNjaGVtYSkuZmlsdGVyKGZ1bmN0aW9uKHMpIHsKICAgICAgICAgICAgICByZXR1cm4gIXMuaW52ZXJ0ZWQ7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0pOwogICAgICB9OwogICAgICByZXR1cm4gSlNPTlNjaGVtYVNlcnZpY2UyOwogICAgfSgpOwogICAgdmFyIGlkQ291bnRlciA9IDA7CiAgICBmdW5jdGlvbiBub3JtYWxpemVJZChpZCkgewogICAgICB0cnkgewogICAgICAgIHJldHVybiBVUkkucGFyc2UoaWQpLnRvU3RyaW5nKCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gaWQ7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVJlc291cmNlRm9yTWF0Y2hpbmcocmVzb3VyY2UpIHsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gVVJJLnBhcnNlKHJlc291cmNlKS53aXRoKHsgZnJhZ21lbnQ6IG51bGwsIHF1ZXJ5OiBudWxsIH0pLnRvU3RyaW5nKCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gcmVzb3VyY2U7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHRvRGlzcGxheVN0cmluZyh1cmwpIHsKICAgICAgdHJ5IHsKICAgICAgICB2YXIgdXJpID0gVVJJLnBhcnNlKHVybCk7CiAgICAgICAgaWYgKHVyaS5zY2hlbWUgPT09ICJmaWxlIikgewogICAgICAgICAgcmV0dXJuIHVyaS5mc1BhdGg7CiAgICAgICAgfQogICAgICB9IGNhdGNoIChlKSB7CiAgICAgIH0KICAgICAgcmV0dXJuIHVybDsKICAgIH0KCiAgICAvLyBub2RlX21vZHVsZXMvdnNjb2RlLWpzb24tbGFuZ3VhZ2VzZXJ2aWNlL2xpYi9lc20vc2VydmljZXMvanNvblZhbGlkYXRpb24uanMKICAgIHZhciBsb2NhbGl6ZTUgPSBsb2FkTWVzc2FnZUJ1bmRsZSgpOwogICAgdmFyIEpTT05WYWxpZGF0aW9uID0gZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIEpTT05WYWxpZGF0aW9uMihqc29uU2NoZW1hU2VydmljZSwgcHJvbWlzZUNvbnN0cnVjdG9yKSB7CiAgICAgICAgdGhpcy5qc29uU2NoZW1hU2VydmljZSA9IGpzb25TY2hlbWFTZXJ2aWNlOwogICAgICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2VDb25zdHJ1Y3RvcjsKICAgICAgICB0aGlzLnZhbGlkYXRpb25FbmFibGVkID0gdHJ1ZTsKICAgICAgfQogICAgICBKU09OVmFsaWRhdGlvbjIucHJvdG90eXBlLmNvbmZpZ3VyZSA9IGZ1bmN0aW9uKHJhdykgewogICAgICAgIGlmIChyYXcpIHsKICAgICAgICAgIHRoaXMudmFsaWRhdGlvbkVuYWJsZWQgPSByYXcudmFsaWRhdGUgIT09IGZhbHNlOwogICAgICAgICAgdGhpcy5jb21tZW50U2V2ZXJpdHkgPSByYXcuYWxsb3dDb21tZW50cyA/IHZvaWQgMCA6IERpYWdub3N0aWNTZXZlcml0eS5FcnJvcjsKICAgICAgICB9CiAgICAgIH07CiAgICAgIEpTT05WYWxpZGF0aW9uMi5wcm90b3R5cGUuZG9WYWxpZGF0aW9uID0gZnVuY3Rpb24odGV4dERvY3VtZW50LCBqc29uRG9jdW1lbnQsIGRvY3VtZW50U2V0dGluZ3MsIHNjaGVtYSkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgaWYgKCF0aGlzLnZhbGlkYXRpb25FbmFibGVkKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5wcm9taXNlLnJlc29sdmUoW10pOwogICAgICAgIH0KICAgICAgICB2YXIgZGlhZ25vc3RpY3MgPSBbXTsKICAgICAgICB2YXIgYWRkZWQgPSB7fTsKICAgICAgICB2YXIgYWRkUHJvYmxlbSA9IGZ1bmN0aW9uKHByb2JsZW0pIHsKICAgICAgICAgIHZhciBzaWduYXR1cmUgPSBwcm9ibGVtLnJhbmdlLnN0YXJ0LmxpbmUgKyAiICIgKyBwcm9ibGVtLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciArICIgIiArIHByb2JsZW0ubWVzc2FnZTsKICAgICAgICAgIGlmICghYWRkZWRbc2lnbmF0dXJlXSkgewogICAgICAgICAgICBhZGRlZFtzaWduYXR1cmVdID0gdHJ1ZTsKICAgICAgICAgICAgZGlhZ25vc3RpY3MucHVzaChwcm9ibGVtKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHZhciBnZXREaWFnbm9zdGljcyA9IGZ1bmN0aW9uKHNjaGVtYTIpIHsKICAgICAgICAgIHZhciB0cmFpbGluZ0NvbW1hU2V2ZXJpdHkgPSAoZG9jdW1lbnRTZXR0aW5ncyA9PT0gbnVsbCB8fCBkb2N1bWVudFNldHRpbmdzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkb2N1bWVudFNldHRpbmdzLnRyYWlsaW5nQ29tbWFzKSA/IHRvRGlhZ25vc3RpY1NldmVyaXR5KGRvY3VtZW50U2V0dGluZ3MudHJhaWxpbmdDb21tYXMpIDogRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yOwogICAgICAgICAgdmFyIGNvbW1lbnRTZXZlcml0eSA9IChkb2N1bWVudFNldHRpbmdzID09PSBudWxsIHx8IGRvY3VtZW50U2V0dGluZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50U2V0dGluZ3MuY29tbWVudHMpID8gdG9EaWFnbm9zdGljU2V2ZXJpdHkoZG9jdW1lbnRTZXR0aW5ncy5jb21tZW50cykgOiBfdGhpcy5jb21tZW50U2V2ZXJpdHk7CiAgICAgICAgICB2YXIgc2NoZW1hVmFsaWRhdGlvbiA9IChkb2N1bWVudFNldHRpbmdzID09PSBudWxsIHx8IGRvY3VtZW50U2V0dGluZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50U2V0dGluZ3Muc2NoZW1hVmFsaWRhdGlvbikgPyB0b0RpYWdub3N0aWNTZXZlcml0eShkb2N1bWVudFNldHRpbmdzLnNjaGVtYVZhbGlkYXRpb24pIDogRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc7CiAgICAgICAgICB2YXIgc2NoZW1hUmVxdWVzdCA9IChkb2N1bWVudFNldHRpbmdzID09PSBudWxsIHx8IGRvY3VtZW50U2V0dGluZ3MgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRvY3VtZW50U2V0dGluZ3Muc2NoZW1hUmVxdWVzdCkgPyB0b0RpYWdub3N0aWNTZXZlcml0eShkb2N1bWVudFNldHRpbmdzLnNjaGVtYVJlcXVlc3QpIDogRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc7CiAgICAgICAgICBpZiAoc2NoZW1hMikgewogICAgICAgICAgICBpZiAoc2NoZW1hMi5lcnJvcnMubGVuZ3RoICYmIGpzb25Eb2N1bWVudC5yb290ICYmIHNjaGVtYVJlcXVlc3QpIHsKICAgICAgICAgICAgICB2YXIgYXN0Um9vdCA9IGpzb25Eb2N1bWVudC5yb290OwogICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IGFzdFJvb3QudHlwZSA9PT0gIm9iamVjdCIgPyBhc3RSb290LnByb3BlcnRpZXNbMF0gOiB2b2lkIDA7CiAgICAgICAgICAgICAgaWYgKHByb3BlcnR5ICYmIHByb3BlcnR5LmtleU5vZGUudmFsdWUgPT09ICIkc2NoZW1hIikgewogICAgICAgICAgICAgICAgdmFyIG5vZGUgPSBwcm9wZXJ0eS52YWx1ZU5vZGUgfHwgcHJvcGVydHk7CiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBSYW5nZS5jcmVhdGUodGV4dERvY3VtZW50LnBvc2l0aW9uQXQobm9kZS5vZmZzZXQpLCB0ZXh0RG9jdW1lbnQucG9zaXRpb25BdChub2RlLm9mZnNldCArIG5vZGUubGVuZ3RoKSk7CiAgICAgICAgICAgICAgICBhZGRQcm9ibGVtKERpYWdub3N0aWMuY3JlYXRlKHJhbmdlLCBzY2hlbWEyLmVycm9yc1swXSwgc2NoZW1hUmVxdWVzdCwgRXJyb3JDb2RlLlNjaGVtYVJlc29sdmVFcnJvcikpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSBSYW5nZS5jcmVhdGUodGV4dERvY3VtZW50LnBvc2l0aW9uQXQoYXN0Um9vdC5vZmZzZXQpLCB0ZXh0RG9jdW1lbnQucG9zaXRpb25BdChhc3RSb290Lm9mZnNldCArIDEpKTsKICAgICAgICAgICAgICAgIGFkZFByb2JsZW0oRGlhZ25vc3RpYy5jcmVhdGUocmFuZ2UsIHNjaGVtYTIuZXJyb3JzWzBdLCBzY2hlbWFSZXF1ZXN0LCBFcnJvckNvZGUuU2NoZW1hUmVzb2x2ZUVycm9yKSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKHNjaGVtYVZhbGlkYXRpb24pIHsKICAgICAgICAgICAgICB2YXIgc2VtYW50aWNFcnJvcnMgPSBqc29uRG9jdW1lbnQudmFsaWRhdGUodGV4dERvY3VtZW50LCBzY2hlbWEyLnNjaGVtYSwgc2NoZW1hVmFsaWRhdGlvbik7CiAgICAgICAgICAgICAgaWYgKHNlbWFudGljRXJyb3JzKSB7CiAgICAgICAgICAgICAgICBzZW1hbnRpY0Vycm9ycy5mb3JFYWNoKGFkZFByb2JsZW0pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2NoZW1hQWxsb3dzQ29tbWVudHMoc2NoZW1hMi5zY2hlbWEpKSB7CiAgICAgICAgICAgICAgY29tbWVudFNldmVyaXR5ID0gdm9pZCAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzY2hlbWFBbGxvd3NUcmFpbGluZ0NvbW1hcyhzY2hlbWEyLnNjaGVtYSkpIHsKICAgICAgICAgICAgICB0cmFpbGluZ0NvbW1hU2V2ZXJpdHkgPSB2b2lkIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBqc29uRG9jdW1lbnQuc3ludGF4RXJyb3JzOyBfaSA8IF9hLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICB2YXIgcCA9IF9hW19pXTsKICAgICAgICAgICAgaWYgKHAuY29kZSA9PT0gRXJyb3JDb2RlLlRyYWlsaW5nQ29tbWEpIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIHRyYWlsaW5nQ29tbWFTZXZlcml0eSAhPT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwLnNldmVyaXR5ID0gdHJhaWxpbmdDb21tYVNldmVyaXR5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkZFByb2JsZW0ocCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodHlwZW9mIGNvbW1lbnRTZXZlcml0eSA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgdmFyIG1lc3NhZ2VfMSA9IGxvY2FsaXplNSgiSW52YWxpZENvbW1lbnRUb2tlbiIsICJDb21tZW50cyBhcmUgbm90IHBlcm1pdHRlZCBpbiBKU09OLiIpOwogICAgICAgICAgICBqc29uRG9jdW1lbnQuY29tbWVudHMuZm9yRWFjaChmdW5jdGlvbihjKSB7CiAgICAgICAgICAgICAgYWRkUHJvYmxlbShEaWFnbm9zdGljLmNyZWF0ZShjLCBtZXNzYWdlXzEsIGNvbW1lbnRTZXZlcml0eSwgRXJyb3JDb2RlLkNvbW1lbnROb3RQZXJtaXR0ZWQpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZGlhZ25vc3RpY3M7CiAgICAgICAgfTsKICAgICAgICBpZiAoc2NoZW1hKSB7CiAgICAgICAgICB2YXIgaWQgPSBzY2hlbWEuaWQgfHwgInNjaGVtYXNlcnZpY2U6Ly91bnRpdGxlZC8iICsgaWRDb3VudGVyMisrOwogICAgICAgICAgcmV0dXJuIHRoaXMuanNvblNjaGVtYVNlcnZpY2UucmVzb2x2ZVNjaGVtYUNvbnRlbnQobmV3IFVucmVzb2x2ZWRTY2hlbWEoc2NoZW1hKSwgaWQsIHt9KS50aGVuKGZ1bmN0aW9uKHJlc29sdmVkU2NoZW1hKSB7CiAgICAgICAgICAgIHJldHVybiBnZXREaWFnbm9zdGljcyhyZXNvbHZlZFNjaGVtYSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuanNvblNjaGVtYVNlcnZpY2UuZ2V0U2NoZW1hRm9yUmVzb3VyY2UodGV4dERvY3VtZW50LnVyaSwganNvbkRvY3VtZW50KS50aGVuKGZ1bmN0aW9uKHNjaGVtYTIpIHsKICAgICAgICAgIHJldHVybiBnZXREaWFnbm9zdGljcyhzY2hlbWEyKTsKICAgICAgICB9KTsKICAgICAgfTsKICAgICAgcmV0dXJuIEpTT05WYWxpZGF0aW9uMjsKICAgIH0oKTsKICAgIHZhciBpZENvdW50ZXIyID0gMDsKICAgIGZ1bmN0aW9uIHNjaGVtYUFsbG93c0NvbW1lbnRzKHNjaGVtYVJlZikgewogICAgICBpZiAoc2NoZW1hUmVmICYmIHR5cGVvZiBzY2hlbWFSZWYgPT09ICJvYmplY3QiKSB7CiAgICAgICAgaWYgKGlzQm9vbGVhbihzY2hlbWFSZWYuYWxsb3dDb21tZW50cykpIHsKICAgICAgICAgIHJldHVybiBzY2hlbWFSZWYuYWxsb3dDb21tZW50czsKICAgICAgICB9CiAgICAgICAgaWYgKHNjaGVtYVJlZi5hbGxPZikgewogICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHNjaGVtYVJlZi5hbGxPZjsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgdmFyIHNjaGVtYSA9IF9hW19pXTsKICAgICAgICAgICAgdmFyIGFsbG93ID0gc2NoZW1hQWxsb3dzQ29tbWVudHMoc2NoZW1hKTsKICAgICAgICAgICAgaWYgKGlzQm9vbGVhbihhbGxvdykpIHsKICAgICAgICAgICAgICByZXR1cm4gYWxsb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZvaWQgMDsKICAgIH0KICAgIGZ1bmN0aW9uIHNjaGVtYUFsbG93c1RyYWlsaW5nQ29tbWFzKHNjaGVtYVJlZikgewogICAgICBpZiAoc2NoZW1hUmVmICYmIHR5cGVvZiBzY2hlbWFSZWYgPT09ICJvYmplY3QiKSB7CiAgICAgICAgaWYgKGlzQm9vbGVhbihzY2hlbWFSZWYuYWxsb3dUcmFpbGluZ0NvbW1hcykpIHsKICAgICAgICAgIHJldHVybiBzY2hlbWFSZWYuYWxsb3dUcmFpbGluZ0NvbW1hczsKICAgICAgICB9CiAgICAgICAgdmFyIGRlcHJTY2hlbWFSZWYgPSBzY2hlbWFSZWY7CiAgICAgICAgaWYgKGlzQm9vbGVhbihkZXByU2NoZW1hUmVmWyJhbGxvd3NUcmFpbGluZ0NvbW1hcyJdKSkgewogICAgICAgICAgcmV0dXJuIGRlcHJTY2hlbWFSZWZbImFsbG93c1RyYWlsaW5nQ29tbWFzIl07CiAgICAgICAgfQogICAgICAgIGlmIChzY2hlbWFSZWYuYWxsT2YpIHsKICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgX2EgPSBzY2hlbWFSZWYuYWxsT2Y7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgIHZhciBzY2hlbWEgPSBfYVtfaV07CiAgICAgICAgICAgIHZhciBhbGxvdyA9IHNjaGVtYUFsbG93c1RyYWlsaW5nQ29tbWFzKHNjaGVtYSk7CiAgICAgICAgICAgIGlmIChpc0Jvb2xlYW4oYWxsb3cpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGFsbG93OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB2b2lkIDA7CiAgICB9CiAgICBmdW5jdGlvbiB0b0RpYWdub3N0aWNTZXZlcml0eShzZXZlcml0eUxldmVsKSB7CiAgICAgIHN3aXRjaCAoc2V2ZXJpdHlMZXZlbCkgewogICAgICAgIGNhc2UgImVycm9yIjoKICAgICAgICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3I7CiAgICAgICAgY2FzZSAid2FybmluZyI6CiAgICAgICAgICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc7CiAgICAgICAgY2FzZSAiaWdub3JlIjoKICAgICAgICAgIHJldHVybiB2b2lkIDA7CiAgICAgIH0KICAgICAgcmV0dXJuIHZvaWQgMDsKICAgIH0KCiAgICAvLyBub2RlX21vZHVsZXMvdnNjb2RlLWpzb24tbGFuZ3VhZ2VzZXJ2aWNlL2xpYi9lc20vdXRpbHMvY29sb3JzLmpzCiAgICB2YXIgRGlnaXQwID0gNDg7CiAgICB2YXIgRGlnaXQ5ID0gNTc7CiAgICB2YXIgQSA9IDY1OwogICAgdmFyIGEgPSA5NzsKICAgIHZhciBmID0gMTAyOwogICAgZnVuY3Rpb24gaGV4RGlnaXQoY2hhckNvZGUpIHsKICAgICAgaWYgKGNoYXJDb2RlIDwgRGlnaXQwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgaWYgKGNoYXJDb2RlIDw9IERpZ2l0OSkgewogICAgICAgIHJldHVybiBjaGFyQ29kZSAtIERpZ2l0MDsKICAgICAgfQogICAgICBpZiAoY2hhckNvZGUgPCBhKSB7CiAgICAgICAgY2hhckNvZGUgKz0gYSAtIEE7CiAgICAgIH0KICAgICAgaWYgKGNoYXJDb2RlID49IGEgJiYgY2hhckNvZGUgPD0gZikgewogICAgICAgIHJldHVybiBjaGFyQ29kZSAtIGEgKyAxMDsKICAgICAgfQogICAgICByZXR1cm4gMDsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbG9yRnJvbUhleCh0ZXh0KSB7CiAgICAgIGlmICh0ZXh0WzBdICE9PSAiIyIpIHsKICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICB9CiAgICAgIHN3aXRjaCAodGV4dC5sZW5ndGgpIHsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZWQ6IGhleERpZ2l0KHRleHQuY2hhckNvZGVBdCgxKSkgKiAxNyAvIDI1NSwKICAgICAgICAgICAgZ3JlZW46IGhleERpZ2l0KHRleHQuY2hhckNvZGVBdCgyKSkgKiAxNyAvIDI1NSwKICAgICAgICAgICAgYmx1ZTogaGV4RGlnaXQodGV4dC5jaGFyQ29kZUF0KDMpKSAqIDE3IC8gMjU1LAogICAgICAgICAgICBhbHBoYTogMQogICAgICAgICAgfTsKICAgICAgICBjYXNlIDU6CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICByZWQ6IGhleERpZ2l0KHRleHQuY2hhckNvZGVBdCgxKSkgKiAxNyAvIDI1NSwKICAgICAgICAgICAgZ3JlZW46IGhleERpZ2l0KHRleHQuY2hhckNvZGVBdCgyKSkgKiAxNyAvIDI1NSwKICAgICAgICAgICAgYmx1ZTogaGV4RGlnaXQodGV4dC5jaGFyQ29kZUF0KDMpKSAqIDE3IC8gMjU1LAogICAgICAgICAgICBhbHBoYTogaGV4RGlnaXQodGV4dC5jaGFyQ29kZUF0KDQpKSAqIDE3IC8gMjU1CiAgICAgICAgICB9OwogICAgICAgIGNhc2UgNzoKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJlZDogKGhleERpZ2l0KHRleHQuY2hhckNvZGVBdCgxKSkgKiAxNiArIGhleERpZ2l0KHRleHQuY2hhckNvZGVBdCgyKSkpIC8gMjU1LAogICAgICAgICAgICBncmVlbjogKGhleERpZ2l0KHRleHQuY2hhckNvZGVBdCgzKSkgKiAxNiArIGhleERpZ2l0KHRleHQuY2hhckNvZGVBdCg0KSkpIC8gMjU1LAogICAgICAgICAgICBibHVlOiAoaGV4RGlnaXQodGV4dC5jaGFyQ29kZUF0KDUpKSAqIDE2ICsgaGV4RGlnaXQodGV4dC5jaGFyQ29kZUF0KDYpKSkgLyAyNTUsCiAgICAgICAgICAgIGFscGhhOiAxCiAgICAgICAgICB9OwogICAgICAgIGNhc2UgOToKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJlZDogKGhleERpZ2l0KHRleHQuY2hhckNvZGVBdCgxKSkgKiAxNiArIGhleERpZ2l0KHRleHQuY2hhckNvZGVBdCgyKSkpIC8gMjU1LAogICAgICAgICAgICBncmVlbjogKGhleERpZ2l0KHRleHQuY2hhckNvZGVBdCgzKSkgKiAxNiArIGhleERpZ2l0KHRleHQuY2hhckNvZGVBdCg0KSkpIC8gMjU1LAogICAgICAgICAgICBibHVlOiAoaGV4RGlnaXQodGV4dC5jaGFyQ29kZUF0KDUpKSAqIDE2ICsgaGV4RGlnaXQodGV4dC5jaGFyQ29kZUF0KDYpKSkgLyAyNTUsCiAgICAgICAgICAgIGFscGhhOiAoaGV4RGlnaXQodGV4dC5jaGFyQ29kZUF0KDcpKSAqIDE2ICsgaGV4RGlnaXQodGV4dC5jaGFyQ29kZUF0KDgpKSkgLyAyNTUKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHZvaWQgMDsKICAgIH0KCiAgICAvLyBub2RlX21vZHVsZXMvdnNjb2RlLWpzb24tbGFuZ3VhZ2VzZXJ2aWNlL2xpYi9lc20vc2VydmljZXMvanNvbkRvY3VtZW50U3ltYm9scy5qcwogICAgdmFyIEpTT05Eb2N1bWVudFN5bWJvbHMgPSBmdW5jdGlvbigpIHsKICAgICAgZnVuY3Rpb24gSlNPTkRvY3VtZW50U3ltYm9sczIoc2NoZW1hU2VydmljZSkgewogICAgICAgIHRoaXMuc2NoZW1hU2VydmljZSA9IHNjaGVtYVNlcnZpY2U7CiAgICAgIH0KICAgICAgSlNPTkRvY3VtZW50U3ltYm9sczIucHJvdG90eXBlLmZpbmREb2N1bWVudFN5bWJvbHMgPSBmdW5jdGlvbihkb2N1bWVudCwgZG9jLCBjb250ZXh0KSB7CiAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICBpZiAoY29udGV4dCA9PT0gdm9pZCAwKSB7CiAgICAgICAgICBjb250ZXh0ID0geyByZXN1bHRMaW1pdDogTnVtYmVyLk1BWF9WQUxVRSB9OwogICAgICAgIH0KICAgICAgICB2YXIgcm9vdCA9IGRvYy5yb290OwogICAgICAgIGlmICghcm9vdCkgewogICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICB2YXIgbGltaXQgPSBjb250ZXh0LnJlc3VsdExpbWl0IHx8IE51bWJlci5NQVhfVkFMVUU7CiAgICAgICAgdmFyIHJlc291cmNlU3RyaW5nID0gZG9jdW1lbnQudXJpOwogICAgICAgIGlmIChyZXNvdXJjZVN0cmluZyA9PT0gInZzY29kZTovL2RlZmF1bHRzZXR0aW5ncy9rZXliaW5kaW5ncy5qc29uIiB8fCBlbmRzV2l0aChyZXNvdXJjZVN0cmluZy50b0xvd2VyQ2FzZSgpLCAiL3VzZXIva2V5YmluZGluZ3MuanNvbiIpKSB7CiAgICAgICAgICBpZiAocm9vdC50eXBlID09PSAiYXJyYXkiKSB7CiAgICAgICAgICAgIHZhciByZXN1bHRfMSA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIF9hID0gcm9vdC5pdGVtczsgX2kgPCBfYS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICB2YXIgaXRlbSA9IF9hW19pXTsKICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlID09PSAib2JqZWN0IikgewogICAgICAgICAgICAgICAgZm9yICh2YXIgX2IgPSAwLCBfYyA9IGl0ZW0ucHJvcGVydGllczsgX2IgPCBfYy5sZW5ndGg7IF9iKyspIHsKICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gX2NbX2JdOwogICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkua2V5Tm9kZS52YWx1ZSA9PT0gImtleSIgJiYgcHJvcGVydHkudmFsdWVOb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gTG9jYXRpb24uY3JlYXRlKGRvY3VtZW50LnVyaSwgZ2V0UmFuZ2UoZG9jdW1lbnQsIGl0ZW0pKTsKICAgICAgICAgICAgICAgICAgICByZXN1bHRfMS5wdXNoKHsgbmFtZTogZ2V0Tm9kZVZhbHVlMyhwcm9wZXJ0eS52YWx1ZU5vZGUpLCBraW5kOiBTeW1ib2xLaW5kLkZ1bmN0aW9uLCBsb2NhdGlvbiB9KTsKICAgICAgICAgICAgICAgICAgICBsaW1pdC0tOwogICAgICAgICAgICAgICAgICAgIGlmIChsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Lm9uUmVzdWx0TGltaXRFeGNlZWRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm9uUmVzdWx0TGltaXRFeGNlZWRlZChyZXNvdXJjZVN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0XzE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHRfMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHRvVmlzaXQgPSBbCiAgICAgICAgICB7IG5vZGU6IHJvb3QsIGNvbnRhaW5lck5hbWU6ICIiIH0KICAgICAgICBdOwogICAgICAgIHZhciBuZXh0VG9WaXNpdCA9IDA7CiAgICAgICAgdmFyIGxpbWl0RXhjZWVkZWQgPSBmYWxzZTsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgdmFyIGNvbGxlY3RPdXRsaW5lRW50cmllcyA9IGZ1bmN0aW9uKG5vZGUsIGNvbnRhaW5lck5hbWUpIHsKICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICJhcnJheSIpIHsKICAgICAgICAgICAgbm9kZS5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUyKSB7CiAgICAgICAgICAgICAgaWYgKG5vZGUyKSB7CiAgICAgICAgICAgICAgICB0b1Zpc2l0LnB1c2goeyBub2RlOiBub2RlMiwgY29udGFpbmVyTmFtZSB9KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIG5vZGUucHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKHByb3BlcnR5MikgewogICAgICAgICAgICAgIHZhciB2YWx1ZU5vZGUgPSBwcm9wZXJ0eTIudmFsdWVOb2RlOwogICAgICAgICAgICAgIGlmICh2YWx1ZU5vZGUpIHsKICAgICAgICAgICAgICAgIGlmIChsaW1pdCA+IDApIHsKICAgICAgICAgICAgICAgICAgbGltaXQtLTsKICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uMiA9IExvY2F0aW9uLmNyZWF0ZShkb2N1bWVudC51cmksIGdldFJhbmdlKGRvY3VtZW50LCBwcm9wZXJ0eTIpKTsKICAgICAgICAgICAgICAgICAgdmFyIGNoaWxkQ29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWUgPyBjb250YWluZXJOYW1lICsgIi4iICsgcHJvcGVydHkyLmtleU5vZGUudmFsdWUgOiBwcm9wZXJ0eTIua2V5Tm9kZS52YWx1ZTsKICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBuYW1lOiBfdGhpcy5nZXRLZXlMYWJlbChwcm9wZXJ0eTIpLCBraW5kOiBfdGhpcy5nZXRTeW1ib2xLaW5kKHZhbHVlTm9kZS50eXBlKSwgbG9jYXRpb246IGxvY2F0aW9uMiwgY29udGFpbmVyTmFtZSB9KTsKICAgICAgICAgICAgICAgICAgdG9WaXNpdC5wdXNoKHsgbm9kZTogdmFsdWVOb2RlLCBjb250YWluZXJOYW1lOiBjaGlsZENvbnRhaW5lck5hbWUgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBsaW1pdEV4Y2VlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgd2hpbGUgKG5leHRUb1Zpc2l0IDwgdG9WaXNpdC5sZW5ndGgpIHsKICAgICAgICAgIHZhciBuZXh0ID0gdG9WaXNpdFtuZXh0VG9WaXNpdCsrXTsKICAgICAgICAgIGNvbGxlY3RPdXRsaW5lRW50cmllcyhuZXh0Lm5vZGUsIG5leHQuY29udGFpbmVyTmFtZSk7CiAgICAgICAgfQogICAgICAgIGlmIChsaW1pdEV4Y2VlZGVkICYmIGNvbnRleHQgJiYgY29udGV4dC5vblJlc3VsdExpbWl0RXhjZWVkZWQpIHsKICAgICAgICAgIGNvbnRleHQub25SZXN1bHRMaW1pdEV4Y2VlZGVkKHJlc291cmNlU3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgSlNPTkRvY3VtZW50U3ltYm9sczIucHJvdG90eXBlLmZpbmREb2N1bWVudFN5bWJvbHMyID0gZnVuY3Rpb24oZG9jdW1lbnQsIGRvYywgY29udGV4dCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgaWYgKGNvbnRleHQgPT09IHZvaWQgMCkgewogICAgICAgICAgY29udGV4dCA9IHsgcmVzdWx0TGltaXQ6IE51bWJlci5NQVhfVkFMVUUgfTsKICAgICAgICB9CiAgICAgICAgdmFyIHJvb3QgPSBkb2Mucm9vdDsKICAgICAgICBpZiAoIXJvb3QpIHsKICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICAgICAgdmFyIGxpbWl0ID0gY29udGV4dC5yZXN1bHRMaW1pdCB8fCBOdW1iZXIuTUFYX1ZBTFVFOwogICAgICAgIHZhciByZXNvdXJjZVN0cmluZyA9IGRvY3VtZW50LnVyaTsKICAgICAgICBpZiAocmVzb3VyY2VTdHJpbmcgPT09ICJ2c2NvZGU6Ly9kZWZhdWx0c2V0dGluZ3Mva2V5YmluZGluZ3MuanNvbiIgfHwgZW5kc1dpdGgocmVzb3VyY2VTdHJpbmcudG9Mb3dlckNhc2UoKSwgIi91c2VyL2tleWJpbmRpbmdzLmpzb24iKSkgewogICAgICAgICAgaWYgKHJvb3QudHlwZSA9PT0gImFycmF5IikgewogICAgICAgICAgICB2YXIgcmVzdWx0XzIgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBfYSA9IHJvb3QuaXRlbXM7IF9pIDwgX2EubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgdmFyIGl0ZW0gPSBfYVtfaV07CiAgICAgICAgICAgICAgaWYgKGl0ZW0udHlwZSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIF9iID0gMCwgX2MgPSBpdGVtLnByb3BlcnRpZXM7IF9iIDwgX2MubGVuZ3RoOyBfYisrKSB7CiAgICAgICAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IF9jW19iXTsKICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmtleU5vZGUudmFsdWUgPT09ICJrZXkiICYmIHByb3BlcnR5LnZhbHVlTm9kZSkgewogICAgICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IGdldFJhbmdlKGRvY3VtZW50LCBpdGVtKTsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZWN0aW9uUmFuZ2UgPSBnZXRSYW5nZShkb2N1bWVudCwgcHJvcGVydHkua2V5Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0XzIucHVzaCh7IG5hbWU6IGdldE5vZGVWYWx1ZTMocHJvcGVydHkudmFsdWVOb2RlKSwga2luZDogU3ltYm9sS2luZC5GdW5jdGlvbiwgcmFuZ2UsIHNlbGVjdGlvblJhbmdlIH0pOwogICAgICAgICAgICAgICAgICAgIGxpbWl0LS07CiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbWl0IDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQub25SZXN1bHRMaW1pdEV4Y2VlZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQub25SZXN1bHRMaW1pdEV4Y2VlZGVkKHJlc291cmNlU3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRfMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdF8yOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgdmFyIHRvVmlzaXQgPSBbCiAgICAgICAgICB7IG5vZGU6IHJvb3QsIHJlc3VsdCB9CiAgICAgICAgXTsKICAgICAgICB2YXIgbmV4dFRvVmlzaXQgPSAwOwogICAgICAgIHZhciBsaW1pdEV4Y2VlZGVkID0gZmFsc2U7CiAgICAgICAgdmFyIGNvbGxlY3RPdXRsaW5lRW50cmllcyA9IGZ1bmN0aW9uKG5vZGUsIHJlc3VsdDIpIHsKICAgICAgICAgIGlmIChub2RlLnR5cGUgPT09ICJhcnJheSIpIHsKICAgICAgICAgICAgbm9kZS5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKG5vZGUyLCBpbmRleCkgewogICAgICAgICAgICAgIGlmIChub2RlMikgewogICAgICAgICAgICAgICAgaWYgKGxpbWl0ID4gMCkgewogICAgICAgICAgICAgICAgICBsaW1pdC0tOwogICAgICAgICAgICAgICAgICB2YXIgcmFuZ2UyID0gZ2V0UmFuZ2UoZG9jdW1lbnQsIG5vZGUyKTsKICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdGlvblJhbmdlMiA9IHJhbmdlMjsKICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBTdHJpbmcoaW5kZXgpOwogICAgICAgICAgICAgICAgICB2YXIgc3ltYm9sID0geyBuYW1lLCBraW5kOiBfdGhpcy5nZXRTeW1ib2xLaW5kKG5vZGUyLnR5cGUpLCByYW5nZTogcmFuZ2UyLCBzZWxlY3Rpb25SYW5nZTogc2VsZWN0aW9uUmFuZ2UyLCBjaGlsZHJlbjogW10gfTsKICAgICAgICAgICAgICAgICAgcmVzdWx0Mi5wdXNoKHN5bWJvbCk7CiAgICAgICAgICAgICAgICAgIHRvVmlzaXQucHVzaCh7IHJlc3VsdDogc3ltYm9sLmNoaWxkcmVuLCBub2RlOiBub2RlMiB9KTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGxpbWl0RXhjZWVkZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgbm9kZS5wcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24ocHJvcGVydHkyKSB7CiAgICAgICAgICAgICAgdmFyIHZhbHVlTm9kZSA9IHByb3BlcnR5Mi52YWx1ZU5vZGU7CiAgICAgICAgICAgICAgaWYgKHZhbHVlTm9kZSkgewogICAgICAgICAgICAgICAgaWYgKGxpbWl0ID4gMCkgewogICAgICAgICAgICAgICAgICBsaW1pdC0tOwogICAgICAgICAgICAgICAgICB2YXIgcmFuZ2UyID0gZ2V0UmFuZ2UoZG9jdW1lbnQsIHByb3BlcnR5Mik7CiAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3Rpb25SYW5nZTIgPSBnZXRSYW5nZShkb2N1bWVudCwgcHJvcGVydHkyLmtleU5vZGUpOwogICAgICAgICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBbXTsKICAgICAgICAgICAgICAgICAgdmFyIHN5bWJvbCA9IHsgbmFtZTogX3RoaXMuZ2V0S2V5TGFiZWwocHJvcGVydHkyKSwga2luZDogX3RoaXMuZ2V0U3ltYm9sS2luZCh2YWx1ZU5vZGUudHlwZSksIHJhbmdlOiByYW5nZTIsIHNlbGVjdGlvblJhbmdlOiBzZWxlY3Rpb25SYW5nZTIsIGNoaWxkcmVuLCBkZXRhaWw6IF90aGlzLmdldERldGFpbCh2YWx1ZU5vZGUpIH07CiAgICAgICAgICAgICAgICAgIHJlc3VsdDIucHVzaChzeW1ib2wpOwogICAgICAgICAgICAgICAgICB0b1Zpc2l0LnB1c2goeyByZXN1bHQ6IGNoaWxkcmVuLCBub2RlOiB2YWx1ZU5vZGUgfSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBsaW1pdEV4Y2VlZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgd2hpbGUgKG5leHRUb1Zpc2l0IDwgdG9WaXNpdC5sZW5ndGgpIHsKICAgICAgICAgIHZhciBuZXh0ID0gdG9WaXNpdFtuZXh0VG9WaXNpdCsrXTsKICAgICAgICAgIGNvbGxlY3RPdXRsaW5lRW50cmllcyhuZXh0Lm5vZGUsIG5leHQucmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgaWYgKGxpbWl0RXhjZWVkZWQgJiYgY29udGV4dCAmJiBjb250ZXh0Lm9uUmVzdWx0TGltaXRFeGNlZWRlZCkgewogICAgICAgICAgY29udGV4dC5vblJlc3VsdExpbWl0RXhjZWVkZWQocmVzb3VyY2VTdHJpbmcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICBKU09ORG9jdW1lbnRTeW1ib2xzMi5wcm90b3R5cGUuZ2V0U3ltYm9sS2luZCA9IGZ1bmN0aW9uKG5vZGVUeXBlKSB7CiAgICAgICAgc3dpdGNoIChub2RlVHlwZSkgewogICAgICAgICAgY2FzZSAib2JqZWN0IjoKICAgICAgICAgICAgcmV0dXJuIFN5bWJvbEtpbmQuTW9kdWxlOwogICAgICAgICAgY2FzZSAic3RyaW5nIjoKICAgICAgICAgICAgcmV0dXJuIFN5bWJvbEtpbmQuU3RyaW5nOwogICAgICAgICAgY2FzZSAibnVtYmVyIjoKICAgICAgICAgICAgcmV0dXJuIFN5bWJvbEtpbmQuTnVtYmVyOwogICAgICAgICAgY2FzZSAiYXJyYXkiOgogICAgICAgICAgICByZXR1cm4gU3ltYm9sS2luZC5BcnJheTsKICAgICAgICAgIGNhc2UgImJvb2xlYW4iOgogICAgICAgICAgICByZXR1cm4gU3ltYm9sS2luZC5Cb29sZWFuOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgcmV0dXJuIFN5bWJvbEtpbmQuVmFyaWFibGU7CiAgICAgICAgfQogICAgICB9OwogICAgICBKU09ORG9jdW1lbnRTeW1ib2xzMi5wcm90b3R5cGUuZ2V0S2V5TGFiZWwgPSBmdW5jdGlvbihwcm9wZXJ0eSkgewogICAgICAgIHZhciBuYW1lID0gcHJvcGVydHkua2V5Tm9kZS52YWx1ZTsKICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvW1xuXS9nLCAiXHUyMUI1Iik7CiAgICAgICAgfQogICAgICAgIGlmIChuYW1lICYmIG5hbWUudHJpbSgpKSB7CiAgICAgICAgICByZXR1cm4gbmFtZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICciJyArIG5hbWUgKyAnIic7CiAgICAgIH07CiAgICAgIEpTT05Eb2N1bWVudFN5bWJvbHMyLnByb3RvdHlwZS5nZXREZXRhaWwgPSBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgICByZXR1cm4gdm9pZCAwOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZS50eXBlID09PSAiYm9vbGVhbiIgfHwgbm9kZS50eXBlID09PSAibnVtYmVyIiB8fCBub2RlLnR5cGUgPT09ICJudWxsIiB8fCBub2RlLnR5cGUgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICByZXR1cm4gU3RyaW5nKG5vZGUudmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobm9kZS50eXBlID09PSAiYXJyYXkiKSB7CiAgICAgICAgICAgIHJldHVybiBub2RlLmNoaWxkcmVuLmxlbmd0aCA/IHZvaWQgMCA6ICJbXSI7CiAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID8gdm9pZCAwIDogInt9IjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZvaWQgMDsKICAgICAgfTsKICAgICAgSlNPTkRvY3VtZW50U3ltYm9sczIucHJvdG90eXBlLmZpbmREb2N1bWVudENvbG9ycyA9IGZ1bmN0aW9uKGRvY3VtZW50LCBkb2MsIGNvbnRleHQpIHsKICAgICAgICByZXR1cm4gdGhpcy5zY2hlbWFTZXJ2aWNlLmdldFNjaGVtYUZvclJlc291cmNlKGRvY3VtZW50LnVyaSwgZG9jKS50aGVuKGZ1bmN0aW9uKHNjaGVtYSkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgaWYgKHNjaGVtYSkgewogICAgICAgICAgICB2YXIgbGltaXQgPSBjb250ZXh0ICYmIHR5cGVvZiBjb250ZXh0LnJlc3VsdExpbWl0ID09PSAibnVtYmVyIiA/IGNvbnRleHQucmVzdWx0TGltaXQgOiBOdW1iZXIuTUFYX1ZBTFVFOwogICAgICAgICAgICB2YXIgbWF0Y2hpbmdTY2hlbWFzID0gZG9jLmdldE1hdGNoaW5nU2NoZW1hcyhzY2hlbWEuc2NoZW1hKTsKICAgICAgICAgICAgdmFyIHZpc2l0ZWROb2RlID0ge307CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMCwgbWF0Y2hpbmdTY2hlbWFzXzEgPSBtYXRjaGluZ1NjaGVtYXM7IF9pIDwgbWF0Y2hpbmdTY2hlbWFzXzEubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgdmFyIHMgPSBtYXRjaGluZ1NjaGVtYXNfMVtfaV07CiAgICAgICAgICAgICAgaWYgKCFzLmludmVydGVkICYmIHMuc2NoZW1hICYmIChzLnNjaGVtYS5mb3JtYXQgPT09ICJjb2xvciIgfHwgcy5zY2hlbWEuZm9ybWF0ID09PSAiY29sb3ItaGV4IikgJiYgcy5ub2RlICYmIHMubm9kZS50eXBlID09PSAic3RyaW5nIikgewogICAgICAgICAgICAgICAgdmFyIG5vZGVJZCA9IFN0cmluZyhzLm5vZGUub2Zmc2V0KTsKICAgICAgICAgICAgICAgIGlmICghdmlzaXRlZE5vZGVbbm9kZUlkXSkgewogICAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSBjb2xvckZyb21IZXgoZ2V0Tm9kZVZhbHVlMyhzLm5vZGUpKTsKICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJhbmdlID0gZ2V0UmFuZ2UoZG9jdW1lbnQsIHMubm9kZSk7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goeyBjb2xvciwgcmFuZ2UgfSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgdmlzaXRlZE5vZGVbbm9kZUlkXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgIGxpbWl0LS07CiAgICAgICAgICAgICAgICAgIGlmIChsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5vblJlc3VsdExpbWl0RXhjZWVkZWQpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQub25SZXN1bHRMaW1pdEV4Y2VlZGVkKGRvY3VtZW50LnVyaSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIEpTT05Eb2N1bWVudFN5bWJvbHMyLnByb3RvdHlwZS5nZXRDb2xvclByZXNlbnRhdGlvbnMgPSBmdW5jdGlvbihkb2N1bWVudCwgZG9jLCBjb2xvciwgcmFuZ2UpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgdmFyIHJlZDI1NiA9IE1hdGgucm91bmQoY29sb3IucmVkICogMjU1KSwgZ3JlZW4yNTYgPSBNYXRoLnJvdW5kKGNvbG9yLmdyZWVuICogMjU1KSwgYmx1ZTI1NiA9IE1hdGgucm91bmQoY29sb3IuYmx1ZSAqIDI1NSk7CiAgICAgICAgZnVuY3Rpb24gdG9Ud29EaWdpdEhleChuKSB7CiAgICAgICAgICB2YXIgciA9IG4udG9TdHJpbmcoMTYpOwogICAgICAgICAgcmV0dXJuIHIubGVuZ3RoICE9PSAyID8gIjAiICsgciA6IHI7CiAgICAgICAgfQogICAgICAgIHZhciBsYWJlbDsKICAgICAgICBpZiAoY29sb3IuYWxwaGEgPT09IDEpIHsKICAgICAgICAgIGxhYmVsID0gIiMiICsgdG9Ud29EaWdpdEhleChyZWQyNTYpICsgdG9Ud29EaWdpdEhleChncmVlbjI1NikgKyB0b1R3b0RpZ2l0SGV4KGJsdWUyNTYpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsYWJlbCA9ICIjIiArIHRvVHdvRGlnaXRIZXgocmVkMjU2KSArIHRvVHdvRGlnaXRIZXgoZ3JlZW4yNTYpICsgdG9Ud29EaWdpdEhleChibHVlMjU2KSArIHRvVHdvRGlnaXRIZXgoTWF0aC5yb3VuZChjb2xvci5hbHBoYSAqIDI1NSkpOwogICAgICAgIH0KICAgICAgICByZXN1bHQucHVzaCh7IGxhYmVsLCB0ZXh0RWRpdDogVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgSlNPTi5zdHJpbmdpZnkobGFiZWwpKSB9KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgICByZXR1cm4gSlNPTkRvY3VtZW50U3ltYm9sczI7CiAgICB9KCk7CiAgICBmdW5jdGlvbiBnZXRSYW5nZShkb2N1bWVudCwgbm9kZSkgewogICAgICByZXR1cm4gUmFuZ2UuY3JlYXRlKGRvY3VtZW50LnBvc2l0aW9uQXQobm9kZS5vZmZzZXQpLCBkb2N1bWVudC5wb3NpdGlvbkF0KG5vZGUub2Zmc2V0ICsgbm9kZS5sZW5ndGgpKTsKICAgIH0KCiAgICAvLyBub2RlX21vZHVsZXMvdnNjb2RlLWpzb24tbGFuZ3VhZ2VzZXJ2aWNlL2xpYi9lc20vc2VydmljZXMvY29uZmlndXJhdGlvbi5qcwogICAgdmFyIGxvY2FsaXplNiA9IGxvYWRNZXNzYWdlQnVuZGxlKCk7CiAgICB2YXIgc2NoZW1hQ29udHJpYnV0aW9ucyA9IHsKICAgICAgc2NoZW1hQXNzb2NpYXRpb25zOiBbXSwKICAgICAgc2NoZW1hczogewogICAgICAgICJodHRwOi8vanNvbi1zY2hlbWEub3JnL3NjaGVtYSMiOiB7CiAgICAgICAgICAkcmVmOiAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjIgogICAgICAgIH0sCiAgICAgICAgImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyI6IHsKICAgICAgICAgICIkc2NoZW1hIjogImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCiAgICAgICAgICAiZGVmaW5pdGlvbnMiOiB7CiAgICAgICAgICAgICJzY2hlbWFBcnJheSI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogMSwKICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAiJHJlZiI6ICIjIgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgInBvc2l0aXZlSW50ZWdlciI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAibWluaW11bSI6IDAKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInBvc2l0aXZlSW50ZWdlckRlZmF1bHQwIjogewogICAgICAgICAgICAgICJhbGxPZiI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDAKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzaW1wbGVUeXBlcyI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICJlbnVtIjogWwogICAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAgICJib29sZWFuIiwKICAgICAgICAgICAgICAgICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAgICJudWxsIiwKICAgICAgICAgICAgICAgICJudW1iZXIiLAogICAgICAgICAgICAgICAgIm9iamVjdCIsCiAgICAgICAgICAgICAgICAic3RyaW5nIgogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN0cmluZ0FycmF5IjogewogICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAibWluSXRlbXMiOiAxLAogICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHRydWUKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgImlkIjogewogICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICIkc2NoZW1hIjogewogICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aXRsZSI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkZWZhdWx0Ijoge30sCiAgICAgICAgICAgICJtdWx0aXBsZU9mIjogewogICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIsCiAgICAgICAgICAgICAgIm1pbmltdW0iOiAwLAogICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogdHJ1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJleGNsdXNpdmVNYXhpbXVtIjogewogICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICJkZWZhdWx0IjogZmFsc2UKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZXhjbHVzaXZlTWluaW11bSI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJtYXhMZW5ndGgiOiB7CiAgICAgICAgICAgICAgImFsbE9mIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Bvc2l0aXZlSW50ZWdlciIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJtaW5MZW5ndGgiOiB7CiAgICAgICAgICAgICAgImFsbE9mIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Bvc2l0aXZlSW50ZWdlckRlZmF1bHQwIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgInBhdHRlcm4iOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAiZm9ybWF0IjogInJlZ2V4IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiYWRkaXRpb25hbEl0ZW1zIjogewogICAgICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAiZGVmYXVsdCI6IHt9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NjaGVtYUFycmF5IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgImRlZmF1bHQiOiB7fQogICAgICAgICAgICB9LAogICAgICAgICAgICAibWF4SXRlbXMiOiB7CiAgICAgICAgICAgICAgImFsbE9mIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Bvc2l0aXZlSW50ZWdlciIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJtaW5JdGVtcyI6IHsKICAgICAgICAgICAgICAiYWxsT2YiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcG9zaXRpdmVJbnRlZ2VyRGVmYXVsdDAiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAidW5pcXVlSXRlbXMiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICB9LAogICAgICAgICAgICAibWF4UHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAiYWxsT2YiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcG9zaXRpdmVJbnRlZ2VyIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm1pblByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgImFsbE9mIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3Bvc2l0aXZlSW50ZWdlckRlZmF1bHQwIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmVkIjogewogICAgICAgICAgICAgICJhbGxPZiI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJpbmdBcnJheSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgImRlZmF1bHQiOiB7fQogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGVmaW5pdGlvbnMiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAiJHJlZiI6ICIjIgogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgImRlZmF1bHQiOiB7fQogICAgICAgICAgICB9LAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICIkcmVmIjogIiMiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAiZGVmYXVsdCI6IHt9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwYXR0ZXJuUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICIkcmVmIjogIiMiCiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAiZGVmYXVsdCI6IHt9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zdHJpbmdBcnJheSIKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImVudW0iOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICJtaW5JdGVtcyI6IDEsCiAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogdHJ1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc2ltcGxlVHlwZXMiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NpbXBsZVR5cGVzIgogICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAxLAogICAgICAgICAgICAgICAgICAidW5pcXVlSXRlbXMiOiB0cnVlCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAiZm9ybWF0IjogewogICAgICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgImVudW0iOiBbCiAgICAgICAgICAgICAgICAgICAgImRhdGUtdGltZSIsCiAgICAgICAgICAgICAgICAgICAgInVyaSIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIiwKICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUiLAogICAgICAgICAgICAgICAgICAgICJpcHY0IiwKICAgICAgICAgICAgICAgICAgICAiaXB2NiIsCiAgICAgICAgICAgICAgICAgICAgInJlZ2V4IgogICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAiYWxsT2YiOiB7CiAgICAgICAgICAgICAgImFsbE9mIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NjaGVtYUFycmF5IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImFueU9mIjogewogICAgICAgICAgICAgICJhbGxPZiI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJvbmVPZiI6IHsKICAgICAgICAgICAgICAiYWxsT2YiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90IjogewogICAgICAgICAgICAgICJhbGxPZiI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICAgICAiZXhjbHVzaXZlTWF4aW11bSI6IFsKICAgICAgICAgICAgICAibWF4aW11bSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImV4Y2x1c2l2ZU1pbmltdW0iOiBbCiAgICAgICAgICAgICAgIm1pbmltdW0iCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiZGVmYXVsdCI6IHt9CiAgICAgICAgfSwKICAgICAgICAiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNy9zY2hlbWEjIjogewogICAgICAgICAgImRlZmluaXRpb25zIjogewogICAgICAgICAgICAic2NoZW1hQXJyYXkiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICJtaW5JdGVtcyI6IDEsCiAgICAgICAgICAgICAgIml0ZW1zIjogeyAiJHJlZiI6ICIjIiB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub25OZWdhdGl2ZUludGVnZXIiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgIm1pbmltdW0iOiAwCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub25OZWdhdGl2ZUludGVnZXJEZWZhdWx0MCI6IHsKICAgICAgICAgICAgICAiYWxsT2YiOiBbCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyIiB9LAogICAgICAgICAgICAgICAgeyAiZGVmYXVsdCI6IDAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgInNpbXBsZVR5cGVzIjogewogICAgICAgICAgICAgICJlbnVtIjogWwogICAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAgICJib29sZWFuIiwKICAgICAgICAgICAgICAgICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAgICJudWxsIiwKICAgICAgICAgICAgICAgICJudW1iZXIiLAogICAgICAgICAgICAgICAgIm9iamVjdCIsCiAgICAgICAgICAgICAgICAic3RyaW5nIgogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN0cmluZ0FycmF5IjogewogICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAiaXRlbXMiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAidW5pcXVlSXRlbXMiOiB0cnVlLAogICAgICAgICAgICAgICJkZWZhdWx0IjogW10KICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJ0eXBlIjogWyJvYmplY3QiLCAiYm9vbGVhbiJdLAogICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICIkaWQiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaS1yZWZlcmVuY2UiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICIkc2NoZW1hIjogewogICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICIkcmVmIjogewogICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmktcmVmZXJlbmNlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiJGNvbW1lbnQiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGl0bGUiOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUsCiAgICAgICAgICAgICJyZWFkT25seSI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJleGFtcGxlcyI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgIml0ZW1zIjogdHJ1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICAibXVsdGlwbGVPZiI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiLAogICAgICAgICAgICAgICJleGNsdXNpdmVNaW5pbXVtIjogMAogICAgICAgICAgICB9LAogICAgICAgICAgICAibWF4aW11bSI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJleGNsdXNpdmVNYXhpbXVtIjogewogICAgICAgICAgICAgICJ0eXBlIjogIm51bWJlciIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm1pbmltdW0iOiB7CiAgICAgICAgICAgICAgInR5cGUiOiAibnVtYmVyIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZXhjbHVzaXZlTWluaW11bSI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJudW1iZXIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJtYXhMZW5ndGgiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyIiB9LAogICAgICAgICAgICAibWluTGVuZ3RoIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL25vbk5lZ2F0aXZlSW50ZWdlckRlZmF1bHQwIiB9LAogICAgICAgICAgICAicGF0dGVybiI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICJmb3JtYXQiOiAicmVnZXgiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhZGRpdGlvbmFsSXRlbXMiOiB7ICIkcmVmIjogIiMiIH0sCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMiIH0sCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkiIH0KICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICB9LAogICAgICAgICAgICAibWF4SXRlbXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyIiB9LAogICAgICAgICAgICAibWluSXRlbXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyRGVmYXVsdDAiIH0sCiAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjb250YWlucyI6IHsgIiRyZWYiOiAiIyIgfSwKICAgICAgICAgICAgIm1heFByb3BlcnRpZXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyIiB9LAogICAgICAgICAgICAibWluUHJvcGVydGllcyI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9ub25OZWdhdGl2ZUludGVnZXJEZWZhdWx0MCIgfSwKICAgICAgICAgICAgInJlcXVpcmVkIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3N0cmluZ0FycmF5IiB9LAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7ICIkcmVmIjogIiMiIH0sCiAgICAgICAgICAgICJkZWZpbml0aW9ucyI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsgIiRyZWYiOiAiIyIgfSwKICAgICAgICAgICAgICAiZGVmYXVsdCI6IHt9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAiJHJlZiI6ICIjIiB9LAogICAgICAgICAgICAgICJkZWZhdWx0Ijoge30KICAgICAgICAgICAgfSwKICAgICAgICAgICAgInBhdHRlcm5Qcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAiJHJlZiI6ICIjIiB9LAogICAgICAgICAgICAgICJwcm9wZXJ0eU5hbWVzIjogeyAiZm9ybWF0IjogInJlZ2V4IiB9LAogICAgICAgICAgICAgICJkZWZhdWx0Ijoge30KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjIiB9LAogICAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc3RyaW5nQXJyYXkiIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcm9wZXJ0eU5hbWVzIjogeyAiJHJlZiI6ICIjIiB9LAogICAgICAgICAgICAiY29uc3QiOiB0cnVlLAogICAgICAgICAgICAiZW51bSI6IHsKICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgIml0ZW1zIjogdHJ1ZSwKICAgICAgICAgICAgICAibWluSXRlbXMiOiAxLAogICAgICAgICAgICAgICJ1bmlxdWVJdGVtcyI6IHRydWUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgImFueU9mIjogWwogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NpbXBsZVR5cGVzIiB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zaW1wbGVUeXBlcyIgfSwKICAgICAgICAgICAgICAgICAgIm1pbkl0ZW1zIjogMSwKICAgICAgICAgICAgICAgICAgInVuaXF1ZUl0ZW1zIjogdHJ1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZvcm1hdCI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAiY29udGVudE1lZGlhVHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAiY29udGVudEVuY29kaW5nIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICJpZiI6IHsgIiRyZWYiOiAiIyIgfSwKICAgICAgICAgICAgInRoZW4iOiB7ICIkcmVmIjogIiMiIH0sCiAgICAgICAgICAgICJlbHNlIjogeyAiJHJlZiI6ICIjIiB9LAogICAgICAgICAgICAiYWxsT2YiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkiIH0sCiAgICAgICAgICAgICJhbnlPZiI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSIgfSwKICAgICAgICAgICAgIm9uZU9mIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NjaGVtYUFycmF5IiB9LAogICAgICAgICAgICAibm90IjogeyAiJHJlZiI6ICIjIiB9CiAgICAgICAgICB9LAogICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgdmFyIGRlc2NyaXB0aW9ucyA9IHsKICAgICAgaWQ6IGxvY2FsaXplNigic2NoZW1hLmpzb24uaWQiLCAiQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNjaGVtYS4iKSwKICAgICAgJHNjaGVtYTogbG9jYWxpemU2KCJzY2hlbWEuanNvbi4kc2NoZW1hIiwgIlRoZSBzY2hlbWEgdG8gdmVyaWZ5IHRoaXMgZG9jdW1lbnQgYWdhaW5zdC4iKSwKICAgICAgdGl0bGU6IGxvY2FsaXplNigic2NoZW1hLmpzb24udGl0bGUiLCAiQSBkZXNjcmlwdGl2ZSB0aXRsZSBvZiB0aGUgZWxlbWVudC4iKSwKICAgICAgZGVzY3JpcHRpb246IGxvY2FsaXplNigic2NoZW1hLmpzb24uZGVzY3JpcHRpb24iLCAiQSBsb25nIGRlc2NyaXB0aW9uIG9mIHRoZSBlbGVtZW50LiBVc2VkIGluIGhvdmVyIG1lbnVzIGFuZCBzdWdnZXN0aW9ucy4iKSwKICAgICAgZGVmYXVsdDogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5kZWZhdWx0IiwgIkEgZGVmYXVsdCB2YWx1ZS4gVXNlZCBieSBzdWdnZXN0aW9ucy4iKSwKICAgICAgbXVsdGlwbGVPZjogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5tdWx0aXBsZU9mIiwgIkEgbnVtYmVyIHRoYXQgc2hvdWxkIGNsZWFubHkgZGl2aWRlIHRoZSBjdXJyZW50IHZhbHVlIChpLmUuIGhhdmUgbm8gcmVtYWluZGVyKS4iKSwKICAgICAgbWF4aW11bTogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5tYXhpbXVtIiwgIlRoZSBtYXhpbXVtIG51bWVyaWNhbCB2YWx1ZSwgaW5jbHVzaXZlIGJ5IGRlZmF1bHQuIiksCiAgICAgIGV4Y2x1c2l2ZU1heGltdW06IGxvY2FsaXplNigic2NoZW1hLmpzb24uZXhjbHVzaXZlTWF4aW11bSIsICJNYWtlcyB0aGUgbWF4aW11bSBwcm9wZXJ0eSBleGNsdXNpdmUuIiksCiAgICAgIG1pbmltdW06IGxvY2FsaXplNigic2NoZW1hLmpzb24ubWluaW11bSIsICJUaGUgbWluaW11bSBudW1lcmljYWwgdmFsdWUsIGluY2x1c2l2ZSBieSBkZWZhdWx0LiIpLAogICAgICBleGNsdXNpdmVNaW5pbXVtOiBsb2NhbGl6ZTYoInNjaGVtYS5qc29uLmV4Y2x1c2l2ZU1pbmludW0iLCAiTWFrZXMgdGhlIG1pbmltdW0gcHJvcGVydHkgZXhjbHVzaXZlLiIpLAogICAgICBtYXhMZW5ndGg6IGxvY2FsaXplNigic2NoZW1hLmpzb24ubWF4TGVuZ3RoIiwgIlRoZSBtYXhpbXVtIGxlbmd0aCBvZiBhIHN0cmluZy4iKSwKICAgICAgbWluTGVuZ3RoOiBsb2NhbGl6ZTYoInNjaGVtYS5qc29uLm1pbkxlbmd0aCIsICJUaGUgbWluaW11bSBsZW5ndGggb2YgYSBzdHJpbmcuIiksCiAgICAgIHBhdHRlcm46IGxvY2FsaXplNigic2NoZW1hLmpzb24ucGF0dGVybiIsICJBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCB0aGUgc3RyaW5nIGFnYWluc3QuIEl0IGlzIG5vdCBpbXBsaWNpdGx5IGFuY2hvcmVkLiIpLAogICAgICBhZGRpdGlvbmFsSXRlbXM6IGxvY2FsaXplNigic2NoZW1hLmpzb24uYWRkaXRpb25hbEl0ZW1zIiwgIkZvciBhcnJheXMsIG9ubHkgd2hlbiBpdGVtcyBpcyBzZXQgYXMgYW4gYXJyYXkuIElmIGl0IGlzIGEgc2NoZW1hLCB0aGVuIHRoaXMgc2NoZW1hIHZhbGlkYXRlcyBpdGVtcyBhZnRlciB0aGUgb25lcyBzcGVjaWZpZWQgYnkgdGhlIGl0ZW1zIGFycmF5LiBJZiBpdCBpcyBmYWxzZSwgdGhlbiBhZGRpdGlvbmFsIGl0ZW1zIHdpbGwgY2F1c2UgdmFsaWRhdGlvbiB0byBmYWlsLiIpLAogICAgICBpdGVtczogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5pdGVtcyIsICJGb3IgYXJyYXlzLiBDYW4gZWl0aGVyIGJlIGEgc2NoZW1hIHRvIHZhbGlkYXRlIGV2ZXJ5IGVsZW1lbnQgYWdhaW5zdCBvciBhbiBhcnJheSBvZiBzY2hlbWFzIHRvIHZhbGlkYXRlIGVhY2ggaXRlbSBhZ2FpbnN0IGluIG9yZGVyICh0aGUgZmlyc3Qgc2NoZW1hIHdpbGwgdmFsaWRhdGUgdGhlIGZpcnN0IGVsZW1lbnQsIHRoZSBzZWNvbmQgc2NoZW1hIHdpbGwgdmFsaWRhdGUgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uIiksCiAgICAgIG1heEl0ZW1zOiBsb2NhbGl6ZTYoInNjaGVtYS5qc29uLm1heEl0ZW1zIiwgIlRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBpbnNpZGUgYW4gYXJyYXkuIEluY2x1c2l2ZS4iKSwKICAgICAgbWluSXRlbXM6IGxvY2FsaXplNigic2NoZW1hLmpzb24ubWluSXRlbXMiLCAiVGhlIG1pbmltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIGluc2lkZSBhbiBhcnJheS4gSW5jbHVzaXZlLiIpLAogICAgICB1bmlxdWVJdGVtczogbG9jYWxpemU2KCJzY2hlbWEuanNvbi51bmlxdWVJdGVtcyIsICJJZiBhbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBhcnJheSBtdXN0IGJlIHVuaXF1ZS4gRGVmYXVsdHMgdG8gZmFsc2UuIiksCiAgICAgIG1heFByb3BlcnRpZXM6IGxvY2FsaXplNigic2NoZW1hLmpzb24ubWF4UHJvcGVydGllcyIsICJUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvcGVydGllcyBhbiBvYmplY3QgY2FuIGhhdmUuIEluY2x1c2l2ZS4iKSwKICAgICAgbWluUHJvcGVydGllczogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5taW5Qcm9wZXJ0aWVzIiwgIlRoZSBtaW5pbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzIGFuIG9iamVjdCBjYW4gaGF2ZS4gSW5jbHVzaXZlLiIpLAogICAgICByZXF1aXJlZDogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5yZXF1aXJlZCIsICJBbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgbGlzdHMgdGhlIG5hbWVzIG9mIGFsbCBwcm9wZXJ0aWVzIHJlcXVpcmVkIG9uIHRoaXMgb2JqZWN0LiIpLAogICAgICBhZGRpdGlvbmFsUHJvcGVydGllczogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5hZGRpdGlvbmFsUHJvcGVydGllcyIsICJFaXRoZXIgYSBzY2hlbWEgb3IgYSBib29sZWFuLiBJZiBhIHNjaGVtYSwgdGhlbiB1c2VkIHRvIHZhbGlkYXRlIGFsbCBwcm9wZXJ0aWVzIG5vdCBtYXRjaGVkIGJ5ICdwcm9wZXJ0aWVzJyBvciAncGF0dGVyblByb3BlcnRpZXMnLiBJZiBmYWxzZSwgdGhlbiBhbnkgcHJvcGVydGllcyBub3QgbWF0Y2hlZCBieSBlaXRoZXIgd2lsbCBjYXVzZSB0aGlzIHNjaGVtYSB0byBmYWlsLiIpLAogICAgICBkZWZpbml0aW9uczogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5kZWZpbml0aW9ucyIsICJOb3QgdXNlZCBmb3IgdmFsaWRhdGlvbi4gUGxhY2Ugc3Vic2NoZW1hcyBoZXJlIHRoYXQgeW91IHdpc2ggdG8gcmVmZXJlbmNlIGlubGluZSB3aXRoICRyZWYuIiksCiAgICAgIHByb3BlcnRpZXM6IGxvY2FsaXplNigic2NoZW1hLmpzb24ucHJvcGVydGllcyIsICJBIG1hcCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBzY2hlbWFzIGZvciBlYWNoIHByb3BlcnR5LiIpLAogICAgICBwYXR0ZXJuUHJvcGVydGllczogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5wYXR0ZXJuUHJvcGVydGllcyIsICJBIG1hcCBvZiByZWd1bGFyIGV4cHJlc3Npb25zIG9uIHByb3BlcnR5IG5hbWVzIHRvIHNjaGVtYXMgZm9yIG1hdGNoaW5nIHByb3BlcnRpZXMuIiksCiAgICAgIGRlcGVuZGVuY2llczogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5kZXBlbmRlbmNpZXMiLCAiQSBtYXAgb2YgcHJvcGVydHkgbmFtZXMgdG8gZWl0aGVyIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIG9yIGEgc2NoZW1hLiBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBtZWFucyB0aGUgcHJvcGVydHkgbmFtZWQgaW4gdGhlIGtleSBkZXBlbmRzIG9uIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBhcnJheSBiZWluZyBwcmVzZW50IGluIHRoZSBvYmplY3QgaW4gb3JkZXIgdG8gYmUgdmFsaWQuIElmIHRoZSB2YWx1ZSBpcyBhIHNjaGVtYSwgdGhlbiB0aGUgc2NoZW1hIGlzIG9ubHkgYXBwbGllZCB0byB0aGUgb2JqZWN0IGlmIHRoZSBwcm9wZXJ0eSBpbiB0aGUga2V5IGV4aXN0cyBvbiB0aGUgb2JqZWN0LiIpLAogICAgICBlbnVtOiBsb2NhbGl6ZTYoInNjaGVtYS5qc29uLmVudW0iLCAiVGhlIHNldCBvZiBsaXRlcmFsIHZhbHVlcyB0aGF0IGFyZSB2YWxpZC4iKSwKICAgICAgdHlwZTogbG9jYWxpemU2KCJzY2hlbWEuanNvbi50eXBlIiwgIkVpdGhlciBhIHN0cmluZyBvZiBvbmUgb2YgdGhlIGJhc2ljIHNjaGVtYSB0eXBlcyAobnVtYmVyLCBpbnRlZ2VyLCBudWxsLCBhcnJheSwgb2JqZWN0LCBib29sZWFuLCBzdHJpbmcpIG9yIGFuIGFycmF5IG9mIHN0cmluZ3Mgc3BlY2lmeWluZyBhIHN1YnNldCBvZiB0aG9zZSB0eXBlcy4iKSwKICAgICAgZm9ybWF0OiBsb2NhbGl6ZTYoInNjaGVtYS5qc29uLmZvcm1hdCIsICJEZXNjcmliZXMgdGhlIGZvcm1hdCBleHBlY3RlZCBmb3IgdGhlIHZhbHVlLiIpLAogICAgICBhbGxPZjogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5hbGxPZiIsICJBbiBhcnJheSBvZiBzY2hlbWFzLCBhbGwgb2Ygd2hpY2ggbXVzdCBtYXRjaC4iKSwKICAgICAgYW55T2Y6IGxvY2FsaXplNigic2NoZW1hLmpzb24uYW55T2YiLCAiQW4gYXJyYXkgb2Ygc2NoZW1hcywgd2hlcmUgYXQgbGVhc3Qgb25lIG11c3QgbWF0Y2guIiksCiAgICAgIG9uZU9mOiBsb2NhbGl6ZTYoInNjaGVtYS5qc29uLm9uZU9mIiwgIkFuIGFycmF5IG9mIHNjaGVtYXMsIGV4YWN0bHkgb25lIG9mIHdoaWNoIG11c3QgbWF0Y2guIiksCiAgICAgIG5vdDogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5ub3QiLCAiQSBzY2hlbWEgd2hpY2ggbXVzdCBub3QgbWF0Y2guIiksCiAgICAgICRpZDogbG9jYWxpemU2KCJzY2hlbWEuanNvbi4kaWQiLCAiQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNjaGVtYS4iKSwKICAgICAgJHJlZjogbG9jYWxpemU2KCJzY2hlbWEuanNvbi4kcmVmIiwgIlJlZmVyZW5jZSBhIGRlZmluaXRpb24gaG9zdGVkIG9uIGFueSBsb2NhdGlvbi4iKSwKICAgICAgJGNvbW1lbnQ6IGxvY2FsaXplNigic2NoZW1hLmpzb24uJGNvbW1lbnQiLCAiQ29tbWVudHMgZnJvbSBzY2hlbWEgYXV0aG9ycyB0byByZWFkZXJzIG9yIG1haW50YWluZXJzIG9mIHRoZSBzY2hlbWEuIiksCiAgICAgIHJlYWRPbmx5OiBsb2NhbGl6ZTYoInNjaGVtYS5qc29uLnJlYWRPbmx5IiwgIkluZGljYXRlcyB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgaW5zdGFuY2UgaXMgbWFuYWdlZCBleGNsdXNpdmVseSBieSB0aGUgb3duaW5nIGF1dGhvcml0eS4iKSwKICAgICAgZXhhbXBsZXM6IGxvY2FsaXplNigic2NoZW1hLmpzb24uZXhhbXBsZXMiLCAiU2FtcGxlIEpTT04gdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgc2NoZW1hLCBmb3IgdGhlIHB1cnBvc2Ugb2YgaWxsdXN0cmF0aW5nIHVzYWdlLiIpLAogICAgICBjb250YWluczogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5jb250YWlucyIsICdBbiBhcnJheSBpbnN0YW5jZSBpcyB2YWxpZCBhZ2FpbnN0ICJjb250YWlucyIgaWYgYXQgbGVhc3Qgb25lIG9mIGl0cyBlbGVtZW50cyBpcyB2YWxpZCBhZ2FpbnN0IHRoZSBnaXZlbiBzY2hlbWEuJyksCiAgICAgIHByb3BlcnR5TmFtZXM6IGxvY2FsaXplNigic2NoZW1hLmpzb24ucHJvcGVydHlOYW1lcyIsICJJZiB0aGUgaW5zdGFuY2UgaXMgYW4gb2JqZWN0LCB0aGlzIGtleXdvcmQgdmFsaWRhdGVzIGlmIGV2ZXJ5IHByb3BlcnR5IG5hbWUgaW4gdGhlIGluc3RhbmNlIHZhbGlkYXRlcyBhZ2FpbnN0IHRoZSBwcm92aWRlZCBzY2hlbWEuIiksCiAgICAgIGNvbnN0OiBsb2NhbGl6ZTYoInNjaGVtYS5qc29uLmNvbnN0IiwgIkFuIGluc3RhbmNlIHZhbGlkYXRlcyBzdWNjZXNzZnVsbHkgYWdhaW5zdCB0aGlzIGtleXdvcmQgaWYgaXRzIHZhbHVlIGlzIGVxdWFsIHRvIHRoZSB2YWx1ZSBvZiB0aGUga2V5d29yZC4iKSwKICAgICAgY29udGVudE1lZGlhVHlwZTogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5jb250ZW50TWVkaWFUeXBlIiwgIkRlc2NyaWJlcyB0aGUgbWVkaWEgdHlwZSBvZiBhIHN0cmluZyBwcm9wZXJ0eS4iKSwKICAgICAgY29udGVudEVuY29kaW5nOiBsb2NhbGl6ZTYoInNjaGVtYS5qc29uLmNvbnRlbnRFbmNvZGluZyIsICJEZXNjcmliZXMgdGhlIGNvbnRlbnQgZW5jb2Rpbmcgb2YgYSBzdHJpbmcgcHJvcGVydHkuIiksCiAgICAgIGlmOiBsb2NhbGl6ZTYoInNjaGVtYS5qc29uLmlmIiwgJ1RoZSB2YWxpZGF0aW9uIG91dGNvbWUgb2YgdGhlICJpZiIgc3Vic2NoZW1hIGNvbnRyb2xzIHdoaWNoIG9mIHRoZSAidGhlbiIgb3IgImVsc2UiIGtleXdvcmRzIGFyZSBldmFsdWF0ZWQuJyksCiAgICAgIHRoZW46IGxvY2FsaXplNigic2NoZW1hLmpzb24udGhlbiIsICdUaGUgImlmIiBzdWJzY2hlbWEgaXMgdXNlZCBmb3IgdmFsaWRhdGlvbiB3aGVuIHRoZSAiaWYiIHN1YnNjaGVtYSBzdWNjZWVkcy4nKSwKICAgICAgZWxzZTogbG9jYWxpemU2KCJzY2hlbWEuanNvbi5lbHNlIiwgJ1RoZSAiZWxzZSIgc3Vic2NoZW1hIGlzIHVzZWQgZm9yIHZhbGlkYXRpb24gd2hlbiB0aGUgImlmIiBzdWJzY2hlbWEgZmFpbHMuJykKICAgIH07CiAgICBmb3IgKHNjaGVtYU5hbWUgaW4gc2NoZW1hQ29udHJpYnV0aW9ucy5zY2hlbWFzKSB7CiAgICAgIHNjaGVtYSA9IHNjaGVtYUNvbnRyaWJ1dGlvbnMuc2NoZW1hc1tzY2hlbWFOYW1lXTsKICAgICAgZm9yIChwcm9wZXJ0eSBpbiBzY2hlbWEucHJvcGVydGllcykgewogICAgICAgIHByb3BlcnR5T2JqZWN0ID0gc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldOwogICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHlPYmplY3QgPT09ICJib29sZWFuIikgewogICAgICAgICAgcHJvcGVydHlPYmplY3QgPSBzY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0gPSB7fTsKICAgICAgICB9CiAgICAgICAgZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbnNbcHJvcGVydHldOwogICAgICAgIGlmIChkZXNjcmlwdGlvbikgewogICAgICAgICAgcHJvcGVydHlPYmplY3RbImRlc2NyaXB0aW9uIl0gPSBkZXNjcmlwdGlvbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS5sb2cocHJvcGVydHkgKyAiOiBsb2NhbGl6ZSgnc2NoZW1hLmpzb24uIiArIHByb3BlcnR5ICsgYCcsICIiKWApOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdmFyIHNjaGVtYTsKICAgIHZhciBwcm9wZXJ0eU9iamVjdDsKICAgIHZhciBkZXNjcmlwdGlvbjsKICAgIHZhciBwcm9wZXJ0eTsKICAgIHZhciBzY2hlbWFOYW1lOwoKICAgIC8vIG5vZGVfbW9kdWxlcy92c2NvZGUtanNvbi1sYW5ndWFnZXNlcnZpY2UvbGliL2VzbS9zZXJ2aWNlcy9qc29uRm9sZGluZy5qcwogICAgZnVuY3Rpb24gZ2V0Rm9sZGluZ1Jhbmdlcyhkb2N1bWVudCwgY29udGV4dCkgewogICAgICB2YXIgcmFuZ2VzID0gW107CiAgICAgIHZhciBuZXN0aW5nTGV2ZWxzID0gW107CiAgICAgIHZhciBzdGFjayA9IFtdOwogICAgICB2YXIgcHJldlN0YXJ0ID0gLTE7CiAgICAgIHZhciBzY2FubmVyMiA9IGNyZWF0ZVNjYW5uZXIyKGRvY3VtZW50LmdldFRleHQoKSwgZmFsc2UpOwogICAgICB2YXIgdG9rZW4gPSBzY2FubmVyMi5zY2FuKCk7CiAgICAgIGZ1bmN0aW9uIGFkZFJhbmdlKHJhbmdlMikgewogICAgICAgIHJhbmdlcy5wdXNoKHJhbmdlMik7CiAgICAgICAgbmVzdGluZ0xldmVscy5wdXNoKHN0YWNrLmxlbmd0aCk7CiAgICAgIH0KICAgICAgd2hpbGUgKHRva2VuICE9PSAxNykgewogICAgICAgIHN3aXRjaCAodG9rZW4pIHsKICAgICAgICAgIGNhc2UgMToKICAgICAgICAgIGNhc2UgMzogewogICAgICAgICAgICB2YXIgc3RhcnRMaW5lID0gZG9jdW1lbnQucG9zaXRpb25BdChzY2FubmVyMi5nZXRUb2tlbk9mZnNldCgpKS5saW5lOwogICAgICAgICAgICB2YXIgcmFuZ2UgPSB7IHN0YXJ0TGluZSwgZW5kTGluZTogc3RhcnRMaW5lLCBraW5kOiB0b2tlbiA9PT0gMSA/ICJvYmplY3QiIDogImFycmF5IiB9OwogICAgICAgICAgICBzdGFjay5wdXNoKHJhbmdlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICBjYXNlIDQ6IHsKICAgICAgICAgICAgdmFyIGtpbmQgPSB0b2tlbiA9PT0gMiA/ICJvYmplY3QiIDogImFycmF5IjsKICAgICAgICAgICAgaWYgKHN0YWNrLmxlbmd0aCA+IDAgJiYgc3RhY2tbc3RhY2subGVuZ3RoIC0gMV0ua2luZCA9PT0ga2luZCkgewogICAgICAgICAgICAgIHZhciByYW5nZSA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICAgIHZhciBsaW5lID0gZG9jdW1lbnQucG9zaXRpb25BdChzY2FubmVyMi5nZXRUb2tlbk9mZnNldCgpKS5saW5lOwogICAgICAgICAgICAgIGlmIChyYW5nZSAmJiBsaW5lID4gcmFuZ2Uuc3RhcnRMaW5lICsgMSAmJiBwcmV2U3RhcnQgIT09IHJhbmdlLnN0YXJ0TGluZSkgewogICAgICAgICAgICAgICAgcmFuZ2UuZW5kTGluZSA9IGxpbmUgLSAxOwogICAgICAgICAgICAgICAgYWRkUmFuZ2UocmFuZ2UpOwogICAgICAgICAgICAgICAgcHJldlN0YXJ0ID0gcmFuZ2Uuc3RhcnRMaW5lOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMTM6IHsKICAgICAgICAgICAgdmFyIHN0YXJ0TGluZSA9IGRvY3VtZW50LnBvc2l0aW9uQXQoc2Nhbm5lcjIuZ2V0VG9rZW5PZmZzZXQoKSkubGluZTsKICAgICAgICAgICAgdmFyIGVuZExpbmUgPSBkb2N1bWVudC5wb3NpdGlvbkF0KHNjYW5uZXIyLmdldFRva2VuT2Zmc2V0KCkgKyBzY2FubmVyMi5nZXRUb2tlbkxlbmd0aCgpKS5saW5lOwogICAgICAgICAgICBpZiAoc2Nhbm5lcjIuZ2V0VG9rZW5FcnJvcigpID09PSAxICYmIHN0YXJ0TGluZSArIDEgPCBkb2N1bWVudC5saW5lQ291bnQpIHsKICAgICAgICAgICAgICBzY2FubmVyMi5zZXRQb3NpdGlvbihkb2N1bWVudC5vZmZzZXRBdChQb3NpdGlvbi5jcmVhdGUoc3RhcnRMaW5lICsgMSwgMCkpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoc3RhcnRMaW5lIDwgZW5kTGluZSkgewogICAgICAgICAgICAgICAgYWRkUmFuZ2UoeyBzdGFydExpbmUsIGVuZExpbmUsIGtpbmQ6IEZvbGRpbmdSYW5nZUtpbmQuQ29tbWVudCB9KTsKICAgICAgICAgICAgICAgIHByZXZTdGFydCA9IHN0YXJ0TGluZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDEyOiB7CiAgICAgICAgICAgIHZhciB0ZXh0ID0gZG9jdW1lbnQuZ2V0VGV4dCgpLnN1YnN0cihzY2FubmVyMi5nZXRUb2tlbk9mZnNldCgpLCBzY2FubmVyMi5nZXRUb2tlbkxlbmd0aCgpKTsKICAgICAgICAgICAgdmFyIG0gPSB0ZXh0Lm1hdGNoKC9eXC9cL1xzKiMocmVnaW9uXGIpfChlbmRyZWdpb25cYikvKTsKICAgICAgICAgICAgaWYgKG0pIHsKICAgICAgICAgICAgICB2YXIgbGluZSA9IGRvY3VtZW50LnBvc2l0aW9uQXQoc2Nhbm5lcjIuZ2V0VG9rZW5PZmZzZXQoKSkubGluZTsKICAgICAgICAgICAgICBpZiAobVsxXSkgewogICAgICAgICAgICAgICAgdmFyIHJhbmdlID0geyBzdGFydExpbmU6IGxpbmUsIGVuZExpbmU6IGxpbmUsIGtpbmQ6IEZvbGRpbmdSYW5nZUtpbmQuUmVnaW9uIH07CiAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHJhbmdlKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOwogICAgICAgICAgICAgICAgd2hpbGUgKGkgPj0gMCAmJiBzdGFja1tpXS5raW5kICE9PSBGb2xkaW5nUmFuZ2VLaW5kLlJlZ2lvbikgewogICAgICAgICAgICAgICAgICBpLS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHN0YWNrW2ldOwogICAgICAgICAgICAgICAgICBzdGFjay5sZW5ndGggPSBpOwogICAgICAgICAgICAgICAgICBpZiAobGluZSA+IHJhbmdlLnN0YXJ0TGluZSAmJiBwcmV2U3RhcnQgIT09IHJhbmdlLnN0YXJ0TGluZSkgewogICAgICAgICAgICAgICAgICAgIHJhbmdlLmVuZExpbmUgPSBsaW5lOwogICAgICAgICAgICAgICAgICAgIGFkZFJhbmdlKHJhbmdlKTsKICAgICAgICAgICAgICAgICAgICBwcmV2U3RhcnQgPSByYW5nZS5zdGFydExpbmU7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRva2VuID0gc2Nhbm5lcjIuc2NhbigpOwogICAgICB9CiAgICAgIHZhciByYW5nZUxpbWl0ID0gY29udGV4dCAmJiBjb250ZXh0LnJhbmdlTGltaXQ7CiAgICAgIGlmICh0eXBlb2YgcmFuZ2VMaW1pdCAhPT0gIm51bWJlciIgfHwgcmFuZ2VzLmxlbmd0aCA8PSByYW5nZUxpbWl0KSB7CiAgICAgICAgcmV0dXJuIHJhbmdlczsKICAgICAgfQogICAgICBpZiAoY29udGV4dCAmJiBjb250ZXh0Lm9uUmFuZ2VMaW1pdEV4Y2VlZGVkKSB7CiAgICAgICAgY29udGV4dC5vblJhbmdlTGltaXRFeGNlZWRlZChkb2N1bWVudC51cmkpOwogICAgICB9CiAgICAgIHZhciBjb3VudHMgPSBbXTsKICAgICAgZm9yICh2YXIgX2kgPSAwLCBuZXN0aW5nTGV2ZWxzXzEgPSBuZXN0aW5nTGV2ZWxzOyBfaSA8IG5lc3RpbmdMZXZlbHNfMS5sZW5ndGg7IF9pKyspIHsKICAgICAgICB2YXIgbGV2ZWwgPSBuZXN0aW5nTGV2ZWxzXzFbX2ldOwogICAgICAgIGlmIChsZXZlbCA8IDMwKSB7CiAgICAgICAgICBjb3VudHNbbGV2ZWxdID0gKGNvdW50c1tsZXZlbF0gfHwgMCkgKyAxOwogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgZW50cmllcyA9IDA7CiAgICAgIHZhciBtYXhMZXZlbCA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIG4gPSBjb3VudHNbaV07CiAgICAgICAgaWYgKG4pIHsKICAgICAgICAgIGlmIChuICsgZW50cmllcyA+IHJhbmdlTGltaXQpIHsKICAgICAgICAgICAgbWF4TGV2ZWwgPSBpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGVudHJpZXMgKz0gbjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBsZXZlbCA9IG5lc3RpbmdMZXZlbHNbaV07CiAgICAgICAgaWYgKHR5cGVvZiBsZXZlbCA9PT0gIm51bWJlciIpIHsKICAgICAgICAgIGlmIChsZXZlbCA8IG1heExldmVsIHx8IGxldmVsID09PSBtYXhMZXZlbCAmJiBlbnRyaWVzKysgPCByYW5nZUxpbWl0KSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHJhbmdlc1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgLy8gbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29uLWxhbmd1YWdlc2VydmljZS9saWIvZXNtL3NlcnZpY2VzL2pzb25TZWxlY3Rpb25SYW5nZXMuanMKICAgIGZ1bmN0aW9uIGdldFNlbGVjdGlvblJhbmdlcyhkb2N1bWVudCwgcG9zaXRpb25zLCBkb2MpIHsKICAgICAgZnVuY3Rpb24gZ2V0U2VsZWN0aW9uUmFuZ2UocG9zaXRpb24pIHsKICAgICAgICB2YXIgb2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQocG9zaXRpb24pOwogICAgICAgIHZhciBub2RlID0gZG9jLmdldE5vZGVGcm9tT2Zmc2V0KG9mZnNldCwgdHJ1ZSk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkgewogICAgICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgICBjYXNlICJvYmplY3QiOgogICAgICAgICAgICBjYXNlICJhcnJheSI6CiAgICAgICAgICAgICAgdmFyIGNTdGFydCA9IG5vZGUub2Zmc2V0ICsgMSwgY0VuZCA9IG5vZGUub2Zmc2V0ICsgbm9kZS5sZW5ndGggLSAxOwogICAgICAgICAgICAgIGlmIChjU3RhcnQgPCBjRW5kICYmIG9mZnNldCA+PSBjU3RhcnQgJiYgb2Zmc2V0IDw9IGNFbmQpIHsKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld1JhbmdlKGNTdGFydCwgY0VuZCkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdSYW5nZShub2RlLm9mZnNldCwgbm9kZS5vZmZzZXQgKyBub2RlLmxlbmd0aCkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICJudW1iZXIiOgogICAgICAgICAgICBjYXNlICJib29sZWFuIjoKICAgICAgICAgICAgY2FzZSAibnVsbCI6CiAgICAgICAgICAgIGNhc2UgInByb3BlcnR5IjoKICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXdSYW5nZShub2RlLm9mZnNldCwgbm9kZS5vZmZzZXQgKyBub2RlLmxlbmd0aCkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gInByb3BlcnR5IiB8fCBub2RlLnBhcmVudCAmJiBub2RlLnBhcmVudC50eXBlID09PSAiYXJyYXkiKSB7CiAgICAgICAgICAgIHZhciBhZnRlckNvbW1hT2Zmc2V0ID0gZ2V0T2Zmc2V0QWZ0ZXJOZXh0VG9rZW4obm9kZS5vZmZzZXQgKyBub2RlLmxlbmd0aCwgNSk7CiAgICAgICAgICAgIGlmIChhZnRlckNvbW1hT2Zmc2V0ICE9PSAtMSkgewogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ld1JhbmdlKG5vZGUub2Zmc2V0LCBhZnRlckNvbW1hT2Zmc2V0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudDsKICAgICAgICB9CiAgICAgICAgdmFyIGN1cnJlbnQgPSB2b2lkIDA7CiAgICAgICAgZm9yICh2YXIgaW5kZXggPSByZXN1bHQubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgaW5kZXgtLSkgewogICAgICAgICAgY3VycmVudCA9IFNlbGVjdGlvblJhbmdlLmNyZWF0ZShyZXN1bHRbaW5kZXhdLCBjdXJyZW50KTsKICAgICAgICB9CiAgICAgICAgaWYgKCFjdXJyZW50KSB7CiAgICAgICAgICBjdXJyZW50ID0gU2VsZWN0aW9uUmFuZ2UuY3JlYXRlKFJhbmdlLmNyZWF0ZShwb3NpdGlvbiwgcG9zaXRpb24pKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbmV3UmFuZ2Uoc3RhcnQsIGVuZCkgewogICAgICAgIHJldHVybiBSYW5nZS5jcmVhdGUoZG9jdW1lbnQucG9zaXRpb25BdChzdGFydCksIGRvY3VtZW50LnBvc2l0aW9uQXQoZW5kKSk7CiAgICAgIH0KICAgICAgdmFyIHNjYW5uZXIyID0gY3JlYXRlU2Nhbm5lcjIoZG9jdW1lbnQuZ2V0VGV4dCgpLCB0cnVlKTsKICAgICAgZnVuY3Rpb24gZ2V0T2Zmc2V0QWZ0ZXJOZXh0VG9rZW4ob2Zmc2V0LCBleHBlY3RlZFRva2VuKSB7CiAgICAgICAgc2Nhbm5lcjIuc2V0UG9zaXRpb24ob2Zmc2V0KTsKICAgICAgICB2YXIgdG9rZW4gPSBzY2FubmVyMi5zY2FuKCk7CiAgICAgICAgaWYgKHRva2VuID09PSBleHBlY3RlZFRva2VuKSB7CiAgICAgICAgICByZXR1cm4gc2Nhbm5lcjIuZ2V0VG9rZW5PZmZzZXQoKSArIHNjYW5uZXIyLmdldFRva2VuTGVuZ3RoKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgICAgfQogICAgICByZXR1cm4gcG9zaXRpb25zLm1hcChnZXRTZWxlY3Rpb25SYW5nZSk7CiAgICB9CgogICAgLy8gbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29uLWxhbmd1YWdlc2VydmljZS9saWIvZXNtL3NlcnZpY2VzL2pzb25MaW5rcy5qcwogICAgZnVuY3Rpb24gZmluZExpbmtzKGRvY3VtZW50LCBkb2MpIHsKICAgICAgdmFyIGxpbmtzID0gW107CiAgICAgIGRvYy52aXNpdChmdW5jdGlvbihub2RlKSB7CiAgICAgICAgdmFyIF9hOwogICAgICAgIGlmIChub2RlLnR5cGUgPT09ICJwcm9wZXJ0eSIgJiYgbm9kZS5rZXlOb2RlLnZhbHVlID09PSAiJHJlZiIgJiYgKChfYSA9IG5vZGUudmFsdWVOb2RlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudHlwZSkgPT09ICJzdHJpbmciKSB7CiAgICAgICAgICB2YXIgcGF0aCA9IG5vZGUudmFsdWVOb2RlLnZhbHVlOwogICAgICAgICAgdmFyIHRhcmdldE5vZGUgPSBmaW5kVGFyZ2V0Tm9kZShkb2MsIHBhdGgpOwogICAgICAgICAgaWYgKHRhcmdldE5vZGUpIHsKICAgICAgICAgICAgdmFyIHRhcmdldFBvcyA9IGRvY3VtZW50LnBvc2l0aW9uQXQodGFyZ2V0Tm9kZS5vZmZzZXQpOwogICAgICAgICAgICBsaW5rcy5wdXNoKHsKICAgICAgICAgICAgICB0YXJnZXQ6IGRvY3VtZW50LnVyaSArICIjIiArICh0YXJnZXRQb3MubGluZSArIDEpICsgIiwiICsgKHRhcmdldFBvcy5jaGFyYWN0ZXIgKyAxKSwKICAgICAgICAgICAgICByYW5nZTogY3JlYXRlUmFuZ2UoZG9jdW1lbnQsIG5vZGUudmFsdWVOb2RlKQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0pOwogICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGxpbmtzKTsKICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGRvY3VtZW50LCBub2RlKSB7CiAgICAgIHJldHVybiBSYW5nZS5jcmVhdGUoZG9jdW1lbnQucG9zaXRpb25BdChub2RlLm9mZnNldCArIDEpLCBkb2N1bWVudC5wb3NpdGlvbkF0KG5vZGUub2Zmc2V0ICsgbm9kZS5sZW5ndGggLSAxKSk7CiAgICB9CiAgICBmdW5jdGlvbiBmaW5kVGFyZ2V0Tm9kZShkb2MsIHBhdGgpIHsKICAgICAgdmFyIHRva2VucyA9IHBhcnNlSlNPTlBvaW50ZXIocGF0aCk7CiAgICAgIGlmICghdG9rZW5zKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIGZpbmROb2RlKHRva2VucywgZG9jLnJvb3QpOwogICAgfQogICAgZnVuY3Rpb24gZmluZE5vZGUocG9pbnRlciwgbm9kZSkgewogICAgICBpZiAoIW5vZGUpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAocG9pbnRlci5sZW5ndGggPT09IDApIHsKICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfQogICAgICB2YXIgdG9rZW4gPSBwb2ludGVyLnNoaWZ0KCk7CiAgICAgIGlmIChub2RlICYmIG5vZGUudHlwZSA9PT0gIm9iamVjdCIpIHsKICAgICAgICB2YXIgcHJvcGVydHlOb2RlID0gbm9kZS5wcm9wZXJ0aWVzLmZpbmQoZnVuY3Rpb24ocHJvcGVydHlOb2RlMikgewogICAgICAgICAgcmV0dXJuIHByb3BlcnR5Tm9kZTIua2V5Tm9kZS52YWx1ZSA9PT0gdG9rZW47CiAgICAgICAgfSk7CiAgICAgICAgaWYgKCFwcm9wZXJ0eU5vZGUpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmluZE5vZGUocG9pbnRlciwgcHJvcGVydHlOb2RlLnZhbHVlTm9kZSk7CiAgICAgIH0gZWxzZSBpZiAobm9kZSAmJiBub2RlLnR5cGUgPT09ICJhcnJheSIpIHsKICAgICAgICBpZiAodG9rZW4ubWF0Y2goL14oMHxbMS05XVswLTldKikkLykpIHsKICAgICAgICAgIHZhciBpbmRleCA9IE51bWJlci5wYXJzZUludCh0b2tlbik7CiAgICAgICAgICB2YXIgYXJyYXlJdGVtID0gbm9kZS5pdGVtc1tpbmRleF07CiAgICAgICAgICBpZiAoIWFycmF5SXRlbSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBmaW5kTm9kZShwb2ludGVyLCBhcnJheUl0ZW0pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGZ1bmN0aW9uIHBhcnNlSlNPTlBvaW50ZXIocGF0aCkgewogICAgICBpZiAocGF0aCA9PT0gIiMiKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIGlmIChwYXRoWzBdICE9PSAiIyIgfHwgcGF0aFsxXSAhPT0gIi8iKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDIpLnNwbGl0KC9cLy8pLm1hcCh1bmVzY2FwZSk7CiAgICB9CiAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHIpIHsKICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9+MS9nLCAiLyIpLnJlcGxhY2UoL34wL2csICJ+Iik7CiAgICB9CgogICAgLy8gbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29uLWxhbmd1YWdlc2VydmljZS9saWIvZXNtL2pzb25MYW5ndWFnZVNlcnZpY2UuanMKICAgIGZ1bmN0aW9uIGdldExhbmd1YWdlU2VydmljZShwYXJhbXMpIHsKICAgICAgdmFyIHByb21pc2UgPSBwYXJhbXMucHJvbWlzZUNvbnN0cnVjdG9yIHx8IFByb21pc2U7CiAgICAgIHZhciBqc29uU2NoZW1hU2VydmljZSA9IG5ldyBKU09OU2NoZW1hU2VydmljZShwYXJhbXMuc2NoZW1hUmVxdWVzdFNlcnZpY2UsIHBhcmFtcy53b3Jrc3BhY2VDb250ZXh0LCBwcm9taXNlKTsKICAgICAganNvblNjaGVtYVNlcnZpY2Uuc2V0U2NoZW1hQ29udHJpYnV0aW9ucyhzY2hlbWFDb250cmlidXRpb25zKTsKICAgICAgdmFyIGpzb25Db21wbGV0aW9uID0gbmV3IEpTT05Db21wbGV0aW9uKGpzb25TY2hlbWFTZXJ2aWNlLCBwYXJhbXMuY29udHJpYnV0aW9ucywgcHJvbWlzZSwgcGFyYW1zLmNsaWVudENhcGFiaWxpdGllcyk7CiAgICAgIHZhciBqc29uSG92ZXIgPSBuZXcgSlNPTkhvdmVyKGpzb25TY2hlbWFTZXJ2aWNlLCBwYXJhbXMuY29udHJpYnV0aW9ucywgcHJvbWlzZSk7CiAgICAgIHZhciBqc29uRG9jdW1lbnRTeW1ib2xzID0gbmV3IEpTT05Eb2N1bWVudFN5bWJvbHMoanNvblNjaGVtYVNlcnZpY2UpOwogICAgICB2YXIganNvblZhbGlkYXRpb24gPSBuZXcgSlNPTlZhbGlkYXRpb24oanNvblNjaGVtYVNlcnZpY2UsIHByb21pc2UpOwogICAgICByZXR1cm4gewogICAgICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24oc2V0dGluZ3MpIHsKICAgICAgICAgIGpzb25TY2hlbWFTZXJ2aWNlLmNsZWFyRXh0ZXJuYWxTY2hlbWFzKCk7CiAgICAgICAgICBpZiAoc2V0dGluZ3Muc2NoZW1hcykgewogICAgICAgICAgICBzZXR0aW5ncy5zY2hlbWFzLmZvckVhY2goZnVuY3Rpb24oc2V0dGluZ3MyKSB7CiAgICAgICAgICAgICAganNvblNjaGVtYVNlcnZpY2UucmVnaXN0ZXJFeHRlcm5hbFNjaGVtYShzZXR0aW5nczIudXJpLCBzZXR0aW5nczIuZmlsZU1hdGNoLCBzZXR0aW5nczIuc2NoZW1hKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBqc29uVmFsaWRhdGlvbi5jb25maWd1cmUoc2V0dGluZ3MpOwogICAgICAgIH0sCiAgICAgICAgcmVzZXRTY2hlbWE6IGZ1bmN0aW9uKHVyaSkgewogICAgICAgICAgcmV0dXJuIGpzb25TY2hlbWFTZXJ2aWNlLm9uUmVzb3VyY2VDaGFuZ2UodXJpKTsKICAgICAgICB9LAogICAgICAgIGRvVmFsaWRhdGlvbjoganNvblZhbGlkYXRpb24uZG9WYWxpZGF0aW9uLmJpbmQoanNvblZhbGlkYXRpb24pLAogICAgICAgIHBhcnNlSlNPTkRvY3VtZW50OiBmdW5jdGlvbihkb2N1bWVudCkgewogICAgICAgICAgcmV0dXJuIHBhcnNlMyhkb2N1bWVudCwgeyBjb2xsZWN0Q29tbWVudHM6IHRydWUgfSk7CiAgICAgICAgfSwKICAgICAgICBuZXdKU09ORG9jdW1lbnQ6IGZ1bmN0aW9uKHJvb3QsIGRpYWdub3N0aWNzKSB7CiAgICAgICAgICByZXR1cm4gbmV3SlNPTkRvY3VtZW50KHJvb3QsIGRpYWdub3N0aWNzKTsKICAgICAgICB9LAogICAgICAgIGdldE1hdGNoaW5nU2NoZW1hczoganNvblNjaGVtYVNlcnZpY2UuZ2V0TWF0Y2hpbmdTY2hlbWFzLmJpbmQoanNvblNjaGVtYVNlcnZpY2UpLAogICAgICAgIGRvUmVzb2x2ZToganNvbkNvbXBsZXRpb24uZG9SZXNvbHZlLmJpbmQoanNvbkNvbXBsZXRpb24pLAogICAgICAgIGRvQ29tcGxldGU6IGpzb25Db21wbGV0aW9uLmRvQ29tcGxldGUuYmluZChqc29uQ29tcGxldGlvbiksCiAgICAgICAgZmluZERvY3VtZW50U3ltYm9sczoganNvbkRvY3VtZW50U3ltYm9scy5maW5kRG9jdW1lbnRTeW1ib2xzLmJpbmQoanNvbkRvY3VtZW50U3ltYm9scyksCiAgICAgICAgZmluZERvY3VtZW50U3ltYm9sczI6IGpzb25Eb2N1bWVudFN5bWJvbHMuZmluZERvY3VtZW50U3ltYm9sczIuYmluZChqc29uRG9jdW1lbnRTeW1ib2xzKSwKICAgICAgICBmaW5kRG9jdW1lbnRDb2xvcnM6IGpzb25Eb2N1bWVudFN5bWJvbHMuZmluZERvY3VtZW50Q29sb3JzLmJpbmQoanNvbkRvY3VtZW50U3ltYm9scyksCiAgICAgICAgZ2V0Q29sb3JQcmVzZW50YXRpb25zOiBqc29uRG9jdW1lbnRTeW1ib2xzLmdldENvbG9yUHJlc2VudGF0aW9ucy5iaW5kKGpzb25Eb2N1bWVudFN5bWJvbHMpLAogICAgICAgIGRvSG92ZXI6IGpzb25Ib3Zlci5kb0hvdmVyLmJpbmQoanNvbkhvdmVyKSwKICAgICAgICBnZXRGb2xkaW5nUmFuZ2VzLAogICAgICAgIGdldFNlbGVjdGlvblJhbmdlcywKICAgICAgICBmaW5kRGVmaW5pdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTsKICAgICAgICB9LAogICAgICAgIGZpbmRMaW5rcywKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKGQsIHIsIG8pIHsKICAgICAgICAgIHZhciByYW5nZSA9IHZvaWQgMDsKICAgICAgICAgIGlmIChyKSB7CiAgICAgICAgICAgIHZhciBvZmZzZXQgPSBkLm9mZnNldEF0KHIuc3RhcnQpOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gZC5vZmZzZXRBdChyLmVuZCkgLSBvZmZzZXQ7CiAgICAgICAgICAgIHJhbmdlID0geyBvZmZzZXQsIGxlbmd0aCB9OwogICAgICAgICAgfQogICAgICAgICAgdmFyIG9wdGlvbnMgPSB7IHRhYlNpemU6IG8gPyBvLnRhYlNpemUgOiA0LCBpbnNlcnRTcGFjZXM6IChvID09PSBudWxsIHx8IG8gPT09IHZvaWQgMCA/IHZvaWQgMCA6IG8uaW5zZXJ0U3BhY2VzKSA9PT0gdHJ1ZSwgaW5zZXJ0RmluYWxOZXdsaW5lOiAobyA9PT0gbnVsbCB8fCBvID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvLmluc2VydEZpbmFsTmV3bGluZSkgPT09IHRydWUsIGVvbDogIlxuIiB9OwogICAgICAgICAgcmV0dXJuIGZvcm1hdDIoZC5nZXRUZXh0KCksIHJhbmdlLCBvcHRpb25zKS5tYXAoZnVuY3Rpb24oZSkgewogICAgICAgICAgICByZXR1cm4gVGV4dEVkaXQucmVwbGFjZShSYW5nZS5jcmVhdGUoZC5wb3NpdGlvbkF0KGUub2Zmc2V0KSwgZC5wb3NpdGlvbkF0KGUub2Zmc2V0ICsgZS5sZW5ndGgpKSwgZS5jb250ZW50KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICAvLyBzcmMvanNvbi9qc29uV29ya2VyLnRzCiAgICB2YXIgZGVmYXVsdFNjaGVtYVJlcXVlc3RTZXJ2aWNlOwogICAgaWYgKHR5cGVvZiBmZXRjaCAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgZGVmYXVsdFNjaGVtYVJlcXVlc3RTZXJ2aWNlID0gZnVuY3Rpb24odXJsKSB7CiAgICAgICAgcmV0dXJuIGZldGNoKHVybCkudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLnRleHQoKSk7CiAgICAgIH07CiAgICB9CiAgICB2YXIgSlNPTldvcmtlciA9IGNsYXNzIHsKICAgICAgY29uc3RydWN0b3IoY3R4LCBjcmVhdGVEYXRhKSB7CiAgICAgICAgdGhpcy5fY3R4ID0gY3R4OwogICAgICAgIHRoaXMuX2xhbmd1YWdlU2V0dGluZ3MgPSBjcmVhdGVEYXRhLmxhbmd1YWdlU2V0dGluZ3M7CiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VJZCA9IGNyZWF0ZURhdGEubGFuZ3VhZ2VJZDsKICAgICAgICB0aGlzLl9sYW5ndWFnZVNlcnZpY2UgPSBnZXRMYW5ndWFnZVNlcnZpY2UoewogICAgICAgICAgd29ya3NwYWNlQ29udGV4dDogewogICAgICAgICAgICByZXNvbHZlUmVsYXRpdmVQYXRoOiAocmVsYXRpdmVQYXRoLCByZXNvdXJjZSkgPT4gewogICAgICAgICAgICAgIGNvbnN0IGJhc2UgPSByZXNvdXJjZS5zdWJzdHIoMCwgcmVzb3VyY2UubGFzdEluZGV4T2YoIi8iKSArIDEpOwogICAgICAgICAgICAgIHJldHVybiByZXNvbHZlUGF0aChiYXNlLCByZWxhdGl2ZVBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgc2NoZW1hUmVxdWVzdFNlcnZpY2U6IGNyZWF0ZURhdGEuZW5hYmxlU2NoZW1hUmVxdWVzdCA/IGRlZmF1bHRTY2hlbWFSZXF1ZXN0U2VydmljZSA6IHZvaWQgMAogICAgICAgIH0pOwogICAgICAgIHRoaXMuX2xhbmd1YWdlU2VydmljZS5jb25maWd1cmUodGhpcy5fbGFuZ3VhZ2VTZXR0aW5ncyk7CiAgICAgIH0KICAgICAgYXN5bmMgZG9WYWxpZGF0aW9uKHVyaSkgewogICAgICAgIGxldCBkb2N1bWVudCA9IHRoaXMuX2dldFRleHREb2N1bWVudCh1cmkpOwogICAgICAgIGlmIChkb2N1bWVudCkgewogICAgICAgICAgbGV0IGpzb25Eb2N1bWVudCA9IHRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudChkb2N1bWVudCk7CiAgICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmRvVmFsaWRhdGlvbihkb2N1bWVudCwganNvbkRvY3VtZW50LCB0aGlzLl9sYW5ndWFnZVNldHRpbmdzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7CiAgICAgIH0KICAgICAgYXN5bmMgZG9Db21wbGV0ZSh1cmksIHBvc2l0aW9uKSB7CiAgICAgICAgbGV0IGRvY3VtZW50ID0gdGhpcy5fZ2V0VGV4dERvY3VtZW50KHVyaSk7CiAgICAgICAgaWYgKCFkb2N1bWVudCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGxldCBqc29uRG9jdW1lbnQgPSB0aGlzLl9sYW5ndWFnZVNlcnZpY2UucGFyc2VKU09ORG9jdW1lbnQoZG9jdW1lbnQpOwogICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZVNlcnZpY2UuZG9Db21wbGV0ZShkb2N1bWVudCwgcG9zaXRpb24sIGpzb25Eb2N1bWVudCk7CiAgICAgIH0KICAgICAgYXN5bmMgZG9SZXNvbHZlKGl0ZW0pIHsKICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmRvUmVzb2x2ZShpdGVtKTsKICAgICAgfQogICAgICBhc3luYyBkb0hvdmVyKHVyaSwgcG9zaXRpb24pIHsKICAgICAgICBsZXQgZG9jdW1lbnQgPSB0aGlzLl9nZXRUZXh0RG9jdW1lbnQodXJpKTsKICAgICAgICBpZiAoIWRvY3VtZW50KSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgbGV0IGpzb25Eb2N1bWVudCA9IHRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudChkb2N1bWVudCk7CiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlU2VydmljZS5kb0hvdmVyKGRvY3VtZW50LCBwb3NpdGlvbiwganNvbkRvY3VtZW50KTsKICAgICAgfQogICAgICBhc3luYyBmb3JtYXQodXJpLCByYW5nZSwgb3B0aW9ucykgewogICAgICAgIGxldCBkb2N1bWVudCA9IHRoaXMuX2dldFRleHREb2N1bWVudCh1cmkpOwogICAgICAgIGlmICghZG9jdW1lbnQpIHsKICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICAgICAgbGV0IHRleHRFZGl0cyA9IHRoaXMuX2xhbmd1YWdlU2VydmljZS5mb3JtYXQoZG9jdW1lbnQsIHJhbmdlLCBvcHRpb25zKTsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRleHRFZGl0cyk7CiAgICAgIH0KICAgICAgYXN5bmMgcmVzZXRTY2hlbWEodXJpKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9sYW5ndWFnZVNlcnZpY2UucmVzZXRTY2hlbWEodXJpKSk7CiAgICAgIH0KICAgICAgYXN5bmMgZmluZERvY3VtZW50U3ltYm9scyh1cmkpIHsKICAgICAgICBsZXQgZG9jdW1lbnQgPSB0aGlzLl9nZXRUZXh0RG9jdW1lbnQodXJpKTsKICAgICAgICBpZiAoIWRvY3VtZW50KSB7CiAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfQogICAgICAgIGxldCBqc29uRG9jdW1lbnQgPSB0aGlzLl9sYW5ndWFnZVNlcnZpY2UucGFyc2VKU09ORG9jdW1lbnQoZG9jdW1lbnQpOwogICAgICAgIGxldCBzeW1ib2xzID0gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmZpbmREb2N1bWVudFN5bWJvbHMoZG9jdW1lbnQsIGpzb25Eb2N1bWVudCk7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShzeW1ib2xzKTsKICAgICAgfQogICAgICBhc3luYyBmaW5kRG9jdW1lbnRDb2xvcnModXJpKSB7CiAgICAgICAgbGV0IGRvY3VtZW50ID0gdGhpcy5fZ2V0VGV4dERvY3VtZW50KHVyaSk7CiAgICAgICAgaWYgKCFkb2N1bWVudCkgewogICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICBsZXQganNvbkRvY3VtZW50ID0gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLnBhcnNlSlNPTkRvY3VtZW50KGRvY3VtZW50KTsKICAgICAgICBsZXQgY29sb3JTeW1ib2xzID0gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmZpbmREb2N1bWVudENvbG9ycyhkb2N1bWVudCwganNvbkRvY3VtZW50KTsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGNvbG9yU3ltYm9scyk7CiAgICAgIH0KICAgICAgYXN5bmMgZ2V0Q29sb3JQcmVzZW50YXRpb25zKHVyaSwgY29sb3IsIHJhbmdlKSB7CiAgICAgICAgbGV0IGRvY3VtZW50ID0gdGhpcy5fZ2V0VGV4dERvY3VtZW50KHVyaSk7CiAgICAgICAgaWYgKCFkb2N1bWVudCkgewogICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICBsZXQganNvbkRvY3VtZW50ID0gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLnBhcnNlSlNPTkRvY3VtZW50KGRvY3VtZW50KTsKICAgICAgICBsZXQgY29sb3JQcmVzZW50YXRpb25zID0gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmdldENvbG9yUHJlc2VudGF0aW9ucyhkb2N1bWVudCwganNvbkRvY3VtZW50LCBjb2xvciwgcmFuZ2UpOwogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY29sb3JQcmVzZW50YXRpb25zKTsKICAgICAgfQogICAgICBhc3luYyBnZXRGb2xkaW5nUmFuZ2VzKHVyaSwgY29udGV4dCkgewogICAgICAgIGxldCBkb2N1bWVudCA9IHRoaXMuX2dldFRleHREb2N1bWVudCh1cmkpOwogICAgICAgIGlmICghZG9jdW1lbnQpIHsKICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICAgICAgbGV0IHJhbmdlcyA9IHRoaXMuX2xhbmd1YWdlU2VydmljZS5nZXRGb2xkaW5nUmFuZ2VzKGRvY3VtZW50LCBjb250ZXh0KTsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJhbmdlcyk7CiAgICAgIH0KICAgICAgYXN5bmMgZ2V0U2VsZWN0aW9uUmFuZ2VzKHVyaSwgcG9zaXRpb25zKSB7CiAgICAgICAgbGV0IGRvY3VtZW50ID0gdGhpcy5fZ2V0VGV4dERvY3VtZW50KHVyaSk7CiAgICAgICAgaWYgKCFkb2N1bWVudCkgewogICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICBsZXQganNvbkRvY3VtZW50ID0gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLnBhcnNlSlNPTkRvY3VtZW50KGRvY3VtZW50KTsKICAgICAgICBsZXQgcmFuZ2VzID0gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmdldFNlbGVjdGlvblJhbmdlcyhkb2N1bWVudCwgcG9zaXRpb25zLCBqc29uRG9jdW1lbnQpOwogICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmFuZ2VzKTsKICAgICAgfQogICAgICBfZ2V0VGV4dERvY3VtZW50KHVyaSkgewogICAgICAgIGxldCBtb2RlbHMgPSB0aGlzLl9jdHguZ2V0TWlycm9yTW9kZWxzKCk7CiAgICAgICAgZm9yIChsZXQgbW9kZWwgb2YgbW9kZWxzKSB7CiAgICAgICAgICBpZiAobW9kZWwudXJpLnRvU3RyaW5nKCkgPT09IHVyaSkgewogICAgICAgICAgICByZXR1cm4gVGV4dERvY3VtZW50Mi5jcmVhdGUodXJpLCB0aGlzLl9sYW5ndWFnZUlkLCBtb2RlbC52ZXJzaW9uLCBtb2RlbC5nZXRWYWx1ZSgpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH07CiAgICB2YXIgU2xhc2ggPSAiLyIuY2hhckNvZGVBdCgwKTsKICAgIHZhciBEb3QgPSAiLiIuY2hhckNvZGVBdCgwKTsKICAgIGZ1bmN0aW9uIGlzQWJzb2x1dGVQYXRoKHBhdGgpIHsKICAgICAgcmV0dXJuIHBhdGguY2hhckNvZGVBdCgwKSA9PT0gU2xhc2g7CiAgICB9CiAgICBmdW5jdGlvbiByZXNvbHZlUGF0aCh1cmlTdHJpbmcsIHBhdGgpIHsKICAgICAgaWYgKGlzQWJzb2x1dGVQYXRoKHBhdGgpKSB7CiAgICAgICAgY29uc3QgdXJpID0gVVJJLnBhcnNlKHVyaVN0cmluZyk7CiAgICAgICAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KCIvIik7CiAgICAgICAgcmV0dXJuIHVyaS53aXRoKHsgcGF0aDogbm9ybWFsaXplUGF0aChwYXJ0cykgfSkudG9TdHJpbmcoKTsKICAgICAgfQogICAgICByZXR1cm4gam9pblBhdGgodXJpU3RyaW5nLCBwYXRoKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGFydHMpIHsKICAgICAgY29uc3QgbmV3UGFydHMgPSBbXTsKICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIHBhcnRzKSB7CiAgICAgICAgaWYgKHBhcnQubGVuZ3RoID09PSAwIHx8IHBhcnQubGVuZ3RoID09PSAxICYmIHBhcnQuY2hhckNvZGVBdCgwKSA9PT0gRG90KSA7IGVsc2UgaWYgKHBhcnQubGVuZ3RoID09PSAyICYmIHBhcnQuY2hhckNvZGVBdCgwKSA9PT0gRG90ICYmIHBhcnQuY2hhckNvZGVBdCgxKSA9PT0gRG90KSB7CiAgICAgICAgICBuZXdQYXJ0cy5wb3AoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbmV3UGFydHMucHVzaChwYXJ0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEgJiYgcGFydHNbcGFydHMubGVuZ3RoIC0gMV0ubGVuZ3RoID09PSAwKSB7CiAgICAgICAgbmV3UGFydHMucHVzaCgiIik7CiAgICAgIH0KICAgICAgbGV0IHJlcyA9IG5ld1BhcnRzLmpvaW4oIi8iKTsKICAgICAgaWYgKHBhcnRzWzBdLmxlbmd0aCA9PT0gMCkgewogICAgICAgIHJlcyA9ICIvIiArIHJlczsKICAgICAgfQogICAgICByZXR1cm4gcmVzOwogICAgfQogICAgZnVuY3Rpb24gam9pblBhdGgodXJpU3RyaW5nLCAuLi5wYXRocykgewogICAgICBjb25zdCB1cmkgPSBVUkkucGFyc2UodXJpU3RyaW5nKTsKICAgICAgY29uc3QgcGFydHMgPSB1cmkucGF0aC5zcGxpdCgiLyIpOwogICAgICBmb3IgKGxldCBwYXRoIG9mIHBhdGhzKSB7CiAgICAgICAgcGFydHMucHVzaCguLi5wYXRoLnNwbGl0KCIvIikpOwogICAgICB9CiAgICAgIHJldHVybiB1cmkud2l0aCh7IHBhdGg6IG5vcm1hbGl6ZVBhdGgocGFydHMpIH0pLnRvU3RyaW5nKCk7CiAgICB9CgogICAgLy8gc3JjL2pzb24vanNvbi53b3JrZXIudHMKICAgIHNlbGYub25tZXNzYWdlID0gKCkgPT4gewogICAgICBpbml0aWFsaXplKChjdHgsIGNyZWF0ZURhdGEpID0+IHsKICAgICAgICByZXR1cm4gbmV3IEpTT05Xb3JrZXIoY3R4LCBjcmVhdGVEYXRhKTsKICAgICAgfSk7CiAgICB9OwoKfSkoKTsKCg==', null, false);
3
+ var WorkerFactory = createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwohZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7Y2xhc3MgZXtjb25zdHJ1Y3Rvcigpe3RoaXMubGlzdGVuZXJzPVtdLHRoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcj1mdW5jdGlvbihlKXtzZXRUaW1lb3V0KCgpPT57aWYoZS5zdGFjayl0aHJvdyBuZXcgRXJyb3IoZS5tZXNzYWdlKyJcblxuIitlLnN0YWNrKTt0aHJvdyBlfSwwKX19YWRkTGlzdGVuZXIoZSl7cmV0dXJuIHRoaXMubGlzdGVuZXJzLnB1c2goZSksKCk9Pnt0aGlzLl9yZW1vdmVMaXN0ZW5lcihlKX19ZW1pdCh0KXt0aGlzLmxpc3RlbmVycy5mb3JFYWNoKGU9PntlKHQpfSl9X3JlbW92ZUxpc3RlbmVyKGUpe3RoaXMubGlzdGVuZXJzLnNwbGljZSh0aGlzLmxpc3RlbmVycy5pbmRleE9mKGUpLDEpfXNldFVuZXhwZWN0ZWRFcnJvckhhbmRsZXIoZSl7dGhpcy51bmV4cGVjdGVkRXJyb3JIYW5kbGVyPWV9Z2V0VW5leHBlY3RlZEVycm9ySGFuZGxlcigpe3JldHVybiB0aGlzLnVuZXhwZWN0ZWRFcnJvckhhbmRsZXJ9b25VbmV4cGVjdGVkRXJyb3IoZSl7dGhpcy51bmV4cGVjdGVkRXJyb3JIYW5kbGVyKGUpLHRoaXMuZW1pdChlKX1vblVuZXhwZWN0ZWRFeHRlcm5hbEVycm9yKGUpe3RoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcihlKX19Y29uc3Qgcj1uZXcgZTtmdW5jdGlvbiBpKGUpe3ZhciB0Oyh0PWUpaW5zdGFuY2VvZiBFcnJvciYmdC5uYW1lPT09byYmdC5tZXNzYWdlPT09b3x8ci5vblVuZXhwZWN0ZWRFcnJvcihlKX1mdW5jdGlvbiBuKGUpe2lmKGUgaW5zdGFuY2VvZiBFcnJvcil7dmFye25hbWU6dCxtZXNzYWdlOnJ9PWU7cmV0dXJueyRpc0Vycm9yOiEwLG5hbWU6dCxtZXNzYWdlOnIsc3RhY2s6ZS5zdGFja3RyYWNlfHxlLnN0YWNrfX1yZXR1cm4gZX1jb25zdCBvPSJDYW5jZWxlZCI7dmFyIHQ7IWZ1bmN0aW9uKG8pe28uaXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJiJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGVbU3ltYm9sLml0ZXJhdG9yXX07Y29uc3QgdD1PYmplY3QuZnJlZXplKFtdKTtvLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG8uc2luZ2xlPWZ1bmN0aW9uKihlKXt5aWVsZCBlfSxvLmZyb209ZnVuY3Rpb24oZSl7cmV0dXJuIGV8fHR9LG8uaXNFbXB0eT1mdW5jdGlvbihlKXtyZXR1cm4hZXx8ITA9PT1lW1N5bWJvbC5pdGVyYXRvcl0oKS5uZXh0KCkuZG9uZX0sby5maXJzdD1mdW5jdGlvbihlKXtyZXR1cm4gZVtTeW1ib2wuaXRlcmF0b3JdKCkubmV4dCgpLnZhbHVlfSxvLnNvbWU9ZnVuY3Rpb24oZSx0KXtmb3IoY29uc3QgciBvZiBlKWlmKHQocikpcmV0dXJuITA7cmV0dXJuITF9LG8uZmluZD1mdW5jdGlvbihlLHQpe2Zvcihjb25zdCByIG9mIGUpaWYodChyKSlyZXR1cm4gcn0sby5maWx0ZXI9ZnVuY3Rpb24qKGUsdCl7Zm9yKGNvbnN0IHIgb2YgZSl0KHIpJiYoeWllbGQgcil9LG8ubWFwPWZ1bmN0aW9uKihlLHQpe2xldCByPTA7Zm9yKGNvbnN0IG4gb2YgZSl5aWVsZCB0KG4scisrKX0sby5jb25jYXQ9ZnVuY3Rpb24qKC4uLmUpe2Zvcihjb25zdCB0IG9mIGUpZm9yKGNvbnN0IHIgb2YgdCl5aWVsZCByfSxvLmNvbmNhdE5lc3RlZD1mdW5jdGlvbiooZSl7Zm9yKGNvbnN0IHQgb2YgZSlmb3IoY29uc3QgciBvZiB0KXlpZWxkIHJ9LG8ucmVkdWNlPWZ1bmN0aW9uKGUsdCxyKXtsZXQgbj1yO2Zvcihjb25zdCBpIG9mIGUpbj10KG4saSk7cmV0dXJuIG59LG8uc2xpY2U9ZnVuY3Rpb24qKGUsdCxyPWUubGVuZ3RoKXtmb3IodDwwJiYodCs9ZS5sZW5ndGgpLHI8MD9yKz1lLmxlbmd0aDpyPmUubGVuZ3RoJiYocj1lLmxlbmd0aCk7dDxyO3QrKyl5aWVsZCBlW3RdfSxvLmNvbnN1bWU9ZnVuY3Rpb24oZSx0PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSl7Y29uc3Qgcj1bXTtpZigwPT09dClyZXR1cm5bcixlXTtjb25zdCBuPWVbU3ltYm9sLml0ZXJhdG9yXSgpO2ZvcihsZXQgZT0wO2U8dDtlKyspe3ZhciBpPW4ubmV4dCgpO2lmKGkuZG9uZSlyZXR1cm5bcixvLmVtcHR5KCldO3IucHVzaChpLnZhbHVlKX1yZXR1cm5bcix7W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gbn19XX0sby5lcXVhbHM9ZnVuY3Rpb24oZSx0LHI9KGUsdCk9PmU9PT10KXtjb25zdCBuPWVbU3ltYm9sLml0ZXJhdG9yXSgpLGk9dFtTeW1ib2wuaXRlcmF0b3JdKCk7Zm9yKDs7KXt2YXIgbz1uLm5leHQoKSxzPWkubmV4dCgpO2lmKG8uZG9uZSE9PXMuZG9uZSlyZXR1cm4hMTtpZihvLmRvbmUpcmV0dXJuITA7aWYoIXIoby52YWx1ZSxzLnZhbHVlKSlyZXR1cm4hMX19fSh0PXR8fHt9KTtjbGFzcyBzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoZSl7c3VwZXIoYEVuY291bnRlcmVkIGVycm9ycyB3aGlsZSBkaXNwb3Npbmcgb2Ygc3RvcmUuIEVycm9yczogWyR7ZS5qb2luKCIsICIpfV1gKSx0aGlzLmVycm9ycz1lfX1mdW5jdGlvbiBoKGUpe2lmKHQuaXMoZSkpe2xldCB0PVtdO2Zvcihjb25zdCByIG9mIGUpaWYocil0cnl7ci5kaXNwb3NlKCl9Y2F0Y2goZSl7dC5wdXNoKGUpfWlmKDE9PT10Lmxlbmd0aCl0aHJvdyB0WzBdO2lmKDE8dC5sZW5ndGgpdGhyb3cgbmV3IHModCk7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/W106ZX1pZihlKXJldHVybiBlLmRpc3Bvc2UoKSxlfWZ1bmN0aW9uIGMoZSl7cmV0dXJue2Rpc3Bvc2U6ZnVuY3Rpb24oZSl7Y29uc3QgdD10aGlzO2xldCByPSExLG47cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHJ8fChyPSEwLG49ZS5hcHBseSh0LGFyZ3VtZW50cykpLG59fSgoKT0+e2UoKX0pfX1jbGFzcyBhe2NvbnN0cnVjdG9yKCl7dGhpcy5fdG9EaXNwb3NlPW5ldyBTZXQsdGhpcy5faXNEaXNwb3NlZD0hMX1kaXNwb3NlKCl7dGhpcy5faXNEaXNwb3NlZHx8KHRoaXMuX2lzRGlzcG9zZWQ9ITAsdGhpcy5jbGVhcigpKX1jbGVhcigpe3RyeXtoKHRoaXMuX3RvRGlzcG9zZS52YWx1ZXMoKSl9ZmluYWxseXt0aGlzLl90b0Rpc3Bvc2UuY2xlYXIoKX19YWRkKGUpe2lmKCFlKXJldHVybiBlO2lmKGU9PT10aGlzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIGEgZGlzcG9zYWJsZSBvbiBpdHNlbGYhIik7cmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQ/YS5ESVNBQkxFX0RJU1BPU0VEX1dBUk5JTkd8fGNvbnNvbGUud2FybihuZXcgRXJyb3IoIlRyeWluZyB0byBhZGQgYSBkaXNwb3NhYmxlIHRvIGEgRGlzcG9zYWJsZVN0b3JlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZCBvZi4gVGhlIGFkZGVkIG9iamVjdCB3aWxsIGJlIGxlYWtlZCEiKS5zdGFjayk6dGhpcy5fdG9EaXNwb3NlLmFkZChlKSxlfX1hLkRJU0FCTEVfRElTUE9TRURfV0FSTklORz0hMTtjbGFzcyBke2NvbnN0cnVjdG9yKCl7dGhpcy5fc3RvcmU9bmV3IGEsdGhpcy5fc3RvcmV9ZGlzcG9zZSgpe3RoaXMuX3N0b3JlLmRpc3Bvc2UoKX1fcmVnaXN0ZXIoZSl7aWYoZT09PXRoaXMpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgcmVnaXN0ZXIgYSBkaXNwb3NhYmxlIG9uIGl0c2VsZiEiKTtyZXR1cm4gdGhpcy5fc3RvcmUuYWRkKGUpfX1kLk5vbmU9T2JqZWN0LmZyZWV6ZSh7ZGlzcG9zZSgpe319KTtjbGFzcyBse2NvbnN0cnVjdG9yKGUpe3RoaXMuZWxlbWVudD1lLHRoaXMubmV4dD1sLlVuZGVmaW5lZCx0aGlzLnByZXY9bC5VbmRlZmluZWR9fWwuVW5kZWZpbmVkPW5ldyBsKHZvaWQgMCk7Y2xhc3MgdXtjb25zdHJ1Y3Rvcigpe3RoaXMuX2ZpcnN0PWwuVW5kZWZpbmVkLHRoaXMuX2xhc3Q9bC5VbmRlZmluZWQsdGhpcy5fc2l6ZT0wfWdldCBzaXplKCl7cmV0dXJuIHRoaXMuX3NpemV9aXNFbXB0eSgpe3JldHVybiB0aGlzLl9maXJzdD09PWwuVW5kZWZpbmVkfWNsZWFyKCl7bGV0IGU9dGhpcy5fZmlyc3Q7Zm9yKDtlIT09bC5VbmRlZmluZWQ7KXt2YXIgdD1lLm5leHQ7ZS5wcmV2PWwuVW5kZWZpbmVkLGUubmV4dD1sLlVuZGVmaW5lZCxlPXR9dGhpcy5fZmlyc3Q9bC5VbmRlZmluZWQsdGhpcy5fbGFzdD1sLlVuZGVmaW5lZCx0aGlzLl9zaXplPTB9dW5zaGlmdChlKXtyZXR1cm4gdGhpcy5faW5zZXJ0KGUsITEpfXB1c2goZSl7cmV0dXJuIHRoaXMuX2luc2VydChlLCEwKX1faW5zZXJ0KGUsdCl7Y29uc3Qgcj1uZXcgbChlKTtpZih0aGlzLl9maXJzdD09PWwuVW5kZWZpbmVkKXRoaXMuX2ZpcnN0PXIsdGhpcy5fbGFzdD1yO2Vsc2UgaWYodCl7Y29uc3QgaT10aGlzLl9sYXN0O3RoaXMuX2xhc3Q9cixyLnByZXY9aSxpLm5leHQ9cn1lbHNle2NvbnN0IG89dGhpcy5fZmlyc3Q7dGhpcy5fZmlyc3Q9cixyLm5leHQ9byxvLnByZXY9cn10aGlzLl9zaXplKz0xO2xldCBuPSExO3JldHVybigpPT57bnx8KG49ITAsdGhpcy5fcmVtb3ZlKHIpKX19c2hpZnQoKXtpZih0aGlzLl9maXJzdCE9PWwuVW5kZWZpbmVkKXt2YXIgZT10aGlzLl9maXJzdC5lbGVtZW50O3JldHVybiB0aGlzLl9yZW1vdmUodGhpcy5fZmlyc3QpLGV9fXBvcCgpe2lmKHRoaXMuX2xhc3QhPT1sLlVuZGVmaW5lZCl7dmFyIGU9dGhpcy5fbGFzdC5lbGVtZW50O3JldHVybiB0aGlzLl9yZW1vdmUodGhpcy5fbGFzdCksZX19X3JlbW92ZShlKXtpZihlLnByZXYhPT1sLlVuZGVmaW5lZCYmZS5uZXh0IT09bC5VbmRlZmluZWQpe2NvbnN0IHQ9ZS5wcmV2O3QubmV4dD1lLm5leHQsZS5uZXh0LnByZXY9dH1lbHNlIGUucHJldj09PWwuVW5kZWZpbmVkJiZlLm5leHQ9PT1sLlVuZGVmaW5lZD8odGhpcy5fZmlyc3Q9bC5VbmRlZmluZWQsdGhpcy5fbGFzdD1sLlVuZGVmaW5lZCk6ZS5uZXh0PT09bC5VbmRlZmluZWQ/KHRoaXMuX2xhc3Q9dGhpcy5fbGFzdC5wcmV2LHRoaXMuX2xhc3QubmV4dD1sLlVuZGVmaW5lZCk6ZS5wcmV2PT09bC5VbmRlZmluZWQmJih0aGlzLl9maXJzdD10aGlzLl9maXJzdC5uZXh0LHRoaXMuX2ZpcnN0LnByZXY9bC5VbmRlZmluZWQpOy0tdGhpcy5fc2l6ZX0qW1N5bWJvbC5pdGVyYXRvcl0oKXtsZXQgZT10aGlzLl9maXJzdDtmb3IoO2UhPT1sLlVuZGVmaW5lZDspeWllbGQgZS5lbGVtZW50LGU9ZS5uZXh0fX12YXIgZj0iZW4iO2xldCBtPSExLGc9ITEscD0hMSx2PXZvaWQgMCx5PWY7bGV0IGI9dm9pZCAwO2NvbnN0IF89Im9iamVjdCI9PXR5cGVvZiBzZWxmP3NlbGY6Im9iamVjdCI9PXR5cGVvZiBnbG9iYWw/Z2xvYmFsOnt9O2xldCBDPXZvaWQgMDt2b2lkIDAhPT1fLnZzY29kZSYmdm9pZCAwIT09Xy52c2NvZGUucHJvY2Vzcz9DPV8udnNjb2RlLnByb2Nlc3M6InVuZGVmaW5lZCIhPXR5cGVvZiBwcm9jZXNzJiYoQz1wcm9jZXNzKTt2YXIgUz0ic3RyaW5nIj09dHlwZW9mKG51bGw9PT0oUz1udWxsPT09Q3x8dm9pZCAwPT09Qz92b2lkIDA6Qy52ZXJzaW9ucyl8fHZvaWQgMD09PVM/dm9pZCAwOlMuZWxlY3Ryb24pJiYicmVuZGVyZXIiPT09KG51bGw9PT1DfHx2b2lkIDA9PT1DP3ZvaWQgMDpDLnR5cGUpO2lmKCJvYmplY3QiIT10eXBlb2YgbmF2aWdhdG9yfHxTKWlmKCJvYmplY3QiPT10eXBlb2YgQyl7bT0id2luMzIiPT09Qy5wbGF0Zm9ybSxnPSJkYXJ3aW4iPT09Qy5wbGF0Zm9ybSxwPSJsaW51eCI9PT1DLnBsYXRmb3JtLHAmJkMuZW52LlNOQVAmJkMuZW52LlNOQVBfUkVWSVNJT04sdj1mLHk9ZjtTPUMuZW52LlZTQ09ERV9OTFNfQ09ORklHO2lmKFMpdHJ5e3ZhciB3PUpTT04ucGFyc2UoUyksQT13LmF2YWlsYWJsZUxhbmd1YWdlc1siKiJdO3Y9dy5sb2NhbGUseT1BfHxmLHcuX3RyYW5zbGF0aW9uc0NvbmZpZ0ZpbGV9Y2F0Y2goZSl7fX1lbHNlIGNvbnNvbGUuZXJyb3IoIlVuYWJsZSB0byByZXNvbHZlIHBsYXRmb3JtLiIpO2Vsc2UgYj1uYXZpZ2F0b3IudXNlckFnZW50LG09MDw9Yi5pbmRleE9mKCJXaW5kb3dzIiksZz0wPD1iLmluZGV4T2YoIk1hY2ludG9zaCIpLCgwPD1iLmluZGV4T2YoIk1hY2ludG9zaCIpfHwwPD1iLmluZGV4T2YoImlQYWQiKXx8MDw9Yi5pbmRleE9mKCJpUGhvbmUiKSkmJm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyYmbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzLHA9MDw9Yi5pbmRleE9mKCJMaW51eCIpLHY9bmF2aWdhdG9yLmxhbmd1YWdlLHk9djtjb25zdCB4PW0sRT1nLE49eSxMPXYsaz0oKCk9PntpZigiZnVuY3Rpb24iIT10eXBlb2YgXy5wb3N0TWVzc2FnZXx8Xy5pbXBvcnRTY3JpcHRzKXJldHVybiBlPT5zZXRUaW1lb3V0KGUpO3tsZXQgaT1bXTtfLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHI9PntpZihyLmRhdGEmJnIuZGF0YS52c2NvZGVTY2hlZHVsZUFzeW5jV29yaylmb3IobGV0IGU9MCx0PWkubGVuZ3RoO2U8dDtlKyspe2NvbnN0IG49aVtlXTtpZihuLmlkPT09ci5kYXRhLnZzY29kZVNjaGVkdWxlQXN5bmNXb3JrKXJldHVybiBpLnNwbGljZShlLDEpLHZvaWQgbi5jYWxsYmFjaygpfX0pO2xldCByPTA7cmV0dXJuIGU9Pnt2YXIgdD0rK3I7aS5wdXNoKHtpZDp0LGNhbGxiYWNrOmV9KSxfLnBvc3RNZXNzYWdlKHt2c2NvZGVTY2hlZHVsZUFzeW5jV29yazp0fSwiKiIpfX19KSgpOyFmdW5jdGlvbigpe2lmKF8uc2V0SW1tZWRpYXRlKXJldHVybiBfLnNldEltbWVkaWF0ZS5iaW5kKF8pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBfLnBvc3RNZXNzYWdlJiYhXy5pbXBvcnRTY3JpcHRzKXJldHVybiBrO2lmKCJmdW5jdGlvbiI9PXR5cGVvZihudWxsPT09Q3x8dm9pZCAwPT09Qz92b2lkIDA6Qy5uZXh0VGljaykpcmV0dXJuIEMubmV4dFRpY2suYmluZChDKTtQcm9taXNlLnJlc29sdmUoKX0oKTtjb25zdCBNPV8ucGVyZm9ybWFuY2UmJiJmdW5jdGlvbiI9PXR5cGVvZiBfLnBlcmZvcm1hbmNlLm5vdztjbGFzcyBUe2NvbnN0cnVjdG9yKGUpe3RoaXMuX2hpZ2hSZXNvbHV0aW9uPU0mJmUsdGhpcy5fc3RhcnRUaW1lPXRoaXMuX25vdygpLHRoaXMuX3N0b3BUaW1lPS0xfXN0YXRpYyBjcmVhdGUoZT0hMCl7cmV0dXJuIG5ldyBUKGUpfXN0b3AoKXt0aGlzLl9zdG9wVGltZT10aGlzLl9ub3coKX1lbGFwc2VkKCl7cmV0dXJuLTEhPT10aGlzLl9zdG9wVGltZT90aGlzLl9zdG9wVGltZS10aGlzLl9zdGFydFRpbWU6dGhpcy5fbm93KCktdGhpcy5fc3RhcnRUaW1lfV9ub3coKXtyZXR1cm4odGhpcy5faGlnaFJlc29sdXRpb24/Xy5wZXJmb3JtYW5jZTpEYXRlKS5ub3coKX19IWZ1bmN0aW9uKHIpe2Z1bmN0aW9uIG4obyl7cmV0dXJuKHQscj1udWxsLGUpPT57bGV0IG49ITEsaTtyZXR1cm4gaT1vKGU9PntpZighbilyZXR1cm4gaT9pLmRpc3Bvc2UoKTpuPSEwLHQuY2FsbChyLGUpfSxudWxsLGUpLG4mJmkuZGlzcG9zZSgpLGl9fWZ1bmN0aW9uIGkobixpKXtyZXR1cm4gZSgodCxyPW51bGwsZSk9Pm4oZT0+dC5jYWxsKHIsaShlKSksbnVsbCxlKSl9ZnVuY3Rpb24gdChuLGkpe3JldHVybiBlKCh0LHI9bnVsbCxlKT0+bihlPT57aShlKSx0LmNhbGwocixlKX0sbnVsbCxlKSl9ZnVuY3Rpb24gbyhuLGkpe3JldHVybiBlKCh0LHI9bnVsbCxlKT0+bihlPT5pKGUpJiZ0LmNhbGwocixlKSxudWxsLGUpKX1mdW5jdGlvbiBzKGUsdCxyKXtsZXQgbj1yO3JldHVybiBpKGUsZT0+KG49dChuLGUpLG4pKX1mdW5jdGlvbiBlKGUpe2xldCB0O2NvbnN0IHI9bmV3IEkoe29uRmlyc3RMaXN0ZW5lckFkZCgpe3Q9ZShyLmZpcmUscil9LG9uTGFzdExpc3RlbmVyUmVtb3ZlKCl7dC5kaXNwb3NlKCl9fSk7cmV0dXJuIHIuZXZlbnR9ZnVuY3Rpb24gYShlLHQscj0xMDAsbj0hMSxpKXtsZXQgbyxzPXZvaWQgMCxhPXZvaWQgMCxsPTA7Y29uc3QgdT1uZXcgSSh7bGVha1dhcm5pbmdUaHJlc2hvbGQ6aSxvbkZpcnN0TGlzdGVuZXJBZGQoKXtvPWUoZT0+e2wrKyxzPXQocyxlKSxuJiYhYSYmKHUuZmlyZShzKSxzPXZvaWQgMCksY2xlYXJUaW1lb3V0KGEpLGE9c2V0VGltZW91dCgoKT0+e3ZhciBlPXM7cz12b2lkIDAsYT12b2lkIDAsKCFufHwxPGwpJiZ1LmZpcmUoZSksbD0wfSxyKX0pfSxvbkxhc3RMaXN0ZW5lclJlbW92ZSgpe28uZGlzcG9zZSgpfX0pO3JldHVybiB1LmV2ZW50fWZ1bmN0aW9uIGwoZSxyPShlLHQpPT5lPT09dCl7bGV0IG49ITAsaTtyZXR1cm4gbyhlLGU9Pnt2YXIgdD1ufHwhcihlLGkpO3JldHVybiBuPSExLGk9ZSx0fSl9ci5Ob25lPSgpPT5kLk5vbmUsci5vbmNlPW4sci5tYXA9aSxyLmZvckVhY2g9dCxyLmZpbHRlcj1vLHIuc2lnbmFsPWZ1bmN0aW9uKGUpe3JldHVybiBlfSxyLmFueT1mdW5jdGlvbiguLi5lKXtyZXR1cm4odCxyPW51bGwsbik9PmZ1bmN0aW9uKC4uLmUpe3JldHVybiBjKCgpPT5oKGUpKX0oLi4uZS5tYXAoZT0+ZShlPT50LmNhbGwocixlKSxudWxsLG4pKSl9LHIucmVkdWNlPXMsci5kZWJvdW5jZT1hLHIubGF0Y2g9bCxyLnNwbGl0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuW3IuZmlsdGVyKGUsdCksci5maWx0ZXIoZSxlPT4hdChlKSldfSxyLmJ1ZmZlcj1mdW5jdGlvbihlLHQ9ITEscj1bXSl7bGV0IG49ci5zbGljZSgpLGk9ZShlPT57bj9uLnB1c2goZSk6cy5maXJlKGUpfSk7Y29uc3Qgbz0oKT0+e24mJm4uZm9yRWFjaChlPT5zLmZpcmUoZSkpLG49bnVsbH0scz1uZXcgSSh7b25GaXJzdExpc3RlbmVyQWRkKCl7aT1pfHxlKGU9PnMuZmlyZShlKSl9LG9uRmlyc3RMaXN0ZW5lckRpZEFkZCgpe24mJih0P3NldFRpbWVvdXQobyk6bygpKX0sb25MYXN0TGlzdGVuZXJSZW1vdmUoKXtpJiZpLmRpc3Bvc2UoKSxpPW51bGx9fSk7cmV0dXJuIHMuZXZlbnR9O2NsYXNzIHV7Y29uc3RydWN0b3IoZSl7dGhpcy5ldmVudD1lfW1hcChlKXtyZXR1cm4gbmV3IHUoaSh0aGlzLmV2ZW50LGUpKX1mb3JFYWNoKGUpe3JldHVybiBuZXcgdSh0KHRoaXMuZXZlbnQsZSkpfWZpbHRlcihlKXtyZXR1cm4gbmV3IHUobyh0aGlzLmV2ZW50LGUpKX1yZWR1Y2UoZSx0KXtyZXR1cm4gbmV3IHUocyh0aGlzLmV2ZW50LGUsdCkpfWxhdGNoKCl7cmV0dXJuIG5ldyB1KGwodGhpcy5ldmVudCkpfWRlYm91bmNlKGUsdD0xMDAscj0hMSxuKXtyZXR1cm4gbmV3IHUoYSh0aGlzLmV2ZW50LGUsdCxyLG4pKX1vbihlLHQscil7cmV0dXJuIHRoaXMuZXZlbnQoZSx0LHIpfW9uY2UoZSx0LHIpe3JldHVybiBuKHRoaXMuZXZlbnQpKGUsdCxyKX19ci5jaGFpbj1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IHUoZSl9LHIuZnJvbU5vZGVFdmVudEVtaXR0ZXI9ZnVuY3Rpb24oZSx0LHI9ZT0+ZSl7Y29uc3Qgbj0oLi4uZSk9PmkuZmlyZShyKC4uLmUpKSxpPW5ldyBJKHtvbkZpcnN0TGlzdGVuZXJBZGQ6KCk9PmUub24odCxuKSxvbkxhc3RMaXN0ZW5lclJlbW92ZTooKT0+ZS5yZW1vdmVMaXN0ZW5lcih0LG4pfSk7cmV0dXJuIGkuZXZlbnR9LHIuZnJvbURPTUV2ZW50RW1pdHRlcj1mdW5jdGlvbihlLHQscj1lPT5lKXtjb25zdCBuPSguLi5lKT0+aS5maXJlKHIoLi4uZSkpLGk9bmV3IEkoe29uRmlyc3RMaXN0ZW5lckFkZDooKT0+ZS5hZGRFdmVudExpc3RlbmVyKHQsbiksb25MYXN0TGlzdGVuZXJSZW1vdmU6KCk9PmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4pfSk7cmV0dXJuIGkuZXZlbnR9LHIudG9Qcm9taXNlPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUHJvbWlzZShlPT5uKHQpKGUpKX19KFV0PVV0fHx7fSk7Y2xhc3MgT3tjb25zdHJ1Y3RvcihlKXt0aGlzLl9saXN0ZW5lckNvdW50PTAsdGhpcy5faW52b2NhdGlvbkNvdW50PTAsdGhpcy5fZWxhcHNlZE92ZXJhbGw9MCx0aGlzLl9uYW1lPWUrIl8iK08uX2lkUG9vbCsrfXN0YXJ0KGUpe3RoaXMuX3N0b3BXYXRjaD1uZXcgVCghMCksdGhpcy5fbGlzdGVuZXJDb3VudD1lfXN0b3AoKXtpZih0aGlzLl9zdG9wV2F0Y2gpe2NvbnN0IGU9dGhpcy5fc3RvcFdhdGNoLmVsYXBzZWQoKTt0aGlzLl9lbGFwc2VkT3ZlcmFsbCs9ZSx0aGlzLl9pbnZvY2F0aW9uQ291bnQrPTEsY29uc29sZS5pbmZvKGBkaWQgRklSRSAke3RoaXMuX25hbWV9OiBlbGFwc2VkX21zOiAke2UudG9GaXhlZCg1KX0sIGxpc3RlbmVyOiAke3RoaXMuX2xpc3RlbmVyQ291bnR9IChlbGFwc2VkX292ZXJhbGw6ICR7dGhpcy5fZWxhcHNlZE92ZXJhbGwudG9GaXhlZCgyKX0sIGludm9jYXRpb25zOiAke3RoaXMuX2ludm9jYXRpb25Db3VudH0pYCksdGhpcy5fc3RvcFdhdGNoPXZvaWQgMH19fU8uX2lkUG9vbD0wO2NsYXNzIEl7Y29uc3RydWN0b3IoZSl7dGhpcy5fZGlzcG9zZWQ9ITEsdGhpcy5fb3B0aW9ucz1lLHRoaXMuX2xlYWthZ2VNb249dm9pZCAwLHRoaXMuX3BlcmZNb249bnVsbCE9PShlPXRoaXMuX29wdGlvbnMpJiZ2b2lkIDAhPT1lJiZlLl9wcm9mTmFtZT9uZXcgTyh0aGlzLl9vcHRpb25zLl9wcm9mTmFtZSk6dm9pZCAwfWdldCBldmVudCgpe3JldHVybiB0aGlzLl9ldmVudHx8KHRoaXMuX2V2ZW50PShlLHQscik9Pnt0aGlzLl9saXN0ZW5lcnN8fCh0aGlzLl9saXN0ZW5lcnM9bmV3IHUpO3ZhciBuPXRoaXMuX2xpc3RlbmVycy5pc0VtcHR5KCk7biYmdGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQmJnRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkKHRoaXMpO2NvbnN0IGk9dGhpcy5fbGlzdGVuZXJzLnB1c2godD9bZSx0XTplKTtuJiZ0aGlzLl9vcHRpb25zJiZ0aGlzLl9vcHRpb25zLm9uRmlyc3RMaXN0ZW5lckRpZEFkZCYmdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJEaWRBZGQodGhpcyksdGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5vbkxpc3RlbmVyRGlkQWRkJiZ0aGlzLl9vcHRpb25zLm9uTGlzdGVuZXJEaWRBZGQodGhpcyxlLHQpO2NvbnN0IG89bnVsbD09PSh0PXRoaXMuX2xlYWthZ2VNb24pfHx2b2lkIDA9PT10P3ZvaWQgMDp0LmNoZWNrKHRoaXMuX2xpc3RlbmVycy5zaXplKTt0PWMoKCk9PntvJiZvKCksdGhpcy5fZGlzcG9zZWR8fChpKCksdGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5vbkxhc3RMaXN0ZW5lclJlbW92ZSYmKHRoaXMuX2xpc3RlbmVycyYmIXRoaXMuX2xpc3RlbmVycy5pc0VtcHR5KCl8fHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcykpKX0pO3JldHVybiByIGluc3RhbmNlb2YgYT9yLmFkZCh0KTpBcnJheS5pc0FycmF5KHIpJiZyLnB1c2godCksdH0pLHRoaXMuX2V2ZW50fWZpcmUoZSl7dmFyIHQ7aWYodGhpcy5fbGlzdGVuZXJzKXt0aGlzLl9kZWxpdmVyeVF1ZXVlfHwodGhpcy5fZGVsaXZlcnlRdWV1ZT1uZXcgdSk7Zm9yKHZhciByIG9mIHRoaXMuX2xpc3RlbmVycyl0aGlzLl9kZWxpdmVyeVF1ZXVlLnB1c2goW3IsZV0pO2ZvcihudWxsIT09KHQ9dGhpcy5fcGVyZk1vbikmJnZvaWQgMCE9PXQmJnQuc3RhcnQodGhpcy5fZGVsaXZlcnlRdWV1ZS5zaXplKTswPHRoaXMuX2RlbGl2ZXJ5UXVldWUuc2l6ZTspe2NvbnN0W24sZV09dGhpcy5fZGVsaXZlcnlRdWV1ZS5zaGlmdCgpO3RyeXsiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmNhbGwodm9pZCAwLGUpOm5bMF0uY2FsbChuWzFdLGUpfWNhdGNoKGUpe2koZSl9fW51bGwhPT0odD10aGlzLl9wZXJmTW9uKSYmdm9pZCAwIT09dCYmdC5zdG9wKCl9fWRpc3Bvc2UoKXt2YXIgZSx0O3RoaXMuX2Rpc3Bvc2VkfHwodGhpcy5fZGlzcG9zZWQ9ITAsbnVsbCE9PSh0PXRoaXMuX2xpc3RlbmVycykmJnZvaWQgMCE9PXQmJnQuY2xlYXIoKSxudWxsIT09KGU9dGhpcy5fZGVsaXZlcnlRdWV1ZSkmJnZvaWQgMCE9PWUmJmUuY2xlYXIoKSxudWxsIT09KGU9bnVsbD09PSh0PXRoaXMuX29wdGlvbnMpfHx2b2lkIDA9PT10P3ZvaWQgMDp0Lm9uTGFzdExpc3RlbmVyUmVtb3ZlKSYmdm9pZCAwIT09ZSYmZS5jYWxsKHQpLG51bGwhPT0odD10aGlzLl9sZWFrYWdlTW9uKSYmdm9pZCAwIT09dCYmdC5kaXNwb3NlKCkpfX1mdW5jdGlvbiBQKGUpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IHIgb2YgZnVuY3Rpb24oZSl7bGV0IHQ9W10scj1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7Zm9yKDtPYmplY3QucHJvdG90eXBlIT09cjspdD10LmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhyKSkscj1PYmplY3QuZ2V0UHJvdG90eXBlT2Yocik7cmV0dXJuIHR9KGUpKSJmdW5jdGlvbiI9PXR5cGVvZiBlW3JdJiZ0LnB1c2gocik7cmV0dXJuIHR9ZnVuY3Rpb24gVihlLHIpe2xldCB0PXt9O2Zvcihjb25zdCBuIG9mIGUpdFtuXT0odD0+ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIHIodCxlKX0pKG4pO3JldHVybiB0fWZ1bmN0aW9uIFIocixuLGk9MCxvPXIubGVuZ3RoLHM9MCxhPW4ubGVuZ3RoKXtmb3IoO2k8byYmczxhO2krKyxzKyspe2xldCBlPXIuY2hhckNvZGVBdChpKSx0PW4uY2hhckNvZGVBdChzKTtpZihlIT09dCl7aWYoMTI4PD1lfHwxMjg8PXQpcmV0dXJuIGZ1bmN0aW9uKGUsdCxyPTAsbj1lLmxlbmd0aCxpPTAsbz10Lmxlbmd0aCl7Zm9yKDtyPG4mJmk8bztyKyssaSsrKXt2YXIgcz1lLmNoYXJDb2RlQXQociksYT10LmNoYXJDb2RlQXQoaSk7aWYoczxhKXJldHVybi0xO2lmKGE8cylyZXR1cm4gMX12YXIgbD1uLXIsdT1vLWk7cmV0dXJuIGw8dT8tMTp1PGw/MTowfShyLnRvTG93ZXJDYXNlKCksbi50b0xvd2VyQ2FzZSgpLGksbyxzLGEpO0QoZSkmJihlLT0zMiksRCh0KSYmKHQtPTMyKTt2YXIgbD1lLXQ7aWYoMCE9bClyZXR1cm4gbH19dmFyIGU9by1pLHQ9YS1zO3JldHVybiBlPHQ/LTE6dDxlPzE6MH1mdW5jdGlvbiBEKGUpe3JldHVybiA5Nzw9ZSYmZTw9MTIyfWZ1bmN0aW9uIEYoZSl7cmV0dXJuIDY1PD1lJiZlPD05MH1mdW5jdGlvbiBLKGUpe3JldHVybiA1NTI5Njw9ZSYmZTw9NTYzMTl9Y2xhc3MgantzdGF0aWMgZ2V0RGF0YSgpe3JldHVybiBKU09OLnBhcnNlKCd7Il9jb21tb24iOls4MjMyLDMyLDgyMzMsMzIsNTc2MCwzMiw4MTkyLDMyLDgxOTMsMzIsODE5NCwzMiw4MTk1LDMyLDgxOTYsMzIsODE5NywzMiw4MTk4LDMyLDgyMDAsMzIsODIwMSwzMiw4MjAyLDMyLDgyODcsMzIsODE5OSwzMiw4MjM5LDMyLDIwNDIsOTUsNjUxMDEsOTUsNjUxMDIsOTUsNjUxMDMsOTUsODIwOCw0NSw4MjA5LDQ1LDgyMTAsNDUsNjUxMTIsNDUsMTc0OCw0NSw4MjU5LDQ1LDcyNyw0NSw4NzIyLDQ1LDEwMTM0LDQ1LDExNDUwLDQ1LDE1NDksNDQsMTY0Myw0NCw4MjE4LDQ0LDE4NCw0NCw0MjIzMyw0NCw4OTQsNTksMjMwNyw1OCwyNjkxLDU4LDE0MTcsNTgsMTc5NSw1OCwxNzk2LDU4LDU4NjgsNTgsNjUwNzIsNTgsNjE0Nyw1OCw2MTUzLDU4LDgyODIsNTgsMTQ3NSw1OCw3NjAsNTgsNDI4ODksNTgsODc1OCw1OCw3MjAsNTgsNDIyMzcsNTgsNDUxLDMzLDExNjAxLDMzLDY2MCw2Myw1NzcsNjMsMjQyOSw2Myw1MDM4LDYzLDQyNzMxLDYzLDExOTE0OSw0Niw4MjI4LDQ2LDE3OTMsNDYsMTc5NCw0Niw0MjUxMCw0Niw2ODE3Niw0NiwxNjMyLDQ2LDE3NzYsNDYsNDIyMzIsNDYsMTM3Myw5Niw2NTI4Nyw5Niw4MjE5LDk2LDgyNDIsOTYsMTM3MCw5NiwxNTIzLDk2LDgxNzUsOTYsNjUzNDQsOTYsOTAwLDk2LDgxODksOTYsODEyNSw5Niw4MTI3LDk2LDgxOTAsOTYsNjk3LDk2LDg4NCw5Niw3MTIsOTYsNzE0LDk2LDcxNSw5Niw3NTYsOTYsNjk5LDk2LDcwMSw5Niw3MDAsOTYsNzAyLDk2LDQyODkyLDk2LDE0OTcsOTYsMjAzNiw5NiwyMDM3LDk2LDUxOTQsOTYsNTgzNiw5Niw5NDAzMyw5Niw5NDAzNCw5Niw2NTMzOSw0MCwxMDA4OCw0MCwxMDA5OCw0MCwxMjMwOCw0MCw2NDgzMCw0MCw2NTM0MSw0MSwxMDA4OSw0MSwxMDA5OSw0MSwxMjMwOSw0MSw2NDgzMSw0MSwxMDEwMCwxMjMsMTE5MDYwLDEyMywxMDEwMSwxMjUsODI3MCw0MiwxNjQ1LDQyLDg3MjcsNDIsNjYzMzUsNDIsNTk0MSw0Nyw4MjU3LDQ3LDg3MjUsNDcsODI2MCw0Nyw5NTg1LDQ3LDEwMTg3LDQ3LDEwNzQ0LDQ3LDExOTM1NCw0NywxMjc1NSw0NywxMjMzOSw0NywxMTQ2Miw0NywyMDAzMSw0NywxMjAzNSw0Nyw2NTM0MCw5Miw2NTEyOCw5Miw4NzI2LDkyLDEwMTg5LDkyLDEwNzQxLDkyLDEwNzQ1LDkyLDExOTMxMSw5MiwxMTkzNTUsOTIsMTI3NTYsOTIsMjAwMjIsOTIsMTIwMzQsOTIsNDI4NzIsMzgsNzA4LDk0LDcxMCw5NCw1ODY5LDQzLDEwMTMzLDQzLDY2MjAzLDQzLDgyNDksNjAsMTAwOTQsNjAsNzA2LDYwLDExOTM1MCw2MCw1MTc2LDYwLDU4MTAsNjAsNTEyMCw2MSwxMTg0MCw2MSwxMjQ0OCw2MSw0MjIzOSw2MSw4MjUwLDYyLDEwMDk1LDYyLDcwNyw2MiwxMTkzNTEsNjIsNTE3MSw2Miw5NDAxNSw2Miw4Mjc1LDEyNiw3MzIsMTI2LDgxMjgsMTI2LDg3NjQsMTI2LDEyMDc4NCw1MCwxMjA3OTQsNTAsMTIwODA0LDUwLDEyMDgxNCw1MCwxMjA4MjQsNTAsMTMwMDM0LDUwLDQyODQyLDUwLDQyMyw1MCwxMDAwLDUwLDQyNTY0LDUwLDUzMTEsNTAsNDI3MzUsNTAsMTE5MzAyLDUxLDEyMDc4NSw1MSwxMjA3OTUsNTEsMTIwODA1LDUxLDEyMDgxNSw1MSwxMjA4MjUsNTEsMTMwMDM1LDUxLDQyOTIzLDUxLDU0MCw1MSw0MzksNTEsNDI4NTgsNTEsMTE0NjgsNTEsMTI0OCw1MSw5NDAxMSw1MSw3MTg4Miw1MSwxMjA3ODYsNTIsMTIwNzk2LDUyLDEyMDgwNiw1MiwxMjA4MTYsNTIsMTIwODI2LDUyLDEzMDAzNiw1Miw1MDcwLDUyLDcxODU1LDUyLDEyMDc4Nyw1MywxMjA3OTcsNTMsMTIwODA3LDUzLDEyMDgxNyw1MywxMjA4MjcsNTMsMTMwMDM3LDUzLDQ0NCw1Myw3MTg2Nyw1MywxMjA3ODgsNTQsMTIwNzk4LDU0LDEyMDgwOCw1NCwxMjA4MTgsNTQsMTIwODI4LDU0LDEzMDAzOCw1NCwxMTQ3NCw1NCw1MTAyLDU0LDcxODkzLDU0LDExOTMxNCw1NSwxMjA3ODksNTUsMTIwNzk5LDU1LDEyMDgwOSw1NSwxMjA4MTksNTUsMTIwODI5LDU1LDEzMDAzOSw1NSw2Njc3MCw1NSw3MTg3OCw1NSwyODE5LDU2LDI1MzgsNTYsMjY2Niw1NiwxMjUxMzEsNTYsMTIwNzkwLDU2LDEyMDgwMCw1NiwxMjA4MTAsNTYsMTIwODIwLDU2LDEyMDgzMCw1NiwxMzAwNDAsNTYsNTQ3LDU2LDU0Niw1Niw2NjMzMCw1NiwyNjYzLDU3LDI5MjAsNTcsMjU0MSw1NywzNDM3LDU3LDEyMDc5MSw1NywxMjA4MDEsNTcsMTIwODExLDU3LDEyMDgyMSw1NywxMjA4MzEsNTcsMTMwMDQxLDU3LDQyODYyLDU3LDExNDY2LDU3LDcxODg0LDU3LDcxODUyLDU3LDcxODk0LDU3LDkwODIsOTcsNjUzNDUsOTcsMTE5ODM0LDk3LDExOTg4Niw5NywxMTk5MzgsOTcsMTE5OTkwLDk3LDEyMDA0Miw5NywxMjAwOTQsOTcsMTIwMTQ2LDk3LDEyMDE5OCw5NywxMjAyNTAsOTcsMTIwMzAyLDk3LDEyMDM1NCw5NywxMjA0MDYsOTcsMTIwNDU4LDk3LDU5Myw5Nyw5NDUsOTcsMTIwNTE0LDk3LDEyMDU3Miw5NywxMjA2MzAsOTcsMTIwNjg4LDk3LDEyMDc0Niw5Nyw2NTMxMyw2NSwxMTk4MDgsNjUsMTE5ODYwLDY1LDExOTkxMiw2NSwxMTk5NjQsNjUsMTIwMDE2LDY1LDEyMDA2OCw2NSwxMjAxMjAsNjUsMTIwMTcyLDY1LDEyMDIyNCw2NSwxMjAyNzYsNjUsMTIwMzI4LDY1LDEyMDM4MCw2NSwxMjA0MzIsNjUsOTEzLDY1LDEyMDQ4OCw2NSwxMjA1NDYsNjUsMTIwNjA0LDY1LDEyMDY2Miw2NSwxMjA3MjAsNjUsNTAzNCw2NSw1NTczLDY1LDQyMjIyLDY1LDk0MDE2LDY1LDY2MjA4LDY1LDExOTgzNSw5OCwxMTk4ODcsOTgsMTE5OTM5LDk4LDExOTk5MSw5OCwxMjAwNDMsOTgsMTIwMDk1LDk4LDEyMDE0Nyw5OCwxMjAxOTksOTgsMTIwMjUxLDk4LDEyMDMwMyw5OCwxMjAzNTUsOTgsMTIwNDA3LDk4LDEyMDQ1OSw5OCwzODgsOTgsNTA3MSw5OCw1MjM0LDk4LDU1NTEsOTgsNjUzMTQsNjYsODQ5Miw2NiwxMTk4MDksNjYsMTE5ODYxLDY2LDExOTkxMyw2NiwxMjAwMTcsNjYsMTIwMDY5LDY2LDEyMDEyMSw2NiwxMjAxNzMsNjYsMTIwMjI1LDY2LDEyMDI3Nyw2NiwxMjAzMjksNjYsMTIwMzgxLDY2LDEyMDQzMyw2Niw0MjkzMiw2Niw5MTQsNjYsMTIwNDg5LDY2LDEyMDU0Nyw2NiwxMjA2MDUsNjYsMTIwNjYzLDY2LDEyMDcyMSw2Niw1MTA4LDY2LDU2MjMsNjYsNDIxOTIsNjYsNjYxNzgsNjYsNjYyMDksNjYsNjYzMDUsNjYsNjUzNDcsOTksODU3Myw5OSwxMTk4MzYsOTksMTE5ODg4LDk5LDExOTk0MCw5OSwxMTk5OTIsOTksMTIwMDQ0LDk5LDEyMDA5Niw5OSwxMjAxNDgsOTksMTIwMjAwLDk5LDEyMDI1Miw5OSwxMjAzMDQsOTksMTIwMzU2LDk5LDEyMDQwOCw5OSwxMjA0NjAsOTksNzQyOCw5OSwxMDEwLDk5LDExNDI5LDk5LDQzOTUxLDk5LDY2NjIxLDk5LDEyODg0NCw2Nyw3MTkyMiw2Nyw3MTkxMyw2Nyw2NTMxNSw2Nyw4NTU3LDY3LDg0NTAsNjcsODQ5Myw2NywxMTk4MTAsNjcsMTE5ODYyLDY3LDExOTkxNCw2NywxMTk5NjYsNjcsMTIwMDE4LDY3LDEyMDE3NCw2NywxMjAyMjYsNjcsMTIwMjc4LDY3LDEyMDMzMCw2NywxMjAzODIsNjcsMTIwNDM0LDY3LDEwMTcsNjcsMTE0MjgsNjcsNTA4Nyw2Nyw0MjIwMiw2Nyw2NjIxMCw2Nyw2NjMwNiw2Nyw2NjU4MSw2Nyw2Njg0NCw2Nyw4NTc0LDEwMCw4NTE4LDEwMCwxMTk4MzcsMTAwLDExOTg4OSwxMDAsMTE5OTQxLDEwMCwxMTk5OTMsMTAwLDEyMDA0NSwxMDAsMTIwMDk3LDEwMCwxMjAxNDksMTAwLDEyMDIwMSwxMDAsMTIwMjUzLDEwMCwxMjAzMDUsMTAwLDEyMDM1NywxMDAsMTIwNDA5LDEwMCwxMjA0NjEsMTAwLDEyODEsMTAwLDUwOTUsMTAwLDUyMzEsMTAwLDQyMTk0LDEwMCw4NTU4LDY4LDg1MTcsNjgsMTE5ODExLDY4LDExOTg2Myw2OCwxMTk5MTUsNjgsMTE5OTY3LDY4LDEyMDAxOSw2OCwxMjAwNzEsNjgsMTIwMTIzLDY4LDEyMDE3NSw2OCwxMjAyMjcsNjgsMTIwMjc5LDY4LDEyMDMzMSw2OCwxMjAzODMsNjgsMTIwNDM1LDY4LDUwMjQsNjgsNTU5OCw2OCw1NjEwLDY4LDQyMTk1LDY4LDg0OTQsMTAxLDY1MzQ5LDEwMSw4NDk1LDEwMSw4NTE5LDEwMSwxMTk4MzgsMTAxLDExOTg5MCwxMDEsMTE5OTQyLDEwMSwxMjAwNDYsMTAxLDEyMDA5OCwxMDEsMTIwMTUwLDEwMSwxMjAyMDIsMTAxLDEyMDI1NCwxMDEsMTIwMzA2LDEwMSwxMjAzNTgsMTAxLDEyMDQxMCwxMDEsMTIwNDYyLDEwMSw0MzgyNiwxMDEsMTIxMywxMDEsODk1OSw2OSw2NTMxNyw2OSw4NDk2LDY5LDExOTgxMiw2OSwxMTk4NjQsNjksMTE5OTE2LDY5LDEyMDAyMCw2OSwxMjAwNzIsNjksMTIwMTI0LDY5LDEyMDE3Niw2OSwxMjAyMjgsNjksMTIwMjgwLDY5LDEyMDMzMiw2OSwxMjAzODQsNjksMTIwNDM2LDY5LDkxNyw2OSwxMjA0OTIsNjksMTIwNTUwLDY5LDEyMDYwOCw2OSwxMjA2NjYsNjksMTIwNzI0LDY5LDExNTc3LDY5LDUwMzYsNjksNDIyMjQsNjksNzE4NDYsNjksNzE4NTQsNjksNjYxODIsNjksMTE5ODM5LDEwMiwxMTk4OTEsMTAyLDExOTk0MywxMDIsMTE5OTk1LDEwMiwxMjAwNDcsMTAyLDEyMDA5OSwxMDIsMTIwMTUxLDEwMiwxMjAyMDMsMTAyLDEyMDI1NSwxMDIsMTIwMzA3LDEwMiwxMjAzNTksMTAyLDEyMDQxMSwxMDIsMTIwNDYzLDEwMiw0MzgyOSwxMDIsNDI5MDUsMTAyLDM4MywxMDIsNzgzNywxMDIsMTQxMiwxMDIsMTE5MzE1LDcwLDg0OTcsNzAsMTE5ODEzLDcwLDExOTg2NSw3MCwxMTk5MTcsNzAsMTIwMDIxLDcwLDEyMDA3Myw3MCwxMjAxMjUsNzAsMTIwMTc3LDcwLDEyMDIyOSw3MCwxMjAyODEsNzAsMTIwMzMzLDcwLDEyMDM4NSw3MCwxMjA0MzcsNzAsNDI5MDQsNzAsOTg4LDcwLDEyMDc3OCw3MCw1NTU2LDcwLDQyMjA1LDcwLDcxODc0LDcwLDcxODQyLDcwLDY2MTgzLDcwLDY2MjEzLDcwLDY2ODUzLDcwLDY1MzUxLDEwMyw4NDU4LDEwMywxMTk4NDAsMTAzLDExOTg5MiwxMDMsMTE5OTQ0LDEwMywxMjAwNDgsMTAzLDEyMDEwMCwxMDMsMTIwMTUyLDEwMywxMjAyMDQsMTAzLDEyMDI1NiwxMDMsMTIwMzA4LDEwMywxMjAzNjAsMTAzLDEyMDQxMiwxMDMsMTIwNDY0LDEwMyw2MDksMTAzLDc1NTUsMTAzLDM5NywxMDMsMTQwOSwxMDMsMTE5ODE0LDcxLDExOTg2Niw3MSwxMTk5MTgsNzEsMTE5OTcwLDcxLDEyMDAyMiw3MSwxMjAwNzQsNzEsMTIwMTI2LDcxLDEyMDE3OCw3MSwxMjAyMzAsNzEsMTIwMjgyLDcxLDEyMDMzNCw3MSwxMjAzODYsNzEsMTIwNDM4LDcxLDEyOTIsNzEsNTA1Niw3MSw1MTA3LDcxLDQyMTk4LDcxLDY1MzUyLDEwNCw4NDYyLDEwNCwxMTk4NDEsMTA0LDExOTk0NSwxMDQsMTE5OTk3LDEwNCwxMjAwNDksMTA0LDEyMDEwMSwxMDQsMTIwMTUzLDEwNCwxMjAyMDUsMTA0LDEyMDI1NywxMDQsMTIwMzA5LDEwNCwxMjAzNjEsMTA0LDEyMDQxMywxMDQsMTIwNDY1LDEwNCwxMjExLDEwNCwxMzkyLDEwNCw1MDU4LDEwNCw2NTMyMCw3Miw4NDU5LDcyLDg0NjAsNzIsODQ2MSw3MiwxMTk4MTUsNzIsMTE5ODY3LDcyLDExOTkxOSw3MiwxMjAwMjMsNzIsMTIwMTc5LDcyLDEyMDIzMSw3MiwxMjAyODMsNzIsMTIwMzM1LDcyLDEyMDM4Nyw3MiwxMjA0MzksNzIsOTE5LDcyLDEyMDQ5NCw3MiwxMjA1NTIsNzIsMTIwNjEwLDcyLDEyMDY2OCw3MiwxMjA3MjYsNzIsMTE0MDYsNzIsNTA1MSw3Miw1NTAwLDcyLDQyMjE1LDcyLDY2MjU1LDcyLDczMSwxMDUsOTA3NSwxMDUsNjUzNTMsMTA1LDg1NjAsMTA1LDg1MDUsMTA1LDg1MjAsMTA1LDExOTg0MiwxMDUsMTE5ODk0LDEwNSwxMTk5NDYsMTA1LDExOTk5OCwxMDUsMTIwMDUwLDEwNSwxMjAxMDIsMTA1LDEyMDE1NCwxMDUsMTIwMjA2LDEwNSwxMjAyNTgsMTA1LDEyMDMxMCwxMDUsMTIwMzYyLDEwNSwxMjA0MTQsMTA1LDEyMDQ2NiwxMDUsMTIwNDg0LDEwNSw2MTgsMTA1LDYxNywxMDUsOTUzLDEwNSw4MTI2LDEwNSw4OTAsMTA1LDEyMDUyMiwxMDUsMTIwNTgwLDEwNSwxMjA2MzgsMTA1LDEyMDY5NiwxMDUsMTIwNzU0LDEwNSwxMTEwLDEwNSw0MjU2NywxMDUsMTIzMSwxMDUsNDM4OTMsMTA1LDUwMjksMTA1LDcxODc1LDEwNSw2NTM1NCwxMDYsODUyMSwxMDYsMTE5ODQzLDEwNiwxMTk4OTUsMTA2LDExOTk0NywxMDYsMTE5OTk5LDEwNiwxMjAwNTEsMTA2LDEyMDEwMywxMDYsMTIwMTU1LDEwNiwxMjAyMDcsMTA2LDEyMDI1OSwxMDYsMTIwMzExLDEwNiwxMjAzNjMsMTA2LDEyMDQxNSwxMDYsMTIwNDY3LDEwNiwxMDExLDEwNiwxMTEyLDEwNiw2NTMyMiw3NCwxMTk4MTcsNzQsMTE5ODY5LDc0LDExOTkyMSw3NCwxMTk5NzMsNzQsMTIwMDI1LDc0LDEyMDA3Nyw3NCwxMjAxMjksNzQsMTIwMTgxLDc0LDEyMDIzMyw3NCwxMjAyODUsNzQsMTIwMzM3LDc0LDEyMDM4OSw3NCwxMjA0NDEsNzQsNDI5MzAsNzQsODk1LDc0LDEwMzIsNzQsNTAzNSw3NCw1MjYxLDc0LDQyMjAxLDc0LDExOTg0NCwxMDcsMTE5ODk2LDEwNywxMTk5NDgsMTA3LDEyMDAwMCwxMDcsMTIwMDUyLDEwNywxMjAxMDQsMTA3LDEyMDE1NiwxMDcsMTIwMjA4LDEwNywxMjAyNjAsMTA3LDEyMDMxMiwxMDcsMTIwMzY0LDEwNywxMjA0MTYsMTA3LDEyMDQ2OCwxMDcsODQ5MCw3NSw2NTMyMyw3NSwxMTk4MTgsNzUsMTE5ODcwLDc1LDExOTkyMiw3NSwxMTk5NzQsNzUsMTIwMDI2LDc1LDEyMDA3OCw3NSwxMjAxMzAsNzUsMTIwMTgyLDc1LDEyMDIzNCw3NSwxMjAyODYsNzUsMTIwMzM4LDc1LDEyMDM5MCw3NSwxMjA0NDIsNzUsOTIyLDc1LDEyMDQ5Nyw3NSwxMjA1NTUsNzUsMTIwNjEzLDc1LDEyMDY3MSw3NSwxMjA3MjksNzUsMTE0MTIsNzUsNTA5NCw3NSw1ODQ1LDc1LDQyMTk5LDc1LDY2ODQwLDc1LDE0NzIsMTI0LDg3MzksMTI0LDkyMTMsMTI0LDY1NTEyLDEyNCwxNjMzLDEyNCwxNzc3LDEyNCw2NjMzNiwxMjQsMTI1MTI3LDEyNCwxMjA3ODMsMTI0LDEyMDc5MywxMjQsMTIwODAzLDEyNCwxMjA4MTMsMTI0LDEyMDgyMywxMjQsMTMwMDMzLDEyNCw2NTMyMSwxMjQsODU0NCwxMjQsODQ2NCwxMjQsODQ2NSwxMjQsMTE5ODE2LDEyNCwxMTk4NjgsMTI0LDExOTkyMCwxMjQsMTIwMDI0LDEyNCwxMjAxMjgsMTI0LDEyMDE4MCwxMjQsMTIwMjMyLDEyNCwxMjAyODQsMTI0LDEyMDMzNiwxMjQsMTIwMzg4LDEyNCwxMjA0NDAsMTI0LDQwNiwxMjQsNjUzNTYsMTI0LDg1NzIsMTI0LDg0NjcsMTI0LDExOTg0NSwxMjQsMTE5ODk3LDEyNCwxMTk5NDksMTI0LDEyMDAwMSwxMjQsMTIwMDUzLDEyNCwxMjAxMDUsMTI0LDEyMDE1NywxMjQsMTIwMjA5LDEyNCwxMjAyNjEsMTI0LDEyMDMxMywxMjQsMTIwMzY1LDEyNCwxMjA0MTcsMTI0LDEyMDQ2OSwxMjQsNDQ4LDEyNCwxMjA0OTYsMTI0LDEyMDU1NCwxMjQsMTIwNjEyLDEyNCwxMjA2NzAsMTI0LDEyMDcyOCwxMjQsMTE0MTAsMTI0LDEwMzAsMTI0LDEyMTYsMTI0LDE0OTMsMTI0LDE1MDMsMTI0LDE1NzUsMTI0LDEyNjQ2NCwxMjQsMTI2NTkyLDEyNCw2NTE2NiwxMjQsNjUxNjUsMTI0LDE5OTQsMTI0LDExNTk5LDEyNCw1ODI1LDEyNCw0MjIyNiwxMjQsOTM5OTIsMTI0LDY2MTg2LDEyNCw2NjMxMywxMjQsMTE5MzM4LDc2LDg1NTYsNzYsODQ2Niw3NiwxMTk4MTksNzYsMTE5ODcxLDc2LDExOTkyMyw3NiwxMjAwMjcsNzYsMTIwMDc5LDc2LDEyMDEzMSw3NiwxMjAxODMsNzYsMTIwMjM1LDc2LDEyMDI4Nyw3NiwxMjAzMzksNzYsMTIwMzkxLDc2LDEyMDQ0Myw3NiwxMTQ3Miw3Niw1MDg2LDc2LDUyOTAsNzYsNDIyMDksNzYsOTM5NzQsNzYsNzE4NDMsNzYsNzE4NTgsNzYsNjY1ODcsNzYsNjY4NTQsNzYsNjUzMjUsNzcsODU1OSw3Nyw4NDk5LDc3LDExOTgyMCw3NywxMTk4NzIsNzcsMTE5OTI0LDc3LDEyMDAyOCw3NywxMjAwODAsNzcsMTIwMTMyLDc3LDEyMDE4NCw3NywxMjAyMzYsNzcsMTIwMjg4LDc3LDEyMDM0MCw3NywxMjAzOTIsNzcsMTIwNDQ0LDc3LDkyNCw3NywxMjA0OTksNzcsMTIwNTU3LDc3LDEyMDYxNSw3NywxMjA2NzMsNzcsMTIwNzMxLDc3LDEwMTgsNzcsMTE0MTYsNzcsNTA0Nyw3Nyw1NjE2LDc3LDU4NDYsNzcsNDIyMDcsNzcsNjYyMjQsNzcsNjYzMjEsNzcsMTE5ODQ3LDExMCwxMTk4OTksMTEwLDExOTk1MSwxMTAsMTIwMDAzLDExMCwxMjAwNTUsMTEwLDEyMDEwNywxMTAsMTIwMTU5LDExMCwxMjAyMTEsMTEwLDEyMDI2MywxMTAsMTIwMzE1LDExMCwxMjAzNjcsMTEwLDEyMDQxOSwxMTAsMTIwNDcxLDExMCwxNDAwLDExMCwxNDA0LDExMCw2NTMyNiw3OCw4NDY5LDc4LDExOTgyMSw3OCwxMTk4NzMsNzgsMTE5OTI1LDc4LDExOTk3Nyw3OCwxMjAwMjksNzgsMTIwMDgxLDc4LDEyMDE4NSw3OCwxMjAyMzcsNzgsMTIwMjg5LDc4LDEyMDM0MSw3OCwxMjAzOTMsNzgsMTIwNDQ1LDc4LDkyNSw3OCwxMjA1MDAsNzgsMTIwNTU4LDc4LDEyMDYxNiw3OCwxMjA2NzQsNzgsMTIwNzMyLDc4LDExNDE4LDc4LDQyMjA4LDc4LDY2ODM1LDc4LDMwNzQsMTExLDMyMDIsMTExLDMzMzAsMTExLDM0NTgsMTExLDI0MDYsMTExLDI2NjIsMTExLDI3OTAsMTExLDMwNDYsMTExLDMxNzQsMTExLDMzMDIsMTExLDM0MzAsMTExLDM2NjQsMTExLDM3OTIsMTExLDQxNjAsMTExLDE2MzcsMTExLDE3ODEsMTExLDY1MzU5LDExMSw4NTAwLDExMSwxMTk4NDgsMTExLDExOTkwMCwxMTEsMTE5OTUyLDExMSwxMjAwNTYsMTExLDEyMDEwOCwxMTEsMTIwMTYwLDExMSwxMjAyMTIsMTExLDEyMDI2NCwxMTEsMTIwMzE2LDExMSwxMjAzNjgsMTExLDEyMDQyMCwxMTEsMTIwNDcyLDExMSw3NDM5LDExMSw3NDQxLDExMSw0MzgzNywxMTEsOTU5LDExMSwxMjA1MjgsMTExLDEyMDU4NiwxMTEsMTIwNjQ0LDExMSwxMjA3MDIsMTExLDEyMDc2MCwxMTEsOTYzLDExMSwxMjA1MzIsMTExLDEyMDU5MCwxMTEsMTIwNjQ4LDExMSwxMjA3MDYsMTExLDEyMDc2NCwxMTEsMTE0MjMsMTExLDQzNTEsMTExLDE0MTMsMTExLDE1MDUsMTExLDE2MDcsMTExLDEyNjUwMCwxMTEsMTI2NTY0LDExMSwxMjY1OTYsMTExLDY1MjU5LDExMSw2NTI2MCwxMTEsNjUyNTgsMTExLDY1MjU3LDExMSwxNzI2LDExMSw2NDQyOCwxMTEsNjQ0MjksMTExLDY0NDI3LDExMSw2NDQyNiwxMTEsMTcyOSwxMTEsNjQ0MjQsMTExLDY0NDI1LDExMSw2NDQyMywxMTEsNjQ0MjIsMTExLDE3NDksMTExLDMzNjAsMTExLDQxMjUsMTExLDY2Nzk0LDExMSw3MTg4MCwxMTEsNzE4OTUsMTExLDY2NjA0LDExMSwxOTg0LDc5LDI1MzQsNzksMjkxOCw3OSwxMjI5NSw3OSw3MDg2NCw3OSw3MTkwNCw3OSwxMjA3ODIsNzksMTIwNzkyLDc5LDEyMDgwMiw3OSwxMjA4MTIsNzksMTIwODIyLDc5LDEzMDAzMiw3OSw2NTMyNyw3OSwxMTk4MjIsNzksMTE5ODc0LDc5LDExOTkyNiw3OSwxMTk5NzgsNzksMTIwMDMwLDc5LDEyMDA4Miw3OSwxMjAxMzQsNzksMTIwMTg2LDc5LDEyMDIzOCw3OSwxMjAyOTAsNzksMTIwMzQyLDc5LDEyMDM5NCw3OSwxMjA0NDYsNzksOTI3LDc5LDEyMDUwMiw3OSwxMjA1NjAsNzksMTIwNjE4LDc5LDEyMDY3Niw3OSwxMjA3MzQsNzksMTE0MjIsNzksMTM2NSw3OSwxMTYwNCw3OSw0ODE2LDc5LDI4NDgsNzksNjY3NTQsNzksNDIyMjcsNzksNzE4NjEsNzksNjYxOTQsNzksNjYyMTksNzksNjY1NjQsNzksNjY4MzgsNzksOTA3NiwxMTIsNjUzNjAsMTEyLDExOTg0OSwxMTIsMTE5OTAxLDExMiwxMTk5NTMsMTEyLDEyMDAwNSwxMTIsMTIwMDU3LDExMiwxMjAxMDksMTEyLDEyMDE2MSwxMTIsMTIwMjEzLDExMiwxMjAyNjUsMTEyLDEyMDMxNywxMTIsMTIwMzY5LDExMiwxMjA0MjEsMTEyLDEyMDQ3MywxMTIsOTYxLDExMiwxMjA1MzAsMTEyLDEyMDU0NCwxMTIsMTIwNTg4LDExMiwxMjA2MDIsMTEyLDEyMDY0NiwxMTIsMTIwNjYwLDExMiwxMjA3MDQsMTEyLDEyMDcxOCwxMTIsMTIwNzYyLDExMiwxMjA3NzYsMTEyLDExNDI3LDExMiw2NTMyOCw4MCw4NDczLDgwLDExOTgyMyw4MCwxMTk4NzUsODAsMTE5OTI3LDgwLDExOTk3OSw4MCwxMjAwMzEsODAsMTIwMDgzLDgwLDEyMDE4Nyw4MCwxMjAyMzksODAsMTIwMjkxLDgwLDEyMDM0Myw4MCwxMjAzOTUsODAsMTIwNDQ3LDgwLDkyOSw4MCwxMjA1MDQsODAsMTIwNTYyLDgwLDEyMDYyMCw4MCwxMjA2NzgsODAsMTIwNzM2LDgwLDExNDI2LDgwLDUwOTAsODAsNTIyOSw4MCw0MjE5Myw4MCw2NjE5Nyw4MCwxMTk4NTAsMTEzLDExOTkwMiwxMTMsMTE5OTU0LDExMywxMjAwMDYsMTEzLDEyMDA1OCwxMTMsMTIwMTEwLDExMywxMjAxNjIsMTEzLDEyMDIxNCwxMTMsMTIwMjY2LDExMywxMjAzMTgsMTEzLDEyMDM3MCwxMTMsMTIwNDIyLDExMywxMjA0NzQsMTEzLDEzMDcsMTEzLDEzNzksMTEzLDEzODIsMTEzLDg0NzQsODEsMTE5ODI0LDgxLDExOTg3Niw4MSwxMTk5MjgsODEsMTE5OTgwLDgxLDEyMDAzMiw4MSwxMjAwODQsODEsMTIwMTg4LDgxLDEyMDI0MCw4MSwxMjAyOTIsODEsMTIwMzQ0LDgxLDEyMDM5Niw4MSwxMjA0NDgsODEsMTE2MDUsODEsMTE5ODUxLDExNCwxMTk5MDMsMTE0LDExOTk1NSwxMTQsMTIwMDA3LDExNCwxMjAwNTksMTE0LDEyMDExMSwxMTQsMTIwMTYzLDExNCwxMjAyMTUsMTE0LDEyMDI2NywxMTQsMTIwMzE5LDExNCwxMjAzNzEsMTE0LDEyMDQyMywxMTQsMTIwNDc1LDExNCw0Mzg0NywxMTQsNDM4NDgsMTE0LDc0NjIsMTE0LDExMzk3LDExNCw0MzkwNSwxMTQsMTE5MzE4LDgyLDg0NzUsODIsODQ3Niw4Miw4NDc3LDgyLDExOTgyNSw4MiwxMTk4NzcsODIsMTE5OTI5LDgyLDEyMDAzMyw4MiwxMjAxODksODIsMTIwMjQxLDgyLDEyMDI5Myw4MiwxMjAzNDUsODIsMTIwMzk3LDgyLDEyMDQ0OSw4Miw0MjIsODIsNTAyNSw4Miw1MDc0LDgyLDY2NzQwLDgyLDU1MTEsODIsNDIyMTEsODIsOTQwMDUsODIsNjUzNjMsMTE1LDExOTg1MiwxMTUsMTE5OTA0LDExNSwxMTk5NTYsMTE1LDEyMDAwOCwxMTUsMTIwMDYwLDExNSwxMjAxMTIsMTE1LDEyMDE2NCwxMTUsMTIwMjE2LDExNSwxMjAyNjgsMTE1LDEyMDMyMCwxMTUsMTIwMzcyLDExNSwxMjA0MjQsMTE1LDEyMDQ3NiwxMTUsNDI4MDEsMTE1LDQ0NSwxMTUsMTEwOSwxMTUsNDM5NDYsMTE1LDcxODczLDExNSw2NjYzMiwxMTUsNjUzMzEsODMsMTE5ODI2LDgzLDExOTg3OCw4MywxMTk5MzAsODMsMTE5OTgyLDgzLDEyMDAzNCw4MywxMjAwODYsODMsMTIwMTM4LDgzLDEyMDE5MCw4MywxMjAyNDIsODMsMTIwMjk0LDgzLDEyMDM0Niw4MywxMjAzOTgsODMsMTIwNDUwLDgzLDEwMjksODMsMTM1OSw4Myw1MDc3LDgzLDUwODIsODMsNDIyMTAsODMsOTQwMTAsODMsNjYxOTgsODMsNjY1OTIsODMsMTE5ODUzLDExNiwxMTk5MDUsMTE2LDExOTk1NywxMTYsMTIwMDA5LDExNiwxMjAwNjEsMTE2LDEyMDExMywxMTYsMTIwMTY1LDExNiwxMjAyMTcsMTE2LDEyMDI2OSwxMTYsMTIwMzIxLDExNiwxMjAzNzMsMTE2LDEyMDQyNSwxMTYsMTIwNDc3LDExNiw4ODY4LDg0LDEwMjAxLDg0LDEyODg3Miw4NCw2NTMzMiw4NCwxMTk4MjcsODQsMTE5ODc5LDg0LDExOTkzMSw4NCwxMTk5ODMsODQsMTIwMDM1LDg0LDEyMDA4Nyw4NCwxMjAxMzksODQsMTIwMTkxLDg0LDEyMDI0Myw4NCwxMjAyOTUsODQsMTIwMzQ3LDg0LDEyMDM5OSw4NCwxMjA0NTEsODQsOTMyLDg0LDEyMDUwNyw4NCwxMjA1NjUsODQsMTIwNjIzLDg0LDEyMDY4MSw4NCwxMjA3MzksODQsMTE0MzAsODQsNTAyNiw4NCw0MjE5Niw4NCw5Mzk2Miw4NCw3MTg2OCw4NCw2NjE5OSw4NCw2NjIyNSw4NCw2NjMyNSw4NCwxMTk4NTQsMTE3LDExOTkwNiwxMTcsMTE5OTU4LDExNywxMjAwMTAsMTE3LDEyMDA2MiwxMTcsMTIwMTE0LDExNywxMjAxNjYsMTE3LDEyMDIxOCwxMTcsMTIwMjcwLDExNywxMjAzMjIsMTE3LDEyMDM3NCwxMTcsMTIwNDI2LDExNywxMjA0NzgsMTE3LDQyOTExLDExNyw3NDUyLDExNyw0Mzg1NCwxMTcsNDM4NTgsMTE3LDY1MSwxMTcsOTY1LDExNywxMjA1MzQsMTE3LDEyMDU5MiwxMTcsMTIwNjUwLDExNywxMjA3MDgsMTE3LDEyMDc2NiwxMTcsMTQwNSwxMTcsNjY4MDYsMTE3LDcxODk2LDExNyw4NzQ2LDg1LDg4OTksODUsMTE5ODI4LDg1LDExOTg4MCw4NSwxMTk5MzIsODUsMTE5OTg0LDg1LDEyMDAzNiw4NSwxMjAwODgsODUsMTIwMTQwLDg1LDEyMDE5Miw4NSwxMjAyNDQsODUsMTIwMjk2LDg1LDEyMDM0OCw4NSwxMjA0MDAsODUsMTIwNDUyLDg1LDEzNTcsODUsNDYwOCw4NSw2Njc2Niw4NSw1MTk2LDg1LDQyMjI4LDg1LDk0MDE4LDg1LDcxODY0LDg1LDg3NDQsMTE4LDg4OTcsMTE4LDY1MzY2LDExOCw4NTY0LDExOCwxMTk4NTUsMTE4LDExOTkwNywxMTgsMTE5OTU5LDExOCwxMjAwMTEsMTE4LDEyMDA2MywxMTgsMTIwMTE1LDExOCwxMjAxNjcsMTE4LDEyMDIxOSwxMTgsMTIwMjcxLDExOCwxMjAzMjMsMTE4LDEyMDM3NSwxMTgsMTIwNDI3LDExOCwxMjA0NzksMTE4LDc0NTYsMTE4LDk1NywxMTgsMTIwNTI2LDExOCwxMjA1ODQsMTE4LDEyMDY0MiwxMTgsMTIwNzAwLDExOCwxMjA3NTgsMTE4LDExNDEsMTE4LDE0OTYsMTE4LDcxNDMwLDExOCw0Mzk0NSwxMTgsNzE4NzIsMTE4LDExOTMwOSw4NiwxNjM5LDg2LDE3ODMsODYsODU0OCw4NiwxMTk4MjksODYsMTE5ODgxLDg2LDExOTkzMyw4NiwxMTk5ODUsODYsMTIwMDM3LDg2LDEyMDA4OSw4NiwxMjAxNDEsODYsMTIwMTkzLDg2LDEyMDI0NSw4NiwxMjAyOTcsODYsMTIwMzQ5LDg2LDEyMDQwMSw4NiwxMjA0NTMsODYsMTE0MCw4NiwxMTU3Niw4Niw1MDgxLDg2LDUxNjcsODYsNDI3MTksODYsNDIyMTQsODYsOTM5NjAsODYsNzE4NDAsODYsNjY4NDUsODYsNjIzLDExOSwxMTk4NTYsMTE5LDExOTkwOCwxMTksMTE5OTYwLDExOSwxMjAwMTIsMTE5LDEyMDA2NCwxMTksMTIwMTE2LDExOSwxMjAxNjgsMTE5LDEyMDIyMCwxMTksMTIwMjcyLDExOSwxMjAzMjQsMTE5LDEyMDM3NiwxMTksMTIwNDI4LDExOSwxMjA0ODAsMTE5LDc0NTcsMTE5LDExMjEsMTE5LDEzMDksMTE5LDEzNzcsMTE5LDcxNDM0LDExOSw3MTQzOCwxMTksNzE0MzksMTE5LDQzOTA3LDExOSw3MTkxOSw4Nyw3MTkxMCw4NywxMTk4MzAsODcsMTE5ODgyLDg3LDExOTkzNCw4NywxMTk5ODYsODcsMTIwMDM4LDg3LDEyMDA5MCw4NywxMjAxNDIsODcsMTIwMTk0LDg3LDEyMDI0Niw4NywxMjAyOTgsODcsMTIwMzUwLDg3LDEyMDQwMiw4NywxMjA0NTQsODcsMTMwOCw4Nyw1MDQzLDg3LDUwNzYsODcsNDIyMTgsODcsNTc0MiwxMjAsMTA1MzksMTIwLDEwNTQwLDEyMCwxMDc5OSwxMjAsNjUzNjgsMTIwLDg1NjksMTIwLDExOTg1NywxMjAsMTE5OTA5LDEyMCwxMTk5NjEsMTIwLDEyMDAxMywxMjAsMTIwMDY1LDEyMCwxMjAxMTcsMTIwLDEyMDE2OSwxMjAsMTIwMjIxLDEyMCwxMjAyNzMsMTIwLDEyMDMyNSwxMjAsMTIwMzc3LDEyMCwxMjA0MjksMTIwLDEyMDQ4MSwxMjAsNTQ0MSwxMjAsNTUwMSwxMjAsNTc0MSw4OCw5NTg3LDg4LDY2MzM4LDg4LDcxOTE2LDg4LDY1MzM2LDg4LDg1NTMsODgsMTE5ODMxLDg4LDExOTg4Myw4OCwxMTk5MzUsODgsMTE5OTg3LDg4LDEyMDAzOSw4OCwxMjAwOTEsODgsMTIwMTQzLDg4LDEyMDE5NSw4OCwxMjAyNDcsODgsMTIwMjk5LDg4LDEyMDM1MSw4OCwxMjA0MDMsODgsMTIwNDU1LDg4LDQyOTMxLDg4LDkzNSw4OCwxMjA1MTAsODgsMTIwNTY4LDg4LDEyMDYyNiw4OCwxMjA2ODQsODgsMTIwNzQyLDg4LDExNDM2LDg4LDExNjEzLDg4LDU4MTUsODgsNDIyMTksODgsNjYxOTIsODgsNjYyMjgsODgsNjYzMjcsODgsNjY4NTUsODgsNjExLDEyMSw3NTY0LDEyMSw2NTM2OSwxMjEsMTE5ODU4LDEyMSwxMTk5MTAsMTIxLDExOTk2MiwxMjEsMTIwMDE0LDEyMSwxMjAwNjYsMTIxLDEyMDExOCwxMjEsMTIwMTcwLDEyMSwxMjAyMjIsMTIxLDEyMDI3NCwxMjEsMTIwMzI2LDEyMSwxMjAzNzgsMTIxLDEyMDQzMCwxMjEsMTIwNDgyLDEyMSw2NTUsMTIxLDc5MzUsMTIxLDQzODY2LDEyMSw5NDcsMTIxLDg1MDksMTIxLDEyMDUxNiwxMjEsMTIwNTc0LDEyMSwxMjA2MzIsMTIxLDEyMDY5MCwxMjEsMTIwNzQ4LDEyMSwxMTk5LDEyMSw0MzI3LDEyMSw3MTkwMCwxMjEsNjUzMzcsODksMTE5ODMyLDg5LDExOTg4NCw4OSwxMTk5MzYsODksMTE5OTg4LDg5LDEyMDA0MCw4OSwxMjAwOTIsODksMTIwMTQ0LDg5LDEyMDE5Niw4OSwxMjAyNDgsODksMTIwMzAwLDg5LDEyMDM1Miw4OSwxMjA0MDQsODksMTIwNDU2LDg5LDkzMyw4OSw5NzgsODksMTIwNTA4LDg5LDEyMDU2Niw4OSwxMjA2MjQsODksMTIwNjgyLDg5LDEyMDc0MCw4OSwxMTQzMiw4OSwxMTk4LDg5LDUwMzMsODksNTA1Myw4OSw0MjIyMCw4OSw5NDAxOSw4OSw3MTg0NCw4OSw2NjIyNiw4OSwxMTk4NTksMTIyLDExOTkxMSwxMjIsMTE5OTYzLDEyMiwxMjAwMTUsMTIyLDEyMDA2NywxMjIsMTIwMTE5LDEyMiwxMjAxNzEsMTIyLDEyMDIyMywxMjIsMTIwMjc1LDEyMiwxMjAzMjcsMTIyLDEyMDM3OSwxMjIsMTIwNDMxLDEyMiwxMjA0ODMsMTIyLDc0NTgsMTIyLDQzOTIzLDEyMiw3MTg3NiwxMjIsNjYyOTMsOTAsNzE5MDksOTAsNjUzMzgsOTAsODQ4NCw5MCw4NDg4LDkwLDExOTgzMyw5MCwxMTk4ODUsOTAsMTE5OTM3LDkwLDExOTk4OSw5MCwxMjAwNDEsOTAsMTIwMTk3LDkwLDEyMDI0OSw5MCwxMjAzMDEsOTAsMTIwMzUzLDkwLDEyMDQwNSw5MCwxMjA0NTcsOTAsOTE4LDkwLDEyMDQ5Myw5MCwxMjA1NTEsOTAsMTIwNjA5LDkwLDEyMDY2Nyw5MCwxMjA3MjUsOTAsNTA1OSw5MCw0MjIwNCw5MCw3MTg0OSw5MF0sIl9kZWZhdWx0IjpbMTYwLDMyLDgyMTEsNDUsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV0sImNzIjpbNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLCJkZSI6WzY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSwiZXMiOls4MjExLDQ1LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLCJmciI6WzY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODI0NSw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLCJpdCI6WzE2MCwzMiw4MjExLDQ1LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSwiamEiOls4MjExLDQ1LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLCJrbyI6WzgyMTEsNDUsNjUzMDYsNTgsNjUyODEsMzMsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSwicGwiOls2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSwicHQtQlIiOls2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSwicXBzLXBsb2MiOlsxNjAsMzIsODIxMSw0NSw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSwicnUiOls2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMzA1LDEwNSw5MjEsMTI0LDEwMDksMTEyLDIxNSwxMjBdLCJ0ciI6WzE2MCwzMiw4MjExLDQ1LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMTA1MCw3NSw5MjEsMTI0LDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODldLCJ6aC1oYW5zIjpbNjUzMDYsNTgsNjUyODEsMzMsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDEyNCwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5XSwiemgtaGFudCI6WzgyMTEsNDUsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSwxMjQsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OV19Jyl9c3RhdGljIGdldENvbmZ1c2FibGVzRm9yQ3VycmVudExvY2FsZSgpe2lmKCFqLm1hcCl7dmFyIHQscixuPWouZ2V0RGF0YSgpO2xldCBlPUw7ZnVuY3Rpb24gaSh0KXtjb25zdCByPW5ldyBNYXA7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKz0yKXIuc2V0KHRbZV0sdFtlKzFdKTtyZXR1cm4gcn1lJiZlIGluIG58fChlPU4pLGUmJmUgaW4gbnx8KGU9Il9kZWZhdWx0Iik7Y29uc3Qgbz1pKG4uX2NvbW1vbik7Zm9yKFt0LHJdb2YgaShuW2VdKSlvLnNldCh0LHIpO2oubWFwPW99cmV0dXJuIGoubWFwfXN0YXRpYyBpc0FtYmlndW91cyhlKXtyZXR1cm4gai5nZXRDb25mdXNhYmxlc0ZvckN1cnJlbnRMb2NhbGUoKS5oYXMoZSl9c3RhdGljIGdldFByaW1hcnlDb25mdXNhYmxlKGUpe3JldHVybiBqLmdldENvbmZ1c2FibGVzRm9yQ3VycmVudExvY2FsZSgpLmdldChlKX1zdGF0aWMgZ2V0UHJpbWFyeUNvbmZ1c2FibGVDb2RlUG9pbnRzKCl7cmV0dXJuIG5ldyBTZXQoai5nZXRDb25mdXNhYmxlc0ZvckN1cnJlbnRMb2NhbGUoKS5rZXlzKCkpfX1jbGFzcyBVe3N0YXRpYyBnZXRSYXdEYXRhKCl7cmV0dXJuIEpTT04ucGFyc2UoIls5LDEwLDExLDEyLDEzLDMyLDEyNywxNjAsMTczLDg0NywxNTY0LDQ0NDcsNDQ0OCw2MDY4LDYwNjksNjE1NSw2MTU2LDYxNTcsNjE1OCw3MzU1LDczNTYsODE5Miw4MTkzLDgxOTQsODE5NSw4MTk2LDgxOTcsODE5OCw4MTk5LDgyMDAsODIwMSw4MjAyLDgyMDMsODIwNCw4MjA1LDgyMDYsODIwNyw4MjM0LDgyMzUsODIzNiw4MjM3LDgyMzgsODIzOSw4Mjg3LDgyODgsODI4OSw4MjkwLDgyOTEsODI5Miw4MjkzLDgyOTQsODI5NSw4Mjk2LDgyOTcsODI5OCw4Mjk5LDgzMDAsODMwMSw4MzAyLDgzMDMsMTAyNDAsMTIyODgsMTI2NDQsNjUwMjQsNjUwMjUsNjUwMjYsNjUwMjcsNjUwMjgsNjUwMjksNjUwMzAsNjUwMzEsNjUwMzIsNjUwMzMsNjUwMzQsNjUwMzUsNjUwMzYsNjUwMzcsNjUwMzgsNjUwMzksNjUyNzksNjU0NDAsNjU1MjAsNjU1MjEsNjU1MjIsNjU1MjMsNjU1MjQsNjU1MjUsNjU1MjYsNjU1MjcsNjU1MjgsNjU1MzIsNzg4NDQsMTE5MTU1LDExOTE1NiwxMTkxNTcsMTE5MTU4LDExOTE1OSwxMTkxNjAsMTE5MTYxLDExOTE2Miw5MTc1MDQsOTE3NTA1LDkxNzUwNiw5MTc1MDcsOTE3NTA4LDkxNzUwOSw5MTc1MTAsOTE3NTExLDkxNzUxMiw5MTc1MTMsOTE3NTE0LDkxNzUxNSw5MTc1MTYsOTE3NTE3LDkxNzUxOCw5MTc1MTksOTE3NTIwLDkxNzUyMSw5MTc1MjIsOTE3NTIzLDkxNzUyNCw5MTc1MjUsOTE3NTI2LDkxNzUyNyw5MTc1MjgsOTE3NTI5LDkxNzUzMCw5MTc1MzEsOTE3NTMyLDkxNzUzMyw5MTc1MzQsOTE3NTM1LDkxNzUzNiw5MTc1MzcsOTE3NTM4LDkxNzUzOSw5MTc1NDAsOTE3NTQxLDkxNzU0Miw5MTc1NDMsOTE3NTQ0LDkxNzU0NSw5MTc1NDYsOTE3NTQ3LDkxNzU0OCw5MTc1NDksOTE3NTUwLDkxNzU1MSw5MTc1NTIsOTE3NTUzLDkxNzU1NCw5MTc1NTUsOTE3NTU2LDkxNzU1Nyw5MTc1NTgsOTE3NTU5LDkxNzU2MCw5MTc1NjEsOTE3NTYyLDkxNzU2Myw5MTc1NjQsOTE3NTY1LDkxNzU2Niw5MTc1NjcsOTE3NTY4LDkxNzU2OSw5MTc1NzAsOTE3NTcxLDkxNzU3Miw5MTc1NzMsOTE3NTc0LDkxNzU3NSw5MTc1NzYsOTE3NTc3LDkxNzU3OCw5MTc1NzksOTE3NTgwLDkxNzU4MSw5MTc1ODIsOTE3NTgzLDkxNzU4NCw5MTc1ODUsOTE3NTg2LDkxNzU4Nyw5MTc1ODgsOTE3NTg5LDkxNzU5MCw5MTc1OTEsOTE3NTkyLDkxNzU5Myw5MTc1OTQsOTE3NTk1LDkxNzU5Niw5MTc1OTcsOTE3NTk4LDkxNzU5OSw5MTc2MDAsOTE3NjAxLDkxNzYwMiw5MTc2MDMsOTE3NjA0LDkxNzYwNSw5MTc2MDYsOTE3NjA3LDkxNzYwOCw5MTc2MDksOTE3NjEwLDkxNzYxMSw5MTc2MTIsOTE3NjEzLDkxNzYxNCw5MTc2MTUsOTE3NjE2LDkxNzYxNyw5MTc2MTgsOTE3NjE5LDkxNzYyMCw5MTc2MjEsOTE3NjIyLDkxNzYyMyw5MTc2MjQsOTE3NjI1LDkxNzYyNiw5MTc2MjcsOTE3NjI4LDkxNzYyOSw5MTc2MzAsOTE3NjMxLDkxNzc2MCw5MTc3NjEsOTE3NzYyLDkxNzc2Myw5MTc3NjQsOTE3NzY1LDkxNzc2Niw5MTc3NjcsOTE3NzY4LDkxNzc2OSw5MTc3NzAsOTE3NzcxLDkxNzc3Miw5MTc3NzMsOTE3Nzc0LDkxNzc3NSw5MTc3NzYsOTE3Nzc3LDkxNzc3OCw5MTc3NzksOTE3NzgwLDkxNzc4MSw5MTc3ODIsOTE3NzgzLDkxNzc4NCw5MTc3ODUsOTE3Nzg2LDkxNzc4Nyw5MTc3ODgsOTE3Nzg5LDkxNzc5MCw5MTc3OTEsOTE3NzkyLDkxNzc5Myw5MTc3OTQsOTE3Nzk1LDkxNzc5Niw5MTc3OTcsOTE3Nzk4LDkxNzc5OSw5MTc4MDAsOTE3ODAxLDkxNzgwMiw5MTc4MDMsOTE3ODA0LDkxNzgwNSw5MTc4MDYsOTE3ODA3LDkxNzgwOCw5MTc4MDksOTE3ODEwLDkxNzgxMSw5MTc4MTIsOTE3ODEzLDkxNzgxNCw5MTc4MTUsOTE3ODE2LDkxNzgxNyw5MTc4MTgsOTE3ODE5LDkxNzgyMCw5MTc4MjEsOTE3ODIyLDkxNzgyMyw5MTc4MjQsOTE3ODI1LDkxNzgyNiw5MTc4MjcsOTE3ODI4LDkxNzgyOSw5MTc4MzAsOTE3ODMxLDkxNzgzMiw5MTc4MzMsOTE3ODM0LDkxNzgzNSw5MTc4MzYsOTE3ODM3LDkxNzgzOCw5MTc4MzksOTE3ODQwLDkxNzg0MSw5MTc4NDIsOTE3ODQzLDkxNzg0NCw5MTc4NDUsOTE3ODQ2LDkxNzg0Nyw5MTc4NDgsOTE3ODQ5LDkxNzg1MCw5MTc4NTEsOTE3ODUyLDkxNzg1Myw5MTc4NTQsOTE3ODU1LDkxNzg1Niw5MTc4NTcsOTE3ODU4LDkxNzg1OSw5MTc4NjAsOTE3ODYxLDkxNzg2Miw5MTc4NjMsOTE3ODY0LDkxNzg2NSw5MTc4NjYsOTE3ODY3LDkxNzg2OCw5MTc4NjksOTE3ODcwLDkxNzg3MSw5MTc4NzIsOTE3ODczLDkxNzg3NCw5MTc4NzUsOTE3ODc2LDkxNzg3Nyw5MTc4NzgsOTE3ODc5LDkxNzg4MCw5MTc4ODEsOTE3ODgyLDkxNzg4Myw5MTc4ODQsOTE3ODg1LDkxNzg4Niw5MTc4ODcsOTE3ODg4LDkxNzg4OSw5MTc4OTAsOTE3ODkxLDkxNzg5Miw5MTc4OTMsOTE3ODk0LDkxNzg5NSw5MTc4OTYsOTE3ODk3LDkxNzg5OCw5MTc4OTksOTE3OTAwLDkxNzkwMSw5MTc5MDIsOTE3OTAzLDkxNzkwNCw5MTc5MDUsOTE3OTA2LDkxNzkwNyw5MTc5MDgsOTE3OTA5LDkxNzkxMCw5MTc5MTEsOTE3OTEyLDkxNzkxMyw5MTc5MTQsOTE3OTE1LDkxNzkxNiw5MTc5MTcsOTE3OTE4LDkxNzkxOSw5MTc5MjAsOTE3OTIxLDkxNzkyMiw5MTc5MjMsOTE3OTI0LDkxNzkyNSw5MTc5MjYsOTE3OTI3LDkxNzkyOCw5MTc5MjksOTE3OTMwLDkxNzkzMSw5MTc5MzIsOTE3OTMzLDkxNzkzNCw5MTc5MzUsOTE3OTM2LDkxNzkzNyw5MTc5MzgsOTE3OTM5LDkxNzk0MCw5MTc5NDEsOTE3OTQyLDkxNzk0Myw5MTc5NDQsOTE3OTQ1LDkxNzk0Niw5MTc5NDcsOTE3OTQ4LDkxNzk0OSw5MTc5NTAsOTE3OTUxLDkxNzk1Miw5MTc5NTMsOTE3OTU0LDkxNzk1NSw5MTc5NTYsOTE3OTU3LDkxNzk1OCw5MTc5NTksOTE3OTYwLDkxNzk2MSw5MTc5NjIsOTE3OTYzLDkxNzk2NCw5MTc5NjUsOTE3OTY2LDkxNzk2Nyw5MTc5NjgsOTE3OTY5LDkxNzk3MCw5MTc5NzEsOTE3OTcyLDkxNzk3Myw5MTc5NzQsOTE3OTc1LDkxNzk3Niw5MTc5NzcsOTE3OTc4LDkxNzk3OSw5MTc5ODAsOTE3OTgxLDkxNzk4Miw5MTc5ODMsOTE3OTg0LDkxNzk4NSw5MTc5ODYsOTE3OTg3LDkxNzk4OCw5MTc5ODksOTE3OTkwLDkxNzk5MSw5MTc5OTIsOTE3OTkzLDkxNzk5NCw5MTc5OTUsOTE3OTk2LDkxNzk5Nyw5MTc5OTgsOTE3OTk5XSIpfXN0YXRpYyBnZXREYXRhKCl7cmV0dXJuIHRoaXMuX2RhdGF8fCh0aGlzLl9kYXRhPW5ldyBTZXQoVS5nZXRSYXdEYXRhKCkpKSx0aGlzLl9kYXRhfXN0YXRpYyBpc0ludmlzaWJsZUNoYXJhY3RlcihlKXtyZXR1cm4gVS5nZXREYXRhKCkuaGFzKGUpfXN0YXRpYyBnZXQgY29kZVBvaW50cygpe3JldHVybiBVLmdldERhdGEoKX19VS5fZGF0YT12b2lkIDA7Y2xhc3MgcXtjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLnZzV29ya2VyPWUsdGhpcy5yZXE9dCx0aGlzLm1ldGhvZD1yLHRoaXMuYXJncz1uLHRoaXMudHlwZT0wfX1jbGFzcyBCe2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMudnNXb3JrZXI9ZSx0aGlzLnNlcT10LHRoaXMucmVzPXIsdGhpcy5lcnI9bix0aGlzLnR5cGU9MX19Y2xhc3MgJHtjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLnZzV29ya2VyPWUsdGhpcy5yZXE9dCx0aGlzLmV2ZW50TmFtZT1yLHRoaXMuYXJnPW4sdGhpcy50eXBlPTJ9fWNsYXNzIFd7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMudnNXb3JrZXI9ZSx0aGlzLnJlcT10LHRoaXMuZXZlbnQ9cix0aGlzLnR5cGU9M319Y2xhc3MgSHtjb25zdHJ1Y3RvcihlLHQpe3RoaXMudnNXb3JrZXI9ZSx0aGlzLnJlcT10LHRoaXMudHlwZT00fX1jbGFzcyB6e2NvbnN0cnVjdG9yKGUpe3RoaXMuX3dvcmtlcklkPS0xLHRoaXMuX2hhbmRsZXI9ZSx0aGlzLl9sYXN0U2VudFJlcT0wLHRoaXMuX3BlbmRpbmdSZXBsaWVzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fcGVuZGluZ0VtaXR0ZXJzPW5ldyBNYXAsdGhpcy5fcGVuZGluZ0V2ZW50cz1uZXcgTWFwfXNldFdvcmtlcklkKGUpe3RoaXMuX3dvcmtlcklkPWV9c2VuZE1lc3NhZ2UocixuKXtjb25zdCBpPVN0cmluZygrK3RoaXMuX2xhc3RTZW50UmVxKTtyZXR1cm4gbmV3IFByb21pc2UoKGUsdCk9Pnt0aGlzLl9wZW5kaW5nUmVwbGllc1tpXT17cmVzb2x2ZTplLHJlamVjdDp0fSx0aGlzLl9zZW5kKG5ldyBxKHRoaXMuX3dvcmtlcklkLGkscixuKSl9KX1saXN0ZW4oZSx0KXtsZXQgcj1udWxsO2NvbnN0IG49bmV3IEkoe29uRmlyc3RMaXN0ZW5lckFkZDooKT0+e3I9U3RyaW5nKCsrdGhpcy5fbGFzdFNlbnRSZXEpLHRoaXMuX3BlbmRpbmdFbWl0dGVycy5zZXQocixuKSx0aGlzLl9zZW5kKG5ldyAkKHRoaXMuX3dvcmtlcklkLHIsZSx0KSl9LG9uTGFzdExpc3RlbmVyUmVtb3ZlOigpPT57dGhpcy5fcGVuZGluZ0VtaXR0ZXJzLmRlbGV0ZShyKSx0aGlzLl9zZW5kKG5ldyBIKHRoaXMuX3dvcmtlcklkLHIpKSxyPW51bGx9fSk7cmV0dXJuIG4uZXZlbnR9aGFuZGxlTWVzc2FnZShlKXtlJiZlLnZzV29ya2VyJiYoLTEhPT10aGlzLl93b3JrZXJJZCYmZS52c1dvcmtlciE9PXRoaXMuX3dvcmtlcklkfHx0aGlzLl9oYW5kbGVNZXNzYWdlKGUpKX1faGFuZGxlTWVzc2FnZShlKXtzd2l0Y2goZS50eXBlKXtjYXNlIDE6cmV0dXJuIHRoaXMuX2hhbmRsZVJlcGx5TWVzc2FnZShlKTtjYXNlIDA6cmV0dXJuIHRoaXMuX2hhbmRsZVJlcXVlc3RNZXNzYWdlKGUpO2Nhc2UgMjpyZXR1cm4gdGhpcy5faGFuZGxlU3Vic2NyaWJlRXZlbnRNZXNzYWdlKGUpO2Nhc2UgMzpyZXR1cm4gdGhpcy5faGFuZGxlRXZlbnRNZXNzYWdlKGUpO2Nhc2UgNDpyZXR1cm4gdGhpcy5faGFuZGxlVW5zdWJzY3JpYmVFdmVudE1lc3NhZ2UoZSl9fV9oYW5kbGVSZXBseU1lc3NhZ2Uocil7aWYodGhpcy5fcGVuZGluZ1JlcGxpZXNbci5zZXFdKXtsZXQgdD10aGlzLl9wZW5kaW5nUmVwbGllc1tyLnNlcV07aWYoZGVsZXRlIHRoaXMuX3BlbmRpbmdSZXBsaWVzW3Iuc2VxXSxyLmVycil7bGV0IGU9ci5lcnI7cmV0dXJuIHIuZXJyLiRpc0Vycm9yJiYoZT1uZXcgRXJyb3IsZS5uYW1lPXIuZXJyLm5hbWUsZS5tZXNzYWdlPXIuZXJyLm1lc3NhZ2UsZS5zdGFjaz1yLmVyci5zdGFjayksdm9pZCB0LnJlamVjdChlKX10LnJlc29sdmUoci5yZXMpfWVsc2UgY29uc29sZS53YXJuKCJHb3QgcmVwbHkgdG8gdW5rbm93biBzZXEiKX1faGFuZGxlUmVxdWVzdE1lc3NhZ2UoZSl7bGV0IHQ9ZS5yZXEscj10aGlzLl9oYW5kbGVyLmhhbmRsZU1lc3NhZ2UoZS5tZXRob2QsZS5hcmdzKTtyLnRoZW4oZT0+e3RoaXMuX3NlbmQobmV3IEIodGhpcy5fd29ya2VySWQsdCxlLHZvaWQgMCkpfSxlPT57ZS5kZXRhaWwgaW5zdGFuY2VvZiBFcnJvciYmKGUuZGV0YWlsPW4oZS5kZXRhaWwpKSx0aGlzLl9zZW5kKG5ldyBCKHRoaXMuX3dvcmtlcklkLHQsdm9pZCAwLG4oZSkpKX0pfV9oYW5kbGVTdWJzY3JpYmVFdmVudE1lc3NhZ2UoZSl7Y29uc3QgdD1lLnJlcTtlPXRoaXMuX2hhbmRsZXIuaGFuZGxlRXZlbnQoZS5ldmVudE5hbWUsZS5hcmcpKGU9Pnt0aGlzLl9zZW5kKG5ldyBXKHRoaXMuX3dvcmtlcklkLHQsZSkpfSk7dGhpcy5fcGVuZGluZ0V2ZW50cy5zZXQodCxlKX1faGFuZGxlRXZlbnRNZXNzYWdlKGUpe3RoaXMuX3BlbmRpbmdFbWl0dGVycy5oYXMoZS5yZXEpP3RoaXMuX3BlbmRpbmdFbWl0dGVycy5nZXQoZS5yZXEpLmZpcmUoZS5ldmVudCk6Y29uc29sZS53YXJuKCJHb3QgZXZlbnQgZm9yIHVua25vd24gcmVxIil9X2hhbmRsZVVuc3Vic2NyaWJlRXZlbnRNZXNzYWdlKGUpe3RoaXMuX3BlbmRpbmdFdmVudHMuaGFzKGUucmVxKT8odGhpcy5fcGVuZGluZ0V2ZW50cy5nZXQoZS5yZXEpLmRpc3Bvc2UoKSx0aGlzLl9wZW5kaW5nRXZlbnRzLmRlbGV0ZShlLnJlcSkpOmNvbnNvbGUud2FybigiR290IHVuc3Vic2NyaWJlIGZvciB1bmtub3duIHJlcSIpfV9zZW5kKHQpe2xldCByPVtdO2lmKDA9PT10LnR5cGUpZm9yKGxldCBlPTA7ZTx0LmFyZ3MubGVuZ3RoO2UrKyl0LmFyZ3NbZV1pbnN0YW5jZW9mIEFycmF5QnVmZmVyJiZyLnB1c2godC5hcmdzW2VdKTtlbHNlIDE9PT10LnR5cGUmJnQucmVzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJnIucHVzaCh0LnJlcyk7dGhpcy5faGFuZGxlci5zZW5kTWVzc2FnZSh0LHIpfX1mdW5jdGlvbiBKKGUpe3JldHVybiJvIj09PWVbMF0mJiJuIj09PWVbMV0mJkYoZS5jaGFyQ29kZUF0KDIpKX1mdW5jdGlvbiBHKGUpe3JldHVybi9eb25EeW5hbWljLy50ZXN0KGUpJiZGKGUuY2hhckNvZGVBdCg5KSl9ZnVuY3Rpb24gWChlLHIsbil7bGV0IHQ9e307Zm9yKGNvbnN0IGkgb2YgZSlHKGkpP3RbaV09KHQ9PmZ1bmN0aW9uKGUpe3JldHVybiBuKHQsZSl9KShpKTpKKGkpP3RbaV09bihpLHZvaWQgMCk6dFtpXT0odD0+ZnVuY3Rpb24oKXt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIHIodCxlKX0pKGkpO3JldHVybiB0fWNsYXNzIFp7Y29uc3RydWN0b3IocixlKXt0aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3Rvcnk9ZSx0aGlzLl9yZXF1ZXN0SGFuZGxlcj1udWxsLHRoaXMuX3Byb3RvY29sPW5ldyB6KHtzZW5kTWVzc2FnZTooZSx0KT0+e3IoZSx0KX0saGFuZGxlTWVzc2FnZTooZSx0KT0+dGhpcy5faGFuZGxlTWVzc2FnZShlLHQpLGhhbmRsZUV2ZW50OihlLHQpPT50aGlzLl9oYW5kbGVFdmVudChlLHQpfSl9b25tZXNzYWdlKGUpe3RoaXMuX3Byb3RvY29sLmhhbmRsZU1lc3NhZ2UoZSl9X2hhbmRsZU1lc3NhZ2UoZSx0KXtpZigiJGluaXRpYWxpemUiPT09ZSlyZXR1cm4gdGhpcy5pbml0aWFsaXplKHRbMF0sdFsxXSx0WzJdLHRbM10pO2lmKCF0aGlzLl9yZXF1ZXN0SGFuZGxlcnx8ImZ1bmN0aW9uIiE9dHlwZW9mIHRoaXMuX3JlcXVlc3RIYW5kbGVyW2VdKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIk1pc3NpbmcgcmVxdWVzdEhhbmRsZXIgb3IgbWV0aG9kOiAiK2UpKTt0cnl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9yZXF1ZXN0SGFuZGxlcltlXS5hcHBseSh0aGlzLl9yZXF1ZXN0SGFuZGxlcix0KSl9Y2F0Y2goZSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGUpfX1faGFuZGxlRXZlbnQoZSx0KXtpZighdGhpcy5fcmVxdWVzdEhhbmRsZXIpdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJlcXVlc3RIYW5kbGVyIik7aWYoRyhlKSl7dmFyIHI9dGhpcy5fcmVxdWVzdEhhbmRsZXJbZV0uY2FsbCh0aGlzLl9yZXF1ZXN0SGFuZGxlcix0KTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcil0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZHluYW1pYyBldmVudCAke2V9IG9uIHJlcXVlc3QgaGFuZGxlci5gKTtyZXR1cm4gcn1pZihKKGUpKXtyPXRoaXMuX3JlcXVlc3RIYW5kbGVyW2VdO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiByKXRocm93IG5ldyBFcnJvcihgTWlzc2luZyBldmVudCAke2V9IG9uIHJlcXVlc3QgaGFuZGxlci5gKTtyZXR1cm4gcn10aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBldmVudCBuYW1lICIrZSl9aW5pdGlhbGl6ZShlLHQsbixyKXt0aGlzLl9wcm90b2NvbC5zZXRXb3JrZXJJZChlKTtjb25zdCBpPVgociwoZSx0KT0+dGhpcy5fcHJvdG9jb2wuc2VuZE1lc3NhZ2UoZSx0KSwoZSx0KT0+dGhpcy5fcHJvdG9jb2wubGlzdGVuKGUsdCkpO3JldHVybiB0aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3Rvcnk/KHRoaXMuX3JlcXVlc3RIYW5kbGVyPXRoaXMuX3JlcXVlc3RIYW5kbGVyRmFjdG9yeShpKSxQcm9taXNlLnJlc29sdmUoUCh0aGlzLl9yZXF1ZXN0SGFuZGxlcikpKToodCYmKHZvaWQgMCE9PXQuYmFzZVVybCYmZGVsZXRlIHQuYmFzZVVybCx2b2lkIDAhPT10LnBhdGhzJiZ2b2lkIDAhPT10LnBhdGhzLnZzJiZkZWxldGUgdC5wYXRocy52cyx0LnRydXN0ZWRUeXBlc1BvbGljeSxkZWxldGUgdC50cnVzdGVkVHlwZXNQb2xpY3ksdC5jYXRjaEVycm9yPSEwLF8ucmVxdWlyZS5jb25maWcodCkpLG5ldyBQcm9taXNlKCh0LHIpPT57Y29uc3QgZT1fLnJlcXVpcmU7ZShbbl0sZT0+e3RoaXMuX3JlcXVlc3RIYW5kbGVyPWUuY3JlYXRlKGkpLHRoaXMuX3JlcXVlc3RIYW5kbGVyP3QoUCh0aGlzLl9yZXF1ZXN0SGFuZGxlcikpOnIobmV3IEVycm9yKCJObyBSZXF1ZXN0SGFuZGxlciEiKSl9LHIpfSkpfX1jbGFzcyBRe2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMub3JpZ2luYWxTdGFydD1lLHRoaXMub3JpZ2luYWxMZW5ndGg9dCx0aGlzLm1vZGlmaWVkU3RhcnQ9cix0aGlzLm1vZGlmaWVkTGVuZ3RoPW59Z2V0T3JpZ2luYWxFbmQoKXtyZXR1cm4gdGhpcy5vcmlnaW5hbFN0YXJ0K3RoaXMub3JpZ2luYWxMZW5ndGh9Z2V0TW9kaWZpZWRFbmQoKXtyZXR1cm4gdGhpcy5tb2RpZmllZFN0YXJ0K3RoaXMubW9kaWZpZWRMZW5ndGh9fWZ1bmN0aW9uIFkoZSx0KXtyZXR1cm4odDw8NSktdCtlfDB9Y2xhc3MgZWV7Y29uc3RydWN0b3IoZSl7dGhpcy5zb3VyY2U9ZX1nZXRFbGVtZW50cygpe2NvbnN0IHI9dGhpcy5zb3VyY2Usbj1uZXcgSW50MzJBcnJheShyLmxlbmd0aCk7Zm9yKGxldCBlPTAsdD1yLmxlbmd0aDtlPHQ7ZSsrKW5bZV09ci5jaGFyQ29kZUF0KGUpO3JldHVybiBufX1jbGFzcyB0ZXtzdGF0aWMgQXNzZXJ0KGUsdCl7aWYoIWUpdGhyb3cgbmV3IEVycm9yKHQpfX1jbGFzcyByZXtzdGF0aWMgQ29weSh0LHIsbixpLG8pe2ZvcihsZXQgZT0wO2U8bztlKyspbltpK2VdPXRbcitlXX1zdGF0aWMgQ29weTIodCxyLG4saSxvKXtmb3IobGV0IGU9MDtlPG87ZSsrKW5baStlXT10W3IrZV19fWNsYXNzIG5le2NvbnN0cnVjdG9yKCl7dGhpcy5tX2NoYW5nZXM9W10sdGhpcy5tX29yaWdpbmFsU3RhcnQ9MTA3Mzc0MTgyNCx0aGlzLm1fbW9kaWZpZWRTdGFydD0xMDczNzQxODI0LHRoaXMubV9vcmlnaW5hbENvdW50PTAsdGhpcy5tX21vZGlmaWVkQ291bnQ9MH1NYXJrTmV4dENoYW5nZSgpeygwPHRoaXMubV9vcmlnaW5hbENvdW50fHwwPHRoaXMubV9tb2RpZmllZENvdW50KSYmdGhpcy5tX2NoYW5nZXMucHVzaChuZXcgUSh0aGlzLm1fb3JpZ2luYWxTdGFydCx0aGlzLm1fb3JpZ2luYWxDb3VudCx0aGlzLm1fbW9kaWZpZWRTdGFydCx0aGlzLm1fbW9kaWZpZWRDb3VudCkpLHRoaXMubV9vcmlnaW5hbENvdW50PTAsdGhpcy5tX21vZGlmaWVkQ291bnQ9MCx0aGlzLm1fb3JpZ2luYWxTdGFydD0xMDczNzQxODI0LHRoaXMubV9tb2RpZmllZFN0YXJ0PTEwNzM3NDE4MjR9QWRkT3JpZ2luYWxFbGVtZW50KGUsdCl7dGhpcy5tX29yaWdpbmFsU3RhcnQ9TWF0aC5taW4odGhpcy5tX29yaWdpbmFsU3RhcnQsZSksdGhpcy5tX21vZGlmaWVkU3RhcnQ9TWF0aC5taW4odGhpcy5tX21vZGlmaWVkU3RhcnQsdCksdGhpcy5tX29yaWdpbmFsQ291bnQrK31BZGRNb2RpZmllZEVsZW1lbnQoZSx0KXt0aGlzLm1fb3JpZ2luYWxTdGFydD1NYXRoLm1pbih0aGlzLm1fb3JpZ2luYWxTdGFydCxlKSx0aGlzLm1fbW9kaWZpZWRTdGFydD1NYXRoLm1pbih0aGlzLm1fbW9kaWZpZWRTdGFydCx0KSx0aGlzLm1fbW9kaWZpZWRDb3VudCsrfWdldENoYW5nZXMoKXtyZXR1cm4oMDx0aGlzLm1fb3JpZ2luYWxDb3VudHx8MDx0aGlzLm1fbW9kaWZpZWRDb3VudCkmJnRoaXMuTWFya05leHRDaGFuZ2UoKSx0aGlzLm1fY2hhbmdlc31nZXRSZXZlcnNlQ2hhbmdlcygpe3JldHVybigwPHRoaXMubV9vcmlnaW5hbENvdW50fHwwPHRoaXMubV9tb2RpZmllZENvdW50KSYmdGhpcy5NYXJrTmV4dENoYW5nZSgpLHRoaXMubV9jaGFuZ2VzLnJldmVyc2UoKSx0aGlzLm1fY2hhbmdlc319Y2xhc3MgaWV7Y29uc3RydWN0b3IoZSx0LHI9bnVsbCl7dGhpcy5Db250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGU9cix0aGlzLl9vcmlnaW5hbFNlcXVlbmNlPWUsdGhpcy5fbW9kaWZpZWRTZXF1ZW5jZT10O3ZhcltuLGksb109aWUuX2dldEVsZW1lbnRzKGUpLFtyLGUsdF09aWUuX2dldEVsZW1lbnRzKHQpO3RoaXMuX2hhc1N0cmluZ3M9byYmdCx0aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzPW4sdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaD1pLHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHM9cix0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoPWUsdGhpcy5tX2ZvcndhcmRIaXN0b3J5PVtdLHRoaXMubV9yZXZlcnNlSGlzdG9yeT1bXX1zdGF0aWMgX2lzU3RyaW5nQXJyYXkoZSl7cmV0dXJuIDA8ZS5sZW5ndGgmJiJzdHJpbmciPT10eXBlb2YgZVswXX1zdGF0aWMgX2dldEVsZW1lbnRzKGUpe3ZhciByPWUuZ2V0RWxlbWVudHMoKTtpZihpZS5faXNTdHJpbmdBcnJheShyKSl7Y29uc3Qgbj1uZXcgSW50MzJBcnJheShyLmxlbmd0aCk7Zm9yKGxldCBlPTAsdD1yLmxlbmd0aDtlPHQ7ZSsrKW5bZV09ZnVuY3Rpb24ocixuKXtuPVkoMTQ5NDE3LG4pO2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrKyluPVkoci5jaGFyQ29kZUF0KGUpLG4pO3JldHVybiBufShyW2VdLDApO3JldHVybltyLG4sITBdfXJldHVybiByIGluc3RhbmNlb2YgSW50MzJBcnJheT9bW10sciwhMV06W1tdLG5ldyBJbnQzMkFycmF5KHIpLCExXX1FbGVtZW50c0FyZUVxdWFsKGUsdCl7cmV0dXJuIHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2hbZV09PT10aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoW3RdJiYoIXRoaXMuX2hhc1N0cmluZ3N8fHRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbZV09PT10aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW3RdKX1FbGVtZW50c0FyZVN0cmljdEVxdWFsKGUsdCl7cmV0dXJuISF0aGlzLkVsZW1lbnRzQXJlRXF1YWwoZSx0KSYmaWUuX2dldFN0cmljdEVsZW1lbnQodGhpcy5fb3JpZ2luYWxTZXF1ZW5jZSxlKT09PWllLl9nZXRTdHJpY3RFbGVtZW50KHRoaXMuX21vZGlmaWVkU2VxdWVuY2UsdCl9c3RhdGljIF9nZXRTdHJpY3RFbGVtZW50KGUsdCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUuZ2V0U3RyaWN0RWxlbWVudD9lLmdldFN0cmljdEVsZW1lbnQodCk6bnVsbH1PcmlnaW5hbEVsZW1lbnRzQXJlRXF1YWwoZSx0KXtyZXR1cm4gdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaFtlXT09PXRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2hbdF0mJighdGhpcy5faGFzU3RyaW5nc3x8dGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1tlXT09PXRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbdF0pfU1vZGlmaWVkRWxlbWVudHNBcmVFcXVhbChlLHQpe3JldHVybiB0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoW2VdPT09dGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaFt0XSYmKCF0aGlzLl9oYXNTdHJpbmdzfHx0aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW2VdPT09dGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50c1t0XSl9Q29tcHV0ZURpZmYoZSl7cmV0dXJuIHRoaXMuX0NvbXB1dGVEaWZmKDAsdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaC5sZW5ndGgtMSwwLHRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2gubGVuZ3RoLTEsZSl9X0NvbXB1dGVEaWZmKGUsdCxyLG4saSl7dmFyIG89WyExXTtsZXQgcz10aGlzLkNvbXB1dGVEaWZmUmVjdXJzaXZlKGUsdCxyLG4sbyk7cmV0dXJuIGkmJihzPXRoaXMuUHJldHRpZnlDaGFuZ2VzKHMpKSx7cXVpdEVhcmx5Om9bMF0sY2hhbmdlczpzfX1Db21wdXRlRGlmZlJlY3Vyc2l2ZSh0LHIsbixpLG8pe2ZvcihvWzBdPSExO3Q8PXImJm48PWkmJnRoaXMuRWxlbWVudHNBcmVFcXVhbCh0LG4pOyl0KyssbisrO2Zvcig7dDw9ciYmbjw9aSYmdGhpcy5FbGVtZW50c0FyZUVxdWFsKHIsaSk7KXItLSxpLS07aWYocjx0fHxpPG4pe2xldCBlO3JldHVybiBlPW48PWk/KHRlLkFzc2VydCh0PT09cisxLCJvcmlnaW5hbFN0YXJ0IHNob3VsZCBvbmx5IGJlIG9uZSBtb3JlIHRoYW4gb3JpZ2luYWxFbmQiKSxbbmV3IFEodCwwLG4saS1uKzEpXSk6dDw9cj8odGUuQXNzZXJ0KG49PT1pKzEsIm1vZGlmaWVkU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBtb2RpZmllZEVuZCIpLFtuZXcgUSh0LHItdCsxLG4sMCldKToodGUuQXNzZXJ0KHQ9PT1yKzEsIm9yaWdpbmFsU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBvcmlnaW5hbEVuZCIpLHRlLkFzc2VydChuPT09aSsxLCJtb2RpZmllZFN0YXJ0IHNob3VsZCBvbmx5IGJlIG9uZSBtb3JlIHRoYW4gbW9kaWZpZWRFbmQiKSxbXSksZX12YXIgcz1bMF0sYT1bMF0sbD10aGlzLkNvbXB1dGVSZWN1cnNpb25Qb2ludCh0LHIsbixpLHMsYSxvKSxzPXNbMF0sYT1hWzBdO2lmKG51bGwhPT1sKXJldHVybiBsO2lmKG9bMF0pcmV0dXJuW25ldyBRKHQsci10KzEsbixpLW4rMSldO3tsPXRoaXMuQ29tcHV0ZURpZmZSZWN1cnNpdmUodCxzLG4sYSxvKTtsZXQgZT1bXTtyZXR1cm4gZT1vWzBdP1tuZXcgUShzKzEsci0ocysxKSsxLGErMSxpLShhKzEpKzEpXTp0aGlzLkNvbXB1dGVEaWZmUmVjdXJzaXZlKHMrMSxyLGErMSxpLG8pLHRoaXMuQ29uY2F0ZW5hdGVDaGFuZ2VzKGwsZSl9fVdBTEtUUkFDRShlLHQscixuLGksbyxzLGEsbCx1LGgsYyxkLGYsbSxnLHAsdil7bGV0IHk9bnVsbCxiPW5ldyBuZSxfPXQsQz1yLFM9ZFswXS1nWzBdLW4sdz0tMTA3Mzc0MTgyNCxBPXRoaXMubV9mb3J3YXJkSGlzdG9yeS5sZW5ndGgtMTtkb3t2YXIgeD1TK2U7Uz14PT09X3x8eDxDJiZsW3gtMV08bFt4KzFdPyhmPShoPWxbeCsxXSktUy1uLGg8dyYmYi5NYXJrTmV4dENoYW5nZSgpLHc9aCxiLkFkZE1vZGlmaWVkRWxlbWVudChoKzEsZikseCsxLWUpOihmPShoPWxbeC0xXSsxKS1TLW4saDx3JiZiLk1hcmtOZXh0Q2hhbmdlKCksdz1oLTEsYi5BZGRPcmlnaW5hbEVsZW1lbnQoaCxmKzEpLHgtMS1lKSwwPD1BJiYoZT0obD10aGlzLm1fZm9yd2FyZEhpc3RvcnlbQV0pWzBdLF89MSxDPWwubGVuZ3RoLTEpfXdoaWxlKC0xPD0tLUEpO2lmKHI9Yi5nZXRSZXZlcnNlQ2hhbmdlcygpLHZbMF0pe2xldCBlPWRbMF0rMSx0PWdbMF0rMTtpZihudWxsIT09ciYmMDxyLmxlbmd0aCl7Y29uc3QgTj1yW3IubGVuZ3RoLTFdO2U9TWF0aC5tYXgoZSxOLmdldE9yaWdpbmFsRW5kKCkpLHQ9TWF0aC5tYXgodCxOLmdldE1vZGlmaWVkRW5kKCkpfXk9W25ldyBRKGUsYy1lKzEsdCxtLXQrMSldfWVsc2V7Yj1uZXcgbmUsXz1vLEM9cyxTPWRbMF0tZ1swXS1hLHc9MTA3Mzc0MTgyNCxBPXA/dGhpcy5tX3JldmVyc2VIaXN0b3J5Lmxlbmd0aC0xOnRoaXMubV9yZXZlcnNlSGlzdG9yeS5sZW5ndGgtMjtkb3t2YXIgRT1TK2k7Uz1FPT09X3x8RTxDJiZ1W0UtMV0+PXVbRSsxXT8oZj0oaD11W0UrMV0tMSktUy1hLGg+dyYmYi5NYXJrTmV4dENoYW5nZSgpLHc9aCsxLGIuQWRkT3JpZ2luYWxFbGVtZW50KGgrMSxmKzEpLEUrMS1pKTooZj0oaD11W0UtMV0pLVMtYSxoPncmJmIuTWFya05leHRDaGFuZ2UoKSx3PWgsYi5BZGRNb2RpZmllZEVsZW1lbnQoaCsxLGYrMSksRS0xLWkpLDA8PUEmJihpPSh1PXRoaXMubV9yZXZlcnNlSGlzdG9yeVtBXSlbMF0sXz0xLEM9dS5sZW5ndGgtMSl9d2hpbGUoLTE8PS0tQSk7eT1iLmdldENoYW5nZXMoKX1yZXR1cm4gdGhpcy5Db25jYXRlbmF0ZUNoYW5nZXMocix5KX1Db21wdXRlUmVjdXJzaW9uUG9pbnQoaSxvLHMsYSxsLHUsaCl7bGV0IGM9MCxkPTAsZj0wLG09MCxnPTAscD0wO2ktLSxzLS0sdVtsWzBdPTBdPTAsdGhpcy5tX2ZvcndhcmRIaXN0b3J5PVtdLHRoaXMubV9yZXZlcnNlSGlzdG9yeT1bXTt2YXIgZT1vLWkrKGEtcyksdj0xK2U7Y29uc3QgeT1uZXcgSW50MzJBcnJheSh2KSxiPW5ldyBJbnQzMkFycmF5KHYpO3ZhciBfPWEtcyxDPW8taSxTPWktcyx3PW8tYSxBPShDLV8pJTI9PTA7eVtfXT1pLGJbQ109byxoWzBdPSExO2ZvcihsZXQgbj0xO248PWUvMisxO24rKyl7bGV0IHQ9MCxyPTA7Zj10aGlzLkNsaXBEaWFnb25hbEJvdW5kKF8tbixuLF8sdiksbT10aGlzLkNsaXBEaWFnb25hbEJvdW5kKF8rbixuLF8sdik7Zm9yKGxldCBlPWY7ZTw9bTtlKz0yKXtjPWU9PT1mfHxlPG0mJnlbZS0xXTx5W2UrMV0/eVtlKzFdOnlbZS0xXSsxLGQ9Yy0oZS1fKS1TO2Zvcih2YXIgeD1jO2M8byYmZDxhJiZ0aGlzLkVsZW1lbnRzQXJlRXF1YWwoYysxLGQrMSk7KWMrKyxkKys7aWYoeVtlXT1jLGMrZD50K3ImJih0PWMscj1kKSwhQSYmTWF0aC5hYnMoZS1DKTw9bi0xJiZjPj1iW2VdKXJldHVybiBsWzBdPWMsdVswXT1kLHg8PWJbZV0mJm48PTE0NDg/dGhpcy5XQUxLVFJBQ0UoXyxmLG0sUyxDLGcscCx3LHksYixjLG8sbCxkLGEsdSxBLGgpOm51bGx9dmFyIEU9KHQtaSsoci1zKS1uKS8yO2lmKG51bGwhPT10aGlzLkNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZSYmIXRoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlKHQsRSkpcmV0dXJuIGhbMF09ITAsbFswXT10LHVbMF09ciwwPEUmJm48PTE0NDg/dGhpcy5XQUxLVFJBQ0UoXyxmLG0sUyxDLGcscCx3LHksYixjLG8sbCxkLGEsdSxBLGgpOihpKysscysrLFtuZXcgUShpLG8taSsxLHMsYS1zKzEpXSk7Zz10aGlzLkNsaXBEaWFnb25hbEJvdW5kKEMtbixuLEMsdikscD10aGlzLkNsaXBEaWFnb25hbEJvdW5kKEMrbixuLEMsdik7Zm9yKGxldCBlPWc7ZTw9cDtlKz0yKXtjPWU9PT1nfHxlPHAmJmJbZS0xXT49YltlKzFdP2JbZSsxXS0xOmJbZS0xXSxkPWMtKGUtQyktdztmb3IodmFyIE49YztjPmkmJmQ+cyYmdGhpcy5FbGVtZW50c0FyZUVxdWFsKGMsZCk7KWMtLSxkLS07aWYoYltlXT1jLEEmJk1hdGguYWJzKGUtXyk8PW4mJmM8PXlbZV0pcmV0dXJuIGxbMF09Yyx1WzBdPWQsTj49eVtlXSYmbjw9MTQ0OD90aGlzLldBTEtUUkFDRShfLGYsbSxTLEMsZyxwLHcseSxiLGMsbyxsLGQsYSx1LEEsaCk6bnVsbH1pZihuPD0xNDQ3KXtsZXQgZT1uZXcgSW50MzJBcnJheShtLWYrMik7ZVswXT1fLWYrMSxyZS5Db3B5Mih5LGYsZSwxLG0tZisxKSx0aGlzLm1fZm9yd2FyZEhpc3RvcnkucHVzaChlKSxlPW5ldyBJbnQzMkFycmF5KHAtZysyKSxlWzBdPUMtZysxLHJlLkNvcHkyKGIsZyxlLDEscC1nKzEpLHRoaXMubV9yZXZlcnNlSGlzdG9yeS5wdXNoKGUpfX1yZXR1cm4gdGhpcy5XQUxLVFJBQ0UoXyxmLG0sUyxDLGcscCx3LHksYixjLG8sbCxkLGEsdSxBLGgpfVByZXR0aWZ5Q2hhbmdlcyhvKXtmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl7Y29uc3QgXz1vW2VdO2Zvcih2YXIgdD1lPG8ubGVuZ3RoLTE/b1tlKzFdLm9yaWdpbmFsU3RhcnQ6dGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaC5sZW5ndGgscj1lPG8ubGVuZ3RoLTE/b1tlKzFdLm1vZGlmaWVkU3RhcnQ6dGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGgsbj0wPF8ub3JpZ2luYWxMZW5ndGgsaT0wPF8ubW9kaWZpZWRMZW5ndGg7Xy5vcmlnaW5hbFN0YXJ0K18ub3JpZ2luYWxMZW5ndGg8dCYmXy5tb2RpZmllZFN0YXJ0K18ubW9kaWZpZWRMZW5ndGg8ciYmKCFufHx0aGlzLk9yaWdpbmFsRWxlbWVudHNBcmVFcXVhbChfLm9yaWdpbmFsU3RhcnQsXy5vcmlnaW5hbFN0YXJ0K18ub3JpZ2luYWxMZW5ndGgpKSYmKCFpfHx0aGlzLk1vZGlmaWVkRWxlbWVudHNBcmVFcXVhbChfLm1vZGlmaWVkU3RhcnQsXy5tb2RpZmllZFN0YXJ0K18ubW9kaWZpZWRMZW5ndGgpKTspe3ZhciBzPXRoaXMuRWxlbWVudHNBcmVTdHJpY3RFcXVhbChfLm9yaWdpbmFsU3RhcnQsXy5tb2RpZmllZFN0YXJ0KTtpZih0aGlzLkVsZW1lbnRzQXJlU3RyaWN0RXF1YWwoXy5vcmlnaW5hbFN0YXJ0K18ub3JpZ2luYWxMZW5ndGgsXy5tb2RpZmllZFN0YXJ0K18ubW9kaWZpZWRMZW5ndGgpJiYhcylicmVhaztfLm9yaWdpbmFsU3RhcnQrKyxfLm1vZGlmaWVkU3RhcnQrK312YXIgYT1bbnVsbF07ZTxvLmxlbmd0aC0xJiZ0aGlzLkNoYW5nZXNPdmVybGFwKG9bZV0sb1tlKzFdLGEpJiYob1tlXT1hWzBdLG8uc3BsaWNlKGUrMSwxKSxlLS0pfWZvcihsZXQgZT1vLmxlbmd0aC0xOzA8PWU7ZS0tKXtjb25zdCBDPW9bZV07bGV0IHQ9MCxyPTA7MDxlJiYoZD1vW2UtMV0sdD1kLm9yaWdpbmFsU3RhcnQrZC5vcmlnaW5hbExlbmd0aCxyPWQubW9kaWZpZWRTdGFydCtkLm1vZGlmaWVkTGVuZ3RoKTt2YXIgbD0wPEMub3JpZ2luYWxMZW5ndGgsdT0wPEMubW9kaWZpZWRMZW5ndGg7bGV0IG49MCxpPXRoaXMuX2JvdW5kYXJ5U2NvcmUoQy5vcmlnaW5hbFN0YXJ0LEMub3JpZ2luYWxMZW5ndGgsQy5tb2RpZmllZFN0YXJ0LEMubW9kaWZpZWRMZW5ndGgpO2ZvcihsZXQgZT0xOztlKyspe3ZhciBoPUMub3JpZ2luYWxTdGFydC1lLGM9Qy5tb2RpZmllZFN0YXJ0LWU7aWYoaDx0fHxjPHIpYnJlYWs7aWYobCYmIXRoaXMuT3JpZ2luYWxFbGVtZW50c0FyZUVxdWFsKGgsaCtDLm9yaWdpbmFsTGVuZ3RoKSlicmVhaztpZih1JiYhdGhpcy5Nb2RpZmllZEVsZW1lbnRzQXJlRXF1YWwoYyxjK0MubW9kaWZpZWRMZW5ndGgpKWJyZWFrO2M9KGg9PT10JiZjPT09cj81OjApK3RoaXMuX2JvdW5kYXJ5U2NvcmUoaCxDLm9yaWdpbmFsTGVuZ3RoLGMsQy5tb2RpZmllZExlbmd0aCk7Yz5pJiYoaT1jLG49ZSl9Qy5vcmlnaW5hbFN0YXJ0LT1uLEMubW9kaWZpZWRTdGFydC09bjt2YXIgZD1bbnVsbF07MDxlJiZ0aGlzLkNoYW5nZXNPdmVybGFwKG9bZS0xXSxvW2VdLGQpJiYob1tlLTFdPWRbMF0sby5zcGxpY2UoZSwxKSxlKyspfWlmKHRoaXMuX2hhc1N0cmluZ3MpZm9yKGxldCBlPTEsdD1vLmxlbmd0aDtlPHQ7ZSsrKXtjb25zdCBTPW9bZS0xXSx3PW9bZV07dmFyIGY9dy5vcmlnaW5hbFN0YXJ0LVMub3JpZ2luYWxTdGFydC1TLm9yaWdpbmFsTGVuZ3RoLG09Uy5vcmlnaW5hbFN0YXJ0LGc9dy5vcmlnaW5hbFN0YXJ0K3cub3JpZ2luYWxMZW5ndGgscD1nLW0sdj1TLm1vZGlmaWVkU3RhcnQseT13Lm1vZGlmaWVkU3RhcnQrdy5tb2RpZmllZExlbmd0aCxiPXktdjtmPDUmJnA8MjAmJmI8MjAmJigodj10aGlzLl9maW5kQmV0dGVyQ29udGlndW91c1NlcXVlbmNlKG0scCx2LGIsZikpJiYoW2Isdl09dixiPT09Uy5vcmlnaW5hbFN0YXJ0K1Mub3JpZ2luYWxMZW5ndGgmJnY9PT1TLm1vZGlmaWVkU3RhcnQrUy5tb2RpZmllZExlbmd0aHx8KFMub3JpZ2luYWxMZW5ndGg9Yi1TLm9yaWdpbmFsU3RhcnQsUy5tb2RpZmllZExlbmd0aD12LVMubW9kaWZpZWRTdGFydCx3Lm9yaWdpbmFsU3RhcnQ9YitmLHcubW9kaWZpZWRTdGFydD12K2Ysdy5vcmlnaW5hbExlbmd0aD1nLXcub3JpZ2luYWxTdGFydCx3Lm1vZGlmaWVkTGVuZ3RoPXktdy5tb2RpZmllZFN0YXJ0KSkpfXJldHVybiBvfV9maW5kQmV0dGVyQ29udGlndW91c1NlcXVlbmNlKGUsdCxyLG4saSl7aWYodDxpfHxuPGkpcmV0dXJuIG51bGw7dmFyIG89ZSt0LWkrMSxzPXIrbi1pKzE7bGV0IGE9MCxsPTAsdT0wO2ZvcihsZXQgdD1lO3Q8bzt0KyspZm9yKGxldCBlPXI7ZTxzO2UrKyl7dmFyIGg9dGhpcy5fY29udGlndW91c1NlcXVlbmNlU2NvcmUodCxlLGkpOzA8aCYmaD5hJiYoYT1oLGw9dCx1PWUpfXJldHVybiAwPGE/W2wsdV06bnVsbH1fY29udGlndW91c1NlcXVlbmNlU2NvcmUodCxyLG4pe2xldCBpPTA7Zm9yKGxldCBlPTA7ZTxuO2UrKyl7aWYoIXRoaXMuRWxlbWVudHNBcmVFcXVhbCh0K2UscitlKSlyZXR1cm4gMDtpKz10aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW3QrZV0ubGVuZ3RofXJldHVybiBpfV9PcmlnaW5hbElzQm91bmRhcnkoZSl7cmV0dXJuIGU8PTB8fGU+PXRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2gubGVuZ3RoLTF8fHRoaXMuX2hhc1N0cmluZ3MmJi9eXHMqJC8udGVzdCh0aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW2VdKX1fT3JpZ2luYWxSZWdpb25Jc0JvdW5kYXJ5KGUsdCl7aWYodGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KGUpfHx0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkoZS0xKSlyZXR1cm4hMDtpZigwPHQpe3Q9ZSt0O2lmKHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeSh0LTEpfHx0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkodCkpcmV0dXJuITB9cmV0dXJuITF9X01vZGlmaWVkSXNCb3VuZGFyeShlKXtyZXR1cm4gZTw9MHx8ZT49dGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGgtMXx8dGhpcy5faGFzU3RyaW5ncyYmL15ccyokLy50ZXN0KHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbZV0pfV9Nb2RpZmllZFJlZ2lvbklzQm91bmRhcnkoZSx0KXtpZih0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkoZSl8fHRoaXMuX01vZGlmaWVkSXNCb3VuZGFyeShlLTEpKXJldHVybiEwO2lmKDA8dCl7dD1lK3Q7aWYodGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KHQtMSl8fHRoaXMuX01vZGlmaWVkSXNCb3VuZGFyeSh0KSlyZXR1cm4hMH1yZXR1cm4hMX1fYm91bmRhcnlTY29yZShlLHQscixuKXtyZXR1cm4odGhpcy5fT3JpZ2luYWxSZWdpb25Jc0JvdW5kYXJ5KGUsdCk/MTowKSsodGhpcy5fTW9kaWZpZWRSZWdpb25Jc0JvdW5kYXJ5KHIsbik/MTowKX1Db25jYXRlbmF0ZUNoYW5nZXMoZSx0KXt2YXIgcj1bXTtpZigwPT09ZS5sZW5ndGh8fDA9PT10Lmxlbmd0aClyZXR1cm4gMDx0Lmxlbmd0aD90OmU7aWYodGhpcy5DaGFuZ2VzT3ZlcmxhcChlW2UubGVuZ3RoLTFdLHRbMF0scikpe2NvbnN0IG49bmV3IEFycmF5KGUubGVuZ3RoK3QubGVuZ3RoLTEpO3JldHVybiByZS5Db3B5KGUsMCxuLDAsZS5sZW5ndGgtMSksbltlLmxlbmd0aC0xXT1yWzBdLHJlLkNvcHkodCwxLG4sZS5sZW5ndGgsdC5sZW5ndGgtMSksbn1yPW5ldyBBcnJheShlLmxlbmd0aCt0Lmxlbmd0aCk7cmV0dXJuIHJlLkNvcHkoZSwwLHIsMCxlLmxlbmd0aCkscmUuQ29weSh0LDAscixlLmxlbmd0aCx0Lmxlbmd0aCkscn1DaGFuZ2VzT3ZlcmxhcChyLG4saSl7aWYodGUuQXNzZXJ0KHIub3JpZ2luYWxTdGFydDw9bi5vcmlnaW5hbFN0YXJ0LCJMZWZ0IGNoYW5nZSBpcyBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHJpZ2h0IGNoYW5nZSIpLHRlLkFzc2VydChyLm1vZGlmaWVkU3RhcnQ8PW4ubW9kaWZpZWRTdGFydCwiTGVmdCBjaGFuZ2UgaXMgbm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byByaWdodCBjaGFuZ2UiKSxyLm9yaWdpbmFsU3RhcnQrci5vcmlnaW5hbExlbmd0aD49bi5vcmlnaW5hbFN0YXJ0fHxyLm1vZGlmaWVkU3RhcnQrci5tb2RpZmllZExlbmd0aD49bi5tb2RpZmllZFN0YXJ0KXt2YXIgbz1yLm9yaWdpbmFsU3RhcnQ7bGV0IGU9ci5vcmlnaW5hbExlbmd0aDt2YXIgcz1yLm1vZGlmaWVkU3RhcnQ7bGV0IHQ9ci5tb2RpZmllZExlbmd0aDtyZXR1cm4gci5vcmlnaW5hbFN0YXJ0K3Iub3JpZ2luYWxMZW5ndGg+PW4ub3JpZ2luYWxTdGFydCYmKGU9bi5vcmlnaW5hbFN0YXJ0K24ub3JpZ2luYWxMZW5ndGgtci5vcmlnaW5hbFN0YXJ0KSxyLm1vZGlmaWVkU3RhcnQrci5tb2RpZmllZExlbmd0aD49bi5tb2RpZmllZFN0YXJ0JiYodD1uLm1vZGlmaWVkU3RhcnQrbi5tb2RpZmllZExlbmd0aC1yLm1vZGlmaWVkU3RhcnQpLGlbMF09bmV3IFEobyxlLHMsdCksITB9cmV0dXJuIGlbMF09bnVsbCwhMX1DbGlwRGlhZ29uYWxCb3VuZChlLHQscixuKXtpZigwPD1lJiZlPG4pcmV0dXJuIGU7dD10JTI9PTA7cmV0dXJuIGU8MD90PT0ociUyPT0wKT8wOjE6dD09KChuLXItMSklMj09MCk/bi0xOm4tMn19bGV0IG9lO2lmKHZvaWQgMCE9PV8udnNjb2RlJiZ2b2lkIDAhPT1fLnZzY29kZS5wcm9jZXNzKXtjb25zdCBobz1fLnZzY29kZS5wcm9jZXNzO29lPXtnZXQgcGxhdGZvcm0oKXtyZXR1cm4gaG8ucGxhdGZvcm19LGdldCBhcmNoKCl7cmV0dXJuIGhvLmFyY2h9LGdldCBlbnYoKXtyZXR1cm4gaG8uZW52fSxjd2QoKXtyZXR1cm4gaG8uY3dkKCl9fX1lbHNlIG9lPSJ1bmRlZmluZWQiIT10eXBlb2YgcHJvY2Vzcz97Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIHByb2Nlc3MucGxhdGZvcm19LGdldCBhcmNoKCl7cmV0dXJuIHByb2Nlc3MuYXJjaH0sZ2V0IGVudigpe3JldHVybiBwcm9jZXNzLmVudn0sY3dkKCl7cmV0dXJuIHByb2Nlc3MuZW52LlZTQ09ERV9DV0R8fHByb2Nlc3MuY3dkKCl9fTp7Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIHg/IndpbjMyIjpFPyJkYXJ3aW4iOiJsaW51eCJ9LGdldCBhcmNoKCl7fSxnZXQgZW52KCl7cmV0dXJue319LGN3ZCgpe3JldHVybiIvIn19O2NvbnN0IHNlPW9lLmN3ZCxhZT1vZS5lbnY7dmFyIGxlLHVlLGhlLGNlLGRlLGZlLG1lLGdlLHBlLHc9b2UucGxhdGZvcm07Y2xhc3MgdmUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHQscil7bGV0IG47InN0cmluZyI9PXR5cGVvZiB0JiYwPT09dC5pbmRleE9mKCJub3QgIik/KG49Im11c3Qgbm90IGJlIix0PXQucmVwbGFjZSgvXm5vdCAvLCIiKSk6bj0ibXVzdCBiZSI7dmFyIGk9LTEhPT1lLmluZGV4T2YoIi4iKT8icHJvcGVydHkiOiJhcmd1bWVudCIsdD1gVGhlICIke2V9IiAke2l9ICR7bn0gb2YgdHlwZSBgK3Q7c3VwZXIodCs9Ii4gUmVjZWl2ZWQgdHlwZSAiK3R5cGVvZiByKSx0aGlzLmNvZGU9IkVSUl9JTlZBTElEX0FSR19UWVBFIn19ZnVuY3Rpb24geWUoZSx0KXtpZigic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IHZlKHQsInN0cmluZyIsZSl9ZnVuY3Rpb24gYmUoZSl7cmV0dXJuIDQ3PT09ZXx8OTI9PT1lfWZ1bmN0aW9uIF9lKGUpe3JldHVybiA0Nz09PWV9ZnVuY3Rpb24gQ2UoZSl7cmV0dXJuIDY1PD1lJiZlPD05MHx8OTc8PWUmJmU8PTEyMn1mdW5jdGlvbiBTZSh0LHIsbixpKXtsZXQgbz0iIixzPTAsYT0tMSxsPTAsdT0wO2ZvcihsZXQgZT0wO2U8PXQubGVuZ3RoOysrZSl7aWYoZTx0Lmxlbmd0aCl1PXQuY2hhckNvZGVBdChlKTtlbHNle2lmKGkodSkpYnJlYWs7dT00N31pZihpKHUpKXtpZihhIT09ZS0xJiYxIT09bClpZigyPT09bCl7aWYoby5sZW5ndGg8Mnx8MiE9PXN8fDQ2IT09by5jaGFyQ29kZUF0KG8ubGVuZ3RoLTEpfHw0NiE9PW8uY2hhckNvZGVBdChvLmxlbmd0aC0yKSl7aWYoMjxvLmxlbmd0aCl7dmFyIGg9by5sYXN0SW5kZXhPZihuKTtzPS0xPT09aD8obz0iIiwwKToobz1vLnNsaWNlKDAsaCksby5sZW5ndGgtMS1vLmxhc3RJbmRleE9mKG4pKSxhPWUsbD0wO2NvbnRpbnVlfWlmKDAhPT1vLmxlbmd0aCl7bz0iIixzPTAsYT1lLGw9MDtjb250aW51ZX19ciYmKG8rPTA8by5sZW5ndGg/bisiLi4iOiIuLiIscz0yKX1lbHNlIDA8by5sZW5ndGg/bys9IiIrbit0LnNsaWNlKGErMSxlKTpvPXQuc2xpY2UoYSsxLGUpLHM9ZS1hLTE7YT1lLGw9MH1lbHNlIDQ2PT09dSYmLTEhPT1sPysrbDpsPS0xfXJldHVybiBvfWZ1bmN0aW9uIHdlKGUsdCl7aWYobnVsbD09PXR8fCJvYmplY3QiIT10eXBlb2YgdCl0aHJvdyBuZXcgdmUoInBhdGhPYmplY3QiLCJPYmplY3QiLHQpO3ZhciByPXQuZGlyfHx0LnJvb3Qsbj10LmJhc2V8fCIiKyh0Lm5hbWV8fCIiKSsodC5leHR8fCIiKTtyZXR1cm4gcj9yPT09dC5yb290PyIiK3IrbjoiIityK2UrbjpufWNvbnN0IEFlPXtyZXNvbHZlKC4uLm8pe2xldCBzPSIiLGE9IiIsbD0hMTtmb3IobGV0IHQ9by5sZW5ndGgtMTstMTw9dDt0LS0pe2xldCByO2lmKDA8PXQpe2lmKHI9b1t0XSx5ZShyLCJwYXRoIiksMD09PXIubGVuZ3RoKWNvbnRpbnVlfWVsc2UgMD09PXMubGVuZ3RoP3I9c2UoKToocj1hZVsiPSIrc118fHNlKCksKHZvaWQgMD09PXJ8fHIuc2xpY2UoMCwyKS50b0xvd2VyQ2FzZSgpIT09cy50b0xvd2VyQ2FzZSgpJiY5Mj09PXIuY2hhckNvZGVBdCgyKSkmJihyPXMrIlxcIikpO3ZhciB1PXIubGVuZ3RoO2xldCBuPTAsaT0iIixlPSExO3ZhciBoPXIuY2hhckNvZGVBdCgwKTtpZigxPT09dSliZShoKSYmKG49MSxlPSEwKTtlbHNlIGlmKGJlKGgpKWlmKGU9ITAsYmUoci5jaGFyQ29kZUF0KDEpKSl7bGV0IGU9Mix0PWU7Zm9yKDtlPHUmJiFiZShyLmNoYXJDb2RlQXQoZSkpOyllKys7aWYoZTx1JiZlIT09dCl7dmFyIGM9ci5zbGljZSh0LGUpO2Zvcih0PWU7ZTx1JiZiZShyLmNoYXJDb2RlQXQoZSkpOyllKys7aWYoZTx1JiZlIT09dCl7Zm9yKHQ9ZTtlPHUmJiFiZShyLmNoYXJDb2RlQXQoZSkpOyllKys7ZSE9PXUmJmU9PT10fHwoaT1gXFxcXCR7Y31cXGArci5zbGljZSh0LGUpLG49ZSl9fX1lbHNlIG49MTtlbHNlIENlKGgpJiY1OD09PXIuY2hhckNvZGVBdCgxKSYmKGk9ci5zbGljZSgwLDIpLChuPTIpPHUmJmJlKHIuY2hhckNvZGVBdCgyKSkmJihlPSEwLG49MykpO2lmKDA8aS5sZW5ndGgpaWYoMDxzLmxlbmd0aCl7aWYoaS50b0xvd2VyQ2FzZSgpIT09cy50b0xvd2VyQ2FzZSgpKWNvbnRpbnVlfWVsc2Ugcz1pO2lmKGwpe2lmKDA8cy5sZW5ndGgpYnJlYWt9ZWxzZSBpZihhPXIuc2xpY2UobikrIlxcIithLGw9ZSxlJiYwPHMubGVuZ3RoKWJyZWFrfXJldHVybiBhPVNlKGEsIWwsIlxcIixiZSksbD9zKyJcXCIrYToiIitzK2F8fCIuIn0sbm9ybWFsaXplKHIpe3llKHIsInBhdGgiKTt2YXIgbj1yLmxlbmd0aDtpZigwPT09bilyZXR1cm4iLiI7bGV0IGk9MCxvLGU9ITE7dmFyIHQ9ci5jaGFyQ29kZUF0KDApO2lmKDE9PT1uKXJldHVybiBfZSh0KT8iXFwiOnI7aWYoYmUodCkpaWYoZT0hMCxiZShyLmNoYXJDb2RlQXQoMSkpKXtsZXQgZT0yLHQ9ZTtmb3IoO2U8biYmIWJlKHIuY2hhckNvZGVBdChlKSk7KWUrKztpZihlPG4mJmUhPT10KXt2YXIgcz1yLnNsaWNlKHQsZSk7Zm9yKHQ9ZTtlPG4mJmJlKHIuY2hhckNvZGVBdChlKSk7KWUrKztpZihlPG4mJmUhPT10KXtmb3IodD1lO2U8biYmIWJlKHIuY2hhckNvZGVBdChlKSk7KWUrKztpZihlPT09bilyZXR1cm5gXFxcXCR7c31cXCR7ci5zbGljZSh0KX1cXGA7ZSE9PXQmJihvPWBcXFxcJHtzfVxcYCtyLnNsaWNlKHQsZSksaT1lKX19fWVsc2UgaT0xO2Vsc2UgQ2UodCkmJjU4PT09ci5jaGFyQ29kZUF0KDEpJiYobz1yLnNsaWNlKDAsMiksKGk9Mik8biYmYmUoci5jaGFyQ29kZUF0KDIpKSYmKGU9ITAsaT0zKSk7bGV0IGE9aTxuP1NlKHIuc2xpY2UoaSksIWUsIlxcIixiZSk6IiI7cmV0dXJuIDAhPT1hLmxlbmd0aHx8ZXx8KGE9Ii4iKSwwPGEubGVuZ3RoJiZiZShyLmNoYXJDb2RlQXQobi0xKSkmJihhKz0iXFwiKSx2b2lkIDA9PT1vP2U/IlxcIithOmE6ZT9vKyJcXCIrYToiIitvK2F9LGlzQWJzb2x1dGUoZSl7eWUoZSwicGF0aCIpO3ZhciB0PWUubGVuZ3RoO2lmKDA9PT10KXJldHVybiExO3ZhciByPWUuY2hhckNvZGVBdCgwKTtyZXR1cm4gYmUocil8fDI8dCYmQ2UocikmJjU4PT09ZS5jaGFyQ29kZUF0KDEpJiZiZShlLmNoYXJDb2RlQXQoMikpfSxqb2luKC4uLnQpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4iLiI7bGV0IHIsbjtmb3IobGV0IGU9MDtlPHQubGVuZ3RoOysrZSl7dmFyIGk9dFtlXTt5ZShpLCJwYXRoIiksMDxpLmxlbmd0aCYmKHZvaWQgMD09PXI/cj1uPWk6cis9IlxcIitpKX1pZih2b2lkIDA9PT1yKXJldHVybiIuIjtsZXQgZT0hMCxvPTA7dmFyIHM7aWYoInN0cmluZyI9PXR5cGVvZiBuJiZiZShuLmNoYXJDb2RlQXQoMCkpJiYoKytvLDE8KHM9bi5sZW5ndGgpJiZiZShuLmNoYXJDb2RlQXQoMSkpJiYoKytvLDI8cyYmKGJlKG4uY2hhckNvZGVBdCgyKSk/KytvOmU9ITEpKSksZSl7Zm9yKDtvPHIubGVuZ3RoJiZiZShyLmNoYXJDb2RlQXQobykpOylvKys7Mjw9byYmKHI9IlxcIityLnNsaWNlKG8pKX1yZXR1cm4gQWUubm9ybWFsaXplKHIpfSxyZWxhdGl2ZShlLHQpe2lmKHllKGUsImZyb20iKSx5ZSh0LCJ0byIpLGU9PT10KXJldHVybiIiO2NvbnN0IHI9QWUucmVzb2x2ZShlKSxuPUFlLnJlc29sdmUodCk7aWYocj09PW4pcmV0dXJuIiI7aWYoKGU9ci50b0xvd2VyQ2FzZSgpKT09PSh0PW4udG9Mb3dlckNhc2UoKSkpcmV0dXJuIiI7bGV0IGk9MDtmb3IoO2k8ZS5sZW5ndGgmJjkyPT09ZS5jaGFyQ29kZUF0KGkpOylpKys7bGV0IG89ZS5sZW5ndGg7Zm9yKDtvLTE+aSYmOTI9PT1lLmNoYXJDb2RlQXQoby0xKTspby0tO3ZhciBzPW8taTtsZXQgYT0wO2Zvcig7YTx0Lmxlbmd0aCYmOTI9PT10LmNoYXJDb2RlQXQoYSk7KWErKztsZXQgbD10Lmxlbmd0aDtmb3IoO2wtMT5hJiY5Mj09PXQuY2hhckNvZGVBdChsLTEpOylsLS07dmFyIHU9bC1hLGg9czx1P3M6dTtsZXQgYz0tMSxkPTA7Zm9yKDtkPGg7ZCsrKXt2YXIgZj1lLmNoYXJDb2RlQXQoaStkKTtpZihmIT09dC5jaGFyQ29kZUF0KGErZCkpYnJlYWs7OTI9PT1mJiYoYz1kKX1pZihkIT09aCl7aWYoLTE9PT1jKXJldHVybiBufWVsc2V7aWYoaDx1KXtpZig5Mj09PXQuY2hhckNvZGVBdChhK2QpKXJldHVybiBuLnNsaWNlKGErZCsxKTtpZigyPT09ZClyZXR1cm4gbi5zbGljZShhK2QpfWg8cyYmKDkyPT09ZS5jaGFyQ29kZUF0KGkrZCk/Yz1kOjI9PT1kJiYoYz0zKSksLTE9PT1jJiYoYz0wKX1sZXQgbT0iIjtmb3IoZD1pK2MrMTtkPD1vOysrZClkIT09byYmOTIhPT1lLmNoYXJDb2RlQXQoZCl8fChtKz0wPT09bS5sZW5ndGg/Ii4uIjoiXFwuLiIpO3JldHVybiBhKz1jLDA8bS5sZW5ndGg/IiIrbStuLnNsaWNlKGEsbCk6KDkyPT09bi5jaGFyQ29kZUF0KGEpJiYrK2Esbi5zbGljZShhLGwpKX0sdG9OYW1lc3BhY2VkUGF0aChlKXtpZigic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIGU7aWYoMD09PWUubGVuZ3RoKXJldHVybiIiO2NvbnN0IHQ9QWUucmVzb2x2ZShlKTtpZih0Lmxlbmd0aDw9MilyZXR1cm4gZTtpZig5Mj09PXQuY2hhckNvZGVBdCgwKSl7aWYoOTI9PT10LmNoYXJDb2RlQXQoMSkpe3ZhciByPXQuY2hhckNvZGVBdCgyKTtpZig2MyE9PXImJjQ2IT09cilyZXR1cm4iXFxcXD9cXFVOQ1xcIit0LnNsaWNlKDIpfX1lbHNlIGlmKENlKHQuY2hhckNvZGVBdCgwKSkmJjU4PT09dC5jaGFyQ29kZUF0KDEpJiY5Mj09PXQuY2hhckNvZGVBdCgyKSlyZXR1cm4iXFxcXD9cXCIrdDtyZXR1cm4gZX0sZGlybmFtZShyKXt5ZShyLCJwYXRoIik7dmFyIG49ci5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIi4iO2xldCBpPS0xLG89MDt2YXIgZT1yLmNoYXJDb2RlQXQoMCk7aWYoMT09PW4pcmV0dXJuIGJlKGUpP3I6Ii4iO2lmKGJlKGUpKXtpZihpPW89MSxiZShyLmNoYXJDb2RlQXQoMSkpKXtsZXQgZT0yLHQ9ZTtmb3IoO2U8biYmIWJlKHIuY2hhckNvZGVBdChlKSk7KWUrKztpZihlPG4mJmUhPT10KXtmb3IodD1lO2U8biYmYmUoci5jaGFyQ29kZUF0KGUpKTspZSsrO2lmKGU8biYmZSE9PXQpe2Zvcih0PWU7ZTxuJiYhYmUoci5jaGFyQ29kZUF0KGUpKTspZSsrO2lmKGU9PT1uKXJldHVybiByO2UhPT10JiYoaT1vPWUrMSl9fX19ZWxzZSBDZShlKSYmNTg9PT1yLmNoYXJDb2RlQXQoMSkmJihpPTI8biYmYmUoci5jaGFyQ29kZUF0KDIpKT8zOjIsbz1pKTtsZXQgdD0tMSxzPSEwO2ZvcihsZXQgZT1uLTE7ZT49bzstLWUpaWYoYmUoci5jaGFyQ29kZUF0KGUpKSl7aWYoIXMpe3Q9ZTticmVha319ZWxzZSBzPSExO2lmKC0xPT09dCl7aWYoLTE9PT1pKXJldHVybiIuIjt0PWl9cmV0dXJuIHIuc2xpY2UoMCx0KX0sYmFzZW5hbWUocixuKXt2b2lkIDAhPT1uJiZ5ZShuLCJleHQiKSx5ZShyLCJwYXRoIik7bGV0IGk9MCxvPS0xLHM9ITAsYTtpZigyPD1yLmxlbmd0aCYmQ2Uoci5jaGFyQ29kZUF0KDApKSYmNTg9PT1yLmNoYXJDb2RlQXQoMSkmJihpPTIpLHZvaWQgMCE9PW4mJjA8bi5sZW5ndGgmJm4ubGVuZ3RoPD1yLmxlbmd0aCl7aWYobj09PXIpcmV0dXJuIiI7bGV0IGU9bi5sZW5ndGgtMSx0PS0xO2ZvcihhPXIubGVuZ3RoLTE7YT49aTstLWEpe3ZhciBsPXIuY2hhckNvZGVBdChhKTtpZihiZShsKSl7aWYoIXMpe2k9YSsxO2JyZWFrfX1lbHNlLTE9PT10JiYocz0hMSx0PWErMSksMDw9ZSYmKGw9PT1uLmNoYXJDb2RlQXQoZSk/LTE9PS0tZSYmKG89YSk6KGU9LTEsbz10KSl9cmV0dXJuIGk9PT1vP289dDotMT09PW8mJihvPXIubGVuZ3RoKSxyLnNsaWNlKGksbyl9Zm9yKGE9ci5sZW5ndGgtMTthPj1pOy0tYSlpZihiZShyLmNoYXJDb2RlQXQoYSkpKXtpZighcyl7aT1hKzE7YnJlYWt9fWVsc2UtMT09PW8mJihzPSExLG89YSsxKTtyZXR1cm4tMT09PW8/IiI6ci5zbGljZShpLG8pfSxleHRuYW1lKHQpe3llKHQsInBhdGgiKTtsZXQgcj0wLG49LTEsaT0wLG89LTEscz0hMCxhPTA7Mjw9dC5sZW5ndGgmJjU4PT09dC5jaGFyQ29kZUF0KDEpJiZDZSh0LmNoYXJDb2RlQXQoMCkpJiYocj1pPTIpO2ZvcihsZXQgZT10Lmxlbmd0aC0xO2U+PXI7LS1lKXt2YXIgbD10LmNoYXJDb2RlQXQoZSk7aWYoYmUobCkpe2lmKHMpY29udGludWU7aT1lKzE7YnJlYWt9LTE9PT1vJiYocz0hMSxvPWUrMSksNDY9PT1sPy0xPT09bj9uPWU6MSE9PWEmJihhPTEpOi0xIT09biYmKGE9LTEpfXJldHVybi0xPT09bnx8LTE9PT1vfHwwPT09YXx8MT09PWEmJm49PT1vLTEmJm49PT1pKzE/IiI6dC5zbGljZShuLG8pfSxmb3JtYXQ6d2UuYmluZChudWxsLCJcXCIpLHBhcnNlKHIpe3llKHIsInBhdGgiKTtjb25zdCBlPXtyb290OiIiLGRpcjoiIixiYXNlOiIiLGV4dDoiIixuYW1lOiIifTtpZigwPT09ci5sZW5ndGgpcmV0dXJuIGU7dmFyIG49ci5sZW5ndGg7bGV0IGk9MCx0PXIuY2hhckNvZGVBdCgwKTtpZigxPT09bilyZXR1cm4gYmUodCk/ZS5yb290PWUuZGlyPXI6ZS5iYXNlPWUubmFtZT1yLGU7aWYoYmUodCkpe2lmKGk9MSxiZShyLmNoYXJDb2RlQXQoMSkpKXtsZXQgZT0yLHQ9ZTtmb3IoO2U8biYmIWJlKHIuY2hhckNvZGVBdChlKSk7KWUrKztpZihlPG4mJmUhPT10KXtmb3IodD1lO2U8biYmYmUoci5jaGFyQ29kZUF0KGUpKTspZSsrO2lmKGU8biYmZSE9PXQpe2Zvcih0PWU7ZTxuJiYhYmUoci5jaGFyQ29kZUF0KGUpKTspZSsrO2U9PT1uP2k9ZTplIT09dCYmKGk9ZSsxKX19fX1lbHNlIGlmKENlKHQpJiY1OD09PXIuY2hhckNvZGVBdCgxKSl7aWYobjw9MilyZXR1cm4gZS5yb290PWUuZGlyPXIsZTtpZihpPTIsYmUoci5jaGFyQ29kZUF0KDIpKSl7aWYoMz09PW4pcmV0dXJuIGUucm9vdD1lLmRpcj1yLGU7aT0zfX0wPGkmJihlLnJvb3Q9ci5zbGljZSgwLGkpKTtsZXQgbz0tMSxzPWksYT0tMSxsPSEwLHU9ci5sZW5ndGgtMSxoPTA7Zm9yKDt1Pj1pOy0tdSl7aWYodD1yLmNoYXJDb2RlQXQodSksYmUodCkpe2lmKGwpY29udGludWU7cz11KzE7YnJlYWt9LTE9PT1hJiYobD0hMSxhPXUrMSksNDY9PT10Py0xPT09bz9vPXU6MSE9PWgmJihoPTEpOi0xIT09byYmKGg9LTEpfXJldHVybi0xIT09YSYmKC0xPT09b3x8MD09PWh8fDE9PT1oJiZvPT09YS0xJiZvPT09cysxP2UuYmFzZT1lLm5hbWU9ci5zbGljZShzLGEpOihlLm5hbWU9ci5zbGljZShzLG8pLGUuYmFzZT1yLnNsaWNlKHMsYSksZS5leHQ9ci5zbGljZShvLGEpKSksMDxzJiZzIT09aT9lLmRpcj1yLnNsaWNlKDAscy0xKTplLmRpcj1lLnJvb3QsZX0sc2VwOiJcXCIsZGVsaW1pdGVyOiI7Iix3aW4zMjpudWxsLHBvc2l4Om51bGx9LHhlPXtyZXNvbHZlKC4uLnQpe2xldCByPSIiLG49ITE7Zm9yKGxldCBlPXQubGVuZ3RoLTE7LTE8PWUmJiFuO2UtLSl7Y29uc3QgaT0wPD1lP3RbZV06c2UoKTt5ZShpLCJwYXRoIiksMCE9PWkubGVuZ3RoJiYocj1pKyIvIityLG49NDc9PT1pLmNoYXJDb2RlQXQoMCkpfXJldHVybiByPVNlKHIsIW4sIi8iLF9lKSxuPyIvIityOjA8ci5sZW5ndGg/cjoiLiJ9LG5vcm1hbGl6ZShlKXtpZih5ZShlLCJwYXRoIiksMD09PWUubGVuZ3RoKXJldHVybiIuIjt2YXIgdD00Nz09PWUuY2hhckNvZGVBdCgwKSxyPTQ3PT09ZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpO3JldHVybiAwPT09KGU9U2UoZSwhdCwiLyIsX2UpKS5sZW5ndGg/dD8iLyI6cj8iLi8iOiIuIjoociYmKGUrPSIvIiksdD8iLyIrZTplKX0saXNBYnNvbHV0ZShlKXtyZXR1cm4geWUoZSwicGF0aCIpLDA8ZS5sZW5ndGgmJjQ3PT09ZS5jaGFyQ29kZUF0KDApfSxqb2luKC4uLnQpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4iLiI7bGV0IHI7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDsrK2Upe3ZhciBuPXRbZV07eWUobiwicGF0aCIpLDA8bi5sZW5ndGgmJih2b2lkIDA9PT1yP3I9bjpyKz0iLyIrbil9cmV0dXJuIHZvaWQgMD09PXI/Ii4iOnhlLm5vcm1hbGl6ZShyKX0scmVsYXRpdmUoZSx0KXtpZih5ZShlLCJmcm9tIikseWUodCwidG8iKSxlPT09dClyZXR1cm4iIjtpZigoZT14ZS5yZXNvbHZlKGUpKT09PSh0PXhlLnJlc29sdmUodCkpKXJldHVybiIiO3ZhciByPWUubGVuZ3RoLG49ci0xLGk9dC5sZW5ndGgtMSxvPW48aT9uOmk7bGV0IHM9LTEsYT0wO2Zvcig7YTxvO2ErKyl7dmFyIGw9ZS5jaGFyQ29kZUF0KDErYSk7aWYobCE9PXQuY2hhckNvZGVBdCgxK2EpKWJyZWFrOzQ3PT09bCYmKHM9YSl9aWYoYT09PW8paWYobzxpKXtpZig0Nz09PXQuY2hhckNvZGVBdCgxK2EpKXJldHVybiB0LnNsaWNlKDErYSsxKTtpZigwPT09YSlyZXR1cm4gdC5zbGljZSgxK2EpfWVsc2UgbzxuJiYoNDc9PT1lLmNoYXJDb2RlQXQoMSthKT9zPWE6MD09PWEmJihzPTApKTtsZXQgdT0iIjtmb3IoYT0xK3MrMTthPD1yOysrYSlhIT09ciYmNDchPT1lLmNoYXJDb2RlQXQoYSl8fCh1Kz0wPT09dS5sZW5ndGg/Ii4uIjoiLy4uIik7cmV0dXJuIiIrdSt0LnNsaWNlKDErcyl9LHRvTmFtZXNwYWNlZFBhdGgoZSl7cmV0dXJuIGV9LGRpcm5hbWUodCl7aWYoeWUodCwicGF0aCIpLDA9PT10Lmxlbmd0aClyZXR1cm4iLiI7dmFyIGU9NDc9PT10LmNoYXJDb2RlQXQoMCk7bGV0IHI9LTEsbj0hMDtmb3IobGV0IGU9dC5sZW5ndGgtMTsxPD1lOy0tZSlpZig0Nz09PXQuY2hhckNvZGVBdChlKSl7aWYoIW4pe3I9ZTticmVha319ZWxzZSBuPSExO3JldHVybi0xPT09cj9lPyIvIjoiLiI6ZSYmMT09PXI/Ii8vIjp0LnNsaWNlKDAscil9LGJhc2VuYW1lKHIsbil7dm9pZCAwIT09biYmeWUobiwiZXh0IikseWUociwicGF0aCIpO2xldCBpPTAsbz0tMSxzPSEwLGE7aWYodm9pZCAwIT09biYmMDxuLmxlbmd0aCYmbi5sZW5ndGg8PXIubGVuZ3RoKXtpZihuPT09cilyZXR1cm4iIjtsZXQgZT1uLmxlbmd0aC0xLHQ9LTE7Zm9yKGE9ci5sZW5ndGgtMTswPD1hOy0tYSl7dmFyIGw9ci5jaGFyQ29kZUF0KGEpO2lmKDQ3PT09bCl7aWYoIXMpe2k9YSsxO2JyZWFrfX1lbHNlLTE9PT10JiYocz0hMSx0PWErMSksMDw9ZSYmKGw9PT1uLmNoYXJDb2RlQXQoZSk/LTE9PS0tZSYmKG89YSk6KGU9LTEsbz10KSl9cmV0dXJuIGk9PT1vP289dDotMT09PW8mJihvPXIubGVuZ3RoKSxyLnNsaWNlKGksbyl9Zm9yKGE9ci5sZW5ndGgtMTswPD1hOy0tYSlpZig0Nz09PXIuY2hhckNvZGVBdChhKSl7aWYoIXMpe2k9YSsxO2JyZWFrfX1lbHNlLTE9PT1vJiYocz0hMSxvPWErMSk7cmV0dXJuLTE9PT1vPyIiOnIuc2xpY2UoaSxvKX0sZXh0bmFtZSh0KXt5ZSh0LCJwYXRoIik7bGV0IHI9LTEsbj0wLGk9LTEsbz0hMCxzPTA7Zm9yKGxldCBlPXQubGVuZ3RoLTE7MDw9ZTstLWUpe3ZhciBhPXQuY2hhckNvZGVBdChlKTtpZig0Nz09PWEpe2lmKG8pY29udGludWU7bj1lKzE7YnJlYWt9LTE9PT1pJiYobz0hMSxpPWUrMSksNDY9PT1hPy0xPT09cj9yPWU6MSE9PXMmJihzPTEpOi0xIT09ciYmKHM9LTEpfXJldHVybi0xPT09cnx8LTE9PT1pfHwwPT09c3x8MT09PXMmJnI9PT1pLTEmJnI9PT1uKzE/IiI6dC5zbGljZShyLGkpfSxmb3JtYXQ6d2UuYmluZChudWxsLCIvIikscGFyc2UoZSl7eWUoZSwicGF0aCIpO2NvbnN0IHQ9e3Jvb3Q6IiIsZGlyOiIiLGJhc2U6IiIsZXh0OiIiLG5hbWU6IiJ9O2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gdDt2YXIgcj00Nz09PWUuY2hhckNvZGVBdCgwKTtsZXQgbjtuPXI/KHQucm9vdD0iLyIsMSk6MDtsZXQgaT0tMSxvPTAscz0tMSxhPSEwLGw9ZS5sZW5ndGgtMSx1PTA7Zm9yKDtsPj1uOy0tbCl7dmFyIGg9ZS5jaGFyQ29kZUF0KGwpO2lmKDQ3PT09aCl7aWYoYSljb250aW51ZTtvPWwrMTticmVha30tMT09PXMmJihhPSExLHM9bCsxKSw0Nj09PWg/LTE9PT1pP2k9bDoxIT09dSYmKHU9MSk6LTEhPT1pJiYodT0tMSl9aWYoLTEhPT1zKXtjb25zdCBuPTA9PT1vJiZyPzE6bzstMT09PWl8fDA9PT11fHwxPT09dSYmaT09PXMtMSYmaT09PW8rMT90LmJhc2U9dC5uYW1lPWUuc2xpY2UobixzKToodC5uYW1lPWUuc2xpY2UobixpKSx0LmJhc2U9ZS5zbGljZShuLHMpLHQuZXh0PWUuc2xpY2UoaSxzKSl9cmV0dXJuIDA8bz90LmRpcj1lLnNsaWNlKDAsby0xKTpyJiYodC5kaXI9Ii8iKSx0fSxzZXA6Ii8iLGRlbGltaXRlcjoiOiIsd2luMzI6bnVsbCxwb3NpeDpudWxsfTt4ZS53aW4zMj1BZS53aW4zMj1BZSx4ZS5wb3NpeD1BZS5wb3NpeD14ZSwoIndpbjMyIj09PXc/QWU6eGUpLm5vcm1hbGl6ZSwoIndpbjMyIj09PXc/QWU6eGUpLnJlc29sdmUsKCJ3aW4zMiI9PT13P0FlOnhlKS5yZWxhdGl2ZSwoIndpbjMyIj09PXc/QWU6eGUpLmRpcm5hbWUsKCJ3aW4zMiI9PT13P0FlOnhlKS5iYXNlbmFtZSwoIndpbjMyIj09PXc/QWU6eGUpLmV4dG5hbWUsKCJ3aW4zMiI9PT13P0FlOnhlKS5zZXA7Y29uc3QgRWU9L15cd1tcd1xkKy4tXSokLyxOZT0vXlwvLyxMZT0vXlwvXC8vO2Z1bmN0aW9uIGtlKGUsdCl7aWYoIWUuc2NoZW1lJiZ0KXRocm93IG5ldyBFcnJvcihgW1VyaUVycm9yXTogU2NoZW1lIGlzIG1pc3Npbmc6IHtzY2hlbWU6ICIiLCBhdXRob3JpdHk6ICIke2UuYXV0aG9yaXR5fSIsIHBhdGg6ICIke2UucGF0aH0iLCBxdWVyeTogIiR7ZS5xdWVyeX0iLCBmcmFnbWVudDogIiR7ZS5mcmFnbWVudH0ifWApO2lmKGUuc2NoZW1lJiYhRWUudGVzdChlLnNjaGVtZSkpdGhyb3cgbmV3IEVycm9yKCJbVXJpRXJyb3JdOiBTY2hlbWUgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzLiIpO2lmKGUucGF0aClpZihlLmF1dGhvcml0eSl7aWYoIU5lLnRlc3QoZS5wYXRoKSl0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGNvbnRhaW5zIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY29tcG9uZW50IG11c3QgZWl0aGVyIGJlIGVtcHR5IG9yIGJlZ2luIHdpdGggYSBzbGFzaCAoIi8iKSBjaGFyYWN0ZXInKX1lbHNlIGlmKExlLnRlc3QoZS5wYXRoKSl0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGRvZXMgbm90IGNvbnRhaW4gYW4gYXV0aG9yaXR5IGNvbXBvbmVudCwgdGhlbiB0aGUgcGF0aCBjYW5ub3QgYmVnaW4gd2l0aCB0d28gc2xhc2ggY2hhcmFjdGVycyAoIi8vIiknKX1jb25zdCBNZT0iLyIsVGU9L14oKFteOi8/I10rPyk6KT8oXC9cLyhbXi8/I10qKSk/KFtePyNdKikoXD8oW14jXSopKT8oIyguKikpPy87Y2xhc3MgT2V7Y29uc3RydWN0b3IoZSx0LHIsbixpLG89ITEpe3ZhciBzOyJvYmplY3QiPT10eXBlb2YgZT8odGhpcy5zY2hlbWU9ZS5zY2hlbWV8fCIiLHRoaXMuYXV0aG9yaXR5PWUuYXV0aG9yaXR5fHwiIix0aGlzLnBhdGg9ZS5wYXRofHwiIix0aGlzLnF1ZXJ5PWUucXVlcnl8fCIiLHRoaXMuZnJhZ21lbnQ9ZS5mcmFnbWVudHx8IiIpOih0aGlzLnNjaGVtZT0ocz1vLChlPWUpfHxzP2U6ImZpbGUiKSx0aGlzLmF1dGhvcml0eT10fHwiIix0aGlzLnBhdGg9ZnVuY3Rpb24oZSx0KXtzd2l0Y2goZSl7Y2FzZSJodHRwcyI6Y2FzZSJodHRwIjpjYXNlImZpbGUiOnQ/dFswXSE9PU1lJiYodD1NZSt0KTp0PU1lfXJldHVybiB0fSh0aGlzLnNjaGVtZSxyfHwiIiksdGhpcy5xdWVyeT1ufHwiIix0aGlzLmZyYWdtZW50PWl8fCIiLGtlKHRoaXMsbykpfXN0YXRpYyBpc1VyaShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE9lfHwhIWUmJigic3RyaW5nIj09dHlwZW9mIGUuYXV0aG9yaXR5JiYic3RyaW5nIj09dHlwZW9mIGUuZnJhZ21lbnQmJiJzdHJpbmciPT10eXBlb2YgZS5wYXRoJiYic3RyaW5nIj09dHlwZW9mIGUucXVlcnkmJiJzdHJpbmciPT10eXBlb2YgZS5zY2hlbWUmJiJzdHJpbmciPT10eXBlb2YgZS5mc1BhdGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLndpdGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnRvU3RyaW5nKX1nZXQgZnNQYXRoKCl7cmV0dXJuIEZlKHRoaXMsITEpfXdpdGgoZSl7aWYoIWUpcmV0dXJuIHRoaXM7bGV0e3NjaGVtZTp0LGF1dGhvcml0eTpyLHBhdGg6bixxdWVyeTppLGZyYWdtZW50Om99PWU7cmV0dXJuIHZvaWQgMD09PXQ/dD10aGlzLnNjaGVtZTpudWxsPT09dCYmKHQ9IiIpLHZvaWQgMD09PXI/cj10aGlzLmF1dGhvcml0eTpudWxsPT09ciYmKHI9IiIpLHZvaWQgMD09PW4/bj10aGlzLnBhdGg6bnVsbD09PW4mJihuPSIiKSx2b2lkIDA9PT1pP2k9dGhpcy5xdWVyeTpudWxsPT09aSYmKGk9IiIpLHZvaWQgMD09PW8/bz10aGlzLmZyYWdtZW50Om51bGw9PT1vJiYobz0iIiksdD09PXRoaXMuc2NoZW1lJiZyPT09dGhpcy5hdXRob3JpdHkmJm49PT10aGlzLnBhdGgmJmk9PT10aGlzLnF1ZXJ5JiZvPT09dGhpcy5mcmFnbWVudD90aGlzOm5ldyBQZSh0LHIsbixpLG8pfXN0YXRpYyBwYXJzZShlLHQ9ITEpe2U9VGUuZXhlYyhlKTtyZXR1cm4gZT9uZXcgUGUoZVsyXXx8IiIsVWUoZVs0XXx8IiIpLFVlKGVbNV18fCIiKSxVZShlWzddfHwiIiksVWUoZVs5XXx8IiIpLHQpOm5ldyBQZSgiIiwiIiwiIiwiIiwiIil9c3RhdGljIGZpbGUoZSl7bGV0IHQ9IiI7dmFyIHI7cmV0dXJuKGU9eD9lLnJlcGxhY2UoL1xcL2csTWUpOmUpWzBdPT09TWUmJmVbMV09PT1NZSYmKGU9LTE9PT0ocj1lLmluZGV4T2YoTWUsMikpPyh0PWUuc3Vic3RyaW5nKDIpLE1lKToodD1lLnN1YnN0cmluZygyLHIpLGUuc3Vic3RyaW5nKHIpfHxNZSkpLG5ldyBQZSgiZmlsZSIsdCxlLCIiLCIiKX1zdGF0aWMgZnJvbShlKXtlPW5ldyBQZShlLnNjaGVtZSxlLmF1dGhvcml0eSxlLnBhdGgsZS5xdWVyeSxlLmZyYWdtZW50KTtyZXR1cm4ga2UoZSwhMCksZX1zdGF0aWMgam9pblBhdGgoZSwuLi50KXtpZighZS5wYXRoKXRocm93IG5ldyBFcnJvcigiW1VyaUVycm9yXTogY2Fubm90IGNhbGwgam9pblBhdGggb24gVVJJIHdpdGhvdXQgcGF0aCIpO2xldCByO3JldHVybiByPXgmJiJmaWxlIj09PWUuc2NoZW1lP09lLmZpbGUoQWUuam9pbihGZShlLCEwKSwuLi50KSkucGF0aDp4ZS5qb2luKGUucGF0aCwuLi50KSxlLndpdGgoe3BhdGg6cn0pfXRvU3RyaW5nKGU9ITEpe3JldHVybiBLZSh0aGlzLGUpfXRvSlNPTigpe3JldHVybiB0aGlzfXN0YXRpYyByZXZpdmUoZSl7aWYoZSl7aWYoZSBpbnN0YW5jZW9mIE9lKXJldHVybiBlO3tjb25zdCB0PW5ldyBQZShlKTtyZXR1cm4gdC5fZm9ybWF0dGVkPWUuZXh0ZXJuYWwsdC5fZnNQYXRoPWUuX3NlcD09PUllP2UuZnNQYXRoOm51bGwsdH19cmV0dXJuIGV9fWNvbnN0IEllPXg/MTp2b2lkIDA7Y2xhc3MgUGUgZXh0ZW5kcyBPZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fZm9ybWF0dGVkPW51bGwsdGhpcy5fZnNQYXRoPW51bGx9Z2V0IGZzUGF0aCgpe3JldHVybiB0aGlzLl9mc1BhdGh8fCh0aGlzLl9mc1BhdGg9RmUodGhpcywhMSkpLHRoaXMuX2ZzUGF0aH10b1N0cmluZyhlPSExKXtyZXR1cm4gZT9LZSh0aGlzLCEwKToodGhpcy5fZm9ybWF0dGVkfHwodGhpcy5fZm9ybWF0dGVkPUtlKHRoaXMsITEpKSx0aGlzLl9mb3JtYXR0ZWQpfXRvSlNPTigpe2NvbnN0IGU9eyRtaWQ6MX07cmV0dXJuIHRoaXMuX2ZzUGF0aCYmKGUuZnNQYXRoPXRoaXMuX2ZzUGF0aCxlLl9zZXA9SWUpLHRoaXMuX2Zvcm1hdHRlZCYmKGUuZXh0ZXJuYWw9dGhpcy5fZm9ybWF0dGVkKSx0aGlzLnBhdGgmJihlLnBhdGg9dGhpcy5wYXRoKSx0aGlzLnNjaGVtZSYmKGUuc2NoZW1lPXRoaXMuc2NoZW1lKSx0aGlzLmF1dGhvcml0eSYmKGUuYXV0aG9yaXR5PXRoaXMuYXV0aG9yaXR5KSx0aGlzLnF1ZXJ5JiYoZS5xdWVyeT10aGlzLnF1ZXJ5KSx0aGlzLmZyYWdtZW50JiYoZS5mcmFnbWVudD10aGlzLmZyYWdtZW50KSxlfX1jb25zdCBWZT17WzU4XToiJTNBIiw0NzoiJTJGIiw2MzoiJTNGIiwzNToiJTIzIiw5MToiJTVCIiw5MzoiJTVEIiw2NDoiJTQwIiwzMzoiJTIxIiwzNjoiJTI0IiwzODoiJTI2IiwzOToiJTI3Iiw0MDoiJTI4Iiw0MToiJTI5Iiw0MjoiJTJBIiw0MzoiJTJCIiw0NDoiJTJDIiw1OToiJTNCIiw2MToiJTNEIiwzMjoiJTIwIn07ZnVuY3Rpb24gUmUodCxyKXtsZXQgbj12b2lkIDAsaT0tMTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIG89dC5jaGFyQ29kZUF0KGUpOzk3PD1vJiZvPD0xMjJ8fDY1PD1vJiZvPD05MHx8NDg8PW8mJm88PTU3fHw0NT09PW98fDQ2PT09b3x8OTU9PT1vfHwxMjY9PT1vfHxyJiY0Nz09PW8/KC0xIT09aSYmKG4rPWVuY29kZVVSSUNvbXBvbmVudCh0LnN1YnN0cmluZyhpLGUpKSxpPS0xKSx2b2lkIDAhPT1uJiYobis9dC5jaGFyQXQoZSkpKToodm9pZCAwPT09biYmKG49dC5zdWJzdHIoMCxlKSksdm9pZCAwIT09KG89VmVbb10pPygtMSE9PWkmJihuKz1lbmNvZGVVUklDb21wb25lbnQodC5zdWJzdHJpbmcoaSxlKSksaT0tMSksbis9byk6LTE9PT1pJiYoaT1lKSl9cmV0dXJuLTEhPT1pJiYobis9ZW5jb2RlVVJJQ29tcG9uZW50KHQuc3Vic3RyaW5nKGkpKSksdm9pZCAwIT09bj9uOnR9ZnVuY3Rpb24gRGUodCl7bGV0IHI9dm9pZCAwO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgbj10LmNoYXJDb2RlQXQoZSk7MzU9PT1ufHw2Mz09PW4/KHZvaWQgMD09PXImJihyPXQuc3Vic3RyKDAsZSkpLHIrPVZlW25dKTp2b2lkIDAhPT1yJiYocis9dFtlXSl9cmV0dXJuIHZvaWQgMCE9PXI/cjp0fWZ1bmN0aW9uIEZlKGUsdCl7bGV0IHI7cmV0dXJuIHI9ZS5hdXRob3JpdHkmJjE8ZS5wYXRoLmxlbmd0aCYmImZpbGUiPT09ZS5zY2hlbWU/Ii8vIitlLmF1dGhvcml0eStlLnBhdGg6NDc9PT1lLnBhdGguY2hhckNvZGVBdCgwKSYmKDY1PD1lLnBhdGguY2hhckNvZGVBdCgxKSYmZS5wYXRoLmNoYXJDb2RlQXQoMSk8PTkwfHw5Nzw9ZS5wYXRoLmNoYXJDb2RlQXQoMSkmJmUucGF0aC5jaGFyQ29kZUF0KDEpPD0xMjIpJiY1OD09PWUucGF0aC5jaGFyQ29kZUF0KDIpP3Q/ZS5wYXRoLnN1YnN0cigxKTplLnBhdGhbMV0udG9Mb3dlckNhc2UoKStlLnBhdGguc3Vic3RyKDIpOmUucGF0aCx4JiYocj1yLnJlcGxhY2UoL1wvL2csIlxcIikpLHJ9ZnVuY3Rpb24gS2UoZSx0KXtjb25zdCByPXQ/RGU6UmU7bGV0IG49IiIse3NjaGVtZTppLGF1dGhvcml0eTpvLHBhdGg6cyxxdWVyeTphLGZyYWdtZW50Omx9PWU7aWYoaSYmKG4rPWksbis9IjoiKSwhbyYmImZpbGUiIT09aXx8KG4rPU1lLG4rPU1lKSxvKXtsZXQgZT1vLmluZGV4T2YoIkAiKTtpZigtMSE9PWUpe2NvbnN0IGg9by5zdWJzdHIoMCxlKTtvPW8uc3Vic3RyKGUrMSksZT1oLmluZGV4T2YoIjoiKSwtMT09PWU/bis9cihoLCExKToobis9cihoLnN1YnN0cigwLGUpLCExKSxuKz0iOiIsbis9cihoLnN1YnN0cihlKzEpLCExKSksbis9IkAifW89by50b0xvd2VyQ2FzZSgpLGU9by5pbmRleE9mKCI6IiksLTE9PT1lP24rPXIobywhMSk6KG4rPXIoby5zdWJzdHIoMCxlKSwhMSksbis9by5zdWJzdHIoZSkpfXZhciB1O3JldHVybiBzJiYoMzw9cy5sZW5ndGgmJjQ3PT09cy5jaGFyQ29kZUF0KDApJiY1OD09PXMuY2hhckNvZGVBdCgyKT82NTw9KHU9cy5jaGFyQ29kZUF0KDEpKSYmdTw9OTAmJihzPWAvJHtTdHJpbmcuZnJvbUNoYXJDb2RlKHUrMzIpfTpgK3Muc3Vic3RyKDMpKToyPD1zLmxlbmd0aCYmNTg9PT1zLmNoYXJDb2RlQXQoMSkmJig2NTw9KHU9cy5jaGFyQ29kZUF0KDApKSYmdTw9OTAmJihzPVN0cmluZy5mcm9tQ2hhckNvZGUodSszMikrIjoiK3Muc3Vic3RyKDIpKSksbis9cihzLCEwKSksYSYmKG4rPSI/IixuKz1yKGEsITEpKSxsJiYobis9IiMiLG4rPXQ/bDpSZShsLCExKSksbn1jb25zdCBqZT0vKCVbMC05QS1aYS16XVswLTlBLVphLXpdKSsvZztmdW5jdGlvbiBVZShlKXtyZXR1cm4gZS5tYXRjaChqZSk/ZS5yZXBsYWNlKGplLGU9PmZ1bmN0aW9uIHQocil7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQocil9Y2F0Y2goZSl7cmV0dXJuIDM8ci5sZW5ndGg/ci5zdWJzdHIoMCwzKSt0KHIuc3Vic3RyKDMpKTpyfX0oZSkpOmV9Y2xhc3MgcWV7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmxpbmVOdW1iZXI9ZSx0aGlzLmNvbHVtbj10fXdpdGgoZT10aGlzLmxpbmVOdW1iZXIsdD10aGlzLmNvbHVtbil7cmV0dXJuIGU9PT10aGlzLmxpbmVOdW1iZXImJnQ9PT10aGlzLmNvbHVtbj90aGlzOm5ldyBxZShlLHQpfWRlbHRhKGU9MCx0PTApe3JldHVybiB0aGlzLndpdGgodGhpcy5saW5lTnVtYmVyK2UsdGhpcy5jb2x1bW4rdCl9ZXF1YWxzKGUpe3JldHVybiBxZS5lcXVhbHModGhpcyxlKX1zdGF0aWMgZXF1YWxzKGUsdCl7cmV0dXJuIWUmJiF0fHwhIWUmJiEhdCYmZS5saW5lTnVtYmVyPT09dC5saW5lTnVtYmVyJiZlLmNvbHVtbj09PXQuY29sdW1ufWlzQmVmb3JlKGUpe3JldHVybiBxZS5pc0JlZm9yZSh0aGlzLGUpfXN0YXRpYyBpc0JlZm9yZShlLHQpe3JldHVybiBlLmxpbmVOdW1iZXI8dC5saW5lTnVtYmVyfHwhKHQubGluZU51bWJlcjxlLmxpbmVOdW1iZXIpJiZlLmNvbHVtbjx0LmNvbHVtbn1pc0JlZm9yZU9yRXF1YWwoZSl7cmV0dXJuIHFlLmlzQmVmb3JlT3JFcXVhbCh0aGlzLGUpfXN0YXRpYyBpc0JlZm9yZU9yRXF1YWwoZSx0KXtyZXR1cm4gZS5saW5lTnVtYmVyPHQubGluZU51bWJlcnx8ISh0LmxpbmVOdW1iZXI8ZS5saW5lTnVtYmVyKSYmZS5jb2x1bW48PXQuY29sdW1ufXN0YXRpYyBjb21wYXJlKGUsdCl7dmFyIHI9MHxlLmxpbmVOdW1iZXIsbj0wfHQubGluZU51bWJlcjtyZXR1cm4gciE9bj9yLW46KDB8ZS5jb2x1bW4pLSgwfHQuY29sdW1uKX1jbG9uZSgpe3JldHVybiBuZXcgcWUodGhpcy5saW5lTnVtYmVyLHRoaXMuY29sdW1uKX10b1N0cmluZygpe3JldHVybiIoIit0aGlzLmxpbmVOdW1iZXIrIiwiK3RoaXMuY29sdW1uKyIpIn1zdGF0aWMgbGlmdChlKXtyZXR1cm4gbmV3IHFlKGUubGluZU51bWJlcixlLmNvbHVtbil9c3RhdGljIGlzSVBvc2l0aW9uKGUpe3JldHVybiBlJiYibnVtYmVyIj09dHlwZW9mIGUubGluZU51bWJlciYmIm51bWJlciI9PXR5cGVvZiBlLmNvbHVtbn19Y2xhc3MgQmV7Y29uc3RydWN0b3IoZSx0LHIsbil7cjxlfHxlPT09ciYmbjx0Pyh0aGlzLnN0YXJ0TGluZU51bWJlcj1yLHRoaXMuc3RhcnRDb2x1bW49bix0aGlzLmVuZExpbmVOdW1iZXI9ZSx0aGlzLmVuZENvbHVtbj10KToodGhpcy5zdGFydExpbmVOdW1iZXI9ZSx0aGlzLnN0YXJ0Q29sdW1uPXQsdGhpcy5lbmRMaW5lTnVtYmVyPXIsdGhpcy5lbmRDb2x1bW49bil9aXNFbXB0eSgpe3JldHVybiBCZS5pc0VtcHR5KHRoaXMpfXN0YXRpYyBpc0VtcHR5KGUpe3JldHVybiBlLnN0YXJ0TGluZU51bWJlcj09PWUuZW5kTGluZU51bWJlciYmZS5zdGFydENvbHVtbj09PWUuZW5kQ29sdW1ufWNvbnRhaW5zUG9zaXRpb24oZSl7cmV0dXJuIEJlLmNvbnRhaW5zUG9zaXRpb24odGhpcyxlKX1zdGF0aWMgY29udGFpbnNQb3NpdGlvbihlLHQpe3JldHVybiEodC5saW5lTnVtYmVyPGUuc3RhcnRMaW5lTnVtYmVyfHx0LmxpbmVOdW1iZXI+ZS5lbmRMaW5lTnVtYmVyKSYmKCEodC5saW5lTnVtYmVyPT09ZS5zdGFydExpbmVOdW1iZXImJnQuY29sdW1uPGUuc3RhcnRDb2x1bW4pJiYhKHQubGluZU51bWJlcj09PWUuZW5kTGluZU51bWJlciYmdC5jb2x1bW4+ZS5lbmRDb2x1bW4pKX1zdGF0aWMgc3RyaWN0Q29udGFpbnNQb3NpdGlvbihlLHQpe3JldHVybiEodC5saW5lTnVtYmVyPGUuc3RhcnRMaW5lTnVtYmVyfHx0LmxpbmVOdW1iZXI+ZS5lbmRMaW5lTnVtYmVyKSYmKCEodC5saW5lTnVtYmVyPT09ZS5zdGFydExpbmVOdW1iZXImJnQuY29sdW1uPD1lLnN0YXJ0Q29sdW1uKSYmISh0LmxpbmVOdW1iZXI9PT1lLmVuZExpbmVOdW1iZXImJnQuY29sdW1uPj1lLmVuZENvbHVtbikpfWNvbnRhaW5zUmFuZ2UoZSl7cmV0dXJuIEJlLmNvbnRhaW5zUmFuZ2UodGhpcyxlKX1zdGF0aWMgY29udGFpbnNSYW5nZShlLHQpe3JldHVybiEodC5zdGFydExpbmVOdW1iZXI8ZS5zdGFydExpbmVOdW1iZXJ8fHQuZW5kTGluZU51bWJlcjxlLnN0YXJ0TGluZU51bWJlcikmJighKHQuc3RhcnRMaW5lTnVtYmVyPmUuZW5kTGluZU51bWJlcnx8dC5lbmRMaW5lTnVtYmVyPmUuZW5kTGluZU51bWJlcikmJighKHQuc3RhcnRMaW5lTnVtYmVyPT09ZS5zdGFydExpbmVOdW1iZXImJnQuc3RhcnRDb2x1bW48ZS5zdGFydENvbHVtbikmJiEodC5lbmRMaW5lTnVtYmVyPT09ZS5lbmRMaW5lTnVtYmVyJiZ0LmVuZENvbHVtbj5lLmVuZENvbHVtbikpKX1zdHJpY3RDb250YWluc1JhbmdlKGUpe3JldHVybiBCZS5zdHJpY3RDb250YWluc1JhbmdlKHRoaXMsZSl9c3RhdGljIHN0cmljdENvbnRhaW5zUmFuZ2UoZSx0KXtyZXR1cm4hKHQuc3RhcnRMaW5lTnVtYmVyPGUuc3RhcnRMaW5lTnVtYmVyfHx0LmVuZExpbmVOdW1iZXI8ZS5zdGFydExpbmVOdW1iZXIpJiYoISh0LnN0YXJ0TGluZU51bWJlcj5lLmVuZExpbmVOdW1iZXJ8fHQuZW5kTGluZU51bWJlcj5lLmVuZExpbmVOdW1iZXIpJiYoISh0LnN0YXJ0TGluZU51bWJlcj09PWUuc3RhcnRMaW5lTnVtYmVyJiZ0LnN0YXJ0Q29sdW1uPD1lLnN0YXJ0Q29sdW1uKSYmISh0LmVuZExpbmVOdW1iZXI9PT1lLmVuZExpbmVOdW1iZXImJnQuZW5kQ29sdW1uPj1lLmVuZENvbHVtbikpKX1wbHVzUmFuZ2UoZSl7cmV0dXJuIEJlLnBsdXNSYW5nZSh0aGlzLGUpfXN0YXRpYyBwbHVzUmFuZ2UoZSx0KXtsZXQgcixuLGksbztyZXR1cm4gbj10LnN0YXJ0TGluZU51bWJlcjxlLnN0YXJ0TGluZU51bWJlcj8ocj10LnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0Q29sdW1uKTp0LnN0YXJ0TGluZU51bWJlcj09PWUuc3RhcnRMaW5lTnVtYmVyPyhyPXQuc3RhcnRMaW5lTnVtYmVyLE1hdGgubWluKHQuc3RhcnRDb2x1bW4sZS5zdGFydENvbHVtbikpOihyPWUuc3RhcnRMaW5lTnVtYmVyLGUuc3RhcnRDb2x1bW4pLG89dC5lbmRMaW5lTnVtYmVyPmUuZW5kTGluZU51bWJlcj8oaT10LmVuZExpbmVOdW1iZXIsdC5lbmRDb2x1bW4pOnQuZW5kTGluZU51bWJlcj09PWUuZW5kTGluZU51bWJlcj8oaT10LmVuZExpbmVOdW1iZXIsTWF0aC5tYXgodC5lbmRDb2x1bW4sZS5lbmRDb2x1bW4pKTooaT1lLmVuZExpbmVOdW1iZXIsZS5lbmRDb2x1bW4pLG5ldyBCZShyLG4saSxvKX1pbnRlcnNlY3RSYW5nZXMoZSl7cmV0dXJuIEJlLmludGVyc2VjdFJhbmdlcyh0aGlzLGUpfXN0YXRpYyBpbnRlcnNlY3RSYW5nZXMoZSx0KXtsZXQgcj1lLnN0YXJ0TGluZU51bWJlcixuPWUuc3RhcnRDb2x1bW4saT1lLmVuZExpbmVOdW1iZXIsbz1lLmVuZENvbHVtbjt2YXIgcz10LnN0YXJ0TGluZU51bWJlcixhPXQuc3RhcnRDb2x1bW4sZT10LmVuZExpbmVOdW1iZXIsdD10LmVuZENvbHVtbjtyZXR1cm4gcjxzPyhyPXMsbj1hKTpyPT09cyYmKG49TWF0aC5tYXgobixhKSksaT5lPyhpPWUsbz10KTppPT09ZSYmKG89TWF0aC5taW4obyx0KSkscj5pfHxyPT09aSYmbj5vP251bGw6bmV3IEJlKHIsbixpLG8pfWVxdWFsc1JhbmdlKGUpe3JldHVybiBCZS5lcXVhbHNSYW5nZSh0aGlzLGUpfXN0YXRpYyBlcXVhbHNSYW5nZShlLHQpe3JldHVybiEhZSYmISF0JiZlLnN0YXJ0TGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyJiZlLnN0YXJ0Q29sdW1uPT09dC5zdGFydENvbHVtbiYmZS5lbmRMaW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyJiZlLmVuZENvbHVtbj09PXQuZW5kQ29sdW1ufWdldEVuZFBvc2l0aW9uKCl7cmV0dXJuIEJlLmdldEVuZFBvc2l0aW9uKHRoaXMpfXN0YXRpYyBnZXRFbmRQb3NpdGlvbihlKXtyZXR1cm4gbmV3IHFlKGUuZW5kTGluZU51bWJlcixlLmVuZENvbHVtbil9Z2V0U3RhcnRQb3NpdGlvbigpe3JldHVybiBCZS5nZXRTdGFydFBvc2l0aW9uKHRoaXMpfXN0YXRpYyBnZXRTdGFydFBvc2l0aW9uKGUpe3JldHVybiBuZXcgcWUoZS5zdGFydExpbmVOdW1iZXIsZS5zdGFydENvbHVtbil9dG9TdHJpbmcoKXtyZXR1cm4iWyIrdGhpcy5zdGFydExpbmVOdW1iZXIrIiwiK3RoaXMuc3RhcnRDb2x1bW4rIiAtPiAiK3RoaXMuZW5kTGluZU51bWJlcisiLCIrdGhpcy5lbmRDb2x1bW4rIl0ifXNldEVuZFBvc2l0aW9uKGUsdCl7cmV0dXJuIG5ldyBCZSh0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLnN0YXJ0Q29sdW1uLGUsdCl9c2V0U3RhcnRQb3NpdGlvbihlLHQpe3JldHVybiBuZXcgQmUoZSx0LHRoaXMuZW5kTGluZU51bWJlcix0aGlzLmVuZENvbHVtbil9Y29sbGFwc2VUb1N0YXJ0KCl7cmV0dXJuIEJlLmNvbGxhcHNlVG9TdGFydCh0aGlzKX1zdGF0aWMgY29sbGFwc2VUb1N0YXJ0KGUpe3JldHVybiBuZXcgQmUoZS5zdGFydExpbmVOdW1iZXIsZS5zdGFydENvbHVtbixlLnN0YXJ0TGluZU51bWJlcixlLnN0YXJ0Q29sdW1uKX1zdGF0aWMgZnJvbVBvc2l0aW9ucyhlLHQ9ZSl7cmV0dXJuIG5ldyBCZShlLmxpbmVOdW1iZXIsZS5jb2x1bW4sdC5saW5lTnVtYmVyLHQuY29sdW1uKX1zdGF0aWMgbGlmdChlKXtyZXR1cm4gZT9uZXcgQmUoZS5zdGFydExpbmVOdW1iZXIsZS5zdGFydENvbHVtbixlLmVuZExpbmVOdW1iZXIsZS5lbmRDb2x1bW4pOm51bGx9c3RhdGljIGlzSVJhbmdlKGUpe3JldHVybiBlJiYibnVtYmVyIj09dHlwZW9mIGUuc3RhcnRMaW5lTnVtYmVyJiYibnVtYmVyIj09dHlwZW9mIGUuc3RhcnRDb2x1bW4mJiJudW1iZXIiPT10eXBlb2YgZS5lbmRMaW5lTnVtYmVyJiYibnVtYmVyIj09dHlwZW9mIGUuZW5kQ29sdW1ufXN0YXRpYyBhcmVJbnRlcnNlY3RpbmdPclRvdWNoaW5nKGUsdCl7cmV0dXJuIShlLmVuZExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXJ8fGUuZW5kTGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyJiZlLmVuZENvbHVtbjx0LnN0YXJ0Q29sdW1uKSYmISh0LmVuZExpbmVOdW1iZXI8ZS5zdGFydExpbmVOdW1iZXJ8fHQuZW5kTGluZU51bWJlcj09PWUuc3RhcnRMaW5lTnVtYmVyJiZ0LmVuZENvbHVtbjxlLnN0YXJ0Q29sdW1uKX1zdGF0aWMgYXJlSW50ZXJzZWN0aW5nKGUsdCl7cmV0dXJuIShlLmVuZExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXJ8fGUuZW5kTGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyJiZlLmVuZENvbHVtbjw9dC5zdGFydENvbHVtbikmJiEodC5lbmRMaW5lTnVtYmVyPGUuc3RhcnRMaW5lTnVtYmVyfHx0LmVuZExpbmVOdW1iZXI9PT1lLnN0YXJ0TGluZU51bWJlciYmdC5lbmRDb2x1bW48PWUuc3RhcnRDb2x1bW4pfXN0YXRpYyBjb21wYXJlUmFuZ2VzVXNpbmdTdGFydHMoZSx0KXtpZihlJiZ0KXt2YXIgcj0wfGUuc3RhcnRMaW5lTnVtYmVyLG49MHx0LnN0YXJ0TGluZU51bWJlcjtpZihyIT1uKXJldHVybiByLW47cj0wfGUuc3RhcnRDb2x1bW4sbj0wfHQuc3RhcnRDb2x1bW47aWYociE9bilyZXR1cm4gci1uO3I9MHxlLmVuZExpbmVOdW1iZXIsbj0wfHQuZW5kTGluZU51bWJlcjtyZXR1cm4gciE9bj9yLW46KDB8ZS5lbmRDb2x1bW4pLSgwfHQuZW5kQ29sdW1uKX1yZXR1cm4oZT8xOjApLSh0PzE6MCl9c3RhdGljIGNvbXBhcmVSYW5nZXNVc2luZ0VuZHMoZSx0KXtyZXR1cm4gZS5lbmRMaW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyP2UuZW5kQ29sdW1uPT09dC5lbmRDb2x1bW4/ZS5zdGFydExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlcj9lLnN0YXJ0Q29sdW1uLXQuc3RhcnRDb2x1bW46ZS5zdGFydExpbmVOdW1iZXItdC5zdGFydExpbmVOdW1iZXI6ZS5lbmRDb2x1bW4tdC5lbmRDb2x1bW46ZS5lbmRMaW5lTnVtYmVyLXQuZW5kTGluZU51bWJlcn1zdGF0aWMgc3BhbnNNdWx0aXBsZUxpbmVzKGUpe3JldHVybiBlLmVuZExpbmVOdW1iZXI+ZS5zdGFydExpbmVOdW1iZXJ9fWZ1bmN0aW9uICRlKGUsdCxyLG4pe2NvbnN0IGk9bmV3IGllKGUsdCxyKTtyZXR1cm4gaS5Db21wdXRlRGlmZihuKX1jbGFzcyBXZXtjb25zdHJ1Y3RvcihyKXtjb25zdCBuPVtdLGk9W107Zm9yKGxldCBlPTAsdD1yLmxlbmd0aDtlPHQ7ZSsrKW5bZV09WGUocltlXSwxKSxpW2VdPVplKHJbZV0sMSk7dGhpcy5saW5lcz1yLHRoaXMuX3N0YXJ0Q29sdW1ucz1uLHRoaXMuX2VuZENvbHVtbnM9aX1nZXRFbGVtZW50cygpe2NvbnN0IHI9W107Zm9yKGxldCBlPTAsdD10aGlzLmxpbmVzLmxlbmd0aDtlPHQ7ZSsrKXJbZV09dGhpcy5saW5lc1tlXS5zdWJzdHJpbmcodGhpcy5fc3RhcnRDb2x1bW5zW2VdLTEsdGhpcy5fZW5kQ29sdW1uc1tlXS0xKTtyZXR1cm4gcn1nZXRTdHJpY3RFbGVtZW50KGUpe3JldHVybiB0aGlzLmxpbmVzW2VdfWdldFN0YXJ0TGluZU51bWJlcihlKXtyZXR1cm4gZSsxfWdldEVuZExpbmVOdW1iZXIoZSl7cmV0dXJuIGUrMX1jcmVhdGVDaGFyU2VxdWVuY2UoZSxyLG4pe2NvbnN0IGk9W10sbz1bXSxzPVtdO2xldCBhPTA7Zm9yKGxldCB0PXI7dDw9bjt0Kyspe2NvbnN0IGg9dGhpcy5saW5lc1t0XTt2YXIgbD1lP3RoaXMuX3N0YXJ0Q29sdW1uc1t0XToxLHU9ZT90aGlzLl9lbmRDb2x1bW5zW3RdOmgubGVuZ3RoKzE7Zm9yKGxldCBlPWw7ZTx1O2UrKylpW2FdPWguY2hhckNvZGVBdChlLTEpLG9bYV09dCsxLHNbYV09ZSxhKyt9cmV0dXJuIG5ldyBIZShpLG8scyl9fWNsYXNzIEhle2NvbnN0cnVjdG9yKGUsdCxyKXt0aGlzLl9jaGFyQ29kZXM9ZSx0aGlzLl9saW5lTnVtYmVycz10LHRoaXMuX2NvbHVtbnM9cn1nZXRFbGVtZW50cygpe3JldHVybiB0aGlzLl9jaGFyQ29kZXN9Z2V0U3RhcnRMaW5lTnVtYmVyKGUpe3JldHVybiB0aGlzLl9saW5lTnVtYmVyc1tlXX1nZXRTdGFydENvbHVtbihlKXtyZXR1cm4gdGhpcy5fY29sdW1uc1tlXX1nZXRFbmRMaW5lTnVtYmVyKGUpe3JldHVybiB0aGlzLl9saW5lTnVtYmVyc1tlXX1nZXRFbmRDb2x1bW4oZSl7cmV0dXJuIHRoaXMuX2NvbHVtbnNbZV0rMX19Y2xhc3MgemV7Y29uc3RydWN0b3IoZSx0LHIsbixpLG8scyxhKXt0aGlzLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyPWUsdGhpcy5vcmlnaW5hbFN0YXJ0Q29sdW1uPXQsdGhpcy5vcmlnaW5hbEVuZExpbmVOdW1iZXI9cix0aGlzLm9yaWdpbmFsRW5kQ29sdW1uPW4sdGhpcy5tb2RpZmllZFN0YXJ0TGluZU51bWJlcj1pLHRoaXMubW9kaWZpZWRTdGFydENvbHVtbj1vLHRoaXMubW9kaWZpZWRFbmRMaW5lTnVtYmVyPXMsdGhpcy5tb2RpZmllZEVuZENvbHVtbj1hfXN0YXRpYyBjcmVhdGVGcm9tRGlmZkNoYW5nZShlLHQscil7bGV0IG4saSxvLHMsYSxsLHUsaDtyZXR1cm4gcz0wPT09ZS5vcmlnaW5hbExlbmd0aD8obj0wLGk9MCxvPTApOihuPXQuZ2V0U3RhcnRMaW5lTnVtYmVyKGUub3JpZ2luYWxTdGFydCksaT10LmdldFN0YXJ0Q29sdW1uKGUub3JpZ2luYWxTdGFydCksbz10LmdldEVuZExpbmVOdW1iZXIoZS5vcmlnaW5hbFN0YXJ0K2Uub3JpZ2luYWxMZW5ndGgtMSksdC5nZXRFbmRDb2x1bW4oZS5vcmlnaW5hbFN0YXJ0K2Uub3JpZ2luYWxMZW5ndGgtMSkpLGg9MD09PWUubW9kaWZpZWRMZW5ndGg/KGE9MCxsPTAsdT0wKTooYT1yLmdldFN0YXJ0TGluZU51bWJlcihlLm1vZGlmaWVkU3RhcnQpLGw9ci5nZXRTdGFydENvbHVtbihlLm1vZGlmaWVkU3RhcnQpLHU9ci5nZXRFbmRMaW5lTnVtYmVyKGUubW9kaWZpZWRTdGFydCtlLm1vZGlmaWVkTGVuZ3RoLTEpLHIuZ2V0RW5kQ29sdW1uKGUubW9kaWZpZWRTdGFydCtlLm1vZGlmaWVkTGVuZ3RoLTEpKSxuZXcgemUobixpLG8scyxhLGwsdSxoKX19Y2xhc3MgSmV7Y29uc3RydWN0b3IoZSx0LHIsbixpKXt0aGlzLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyPWUsdGhpcy5vcmlnaW5hbEVuZExpbmVOdW1iZXI9dCx0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyPXIsdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXI9bix0aGlzLmNoYXJDaGFuZ2VzPWl9c3RhdGljIGNyZWF0ZUZyb21EaWZmUmVzdWx0KGUsdCxuLGksbyxyLHMpe2xldCBhLGwsdSxoLGM9dm9pZCAwO2lmKGw9MD09PXQub3JpZ2luYWxMZW5ndGg/KGE9bi5nZXRTdGFydExpbmVOdW1iZXIodC5vcmlnaW5hbFN0YXJ0KS0xLDApOihhPW4uZ2V0U3RhcnRMaW5lTnVtYmVyKHQub3JpZ2luYWxTdGFydCksbi5nZXRFbmRMaW5lTnVtYmVyKHQub3JpZ2luYWxTdGFydCt0Lm9yaWdpbmFsTGVuZ3RoLTEpKSxoPTA9PT10Lm1vZGlmaWVkTGVuZ3RoPyh1PWkuZ2V0U3RhcnRMaW5lTnVtYmVyKHQubW9kaWZpZWRTdGFydCktMSwwKToodT1pLmdldFN0YXJ0TGluZU51bWJlcih0Lm1vZGlmaWVkU3RhcnQpLGkuZ2V0RW5kTGluZU51bWJlcih0Lm1vZGlmaWVkU3RhcnQrdC5tb2RpZmllZExlbmd0aC0xKSksciYmMDx0Lm9yaWdpbmFsTGVuZ3RoJiZ0Lm9yaWdpbmFsTGVuZ3RoPDIwJiYwPHQubW9kaWZpZWRMZW5ndGgmJnQubW9kaWZpZWRMZW5ndGg8MjAmJm8oKSl7dmFyIGQ9bi5jcmVhdGVDaGFyU2VxdWVuY2UoZSx0Lm9yaWdpbmFsU3RhcnQsdC5vcmlnaW5hbFN0YXJ0K3Qub3JpZ2luYWxMZW5ndGgtMSksZj1pLmNyZWF0ZUNoYXJTZXF1ZW5jZShlLHQubW9kaWZpZWRTdGFydCx0Lm1vZGlmaWVkU3RhcnQrdC5tb2RpZmllZExlbmd0aC0xKTtsZXQgcj0kZShkLGYsbywhMCkuY2hhbmdlcztzJiYocj1mdW5jdGlvbihyKXtpZihyLmxlbmd0aDw9MSlyZXR1cm4gcjtjb25zdCBuPVtyWzBdXTtsZXQgaT1uWzBdO2ZvcihsZXQgZT0xLHQ9ci5sZW5ndGg7ZTx0O2UrKyl7dmFyIG89cltlXSxzPW8ub3JpZ2luYWxTdGFydC0oaS5vcmlnaW5hbFN0YXJ0K2kub3JpZ2luYWxMZW5ndGgpLGE9by5tb2RpZmllZFN0YXJ0LShpLm1vZGlmaWVkU3RhcnQraS5tb2RpZmllZExlbmd0aCk7TWF0aC5taW4ocyxhKTwzPyhpLm9yaWdpbmFsTGVuZ3RoPW8ub3JpZ2luYWxTdGFydCtvLm9yaWdpbmFsTGVuZ3RoLWkub3JpZ2luYWxTdGFydCxpLm1vZGlmaWVkTGVuZ3RoPW8ubW9kaWZpZWRTdGFydCtvLm1vZGlmaWVkTGVuZ3RoLWkubW9kaWZpZWRTdGFydCk6KG4ucHVzaChvKSxpPW8pfXJldHVybiBufShyKSksYz1bXTtmb3IobGV0IGU9MCx0PXIubGVuZ3RoO2U8dDtlKyspYy5wdXNoKHplLmNyZWF0ZUZyb21EaWZmQ2hhbmdlKHJbZV0sZCxmKSl9cmV0dXJuIG5ldyBKZShhLGwsdSxoLGMpfX1jbGFzcyBHZXtjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXM9ci5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMsdGhpcy5zaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzPXIuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcyx0aGlzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlPXIuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2UsdGhpcy5zaG91bGRNYWtlUHJldHR5RGlmZj1yLnNob3VsZE1ha2VQcmV0dHlEaWZmLHRoaXMub3JpZ2luYWxMaW5lcz1lLHRoaXMubW9kaWZpZWRMaW5lcz10LHRoaXMub3JpZ2luYWw9bmV3IFdlKGUpLHRoaXMubW9kaWZpZWQ9bmV3IFdlKHQpLHRoaXMuY29udGludWVMaW5lRGlmZj1RZShyLm1heENvbXB1dGF0aW9uVGltZSksdGhpcy5jb250aW51ZUNoYXJEaWZmPVFlKDA9PT1yLm1heENvbXB1dGF0aW9uVGltZT8wOk1hdGgubWluKHIubWF4Q29tcHV0YXRpb25UaW1lLDVlMykpfWNvbXB1dGVEaWZmKCl7aWYoMT09PXRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoJiYwPT09dGhpcy5vcmlnaW5hbC5saW5lc1swXS5sZW5ndGgpcmV0dXJuIDE9PT10aGlzLm1vZGlmaWVkLmxpbmVzLmxlbmd0aCYmMD09PXRoaXMubW9kaWZpZWQubGluZXNbMF0ubGVuZ3RoP3txdWl0RWFybHk6ITEsY2hhbmdlczpbXX06e3F1aXRFYXJseTohMSxjaGFuZ2VzOlt7b3JpZ2luYWxTdGFydExpbmVOdW1iZXI6MSxvcmlnaW5hbEVuZExpbmVOdW1iZXI6MSxtb2RpZmllZFN0YXJ0TGluZU51bWJlcjoxLG1vZGlmaWVkRW5kTGluZU51bWJlcjp0aGlzLm1vZGlmaWVkLmxpbmVzLmxlbmd0aCxjaGFyQ2hhbmdlczpbe21vZGlmaWVkRW5kQ29sdW1uOjAsbW9kaWZpZWRFbmRMaW5lTnVtYmVyOjAsbW9kaWZpZWRTdGFydENvbHVtbjowLG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyOjAsb3JpZ2luYWxFbmRDb2x1bW46MCxvcmlnaW5hbEVuZExpbmVOdW1iZXI6MCxvcmlnaW5hbFN0YXJ0Q29sdW1uOjAsb3JpZ2luYWxTdGFydExpbmVOdW1iZXI6MH1dfV19O2lmKDE9PT10aGlzLm1vZGlmaWVkLmxpbmVzLmxlbmd0aCYmMD09PXRoaXMubW9kaWZpZWQubGluZXNbMF0ubGVuZ3RoKXJldHVybntxdWl0RWFybHk6ITEsY2hhbmdlczpbe29yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjEsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOnRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoLG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyOjEsbW9kaWZpZWRFbmRMaW5lTnVtYmVyOjEsY2hhckNoYW5nZXM6W3ttb2RpZmllZEVuZENvbHVtbjowLG1vZGlmaWVkRW5kTGluZU51bWJlcjowLG1vZGlmaWVkU3RhcnRDb2x1bW46MCxtb2RpZmllZFN0YXJ0TGluZU51bWJlcjowLG9yaWdpbmFsRW5kQ29sdW1uOjAsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOjAsb3JpZ2luYWxTdGFydENvbHVtbjowLG9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjB9XX1dfTt2YXIgZT0kZSh0aGlzLm9yaWdpbmFsLHRoaXMubW9kaWZpZWQsdGhpcy5jb250aW51ZUxpbmVEaWZmLHRoaXMuc2hvdWxkTWFrZVByZXR0eURpZmYpLHI9ZS5jaGFuZ2VzLGU9ZS5xdWl0RWFybHk7aWYodGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSl7Y29uc3QgYz1bXTtmb3IobGV0IGU9MCx0PXIubGVuZ3RoO2U8dDtlKyspYy5wdXNoKEplLmNyZWF0ZUZyb21EaWZmUmVzdWx0KHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2UscltlXSx0aGlzLm9yaWdpbmFsLHRoaXMubW9kaWZpZWQsdGhpcy5jb250aW51ZUNoYXJEaWZmLHRoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzLHRoaXMuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcykpO3JldHVybntxdWl0RWFybHk6ZSxjaGFuZ2VzOmN9fWNvbnN0IG49W107bGV0IGk9MCxvPTA7Zm9yKGxldCBlPS0xLHQ9ci5sZW5ndGg7ZTx0O2UrKyl7Zm9yKHZhciBzPWUrMTx0P3JbZSsxXTpudWxsLGE9cz9zLm9yaWdpbmFsU3RhcnQ6dGhpcy5vcmlnaW5hbExpbmVzLmxlbmd0aCxsPXM/cy5tb2RpZmllZFN0YXJ0OnRoaXMubW9kaWZpZWRMaW5lcy5sZW5ndGg7aTxhJiZvPGw7KXtjb25zdCBkPXRoaXMub3JpZ2luYWxMaW5lc1tpXSxmPXRoaXMubW9kaWZpZWRMaW5lc1tvXTtpZihkIT09Zil7e2xldCBlPVhlKGQsMSksdD1YZShmLDEpO2Zvcig7MTxlJiYxPHQ7KXtpZihkLmNoYXJDb2RlQXQoZS0yKSE9PWYuY2hhckNvZGVBdCh0LTIpKWJyZWFrO2UtLSx0LS19KDE8ZXx8MTx0KSYmdGhpcy5fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZShuLGkrMSwxLGUsbysxLDEsdCl9e2xldCBlPVplKGQsMSksdD1aZShmLDEpO2Zvcih2YXIgdT1kLmxlbmd0aCsxLGg9Zi5sZW5ndGgrMTtlPHUmJnQ8aDspe2lmKGQuY2hhckNvZGVBdChlLTEpIT09ZC5jaGFyQ29kZUF0KHQtMSkpYnJlYWs7ZSsrLHQrK30oZTx1fHx0PGgpJiZ0aGlzLl9wdXNoVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKG4saSsxLGUsdSxvKzEsdCxoKX19aSsrLG8rK31zJiYobi5wdXNoKEplLmNyZWF0ZUZyb21EaWZmUmVzdWx0KHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2Uscyx0aGlzLm9yaWdpbmFsLHRoaXMubW9kaWZpZWQsdGhpcy5jb250aW51ZUNoYXJEaWZmLHRoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzLHRoaXMuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcykpLGkrPXMub3JpZ2luYWxMZW5ndGgsbys9cy5tb2RpZmllZExlbmd0aCl9cmV0dXJue3F1aXRFYXJseTplLGNoYW5nZXM6bn19X3B1c2hUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UodCxyLG4saSxvLHMsYSl7aWYoIXRoaXMuX21lcmdlVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHQscixuLGksbyxzLGEpKXtsZXQgZT12b2lkIDA7dGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMmJihlPVtuZXcgemUocixuLHIsaSxvLHMsbyxhKV0pLHQucHVzaChuZXcgSmUocixyLG8sbyxlKSl9fV9tZXJnZVRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZShlLHQscixuLGksbyxzKXt2YXIgYT1lLmxlbmd0aDtpZigwPT09YSlyZXR1cm4hMTtjb25zdCBsPWVbYS0xXTtyZXR1cm4gMCE9PWwub3JpZ2luYWxFbmRMaW5lTnVtYmVyJiYwIT09bC5tb2RpZmllZEVuZExpbmVOdW1iZXImJihsLm9yaWdpbmFsRW5kTGluZU51bWJlcisxPT09dCYmbC5tb2RpZmllZEVuZExpbmVOdW1iZXIrMT09PWkmJihsLm9yaWdpbmFsRW5kTGluZU51bWJlcj10LGwubW9kaWZpZWRFbmRMaW5lTnVtYmVyPWksdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMmJmwuY2hhckNoYW5nZXMmJmwuY2hhckNoYW5nZXMucHVzaChuZXcgemUodCxyLHQsbixpLG8saSxzKSksITApKX19ZnVuY3Rpb24gWGUoZSx0KXtlPWZ1bmN0aW9uKHIpe2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrKyl7dmFyIG49ci5jaGFyQ29kZUF0KGUpO2lmKDMyIT09biYmOSE9PW4pcmV0dXJuIGV9cmV0dXJuLTF9KGUpO3JldHVybi0xPT09ZT90OmUrMX1mdW5jdGlvbiBaZShlLHQpe2U9ZnVuY3Rpb24odCxyPXQubGVuZ3RoLTEpe2ZvcihsZXQgZT1yOzA8PWU7ZS0tKXt2YXIgbj10LmNoYXJDb2RlQXQoZSk7aWYoMzIhPT1uJiY5IT09bilyZXR1cm4gZX1yZXR1cm4tMX0oZSk7cmV0dXJuLTE9PT1lP3Q6ZSsyfWZ1bmN0aW9uIFFlKGUpe2lmKDA9PT1lKXJldHVybigpPT4hMDtjb25zdCB0PURhdGUubm93KCk7cmV0dXJuKCk9PkRhdGUubm93KCktdDxlfWZ1bmN0aW9uIFllKGUpe3JldHVybiBlPDA/MDoyNTU8ZT8yNTU6MHxlfWZ1bmN0aW9uIGV0KGUpe3JldHVybiBlPDA/MDo0Mjk0OTY3Mjk1PGU/NDI5NDk2NzI5NTowfGV9Y2xhc3MgdHR7Y29uc3RydWN0b3IoZSl7dGhpcy52YWx1ZXM9ZSx0aGlzLnByZWZpeFN1bT1uZXcgVWludDMyQXJyYXkoZS5sZW5ndGgpLHRoaXMucHJlZml4U3VtVmFsaWRJbmRleD1uZXcgSW50MzJBcnJheSgxKSx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF09LTF9aW5zZXJ0VmFsdWVzKGUsdCl7ZT1ldChlKTtjb25zdCByPXRoaXMudmFsdWVzLG49dGhpcy5wcmVmaXhTdW07dmFyIGk9dC5sZW5ndGg7cmV0dXJuIDAhPT1pJiYodGhpcy52YWx1ZXM9bmV3IFVpbnQzMkFycmF5KHIubGVuZ3RoK2kpLHRoaXMudmFsdWVzLnNldChyLnN1YmFycmF5KDAsZSksMCksdGhpcy52YWx1ZXMuc2V0KHIuc3ViYXJyYXkoZSksZStpKSx0aGlzLnZhbHVlcy5zZXQodCxlKSxlLTE8dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiYodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPWUtMSksdGhpcy5wcmVmaXhTdW09bmV3IFVpbnQzMkFycmF5KHRoaXMudmFsdWVzLmxlbmd0aCksMDw9dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiZ0aGlzLnByZWZpeFN1bS5zZXQobi5zdWJhcnJheSgwLHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSsxKSksITApfXNldFZhbHVlKGUsdCl7cmV0dXJuIGU9ZXQoZSksdD1ldCh0KSx0aGlzLnZhbHVlc1tlXSE9PXQmJih0aGlzLnZhbHVlc1tlXT10LGUtMTx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0mJih0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF09ZS0xKSwhMCl9cmVtb3ZlVmFsdWVzKGUsdCl7ZT1ldChlKSx0PWV0KHQpO2NvbnN0IHI9dGhpcy52YWx1ZXMsbj10aGlzLnByZWZpeFN1bTtpZihlPj1yLmxlbmd0aClyZXR1cm4hMTt2YXIgaT1yLmxlbmd0aC1lO3JldHVybiAwIT09KHQ9aTw9dD9pOnQpJiYodGhpcy52YWx1ZXM9bmV3IFVpbnQzMkFycmF5KHIubGVuZ3RoLXQpLHRoaXMudmFsdWVzLnNldChyLnN1YmFycmF5KDAsZSksMCksdGhpcy52YWx1ZXMuc2V0KHIuc3ViYXJyYXkoZSt0KSxlKSx0aGlzLnByZWZpeFN1bT1uZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKSxlLTE8dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiYodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPWUtMSksMDw9dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiZ0aGlzLnByZWZpeFN1bS5zZXQobi5zdWJhcnJheSgwLHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSsxKSksITApfWdldFRvdGFsU3VtKCl7cmV0dXJuIDA9PT10aGlzLnZhbHVlcy5sZW5ndGg/MDp0aGlzLl9nZXRQcmVmaXhTdW0odGhpcy52YWx1ZXMubGVuZ3RoLTEpfWdldFByZWZpeFN1bShlKXtyZXR1cm4gZTwwPzA6KGU9ZXQoZSksdGhpcy5fZ2V0UHJlZml4U3VtKGUpKX1fZ2V0UHJlZml4U3VtKHQpe2lmKHQ8PXRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSlyZXR1cm4gdGhpcy5wcmVmaXhTdW1bdF07bGV0IHI9dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKzE7MD09PXImJih0aGlzLnByZWZpeFN1bVswXT10aGlzLnZhbHVlc1swXSxyKyspLHQ+PXRoaXMudmFsdWVzLmxlbmd0aCYmKHQ9dGhpcy52YWx1ZXMubGVuZ3RoLTEpO2ZvcihsZXQgZT1yO2U8PXQ7ZSsrKXRoaXMucHJlZml4U3VtW2VdPXRoaXMucHJlZml4U3VtW2UtMV0rdGhpcy52YWx1ZXNbZV07cmV0dXJuIHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXT1NYXRoLm1heCh0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0sdCksdGhpcy5wcmVmaXhTdW1bdF19Z2V0SW5kZXhPZihlKXtlPU1hdGguZmxvb3IoZSksdGhpcy5nZXRUb3RhbFN1bSgpO2xldCB0PTAscj10aGlzLnZhbHVlcy5sZW5ndGgtMSxuPTA7dmFyIGk7bGV0IG89MDtmb3IoO3Q8PXI7KWlmKG49dCsoci10KS8yfDAsaT10aGlzLnByZWZpeFN1bVtuXSxvPWktdGhpcy52YWx1ZXNbbl0sZTxvKXI9bi0xO2Vsc2V7aWYoIShpPD1lKSlicmVhazt0PW4rMX1yZXR1cm4gbmV3IHJ0KG4sZS1vKX19Y2xhc3MgcnR7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmluZGV4PWUsdGhpcy5yZW1haW5kZXI9dCx0aGlzLl9wcmVmaXhTdW1JbmRleE9mUmVzdWx0QnJhbmQ9dm9pZCAwLHRoaXMuaW5kZXg9ZSx0aGlzLnJlbWFpbmRlcj10fX1jb25zdCBudD1mdW5jdGlvbihlPSIiKXtsZXQgdD0iKC0/XFxkKlxcLlxcZFxcdyopfChbXiI7Zm9yKGNvbnN0IHIgb2YiYH4hQCMkJV4mKigpLT0rW3tdfVxcfDs6J1wiLC48Pi8/IikwPD1lLmluZGV4T2Yocil8fCh0Kz0iXFwiK3IpO3JldHVybiB0Kz0iXFxzXSspIixuZXcgUmVnRXhwKHQsImciKX0oKTtjb25zdCBpdD17bWF4TGVuOjFlMyx3aW5kb3dTaXplOjE1LHRpbWVCdWRnZXQ6MTUwfTtmdW5jdGlvbiBvdCh0LHIsbixpLG89aXQpe2lmKG4ubGVuZ3RoPm8ubWF4TGVuKXtsZXQgZT10LW8ubWF4TGVuLzI7cmV0dXJuIGU8MD9lPTA6aSs9ZSxvdCh0LHIsbj1uLnN1YnN0cmluZyhlLHQrby5tYXhMZW4vMiksaSxvKX12YXIgcz1EYXRlLm5vdygpLGE9dC0xLWk7bGV0IGw9LTEsdT1udWxsO2ZvcihsZXQgZT0xOyEoRGF0ZS5ub3coKS1zPj1vLnRpbWVCdWRnZXQpO2UrKyl7dmFyIGg9YS1vLndpbmRvd1NpemUqZTtyLmxhc3RJbmRleD1NYXRoLm1heCgwLGgpO3ZhciBjPWZ1bmN0aW9uKGUsdCxyLG4pe3ZhciBpO2Zvcig7aT1lLmV4ZWModCk7KXt2YXIgbz1pLmluZGV4fHwwO2lmKG88PXImJmUubGFzdEluZGV4Pj1yKXJldHVybiBpO2lmKDA8biYmbjxvKXJldHVybiBudWxsfXJldHVybiBudWxsfShyLG4sYSxsKTtpZighYyYmdSlicmVhaztpZih1PWMsaDw9MClicmVhaztsPWh9aWYodSl7aT17d29yZDp1WzBdLHN0YXJ0Q29sdW1uOmkrMSt1LmluZGV4LGVuZENvbHVtbjppKzErdS5pbmRleCt1WzBdLmxlbmd0aH07cmV0dXJuIHIubGFzdEluZGV4PTAsaX1yZXR1cm4gbnVsbH1jbGFzcyBzdHtjb25zdHJ1Y3RvcihlKXtlPVllKGUpO3RoaXMuX2RlZmF1bHRWYWx1ZT1lLHRoaXMuX2FzY2lpTWFwPXN0Ll9jcmVhdGVBc2NpaU1hcChlKSx0aGlzLl9tYXA9bmV3IE1hcH1zdGF0aWMgX2NyZWF0ZUFzY2lpTWFwKHQpe2xldCByPW5ldyBVaW50OEFycmF5KDI1Nik7Zm9yKGxldCBlPTA7ZTwyNTY7ZSsrKXJbZV09dDtyZXR1cm4gcn1zZXQoZSx0KXt0PVllKHQpOzA8PWUmJmU8MjU2P3RoaXMuX2FzY2lpTWFwW2VdPXQ6dGhpcy5fbWFwLnNldChlLHQpfWdldChlKXtyZXR1cm4gMDw9ZSYmZTwyNTY/dGhpcy5fYXNjaWlNYXBbZV06dGhpcy5fbWFwLmdldChlKXx8dGhpcy5fZGVmYXVsdFZhbHVlfX1jbGFzcyBhdHtjb25zdHJ1Y3RvcihyLG4saSl7Y29uc3Qgbz1uZXcgVWludDhBcnJheShyKm4pO2ZvcihsZXQgZT0wLHQ9cipuO2U8dDtlKyspb1tlXT1pO3RoaXMuX2RhdGE9byx0aGlzLnJvd3M9cix0aGlzLmNvbHM9bn1nZXQoZSx0KXtyZXR1cm4gdGhpcy5fZGF0YVtlKnRoaXMuY29scyt0XX1zZXQoZSx0LHIpe3RoaXMuX2RhdGFbZSp0aGlzLmNvbHMrdF09cn19Y2xhc3MgbHR7Y29uc3RydWN0b3Iocil7bGV0IG49MCxpPTA7Zm9yKGxldCBlPTAsdD1yLmxlbmd0aDtlPHQ7ZSsrKXt2YXJbbyxzLGFdPXJbZV07cz5uJiYobj1zKSxvPmkmJihpPW8pLGE+aSYmKGk9YSl9bisrLGkrKztsZXQgbD1uZXcgYXQoaSxuLDApO2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrKyl7dmFyW3UsaCxjXT1yW2VdO2wuc2V0KHUsaCxjKX10aGlzLl9zdGF0ZXM9bCx0aGlzLl9tYXhDaGFyQ29kZT1ufW5leHRTdGF0ZShlLHQpe3JldHVybiB0PDB8fHQ+PXRoaXMuX21heENoYXJDb2RlPzA6dGhpcy5fc3RhdGVzLmdldChlLHQpfX1sZXQgdXQ9bnVsbDtsZXQgaHQ9bnVsbDtjbGFzcyBjdHtzdGF0aWMgX2NyZWF0ZUxpbmsoZSx0LHIsbixpKXtsZXQgbz1pLTE7ZG97dmFyIHM9dC5jaGFyQ29kZUF0KG8pO2lmKDIhPT1lLmdldChzKSlicmVha313aGlsZShvLS0sbz5uKTt2YXIgYTtyZXR1cm4gMDxuJiYoYT10LmNoYXJDb2RlQXQobi0xKSxpPXQuY2hhckNvZGVBdChvKSwoNDA9PT1hJiY0MT09PWl8fDkxPT09YSYmOTM9PT1pfHwxMjM9PT1hJiYxMjU9PT1pKSYmby0tKSx7cmFuZ2U6e3N0YXJ0TGluZU51bWJlcjpyLHN0YXJ0Q29sdW1uOm4rMSxlbmRMaW5lTnVtYmVyOnIsZW5kQ29sdW1uOm8rMn0sdXJsOnQuc3Vic3RyaW5nKG4sbysxKX19c3RhdGljIGNvbXB1dGVMaW5rcyh0LGM9KG51bGw9PT11dCYmKHV0PW5ldyBsdChbWzEsMTA0LDJdLFsxLDcyLDJdLFsxLDEwMiw2XSxbMSw3MCw2XSxbMiwxMTYsM10sWzIsODQsM10sWzMsMTE2LDRdLFszLDg0LDRdLFs0LDExMiw1XSxbNCw4MCw1XSxbNSwxMTUsOV0sWzUsODMsOV0sWzUsNTgsMTBdLFs2LDEwNSw3XSxbNiw3Myw3XSxbNywxMDgsOF0sWzcsNzYsOF0sWzgsMTAxLDldLFs4LDY5LDldLFs5LDU4LDEwXSxbMTAsNDcsMTFdLFsxMSw0NywxMl1dKSksdXQpKXtjb25zdCBkPWZ1bmN0aW9uKCl7aWYobnVsbD09PWh0KXtodD1uZXcgc3QoMCk7dmFyIHQ9IiBcdDw+J1wi44CB44CC772h772k77yM77yO77ya77yb4oCY44CI44CM44CO44CU77yI77y7772b772i772j772d77y977yJ44CV44CP44CN44CJ4oCZ772A772e4oCmIjtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKylodC5zZXQodC5jaGFyQ29kZUF0KGUpLDEpO2ZvcihsZXQgZT0wO2U8Ii4sOyIubGVuZ3RoO2UrKylodC5zZXQoIi4sOyIuY2hhckNvZGVBdChlKSwyKX1yZXR1cm4gaHR9KCk7bGV0IGY9W107Zm9yKGxldCBoPTEsZT10LmdldExpbmVDb3VudCgpO2g8PWU7aCsrKXtjb25zdCBwPXQuZ2V0TGluZUNvbnRlbnQoaCk7dmFyIG09cC5sZW5ndGg7bGV0IHI9MCxuPTAsaT0wLG89MSxzPSExLGE9ITEsbD0hMSx1PSExO2Zvcig7cjxtOyl7bGV0IHQ9ITE7dmFyIGc9cC5jaGFyQ29kZUF0KHIpO2lmKDEzPT09byl7bGV0IGU7c3dpdGNoKGcpe2Nhc2UgNDA6cz0hMCxlPTA7YnJlYWs7Y2FzZSA0MTplPXM/MDoxO2JyZWFrO2Nhc2UgOTE6bD0hMCxhPSEwLGU9MDticmVhaztjYXNlIDkzOmw9ITEsZT1hPzA6MTticmVhaztjYXNlIDEyMzp1PSEwLGU9MDticmVhaztjYXNlIDEyNTplPXU/MDoxO2JyZWFrO2Nhc2UgMzk6ZT0zND09PWl8fDk2PT09aT8wOjE7YnJlYWs7Y2FzZSAzNDplPTM5PT09aXx8OTY9PT1pPzA6MTticmVhaztjYXNlIDk2OmU9Mzk9PT1pfHwzND09PWk/MDoxO2JyZWFrO2Nhc2UgNDI6ZT00Mj09PWk/MTowO2JyZWFrO2Nhc2UgMTI0OmU9MTI0PT09aT8xOjA7YnJlYWs7Y2FzZSAzMjplPWw/MDoxO2JyZWFrO2RlZmF1bHQ6ZT1kLmdldChnKX0xPT09ZSYmKGYucHVzaChjdC5fY3JlYXRlTGluayhkLHAsaCxuLHIpKSx0PSEwKX1lbHNlIGlmKDEyPT09byl7bGV0IGU7ZT05MT09PWc/KGE9ITAsMCk6ZC5nZXQoZyksMT09PWU/dD0hMDpvPTEzfWVsc2Ugbz1jLm5leHRTdGF0ZShvLGcpLDA9PT1vJiYodD0hMCk7dCYmKG89MSxzPSExLGE9ITEsdT0hMSxuPXIrMSxpPWcpLHIrK30xMz09PW8mJmYucHVzaChjdC5fY3JlYXRlTGluayhkLHAsaCxuLG0pKX1yZXR1cm4gZn19Y2xhc3MgZHR7Y29uc3RydWN0b3IoKXt0aGlzLl9kZWZhdWx0VmFsdWVTZXQ9W1sidHJ1ZSIsImZhbHNlIl0sWyJUcnVlIiwiRmFsc2UiXSxbIlByaXZhdGUiLCJQdWJsaWMiLCJGcmllbmQiLCJSZWFkT25seSIsIlBhcnRpYWwiLCJQcm90ZWN0ZWQiLCJXcml0ZU9ubHkiXSxbInB1YmxpYyIsInByb3RlY3RlZCIsInByaXZhdGUiXV19bmF2aWdhdGVWYWx1ZVNldChlLHQscixuLGkpe2lmKGUmJnQpe3Q9dGhpcy5kb05hdmlnYXRlVmFsdWVTZXQodCxpKTtpZih0KXJldHVybntyYW5nZTplLHZhbHVlOnR9fWlmKHImJm4pe2k9dGhpcy5kb05hdmlnYXRlVmFsdWVTZXQobixpKTtpZihpKXJldHVybntyYW5nZTpyLHZhbHVlOml9fXJldHVybiBudWxsfWRvTmF2aWdhdGVWYWx1ZVNldChlLHQpe3ZhciByPXRoaXMubnVtYmVyUmVwbGFjZShlLHQpO3JldHVybiBudWxsIT09cj9yOnRoaXMudGV4dFJlcGxhY2UoZSx0KX1udW1iZXJSZXBsYWNlKGUsdCl7dmFyIHI9TWF0aC5wb3coMTAsZS5sZW5ndGgtKGUubGFzdEluZGV4T2YoIi4iKSsxKSk7bGV0IG49TnVtYmVyKGUpO2U9cGFyc2VGbG9hdChlKTtyZXR1cm4haXNOYU4obikmJiFpc05hTihlKSYmbj09PWUmJigwIT09bnx8dCk/KG49TWF0aC5mbG9vcihuKnIpLG4rPXQ/cjotcixTdHJpbmcobi9yKSk6bnVsbH10ZXh0UmVwbGFjZShlLHQpe3JldHVybiB0aGlzLnZhbHVlU2V0c1JlcGxhY2UodGhpcy5fZGVmYXVsdFZhbHVlU2V0LGUsdCl9dmFsdWVTZXRzUmVwbGFjZShyLG4saSl7bGV0IG89bnVsbDtmb3IobGV0IGU9MCx0PXIubGVuZ3RoO251bGw9PT1vJiZlPHQ7ZSsrKW89dGhpcy52YWx1ZVNldFJlcGxhY2UocltlXSxuLGkpO3JldHVybiBvfXZhbHVlU2V0UmVwbGFjZShlLHQscil7bGV0IG49ZS5pbmRleE9mKHQpO3JldHVybiAwPD1uPyhuKz1yPzE6LTEsbjwwP249ZS5sZW5ndGgtMTpuJT1lLmxlbmd0aCxlW25dKTpudWxsfX1kdC5JTlNUQU5DRT1uZXcgZHQ7Y29uc3QgZnQ9T2JqZWN0LmZyZWV6ZShmdW5jdGlvbihlLHQpe2NvbnN0IHI9c2V0VGltZW91dChlLmJpbmQodCksMCk7cmV0dXJue2Rpc3Bvc2UoKXtjbGVhclRpbWVvdXQocil9fX0pOyh1ZT1sZT1sZXx8e30pLmlzQ2FuY2VsbGF0aW9uVG9rZW49ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT11ZS5Ob25lfHxlPT09dWUuQ2FuY2VsbGVkfHwoZSBpbnN0YW5jZW9mIG10fHwhKCFlfHwib2JqZWN0IiE9dHlwZW9mIGUpJiYoImJvb2xlYW4iPT10eXBlb2YgZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCYmImZ1bmN0aW9uIj09dHlwZW9mIGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKX0sdWUuTm9uZT1PYmplY3QuZnJlZXplKHtpc0NhbmNlbGxhdGlvblJlcXVlc3RlZDohMSxvbkNhbmNlbGxhdGlvblJlcXVlc3RlZDpVdC5Ob25lfSksdWUuQ2FuY2VsbGVkPU9iamVjdC5mcmVlemUoe2lzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiEwLG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOmZ0fSk7Y2xhc3MgbXR7Y29uc3RydWN0b3IoKXt0aGlzLl9pc0NhbmNlbGxlZD0hMSx0aGlzLl9lbWl0dGVyPW51bGx9Y2FuY2VsKCl7dGhpcy5faXNDYW5jZWxsZWR8fCh0aGlzLl9pc0NhbmNlbGxlZD0hMCx0aGlzLl9lbWl0dGVyJiYodGhpcy5fZW1pdHRlci5maXJlKHZvaWQgMCksdGhpcy5kaXNwb3NlKCkpKX1nZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKXtyZXR1cm4gdGhpcy5faXNDYW5jZWxsZWR9Z2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCl7cmV0dXJuIHRoaXMuX2lzQ2FuY2VsbGVkP2Z0Oih0aGlzLl9lbWl0dGVyfHwodGhpcy5fZW1pdHRlcj1uZXcgSSksdGhpcy5fZW1pdHRlci5ldmVudCl9ZGlzcG9zZSgpe3RoaXMuX2VtaXR0ZXImJih0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKSx0aGlzLl9lbWl0dGVyPW51bGwpfX1jbGFzcyBndHtjb25zdHJ1Y3RvcihlKXt0aGlzLl90b2tlbj12b2lkIDAsdGhpcy5fcGFyZW50TGlzdGVuZXI9dm9pZCAwLHRoaXMuX3BhcmVudExpc3RlbmVyPWUmJmUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQodGhpcy5jYW5jZWwsdGhpcyl9Z2V0IHRva2VuKCl7cmV0dXJuIHRoaXMuX3Rva2VufHwodGhpcy5fdG9rZW49bmV3IG10KSx0aGlzLl90b2tlbn1jYW5jZWwoKXt0aGlzLl90b2tlbj90aGlzLl90b2tlbiBpbnN0YW5jZW9mIG10JiZ0aGlzLl90b2tlbi5jYW5jZWwoKTp0aGlzLl90b2tlbj1sZS5DYW5jZWxsZWR9ZGlzcG9zZShlPSExKXtlJiZ0aGlzLmNhbmNlbCgpLHRoaXMuX3BhcmVudExpc3RlbmVyJiZ0aGlzLl9wYXJlbnRMaXN0ZW5lci5kaXNwb3NlKCksdGhpcy5fdG9rZW4/dGhpcy5fdG9rZW4gaW5zdGFuY2VvZiBtdCYmdGhpcy5fdG9rZW4uZGlzcG9zZSgpOnRoaXMuX3Rva2VuPWxlLk5vbmV9fWNsYXNzIHB0e2NvbnN0cnVjdG9yKCl7dGhpcy5fa2V5Q29kZVRvU3RyPVtdLHRoaXMuX3N0clRvS2V5Q29kZT1PYmplY3QuY3JlYXRlKG51bGwpfWRlZmluZShlLHQpe3RoaXMuX2tleUNvZGVUb1N0cltlXT10LHRoaXMuX3N0clRvS2V5Q29kZVt0LnRvTG93ZXJDYXNlKCldPWV9a2V5Q29kZVRvU3RyKGUpe3JldHVybiB0aGlzLl9rZXlDb2RlVG9TdHJbZV19c3RyVG9LZXlDb2RlKGUpe3JldHVybiB0aGlzLl9zdHJUb0tleUNvZGVbZS50b0xvd2VyQ2FzZSgpXXx8MH19Y29uc3QgdnQ9bmV3IHB0LHl0PW5ldyBwdCxidD1uZXcgcHQsX3Q9bmV3IEFycmF5KDIzMCksQ3Q9e30sU3Q9W10sd3Q9T2JqZWN0LmNyZWF0ZShudWxsKSxBdD1PYmplY3QuY3JlYXRlKG51bGwpLHh0PVtdLEV0PVtdO2ZvcihsZXQgZT0wO2U8PTE5MztlKyspeHRbZV09LTE7Zm9yKGxldCBlPTA7ZTw9MTI2O2UrKylFdFtlXT0tMTshZnVuY3Rpb24oKXtsZXQgZT1bXSx0PVtdO2Zvcihjb25zdCByIG9mW1swLDEsMCwiTm9uZSIsMCwidW5rbm93biIsMCwiVktfVU5LTk9XTiIsIiIsIiJdLFswLDEsMSwiSHlwZXIiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwyLCJTdXBlciIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDMsIkZuIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsNCwiRm5Mb2NrIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsNSwiU3VzcGVuZCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDYsIlJlc3VtZSIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDcsIlR1cmJvIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsOCwiU2xlZXAiLDAsIiIsMCwiVktfU0xFRVAiLCIiLCIiXSxbMCwxLDksIldha2VVcCIsMCwiIiwwLCIiLCIiLCIiXSxbMzEsMCwxMCwiS2V5QSIsMzEsIkEiLDY1LCJWS19BIiwiIiwiIl0sWzMyLDAsMTEsIktleUIiLDMyLCJCIiw2NiwiVktfQiIsIiIsIiJdLFszMywwLDEyLCJLZXlDIiwzMywiQyIsNjcsIlZLX0MiLCIiLCIiXSxbMzQsMCwxMywiS2V5RCIsMzQsIkQiLDY4LCJWS19EIiwiIiwiIl0sWzM1LDAsMTQsIktleUUiLDM1LCJFIiw2OSwiVktfRSIsIiIsIiJdLFszNiwwLDE1LCJLZXlGIiwzNiwiRiIsNzAsIlZLX0YiLCIiLCIiXSxbMzcsMCwxNiwiS2V5RyIsMzcsIkciLDcxLCJWS19HIiwiIiwiIl0sWzM4LDAsMTcsIktleUgiLDM4LCJIIiw3MiwiVktfSCIsIiIsIiJdLFszOSwwLDE4LCJLZXlJIiwzOSwiSSIsNzMsIlZLX0kiLCIiLCIiXSxbNDAsMCwxOSwiS2V5SiIsNDAsIkoiLDc0LCJWS19KIiwiIiwiIl0sWzQxLDAsMjAsIktleUsiLDQxLCJLIiw3NSwiVktfSyIsIiIsIiJdLFs0MiwwLDIxLCJLZXlMIiw0MiwiTCIsNzYsIlZLX0wiLCIiLCIiXSxbNDMsMCwyMiwiS2V5TSIsNDMsIk0iLDc3LCJWS19NIiwiIiwiIl0sWzQ0LDAsMjMsIktleU4iLDQ0LCJOIiw3OCwiVktfTiIsIiIsIiJdLFs0NSwwLDI0LCJLZXlPIiw0NSwiTyIsNzksIlZLX08iLCIiLCIiXSxbNDYsMCwyNSwiS2V5UCIsNDYsIlAiLDgwLCJWS19QIiwiIiwiIl0sWzQ3LDAsMjYsIktleVEiLDQ3LCJRIiw4MSwiVktfUSIsIiIsIiJdLFs0OCwwLDI3LCJLZXlSIiw0OCwiUiIsODIsIlZLX1IiLCIiLCIiXSxbNDksMCwyOCwiS2V5UyIsNDksIlMiLDgzLCJWS19TIiwiIiwiIl0sWzUwLDAsMjksIktleVQiLDUwLCJUIiw4NCwiVktfVCIsIiIsIiJdLFs1MSwwLDMwLCJLZXlVIiw1MSwiVSIsODUsIlZLX1UiLCIiLCIiXSxbNTIsMCwzMSwiS2V5ViIsNTIsIlYiLDg2LCJWS19WIiwiIiwiIl0sWzUzLDAsMzIsIktleVciLDUzLCJXIiw4NywiVktfVyIsIiIsIiJdLFs1NCwwLDMzLCJLZXlYIiw1NCwiWCIsODgsIlZLX1giLCIiLCIiXSxbNTUsMCwzNCwiS2V5WSIsNTUsIlkiLDg5LCJWS19ZIiwiIiwiIl0sWzU2LDAsMzUsIktleVoiLDU2LCJaIiw5MCwiVktfWiIsIiIsIiJdLFsyMiwwLDM2LCJEaWdpdDEiLDIyLCIxIiw0OSwiVktfMSIsIiIsIiJdLFsyMywwLDM3LCJEaWdpdDIiLDIzLCIyIiw1MCwiVktfMiIsIiIsIiJdLFsyNCwwLDM4LCJEaWdpdDMiLDI0LCIzIiw1MSwiVktfMyIsIiIsIiJdLFsyNSwwLDM5LCJEaWdpdDQiLDI1LCI0Iiw1MiwiVktfNCIsIiIsIiJdLFsyNiwwLDQwLCJEaWdpdDUiLDI2LCI1Iiw1MywiVktfNSIsIiIsIiJdLFsyNywwLDQxLCJEaWdpdDYiLDI3LCI2Iiw1NCwiVktfNiIsIiIsIiJdLFsyOCwwLDQyLCJEaWdpdDciLDI4LCI3Iiw1NSwiVktfNyIsIiIsIiJdLFsyOSwwLDQzLCJEaWdpdDgiLDI5LCI4Iiw1NiwiVktfOCIsIiIsIiJdLFszMCwwLDQ0LCJEaWdpdDkiLDMwLCI5Iiw1NywiVktfOSIsIiIsIiJdLFsyMSwwLDQ1LCJEaWdpdDAiLDIxLCIwIiw0OCwiVktfMCIsIiIsIiJdLFszLDEsNDYsIkVudGVyIiwzLCJFbnRlciIsMTMsIlZLX1JFVFVSTiIsIiIsIiJdLFs5LDEsNDcsIkVzY2FwZSIsOSwiRXNjYXBlIiwyNywiVktfRVNDQVBFIiwiIiwiIl0sWzEsMSw0OCwiQmFja3NwYWNlIiwxLCJCYWNrc3BhY2UiLDgsIlZLX0JBQ0siLCIiLCIiXSxbMiwxLDQ5LCJUYWIiLDIsIlRhYiIsOSwiVktfVEFCIiwiIiwiIl0sWzEwLDEsNTAsIlNwYWNlIiwxMCwiU3BhY2UiLDMyLCJWS19TUEFDRSIsIiIsIiJdLFs4MywwLDUxLCJNaW51cyIsODMsIi0iLDE4OSwiVktfT0VNX01JTlVTIiwiLSIsIk9FTV9NSU5VUyJdLFs4MSwwLDUyLCJFcXVhbCIsODEsIj0iLDE4NywiVktfT0VNX1BMVVMiLCI9IiwiT0VNX1BMVVMiXSxbODcsMCw1MywiQnJhY2tldExlZnQiLDg3LCJbIiwyMTksIlZLX09FTV80IiwiWyIsIk9FTV80Il0sWzg5LDAsNTQsIkJyYWNrZXRSaWdodCIsODksIl0iLDIyMSwiVktfT0VNXzYiLCJdIiwiT0VNXzYiXSxbODgsMCw1NSwiQmFja3NsYXNoIiw4OCwiXFwiLDIyMCwiVktfT0VNXzUiLCJcXCIsIk9FTV81Il0sWzAsMCw1NiwiSW50bEhhc2giLDAsIiIsMCwiIiwiIiwiIl0sWzgwLDAsNTcsIlNlbWljb2xvbiIsODAsIjsiLDE4NiwiVktfT0VNXzEiLCI7IiwiT0VNXzEiXSxbOTAsMCw1OCwiUXVvdGUiLDkwLCInIiwyMjIsIlZLX09FTV83IiwiJyIsIk9FTV83Il0sWzg2LDAsNTksIkJhY2txdW90ZSIsODYsImAiLDE5MiwiVktfT0VNXzMiLCJgIiwiT0VNXzMiXSxbODIsMCw2MCwiQ29tbWEiLDgyLCIsIiwxODgsIlZLX09FTV9DT01NQSIsIiwiLCJPRU1fQ09NTUEiXSxbODQsMCw2MSwiUGVyaW9kIiw4NCwiLiIsMTkwLCJWS19PRU1fUEVSSU9EIiwiLiIsIk9FTV9QRVJJT0QiXSxbODUsMCw2MiwiU2xhc2giLDg1LCIvIiwxOTEsIlZLX09FTV8yIiwiLyIsIk9FTV8yIl0sWzgsMSw2MywiQ2Fwc0xvY2siLDgsIkNhcHNMb2NrIiwyMCwiVktfQ0FQSVRBTCIsIiIsIiJdLFs1OSwxLDY0LCJGMSIsNTksIkYxIiwxMTIsIlZLX0YxIiwiIiwiIl0sWzYwLDEsNjUsIkYyIiw2MCwiRjIiLDExMywiVktfRjIiLCIiLCIiXSxbNjEsMSw2NiwiRjMiLDYxLCJGMyIsMTE0LCJWS19GMyIsIiIsIiJdLFs2MiwxLDY3LCJGNCIsNjIsIkY0IiwxMTUsIlZLX0Y0IiwiIiwiIl0sWzYzLDEsNjgsIkY1Iiw2MywiRjUiLDExNiwiVktfRjUiLCIiLCIiXSxbNjQsMSw2OSwiRjYiLDY0LCJGNiIsMTE3LCJWS19GNiIsIiIsIiJdLFs2NSwxLDcwLCJGNyIsNjUsIkY3IiwxMTgsIlZLX0Y3IiwiIiwiIl0sWzY2LDEsNzEsIkY4Iiw2NiwiRjgiLDExOSwiVktfRjgiLCIiLCIiXSxbNjcsMSw3MiwiRjkiLDY3LCJGOSIsMTIwLCJWS19GOSIsIiIsIiJdLFs2OCwxLDczLCJGMTAiLDY4LCJGMTAiLDEyMSwiVktfRjEwIiwiIiwiIl0sWzY5LDEsNzQsIkYxMSIsNjksIkYxMSIsMTIyLCJWS19GMTEiLCIiLCIiXSxbNzAsMSw3NSwiRjEyIiw3MCwiRjEyIiwxMjMsIlZLX0YxMiIsIiIsIiJdLFswLDEsNzYsIlByaW50U2NyZWVuIiwwLCIiLDAsIiIsIiIsIiJdLFs3OSwxLDc3LCJTY3JvbGxMb2NrIiw3OSwiU2Nyb2xsTG9jayIsMTQ1LCJWS19TQ1JPTEwiLCIiLCIiXSxbNywxLDc4LCJQYXVzZSIsNywiUGF1c2VCcmVhayIsMTksIlZLX1BBVVNFIiwiIiwiIl0sWzE5LDEsNzksIkluc2VydCIsMTksIkluc2VydCIsNDUsIlZLX0lOU0VSVCIsIiIsIiJdLFsxNCwxLDgwLCJIb21lIiwxNCwiSG9tZSIsMzYsIlZLX0hPTUUiLCIiLCIiXSxbMTEsMSw4MSwiUGFnZVVwIiwxMSwiUGFnZVVwIiwzMywiVktfUFJJT1IiLCIiLCIiXSxbMjAsMSw4MiwiRGVsZXRlIiwyMCwiRGVsZXRlIiw0NiwiVktfREVMRVRFIiwiIiwiIl0sWzEzLDEsODMsIkVuZCIsMTMsIkVuZCIsMzUsIlZLX0VORCIsIiIsIiJdLFsxMiwxLDg0LCJQYWdlRG93biIsMTIsIlBhZ2VEb3duIiwzNCwiVktfTkVYVCIsIiIsIiJdLFsxNywxLDg1LCJBcnJvd1JpZ2h0IiwxNywiUmlnaHRBcnJvdyIsMzksIlZLX1JJR0hUIiwiUmlnaHQiLCIiXSxbMTUsMSw4NiwiQXJyb3dMZWZ0IiwxNSwiTGVmdEFycm93IiwzNywiVktfTEVGVCIsIkxlZnQiLCIiXSxbMTgsMSw4NywiQXJyb3dEb3duIiwxOCwiRG93bkFycm93Iiw0MCwiVktfRE9XTiIsIkRvd24iLCIiXSxbMTYsMSw4OCwiQXJyb3dVcCIsMTYsIlVwQXJyb3ciLDM4LCJWS19VUCIsIlVwIiwiIl0sWzc4LDEsODksIk51bUxvY2siLDc4LCJOdW1Mb2NrIiwxNDQsIlZLX05VTUxPQ0siLCIiLCIiXSxbMTA4LDEsOTAsIk51bXBhZERpdmlkZSIsMTA4LCJOdW1QYWRfRGl2aWRlIiwxMTEsIlZLX0RJVklERSIsIiIsIiJdLFsxMDMsMSw5MSwiTnVtcGFkTXVsdGlwbHkiLDEwMywiTnVtUGFkX011bHRpcGx5IiwxMDYsIlZLX01VTFRJUExZIiwiIiwiIl0sWzEwNiwxLDkyLCJOdW1wYWRTdWJ0cmFjdCIsMTA2LCJOdW1QYWRfU3VidHJhY3QiLDEwOSwiVktfU1VCVFJBQ1QiLCIiLCIiXSxbMTA0LDEsOTMsIk51bXBhZEFkZCIsMTA0LCJOdW1QYWRfQWRkIiwxMDcsIlZLX0FERCIsIiIsIiJdLFszLDEsOTQsIk51bXBhZEVudGVyIiwzLCIiLDAsIiIsIiIsIiJdLFs5NCwxLDk1LCJOdW1wYWQxIiw5NCwiTnVtUGFkMSIsOTcsIlZLX05VTVBBRDEiLCIiLCIiXSxbOTUsMSw5NiwiTnVtcGFkMiIsOTUsIk51bVBhZDIiLDk4LCJWS19OVU1QQUQyIiwiIiwiIl0sWzk2LDEsOTcsIk51bXBhZDMiLDk2LCJOdW1QYWQzIiw5OSwiVktfTlVNUEFEMyIsIiIsIiJdLFs5NywxLDk4LCJOdW1wYWQ0Iiw5NywiTnVtUGFkNCIsMTAwLCJWS19OVU1QQUQ0IiwiIiwiIl0sWzk4LDEsOTksIk51bXBhZDUiLDk4LCJOdW1QYWQ1IiwxMDEsIlZLX05VTVBBRDUiLCIiLCIiXSxbOTksMSwxMDAsIk51bXBhZDYiLDk5LCJOdW1QYWQ2IiwxMDIsIlZLX05VTVBBRDYiLCIiLCIiXSxbMTAwLDEsMTAxLCJOdW1wYWQ3IiwxMDAsIk51bVBhZDciLDEwMywiVktfTlVNUEFENyIsIiIsIiJdLFsxMDEsMSwxMDIsIk51bXBhZDgiLDEwMSwiTnVtUGFkOCIsMTA0LCJWS19OVU1QQUQ4IiwiIiwiIl0sWzEwMiwxLDEwMywiTnVtcGFkOSIsMTAyLCJOdW1QYWQ5IiwxMDUsIlZLX05VTVBBRDkiLCIiLCIiXSxbOTMsMSwxMDQsIk51bXBhZDAiLDkzLCJOdW1QYWQwIiw5NiwiVktfTlVNUEFEMCIsIiIsIiJdLFsxMDcsMSwxMDUsIk51bXBhZERlY2ltYWwiLDEwNywiTnVtUGFkX0RlY2ltYWwiLDExMCwiVktfREVDSU1BTCIsIiIsIiJdLFs5MiwwLDEwNiwiSW50bEJhY2tzbGFzaCIsOTIsIk9FTV8xMDIiLDIyNiwiVktfT0VNXzEwMiIsIiIsIiJdLFs1OCwxLDEwNywiQ29udGV4dE1lbnUiLDU4LCJDb250ZXh0TWVudSIsOTMsIiIsIiIsIiJdLFswLDEsMTA4LCJQb3dlciIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDEwOSwiTnVtcGFkRXF1YWwiLDAsIiIsMCwiIiwiIiwiIl0sWzcxLDEsMTEwLCJGMTMiLDcxLCJGMTMiLDEyNCwiVktfRjEzIiwiIiwiIl0sWzcyLDEsMTExLCJGMTQiLDcyLCJGMTQiLDEyNSwiVktfRjE0IiwiIiwiIl0sWzczLDEsMTEyLCJGMTUiLDczLCJGMTUiLDEyNiwiVktfRjE1IiwiIiwiIl0sWzc0LDEsMTEzLCJGMTYiLDc0LCJGMTYiLDEyNywiVktfRjE2IiwiIiwiIl0sWzc1LDEsMTE0LCJGMTciLDc1LCJGMTciLDEyOCwiVktfRjE3IiwiIiwiIl0sWzc2LDEsMTE1LCJGMTgiLDc2LCJGMTgiLDEyOSwiVktfRjE4IiwiIiwiIl0sWzc3LDEsMTE2LCJGMTkiLDc3LCJGMTkiLDEzMCwiVktfRjE5IiwiIiwiIl0sWzAsMSwxMTcsIkYyMCIsMCwiIiwwLCJWS19GMjAiLCIiLCIiXSxbMCwxLDExOCwiRjIxIiwwLCIiLDAsIlZLX0YyMSIsIiIsIiJdLFswLDEsMTE5LCJGMjIiLDAsIiIsMCwiVktfRjIyIiwiIiwiIl0sWzAsMSwxMjAsIkYyMyIsMCwiIiwwLCJWS19GMjMiLCIiLCIiXSxbMCwxLDEyMSwiRjI0IiwwLCIiLDAsIlZLX0YyNCIsIiIsIiJdLFswLDEsMTIyLCJPcGVuIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTIzLCJIZWxwIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTI0LCJTZWxlY3QiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxMjUsIkFnYWluIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTI2LCJVbmRvIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTI3LCJDdXQiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxMjgsIkNvcHkiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxMjksIlBhc3RlIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTMwLCJGaW5kIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTMxLCJBdWRpb1ZvbHVtZU11dGUiLDExMiwiQXVkaW9Wb2x1bWVNdXRlIiwxNzMsIlZLX1ZPTFVNRV9NVVRFIiwiIiwiIl0sWzAsMSwxMzIsIkF1ZGlvVm9sdW1lVXAiLDExMywiQXVkaW9Wb2x1bWVVcCIsMTc1LCJWS19WT0xVTUVfVVAiLCIiLCIiXSxbMCwxLDEzMywiQXVkaW9Wb2x1bWVEb3duIiwxMTQsIkF1ZGlvVm9sdW1lRG93biIsMTc0LCJWS19WT0xVTUVfRE9XTiIsIiIsIiJdLFsxMDUsMSwxMzQsIk51bXBhZENvbW1hIiwxMDUsIk51bVBhZF9TZXBhcmF0b3IiLDEwOCwiVktfU0VQQVJBVE9SIiwiIiwiIl0sWzExMCwwLDEzNSwiSW50bFJvIiwxMTAsIkFCTlRfQzEiLDE5MywiVktfQUJOVF9DMSIsIiIsIiJdLFswLDEsMTM2LCJLYW5hTW9kZSIsMCwiIiwwLCIiLCIiLCIiXSxbMCwwLDEzNywiSW50bFllbiIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDEzOCwiQ29udmVydCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDEzOSwiTm9uQ29udmVydCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE0MCwiTGFuZzEiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNDEsIkxhbmcyIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTQyLCJMYW5nMyIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE0MywiTGFuZzQiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNDQsIkxhbmc1IiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTQ1LCJBYm9ydCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE0NiwiUHJvcHMiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNDcsIk51bXBhZFBhcmVuTGVmdCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE0OCwiTnVtcGFkUGFyZW5SaWdodCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE0OSwiTnVtcGFkQmFja3NwYWNlIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTUwLCJOdW1wYWRNZW1vcnlTdG9yZSIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE1MSwiTnVtcGFkTWVtb3J5UmVjYWxsIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTUyLCJOdW1wYWRNZW1vcnlDbGVhciIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE1MywiTnVtcGFkTWVtb3J5QWRkIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTU0LCJOdW1wYWRNZW1vcnlTdWJ0cmFjdCIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE1NSwiTnVtcGFkQ2xlYXIiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNTYsIk51bXBhZENsZWFyRW50cnkiLDAsIiIsMCwiIiwiIiwiIl0sWzUsMSwwLCIiLDUsIkN0cmwiLDE3LCJWS19DT05UUk9MIiwiIiwiIl0sWzQsMSwwLCIiLDQsIlNoaWZ0IiwxNiwiVktfU0hJRlQiLCIiLCIiXSxbNiwxLDAsIiIsNiwiQWx0IiwxOCwiVktfTUVOVSIsIiIsIiJdLFs1NywxLDAsIiIsNTcsIk1ldGEiLDAsIlZLX0NPTU1BTkQiLCIiLCIiXSxbNSwxLDE1NywiQ29udHJvbExlZnQiLDUsIiIsMCwiVktfTENPTlRST0wiLCIiLCIiXSxbNCwxLDE1OCwiU2hpZnRMZWZ0Iiw0LCIiLDAsIlZLX0xTSElGVCIsIiIsIiJdLFs2LDEsMTU5LCJBbHRMZWZ0Iiw2LCIiLDAsIlZLX0xNRU5VIiwiIiwiIl0sWzU3LDEsMTYwLCJNZXRhTGVmdCIsNTcsIiIsMCwiVktfTFdJTiIsIiIsIiJdLFs1LDEsMTYxLCJDb250cm9sUmlnaHQiLDUsIiIsMCwiVktfUkNPTlRST0wiLCIiLCIiXSxbNCwxLDE2MiwiU2hpZnRSaWdodCIsNCwiIiwwLCJWS19SU0hJRlQiLCIiLCIiXSxbNiwxLDE2MywiQWx0UmlnaHQiLDYsIiIsMCwiVktfUk1FTlUiLCIiLCIiXSxbNTcsMSwxNjQsIk1ldGFSaWdodCIsNTcsIiIsMCwiVktfUldJTiIsIiIsIiJdLFswLDEsMTY1LCJCcmlnaHRuZXNzVXAiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNjYsIkJyaWdodG5lc3NEb3duIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTY3LCJNZWRpYVBsYXkiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxNjgsIk1lZGlhUmVjb3JkIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTY5LCJNZWRpYUZhc3RGb3J3YXJkIiwwLCIiLDAsIiIsIiIsIiJdLFswLDEsMTcwLCJNZWRpYVJld2luZCIsMCwiIiwwLCIiLCIiLCIiXSxbMTE0LDEsMTcxLCJNZWRpYVRyYWNrTmV4dCIsMTE5LCJNZWRpYVRyYWNrTmV4dCIsMTc2LCJWS19NRURJQV9ORVhUX1RSQUNLIiwiIiwiIl0sWzExNSwxLDE3MiwiTWVkaWFUcmFja1ByZXZpb3VzIiwxMjAsIk1lZGlhVHJhY2tQcmV2aW91cyIsMTc3LCJWS19NRURJQV9QUkVWX1RSQUNLIiwiIiwiIl0sWzExNiwxLDE3MywiTWVkaWFTdG9wIiwxMjEsIk1lZGlhU3RvcCIsMTc4LCJWS19NRURJQV9TVE9QIiwiIiwiIl0sWzAsMSwxNzQsIkVqZWN0IiwwLCIiLDAsIiIsIiIsIiJdLFsxMTcsMSwxNzUsIk1lZGlhUGxheVBhdXNlIiwxMjIsIk1lZGlhUGxheVBhdXNlIiwxNzksIlZLX01FRElBX1BMQVlfUEFVU0UiLCIiLCIiXSxbMCwxLDE3NiwiTWVkaWFTZWxlY3QiLDEyMywiTGF1bmNoTWVkaWFQbGF5ZXIiLDE4MSwiVktfTUVESUFfTEFVTkNIX01FRElBX1NFTEVDVCIsIiIsIiJdLFswLDEsMTc3LCJMYXVuY2hNYWlsIiwxMjQsIkxhdW5jaE1haWwiLDE4MCwiVktfTUVESUFfTEFVTkNIX01BSUwiLCIiLCIiXSxbMCwxLDE3OCwiTGF1bmNoQXBwMiIsMTI1LCJMYXVuY2hBcHAyIiwxODMsIlZLX01FRElBX0xBVU5DSF9BUFAyIiwiIiwiIl0sWzAsMSwxNzksIkxhdW5jaEFwcDEiLDAsIiIsMCwiVktfTUVESUFfTEFVTkNIX0FQUDEiLCIiLCIiXSxbMCwxLDE4MCwiU2VsZWN0VGFzayIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE4MSwiTGF1bmNoU2NyZWVuU2F2ZXIiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxODIsIkJyb3dzZXJTZWFyY2giLDExNSwiQnJvd3NlclNlYXJjaCIsMTcwLCJWS19CUk9XU0VSX1NFQVJDSCIsIiIsIiJdLFswLDEsMTgzLCJCcm93c2VySG9tZSIsMTE2LCJCcm93c2VySG9tZSIsMTcyLCJWS19CUk9XU0VSX0hPTUUiLCIiLCIiXSxbMTEyLDEsMTg0LCJCcm93c2VyQmFjayIsMTE3LCJCcm93c2VyQmFjayIsMTY2LCJWS19CUk9XU0VSX0JBQ0siLCIiLCIiXSxbMTEzLDEsMTg1LCJCcm93c2VyRm9yd2FyZCIsMTE4LCJCcm93c2VyRm9yd2FyZCIsMTY3LCJWS19CUk9XU0VSX0ZPUldBUkQiLCIiLCIiXSxbMCwxLDE4NiwiQnJvd3NlclN0b3AiLDAsIiIsMCwiVktfQlJPV1NFUl9TVE9QIiwiIiwiIl0sWzAsMSwxODcsIkJyb3dzZXJSZWZyZXNoIiwwLCIiLDAsIlZLX0JST1dTRVJfUkVGUkVTSCIsIiIsIiJdLFswLDEsMTg4LCJCcm93c2VyRmF2b3JpdGVzIiwwLCIiLDAsIlZLX0JST1dTRVJfRkFWT1JJVEVTIiwiIiwiIl0sWzAsMSwxODksIlpvb21Ub2dnbGUiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxOTAsIk1haWxSZXBseSIsMCwiIiwwLCIiLCIiLCIiXSxbMCwxLDE5MSwiTWFpbEZvcndhcmQiLDAsIiIsMCwiIiwiIiwiIl0sWzAsMSwxOTIsIk1haWxTZW5kIiwwLCIiLDAsIiIsIiIsIiJdLFsxMDksMSwwLCIiLDEwOSwiS2V5SW5Db21wb3NpdGlvbiIsMjI5LCIiLCIiLCIiXSxbMTExLDEsMCwiIiwxMTEsIkFCTlRfQzIiLDE5NCwiVktfQUJOVF9DMiIsIiIsIiJdLFs5MSwxLDAsIiIsOTEsIk9FTV84IiwyMjMsIlZLX09FTV84IiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfQ0xFQVIiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19LQU5BIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfSEFOR1VMIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfSlVOSkEiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19GSU5BTCIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0hBTkpBIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfS0FOSkkiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19DT05WRVJUIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfTk9OQ09OVkVSVCIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0FDQ0VQVCIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX01PREVDSEFOR0UiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19TRUxFQ1QiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19QUklOVCIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0VYRUNVVEUiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19TTkFQU0hPVCIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0hFTFAiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19BUFBTIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfUFJPQ0VTU0tFWSIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX1BBQ0tFVCIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0RCRV9TQkNTQ0hBUiIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0RCRV9EQkNTQ0hBUiIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0FUVE4iLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19DUlNFTCIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX0VYU0VMIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfRVJFT0YiLCIiLCIiXSxbMCwxLDAsIiIsMCwiIiwwLCJWS19QTEFZIiwiIiwiIl0sWzAsMSwwLCIiLDAsIiIsMCwiVktfWk9PTSIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX05PTkFNRSIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX1BBMSIsIiIsIiJdLFswLDEsMCwiIiwwLCIiLDAsIlZLX09FTV9DTEVBUiIsIiIsIiJdXSl7Y29uc3RbLG4saSxvLHMsYSxsLHUsaCxjXT1yO2lmKHRbaV18fCh0W2ldPSEwLFN0W2ldPW8sd3Rbb109aSxBdFtvLnRvTG93ZXJDYXNlKCldPWksbiYmMCE9PSh4dFtpXT1zKSYmMyE9PXMmJjUhPT1zJiY0IT09cyYmNiE9PXMmJjU3IT09cyYmKEV0W3NdPWkpKSwhZVtzXSl7aWYoZVtzXT0hMCwhYSl0aHJvdyBuZXcgRXJyb3IoYFN0cmluZyByZXByZXNlbnRhdGlvbiBtaXNzaW5nIGZvciBrZXkgY29kZSAke3N9IGFyb3VuZCBzY2FuIGNvZGUgYCtvKTt2dC5kZWZpbmUocyxhKSx5dC5kZWZpbmUocyxofHxhKSxidC5kZWZpbmUocyxjfHxofHxhKX1sJiYoX3RbbF09cyksdSYmKEN0W3VdPXMpfUV0WzNdPTQ2fSgpO2NsYXNzIE50IGV4dGVuZHMgQmV7Y29uc3RydWN0b3IoZSx0LHIsbil7c3VwZXIoZSx0LHIsbiksdGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXI9ZSx0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uPXQsdGhpcy5wb3NpdGlvbkxpbmVOdW1iZXI9cix0aGlzLnBvc2l0aW9uQ29sdW1uPW59dG9TdHJpbmcoKXtyZXR1cm4iWyIrdGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIrIiwiK3RoaXMuc2VsZWN0aW9uU3RhcnRDb2x1bW4rIiAtPiAiK3RoaXMucG9zaXRpb25MaW5lTnVtYmVyKyIsIit0aGlzLnBvc2l0aW9uQ29sdW1uKyJdIn1lcXVhbHNTZWxlY3Rpb24oZSl7cmV0dXJuIE50LnNlbGVjdGlvbnNFcXVhbCh0aGlzLGUpfXN0YXRpYyBzZWxlY3Rpb25zRXF1YWwoZSx0KXtyZXR1cm4gZS5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXI9PT10LnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciYmZS5zZWxlY3Rpb25TdGFydENvbHVtbj09PXQuc2VsZWN0aW9uU3RhcnRDb2x1bW4mJmUucG9zaXRpb25MaW5lTnVtYmVyPT09dC5wb3NpdGlvbkxpbmVOdW1iZXImJmUucG9zaXRpb25Db2x1bW49PT10LnBvc2l0aW9uQ29sdW1ufWdldERpcmVjdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlcj09PXRoaXMuc3RhcnRMaW5lTnVtYmVyJiZ0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uPT09dGhpcy5zdGFydENvbHVtbj8wOjF9c2V0RW5kUG9zaXRpb24oZSx0KXtyZXR1cm4gMD09PXRoaXMuZ2V0RGlyZWN0aW9uKCk/bmV3IE50KHRoaXMuc3RhcnRMaW5lTnVtYmVyLHRoaXMuc3RhcnRDb2x1bW4sZSx0KTpuZXcgTnQoZSx0LHRoaXMuc3RhcnRMaW5lTnVtYmVyLHRoaXMuc3RhcnRDb2x1bW4pfWdldFBvc2l0aW9uKCl7cmV0dXJuIG5ldyBxZSh0aGlzLnBvc2l0aW9uTGluZU51bWJlcix0aGlzLnBvc2l0aW9uQ29sdW1uKX1nZXRTZWxlY3Rpb25TdGFydCgpe3JldHVybiBuZXcgcWUodGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIsdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbil9c2V0U3RhcnRQb3NpdGlvbihlLHQpe3JldHVybiAwPT09dGhpcy5nZXREaXJlY3Rpb24oKT9uZXcgTnQoZSx0LHRoaXMuZW5kTGluZU51bWJlcix0aGlzLmVuZENvbHVtbik6bmV3IE50KHRoaXMuZW5kTGluZU51bWJlcix0aGlzLmVuZENvbHVtbixlLHQpfXN0YXRpYyBmcm9tUG9zaXRpb25zKGUsdD1lKXtyZXR1cm4gbmV3IE50KGUubGluZU51bWJlcixlLmNvbHVtbix0LmxpbmVOdW1iZXIsdC5jb2x1bW4pfXN0YXRpYyBmcm9tUmFuZ2UoZSx0KXtyZXR1cm4gMD09PXQ/bmV3IE50KGUuc3RhcnRMaW5lTnVtYmVyLGUuc3RhcnRDb2x1bW4sZS5lbmRMaW5lTnVtYmVyLGUuZW5kQ29sdW1uKTpuZXcgTnQoZS5lbmRMaW5lTnVtYmVyLGUuZW5kQ29sdW1uLGUuc3RhcnRMaW5lTnVtYmVyLGUuc3RhcnRDb2x1bW4pfXN0YXRpYyBsaWZ0U2VsZWN0aW9uKGUpe3JldHVybiBuZXcgTnQoZS5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIsZS5zZWxlY3Rpb25TdGFydENvbHVtbixlLnBvc2l0aW9uTGluZU51bWJlcixlLnBvc2l0aW9uQ29sdW1uKX1zdGF0aWMgc2VsZWN0aW9uc0FyckVxdWFsKHIsbil7aWYociYmIW58fCFyJiZuKXJldHVybiExO2lmKCFyJiYhbilyZXR1cm4hMDtpZihyLmxlbmd0aCE9PW4ubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgZT0wLHQ9ci5sZW5ndGg7ZTx0O2UrKylpZighdGhpcy5zZWxlY3Rpb25zRXF1YWwocltlXSxuW2VdKSlyZXR1cm4hMTtyZXR1cm4hMH1zdGF0aWMgaXNJU2VsZWN0aW9uKGUpe3JldHVybiBlJiYibnVtYmVyIj09dHlwZW9mIGUuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyJiYibnVtYmVyIj09dHlwZW9mIGUuc2VsZWN0aW9uU3RhcnRDb2x1bW4mJiJudW1iZXIiPT10eXBlb2YgZS5wb3NpdGlvbkxpbmVOdW1iZXImJiJudW1iZXIiPT10eXBlb2YgZS5wb3NpdGlvbkNvbHVtbn1zdGF0aWMgY3JlYXRlV2l0aERpcmVjdGlvbihlLHQscixuLGkpe3JldHVybiAwPT09aT9uZXcgTnQoZSx0LHIsbik6bmV3IE50KHIsbixlLHQpfX1jbGFzcyBMdHtjb25zdHJ1Y3RvcihlLHQscil7dGhpcy5fdG9rZW5CcmFuZD12b2lkIDAsdGhpcy5vZmZzZXQ9ZSx0aGlzLnR5cGU9dCx0aGlzLmxhbmd1YWdlPXJ9dG9TdHJpbmcoKXtyZXR1cm4iKCIrdGhpcy5vZmZzZXQrIiwgIit0aGlzLnR5cGUrIikifX1jbGFzcyBrdHtjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX3Rva2VuaXphdGlvblJlc3VsdEJyYW5kPXZvaWQgMCx0aGlzLnRva2Vucz1lLHRoaXMuZW5kU3RhdGU9dH19Y2xhc3MgTXR7Y29uc3RydWN0b3IoZSx0KXt0aGlzLl90b2tlbml6YXRpb25SZXN1bHQyQnJhbmQ9dm9pZCAwLHRoaXMudG9rZW5zPWUsdGhpcy5lbmRTdGF0ZT10fX0oVXQ9aGU9aGV8fHt9KVtVdC5EZXBlbmRzT25LYkxheW91dD0tMV09IkRlcGVuZHNPbktiTGF5b3V0IixVdFtVdC5Vbmtub3duPTBdPSJVbmtub3duIixVdFtVdC5CYWNrc3BhY2U9MV09IkJhY2tzcGFjZSIsVXRbVXQuVGFiPTJdPSJUYWIiLFV0W1V0LkVudGVyPTNdPSJFbnRlciIsVXRbVXQuU2hpZnQ9NF09IlNoaWZ0IixVdFtVdC5DdHJsPTVdPSJDdHJsIixVdFtVdC5BbHQ9Nl09IkFsdCIsVXRbVXQuUGF1c2VCcmVhaz03XT0iUGF1c2VCcmVhayIsVXRbVXQuQ2Fwc0xvY2s9OF09IkNhcHNMb2NrIixVdFtVdC5Fc2NhcGU9OV09IkVzY2FwZSIsVXRbVXQuU3BhY2U9MTBdPSJTcGFjZSIsVXRbVXQuUGFnZVVwPTExXT0iUGFnZVVwIixVdFtVdC5QYWdlRG93bj0xMl09IlBhZ2VEb3duIixVdFtVdC5FbmQ9MTNdPSJFbmQiLFV0W1V0LkhvbWU9MTRdPSJIb21lIixVdFtVdC5MZWZ0QXJyb3c9MTVdPSJMZWZ0QXJyb3ciLFV0W1V0LlVwQXJyb3c9MTZdPSJVcEFycm93IixVdFtVdC5SaWdodEFycm93PTE3XT0iUmlnaHRBcnJvdyIsVXRbVXQuRG93bkFycm93PTE4XT0iRG93bkFycm93IixVdFtVdC5JbnNlcnQ9MTldPSJJbnNlcnQiLFV0W1V0LkRlbGV0ZT0yMF09IkRlbGV0ZSIsVXRbVXQuRGlnaXQwPTIxXT0iRGlnaXQwIixVdFtVdC5EaWdpdDE9MjJdPSJEaWdpdDEiLFV0W1V0LkRpZ2l0Mj0yM109IkRpZ2l0MiIsVXRbVXQuRGlnaXQzPTI0XT0iRGlnaXQzIixVdFtVdC5EaWdpdDQ9MjVdPSJEaWdpdDQiLFV0W1V0LkRpZ2l0NT0yNl09IkRpZ2l0NSIsVXRbVXQuRGlnaXQ2PTI3XT0iRGlnaXQ2IixVdFtVdC5EaWdpdDc9MjhdPSJEaWdpdDciLFV0W1V0LkRpZ2l0OD0yOV09IkRpZ2l0OCIsVXRbVXQuRGlnaXQ5PTMwXT0iRGlnaXQ5IixVdFtVdC5LZXlBPTMxXT0iS2V5QSIsVXRbVXQuS2V5Qj0zMl09IktleUIiLFV0W1V0LktleUM9MzNdPSJLZXlDIixVdFtVdC5LZXlEPTM0XT0iS2V5RCIsVXRbVXQuS2V5RT0zNV09IktleUUiLFV0W1V0LktleUY9MzZdPSJLZXlGIixVdFtVdC5LZXlHPTM3XT0iS2V5RyIsVXRbVXQuS2V5SD0zOF09IktleUgiLFV0W1V0LktleUk9MzldPSJLZXlJIixVdFtVdC5LZXlKPTQwXT0iS2V5SiIsVXRbVXQuS2V5Sz00MV09IktleUsiLFV0W1V0LktleUw9NDJdPSJLZXlMIixVdFtVdC5LZXlNPTQzXT0iS2V5TSIsVXRbVXQuS2V5Tj00NF09IktleU4iLFV0W1V0LktleU89NDVdPSJLZXlPIixVdFtVdC5LZXlQPTQ2XT0iS2V5UCIsVXRbVXQuS2V5UT00N109IktleVEiLFV0W1V0LktleVI9NDhdPSJLZXlSIixVdFtVdC5LZXlTPTQ5XT0iS2V5UyIsVXRbVXQuS2V5VD01MF09IktleVQiLFV0W1V0LktleVU9NTFdPSJLZXlVIixVdFtVdC5LZXlWPTUyXT0iS2V5ViIsVXRbVXQuS2V5Vz01M109IktleVciLFV0W1V0LktleVg9NTRdPSJLZXlYIixVdFtVdC5LZXlZPTU1XT0iS2V5WSIsVXRbVXQuS2V5Wj01Nl09IktleVoiLFV0W1V0Lk1ldGE9NTddPSJNZXRhIixVdFtVdC5Db250ZXh0TWVudT01OF09IkNvbnRleHRNZW51IixVdFtVdC5GMT01OV09IkYxIixVdFtVdC5GMj02MF09IkYyIixVdFtVdC5GMz02MV09IkYzIixVdFtVdC5GND02Ml09IkY0IixVdFtVdC5GNT02M109IkY1IixVdFtVdC5GNj02NF09IkY2IixVdFtVdC5GNz02NV09IkY3IixVdFtVdC5GOD02Nl09IkY4IixVdFtVdC5GOT02N109IkY5IixVdFtVdC5GMTA9NjhdPSJGMTAiLFV0W1V0LkYxMT02OV09IkYxMSIsVXRbVXQuRjEyPTcwXT0iRjEyIixVdFtVdC5GMTM9NzFdPSJGMTMiLFV0W1V0LkYxND03Ml09IkYxNCIsVXRbVXQuRjE1PTczXT0iRjE1IixVdFtVdC5GMTY9NzRdPSJGMTYiLFV0W1V0LkYxNz03NV09IkYxNyIsVXRbVXQuRjE4PTc2XT0iRjE4IixVdFtVdC5GMTk9NzddPSJGMTkiLFV0W1V0Lk51bUxvY2s9NzhdPSJOdW1Mb2NrIixVdFtVdC5TY3JvbGxMb2NrPTc5XT0iU2Nyb2xsTG9jayIsVXRbVXQuU2VtaWNvbG9uPTgwXT0iU2VtaWNvbG9uIixVdFtVdC5FcXVhbD04MV09IkVxdWFsIixVdFtVdC5Db21tYT04Ml09IkNvbW1hIixVdFtVdC5NaW51cz04M109Ik1pbnVzIixVdFtVdC5QZXJpb2Q9ODRdPSJQZXJpb2QiLFV0W1V0LlNsYXNoPTg1XT0iU2xhc2giLFV0W1V0LkJhY2txdW90ZT04Nl09IkJhY2txdW90ZSIsVXRbVXQuQnJhY2tldExlZnQ9ODddPSJCcmFja2V0TGVmdCIsVXRbVXQuQmFja3NsYXNoPTg4XT0iQmFja3NsYXNoIixVdFtVdC5CcmFja2V0UmlnaHQ9ODldPSJCcmFja2V0UmlnaHQiLFV0W1V0LlF1b3RlPTkwXT0iUXVvdGUiLFV0W1V0Lk9FTV84PTkxXT0iT0VNXzgiLFV0W1V0LkludGxCYWNrc2xhc2g9OTJdPSJJbnRsQmFja3NsYXNoIixVdFtVdC5OdW1wYWQwPTkzXT0iTnVtcGFkMCIsVXRbVXQuTnVtcGFkMT05NF09Ik51bXBhZDEiLFV0W1V0Lk51bXBhZDI9OTVdPSJOdW1wYWQyIixVdFtVdC5OdW1wYWQzPTk2XT0iTnVtcGFkMyIsVXRbVXQuTnVtcGFkND05N109Ik51bXBhZDQiLFV0W1V0Lk51bXBhZDU9OThdPSJOdW1wYWQ1IixVdFtVdC5OdW1wYWQ2PTk5XT0iTnVtcGFkNiIsVXRbVXQuTnVtcGFkNz0xMDBdPSJOdW1wYWQ3IixVdFtVdC5OdW1wYWQ4PTEwMV09Ik51bXBhZDgiLFV0W1V0Lk51bXBhZDk9MTAyXT0iTnVtcGFkOSIsVXRbVXQuTnVtcGFkTXVsdGlwbHk9MTAzXT0iTnVtcGFkTXVsdGlwbHkiLFV0W1V0Lk51bXBhZEFkZD0xMDRdPSJOdW1wYWRBZGQiLFV0W1V0Lk5VTVBBRF9TRVBBUkFUT1I9MTA1XT0iTlVNUEFEX1NFUEFSQVRPUiIsVXRbVXQuTnVtcGFkU3VidHJhY3Q9MTA2XT0iTnVtcGFkU3VidHJhY3QiLFV0W1V0Lk51bXBhZERlY2ltYWw9MTA3XT0iTnVtcGFkRGVjaW1hbCIsVXRbVXQuTnVtcGFkRGl2aWRlPTEwOF09Ik51bXBhZERpdmlkZSIsVXRbVXQuS0VZX0lOX0NPTVBPU0lUSU9OPTEwOV09IktFWV9JTl9DT01QT1NJVElPTiIsVXRbVXQuQUJOVF9DMT0xMTBdPSJBQk5UX0MxIixVdFtVdC5BQk5UX0MyPTExMV09IkFCTlRfQzIiLFV0W1V0LkF1ZGlvVm9sdW1lTXV0ZT0xMTJdPSJBdWRpb1ZvbHVtZU11dGUiLFV0W1V0LkF1ZGlvVm9sdW1lVXA9MTEzXT0iQXVkaW9Wb2x1bWVVcCIsVXRbVXQuQXVkaW9Wb2x1bWVEb3duPTExNF09IkF1ZGlvVm9sdW1lRG93biIsVXRbVXQuQnJvd3NlclNlYXJjaD0xMTVdPSJCcm93c2VyU2VhcmNoIixVdFtVdC5Ccm93c2VySG9tZT0xMTZdPSJCcm93c2VySG9tZSIsVXRbVXQuQnJvd3NlckJhY2s9MTE3XT0iQnJvd3NlckJhY2siLFV0W1V0LkJyb3dzZXJGb3J3YXJkPTExOF09IkJyb3dzZXJGb3J3YXJkIixVdFtVdC5NZWRpYVRyYWNrTmV4dD0xMTldPSJNZWRpYVRyYWNrTmV4dCIsVXRbVXQuTWVkaWFUcmFja1ByZXZpb3VzPTEyMF09Ik1lZGlhVHJhY2tQcmV2aW91cyIsVXRbVXQuTWVkaWFTdG9wPTEyMV09Ik1lZGlhU3RvcCIsVXRbVXQuTWVkaWFQbGF5UGF1c2U9MTIyXT0iTWVkaWFQbGF5UGF1c2UiLFV0W1V0LkxhdW5jaE1lZGlhUGxheWVyPTEyM109IkxhdW5jaE1lZGlhUGxheWVyIixVdFtVdC5MYXVuY2hNYWlsPTEyNF09IkxhdW5jaE1haWwiLFV0W1V0LkxhdW5jaEFwcDI9MTI1XT0iTGF1bmNoQXBwMiIsVXRbVXQuTUFYX1ZBTFVFPTEyNl09Ik1BWF9WQUxVRSIsKFV0PXByPXByfHx7fSlbVXQuVHJhY2U9MF09IlRyYWNlIixVdFtVdC5EZWJ1Zz0xXT0iRGVidWciLFV0W1V0LkluZm89Ml09IkluZm8iLFV0W1V0Lldhcm5pbmc9M109Ildhcm5pbmciLFV0W1V0LkVycm9yPTRdPSJFcnJvciIsVXRbVXQuQ3JpdGljYWw9NV09IkNyaXRpY2FsIixVdFtVdC5PZmY9Nl09Ik9mZiIsKFV0PWNlPWNlfHx7fSlbVXQuUGFyYWdyYXBoPTBdPSJQYXJhZ3JhcGgiLFV0W1V0LkJyZWFrPTFdPSJCcmVhayIsKFV0PWRlPWRlfHx7fSlbVXQuSGludD0xXT0iSGludCIsVXRbVXQuSW5mbz0yXT0iSW5mbyIsVXRbVXQuV2FybmluZz00XT0iV2FybmluZyIsVXRbVXQuRXJyb3I9OF09IkVycm9yIiwoVXQ9ZmU9ZmV8fHt9KVtVdC5Vbm5lY2Vzc2FyeT0xXT0iVW5uZWNlc3NhcnkiLFV0W1V0LkRlcHJlY2F0ZWQ9Ml09IkRlcHJlY2F0ZWQiLChVdD1tZT1tZXx8e30pW1V0LkxUUj0wXT0iTFRSIixVdFtVdC5SVEw9MV09IlJUTCI7Y29uc3QgVHQ9bmV3IGNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5faWNvbnM9bmV3IE1hcCx0aGlzLl9vbkRpZFJlZ2lzdGVyPW5ldyBJfWFkZChlKXtjb25zdCB0PXRoaXMuX2ljb25zLmdldChlLmlkKTt0P2UuZGVzY3JpcHRpb24/dC5kZXNjcmlwdGlvbj1lLmRlc2NyaXB0aW9uOmNvbnNvbGUuZXJyb3IoIkR1cGxpY2F0ZSByZWdpc3RyYXRpb24gb2YgY29kaWNvbiAiK2UuaWQpOih0aGlzLl9pY29ucy5zZXQoZS5pZCxlKSx0aGlzLl9vbkRpZFJlZ2lzdGVyLmZpcmUoZSkpfWdldChlKXtyZXR1cm4gdGhpcy5faWNvbnMuZ2V0KGUpfWdldCBhbGwoKXtyZXR1cm4gdGhpcy5faWNvbnMudmFsdWVzKCl9Z2V0IG9uRGlkUmVnaXN0ZXIoKXtyZXR1cm4gdGhpcy5fb25EaWRSZWdpc3Rlci5ldmVudH19O2NsYXNzIE90e2NvbnN0cnVjdG9yKGUsdCxyKXt0aGlzLmlkPWUsdGhpcy5kZWZpbml0aW9uPXQsdGhpcy5kZXNjcmlwdGlvbj1yLFR0LmFkZCh0aGlzKX1nZXQgY2xhc3NOYW1lcygpe3JldHVybiJjb2RpY29uIGNvZGljb24tIit0aGlzLmlkfWdldCBjbGFzc05hbWVzQXJyYXkoKXtyZXR1cm5bImNvZGljb24iLCJjb2RpY29uLSIrdGhpcy5pZF19Z2V0IGNzc1NlbGVjdG9yKCl7cmV0dXJuIi5jb2RpY29uLmNvZGljb24tIit0aGlzLmlkfX1PdC5hZGQ9bmV3IE90KCJhZGQiLHtmb250Q2hhcmFjdGVyOiJcXGVhNjAifSksT3QubGlnaHRCdWxiPW5ldyBPdCgibGlnaHQtYnVsYiIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE2MSJ9KSxPdC53YXJuaW5nPW5ldyBPdCgid2FybmluZyIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE2YyJ9KSxPdC5pbmZvPW5ldyBPdCgiaW5mbyIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE3NCJ9KSxPdC5jbG9zZT1uZXcgT3QoImNsb3NlIix7Zm9udENoYXJhY3RlcjoiXFxlYTc2In0pLE90LnN5bmM9bmV3IE90KCJzeW5jIix7Zm9udENoYXJhY3RlcjoiXFxlYTc3In0pLE90LnN5bWJvbEZvbGRlcj1uZXcgT3QoInN5bWJvbC1mb2xkZXIiLHtmb250Q2hhcmFjdGVyOiJcXGVhODMifSksT3Quc3ltYm9sRXZlbnQ9bmV3IE90KCJzeW1ib2wtZXZlbnQiLHtmb250Q2hhcmFjdGVyOiJcXGVhODYifSksT3QuZXJyb3I9bmV3IE90KCJlcnJvciIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE4NyJ9KSxPdC5zeW1ib2xWYXJpYWJsZT1uZXcgT3QoInN5bWJvbC12YXJpYWJsZSIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE4OCJ9KSxPdC5zeW1ib2xBcnJheT1uZXcgT3QoInN5bWJvbC1hcnJheSIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE4YSJ9KSxPdC5zeW1ib2xNb2R1bGU9bmV3IE90KCJzeW1ib2wtbW9kdWxlIix7Zm9udENoYXJhY3RlcjoiXFxlYThiIn0pLE90LnN5bWJvbFBhY2thZ2U9bmV3IE90KCJzeW1ib2wtcGFja2FnZSIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE4YiJ9KSxPdC5zeW1ib2xOYW1lc3BhY2U9bmV3IE90KCJzeW1ib2wtbmFtZXNwYWNlIix7Zm9udENoYXJhY3RlcjoiXFxlYThiIn0pLE90LnN5bWJvbE9iamVjdD1uZXcgT3QoInN5bWJvbC1vYmplY3QiLHtmb250Q2hhcmFjdGVyOiJcXGVhOGIifSksT3Quc3ltYm9sTWV0aG9kPW5ldyBPdCgic3ltYm9sLW1ldGhvZCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE4YyJ9KSxPdC5zeW1ib2xGdW5jdGlvbj1uZXcgT3QoInN5bWJvbC1mdW5jdGlvbiIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE4YyJ9KSxPdC5zeW1ib2xDb25zdHJ1Y3Rvcj1uZXcgT3QoInN5bWJvbC1jb25zdHJ1Y3RvciIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE4YyJ9KSxPdC5zeW1ib2xCb29sZWFuPW5ldyBPdCgic3ltYm9sLWJvb2xlYW4iLHtmb250Q2hhcmFjdGVyOiJcXGVhOGYifSksT3Quc3ltYm9sTnVsbD1uZXcgT3QoInN5bWJvbC1udWxsIix7Zm9udENoYXJhY3RlcjoiXFxlYThmIn0pLE90LnN5bWJvbE51bWJlcj1uZXcgT3QoInN5bWJvbC1udW1iZXIiLHtmb250Q2hhcmFjdGVyOiJcXGVhOTAifSksT3Quc3ltYm9sU3RydWN0PW5ldyBPdCgic3ltYm9sLXN0cnVjdCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE5MSJ9KSxPdC5zeW1ib2xUeXBlUGFyYW1ldGVyPW5ldyBPdCgic3ltYm9sLXR5cGUtcGFyYW1ldGVyIix7Zm9udENoYXJhY3RlcjoiXFxlYTkyIn0pLE90LnN5bWJvbEtleT1uZXcgT3QoInN5bWJvbC1rZXkiLHtmb250Q2hhcmFjdGVyOiJcXGVhOTMifSksT3Quc3ltYm9sVGV4dD1uZXcgT3QoInN5bWJvbC10ZXh0Iix7Zm9udENoYXJhY3RlcjoiXFxlYTkzIn0pLE90LnN5bWJvbFJlZmVyZW5jZT1uZXcgT3QoInN5bWJvbC1yZWZlcmVuY2UiLHtmb250Q2hhcmFjdGVyOiJcXGVhOTQifSksT3Quc3ltYm9sRW51bT1uZXcgT3QoInN5bWJvbC1lbnVtIix7Zm9udENoYXJhY3RlcjoiXFxlYTk1In0pLE90LnN5bWJvbFZhbHVlPW5ldyBPdCgic3ltYm9sLXZhbHVlIix7Zm9udENoYXJhY3RlcjoiXFxlYTk1In0pLE90LnN5bWJvbFVuaXQ9bmV3IE90KCJzeW1ib2wtdW5pdCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWE5NiJ9KSxPdC5hcnJvd0Rvd249bmV3IE90KCJhcnJvdy1kb3duIix7Zm9udENoYXJhY3RlcjoiXFxlYTlhIn0pLE90LmFycm93TGVmdD1uZXcgT3QoImFycm93LWxlZnQiLHtmb250Q2hhcmFjdGVyOiJcXGVhOWIifSksT3QuYXJyb3dVcD1uZXcgT3QoImFycm93LXVwIix7Zm9udENoYXJhY3RlcjoiXFxlYWExIn0pLE90LmNhc2VTZW5zaXRpdmU9bmV3IE90KCJjYXNlLXNlbnNpdGl2ZSIse2ZvbnRDaGFyYWN0ZXI6IlxcZWFiMSJ9KSxPdC5jaGVjaz1uZXcgT3QoImNoZWNrIix7Zm9udENoYXJhY3RlcjoiXFxlYWIyIn0pLE90LmNoZXZyb25Eb3duPW5ldyBPdCgiY2hldnJvbi1kb3duIix7Zm9udENoYXJhY3RlcjoiXFxlYWI0In0pLE90LmNoZXZyb25SaWdodD1uZXcgT3QoImNoZXZyb24tcmlnaHQiLHtmb250Q2hhcmFjdGVyOiJcXGVhYjYifSksT3QuY2hldnJvblVwPW5ldyBPdCgiY2hldnJvbi11cCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWFiNyJ9KSxPdC5saWdodGJ1bGJBdXRvZml4PW5ldyBPdCgibGlnaHRidWxiLWF1dG9maXgiLHtmb250Q2hhcmFjdGVyOiJcXGViMTMifSksT3QubG9hZGluZz1uZXcgT3QoImxvYWRpbmciLHtmb250Q2hhcmFjdGVyOiJcXGViMTkifSksT3QucHJlc2VydmVDYXNlPW5ldyBPdCgicHJlc2VydmUtY2FzZSIse2ZvbnRDaGFyYWN0ZXI6IlxcZWIyZSJ9KSxPdC5yZWdleD1uZXcgT3QoInJlZ2V4Iix7Zm9udENoYXJhY3RlcjoiXFxlYjM4In0pLE90LnJlbW92ZT1uZXcgT3QoInJlbW92ZSIse2ZvbnRDaGFyYWN0ZXI6IlxcZWIzYiJ9KSxPdC5yZXBsYWNlQWxsPW5ldyBPdCgicmVwbGFjZS1hbGwiLHtmb250Q2hhcmFjdGVyOiJcXGViM2MifSksT3QucmVwbGFjZT1uZXcgT3QoInJlcGxhY2UiLHtmb250Q2hhcmFjdGVyOiJcXGViM2QifSksT3Quc3BsaXRIb3Jpem9udGFsPW5ldyBPdCgic3BsaXQtaG9yaXpvbnRhbCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWI1NiJ9KSxPdC5zcGxpdFZlcnRpY2FsPW5ldyBPdCgic3BsaXQtdmVydGljYWwiLHtmb250Q2hhcmFjdGVyOiJcXGViNTcifSksT3Quc3ltYm9sQ2xhc3M9bmV3IE90KCJzeW1ib2wtY2xhc3MiLHtmb250Q2hhcmFjdGVyOiJcXGViNWIifSksT3Quc3ltYm9sQ29sb3I9bmV3IE90KCJzeW1ib2wtY29sb3IiLHtmb250Q2hhcmFjdGVyOiJcXGViNWMifSksT3Quc3ltYm9sQ29uc3RhbnQ9bmV3IE90KCJzeW1ib2wtY29uc3RhbnQiLHtmb250Q2hhcmFjdGVyOiJcXGViNWQifSksT3Quc3ltYm9sRW51bU1lbWJlcj1uZXcgT3QoInN5bWJvbC1lbnVtLW1lbWJlciIse2ZvbnRDaGFyYWN0ZXI6IlxcZWI1ZSJ9KSxPdC5zeW1ib2xGaWVsZD1uZXcgT3QoInN5bWJvbC1maWVsZCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWI1ZiJ9KSxPdC5zeW1ib2xGaWxlPW5ldyBPdCgic3ltYm9sLWZpbGUiLHtmb250Q2hhcmFjdGVyOiJcXGViNjAifSksT3Quc3ltYm9sSW50ZXJmYWNlPW5ldyBPdCgic3ltYm9sLWludGVyZmFjZSIse2ZvbnRDaGFyYWN0ZXI6IlxcZWI2MSJ9KSxPdC5zeW1ib2xLZXl3b3JkPW5ldyBPdCgic3ltYm9sLWtleXdvcmQiLHtmb250Q2hhcmFjdGVyOiJcXGViNjIifSksT3Quc3ltYm9sT3BlcmF0b3I9bmV3IE90KCJzeW1ib2wtb3BlcmF0b3IiLHtmb250Q2hhcmFjdGVyOiJcXGViNjQifSksT3Quc3ltYm9sUHJvcGVydHk9bmV3IE90KCJzeW1ib2wtcHJvcGVydHkiLHtmb250Q2hhcmFjdGVyOiJcXGViNjUifSksT3Quc3ltYm9sU25pcHBldD1uZXcgT3QoInN5bWJvbC1zbmlwcGV0Iix7Zm9udENoYXJhY3RlcjoiXFxlYjY2In0pLE90LnRyaWFuZ2xlRG93bj1uZXcgT3QoInRyaWFuZ2xlLWRvd24iLHtmb250Q2hhcmFjdGVyOiJcXGViNmUifSksT3QudHJpYW5nbGVMZWZ0PW5ldyBPdCgidHJpYW5nbGUtbGVmdCIse2ZvbnRDaGFyYWN0ZXI6IlxcZWI2ZiJ9KSxPdC50cmlhbmdsZVJpZ2h0PW5ldyBPdCgidHJpYW5nbGUtcmlnaHQiLHtmb250Q2hhcmFjdGVyOiJcXGViNzAifSksT3QudHJpYW5nbGVVcD1uZXcgT3QoInRyaWFuZ2xlLXVwIix7Zm9udENoYXJhY3RlcjoiXFxlYjcxIn0pLE90Lndob2xlV29yZD1uZXcgT3QoIndob2xlLXdvcmQiLHtmb250Q2hhcmFjdGVyOiJcXGViN2UifSksT3QubGlzdEZpbHRlcj1uZXcgT3QoImxpc3QtZmlsdGVyIix7Zm9udENoYXJhY3RlcjoiXFxlYjgzIn0pLE90Lmxpc3RTZWxlY3Rpb249bmV3IE90KCJsaXN0LXNlbGVjdGlvbiIse2ZvbnRDaGFyYWN0ZXI6IlxcZWI4NSJ9KSxPdC5zZWxlY3Rpb249bmV3IE90KCJzZWxlY3Rpb24iLHtmb250Q2hhcmFjdGVyOiJcXGViODUifSksT3Quc3ltYm9sU3RyaW5nPW5ldyBPdCgic3ltYm9sLXN0cmluZyIse2ZvbnRDaGFyYWN0ZXI6IlxcZWI4ZCJ9KSxPdC50cmVlSXRlbUV4cGFuZGVkPW5ldyBPdCgidHJlZS1pdGVtLWV4cGFuZGVkIixPdC5jaGV2cm9uRG93bi5kZWZpbml0aW9uKSxPdC50cmVlRmlsdGVyT25UeXBlT249bmV3IE90KCJ0cmVlLWZpbHRlci1vbi10eXBlLW9uIixPdC5saXN0RmlsdGVyLmRlZmluaXRpb24pLE90LnRyZWVGaWx0ZXJPblR5cGVPZmY9bmV3IE90KCJ0cmVlLWZpbHRlci1vbi10eXBlLW9mZiIsT3QubGlzdFNlbGVjdGlvbi5kZWZpbml0aW9uKSxPdC50cmVlRmlsdGVyQ2xlYXI9bmV3IE90KCJ0cmVlLWZpbHRlci1jbGVhciIsT3QuY2xvc2UuZGVmaW5pdGlvbiksT3QudHJlZUl0ZW1Mb2FkaW5nPW5ldyBPdCgidHJlZS1pdGVtLWxvYWRpbmciLE90LmxvYWRpbmcuZGVmaW5pdGlvbiksT3QubWVudVNlbGVjdGlvbj1uZXcgT3QoIm1lbnUtc2VsZWN0aW9uIixPdC5jaGVjay5kZWZpbml0aW9uKSxPdC5tZW51U3VibWVudT1uZXcgT3QoIm1lbnUtc3VibWVudSIsT3QuY2hldnJvblJpZ2h0LmRlZmluaXRpb24pLE90LnNjcm9sbGJhckJ1dHRvbkxlZnQ9bmV3IE90KCJzY3JvbGxiYXItYnV0dG9uLWxlZnQiLE90LnRyaWFuZ2xlTGVmdC5kZWZpbml0aW9uKSxPdC5zY3JvbGxiYXJCdXR0b25SaWdodD1uZXcgT3QoInNjcm9sbGJhci1idXR0b24tcmlnaHQiLE90LnRyaWFuZ2xlUmlnaHQuZGVmaW5pdGlvbiksT3Quc2Nyb2xsYmFyQnV0dG9uVXA9bmV3IE90KCJzY3JvbGxiYXItYnV0dG9uLXVwIixPdC50cmlhbmdsZVVwLmRlZmluaXRpb24pLE90LnNjcm9sbGJhckJ1dHRvbkRvd249bmV3IE90KCJzY3JvbGxiYXItYnV0dG9uLWRvd24iLE90LnRyaWFuZ2xlRG93bi5kZWZpbml0aW9uKSxPdC5xdWlja0lucHV0QmFjaz1uZXcgT3QoInF1aWNrLWlucHV0LWJhY2siLE90LmFycm93TGVmdC5kZWZpbml0aW9uKSxmdW5jdGlvbihlKXtlLmljb25OYW1lU2VnbWVudD0iW0EtWmEtejAtOV0rIixlLmljb25OYW1lRXhwcmVzc2lvbj0iW0EtWmEtejAtOS1dKyIsZS5pY29uTW9kaWZpZXJFeHByZXNzaW9uPSJ+W0EtWmEtel0rIixlLmljb25OYW1lQ2hhcmFjdGVyPSJbQS1aYS16MC05fi1dIjtjb25zdCBpPW5ldyBSZWdFeHAoYF4oJHtlLmljb25OYW1lRXhwcmVzc2lvbn0pKCR7ZS5pY29uTW9kaWZpZXJFeHByZXNzaW9ufSk/JGApO2Z1bmN0aW9uIG8oZSl7aWYoZSBpbnN0YW5jZW9mIE90KXJldHVyblsiY29kaWNvbiIsImNvZGljb24tIitlLmlkXTtlPWkuZXhlYyhlLmlkKTtpZighZSlyZXR1cm4gbyhPdC5lcnJvcik7bGV0Wyx0LHJdPWU7Y29uc3Qgbj1bImNvZGljb24iLCJjb2RpY29uLSIrdF07cmV0dXJuIHImJm4ucHVzaCgiY29kaWNvbi1tb2RpZmllci0iK3Iuc3Vic3RyKDEpKSxufWUuYXNDbGFzc05hbWVBcnJheT1vLGUuYXNDbGFzc05hbWU9ZnVuY3Rpb24oZSl7cmV0dXJuIG8oZSkuam9pbigiICIpfSxlLmFzQ1NTU2VsZWN0b3I9ZnVuY3Rpb24oZSl7cmV0dXJuIi4iK28oZSkuam9pbigiLiIpfX0oZ2U9Z2V8fHt9KTtjbGFzcyBJdHtjb25zdHJ1Y3Rvcigpe3RoaXNbcGVdPSJMaW5rZWRNYXAiLHRoaXMuX21hcD1uZXcgTWFwLHRoaXMuX2hlYWQ9dm9pZCAwLHRoaXMuX3RhaWw9dm9pZCAwLHRoaXMuX3NpemU9MCx0aGlzLl9zdGF0ZT0wfWNsZWFyKCl7dGhpcy5fbWFwLmNsZWFyKCksdGhpcy5faGVhZD12b2lkIDAsdGhpcy5fdGFpbD12b2lkIDAsdGhpcy5fc2l6ZT0wLHRoaXMuX3N0YXRlKyt9aXNFbXB0eSgpe3JldHVybiF0aGlzLl9oZWFkJiYhdGhpcy5fdGFpbH1nZXQgc2l6ZSgpe3JldHVybiB0aGlzLl9zaXplfWdldCBmaXJzdCgpe3ZhciBlO3JldHVybiBudWxsPT09KGU9dGhpcy5faGVhZCl8fHZvaWQgMD09PWU/dm9pZCAwOmUudmFsdWV9Z2V0IGxhc3QoKXt2YXIgZTtyZXR1cm4gbnVsbD09PShlPXRoaXMuX3RhaWwpfHx2b2lkIDA9PT1lP3ZvaWQgMDplLnZhbHVlfWhhcyhlKXtyZXR1cm4gdGhpcy5fbWFwLmhhcyhlKX1nZXQoZSx0PTApe2U9dGhpcy5fbWFwLmdldChlKTtpZihlKXJldHVybiAwIT09dCYmdGhpcy50b3VjaChlLHQpLGUudmFsdWV9c2V0KGUsdCxyPTApe2xldCBuPXRoaXMuX21hcC5nZXQoZSk7aWYobiluLnZhbHVlPXQsMCE9PXImJnRoaXMudG91Y2gobixyKTtlbHNle3N3aXRjaChuPXtrZXk6ZSx2YWx1ZTp0LG5leHQ6dm9pZCAwLHByZXZpb3VzOnZvaWQgMH0scil7Y2FzZSAwOnRoaXMuYWRkSXRlbUxhc3Qobik7YnJlYWs7Y2FzZSAxOnRoaXMuYWRkSXRlbUZpcnN0KG4pO2JyZWFrO2RlZmF1bHQ6dGhpcy5hZGRJdGVtTGFzdChuKX10aGlzLl9tYXAuc2V0KGUsbiksdGhpcy5fc2l6ZSsrfXJldHVybiB0aGlzfWRlbGV0ZShlKXtyZXR1cm4hIXRoaXMucmVtb3ZlKGUpfXJlbW92ZShlKXt2YXIgdD10aGlzLl9tYXAuZ2V0KGUpO2lmKHQpcmV0dXJuIHRoaXMuX21hcC5kZWxldGUoZSksdGhpcy5yZW1vdmVJdGVtKHQpLHRoaXMuX3NpemUtLSx0LnZhbHVlfXNoaWZ0KCl7aWYodGhpcy5faGVhZHx8dGhpcy5fdGFpbCl7aWYoIXRoaXMuX2hlYWR8fCF0aGlzLl90YWlsKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7dmFyIGU9dGhpcy5faGVhZDtyZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZShlLmtleSksdGhpcy5yZW1vdmVJdGVtKGUpLHRoaXMuX3NpemUtLSxlLnZhbHVlfX1mb3JFYWNoKGUsdCl7dmFyIHI9dGhpcy5fc3RhdGU7bGV0IG49dGhpcy5faGVhZDtmb3IoO247KXtpZigodD9lLmJpbmQodCk6ZSkobi52YWx1ZSxuLmtleSx0aGlzKSx0aGlzLl9zdGF0ZSE9PXIpdGhyb3cgbmV3IEVycm9yKCJMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uIik7bj1uLm5leHR9fWtleXMoKXtjb25zdCB0PXRoaXMscj10aGlzLl9zdGF0ZTtsZXQgbj10aGlzLl9oZWFkO2NvbnN0IGU9e1tTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIGV9LG5leHQoKXtpZih0Ll9zdGF0ZSE9PXIpdGhyb3cgbmV3IEVycm9yKCJMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uIik7aWYobil7dmFyIGU9e3ZhbHVlOm4ua2V5LGRvbmU6ITF9O3JldHVybiBuPW4ubmV4dCxlfXJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19fTtyZXR1cm4gZX12YWx1ZXMoKXtjb25zdCB0PXRoaXMscj10aGlzLl9zdGF0ZTtsZXQgbj10aGlzLl9oZWFkO2NvbnN0IGU9e1tTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIGV9LG5leHQoKXtpZih0Ll9zdGF0ZSE9PXIpdGhyb3cgbmV3IEVycm9yKCJMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uIik7aWYobil7dmFyIGU9e3ZhbHVlOm4udmFsdWUsZG9uZTohMX07cmV0dXJuIG49bi5uZXh0LGV9cmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX19O3JldHVybiBlfWVudHJpZXMoKXtjb25zdCB0PXRoaXMscj10aGlzLl9zdGF0ZTtsZXQgbj10aGlzLl9oZWFkO2NvbnN0IGU9e1tTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIGV9LG5leHQoKXtpZih0Ll9zdGF0ZSE9PXIpdGhyb3cgbmV3IEVycm9yKCJMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uIik7aWYobil7dmFyIGU9e3ZhbHVlOltuLmtleSxuLnZhbHVlXSxkb25lOiExfTtyZXR1cm4gbj1uLm5leHQsZX1yZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fX07cmV0dXJuIGV9WyhwZT1TeW1ib2wudG9TdHJpbmdUYWcsU3ltYm9sLml0ZXJhdG9yKV0oKXtyZXR1cm4gdGhpcy5lbnRyaWVzKCl9dHJpbU9sZChyKXtpZighKHI+PXRoaXMuc2l6ZSkpaWYoMCE9PXIpe2xldCBlPXRoaXMuX2hlYWQsdD10aGlzLnNpemU7Zm9yKDtlJiZ0PnI7KXRoaXMuX21hcC5kZWxldGUoZS5rZXkpLGU9ZS5uZXh0LHQtLTt0aGlzLl9oZWFkPWUsdGhpcy5fc2l6ZT10LGUmJihlLnByZXZpb3VzPXZvaWQgMCksdGhpcy5fc3RhdGUrK31lbHNlIHRoaXMuY2xlYXIoKX1hZGRJdGVtRmlyc3QoZSl7aWYodGhpcy5faGVhZHx8dGhpcy5fdGFpbCl7aWYoIXRoaXMuX2hlYWQpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTtlLm5leHQ9dGhpcy5faGVhZCx0aGlzLl9oZWFkLnByZXZpb3VzPWV9ZWxzZSB0aGlzLl90YWlsPWU7dGhpcy5faGVhZD1lLHRoaXMuX3N0YXRlKyt9YWRkSXRlbUxhc3QoZSl7aWYodGhpcy5faGVhZHx8dGhpcy5fdGFpbCl7aWYoIXRoaXMuX3RhaWwpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTtlLnByZXZpb3VzPXRoaXMuX3RhaWwsdGhpcy5fdGFpbC5uZXh0PWV9ZWxzZSB0aGlzLl9oZWFkPWU7dGhpcy5fdGFpbD1lLHRoaXMuX3N0YXRlKyt9cmVtb3ZlSXRlbShlKXtpZihlPT09dGhpcy5faGVhZCYmZT09PXRoaXMuX3RhaWwpdGhpcy5faGVhZD12b2lkIDAsdGhpcy5fdGFpbD12b2lkIDA7ZWxzZSBpZihlPT09dGhpcy5faGVhZCl7aWYoIWUubmV4dCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO2UubmV4dC5wcmV2aW91cz12b2lkIDAsdGhpcy5faGVhZD1lLm5leHR9ZWxzZSBpZihlPT09dGhpcy5fdGFpbCl7aWYoIWUucHJldmlvdXMpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTtlLnByZXZpb3VzLm5leHQ9dm9pZCAwLHRoaXMuX3RhaWw9ZS5wcmV2aW91c31lbHNle2NvbnN0IHQ9ZS5uZXh0LHI9ZS5wcmV2aW91cztpZighdHx8IXIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTt0LnByZXZpb3VzPXIsci5uZXh0PXR9ZS5uZXh0PXZvaWQgMCxlLnByZXZpb3VzPXZvaWQgMCx0aGlzLl9zdGF0ZSsrfXRvdWNoKGUsdCl7aWYoIXRoaXMuX2hlYWR8fCF0aGlzLl90YWlsKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7aWYoMT09PXR8fDI9PT10KWlmKDE9PT10KXtpZihlIT09dGhpcy5faGVhZCl7Y29uc3Qgcj1lLm5leHQsbj1lLnByZXZpb3VzO2U9PT10aGlzLl90YWlsPyhuLm5leHQ9dm9pZCAwLHRoaXMuX3RhaWw9bik6KHIucHJldmlvdXM9bixuLm5leHQ9ciksZS5wcmV2aW91cz12b2lkIDAsZS5uZXh0PXRoaXMuX2hlYWQsdGhpcy5faGVhZC5wcmV2aW91cz1lLHRoaXMuX2hlYWQ9ZSx0aGlzLl9zdGF0ZSsrfX1lbHNlIGlmKDI9PT10JiZlIT09dGhpcy5fdGFpbCl7Y29uc3QgaT1lLm5leHQsbz1lLnByZXZpb3VzO2U9PT10aGlzLl9oZWFkPyhpLnByZXZpb3VzPXZvaWQgMCx0aGlzLl9oZWFkPWkpOihpLnByZXZpb3VzPW8sby5uZXh0PWkpLGUubmV4dD12b2lkIDAsZS5wcmV2aW91cz10aGlzLl90YWlsLHRoaXMuX3RhaWwubmV4dD1lLHRoaXMuX3RhaWw9ZSx0aGlzLl9zdGF0ZSsrfX10b0pTT04oKXtjb25zdCByPVtdO3JldHVybiB0aGlzLmZvckVhY2goKGUsdCk9PntyLnB1c2goW3QsZV0pfSkscn1mcm9tSlNPTihlKXt0aGlzLmNsZWFyKCk7Zm9yKHZhclt0LHJdb2YgZSl0aGlzLnNldCh0LHIpfX1mdW5jdGlvbiBQdChlLHQscil7aWYoIXJ8fHIubGVuZ3RoPHQubGVuZ3RoKXJldHVybiBudWxsO2xldCBuO3ZhciBpLG87cmV0dXJuIG49ZT8oaT1yLGU9KG89dCkubGVuZ3RoLCEoby5sZW5ndGg+aS5sZW5ndGgpJiYwPT09UihpLG8sMCxlKSk6MD09PXIuaW5kZXhPZih0KSxuPzA8dC5sZW5ndGg/W3tzdGFydDowLGVuZDp0Lmxlbmd0aH1dOltdOm51bGx9UHQuYmluZCh2b2lkIDAsITEpLFB0LmJpbmQodm9pZCAwLCEwKTtjb25zdCBWdD1uZXcgU2V0OyIoKVtde308PmAnXCItLzs6LC4/ISIuc3BsaXQoIiIpLmZvckVhY2goZT0+VnQuYWRkKGUuY2hhckNvZGVBdCgwKSkpLG5ldyBjbGFzcyBleHRlbmRzIEl0e2NvbnN0cnVjdG9yKGUsdD0xKXtzdXBlcigpLHRoaXMuX2xpbWl0PWUsdGhpcy5fcmF0aW89TWF0aC5taW4oTWF0aC5tYXgoMCx0KSwxKX1nZXQgbGltaXQoKXtyZXR1cm4gdGhpcy5fbGltaXR9c2V0IGxpbWl0KGUpe3RoaXMuX2xpbWl0PWUsdGhpcy5jaGVja1RyaW0oKX1nZXQoZSx0PTIpe3JldHVybiBzdXBlci5nZXQoZSx0KX1wZWVrKGUpe3JldHVybiBzdXBlci5nZXQoZSwwKX1zZXQoZSx0KXtyZXR1cm4gc3VwZXIuc2V0KGUsdCwyKSx0aGlzLmNoZWNrVHJpbSgpLHRoaXN9Y2hlY2tUcmltKCl7dGhpcy5zaXplPnRoaXMuX2xpbWl0JiZ0aGlzLnRyaW1PbGQoTWF0aC5yb3VuZCh0aGlzLl9saW1pdCp0aGlzLl9yYXRpbykpfX0oMWU0KTtmdW5jdGlvbiBSdCgpe2NvbnN0IHQ9W10scj1bXTtmb3IobGV0IGU9MDtlPD0xMjg7ZSsrKXJbZV09MDtmb3IobGV0IGU9MDtlPD0xMjg7ZSsrKXQucHVzaChyLnNsaWNlKDApKTtyZXR1cm4gdH1mdW5jdGlvbiBEdCh0KXtjb25zdCByPVtdO2ZvcihsZXQgZT0wO2U8PXQ7ZSsrKXJbZV09MDtyZXR1cm4gcn1EdCgyNTYpLER0KDI1NiksUnQoKSxSdCgpLFJ0KCk7dmFyIEZ0LEt0LGp0LFV0PW5ldyBSZWdFeHAoYFxcJFxcKCR7Z2UuaWNvbk5hbWVFeHByZXNzaW9ufSg/OiR7Z2UuaWNvbk1vZGlmaWVyRXhwcmVzc2lvbn0pP1xcKWAsImciKTtuZXcgUmVnRXhwKGdlLmljb25OYW1lQ2hhcmFjdGVyKTtjb25zdCBxdD1uZXcgUmVnRXhwKCIoXFxcXCk/IitVdC5zb3VyY2UsImciKTtuZXcgUmVnRXhwKCJcXFxcIitVdC5zb3VyY2UsImciKSxuZXcgUmVnRXhwKGAoXFxzKT8oXFxcXCk/JHtVdC5zb3VyY2V9KFxccyk/YCwiZyIpO2NsYXNzIEJ0e2NvbnN0cnVjdG9yKGU9IiIsdD0hMSl7dmFyIHI7aWYodGhpcy52YWx1ZT1lLCJzdHJpbmciIT10eXBlb2YgdGhpcy52YWx1ZSl0aHJvdyhyPSJ2YWx1ZSIpP25ldyBFcnJvcigiSWxsZWdhbCBhcmd1bWVudDogIityKTpuZXcgRXJyb3IoIklsbGVnYWwgYXJndW1lbnQiKTsiYm9vbGVhbiI9PXR5cGVvZiB0Pyh0aGlzLmlzVHJ1c3RlZD10LHRoaXMuc3VwcG9ydFRoZW1lSWNvbnM9ITEsdGhpcy5zdXBwb3J0SHRtbD0hMSk6KHRoaXMuaXNUcnVzdGVkPW51bGwhPT0ocj10LmlzVHJ1c3RlZCkmJnZvaWQgMCE9PXI/cjp2b2lkIDAsdGhpcy5zdXBwb3J0VGhlbWVJY29ucz1udWxsIT09KHI9dC5zdXBwb3J0VGhlbWVJY29ucykmJnZvaWQgMCE9PXImJnIsdGhpcy5zdXBwb3J0SHRtbD1udWxsIT09KHQ9dC5zdXBwb3J0SHRtbCkmJnZvaWQgMCE9PXQmJnQpfWFwcGVuZFRleHQoZSx0PTApe3JldHVybiB0aGlzLnZhbHVlKz0odGhpcy5zdXBwb3J0VGhlbWVJY29ucz9lLnJlcGxhY2UocXQsKGUsdCk9PnQ/ZToiXFwiK2UpOmUpLnJlcGxhY2UoL1tcXGAqX3t9W1xdKCkjK1wtIV0vZywiXFwkJiIpLnJlcGxhY2UoLyhbIFx0XSspL2csKGUsdCk9PiImbmJzcDsiLnJlcGVhdCh0Lmxlbmd0aCkpLnJlcGxhY2UoL1w+L2dtLCJcXD4iKS5yZXBsYWNlKC9cbi9nLDE9PT10PyJcXFxuIjoiXG5cbiIpLHRoaXN9YXBwZW5kTWFya2Rvd24oZSl7cmV0dXJuIHRoaXMudmFsdWUrPWUsdGhpc31hcHBlbmRDb2RlYmxvY2soZSx0KXtyZXR1cm4gdGhpcy52YWx1ZSs9IlxuYGBgIix0aGlzLnZhbHVlKz1lLHRoaXMudmFsdWUrPSJcbiIsdGhpcy52YWx1ZSs9dCx0aGlzLnZhbHVlKz0iXG5gYGBcbiIsdGhpc319ZnVuY3Rpb24gJHQoZSl7aWYoRnQuc2VydmljZUlkcy5oYXMoZSkpcmV0dXJuIEZ0LnNlcnZpY2VJZHMuZ2V0KGUpO2Z1bmN0aW9uIG8oZSx0LHIpe2lmKDMhPT1hcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiQElTZXJ2aWNlTmFtZS1kZWNvcmF0b3IgY2FuIG9ubHkgYmUgdXNlZCB0byBkZWNvcmF0ZSBhIHBhcmFtZXRlciIpO3ZhciBuLGk7bj1vLGk9cixyPSExLChlPWUpW0Z0LkRJX1RBUkdFVF09PT1lP2VbRnQuRElfREVQRU5ERU5DSUVTXS5wdXNoKHtpZDpuLGluZGV4Omksb3B0aW9uYWw6cn0pOihlW0Z0LkRJX0RFUEVOREVOQ0lFU109W3tpZDpuLGluZGV4Omksb3B0aW9uYWw6cn1dLGVbRnQuRElfVEFSR0VUXT1lKX1yZXR1cm4gby50b1N0cmluZz0oKT0+ZSxGdC5zZXJ2aWNlSWRzLnNldChlLG8pLG8sMX0oS3Q9RnQ9RnR8fHt9KS5zZXJ2aWNlSWRzPW5ldyBNYXAsS3QuRElfVEFSR0VUPSIkZGkkdGFyZ2V0IixLdC5ESV9ERVBFTkRFTkNJRVM9IiRkaSRkZXBlbmRlbmNpZXMiLEt0LmdldFNlcnZpY2VEZXBlbmRlbmNpZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGVbS3QuRElfREVQRU5ERU5DSUVTXXx8W119LCR0KCJpbnN0YW50aWF0aW9uU2VydmljZSIpLCR0KCJsb2dTZXJ2aWNlIiksJHQoImxvZ2dlclNlcnZpY2UiKSwoVXQ9anQ9anR8fHt9KVtVdC5UcmFjZT0wXT0iVHJhY2UiLFV0W1V0LkRlYnVnPTFdPSJEZWJ1ZyIsVXRbVXQuSW5mbz0yXT0iSW5mbyIsVXRbVXQuV2FybmluZz0zXT0iV2FybmluZyIsVXRbVXQuRXJyb3I9NF09IkVycm9yIixVdFtVdC5Dcml0aWNhbD01XT0iQ3JpdGljYWwiLFV0W1V0Lk9mZj02XT0iT2ZmIjtjb25zdCBXdD1qdC5JbmZvO2NsYXNzIEh0IGV4dGVuZHMgZHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5sZXZlbD1XdCx0aGlzLl9vbkRpZENoYW5nZUxvZ0xldmVsPXRoaXMuX3JlZ2lzdGVyKG5ldyBJKSx0aGlzLm9uRGlkQ2hhbmdlTG9nTGV2ZWw9dGhpcy5fb25EaWRDaGFuZ2VMb2dMZXZlbC5ldmVudH1zZXRMZXZlbChlKXt0aGlzLmxldmVsIT09ZSYmKHRoaXMubGV2ZWw9ZSx0aGlzLl9vbkRpZENoYW5nZUxvZ0xldmVsLmZpcmUodGhpcy5sZXZlbCkpfWdldExldmVsKCl7cmV0dXJuIHRoaXMubGV2ZWx9fWNsYXNzIHp0IGV4dGVuZHMgSHR7Y29uc3RydWN0b3IoZT1XdCl7c3VwZXIoKSx0aGlzLnNldExldmVsKGUpfXRyYWNlKGUsLi4udCl7dGhpcy5nZXRMZXZlbCgpPD1qdC5UcmFjZSYmY29uc29sZS5sb2coIiVjVFJBQ0UiLCJjb2xvcjogIzg4OCIsZSwuLi50KX1kZWJ1ZyhlLC4uLnQpe3RoaXMuZ2V0TGV2ZWwoKTw9anQuRGVidWcmJmNvbnNvbGUubG9nKCIlY0RFQlVHIiwiYmFja2dyb3VuZDogI2VlZTsgY29sb3I6ICM4ODgiLGUsLi4udCl9aW5mbyhlLC4uLnQpe3RoaXMuZ2V0TGV2ZWwoKTw9anQuSW5mbyYmY29uc29sZS5sb2coIiVjIElORk8iLCJjb2xvcjogIzMzZiIsZSwuLi50KX13YXJuKGUsLi4udCl7dGhpcy5nZXRMZXZlbCgpPD1qdC5XYXJuaW5nJiZjb25zb2xlLmxvZygiJWMgV0FSTiIsImNvbG9yOiAjOTkzIixlLC4uLnQpfWVycm9yKGUsLi4udCl7dGhpcy5nZXRMZXZlbCgpPD1qdC5FcnJvciYmY29uc29sZS5sb2coIiVjICBFUlIiLCJjb2xvcjogI2YzMyIsZSwuLi50KX1jcml0aWNhbChlLC4uLnQpe3RoaXMuZ2V0TGV2ZWwoKTw9anQuQ3JpdGljYWwmJmNvbnNvbGUubG9nKCIlY0NSSVRJIiwiYmFja2dyb3VuZDogI2YzMzsgY29sb3I6IHdoaXRlIixlLC4uLnQpfWRpc3Bvc2UoKXt9Zmx1c2goKXt9fWNsYXNzIEp0e3N0YXRpYyBjaG9yZChlLHQpe3JldHVybihlfCg2NTUzNSZ0KTw8MTY+Pj4wKT4+PjB9fWZ1bmN0aW9uIEd0KGUsdCxyLG4saSl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxyLG4pe2lmKDA9PT1yKXJldHVybiAxO3ZhciBpPXQuY2hhckNvZGVBdChyLTEpO2lmKDAhPT1lLmdldChpKSlyZXR1cm4gMTtpZigxMz09PWl8fDEwPT09aSlyZXR1cm4gMTtpZigwPG4pe3I9dC5jaGFyQ29kZUF0KHIpO2lmKDAhPT1lLmdldChyKSlyZXR1cm4gMX1yZXR1cm59KGUsdCxuLGkpJiZmdW5jdGlvbihlLHQscixuLGkpe2lmKG4raT09PXIpcmV0dXJuIDE7aWYocj10LmNoYXJDb2RlQXQobitpKSwwIT09ZS5nZXQocikpcmV0dXJuIDE7aWYoMTM9PT1yfHwxMD09PXIpcmV0dXJuIDE7aWYoMDxpKXtpPXQuY2hhckNvZGVBdChuK2ktMSk7aWYoMCE9PWUuZ2V0KGkpKXJldHVybiAxfXJldHVybn0oZSx0LHIsbixpKX1KdC5DdHJsQ21kPTIwNDgsSnQuU2hpZnQ9MTAyNCxKdC5BbHQ9NTEyLEp0LldpbkN0cmw9MjU2O2NsYXNzIFh0e2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fd29yZFNlcGFyYXRvcnM9ZSx0aGlzLl9zZWFyY2hSZWdleD10LHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXg9LTEsdGhpcy5fcHJldk1hdGNoTGVuZ3RoPTB9cmVzZXQoZSl7dGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4PWUsdGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleD0tMSx0aGlzLl9wcmV2TWF0Y2hMZW5ndGg9MH1uZXh0KGUpe3ZhciB0PWUubGVuZ3RoO2xldCByO2Rve2lmKHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXgrdGhpcy5fcHJldk1hdGNoTGVuZ3RoPT09dClyZXR1cm4gbnVsbDtpZihyPXRoaXMuX3NlYXJjaFJlZ2V4LmV4ZWMoZSksIXIpcmV0dXJuIG51bGw7dmFyIG49ci5pbmRleCxpPXJbMF0ubGVuZ3RoO2lmKG4hPT10aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4fHxpIT09dGhpcy5fcHJldk1hdGNoTGVuZ3RoKXtpZih0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4PW4sdGhpcy5fcHJldk1hdGNoTGVuZ3RoPWksIXRoaXMuX3dvcmRTZXBhcmF0b3JzfHxHdCh0aGlzLl93b3JkU2VwYXJhdG9ycyxlLHQsbixpKSlyZXR1cm4gcn1lbHNle2lmKDAhPT1pKXJldHVybiBudWxsOzY1NTM1PGZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7aWYoSyhuKSYmcisxPHQpe2U9ZS5jaGFyQ29kZUF0KHIrMSk7aWYoNTYzMjA8PShyPWUpJiZyPD01NzM0MylyZXR1cm4gZS01NjMyMCsobi01NTI5Njw8MTApKzY1NTM2fXJldHVybiBufShlLHQsdGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4KT90aGlzLl9zZWFyY2hSZWdleC5sYXN0SW5kZXgrPTI6dGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4Kz0xfX13aGlsZShyKTtyZXR1cm4gbnVsbH19Y2xhc3MgWnR7c3RhdGljIGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyh0LGUscil7dmFyIG49cj9yLnN0YXJ0TGluZU51bWJlcjoxLGk9cj9yLmVuZExpbmVOdW1iZXI6dC5nZXRMaW5lQ291bnQoKTtjb25zdCBvPW5ldyBRdChlKTt2YXIgcyxlPW8uZ2V0Q2FuZGlkYXRlQ29kZVBvaW50cygpO2xldCBhO2E9ImFsbE5vbkJhc2ljQXNjaWkiPT09ZT9uZXcgUmVnRXhwKCJbXlxcdFxcblxcclxceDIwLVxceDdFXSIsImciKTpuZXcgUmVnRXhwKCIiK2Z1bmN0aW9uKGUpe2U9YFske2UubWFwKGU9PlN0cmluZy5mcm9tQ29kZVBvaW50KGUpKS5qb2luKCIiKS5yZXBsYWNlKC9bXFxce1x9XCpcK1w/XHxcXlwkXC5cW1xdXChcKV0vZywiXFwkJiIpfV1gO3JldHVybiBlfShBcnJheS5mcm9tKGUpKSwiZyIpO2NvbnN0IGw9bmV3IFh0KG51bGwsYSksdT1bXTtsZXQgaD0hMSxjPTAsZD0wLGY9MDtlOmZvcihsZXQgcj1uLGU9aTtyPD1lO3IrKyl7Y29uc3QgcD10LmdldExpbmVDb250ZW50KHIpO3ZhciBtPXAubGVuZ3RoO2wucmVzZXQoMCk7ZG97aWYocz1sLm5leHQocCkpe2xldCBlPXMuaW5kZXgsdD1zLmluZGV4K3NbMF0ubGVuZ3RoOzA8ZSYmSyhwLmNoYXJDb2RlQXQoZS0xKSkmJmUtLSx0KzE8bSYmSyhwLmNoYXJDb2RlQXQodC0xKSkmJnQrKzt2YXIgZz1wLnN1YnN0cmluZyhlLHQpLGc9by5zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKGcpO2lmKDAhPT1nKXszPT09Zz9jKys6Mj09PWc/ZCsrOjE9PT1nP2YrKzpmdW5jdGlvbihlPSJVbnJlYWNoYWJsZSIpe3Rocm93IG5ldyBFcnJvcihlKX0oKTtpZigxZTM8PXUubGVuZ3RoKXtoPSEwO2JyZWFrIGV9dS5wdXNoKG5ldyBCZShyLGUrMSxyLHQrMSkpfX19d2hpbGUocyl9cmV0dXJue3Jhbmdlczp1LGhhc01vcmU6aCxhbWJpZ3VvdXNDaGFyYWN0ZXJDb3VudDpjLGludmlzaWJsZUNoYXJhY3RlckNvdW50OmQsbm9uQmFzaWNBc2NpaUNoYXJhY3RlckNvdW50OmZ9fXN0YXRpYyBjb21wdXRlVW5pY29kZUhpZ2hsaWdodFJlYXNvbihlLHQpe2NvbnN0IHI9bmV3IFF0KHQpO3N3aXRjaChyLnNob3VsZEhpZ2hsaWdodE5vbkJhc2ljQVNDSUkoZSkpe2Nhc2UgMDpyZXR1cm4gbnVsbDtjYXNlIDI6cmV0dXJue2tpbmQ6MX07Y2FzZSAzOnZhciBuPWouZ2V0UHJpbWFyeUNvbmZ1c2FibGUoZS5jb2RlUG9pbnRBdCgwKSk7cmV0dXJue2tpbmQ6MCxjb25mdXNhYmxlV2l0aDpTdHJpbmcuZnJvbUNvZGVQb2ludChuKX07Y2FzZSAxOnJldHVybntraW5kOjJ9fX19Y2xhc3MgUXR7Y29uc3RydWN0b3IoZSl7dGhpcy5vcHRpb25zPWUsdGhpcy5hbGxvd2VkQ29kZVBvaW50cz1uZXcgU2V0KGUuYWxsb3dlZENvZGVQb2ludHMpfWdldENhbmRpZGF0ZUNvZGVQb2ludHMoKXtpZih0aGlzLm9wdGlvbnMubm9uQmFzaWNBU0NJSSlyZXR1cm4iYWxsTm9uQmFzaWNBc2NpaSI7Y29uc3QgZT1uZXcgU2V0O2lmKHRoaXMub3B0aW9ucy5pbnZpc2libGVDaGFyYWN0ZXJzKWZvcihjb25zdCB0IG9mIFUuY29kZVBvaW50cyllLmFkZCh0KTtpZih0aGlzLm9wdGlvbnMuYW1iaWd1b3VzQ2hhcmFjdGVycylmb3IoY29uc3QgciBvZiBqLmdldFByaW1hcnlDb25mdXNhYmxlQ29kZVBvaW50cygpKWUuYWRkKHIpO2Zvcihjb25zdCBuIG9mIHRoaXMuYWxsb3dlZENvZGVQb2ludHMpZS5kZWxldGUobik7cmV0dXJuIGV9c2hvdWxkSGlnaGxpZ2h0Tm9uQmFzaWNBU0NJSShlKXt2YXIgdD1lLmNvZGVQb2ludEF0KDApO2lmKHRoaXMuYWxsb3dlZENvZGVQb2ludHMuaGFzKHQpKXJldHVybiAwO2lmKHRoaXMub3B0aW9ucy5ub25CYXNpY0FTQ0lJKXJldHVybiAxO2lmKHRoaXMub3B0aW9ucy5pbnZpc2libGVDaGFyYWN0ZXJzJiYoISgiICI9PT1lfHwiXG4iPT09ZXx8Ilx0Ij09PWUpJiZVLmlzSW52aXNpYmxlQ2hhcmFjdGVyKHQpKSlyZXR1cm4gMjtyZXR1cm4gdGhpcy5vcHRpb25zLmFtYmlndW91c0NoYXJhY3RlcnMmJmouaXNBbWJpZ3VvdXModCk/MzowfX12YXIgWXQsZXI9ZnVuY3Rpb24oZSxzLGEsbCl7cmV0dXJuIG5ldyhhPWF8fFByb21pc2UpKGZ1bmN0aW9uKHIsdCl7ZnVuY3Rpb24gbihlKXt0cnl7byhsLm5leHQoZSkpfWNhdGNoKGUpe3QoZSl9fWZ1bmN0aW9uIGkoZSl7dHJ5e28obC50aHJvdyhlKSl9Y2F0Y2goZSl7dChlKX19ZnVuY3Rpb24gbyhlKXt2YXIgdDtlLmRvbmU/cihlLnZhbHVlKTooKHQ9ZS52YWx1ZSlpbnN0YW5jZW9mIGE/dDpuZXcgYShmdW5jdGlvbihlKXtlKHQpfSkpLnRoZW4obixpKX1vKChsPWwuYXBwbHkoZSxzfHxbXSkpLm5leHQoKSl9KX07Y2xhc3MgdHIgZXh0ZW5kcyBjbGFzc3tjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLl91cmk9ZSx0aGlzLl9saW5lcz10LHRoaXMuX2VvbD1yLHRoaXMuX3ZlcnNpb25JZD1uLHRoaXMuX2xpbmVTdGFydHM9bnVsbCx0aGlzLl9jYWNoZWRUZXh0VmFsdWU9bnVsbH1kaXNwb3NlKCl7dGhpcy5fbGluZXMubGVuZ3RoPTB9Z2V0IHZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbklkfWdldFRleHQoKXtyZXR1cm4gbnVsbD09PXRoaXMuX2NhY2hlZFRleHRWYWx1ZSYmKHRoaXMuX2NhY2hlZFRleHRWYWx1ZT10aGlzLl9saW5lcy5qb2luKHRoaXMuX2VvbCkpLHRoaXMuX2NhY2hlZFRleHRWYWx1ZX1vbkV2ZW50cyhlKXtlLmVvbCYmZS5lb2whPT10aGlzLl9lb2wmJih0aGlzLl9lb2w9ZS5lb2wsdGhpcy5fbGluZVN0YXJ0cz1udWxsKTtmb3IoY29uc3QgdCBvZiBlLmNoYW5nZXMpdGhpcy5fYWNjZXB0RGVsZXRlUmFuZ2UodC5yYW5nZSksdGhpcy5fYWNjZXB0SW5zZXJ0VGV4dChuZXcgcWUodC5yYW5nZS5zdGFydExpbmVOdW1iZXIsdC5yYW5nZS5zdGFydENvbHVtbiksdC50ZXh0KTt0aGlzLl92ZXJzaW9uSWQ9ZS52ZXJzaW9uSWQsdGhpcy5fY2FjaGVkVGV4dFZhbHVlPW51bGx9X2Vuc3VyZUxpbmVTdGFydHMoKXtpZighdGhpcy5fbGluZVN0YXJ0cyl7dmFyIHQ9dGhpcy5fZW9sLmxlbmd0aCxyPXRoaXMuX2xpbmVzLmxlbmd0aDtjb25zdCBuPW5ldyBVaW50MzJBcnJheShyKTtmb3IobGV0IGU9MDtlPHI7ZSsrKW5bZV09dGhpcy5fbGluZXNbZV0ubGVuZ3RoK3Q7dGhpcy5fbGluZVN0YXJ0cz1uZXcgdHQobil9fV9zZXRMaW5lVGV4dChlLHQpe3RoaXMuX2xpbmVzW2VdPXQsdGhpcy5fbGluZVN0YXJ0cyYmdGhpcy5fbGluZVN0YXJ0cy5zZXRWYWx1ZShlLHRoaXMuX2xpbmVzW2VdLmxlbmd0aCt0aGlzLl9lb2wubGVuZ3RoKX1fYWNjZXB0RGVsZXRlUmFuZ2UoZSl7aWYoZS5zdGFydExpbmVOdW1iZXI9PT1lLmVuZExpbmVOdW1iZXIpcmV0dXJuIGUuc3RhcnRDb2x1bW49PT1lLmVuZENvbHVtbj92b2lkIDA6dm9pZCB0aGlzLl9zZXRMaW5lVGV4dChlLnN0YXJ0TGluZU51bWJlci0xLHRoaXMuX2xpbmVzW2Uuc3RhcnRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZygwLGUuc3RhcnRDb2x1bW4tMSkrdGhpcy5fbGluZXNbZS5zdGFydExpbmVOdW1iZXItMV0uc3Vic3RyaW5nKGUuZW5kQ29sdW1uLTEpKTt0aGlzLl9zZXRMaW5lVGV4dChlLnN0YXJ0TGluZU51bWJlci0xLHRoaXMuX2xpbmVzW2Uuc3RhcnRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZygwLGUuc3RhcnRDb2x1bW4tMSkrdGhpcy5fbGluZXNbZS5lbmRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZyhlLmVuZENvbHVtbi0xKSksdGhpcy5fbGluZXMuc3BsaWNlKGUuc3RhcnRMaW5lTnVtYmVyLGUuZW5kTGluZU51bWJlci1lLnN0YXJ0TGluZU51bWJlciksdGhpcy5fbGluZVN0YXJ0cyYmdGhpcy5fbGluZVN0YXJ0cy5yZW1vdmVWYWx1ZXMoZS5zdGFydExpbmVOdW1iZXIsZS5lbmRMaW5lTnVtYmVyLWUuc3RhcnRMaW5lTnVtYmVyKX1fYWNjZXB0SW5zZXJ0VGV4dChuLGUpe2lmKDAhPT1lLmxlbmd0aCl7bGV0IHI9ZS5zcGxpdCgvXHJcbnxccnxcbi8pO2lmKDEhPT1yLmxlbmd0aCl7cltyLmxlbmd0aC0xXSs9dGhpcy5fbGluZXNbbi5saW5lTnVtYmVyLTFdLnN1YnN0cmluZyhuLmNvbHVtbi0xKSx0aGlzLl9zZXRMaW5lVGV4dChuLmxpbmVOdW1iZXItMSx0aGlzLl9saW5lc1tuLmxpbmVOdW1iZXItMV0uc3Vic3RyaW5nKDAsbi5jb2x1bW4tMSkrclswXSk7bGV0IHQ9bmV3IFVpbnQzMkFycmF5KHIubGVuZ3RoLTEpO2ZvcihsZXQgZT0xO2U8ci5sZW5ndGg7ZSsrKXRoaXMuX2xpbmVzLnNwbGljZShuLmxpbmVOdW1iZXIrZS0xLDAscltlXSksdFtlLTFdPXJbZV0ubGVuZ3RoK3RoaXMuX2VvbC5sZW5ndGg7dGhpcy5fbGluZVN0YXJ0cyYmdGhpcy5fbGluZVN0YXJ0cy5pbnNlcnRWYWx1ZXMobi5saW5lTnVtYmVyLHQpfWVsc2UgdGhpcy5fc2V0TGluZVRleHQobi5saW5lTnVtYmVyLTEsdGhpcy5fbGluZXNbbi5saW5lTnVtYmVyLTFdLnN1YnN0cmluZygwLG4uY29sdW1uLTEpK3JbMF0rdGhpcy5fbGluZXNbbi5saW5lTnVtYmVyLTFdLnN1YnN0cmluZyhuLmNvbHVtbi0xKSl9fX17Z2V0IHVyaSgpe3JldHVybiB0aGlzLl91cml9Z2V0IGVvbCgpe3JldHVybiB0aGlzLl9lb2x9Z2V0VmFsdWUoKXtyZXR1cm4gdGhpcy5nZXRUZXh0KCl9Z2V0TGluZXNDb250ZW50KCl7cmV0dXJuIHRoaXMuX2xpbmVzLnNsaWNlKDApfWdldExpbmVDb3VudCgpe3JldHVybiB0aGlzLl9saW5lcy5sZW5ndGh9Z2V0TGluZUNvbnRlbnQoZSl7cmV0dXJuIHRoaXMuX2xpbmVzW2UtMV19Z2V0V29yZEF0UG9zaXRpb24oZSx0KXt0PW90KGUuY29sdW1uLGZ1bmN0aW9uKHQpe2xldCByPW50O2lmKHQmJnQgaW5zdGFuY2VvZiBSZWdFeHApaWYodC5nbG9iYWwpcj10O2Vsc2V7bGV0IGU9ImciO3QuaWdub3JlQ2FzZSYmKGUrPSJpIiksdC5tdWx0aWxpbmUmJihlKz0ibSIpLHQudW5pY29kZSYmKGUrPSJ1Iikscj1uZXcgUmVnRXhwKHQuc291cmNlLGUpfXJldHVybiByLmxhc3RJbmRleD0wLHJ9KHQpLHRoaXMuX2xpbmVzW2UubGluZU51bWJlci0xXSwwKTtyZXR1cm4gdD9uZXcgQmUoZS5saW5lTnVtYmVyLHQuc3RhcnRDb2x1bW4sZS5saW5lTnVtYmVyLHQuZW5kQ29sdW1uKTpudWxsfXdvcmRzKHQpe2NvbnN0IHI9dGhpcy5fbGluZXMsbj10aGlzLl93b3JkZW5pemUuYmluZCh0aGlzKTtsZXQgaT0wLG89IiIscz0wLGE9W107cmV0dXJueypbU3ltYm9sLml0ZXJhdG9yXSgpe2Zvcig7OylpZihzPGEubGVuZ3RoKXt2YXIgZT1vLnN1YnN0cmluZyhhW3NdLnN0YXJ0LGFbc10uZW5kKTtzKz0xLHlpZWxkIGV9ZWxzZXtpZighKGk8ci5sZW5ndGgpKWJyZWFrO289cltpXSxhPW4obyx0KSxzPTAsaSs9MX19fX1nZXRMaW5lV29yZHMoZSx0KXtsZXQgcj10aGlzLl9saW5lc1tlLTFdO2xldCBuPVtdO2Zvcihjb25zdCBpIG9mIHRoaXMuX3dvcmRlbml6ZShyLHQpKW4ucHVzaCh7d29yZDpyLnN1YnN0cmluZyhpLnN0YXJ0LGkuZW5kKSxzdGFydENvbHVtbjppLnN0YXJ0KzEsZW5kQ29sdW1uOmkuZW5kKzF9KTtyZXR1cm4gbn1fd29yZGVuaXplKGUsdCl7Y29uc3Qgcj1bXTt2YXIgbjtmb3IodC5sYXN0SW5kZXg9MDsobj10LmV4ZWMoZSkpJiYwIT09blswXS5sZW5ndGg7KXIucHVzaCh7c3RhcnQ6bi5pbmRleCxlbmQ6bi5pbmRleCtuWzBdLmxlbmd0aH0pO3JldHVybiByfWdldFZhbHVlSW5SYW5nZShlKXtpZigoZT10aGlzLl92YWxpZGF0ZVJhbmdlKGUpKS5zdGFydExpbmVOdW1iZXI9PT1lLmVuZExpbmVOdW1iZXIpcmV0dXJuIHRoaXMuX2xpbmVzW2Uuc3RhcnRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZyhlLnN0YXJ0Q29sdW1uLTEsZS5lbmRDb2x1bW4tMSk7dmFyIHQ9dGhpcy5fZW9sLHI9ZS5zdGFydExpbmVOdW1iZXItMSxuPWUuZW5kTGluZU51bWJlci0xO2xldCBpPVtdO2kucHVzaCh0aGlzLl9saW5lc1tyXS5zdWJzdHJpbmcoZS5zdGFydENvbHVtbi0xKSk7Zm9yKGxldCBlPTErcjtlPG47ZSsrKWkucHVzaCh0aGlzLl9saW5lc1tlXSk7cmV0dXJuIGkucHVzaCh0aGlzLl9saW5lc1tuXS5zdWJzdHJpbmcoMCxlLmVuZENvbHVtbi0xKSksaS5qb2luKHQpfW9mZnNldEF0KGUpe3JldHVybiBlPXRoaXMuX3ZhbGlkYXRlUG9zaXRpb24oZSksdGhpcy5fZW5zdXJlTGluZVN0YXJ0cygpLHRoaXMuX2xpbmVTdGFydHMuZ2V0UHJlZml4U3VtKGUubGluZU51bWJlci0yKSsoZS5jb2x1bW4tMSl9cG9zaXRpb25BdChlKXtlPU1hdGguZmxvb3IoZSksZT1NYXRoLm1heCgwLGUpLHRoaXMuX2Vuc3VyZUxpbmVTdGFydHMoKTt2YXIgdD10aGlzLl9saW5lU3RhcnRzLmdldEluZGV4T2YoZSksZT10aGlzLl9saW5lc1t0LmluZGV4XS5sZW5ndGg7cmV0dXJue2xpbmVOdW1iZXI6MSt0LmluZGV4LGNvbHVtbjoxK01hdGgubWluKHQucmVtYWluZGVyLGUpfX1fdmFsaWRhdGVSYW5nZShlKXt2YXIgdD10aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHtsaW5lTnVtYmVyOmUuc3RhcnRMaW5lTnVtYmVyLGNvbHVtbjplLnN0YXJ0Q29sdW1ufSkscj10aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHtsaW5lTnVtYmVyOmUuZW5kTGluZU51bWJlcixjb2x1bW46ZS5lbmRDb2x1bW59KTtyZXR1cm4gdC5saW5lTnVtYmVyIT09ZS5zdGFydExpbmVOdW1iZXJ8fHQuY29sdW1uIT09ZS5zdGFydENvbHVtbnx8ci5saW5lTnVtYmVyIT09ZS5lbmRMaW5lTnVtYmVyfHxyLmNvbHVtbiE9PWUuZW5kQ29sdW1uP3tzdGFydExpbmVOdW1iZXI6dC5saW5lTnVtYmVyLHN0YXJ0Q29sdW1uOnQuY29sdW1uLGVuZExpbmVOdW1iZXI6ci5saW5lTnVtYmVyLGVuZENvbHVtbjpyLmNvbHVtbn06ZX1fdmFsaWRhdGVQb3NpdGlvbihlKXtpZighcWUuaXNJUG9zaXRpb24oZSkpdGhyb3cgbmV3IEVycm9yKCJiYWQgcG9zaXRpb24iKTtsZXR7bGluZU51bWJlcjp0LGNvbHVtbjpyfT1lLG49ITE7dmFyIGk7cmV0dXJuIHQ8MT8odD0xLHI9MSxuPSEwKTp0PnRoaXMuX2xpbmVzLmxlbmd0aD8odD10aGlzLl9saW5lcy5sZW5ndGgscj10aGlzLl9saW5lc1t0LTFdLmxlbmd0aCsxLG49ITApOihpPXRoaXMuX2xpbmVzW3QtMV0ubGVuZ3RoKzEscjwxPyhyPTEsbj0hMCk6cj5pJiYocj1pLG49ITApKSxuP3tsaW5lTnVtYmVyOnQsY29sdW1uOnJ9OmV9fWNsYXNzIHJye2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5faG9zdD1lLHRoaXMuX21vZGVscz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2ZvcmVpZ25Nb2R1bGVGYWN0b3J5PXQsdGhpcy5fZm9yZWlnbk1vZHVsZT1udWxsfWRpc3Bvc2UoKXt0aGlzLl9tb2RlbHM9T2JqZWN0LmNyZWF0ZShudWxsKX1fZ2V0TW9kZWwoZSl7cmV0dXJuIHRoaXMuX21vZGVsc1tlXX1fZ2V0TW9kZWxzKCl7bGV0IHQ9W107cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX21vZGVscykuZm9yRWFjaChlPT50LnB1c2godGhpcy5fbW9kZWxzW2VdKSksdH1hY2NlcHROZXdNb2RlbChlKXt0aGlzLl9tb2RlbHNbZS51cmxdPW5ldyB0cihPZS5wYXJzZShlLnVybCksZS5saW5lcyxlLkVPTCxlLnZlcnNpb25JZCl9YWNjZXB0TW9kZWxDaGFuZ2VkKHQscil7aWYodGhpcy5fbW9kZWxzW3RdKXtsZXQgZT10aGlzLl9tb2RlbHNbdF07ZS5vbkV2ZW50cyhyKX19YWNjZXB0UmVtb3ZlZE1vZGVsKGUpe3RoaXMuX21vZGVsc1tlXSYmZGVsZXRlIHRoaXMuX21vZGVsc1tlXX1jb21wdXRlVW5pY29kZUhpZ2hsaWdodHModCxyLG4pe3JldHVybiBlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7dmFyIGU9dGhpcy5fZ2V0TW9kZWwodCk7cmV0dXJuIGU/WnQuY29tcHV0ZVVuaWNvZGVIaWdobGlnaHRzKGUscixuKTp7cmFuZ2VzOltdLGhhc01vcmU6ITEsYW1iaWd1b3VzQ2hhcmFjdGVyQ291bnQ6MCxpbnZpc2libGVDaGFyYWN0ZXJDb3VudDowLG5vbkJhc2ljQXNjaWlDaGFyYWN0ZXJDb3VudDowfX0pfWNvbXB1dGVEaWZmKG8scyxhLGwpe3JldHVybiBlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7Y29uc3QgZT10aGlzLl9nZXRNb2RlbChvKSx0PXRoaXMuX2dldE1vZGVsKHMpO2lmKCFlfHwhdClyZXR1cm4gbnVsbDt2YXIgcj1lLmdldExpbmVzQ29udGVudCgpLG49dC5nZXRMaW5lc0NvbnRlbnQoKTtjb25zdCBpPW5ldyBHZShyLG4se3Nob3VsZENvbXB1dGVDaGFyQ2hhbmdlczohMCxzaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzOiEwLHNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlOmEsc2hvdWxkTWFrZVByZXR0eURpZmY6ITAsbWF4Q29tcHV0YXRpb25UaW1lOmx9KTtyPWkuY29tcHV0ZURpZmYoKSxuPSEoMDxyLmNoYW5nZXMubGVuZ3RoKSYmdGhpcy5fbW9kZWxzQXJlSWRlbnRpY2FsKGUsdCk7cmV0dXJue3F1aXRFYXJseTpyLnF1aXRFYXJseSxpZGVudGljYWw6bixjaGFuZ2VzOnIuY2hhbmdlc319KX1fbW9kZWxzQXJlSWRlbnRpY2FsKHQscil7dmFyIG49dC5nZXRMaW5lQ291bnQoKTtpZihuIT09ci5nZXRMaW5lQ291bnQoKSlyZXR1cm4hMTtmb3IobGV0IGU9MTtlPD1uO2UrKylpZih0LmdldExpbmVDb250ZW50KGUpIT09ci5nZXRMaW5lQ29udGVudChlKSlyZXR1cm4hMTtyZXR1cm4hMH1jb21wdXRlTW9yZU1pbmltYWxFZGl0cyhkLGYpe3JldHVybiBlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7Y29uc3QgZT10aGlzLl9nZXRNb2RlbChkKTtpZighZSlyZXR1cm4gZjtjb25zdCB0PVtdO2xldCByPXZvaWQgMDtmb3IodmFye3JhbmdlOm4sdGV4dDppLGVvbDpvfW9mIGY9Zi5zbGljZSgwKS5zb3J0KChlLHQpPT57cmV0dXJuIGUucmFuZ2UmJnQucmFuZ2U/QmUuY29tcGFyZVJhbmdlc1VzaW5nU3RhcnRzKGUucmFuZ2UsdC5yYW5nZSk6KGUucmFuZ2U/MDoxKS0odC5yYW5nZT8wOjEpfSkpaWYoIm51bWJlciI9PXR5cGVvZiBvJiYocj1vKSwhQmUuaXNFbXB0eShuKXx8aSl7dmFyIHM9ZS5nZXRWYWx1ZUluUmFuZ2Uobik7aWYoaT1pLnJlcGxhY2UoL1xyXG58XG58XHIvZyxlLmVvbCkscyE9PWkpaWYoTWF0aC5tYXgoaS5sZW5ndGgscy5sZW5ndGgpPnJyLl9kaWZmTGltaXQpdC5wdXNoKHtyYW5nZTpuLHRleHQ6aX0pO2Vsc2V7dmFyIHM9KGg9cyxvPWkscz0hMSxuZXcgaWUobmV3IGVlKGgpLG5ldyBlZShvKSkuQ29tcHV0ZURpZmYocykuY2hhbmdlcyksYT1lLm9mZnNldEF0KEJlLmxpZnQobikuZ2V0U3RhcnRQb3NpdGlvbigpKTtmb3IoY29uc3QgYyBvZiBzKXt2YXIgbD1lLnBvc2l0aW9uQXQoYStjLm9yaWdpbmFsU3RhcnQpLHU9ZS5wb3NpdGlvbkF0KGErYy5vcmlnaW5hbFN0YXJ0K2Mub3JpZ2luYWxMZW5ndGgpLHU9e3RleHQ6aS5zdWJzdHIoYy5tb2RpZmllZFN0YXJ0LGMubW9kaWZpZWRMZW5ndGgpLHJhbmdlOntzdGFydExpbmVOdW1iZXI6bC5saW5lTnVtYmVyLHN0YXJ0Q29sdW1uOmwuY29sdW1uLGVuZExpbmVOdW1iZXI6dS5saW5lTnVtYmVyLGVuZENvbHVtbjp1LmNvbHVtbn19O2UuZ2V0VmFsdWVJblJhbmdlKHUucmFuZ2UpIT09dS50ZXh0JiZ0LnB1c2godSl9fX12YXIgaDtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHImJnQucHVzaCh7ZW9sOnIsdGV4dDoiIixyYW5nZTp7c3RhcnRMaW5lTnVtYmVyOjAsc3RhcnRDb2x1bW46MCxlbmRMaW5lTnVtYmVyOjAsZW5kQ29sdW1uOjB9fSksdH0pfWNvbXB1dGVMaW5rcyh0KXtyZXR1cm4gZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3ZhciBlPXRoaXMuX2dldE1vZGVsKHQpO3JldHVybiBlPyhlPWUpJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5nZXRMaW5lQ291bnQmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmdldExpbmVDb250ZW50P2N0LmNvbXB1dGVMaW5rcyhlKTpbXTpudWxsfSl9dGV4dHVhbFN1Z2dlc3QocyxhLGwsdSl7cmV0dXJuIGVyKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtjb25zdCBlPW5ldyBUKCEwKTt2YXIgdD1uZXcgUmVnRXhwKGwsdSk7Y29uc3Qgcj1uZXcgU2V0O2U6Zm9yKHZhciBuIG9mIHMpe2NvbnN0IG89dGhpcy5fZ2V0TW9kZWwobik7aWYobylmb3IodmFyIGkgb2Ygby53b3Jkcyh0KSlpZihpIT09YSYmaXNOYU4oTnVtYmVyKGkpKSYmKHIuYWRkKGkpLHIuc2l6ZT5yci5fc3VnZ2VzdGlvbnNMaW1pdCkpYnJlYWsgZX1yZXR1cm57d29yZHM6QXJyYXkuZnJvbShyKSxkdXJhdGlvbjplLmVsYXBzZWQoKX19KX1jb21wdXRlV29yZFJhbmdlcyh0LG8scyxhKXtyZXR1cm4gZXIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe2xldCBlPXRoaXMuX2dldE1vZGVsKHQpO2lmKCFlKXJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO3ZhciByPW5ldyBSZWdFeHAocyxhKTtjb25zdCBuPU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGxldCB0PW8uc3RhcnRMaW5lTnVtYmVyO3Q8by5lbmRMaW5lTnVtYmVyO3QrKylmb3IoY29uc3QgaSBvZiBlLmdldExpbmVXb3Jkcyh0LHIpKWlmKGlzTmFOKE51bWJlcihpLndvcmQpKSl7bGV0IGU9bltpLndvcmRdO2V8fChlPVtdLG5baS53b3JkXT1lKSxlLnB1c2goe3N0YXJ0TGluZU51bWJlcjp0LHN0YXJ0Q29sdW1uOmkuc3RhcnRDb2x1bW4sZW5kTGluZU51bWJlcjp0LGVuZENvbHVtbjppLmVuZENvbHVtbn0pfXJldHVybiBufSl9bmF2aWdhdGVWYWx1ZVNldChpLG8scyxhLGwpe3JldHVybiBlcih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7bGV0IGU9dGhpcy5fZ2V0TW9kZWwoaSk7aWYoIWUpcmV0dXJuIG51bGw7dmFyIHQ9bmV3IFJlZ0V4cChhLGwpO28uc3RhcnRDb2x1bW49PT1vLmVuZENvbHVtbiYmKG89e3N0YXJ0TGluZU51bWJlcjpvLnN0YXJ0TGluZU51bWJlcixzdGFydENvbHVtbjpvLnN0YXJ0Q29sdW1uLGVuZExpbmVOdW1iZXI6by5lbmRMaW5lTnVtYmVyLGVuZENvbHVtbjpvLmVuZENvbHVtbisxfSk7dmFyIHI9ZS5nZXRWYWx1ZUluUmFuZ2Uobyksbj1lLmdldFdvcmRBdFBvc2l0aW9uKHtsaW5lTnVtYmVyOm8uc3RhcnRMaW5lTnVtYmVyLGNvbHVtbjpvLnN0YXJ0Q29sdW1ufSx0KTtpZighbilyZXR1cm4gbnVsbDt0PWUuZ2V0VmFsdWVJblJhbmdlKG4pO3JldHVybiBkdC5JTlNUQU5DRS5uYXZpZ2F0ZVZhbHVlU2V0KG8scixuLHQscyl9KX1sb2FkRm9yZWlnbk1vZHVsZShlLHQscil7cj1WKHIsKGUsdCk9PnRoaXMuX2hvc3QuZmhyKGUsdCkpO3JldHVybiB0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeT8odGhpcy5fZm9yZWlnbk1vZHVsZT10aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeSh7aG9zdDpyLGdldE1pcnJvck1vZGVsczooKT0+dGhpcy5fZ2V0TW9kZWxzKCl9LHQpLFByb21pc2UucmVzb2x2ZShQKHRoaXMuX2ZvcmVpZ25Nb2R1bGUpKSk6UHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJVbmV4cGVjdGVkIHVzYWdlIikpfWZtcihlLHQpe2lmKCF0aGlzLl9mb3JlaWduTW9kdWxlfHwiZnVuY3Rpb24iIT10eXBlb2YgdGhpcy5fZm9yZWlnbk1vZHVsZVtlXSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCJNaXNzaW5nIHJlcXVlc3RIYW5kbGVyIG9yIG1ldGhvZDogIitlKSk7dHJ5e3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fZm9yZWlnbk1vZHVsZVtlXS5hcHBseSh0aGlzLl9mb3JlaWduTW9kdWxlLHQpKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9fX1yci5fZGlmZkxpbWl0PTFlNSxyci5fc3VnZ2VzdGlvbnNMaW1pdD0xZTQsImZ1bmN0aW9uIj09dHlwZW9mIGltcG9ydFNjcmlwdHMmJihfLm1vbmFjbz17ZWRpdG9yOnZvaWQgMCxsYW5ndWFnZXM6dm9pZCAwLGV4dHJhOnZvaWQgMCxDYW5jZWxsYXRpb25Ub2tlblNvdXJjZTpndCxFbWl0dGVyOkksS2V5Q29kZTpoZSxLZXlNb2Q6SnQsUG9zaXRpb246cWUsUmFuZ2U6QmUsU2VsZWN0aW9uOk50LFVyaTpPZSxUb2tlbjpMdCxNYXJrZG93blN0cmluZzpCdCxEaXNwb3NhYmxlOmQsRGlzcG9zYWJsZVN0b3JlOmEsRXJyb3JIYW5kbGVyOmUsQWJzdHJhY3RMb2dnZXI6SHQsQ29uc29sZUxvZ2dlcjp6dCxUb2tlbml6YXRpb25SZXN1bHQ6a3QsVG9rZW5pemF0aW9uUmVzdWx0MjpNdCxTZWxlY3Rpb25EaXJlY3Rpb246bWUsTWFya2VyU2V2ZXJpdHk6ZGUsTWFya2VyVGFnOmZlLE1hcmtkb3duU3RyaW5nVGV4dE5ld2xpbmVTdHlsZTpjZSxMb2dMZXZlbDpwcixlcnJvckhhbmRsZXI6cn0pO2xldCBucj0hMTtmdW5jdGlvbiBpcih0KXtpZighbnIpe25yPSEwO2NvbnN0IHI9bmV3IFooZT0+e3NlbGYucG9zdE1lc3NhZ2UoZSl9LGU9Pm5ldyBycihlLHQpKTtzZWxmLm9ubWVzc2FnZT1lPT57ci5vbm1lc3NhZ2UoZS5kYXRhKX19fWZ1bmN0aW9uIG9yKG8sZSl7dmFyIHM9by5sZW5ndGgsYT0wLGw9IiIsdT0wLGg9MTYsYz0wLGQ9MCxmPTAsbT0wLGc9MDtmdW5jdGlvbiBwKCl7Zm9yKHZhciBlPSIiLHQ9YTs7KXtpZihzPD1hKXtlKz1vLnN1YnN0cmluZyh0LGEpLGc9MjticmVha312YXIgcj1vLmNoYXJDb2RlQXQoYSk7aWYoMzQ9PT1yKXtlKz1vLnN1YnN0cmluZyh0LGEpLGErKzticmVha31pZig5MiE9PXIpe2lmKDA8PXImJnI8PTMxKXtpZihhcihyKSl7ZSs9by5zdWJzdHJpbmcodCxhKSxnPTI7YnJlYWt9Zz02fWErK31lbHNle2lmKGUrPW8uc3Vic3RyaW5nKHQsYSksczw9KythKXtnPTI7YnJlYWt9c3dpdGNoKG8uY2hhckNvZGVBdChhKyspKXtjYXNlIDM0OmUrPSciJzticmVhaztjYXNlIDkyOmUrPSJcXCI7YnJlYWs7Y2FzZSA0NzplKz0iLyI7YnJlYWs7Y2FzZSA5ODplKz0iXGIiO2JyZWFrO2Nhc2UgMTAyOmUrPSJcZiI7YnJlYWs7Y2FzZSAxMTA6ZSs9IlxuIjticmVhaztjYXNlIDExNDplKz0iXHIiO2JyZWFrO2Nhc2UgMTE2OmUrPSJcdCI7YnJlYWs7Y2FzZSAxMTc6dmFyIG49ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9MCxuPTA7cjxlfHwhdDspe3ZhciBpPW8uY2hhckNvZGVBdChhKTtpZig0ODw9aSYmaTw9NTcpbj0xNipuK2ktNDg7ZWxzZSBpZig2NTw9aSYmaTw9NzApbj0xNipuK2ktNjUrMTA7ZWxzZXtpZighKDk3PD1pJiZpPD0xMDIpKWJyZWFrO249MTYqbitpLTk3KzEwfWErKyxyKyt9cmV0dXJuIG49cjxlPy0xOm59KDQsITApOzA8PW4/ZSs9U3RyaW5nLmZyb21DaGFyQ29kZShuKTpnPTQ7YnJlYWs7ZGVmYXVsdDpnPTV9dD1hfX1yZXR1cm4gZX1mdW5jdGlvbiB0KCl7aWYobD0iIixnPTAsZD1jLG09ZixzPD0odT1hKSlyZXR1cm4gdT1zLGg9MTc7dmFyIGU9by5jaGFyQ29kZUF0KGEpO2lmKHNyKGUpKXtmb3IoO2ErKyxsKz1TdHJpbmcuZnJvbUNoYXJDb2RlKGUpLHNyKGU9by5jaGFyQ29kZUF0KGEpKTspO3JldHVybiBoPTE1fWlmKGFyKGUpKXJldHVybiBhKyssbCs9U3RyaW5nLmZyb21DaGFyQ29kZShlKSwxMz09PWUmJjEwPT09by5jaGFyQ29kZUF0KGEpJiYoYSsrLGwrPSJcbiIpLGMrKyxmPWEsaD0xNDtzd2l0Y2goZSl7Y2FzZSAxMjM6cmV0dXJuIGErKyxoPTE7Y2FzZSAxMjU6cmV0dXJuIGErKyxoPTI7Y2FzZSA5MTpyZXR1cm4gYSsrLGg9MztjYXNlIDkzOnJldHVybiBhKyssaD00O2Nhc2UgNTg6cmV0dXJuIGErKyxoPTY7Y2FzZSA0NDpyZXR1cm4gYSsrLGg9NTtjYXNlIDM0OnJldHVybiBhKyssbD1wKCksaD0xMDtjYXNlIDQ3OnZhciB0PWEtMTtpZig0Nz09PW8uY2hhckNvZGVBdChhKzEpKXtmb3IoYSs9MjthPHMmJiFhcihvLmNoYXJDb2RlQXQoYSkpOylhKys7cmV0dXJuIGw9by5zdWJzdHJpbmcodCxhKSxoPTEyfWlmKDQyIT09by5jaGFyQ29kZUF0KGErMSkpcmV0dXJuIGwrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksYSsrLGg9MTY7YSs9Mjtmb3IodmFyIHI9cy0xLG49ITE7YTxyOyl7dmFyIGk9by5jaGFyQ29kZUF0KGEpO2lmKDQyPT09aSYmNDc9PT1vLmNoYXJDb2RlQXQoYSsxKSl7YSs9MixuPSEwO2JyZWFrfWErKyxhcihpKSYmKDEzPT09aSYmMTA9PT1vLmNoYXJDb2RlQXQoYSkmJmErKyxjKyssZj1hKX1yZXR1cm4gbnx8KGErKyxnPTEpLGw9by5zdWJzdHJpbmcodCxhKSxoPTEzO2Nhc2UgNDU6aWYobCs9U3RyaW5nLmZyb21DaGFyQ29kZShlKSwrK2E9PT1zfHwhbHIoby5jaGFyQ29kZUF0KGEpKSlyZXR1cm4gaD0xNjtjYXNlIDQ4OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6Y2FzZSA1NjpjYXNlIDU3OnJldHVybiBsKz1mdW5jdGlvbigpe3ZhciBlPWE7aWYoNDg9PT1vLmNoYXJDb2RlQXQoYSkpYSsrO2Vsc2UgZm9yKGErKzthPG8ubGVuZ3RoJiZscihvLmNoYXJDb2RlQXQoYSkpOylhKys7aWYoYTxvLmxlbmd0aCYmNDY9PT1vLmNoYXJDb2RlQXQoYSkpe2lmKCEoKythPG8ubGVuZ3RoJiZscihvLmNoYXJDb2RlQXQoYSkpKSlyZXR1cm4gZz0zLG8uc3Vic3RyaW5nKGUsYSk7Zm9yKGErKzthPG8ubGVuZ3RoJiZscihvLmNoYXJDb2RlQXQoYSkpOylhKyt9dmFyIHQ9YTtpZihhPG8ubGVuZ3RoJiYoNjk9PT1vLmNoYXJDb2RlQXQoYSl8fDEwMT09PW8uY2hhckNvZGVBdChhKSkpaWYoKCsrYTxvLmxlbmd0aCYmNDM9PT1vLmNoYXJDb2RlQXQoYSl8fDQ1PT09by5jaGFyQ29kZUF0KGEpKSYmYSsrLGE8by5sZW5ndGgmJmxyKG8uY2hhckNvZGVBdChhKSkpe2ZvcihhKys7YTxvLmxlbmd0aCYmbHIoby5jaGFyQ29kZUF0KGEpKTspYSsrO3Q9YX1lbHNlIGc9MztyZXR1cm4gby5zdWJzdHJpbmcoZSx0KX0oKSxoPTExO2RlZmF1bHQ6Zm9yKDthPHMmJmZ1bmN0aW9uKGUpe2lmKHNyKGUpfHxhcihlKSlyZXR1cm4hMTtzd2l0Y2goZSl7Y2FzZSAxMjU6Y2FzZSA5MzpjYXNlIDEyMzpjYXNlIDkxOmNhc2UgMzQ6Y2FzZSA1ODpjYXNlIDQ0OmNhc2UgNDc6cmV0dXJuITF9cmV0dXJuITB9KGUpOylhKyssZT1vLmNoYXJDb2RlQXQoYSk7aWYodT09PWEpcmV0dXJuIGwrPVN0cmluZy5mcm9tQ2hhckNvZGUoZSksYSsrLGg9MTY7c3dpdGNoKGw9by5zdWJzdHJpbmcodSxhKSl7Y2FzZSJ0cnVlIjpyZXR1cm4gaD04O2Nhc2UiZmFsc2UiOnJldHVybiBoPTk7Y2FzZSJudWxsIjpyZXR1cm4gaD03fXJldHVybiBoPTE2fX1yZXR1cm57c2V0UG9zaXRpb246ZnVuY3Rpb24oZSl7YT1lLGw9IiIsaD0xNixnPXU9MH0sZ2V0UG9zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gYX0sc2NhbjooZT12b2lkIDA9PT1lPyExOmUpP2Z1bmN0aW9uKCl7Zm9yKHZhciBlOzEyPD0oZT10KCkpJiZlPD0xNTspO3JldHVybiBlfTp0LGdldFRva2VuOmZ1bmN0aW9uKCl7cmV0dXJuIGh9LGdldFRva2VuVmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbH0sZ2V0VG9rZW5PZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdX0sZ2V0VG9rZW5MZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gYS11fSxnZXRUb2tlblN0YXJ0TGluZTpmdW5jdGlvbigpe3JldHVybiBkfSxnZXRUb2tlblN0YXJ0Q2hhcmFjdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHUtbX0sZ2V0VG9rZW5FcnJvcjpmdW5jdGlvbigpe3JldHVybiBnfX19ZnVuY3Rpb24gc3IoZSl7cmV0dXJuIDMyPT09ZXx8OT09PWV8fDExPT09ZXx8MTI9PT1lfHwxNjA9PT1lfHw1NzYwPT09ZXx8ODE5Mjw9ZSYmZTw9ODIwM3x8ODIzOT09PWV8fDgyODc9PT1lfHwxMjI4OD09PWV8fDY1Mjc5PT09ZX1mdW5jdGlvbiBhcihlKXtyZXR1cm4gMTA9PT1lfHwxMz09PWV8fDgyMzI9PT1lfHw4MjMzPT09ZX1mdW5jdGlvbiBscihlKXtyZXR1cm4gNDg8PWUmJmU8PTU3fWZ1bmN0aW9uIHVyKG4saSxlKXt2YXIgdCxyLG8scztpZihpKXtmb3Iobz1pLm9mZnNldCxzPW8raS5sZW5ndGgscj1vOzA8ciYmIWNyKG4sci0xKTspci0tO2Zvcih2YXIgYT1zO2E8bi5sZW5ndGgmJiFjcihuLGEpOylhKys7eT1uLnN1YnN0cmluZyhyLGEpLHQ9ZnVuY3Rpb24oZSx0KXt2YXIgcj0wLG49MCxpPXQudGFiU2l6ZXx8NDtmb3IoO3I8ZS5sZW5ndGg7KXt2YXIgbz1lLmNoYXJBdChyKTtpZigiICI9PT1vKW4rKztlbHNle2lmKCJcdCIhPT1vKWJyZWFrO24rPWl9cisrfXJldHVybiBNYXRoLmZsb29yKG4vaSl9KHksZSl9ZWxzZSBvPXI9dD0wLHM9KHk9bikubGVuZ3RoO3ZhciBsPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBuPXQuY2hhckF0KHIpO2lmKCJcciI9PT1uKXJldHVybiByKzE8dC5sZW5ndGgmJiJcbiI9PT10LmNoYXJBdChyKzEpPyJcclxuIjoiXHIiO2lmKCJcbiI9PT1uKXJldHVybiJcbiJ9cmV0dXJuIGUmJmUuZW9sfHwiXG4ifShlLG4pLHU9ITEsaD0wLGM9ZS5pbnNlcnRTcGFjZXM/aHIoIiAiLGUudGFiU2l6ZXx8NCk6Ilx0IixkPW9yKHksITEpLGY9ITE7ZnVuY3Rpb24gbSgpe3JldHVybiBsK2hyKGMsdCtoKX1mdW5jdGlvbiBnKCl7dmFyIGU9ZC5zY2FuKCk7Zm9yKHU9ITE7MTU9PT1lfHwxND09PWU7KXU9dXx8MTQ9PT1lLGU9ZC5zY2FuKCk7cmV0dXJuIGY9MTY9PT1lfHwwIT09ZC5nZXRUb2tlbkVycm9yKCksZX12YXIgcD1bXTtmdW5jdGlvbiB2KGUsdCxyKXtmfHxpJiYhKHQ8cyYmbzxyKXx8bi5zdWJzdHJpbmcodCxyKT09PWV8fHAucHVzaCh7b2Zmc2V0OnQsbGVuZ3RoOnItdCxjb250ZW50OmV9KX12YXIgeSxiPWcoKTtmb3IoMTchPT1iJiYoeT1kLmdldFRva2VuT2Zmc2V0KCkrcix2KGhyKGMsdCkscix5KSk7MTchPT1iOyl7Zm9yKHZhciBfPWQuZ2V0VG9rZW5PZmZzZXQoKStkLmdldFRva2VuTGVuZ3RoKCkrcixDPWcoKSxTPSIiLHc9ITE7IXUmJigxMj09PUN8fDEzPT09Qyk7KXYoIiAiLF8sZC5nZXRUb2tlbk9mZnNldCgpK3IpLF89ZC5nZXRUb2tlbk9mZnNldCgpK2QuZ2V0VG9rZW5MZW5ndGgoKStyLFM9KHc9MTI9PT1DKT9tKCk6IiIsQz1nKCk7aWYoMj09PUMpMSE9PWImJihoLS0sUz1tKCkpO2Vsc2UgaWYoND09PUMpMyE9PWImJihoLS0sUz1tKCkpO2Vsc2V7c3dpdGNoKGIpe2Nhc2UgMzpjYXNlIDE6aCsrLFM9bSgpO2JyZWFrO2Nhc2UgNTpjYXNlIDEyOlM9bSgpO2JyZWFrO2Nhc2UgMTM6dT9TPW0oKTp3fHwoUz0iICIpO2JyZWFrO2Nhc2UgNjp3fHwoUz0iICIpO2JyZWFrO2Nhc2UgMTA6aWYoNj09PUMpe3d8fChTPSIiKTticmVha31jYXNlIDc6Y2FzZSA4OmNhc2UgOTpjYXNlIDExOmNhc2UgMjpjYXNlIDQ6MTI9PT1DfHwxMz09PUM/d3x8KFM9IiAiKTo1IT09QyYmMTchPT1DJiYoZj0hMCk7YnJlYWs7Y2FzZSAxNjpmPSEwfSF1fHwxMiE9PUMmJjEzIT09Q3x8KFM9bSgpKX12KFM9MTc9PT1DP2UuaW5zZXJ0RmluYWxOZXdsaW5lP2w6IiI6UyxfLGQuZ2V0VG9rZW5PZmZzZXQoKStyKSxiPUN9cmV0dXJuIHB9ZnVuY3Rpb24gaHIoZSx0KXtmb3IodmFyIHI9IiIsbj0wO248dDtuKyspcis9ZTtyZXR1cm4gcn1mdW5jdGlvbiBjcihlLHQpe3JldHVybi0xIT09IlxyXG4iLmluZGV4T2YoZS5jaGFyQXQodCkpfXNlbGYub25tZXNzYWdlPWU9Pntucnx8aXIobnVsbCl9LChZdD1ZdHx8e30pLkRFRkFVTFQ9e2FsbG93VHJhaWxpbmdDb21tYTohMX07dmFyIGRyLGZyLG1yLGdyLHByLHZyLHlyLGJyLF9yLENyLFNyLHdyLEFyLHhyLEVyLE5yLExyLGtyLE1yLFRyLE9yPW9yLElyPWZ1bmN0aW9uKGUsbix0KXt2b2lkIDA9PT1uJiYobj1bXSksdm9pZCAwPT09dCYmKHQ9WXQuREVGQVVMVCk7dmFyIHI9bnVsbCxpPVtdLG89W107ZnVuY3Rpb24gcyhlKXtBcnJheS5pc0FycmF5KGkpP2kucHVzaChlKTpudWxsIT09ciYmKGlbcl09ZSl9cmV0dXJuIGZ1bmN0aW9uKGUsdCxyKXt2b2lkIDA9PT1yJiYocj1ZdC5ERUZBVUxUKTt2YXIgaT1vcihlLCExKTtmdW5jdGlvbiBuKGUpe3JldHVybiBlP2Z1bmN0aW9uKCl7cmV0dXJuIGUoaS5nZXRUb2tlbk9mZnNldCgpLGkuZ2V0VG9rZW5MZW5ndGgoKSxpLmdldFRva2VuU3RhcnRMaW5lKCksaS5nZXRUb2tlblN0YXJ0Q2hhcmFjdGVyKCkpfTpmdW5jdGlvbigpe3JldHVybiEwfX1mdW5jdGlvbiBvKHQpe3JldHVybiB0P2Z1bmN0aW9uKGUpe3JldHVybiB0KGUsaS5nZXRUb2tlbk9mZnNldCgpLGkuZ2V0VG9rZW5MZW5ndGgoKSxpLmdldFRva2VuU3RhcnRMaW5lKCksaS5nZXRUb2tlblN0YXJ0Q2hhcmFjdGVyKCkpfTpmdW5jdGlvbigpe3JldHVybiEwfX12YXIgcz1uKHQub25PYmplY3RCZWdpbiksYT1vKHQub25PYmplY3RQcm9wZXJ0eSksbD1uKHQub25PYmplY3RFbmQpLHU9bih0Lm9uQXJyYXlCZWdpbiksaD1uKHQub25BcnJheUVuZCksYz1vKHQub25MaXRlcmFsVmFsdWUpLGQ9byh0Lm9uU2VwYXJhdG9yKSxmPW4odC5vbkNvbW1lbnQpLG09byh0Lm9uRXJyb3IpLGc9ciYmci5kaXNhbGxvd0NvbW1lbnRzLHA9ciYmci5hbGxvd1RyYWlsaW5nQ29tbWE7ZnVuY3Rpb24gdigpe2Zvcig7Oyl7dmFyIGU9aS5zY2FuKCk7c3dpdGNoKGkuZ2V0VG9rZW5FcnJvcigpKXtjYXNlIDQ6eSgxNCk7YnJlYWs7Y2FzZSA1OnkoMTUpO2JyZWFrO2Nhc2UgMzp5KDEzKTticmVhaztjYXNlIDE6Z3x8eSgxMSk7YnJlYWs7Y2FzZSAyOnkoMTIpO2JyZWFrO2Nhc2UgNjp5KDE2KX1zd2l0Y2goZSl7Y2FzZSAxMjpjYXNlIDEzOmc/eSgxMCk6ZigpO2JyZWFrO2Nhc2UgMTY6eSgxKTticmVhaztjYXNlIDE1OmNhc2UgMTQ6YnJlYWs7ZGVmYXVsdDpyZXR1cm4gZX19fWZ1bmN0aW9uIHkoZSx0LHIpe2lmKHZvaWQgMD09PXQmJih0PVtdKSx2b2lkIDA9PT1yJiYocj1bXSksbShlKSwwPHQubGVuZ3RoK3IubGVuZ3RoKWZvcih2YXIgbj1pLmdldFRva2VuKCk7MTchPT1uOyl7aWYoLTEhPT10LmluZGV4T2Yobikpe3YoKTticmVha31pZigtMSE9PXIuaW5kZXhPZihuKSlicmVhaztuPXYoKX19ZnVuY3Rpb24gYihlKXt2YXIgdD1pLmdldFRva2VuVmFsdWUoKTtyZXR1cm4oZT9jOmEpKHQpLHYoKSwhMH1mdW5jdGlvbiBfKCl7cygpLHYoKTtmb3IodmFyIGU9ITE7MiE9PWkuZ2V0VG9rZW4oKSYmMTchPT1pLmdldFRva2VuKCk7KXtpZig1PT09aS5nZXRUb2tlbigpKXtpZihlfHx5KDQsW10sW10pLGQoIiwiKSx2KCksMj09PWkuZ2V0VG9rZW4oKSYmcClicmVha31lbHNlIGUmJnkoNixbXSxbXSk7IWZ1bmN0aW9uKCl7aWYoMTA9PT1pLmdldFRva2VuKCkpcmV0dXJuIGIoITEpLDY9PT1pLmdldFRva2VuKCk/KGQoIjoiKSx2KCksQygpfHx5KDQsW10sWzIsNV0pKTp5KDUsW10sWzIsNV0pLDE7eSgzLFtdLFsyLDVdKX0oKSYmeSg0LFtdLFsyLDVdKSxlPSEwfXJldHVybiBsKCksMiE9PWkuZ2V0VG9rZW4oKT95KDcsWzJdLFtdKTp2KCksITB9ZnVuY3Rpb24gQygpe3N3aXRjaChpLmdldFRva2VuKCkpe2Nhc2UgMzpyZXR1cm4gZnVuY3Rpb24oKXt1KCksdigpO2Zvcih2YXIgZT0hMTs0IT09aS5nZXRUb2tlbigpJiYxNyE9PWkuZ2V0VG9rZW4oKTspe2lmKDU9PT1pLmdldFRva2VuKCkpe2lmKGV8fHkoNCxbXSxbXSksZCgiLCIpLHYoKSw0PT09aS5nZXRUb2tlbigpJiZwKWJyZWFrfWVsc2UgZSYmeSg2LFtdLFtdKTtDKCl8fHkoNCxbXSxbNCw1XSksZT0hMH1yZXR1cm4gaCgpLDQhPT1pLmdldFRva2VuKCk/eSg4LFs0XSxbXSk6digpLDF9KCk7Y2FzZSAxOnJldHVybiBfKCk7Y2FzZSAxMDpyZXR1cm4gYighMCk7ZGVmYXVsdDpyZXR1cm4gZnVuY3Rpb24oKXtzd2l0Y2goaS5nZXRUb2tlbigpKXtjYXNlIDExOnZhciBlPWkuZ2V0VG9rZW5WYWx1ZSgpLGU9TnVtYmVyKGUpO2lzTmFOKGUpJiYoeSgyKSxlPTApLGMoZSk7YnJlYWs7Y2FzZSA3OmMobnVsbCk7YnJlYWs7Y2FzZSA4OmMoITApO2JyZWFrO2Nhc2UgOTpjKCExKTticmVhaztkZWZhdWx0OnJldHVybn1yZXR1cm4gdigpLDF9KCl9fWlmKHYoKSwxNz09PWkuZ2V0VG9rZW4oKSlyZXR1cm4gci5hbGxvd0VtcHR5Q29udGVudHx8eSg0LFtdLFtdKTtpZighQygpKXJldHVybiB5KDQsW10sW10pOzE3IT09aS5nZXRUb2tlbigpJiZ5KDksW10sW10pfShlLHtvbk9iamVjdEJlZ2luOmZ1bmN0aW9uKCl7dmFyIGU9e307cyhlKSxvLnB1c2goaSksaT1lLHI9bnVsbH0sb25PYmplY3RQcm9wZXJ0eTpmdW5jdGlvbihlKXtyPWV9LG9uT2JqZWN0RW5kOmZ1bmN0aW9uKCl7aT1vLnBvcCgpfSxvbkFycmF5QmVnaW46ZnVuY3Rpb24oKXt2YXIgZT1bXTtzKGUpLG8ucHVzaChpKSxpPWUscj1udWxsfSxvbkFycmF5RW5kOmZ1bmN0aW9uKCl7aT1vLnBvcCgpfSxvbkxpdGVyYWxWYWx1ZTpzLG9uRXJyb3I6ZnVuY3Rpb24oZSx0LHIpe24ucHVzaCh7ZXJyb3I6ZSxvZmZzZXQ6dCxsZW5ndGg6cn0pfX0sdCksaVswXX0sUHI9ZnVuY3Rpb24gZSh0LHIsbil7aWYodm9pZCAwPT09KHU9bj12b2lkIDAhPT1uJiZuKSYmKHU9ITEpLChsPXIpPj0oYT10KS5vZmZzZXQmJmw8YS5vZmZzZXQrYS5sZW5ndGh8fHUmJmw9PT1hLm9mZnNldCthLmxlbmd0aCl7dmFyIGk9dC5jaGlsZHJlbjtpZihBcnJheS5pc0FycmF5KGkpKWZvcih2YXIgbz0wO288aS5sZW5ndGgmJmlbb10ub2Zmc2V0PD1yO28rKyl7dmFyIHM9ZShpW29dLHIsbik7aWYocylyZXR1cm4gc31yZXR1cm4gdH12YXIgYSxsLHV9LFZyPWZ1bmN0aW9uIGUodCl7aWYoIXQucGFyZW50fHwhdC5wYXJlbnQuY2hpbGRyZW4pcmV0dXJuW107dmFyIHIsbj1lKHQucGFyZW50KTtyZXR1cm4icHJvcGVydHkiPT09dC5wYXJlbnQudHlwZT8ocj10LnBhcmVudC5jaGlsZHJlblswXS52YWx1ZSxuLnB1c2gocikpOiJhcnJheSIhPT10LnBhcmVudC50eXBlfHwtMSE9PSh0PXQucGFyZW50LmNoaWxkcmVuLmluZGV4T2YodCkpJiZuLnB1c2godCksbn0sUnI9ZnVuY3Rpb24gZSh0KXtzd2l0Y2godC50eXBlKXtjYXNlImFycmF5IjpyZXR1cm4gdC5jaGlsZHJlbi5tYXAoZSk7Y2FzZSJvYmplY3QiOmZvcih2YXIgcj1PYmplY3QuY3JlYXRlKG51bGwpLG49MCxpPXQuY2hpbGRyZW47bjxpLmxlbmd0aDtuKyspe3ZhciBvPWlbbl0scz1vLmNoaWxkcmVuWzFdO3MmJihyW28uY2hpbGRyZW5bMF0udmFsdWVdPWUocykpfXJldHVybiByO2Nhc2UibnVsbCI6Y2FzZSJzdHJpbmciOmNhc2UibnVtYmVyIjpjYXNlImJvb2xlYW4iOnJldHVybiB0LnZhbHVlO2RlZmF1bHQ6cmV0dXJufX07ZnVuY3Rpb24gRHIoZSx0KXtpZihlPT09dClyZXR1cm4gMTtpZihudWxsIT1lJiZudWxsIT10JiZ0eXBlb2YgZT09dHlwZW9mIHQmJiJvYmplY3QiPT10eXBlb2YgZSYmQXJyYXkuaXNBcnJheShlKT09PUFycmF5LmlzQXJyYXkodCkpe3ZhciByLG47aWYoQXJyYXkuaXNBcnJheShlKSl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm47Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKylpZighRHIoZVtyXSx0W3JdKSlyZXR1cm59ZWxzZXt2YXIgaT1bXTtmb3IobiBpbiBlKWkucHVzaChuKTtpLnNvcnQoKTt2YXIgbz1bXTtmb3IobiBpbiB0KW8ucHVzaChuKTtpZihvLnNvcnQoKSwhRHIoaSxvKSlyZXR1cm47Zm9yKHI9MDtyPGkubGVuZ3RoO3IrKylpZighRHIoZVtpW3JdXSx0W2lbcl1dKSlyZXR1cm59cmV0dXJuIDF9fWZ1bmN0aW9uIEZyKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZX1mdW5jdGlvbiBLcihlKXtyZXR1cm4gdm9pZCAwIT09ZX1mdW5jdGlvbiBqcihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIFVyKGUsdCl7aWYoIShlLmxlbmd0aDx0Lmxlbmd0aCkpe2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKWlmKGVbcl0hPT10W3JdKXJldHVybjtyZXR1cm4gMX19ZnVuY3Rpb24gcXIoZSx0KXt2YXIgcj1lLmxlbmd0aC10Lmxlbmd0aDtyZXR1cm4gMDxyP2UubGFzdEluZGV4T2YodCk9PT1yOjA9PXImJmU9PT10fWZ1bmN0aW9uIEJyKHQpe3ZhciByPSIiO1VyKHQsIig/aSkiKSYmKHQ9dC5zdWJzdHJpbmcoNCkscj0iaSIpO3RyeXtyZXR1cm4gbmV3IFJlZ0V4cCh0LHIrInUiKX1jYXRjaChlKXt0cnl7cmV0dXJuIG5ldyBSZWdFeHAodCxyKX1jYXRjaChlKXtyZXR1cm59fX0ocHI9ZHI9ZHJ8fHt9KS5NSU5fVkFMVUU9MCxwci5NQVhfVkFMVUU9MjE0NzQ4MzY0NywocHI9ZnI9ZnJ8fHt9KS5jcmVhdGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm57bGluZTplPWU9PT1OdW1iZXIuTUFYX1ZBTFVFP2RyLk1BWF9WQUxVRTplLGNoYXJhY3Rlcjp0PXQ9PT1OdW1iZXIuTUFYX1ZBTFVFP2RyLk1BWF9WQUxVRTp0fX0scHIuaXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGRuLm9iamVjdExpdGVyYWwoZSkmJmRuLnVpbnRlZ2VyKGUubGluZSkmJmRuLnVpbnRlZ2VyKGUuY2hhcmFjdGVyKX0sKHByPW1yPW1yfHx7fSkuY3JlYXRlPWZ1bmN0aW9uKGUsdCxyLG4pe2lmKGRuLnVpbnRlZ2VyKGUpJiZkbi51aW50ZWdlcih0KSYmZG4udWludGVnZXIocikmJmRuLnVpbnRlZ2VyKG4pKXJldHVybntzdGFydDpmci5jcmVhdGUoZSx0KSxlbmQ6ZnIuY3JlYXRlKHIsbil9O2lmKGZyLmlzKGUpJiZmci5pcyh0KSlyZXR1cm57c3RhcnQ6ZSxlbmQ6dH07dGhyb3cgbmV3IEVycm9yKCJSYW5nZSNjcmVhdGUgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHNbIitlKyIsICIrdCsiLCAiK3IrIiwgIituKyJdIil9LHByLmlzPWZ1bmN0aW9uKGUpe3JldHVybiBkbi5vYmplY3RMaXRlcmFsKGUpJiZmci5pcyhlLnN0YXJ0KSYmZnIuaXMoZS5lbmQpfSwocHI9Z3I9Z3J8fHt9KS5jcmVhdGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm57dXJpOmUscmFuZ2U6dH19LHByLmlzPWZ1bmN0aW9uKGUpe3JldHVybiBkbi5kZWZpbmVkKGUpJiZtci5pcyhlLnJhbmdlKSYmKGRuLnN0cmluZyhlLnVyaSl8fGRuLnVuZGVmaW5lZChlLnVyaSkpfSwoX3I9X3I9X3J8fHt9KS5jcmVhdGU9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJue3JlZDplLGdyZWVuOnQsYmx1ZTpyLGFscGhhOm59fSxfci5pcz1mdW5jdGlvbihlKXtyZXR1cm4gZG4ubnVtYmVyUmFuZ2UoZS5yZWQsMCwxKSYmZG4ubnVtYmVyUmFuZ2UoZS5ncmVlbiwwLDEpJiZkbi5udW1iZXJSYW5nZShlLmJsdWUsMCwxKSYmZG4ubnVtYmVyUmFuZ2UoZS5hbHBoYSwwLDEpfSwoX3I9dnI9dnJ8fHt9KS5Db21tZW50PSJjb21tZW50Iixfci5JbXBvcnRzPSJpbXBvcnRzIixfci5SZWdpb249InJlZ2lvbiIsKF9yPXlyPXlyfHx7fSkuY3JlYXRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJue2xvY2F0aW9uOmUsbWVzc2FnZTp0fX0sX3IuaXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGRuLmRlZmluZWQoZSkmJmdyLmlzKGUubG9jYXRpb24pJiZkbi5zdHJpbmcoZS5tZXNzYWdlKX0sKF9yPWJyPWJyfHx7fSkuRXJyb3I9MSxfci5XYXJuaW5nPTIsX3IuSW5mb3JtYXRpb249Myxfci5IaW50PTQsKFNyfHx7fSkuaXM9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJmRuLnN0cmluZyhlLmhyZWYpfSwoU3I9Q3I9Q3J8fHt9KS5jcmVhdGU9ZnVuY3Rpb24oZSx0LHIsbixpLG8pe3JldHVybiB0PXtyYW5nZTplLG1lc3NhZ2U6dH0sZG4uZGVmaW5lZChyKSYmKHQuc2V2ZXJpdHk9ciksZG4uZGVmaW5lZChuKSYmKHQuY29kZT1uKSxkbi5kZWZpbmVkKGkpJiYodC5zb3VyY2U9aSksZG4uZGVmaW5lZChvKSYmKHQucmVsYXRlZEluZm9ybWF0aW9uPW8pLHR9LFNyLmlzPWZ1bmN0aW9uKGUpe3ZhciB0PWU7cmV0dXJuIGRuLmRlZmluZWQodCkmJm1yLmlzKHQucmFuZ2UpJiZkbi5zdHJpbmcodC5tZXNzYWdlKSYmKGRuLm51bWJlcih0LnNldmVyaXR5KXx8ZG4udW5kZWZpbmVkKHQuc2V2ZXJpdHkpKSYmKGRuLmludGVnZXIodC5jb2RlKXx8ZG4uc3RyaW5nKHQuY29kZSl8fGRuLnVuZGVmaW5lZCh0LmNvZGUpKSYmKGRuLnVuZGVmaW5lZCh0LmNvZGVEZXNjcmlwdGlvbil8fGRuLnN0cmluZyhudWxsPT09KGU9dC5jb2RlRGVzY3JpcHRpb24pfHx2b2lkIDA9PT1lP3ZvaWQgMDplLmhyZWYpKSYmKGRuLnN0cmluZyh0LnNvdXJjZSl8fGRuLnVuZGVmaW5lZCh0LnNvdXJjZSkpJiYoZG4udW5kZWZpbmVkKHQucmVsYXRlZEluZm9ybWF0aW9uKXx8ZG4udHlwZWRBcnJheSh0LnJlbGF0ZWRJbmZvcm1hdGlvbix5ci5pcykpfSwoVHI9VHI9VHJ8fHt9KS5jcmVhdGU9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIHI9W10sbj0yO248YXJndW1lbnRzLmxlbmd0aDtuKyspcltuLTJdPWFyZ3VtZW50c1tuXTtyZXR1cm4gdD17dGl0bGU6ZSxjb21tYW5kOnR9LGRuLmRlZmluZWQocikmJjA8ci5sZW5ndGgmJih0LmFyZ3VtZW50cz1yKSx0fSxUci5pcz1mdW5jdGlvbihlKXtyZXR1cm4gZG4uZGVmaW5lZChlKSYmZG4uc3RyaW5nKGUudGl0bGUpJiZkbi5zdHJpbmcoZS5jb21tYW5kKX0sKFRyPXdyPXdyfHx7fSkucmVwbGFjZT1mdW5jdGlvbihlLHQpe3JldHVybntyYW5nZTplLG5ld1RleHQ6dH19LFRyLmluc2VydD1mdW5jdGlvbihlLHQpe3JldHVybntyYW5nZTp7c3RhcnQ6ZSxlbmQ6ZX0sbmV3VGV4dDp0fX0sVHIuZGVsPWZ1bmN0aW9uKGUpe3JldHVybntyYW5nZTplLG5ld1RleHQ6IiJ9fSxUci5pcz1mdW5jdGlvbihlKXtyZXR1cm4gZG4ub2JqZWN0TGl0ZXJhbChlKSYmZG4uc3RyaW5nKGUubmV3VGV4dCkmJm1yLmlzKGUucmFuZ2UpfSwoVHI9QXI9QXJ8fHt9KS5jcmVhdGU9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiBlPXtsYWJlbDplfSx2b2lkIDAhPT10JiYoZS5uZWVkc0NvbmZpcm1hdGlvbj10KSx2b2lkIDAhPT1yJiYoZS5kZXNjcmlwdGlvbj1yKSxlfSxUci5pcz1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwIT09ZSYmZG4ub2JqZWN0TGl0ZXJhbChlKSYmZG4uc3RyaW5nKGUubGFiZWwpJiYoZG4uYm9vbGVhbihlLm5lZWRzQ29uZmlybWF0aW9uKXx8dm9pZCAwPT09ZS5uZWVkc0NvbmZpcm1hdGlvbikmJihkbi5zdHJpbmcoZS5kZXNjcmlwdGlvbil8fHZvaWQgMD09PWUuZGVzY3JpcHRpb24pfSwoeHJ8fCh4cj17fSkpLmlzPWZ1bmN0aW9uKGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZX0sKFRyPUVyPUVyfHx7fSkucmVwbGFjZT1mdW5jdGlvbihlLHQscil7cmV0dXJue3JhbmdlOmUsbmV3VGV4dDp0LGFubm90YXRpb25JZDpyfX0sVHIuaW5zZXJ0PWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm57cmFuZ2U6e3N0YXJ0OmUsZW5kOmV9LG5ld1RleHQ6dCxhbm5vdGF0aW9uSWQ6cn19LFRyLmRlbD1mdW5jdGlvbihlLHQpe3JldHVybntyYW5nZTplLG5ld1RleHQ6IiIsYW5ub3RhdGlvbklkOnR9fSxUci5pcz1mdW5jdGlvbihlKXtyZXR1cm4gd3IuaXMoZSkmJihBci5pcyhlLmFubm90YXRpb25JZCl8fHhyLmlzKGUuYW5ub3RhdGlvbklkKSl9LChUcj1Ocj1Ocnx8e30pLmNyZWF0ZT1mdW5jdGlvbihlLHQpe3JldHVybnt0ZXh0RG9jdW1lbnQ6ZSxlZGl0czp0fX0sVHIuaXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGRuLmRlZmluZWQoZSkmJkhyLmlzKGUudGV4dERvY3VtZW50KSYmQXJyYXkuaXNBcnJheShlLmVkaXRzKX0sKFRyPUxyPUxyfHx7fSkuY3JlYXRlPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT17a2luZDoiY3JlYXRlIix1cmk6ZX0sdm9pZCAwPT09dHx8dm9pZCAwPT09dC5vdmVyd3JpdGUmJnZvaWQgMD09PXQuaWdub3JlSWZFeGlzdHN8fChlLm9wdGlvbnM9dCksdm9pZCAwIT09ciYmKGUuYW5ub3RhdGlvbklkPXIpLGV9LFRyLmlzPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYiY3JlYXRlIj09PWUua2luZCYmZG4uc3RyaW5nKGUudXJpKSYmKHZvaWQgMD09PWUub3B0aW9uc3x8KHZvaWQgMD09PWUub3B0aW9ucy5vdmVyd3JpdGV8fGRuLmJvb2xlYW4oZS5vcHRpb25zLm92ZXJ3cml0ZSkpJiYodm9pZCAwPT09ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzfHxkbi5ib29sZWFuKGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSYmKHZvaWQgMD09PWUuYW5ub3RhdGlvbklkfHx4ci5pcyhlLmFubm90YXRpb25JZCkpfSwoVHI9a3I9a3J8fHt9KS5jcmVhdGU9ZnVuY3Rpb24oZSx0LHIsbil7cmV0dXJuIHQ9e2tpbmQ6InJlbmFtZSIsb2xkVXJpOmUsbmV3VXJpOnR9LHZvaWQgMD09PXJ8fHZvaWQgMD09PXIub3ZlcndyaXRlJiZ2b2lkIDA9PT1yLmlnbm9yZUlmRXhpc3RzfHwodC5vcHRpb25zPXIpLHZvaWQgMCE9PW4mJih0LmFubm90YXRpb25JZD1uKSx0fSxUci5pcz1mdW5jdGlvbihlKXtyZXR1cm4gZSYmInJlbmFtZSI9PT1lLmtpbmQmJmRuLnN0cmluZyhlLm9sZFVyaSkmJmRuLnN0cmluZyhlLm5ld1VyaSkmJih2b2lkIDA9PT1lLm9wdGlvbnN8fCh2b2lkIDA9PT1lLm9wdGlvbnMub3ZlcndyaXRlfHxkbi5ib29sZWFuKGUub3B0aW9ucy5vdmVyd3JpdGUpKSYmKHZvaWQgMD09PWUub3B0aW9ucy5pZ25vcmVJZkV4aXN0c3x8ZG4uYm9vbGVhbihlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkmJih2b2lkIDA9PT1lLmFubm90YXRpb25JZHx8eHIuaXMoZS5hbm5vdGF0aW9uSWQpKX0sKFRyPU1yPU1yfHx7fSkuY3JlYXRlPWZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gZT17a2luZDoiZGVsZXRlIix1cmk6ZX0sdm9pZCAwPT09dHx8dm9pZCAwPT09dC5yZWN1cnNpdmUmJnZvaWQgMD09PXQuaWdub3JlSWZOb3RFeGlzdHN8fChlLm9wdGlvbnM9dCksdm9pZCAwIT09ciYmKGUuYW5ub3RhdGlvbklkPXIpLGV9LFRyLmlzPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYiZGVsZXRlIj09PWUua2luZCYmZG4uc3RyaW5nKGUudXJpKSYmKHZvaWQgMD09PWUub3B0aW9uc3x8KHZvaWQgMD09PWUub3B0aW9ucy5yZWN1cnNpdmV8fGRuLmJvb2xlYW4oZS5vcHRpb25zLnJlY3Vyc2l2ZSkpJiYodm9pZCAwPT09ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzfHxkbi5ib29sZWFuKGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cykpKSYmKHZvaWQgMD09PWUuYW5ub3RhdGlvbklkfHx4ci5pcyhlLmFubm90YXRpb25JZCkpfSwoUXJ8fChRcj17fSkpLmlzPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYodm9pZCAwIT09ZS5jaGFuZ2VzfHx2b2lkIDAhPT1lLmRvY3VtZW50Q2hhbmdlcykmJih2b2lkIDA9PT1lLmRvY3VtZW50Q2hhbmdlc3x8ZS5kb2N1bWVudENoYW5nZXMuZXZlcnkoZnVuY3Rpb24oZSl7cmV0dXJuIGRuLnN0cmluZyhlLmtpbmQpP0xyLmlzKGUpfHxrci5pcyhlKXx8TXIuaXMoZSk6TnIuaXMoZSl9KSl9O3ZhciAkcj0oV3IucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihlLHQscil7dmFyIG4sdD12b2lkIDA9PT1yP3dyLmluc2VydChlLHQpOnhyLmlzKHIpP0VyLmluc2VydChlLHQsbj1yKToodGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKSxuPXRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKHIpLEVyLmluc2VydChlLHQsbikpO2lmKHRoaXMuZWRpdHMucHVzaCh0KSx2b2lkIDAhPT1uKXJldHVybiBufSxXci5wcm90b3R5cGUucmVwbGFjZT1mdW5jdGlvbihlLHQscil7dmFyIG4sdD12b2lkIDA9PT1yP3dyLnJlcGxhY2UoZSx0KTp4ci5pcyhyKT9Fci5yZXBsYWNlKGUsdCxuPXIpOih0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpLG49dGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UociksRXIucmVwbGFjZShlLHQsbikpO2lmKHRoaXMuZWRpdHMucHVzaCh0KSx2b2lkIDAhPT1uKXJldHVybiBufSxXci5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKGUsdCl7dmFyIHIsZT12b2lkIDA9PT10P3dyLmRlbChlKTp4ci5pcyh0KT9Fci5kZWwoZSxyPXQpOih0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpLHI9dGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UodCksRXIuZGVsKGUscikpO2lmKHRoaXMuZWRpdHMucHVzaChlKSx2b2lkIDAhPT1yKXJldHVybiByfSxXci5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3RoaXMuZWRpdHMucHVzaChlKX0sV3IucHJvdG90eXBlLmFsbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmVkaXRzfSxXci5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLmVkaXRzLnNwbGljZSgwLHRoaXMuZWRpdHMubGVuZ3RoKX0sV3IucHJvdG90eXBlLmFzc2VydENoYW5nZUFubm90YXRpb25zPWZ1bmN0aW9uKGUpe2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKCJUZXh0IGVkaXQgY2hhbmdlIGlzIG5vdCBjb25maWd1cmVkIHRvIG1hbmFnZSBjaGFuZ2UgYW5ub3RhdGlvbnMuIil9LFdyKTtmdW5jdGlvbiBXcihlLHQpe3RoaXMuZWRpdHM9ZSx0aGlzLmNoYW5nZUFubm90YXRpb25zPXR9dmFyIEhyLHpyLEpyLEdyLFhyLFpyLFFyLFlyLGVuLHRuLHJuLG5uLG9uLHNuLGFuLGxuLHVuPShobi5wcm90b3R5cGUuYWxsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25zfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoaG4ucHJvdG90eXBlLCJzaXplIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3NpemV9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksaG4ucHJvdG90eXBlLm1hbmFnZT1mdW5jdGlvbihlLHQpe3ZhciByO2lmKHhyLmlzKGUpP3I9ZToocj10aGlzLm5leHRJZCgpLHQ9ZSksdm9pZCAwIT09dGhpcy5fYW5ub3RhdGlvbnNbcl0pdGhyb3cgbmV3IEVycm9yKCJJZCAiK3IrIiBpcyBhbHJlYWR5IGluIHVzZS4iKTtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcigiTm8gYW5ub3RhdGlvbiBwcm92aWRlZCBmb3IgaWQgIityKTtyZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnNbcl09dCx0aGlzLl9zaXplKysscn0saG4ucHJvdG90eXBlLm5leHRJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb3VudGVyKyssdGhpcy5fY291bnRlci50b1N0cmluZygpfSxobik7ZnVuY3Rpb24gaG4oZSl7dGhpcy5fYW5ub3RhdGlvbnM9dm9pZCAwPT09ZT9PYmplY3QuY3JlYXRlKG51bGwpOmUsdGhpcy5fY291bnRlcj0wLHRoaXMuX3NpemU9MH1mdW5jdGlvbiBjbihyKXt2YXIgbj10aGlzO3RoaXMuX3RleHRFZGl0Q2hhbmdlcz1PYmplY3QuY3JlYXRlKG51bGwpLHZvaWQgMCE9PXI/KHRoaXMuX3dvcmtzcGFjZUVkaXQ9cikuZG9jdW1lbnRDaGFuZ2VzPyh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucz1uZXcgdW4oci5jaGFuZ2VBbm5vdGF0aW9ucyksci5jaGFuZ2VBbm5vdGF0aW9ucz10aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKSxyLmRvY3VtZW50Q2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0O05yLmlzKGUpJiYodD1uZXcgJHIoZS5lZGl0cyxuLl9jaGFuZ2VBbm5vdGF0aW9ucyksbi5fdGV4dEVkaXRDaGFuZ2VzW2UudGV4dERvY3VtZW50LnVyaV09dCl9KSk6ci5jaGFuZ2VzJiZPYmplY3Qua2V5cyhyLmNoYW5nZXMpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9bmV3ICRyKHIuY2hhbmdlc1tlXSk7bi5fdGV4dEVkaXRDaGFuZ2VzW2VdPXR9KTp0aGlzLl93b3Jrc3BhY2VFZGl0PXt9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbi5wcm90b3R5cGUsImVkaXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCksdm9pZCAwIT09dGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMmJigwPT09dGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuc2l6ZT90aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zPXZvaWQgMDp0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zPXRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpKSx0aGlzLl93b3Jrc3BhY2VFZGl0fSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLGNuLnByb3RvdHlwZS5nZXRUZXh0RWRpdENoYW5nZT1mdW5jdGlvbihlKXtpZihIci5pcyhlKSl7aWYodGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCksdm9pZCAwPT09dGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMpdGhyb3cgbmV3IEVycm9yKCJXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4iKTt2YXIgdD17dXJpOmUudXJpLHZlcnNpb246ZS52ZXJzaW9ufTtyZXR1cm4ocj10aGlzLl90ZXh0RWRpdENoYW5nZXNbdC51cmldKXx8KHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2goe3RleHREb2N1bWVudDp0LGVkaXRzOm49W119KSxyPW5ldyAkcihuLHRoaXMuX2NoYW5nZUFubm90YXRpb25zKSx0aGlzLl90ZXh0RWRpdENoYW5nZXNbdC51cmldPXIpLHJ9aWYodGhpcy5pbml0Q2hhbmdlcygpLHZvaWQgMD09PXRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyl0aHJvdyBuZXcgRXJyb3IoIldvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBub3JtYWwgdGV4dCBlZGl0IGNoYW5nZXMuIik7dmFyIHIsbjtyZXR1cm4ocj10aGlzLl90ZXh0RWRpdENoYW5nZXNbZV0pfHwodGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzW2VdPW49W10scj1uZXcgJHIobiksdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2VdPXIpLHJ9LGNuLnByb3RvdHlwZS5pbml0RG9jdW1lbnRDaGFuZ2VzPWZ1bmN0aW9uKCl7dm9pZCAwPT09dGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMmJnZvaWQgMD09PXRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyYmKHRoaXMuX2NoYW5nZUFubm90YXRpb25zPW5ldyB1bix0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcz1bXSx0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zPXRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpKX0sY24ucHJvdG90eXBlLmluaXRDaGFuZ2VzPWZ1bmN0aW9uKCl7dm9pZCAwPT09dGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMmJnZvaWQgMD09PXRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyYmKHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcz1PYmplY3QuY3JlYXRlKG51bGwpKX0sY24ucHJvdG90eXBlLmNyZWF0ZUZpbGU9ZnVuY3Rpb24oZSx0LHIpe2lmKHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpLHZvaWQgMD09PXRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzKXRocm93IG5ldyBFcnJvcigiV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuIik7dmFyIG4saTtpZihBci5pcyh0KXx8eHIuaXModCk/bj10OnI9dCxyPXZvaWQgMD09PW4/THIuY3JlYXRlKGUscik6KGk9eHIuaXMobik/bjp0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UobiksTHIuY3JlYXRlKGUscixpKSksdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChyKSx2b2lkIDAhPT1pKXJldHVybiBpfSxjbi5wcm90b3R5cGUucmVuYW1lRmlsZT1mdW5jdGlvbihlLHQscixuKXtpZih0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKSx2b2lkIDA9PT10aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyl0aHJvdyBuZXcgRXJyb3IoIldvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLiIpO3ZhciBpLG87aWYoQXIuaXMocil8fHhyLmlzKHIpP2k9cjpuPXIsbj12b2lkIDA9PT1pP2tyLmNyZWF0ZShlLHQsbik6KG89eHIuaXMoaSk/aTp0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoaSksa3IuY3JlYXRlKGUsdCxuLG8pKSx0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG4pLHZvaWQgMCE9PW8pcmV0dXJuIG99LGNuLnByb3RvdHlwZS5kZWxldGVGaWxlPWZ1bmN0aW9uKGUsdCxyKXtpZih0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKSx2b2lkIDA9PT10aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyl0aHJvdyBuZXcgRXJyb3IoIldvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLiIpO3ZhciBuLGk7aWYoQXIuaXModCl8fHhyLmlzKHQpP249dDpyPXQscj12b2lkIDA9PT1uP01yLmNyZWF0ZShlLHIpOihpPXhyLmlzKG4pP246dGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKG4pLE1yLmNyZWF0ZShlLHIsaSkpLHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gociksdm9pZCAwIT09aSlyZXR1cm4gaX0sKFFyPUhyPUhyfHx7fSkuY3JlYXRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJue3VyaTplLHZlcnNpb246dH19LFFyLmlzPWZ1bmN0aW9uKGUpe3JldHVybiBkbi5kZWZpbmVkKGUpJiZkbi5zdHJpbmcoZS51cmkpJiYobnVsbD09PWUudmVyc2lvbnx8ZG4uaW50ZWdlcihlLnZlcnNpb24pKX0sKFFyPXpyPXpyfHx7fSkuUGxhaW5UZXh0PSJwbGFpbnRleHQiLFFyLk1hcmtkb3duPSJtYXJrZG93biIsKEpyPXpyPXpyfHx7fSkuaXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT1Kci5QbGFpblRleHR8fGU9PT1Kci5NYXJrZG93bn0sKEdyfHwoR3I9e30pKS5pcz1mdW5jdGlvbihlKXt2YXIgdD1lO3JldHVybiBkbi5vYmplY3RMaXRlcmFsKGUpJiZ6ci5pcyh0LmtpbmQpJiZkbi5zdHJpbmcodC52YWx1ZSl9LChRcj1Ycj1Ycnx8e30pLlRleHQ9MSxRci5NZXRob2Q9MixRci5GdW5jdGlvbj0zLFFyLkNvbnN0cnVjdG9yPTQsUXIuRmllbGQ9NSxRci5WYXJpYWJsZT02LFFyLkNsYXNzPTcsUXIuSW50ZXJmYWNlPTgsUXIuTW9kdWxlPTksUXIuUHJvcGVydHk9MTAsUXIuVW5pdD0xMSxRci5WYWx1ZT0xMixRci5FbnVtPTEzLFFyLktleXdvcmQ9MTQsUXIuU25pcHBldD0xNSxRci5Db2xvcj0xNixRci5GaWxlPTE3LFFyLlJlZmVyZW5jZT0xOCxRci5Gb2xkZXI9MTksUXIuRW51bU1lbWJlcj0yMCxRci5Db25zdGFudD0yMSxRci5TdHJ1Y3Q9MjIsUXIuRXZlbnQ9MjMsUXIuT3BlcmF0b3I9MjQsUXIuVHlwZVBhcmFtZXRlcj0yNSwoUXI9WnI9WnJ8fHt9KS5QbGFpblRleHQ9MSxRci5TbmlwcGV0PTIsKFlyfHwoWXI9e30pKS5jcmVhdGU9ZnVuY3Rpb24oZSl7cmV0dXJue2xhYmVsOmV9fSwodG58fHt9KS5jcmVhdGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm57aXRlbXM6ZXx8W10saXNJbmNvbXBsZXRlOiEhdH19LCh0bj1lbj1lbnx8e30pLmZyb21QbGFpblRleHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvW1xcYCpfe31bXF0oKSMrXC0uIV0vZywiXFwkJiIpfSx0bi5pcz1mdW5jdGlvbihlKXtyZXR1cm4gZG4uc3RyaW5nKGUpfHxkbi5vYmplY3RMaXRlcmFsKGUpJiZkbi5zdHJpbmcoZS5sYW5ndWFnZSkmJmRuLnN0cmluZyhlLnZhbHVlKX0sKHJufHx7fSkuaXM9ZnVuY3Rpb24oZSl7dmFyIHQ9ZTtyZXR1cm4hIXQmJmRuLm9iamVjdExpdGVyYWwodCkmJihHci5pcyh0LmNvbnRlbnRzKXx8ZW4uaXModC5jb250ZW50cyl8fGRuLnR5cGVkQXJyYXkodC5jb250ZW50cyxlbi5pcykpJiYodm9pZCAwPT09ZS5yYW5nZXx8bXIuaXMoZS5yYW5nZSkpfSwobm58fHt9KS5jcmVhdGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD97bGFiZWw6ZSxkb2N1bWVudGF0aW9uOnR9OntsYWJlbDplfX0sKG9ufHx7fSkuY3JlYXRlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPVtdLG49MjtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXJbbi0yXT1hcmd1bWVudHNbbl07cmV0dXJuIGU9e2xhYmVsOmV9LGRuLmRlZmluZWQodCkmJihlLmRvY3VtZW50YXRpb249dCksZG4uZGVmaW5lZChyKT9lLnBhcmFtZXRlcnM9cjplLnBhcmFtZXRlcnM9W10sZX0sKE5ufHx7fSkuY3JlYXRlPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9e3JhbmdlOmV9LGRuLm51bWJlcih0KSYmKGUua2luZD10KSxlfSwoTm49c249c258fHt9KS5GaWxlPTEsTm4uTW9kdWxlPTIsTm4uTmFtZXNwYWNlPTMsTm4uUGFja2FnZT00LE5uLkNsYXNzPTUsTm4uTWV0aG9kPTYsTm4uUHJvcGVydHk9NyxObi5GaWVsZD04LE5uLkNvbnN0cnVjdG9yPTksTm4uRW51bT0xMCxObi5JbnRlcmZhY2U9MTEsTm4uRnVuY3Rpb249MTIsTm4uVmFyaWFibGU9MTMsTm4uQ29uc3RhbnQ9MTQsTm4uU3RyaW5nPTE1LE5uLk51bWJlcj0xNixObi5Cb29sZWFuPTE3LE5uLkFycmF5PTE4LE5uLk9iamVjdD0xOSxObi5LZXk9MjAsTm4uTnVsbD0yMSxObi5FbnVtTWVtYmVyPTIyLE5uLlN0cnVjdD0yMyxObi5FdmVudD0yNCxObi5PcGVyYXRvcj0yNSxObi5UeXBlUGFyYW1ldGVyPTI2LChBbnx8e30pLmNyZWF0ZT1mdW5jdGlvbihlLHQscixuLGkpe3JldHVybiByPXtuYW1lOmUsa2luZDp0LGxvY2F0aW9uOnt1cmk6bixyYW5nZTpyfX0saSYmKHIuY29udGFpbmVyTmFtZT1pKSxyfSwobG49YW49YW58fHt9KS5jcmVhdGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm57cmFuZ2U6ZSxwYXJlbnQ6dH19LGxuLmlzPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lJiZtci5pcyhlLnJhbmdlKSYmKHZvaWQgMD09PWUucGFyZW50fHxsbi5pcyhlLnBhcmVudCkpfTt2YXIgZG4sZm47T2JqZWN0LmRlZmluZVByb3BlcnR5KG1uLnByb3RvdHlwZSwidXJpIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VyaX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkobW4ucHJvdG90eXBlLCJsYW5ndWFnZUlkIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhbmd1YWdlSWR9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KG1uLnByb3RvdHlwZSwidmVyc2lvbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl92ZXJzaW9ufSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLG1uLnByb3RvdHlwZS5nZXRUZXh0PWZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PXRoaXMub2Zmc2V0QXQoZS5zdGFydCksZT10aGlzLm9mZnNldEF0KGUuZW5kKTtyZXR1cm4gdGhpcy5fY29udGVudC5zdWJzdHJpbmcodCxlKX1yZXR1cm4gdGhpcy5fY29udGVudH0sbW4ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihlLHQpe3RoaXMuX2NvbnRlbnQ9ZS50ZXh0LHRoaXMuX3ZlcnNpb249dCx0aGlzLl9saW5lT2Zmc2V0cz12b2lkIDB9LG1uLnByb3RvdHlwZS5nZXRMaW5lT2Zmc2V0cz1mdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMuX2xpbmVPZmZzZXRzKXtmb3IodmFyIGU9W10sdD10aGlzLl9jb250ZW50LHI9ITAsbj0wO248dC5sZW5ndGg7bisrKXtyJiYoZS5wdXNoKG4pLHI9ITEpO3ZhciBpPXQuY2hhckF0KG4pLHI9IlxyIj09PWl8fCJcbiI9PT1pOyJcciI9PT1pJiZuKzE8dC5sZW5ndGgmJiJcbiI9PT10LmNoYXJBdChuKzEpJiZuKyt9ciYmMDx0Lmxlbmd0aCYmZS5wdXNoKHQubGVuZ3RoKSx0aGlzLl9saW5lT2Zmc2V0cz1lfXJldHVybiB0aGlzLl9saW5lT2Zmc2V0c30sbW4ucHJvdG90eXBlLnBvc2l0aW9uQXQ9ZnVuY3Rpb24oZSl7ZT1NYXRoLm1heChNYXRoLm1pbihlLHRoaXMuX2NvbnRlbnQubGVuZ3RoKSwwKTt2YXIgdD10aGlzLmdldExpbmVPZmZzZXRzKCkscj0wLG49dC5sZW5ndGg7aWYoMD09PW4pcmV0dXJuIGZyLmNyZWF0ZSgwLGUpO2Zvcig7cjxuOyl7dmFyIGk9TWF0aC5mbG9vcigocituKS8yKTt0W2ldPmU/bj1pOnI9aSsxfXZhciBvPXItMTtyZXR1cm4gZnIuY3JlYXRlKG8sZS10W29dKX0sbW4ucHJvdG90eXBlLm9mZnNldEF0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuZ2V0TGluZU9mZnNldHMoKTtpZihlLmxpbmU+PXQubGVuZ3RoKXJldHVybiB0aGlzLl9jb250ZW50Lmxlbmd0aDtpZihlLmxpbmU8MClyZXR1cm4gMDt2YXIgcj10W2UubGluZV0sdD1lLmxpbmUrMTx0Lmxlbmd0aD90W2UubGluZSsxXTp0aGlzLl9jb250ZW50Lmxlbmd0aDtyZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4ocitlLmNoYXJhY3Rlcix0KSxyKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KG1uLnByb3RvdHlwZSwibGluZUNvdW50Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0TGluZU9mZnNldHMoKS5sZW5ndGh9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSk7ZnVuY3Rpb24gbW4oZSx0LHIsbil7dGhpcy5fdXJpPWUsdGhpcy5fbGFuZ3VhZ2VJZD10LHRoaXMuX3ZlcnNpb249cix0aGlzLl9jb250ZW50PW4sdGhpcy5fbGluZU9mZnNldHM9dm9pZCAwfU5uPWRuPWRufHx7fSxmbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLE5uLmRlZmluZWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWV9LE5uLnVuZGVmaW5lZD1mdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZX0sTm4uYm9vbGVhbj1mdW5jdGlvbihlKXtyZXR1cm4hMD09PWV8fCExPT09ZX0sTm4uc3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IFN0cmluZ10iPT09Zm4uY2FsbChlKX0sTm4ubnVtYmVyPWZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09Zm4uY2FsbChlKX0sTm4ubnVtYmVyUmFuZ2U9ZnVuY3Rpb24oZSx0LHIpe3JldHVybiJbb2JqZWN0IE51bWJlcl0iPT09Zm4uY2FsbChlKSYmdDw9ZSYmZTw9cn0sTm4uaW50ZWdlcj1mdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PWZuLmNhbGwoZSkmJi0yMTQ3NDgzNjQ4PD1lJiZlPD0yMTQ3NDgzNjQ3fSxObi51aW50ZWdlcj1mdW5jdGlvbihlKXtyZXR1cm4iW29iamVjdCBOdW1iZXJdIj09PWZuLmNhbGwoZSkmJjA8PWUmJmU8PTIxNDc0ODM2NDd9LE5uLmZ1bmM9ZnVuY3Rpb24oZSl7cmV0dXJuIltvYmplY3QgRnVuY3Rpb25dIj09PWZuLmNhbGwoZSl9LE5uLm9iamVjdExpdGVyYWw9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9LE5uLnR5cGVkQXJyYXk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKSYmZS5ldmVyeSh0KX07dmFyIGduLHBuLHZuPShPYmplY3QuZGVmaW5lUHJvcGVydHkoeW4ucHJvdG90eXBlLCJ1cmkiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXJpfSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5bi5wcm90b3R5cGUsImxhbmd1YWdlSWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFuZ3VhZ2VJZH0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoeW4ucHJvdG90eXBlLCJ2ZXJzaW9uIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZlcnNpb259LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSkseW4ucHJvdG90eXBlLmdldFRleHQ9ZnVuY3Rpb24oZSl7aWYoZSl7dmFyIHQ9dGhpcy5vZmZzZXRBdChlLnN0YXJ0KSxlPXRoaXMub2Zmc2V0QXQoZS5lbmQpO3JldHVybiB0aGlzLl9jb250ZW50LnN1YnN0cmluZyh0LGUpfXJldHVybiB0aGlzLl9jb250ZW50fSx5bi5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPTAsbj1lO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdO2lmKHluLmlzSW5jcmVtZW50YWwoaSkpe3ZhciBvPV9uKGkucmFuZ2UpLHM9dGhpcy5vZmZzZXRBdChvLnN0YXJ0KSxhPXRoaXMub2Zmc2V0QXQoby5lbmQpO3RoaXMuX2NvbnRlbnQ9dGhpcy5fY29udGVudC5zdWJzdHJpbmcoMCxzKStpLnRleHQrdGhpcy5fY29udGVudC5zdWJzdHJpbmcoYSx0aGlzLl9jb250ZW50Lmxlbmd0aCk7dmFyIGw9TWF0aC5tYXgoby5zdGFydC5saW5lLDApLG89TWF0aC5tYXgoby5lbmQubGluZSwwKSx1PXRoaXMuX2xpbmVPZmZzZXRzLGg9Ym4oaS50ZXh0LCExLHMpO2lmKG8tbD09PWgubGVuZ3RoKWZvcih2YXIgYz0wLGQ9aC5sZW5ndGg7YzxkO2MrKyl1W2MrbCsxXT1oW2NdO2Vsc2UgaC5sZW5ndGg8MWU0P3Uuc3BsaWNlLmFwcGx5KHUsZnVuY3Rpb24oZSx0LHIpe2lmKHJ8fDI9PT1hcmd1bWVudHMubGVuZ3RoKWZvcih2YXIgbixpPTAsbz10Lmxlbmd0aDtpPG87aSsrKSFuJiZpIGluIHR8fCgobj1ufHxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LDAsaSkpW2ldPXRbaV0pO3JldHVybiBlLmNvbmNhdChufHxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KSl9KFtsKzEsby1sXSxoLCExKSk6dGhpcy5fbGluZU9mZnNldHM9dT11LnNsaWNlKDAsbCsxKS5jb25jYXQoaCx1LnNsaWNlKG8rMSkpO3ZhciBmPWkudGV4dC5sZW5ndGgtKGEtcyk7aWYoMCE9Zilmb3IoYz1sKzEraC5sZW5ndGgsZD11Lmxlbmd0aDtjPGQ7YysrKXVbY109dVtjXStmfWVsc2V7aWYoIXluLmlzRnVsbChpKSl0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY2hhbmdlIGV2ZW50IHJlY2VpdmVkIik7dGhpcy5fY29udGVudD1pLnRleHQsdGhpcy5fbGluZU9mZnNldHM9dm9pZCAwfX10aGlzLl92ZXJzaW9uPXR9LHluLnByb3RvdHlwZS5nZXRMaW5lT2Zmc2V0cz1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLl9saW5lT2Zmc2V0cyYmKHRoaXMuX2xpbmVPZmZzZXRzPWJuKHRoaXMuX2NvbnRlbnQsITApKSx0aGlzLl9saW5lT2Zmc2V0c30seW4ucHJvdG90eXBlLnBvc2l0aW9uQXQ9ZnVuY3Rpb24oZSl7ZT1NYXRoLm1heChNYXRoLm1pbihlLHRoaXMuX2NvbnRlbnQubGVuZ3RoKSwwKTt2YXIgdD10aGlzLmdldExpbmVPZmZzZXRzKCkscj0wLG49dC5sZW5ndGg7aWYoMD09PW4pcmV0dXJue2xpbmU6MCxjaGFyYWN0ZXI6ZX07Zm9yKDtyPG47KXt2YXIgaT1NYXRoLmZsb29yKChyK24pLzIpO3RbaV0+ZT9uPWk6cj1pKzF9dmFyIG89ci0xO3JldHVybntsaW5lOm8sY2hhcmFjdGVyOmUtdFtvXX19LHluLnByb3RvdHlwZS5vZmZzZXRBdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldExpbmVPZmZzZXRzKCk7aWYoZS5saW5lPj10Lmxlbmd0aClyZXR1cm4gdGhpcy5fY29udGVudC5sZW5ndGg7aWYoZS5saW5lPDApcmV0dXJuIDA7dmFyIHI9dFtlLmxpbmVdLHQ9ZS5saW5lKzE8dC5sZW5ndGg/dFtlLmxpbmUrMV06dGhpcy5fY29udGVudC5sZW5ndGg7cmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHIrZS5jaGFyYWN0ZXIsdCkscil9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh5bi5wcm90b3R5cGUsImxpbmVDb3VudCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldExpbmVPZmZzZXRzKCkubGVuZ3RofSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLHluLmlzSW5jcmVtZW50YWw9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJiJzdHJpbmciPT10eXBlb2YgZS50ZXh0JiZ2b2lkIDAhPT1lLnJhbmdlJiYodm9pZCAwPT09ZS5yYW5nZUxlbmd0aHx8Im51bWJlciI9PXR5cGVvZiBlLnJhbmdlTGVuZ3RoKX0seW4uaXNGdWxsPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiYic3RyaW5nIj09dHlwZW9mIGUudGV4dCYmdm9pZCAwPT09ZS5yYW5nZSYmdm9pZCAwPT09ZS5yYW5nZUxlbmd0aH0seW4pO2Z1bmN0aW9uIHluKGUsdCxyLG4pe3RoaXMuX3VyaT1lLHRoaXMuX2xhbmd1YWdlSWQ9dCx0aGlzLl92ZXJzaW9uPXIsdGhpcy5fY29udGVudD1uLHRoaXMuX2xpbmVPZmZzZXRzPXZvaWQgMH1mdW5jdGlvbiBibihlLHQscil7dm9pZCAwPT09ciYmKHI9MCk7Zm9yKHZhciBuPXQ/W3JdOltdLGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZS5jaGFyQ29kZUF0KGkpOzEzIT09byYmMTAhPT1vfHwoMTM9PT1vJiZpKzE8ZS5sZW5ndGgmJjEwPT09ZS5jaGFyQ29kZUF0KGkrMSkmJmkrKyxuLnB1c2gocitpKzEpKX1yZXR1cm4gbn1mdW5jdGlvbiBfbihlKXt2YXIgdD1lLnN0YXJ0LHI9ZS5lbmQ7cmV0dXJuIHQubGluZT5yLmxpbmV8fHQubGluZT09PXIubGluZSYmdC5jaGFyYWN0ZXI+ci5jaGFyYWN0ZXI/e3N0YXJ0OnIsZW5kOnR9OmV9ZnVuY3Rpb24gQ24oZSl7dmFyIHQ9X24oZS5yYW5nZSk7cmV0dXJuIHQhPT1lLnJhbmdlP3tuZXdUZXh0OmUubmV3VGV4dCxyYW5nZTp0fTplfWZ1bmN0aW9uIFNuKGUsdCwuLi5yKXtyZXR1cm4gZnVuY3Rpb24oZSxyKXtsZXQgdDtyZXR1cm4gdD0wPT09ci5sZW5ndGg/ZTplLnJlcGxhY2UoL1x7KFxkKylcfS9nLChlLHQpPT57dD10WzBdO3JldHVybiB2b2lkIDAhPT1yW3RdP3JbdF06ZX0pLHR9KHQscil9KEFuPWduPWdufHx7fSkuY3JlYXRlPWZ1bmN0aW9uKGUsdCxyLG4pe3JldHVybiBuZXcgdm4oZSx0LHIsbil9LEFuLnVwZGF0ZT1mdW5jdGlvbihlLHQscil7aWYoZSBpbnN0YW5jZW9mIHZuKXJldHVybiBlLnVwZGF0ZSh0LHIpLGU7dGhyb3cgbmV3IEVycm9yKCJUZXh0RG9jdW1lbnQudXBkYXRlOiBkb2N1bWVudCBtdXN0IGJlIGNyZWF0ZWQgYnkgVGV4dERvY3VtZW50LmNyZWF0ZSIpfSxBbi5hcHBseUVkaXRzPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByPWUuZ2V0VGV4dCgpLG49MCxpPVtdLG89MCxzPWZ1bmN0aW9uIGUodCxyKXtpZih0Lmxlbmd0aDw9MSlyZXR1cm4gdDt2YXIgbj10Lmxlbmd0aC8yfDA7dmFyIGk9dC5zbGljZSgwLG4pO3ZhciBvPXQuc2xpY2Uobik7ZShpLHIpO2UobyxyKTt2YXIgcz0wO3ZhciBhPTA7dmFyIGw9MDtmb3IoO3M8aS5sZW5ndGgmJmE8by5sZW5ndGg7KXt2YXIgdT1yKGlbc10sb1thXSk7dFtsKytdPXU8PTA/aVtzKytdOm9bYSsrXX1mb3IoO3M8aS5sZW5ndGg7KXRbbCsrXT1pW3MrK107Zm9yKDthPG8ubGVuZ3RoOyl0W2wrK109b1thKytdO3JldHVybiB0fSh0Lm1hcChDbiksZnVuY3Rpb24oZSx0KXt2YXIgcj1lLnJhbmdlLnN0YXJ0LmxpbmUtdC5yYW5nZS5zdGFydC5saW5lO3JldHVybiAwPT1yP2UucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyLXQucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyOnJ9KTtvPHMubGVuZ3RoO28rKyl7dmFyIGE9c1tvXSxsPWUub2Zmc2V0QXQoYS5yYW5nZS5zdGFydCk7aWYobDxuKXRocm93IG5ldyBFcnJvcigiT3ZlcmxhcHBpbmcgZWRpdCIpO248bCYmaS5wdXNoKHIuc3Vic3RyaW5nKG4sbCkpLGEubmV3VGV4dC5sZW5ndGgmJmkucHVzaChhLm5ld1RleHQpLG49ZS5vZmZzZXRBdChhLnJhbmdlLmVuZCl9cmV0dXJuIGkucHVzaChyLnN1YnN0cihuKSksaS5qb2luKCIiKX0sKE5uPXBuPXBufHx7fSlbTm4uVW5kZWZpbmVkPTBdPSJVbmRlZmluZWQiLE5uW05uLkVudW1WYWx1ZU1pc21hdGNoPTFdPSJFbnVtVmFsdWVNaXNtYXRjaCIsTm5bTm4uRGVwcmVjYXRlZD0yXT0iRGVwcmVjYXRlZCIsTm5bTm4uVW5leHBlY3RlZEVuZE9mQ29tbWVudD0yNTddPSJVbmV4cGVjdGVkRW5kT2ZDb21tZW50IixObltObi5VbmV4cGVjdGVkRW5kT2ZTdHJpbmc9MjU4XT0iVW5leHBlY3RlZEVuZE9mU3RyaW5nIixObltObi5VbmV4cGVjdGVkRW5kT2ZOdW1iZXI9MjU5XT0iVW5leHBlY3RlZEVuZE9mTnVtYmVyIixObltObi5JbnZhbGlkVW5pY29kZT0yNjBdPSJJbnZhbGlkVW5pY29kZSIsTm5bTm4uSW52YWxpZEVzY2FwZUNoYXJhY3Rlcj0yNjFdPSJJbnZhbGlkRXNjYXBlQ2hhcmFjdGVyIixObltObi5JbnZhbGlkQ2hhcmFjdGVyPTI2Ml09IkludmFsaWRDaGFyYWN0ZXIiLE5uW05uLlByb3BlcnR5RXhwZWN0ZWQ9NTEzXT0iUHJvcGVydHlFeHBlY3RlZCIsTm5bTm4uQ29tbWFFeHBlY3RlZD01MTRdPSJDb21tYUV4cGVjdGVkIixObltObi5Db2xvbkV4cGVjdGVkPTUxNV09IkNvbG9uRXhwZWN0ZWQiLE5uW05uLlZhbHVlRXhwZWN0ZWQ9NTE2XT0iVmFsdWVFeHBlY3RlZCIsTm5bTm4uQ29tbWFPckNsb3NlQmFja2V0RXhwZWN0ZWQ9NTE3XT0iQ29tbWFPckNsb3NlQmFja2V0RXhwZWN0ZWQiLE5uW05uLkNvbW1hT3JDbG9zZUJyYWNlRXhwZWN0ZWQ9NTE4XT0iQ29tbWFPckNsb3NlQnJhY2VFeHBlY3RlZCIsTm5bTm4uVHJhaWxpbmdDb21tYT01MTldPSJUcmFpbGluZ0NvbW1hIixObltObi5EdXBsaWNhdGVLZXk9NTIwXT0iRHVwbGljYXRlS2V5IixObltObi5Db21tZW50Tm90UGVybWl0dGVkPTUyMV09IkNvbW1lbnROb3RQZXJtaXR0ZWQiLE5uW05uLlNjaGVtYVJlc29sdmVFcnJvcj03NjhdPSJTY2hlbWFSZXNvbHZlRXJyb3IiLHpyLk1hcmtkb3duLHpyLlBsYWluVGV4dDt2YXIgd24sQW49KHduPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKHduPU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbihlLHQpe2UuX19wcm90b19fPXR9fHxmdW5jdGlvbihlLHQpe2Zvcih2YXIgciBpbiB0KU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LHIpJiYoZVtyXT10W3JdKX0pKGUsdCl9LGZ1bmN0aW9uKGUsdCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQmJm51bGwhPT10KXRocm93IG5ldyBUeXBlRXJyb3IoIkNsYXNzIGV4dGVuZHMgdmFsdWUgIitTdHJpbmcodCkrIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsIik7ZnVuY3Rpb24gcigpe3RoaXMuY29uc3RydWN0b3I9ZX13bihlLHQpLGUucHJvdG90eXBlPW51bGw9PT10P09iamVjdC5jcmVhdGUodCk6KHIucHJvdG90eXBlPXQucHJvdG90eXBlLG5ldyByKX0pLHhuPVNuLEVuPXsiY29sb3ItaGV4Ijp7ZXJyb3JNZXNzYWdlOnhuKCJjb2xvckhleEZvcm1hdFdhcm5pbmciLCJJbnZhbGlkIGNvbG9yIGZvcm1hdC4gVXNlICNSR0IsICNSR0JBLCAjUlJHR0JCIG9yICNSUkdHQkJBQS4iKSxwYXR0ZXJuOi9eIyhbMC05QS1GYS1mXXszLDR9fChbMC05QS1GYS1mXXsyfSl7Myw0fSkkL30sImRhdGUtdGltZSI6e2Vycm9yTWVzc2FnZTp4bigiZGF0ZVRpbWVGb3JtYXRXYXJuaW5nIiwiU3RyaW5nIGlzIG5vdCBhIFJGQzMzMzkgZGF0ZS10aW1lLiIpLHBhdHRlcm46L14oXGR7NH0pLSgwWzEtOV18MVswLTJdKS0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSlUKFswMV1bMC05XXwyWzAtM10pOihbMC01XVswLTldKTooWzAtNV1bMC05XXw2MCkoXC5bMC05XSspPyhafChcK3wtKShbMDFdWzAtOV18MlswLTNdKTooWzAtNV1bMC05XSkpJC9pfSxkYXRlOntlcnJvck1lc3NhZ2U6eG4oImRhdGVGb3JtYXRXYXJuaW5nIiwiU3RyaW5nIGlzIG5vdCBhIFJGQzMzMzkgZGF0ZS4iKSxwYXR0ZXJuOi9eKFxkezR9KS0oMFsxLTldfDFbMC0yXSktKDBbMS05XXxbMTJdWzAtOV18M1swMV0pJC9pfSx0aW1lOntlcnJvck1lc3NhZ2U6eG4oInRpbWVGb3JtYXRXYXJuaW5nIiwiU3RyaW5nIGlzIG5vdCBhIFJGQzMzMzkgdGltZS4iKSxwYXR0ZXJuOi9eKFswMV1bMC05XXwyWzAtM10pOihbMC01XVswLTldKTooWzAtNV1bMC05XXw2MCkoXC5bMC05XSspPyhafChcK3wtKShbMDFdWzAtOV18MlswLTNdKTooWzAtNV1bMC05XSkpJC9pfSxlbWFpbDp7ZXJyb3JNZXNzYWdlOnhuKCJlbWFpbEZvcm1hdFdhcm5pbmciLCJTdHJpbmcgaXMgbm90IGFuIGUtbWFpbCBhZGRyZXNzLiIpLHBhdHRlcm46L14oKFtePD4oKVxbXF1cXC4sOzpcc0AiXSsoXC5bXjw+KClcW1xdXFwuLDs6XHNAIl0rKSopfCgiLisiKSlAKChcW1swLTldezEsM31cLlswLTldezEsM31cLlswLTldezEsM31cLlswLTldezEsM31dKXwoKFthLXpBLVpcLTAtOV0rXC4pK1thLXpBLVpdezIsfSkpJC99fSxObj0oT2JqZWN0LmRlZmluZVByb3BlcnR5KExuLnByb3RvdHlwZSwiY2hpbGRyZW4iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxMbi5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4idHlwZTogIit0aGlzLnR5cGUrIiAoIit0aGlzLm9mZnNldCsiLyIrdGhpcy5sZW5ndGgrIikiKyh0aGlzLnBhcmVudD8iIHBhcmVudDogeyIrdGhpcy5wYXJlbnQudG9TdHJpbmcoKSsifSI6IiIpfSxMbik7ZnVuY3Rpb24gTG4oZSx0LHIpe3ZvaWQgMD09PXImJihyPTApLHRoaXMub2Zmc2V0PXQsdGhpcy5sZW5ndGg9cix0aGlzLnBhcmVudD1lfXZhciBrbixNbj0oQW4oVG4sa249Tm4pLFRuKTtmdW5jdGlvbiBUbihlLHQpe3Q9a24uY2FsbCh0aGlzLGUsdCl8fHRoaXM7cmV0dXJuIHQudHlwZT0ibnVsbCIsdC52YWx1ZT1udWxsLHR9dmFyIE9uLEluPShBbihQbixPbj1ObiksUG4pO2Z1bmN0aW9uIFBuKGUsdCxyKXtyPU9uLmNhbGwodGhpcyxlLHIpfHx0aGlzO3JldHVybiByLnR5cGU9ImJvb2xlYW4iLHIudmFsdWU9dCxyfXZhciBWbixSbj0oQW4oRG4sVm49Tm4pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEbi5wcm90b3R5cGUsImNoaWxkcmVuIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlbXN9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksRG4pO2Z1bmN0aW9uIERuKGUsdCl7dD1Wbi5jYWxsKHRoaXMsZSx0KXx8dGhpcztyZXR1cm4gdC50eXBlPSJhcnJheSIsdC5pdGVtcz1bXSx0fXZhciBGbixLbj0oQW4oam4sRm49Tm4pLGpuKTtmdW5jdGlvbiBqbihlLHQpe3Q9Rm4uY2FsbCh0aGlzLGUsdCl8fHRoaXM7cmV0dXJuIHQudHlwZT0ibnVtYmVyIix0LmlzSW50ZWdlcj0hMCx0LnZhbHVlPU51bWJlci5OYU4sdH12YXIgVW4scW49KEFuKEJuLFVuPU5uKSxCbik7ZnVuY3Rpb24gQm4oZSx0LHIpe3I9VW4uY2FsbCh0aGlzLGUsdCxyKXx8dGhpcztyZXR1cm4gci50eXBlPSJzdHJpbmciLHIudmFsdWU9IiIscn12YXIgJG4sV249KEFuKEhuLCRuPU5uKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoSG4ucHJvdG90eXBlLCJjaGlsZHJlbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlTm9kZT9bdGhpcy5rZXlOb2RlLHRoaXMudmFsdWVOb2RlXTpbdGhpcy5rZXlOb2RlXX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxIbik7ZnVuY3Rpb24gSG4oZSx0LHIpe3Q9JG4uY2FsbCh0aGlzLGUsdCl8fHRoaXM7cmV0dXJuIHQudHlwZT0icHJvcGVydHkiLHQuY29sb25PZmZzZXQ9LTEsdC5rZXlOb2RlPXIsdH12YXIgem4sSm49KEFuKEduLHpuPU5uKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoR24ucHJvdG90eXBlLCJjaGlsZHJlbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3BlcnRpZXN9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksR24pO2Z1bmN0aW9uIEduKGUsdCl7dD16bi5jYWxsKHRoaXMsZSx0KXx8dGhpcztyZXR1cm4gdC50eXBlPSJvYmplY3QiLHQucHJvcGVydGllcz1bXSx0fWZ1bmN0aW9uIFhuKGUpe3JldHVybiBqcihlKT9lP3t9Ontub3Q6e319OmV9dmFyIFpuPShRbi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3RoaXMuc2NoZW1hcy5wdXNoKGUpfSxRbi5wcm90b3R5cGUubWVyZ2U9ZnVuY3Rpb24oZSl7QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcy5zY2hlbWFzLGUuc2NoZW1hcyl9LFFuLnByb3RvdHlwZS5pbmNsdWRlPWZ1bmN0aW9uKGUpe3JldHVybigtMT09PXRoaXMuZm9jdXNPZmZzZXR8fG9pKGUsdGhpcy5mb2N1c09mZnNldCkpJiZlIT09dGhpcy5leGNsdWRlfSxRbi5wcm90b3R5cGUubmV3U3ViPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBRbigtMSx0aGlzLmV4Y2x1ZGUpfSxRbik7ZnVuY3Rpb24gUW4oZSx0KXt0aGlzLmZvY3VzT2Zmc2V0PWU9dm9pZCAwPT09ZT8tMTplLHRoaXMuZXhjbHVkZT10LHRoaXMuc2NoZW1hcz1bXX12YXIgWW49KE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlaS5wcm90b3R5cGUsInNjaGVtYXMiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxlaS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe30sZWkucHJvdG90eXBlLm1lcmdlPWZ1bmN0aW9uKGUpe30sZWkucHJvdG90eXBlLmluY2x1ZGU9ZnVuY3Rpb24oZSl7cmV0dXJuITB9LGVpLnByb3RvdHlwZS5uZXdTdWI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZWkuaW5zdGFuY2U9bmV3IGVpLGVpKTtmdW5jdGlvbiBlaSgpe312YXIgdGk9KHJpLnByb3RvdHlwZS5oYXNQcm9ibGVtcz1mdW5jdGlvbigpe3JldHVybiEhdGhpcy5wcm9ibGVtcy5sZW5ndGh9LHJpLnByb3RvdHlwZS5tZXJnZUFsbD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxyPWU7dDxyLmxlbmd0aDt0Kyspe3ZhciBuPXJbdF07dGhpcy5tZXJnZShuKX19LHJpLnByb3RvdHlwZS5tZXJnZT1mdW5jdGlvbihlKXt0aGlzLnByb2JsZW1zPXRoaXMucHJvYmxlbXMuY29uY2F0KGUucHJvYmxlbXMpfSxyaS5wcm90b3R5cGUubWVyZ2VFbnVtVmFsdWVzPWZ1bmN0aW9uKGUpe2lmKCF0aGlzLmVudW1WYWx1ZU1hdGNoJiYhZS5lbnVtVmFsdWVNYXRjaCYmdGhpcy5lbnVtVmFsdWVzJiZlLmVudW1WYWx1ZXMpe3RoaXMuZW51bVZhbHVlcz10aGlzLmVudW1WYWx1ZXMuY29uY2F0KGUuZW51bVZhbHVlcyk7Zm9yKHZhciB0PTAscj10aGlzLnByb2JsZW1zO3Q8ci5sZW5ndGg7dCsrKXt2YXIgbj1yW3RdO24uY29kZT09PXBuLkVudW1WYWx1ZU1pc21hdGNoJiYobi5tZXNzYWdlPXhuKCJlbnVtV2FybmluZyIsIlZhbHVlIGlzIG5vdCBhY2NlcHRlZC4gVmFsaWQgdmFsdWVzOiB7MH0uIix0aGlzLmVudW1WYWx1ZXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBKU09OLnN0cmluZ2lmeShlKX0pLmpvaW4oIiwgIikpKX19fSxyaS5wcm90b3R5cGUubWVyZ2VQcm9wZXJ0eU1hdGNoPWZ1bmN0aW9uKGUpe3RoaXMubWVyZ2UoZSksdGhpcy5wcm9wZXJ0aWVzTWF0Y2hlcysrLChlLmVudW1WYWx1ZU1hdGNofHwhZS5oYXNQcm9ibGVtcygpJiZlLnByb3BlcnRpZXNNYXRjaGVzKSYmdGhpcy5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzKyssZS5lbnVtVmFsdWVNYXRjaCYmZS5lbnVtVmFsdWVzJiYxPT09ZS5lbnVtVmFsdWVzLmxlbmd0aCYmdGhpcy5wcmltYXJ5VmFsdWVNYXRjaGVzKyt9LHJpLnByb3RvdHlwZS5jb21wYXJlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuaGFzUHJvYmxlbXMoKTtyZXR1cm4gdCE9PWUuaGFzUHJvYmxlbXMoKT90Py0xOjE6dGhpcy5lbnVtVmFsdWVNYXRjaCE9PWUuZW51bVZhbHVlTWF0Y2g/ZS5lbnVtVmFsdWVNYXRjaD8tMToxOnRoaXMucHJpbWFyeVZhbHVlTWF0Y2hlcyE9PWUucHJpbWFyeVZhbHVlTWF0Y2hlcz90aGlzLnByaW1hcnlWYWx1ZU1hdGNoZXMtZS5wcmltYXJ5VmFsdWVNYXRjaGVzOnRoaXMucHJvcGVydGllc1ZhbHVlTWF0Y2hlcyE9PWUucHJvcGVydGllc1ZhbHVlTWF0Y2hlcz90aGlzLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMtZS5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzOnRoaXMucHJvcGVydGllc01hdGNoZXMtZS5wcm9wZXJ0aWVzTWF0Y2hlc30scmkpO2Z1bmN0aW9uIHJpKCl7dGhpcy5wcm9ibGVtcz1bXSx0aGlzLnByb3BlcnRpZXNNYXRjaGVzPTAsdGhpcy5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzPTAsdGhpcy5wcmltYXJ5VmFsdWVNYXRjaGVzPTAsdGhpcy5lbnVtVmFsdWVNYXRjaD0hMSx0aGlzLmVudW1WYWx1ZXM9dm9pZCAwfWZ1bmN0aW9uIG5pKGUpe3JldHVybiBScihlKX1mdW5jdGlvbiBpaShlKXtyZXR1cm4gVnIoZSl9ZnVuY3Rpb24gb2koZSx0LHIpe3JldHVybiB2b2lkIDA9PT1yJiYocj0hMSksdD49ZS5vZmZzZXQmJnQ8ZS5vZmZzZXQrZS5sZW5ndGh8fHImJnQ9PT1lLm9mZnNldCtlLmxlbmd0aH12YXIgc2k9KGFpLnByb3RvdHlwZS5nZXROb2RlRnJvbU9mZnNldD1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMD09PXQmJih0PSExKSx0aGlzLnJvb3QpcmV0dXJuIFByKHRoaXMucm9vdCxlLHQpfSxhaS5wcm90b3R5cGUudmlzaXQ9ZnVuY3Rpb24oaSl7dmFyIG87dGhpcy5yb290JiYobz1mdW5jdGlvbihlKXt2YXIgdD1pKGUpLHI9ZS5jaGlsZHJlbjtpZihBcnJheS5pc0FycmF5KHIpKWZvcih2YXIgbj0wO248ci5sZW5ndGgmJnQ7bisrKXQ9byhyW25dKTtyZXR1cm4gdH0pKHRoaXMucm9vdCl9LGFpLnByb3RvdHlwZS52YWxpZGF0ZT1mdW5jdGlvbihyLGUsbil7aWYodm9pZCAwPT09biYmKG49YnIuV2FybmluZyksdGhpcy5yb290JiZlKXt2YXIgdD1uZXcgdGk7cmV0dXJuIGxpKHRoaXMucm9vdCxlLHQsWW4uaW5zdGFuY2UpLHQucHJvYmxlbXMubWFwKGZ1bmN0aW9uKGUpe3ZhciB0PW1yLmNyZWF0ZShyLnBvc2l0aW9uQXQoZS5sb2NhdGlvbi5vZmZzZXQpLHIucG9zaXRpb25BdChlLmxvY2F0aW9uLm9mZnNldCtlLmxvY2F0aW9uLmxlbmd0aCkpO3JldHVybiBDci5jcmVhdGUodCxlLm1lc3NhZ2UsbnVsbCE9PSh0PWUuc2V2ZXJpdHkpJiZ2b2lkIDAhPT10P3Q6bixlLmNvZGUpfSl9fSxhaS5wcm90b3R5cGUuZ2V0TWF0Y2hpbmdTY2hlbWFzPWZ1bmN0aW9uKGUsdCxyKXtyPW5ldyBabih0PXZvaWQgMD09PXQ/LTE6dCxyKTtyZXR1cm4gdGhpcy5yb290JiZlJiZsaSh0aGlzLnJvb3QsZSxuZXcgdGksciksci5zY2hlbWFzfSxhaSk7ZnVuY3Rpb24gYWkoZSx0LHIpe3ZvaWQgMD09PXQmJih0PVtdKSx2b2lkIDA9PT1yJiYocj1bXSksdGhpcy5yb290PWUsdGhpcy5zeW50YXhFcnJvcnM9dCx0aGlzLmNvbW1lbnRzPXJ9ZnVuY3Rpb24gbGkoZSx2LHksYil7aWYoZSYmYi5pbmNsdWRlKGUpKXt2YXIgXz1lO3N3aXRjaChfLnR5cGUpe2Nhc2Uib2JqZWN0IjohZnVuY3Rpb24oZSx0LHIsbil7Zm9yKHZhciBpPU9iamVjdC5jcmVhdGUobnVsbCksbz1bXSxzPTAsYT1lLnByb3BlcnRpZXM7czxhLmxlbmd0aDtzKyspe3ZhciBsPShMPWFbc10pLmtleU5vZGUudmFsdWU7aVtsXT1MLnZhbHVlTm9kZSxvLnB1c2gobCl9aWYoQXJyYXkuaXNBcnJheSh0LnJlcXVpcmVkKSlmb3IodmFyIHU9MCxoPXQucmVxdWlyZWQ7dTxoLmxlbmd0aDt1Kyspe3ZhciBjLGQ9aFt1XTtpW2RdfHwoYz1lLnBhcmVudCYmInByb3BlcnR5Ij09PWUucGFyZW50LnR5cGUmJmUucGFyZW50LmtleU5vZGUsYz1jP3tvZmZzZXQ6Yy5vZmZzZXQsbGVuZ3RoOmMubGVuZ3RofTp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDoxfSxyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOmMsbWVzc2FnZTp4bigiTWlzc2luZ1JlcXVpcmVkUHJvcFdhcm5pbmciLCdNaXNzaW5nIHByb3BlcnR5ICJ7MH0iLicsZCl9KSl9ZnVuY3Rpb24gZihlKXtmb3IodmFyIHQ9by5pbmRleE9mKGUpOzA8PXQ7KW8uc3BsaWNlKHQsMSksdD1vLmluZGV4T2YoZSl9aWYodC5wcm9wZXJ0aWVzKWZvcih2YXIgbT0wLGc9T2JqZWN0LmtleXModC5wcm9wZXJ0aWVzKTttPGcubGVuZ3RoO20rKyl7ZD1nW21dO2YoZCk7dmFyIHA9dC5wcm9wZXJ0aWVzW2RdOyhOPWlbZF0pJiYoanIocCk/cD8oci5wcm9wZXJ0aWVzTWF0Y2hlcysrLHIucHJvcGVydGllc1ZhbHVlTWF0Y2hlcysrKTooTD1OLnBhcmVudCxyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6TC5rZXlOb2RlLm9mZnNldCxsZW5ndGg6TC5rZXlOb2RlLmxlbmd0aH0sbWVzc2FnZTp0LmVycm9yTWVzc2FnZXx8eG4oIkRpc2FsbG93ZWRFeHRyYVByb3BXYXJuaW5nIiwiUHJvcGVydHkgezB9IGlzIG5vdCBhbGxvd2VkLiIsZCl9KSk6KFQ9bmV3IHRpLGxpKE4scCxULG4pLHIubWVyZ2VQcm9wZXJ0eU1hdGNoKFQpKSl9aWYodC5wYXR0ZXJuUHJvcGVydGllcylmb3IodmFyIHY9MCx5PU9iamVjdC5rZXlzKHQucGF0dGVyblByb3BlcnRpZXMpO3Y8eS5sZW5ndGg7disrKWZvcih2YXIgYj15W3ZdLF89QnIoYiksQz0wLFM9by5zbGljZSgwKTtDPFMubGVuZ3RoO0MrKyl7ZD1TW0NdO251bGwhPV8mJl8udGVzdChkKSYmKGYoZCksKE49aVtkXSkmJihqcihwPXQucGF0dGVyblByb3BlcnRpZXNbYl0pP3A/KHIucHJvcGVydGllc01hdGNoZXMrKyxyLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMrKyk6KEw9Ti5wYXJlbnQsci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0Okwua2V5Tm9kZS5vZmZzZXQsbGVuZ3RoOkwua2V5Tm9kZS5sZW5ndGh9LG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fHhuKCJEaXNhbGxvd2VkRXh0cmFQcm9wV2FybmluZyIsIlByb3BlcnR5IHswfSBpcyBub3QgYWxsb3dlZC4iLGQpfSkpOihUPW5ldyB0aSxsaShOLHAsVCxuKSxyLm1lcmdlUHJvcGVydHlNYXRjaChUKSkpKX1pZigib2JqZWN0Ij09dHlwZW9mIHQuYWRkaXRpb25hbFByb3BlcnRpZXMpZm9yKHZhciB3PTAsQT1vO3c8QS5sZW5ndGg7dysrKXtkPUFbd107KE49aVtkXSkmJihUPW5ldyB0aSxsaShOLHQuYWRkaXRpb25hbFByb3BlcnRpZXMsVCxuKSxyLm1lcmdlUHJvcGVydHlNYXRjaChUKSl9ZWxzZSBpZighMT09PXQuYWRkaXRpb25hbFByb3BlcnRpZXMmJjA8by5sZW5ndGgpZm9yKHZhciB4PTAsRT1vO3g8RS5sZW5ndGg7eCsrKXt2YXIgTixMLGQ9RVt4XTsoTj1pW2RdKSYmKEw9Ti5wYXJlbnQsci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0Okwua2V5Tm9kZS5vZmZzZXQsbGVuZ3RoOkwua2V5Tm9kZS5sZW5ndGh9LG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fHhuKCJEaXNhbGxvd2VkRXh0cmFQcm9wV2FybmluZyIsIlByb3BlcnR5IHswfSBpcyBub3QgYWxsb3dlZC4iLGQpfSkpfUZyKHQubWF4UHJvcGVydGllcykmJmUucHJvcGVydGllcy5sZW5ndGg+dC5tYXhQcm9wZXJ0aWVzJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxtZXNzYWdlOnhuKCJNYXhQcm9wV2FybmluZyIsIk9iamVjdCBoYXMgbW9yZSBwcm9wZXJ0aWVzIHRoYW4gbGltaXQgb2YgezB9LiIsdC5tYXhQcm9wZXJ0aWVzKX0pO0ZyKHQubWluUHJvcGVydGllcykmJmUucHJvcGVydGllcy5sZW5ndGg8dC5taW5Qcm9wZXJ0aWVzJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxtZXNzYWdlOnhuKCJNaW5Qcm9wV2FybmluZyIsIk9iamVjdCBoYXMgZmV3ZXIgcHJvcGVydGllcyB0aGFuIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgezB9Iix0Lm1pblByb3BlcnRpZXMpfSk7aWYodC5kZXBlbmRlbmNpZXMpZm9yKHZhciBrPTAsTT1PYmplY3Qua2V5cyh0LmRlcGVuZGVuY2llcyk7azxNLmxlbmd0aDtrKyspe2w9TVtrXTtpZihpW2xdKXt2YXIgVCxPPXQuZGVwZW5kZW5jaWVzW2xdO2lmKEFycmF5LmlzQXJyYXkoTykpZm9yKHZhciBJPTAsUD1PO0k8UC5sZW5ndGg7SSsrKXt2YXIgVj1QW0ldO2lbVl0/ci5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzKys6ci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDplLmxlbmd0aH0sbWVzc2FnZTp4bigiUmVxdWlyZWREZXBlbmRlbnRQcm9wV2FybmluZyIsIk9iamVjdCBpcyBtaXNzaW5nIHByb3BlcnR5IHswfSByZXF1aXJlZCBieSBwcm9wZXJ0eSB7MX0uIixWLGwpfSl9ZWxzZShwPVhuKE8pKSYmKFQ9bmV3IHRpLGxpKGUscCxULG4pLHIubWVyZ2VQcm9wZXJ0eU1hdGNoKFQpKX19dmFyIFI9WG4odC5wcm9wZXJ0eU5hbWVzKTtpZihSKWZvcih2YXIgRD0wLEY9ZS5wcm9wZXJ0aWVzO0Q8Ri5sZW5ndGg7RCsrKXt2YXIgSz1GW0RdOyhsPUsua2V5Tm9kZSkmJmxpKGwsUixyLFluLmluc3RhbmNlKX19KF8sdix5LGIpO2JyZWFrO2Nhc2UiYXJyYXkiOiFmdW5jdGlvbihlLHQscixuKXtpZihBcnJheS5pc0FycmF5KHQuaXRlbXMpKXtmb3IodmFyIGk9dC5pdGVtcyxvPTA7bzxpLmxlbmd0aDtvKyspe3ZhciBzPVhuKGlbb10pLGE9bmV3IHRpOyhkPWUuaXRlbXNbb10pPyhsaShkLHMsYSxuKSxyLm1lcmdlUHJvcGVydHlNYXRjaChhKSk6ZS5pdGVtcy5sZW5ndGg+PWkubGVuZ3RoJiZyLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMrK31pZihlLml0ZW1zLmxlbmd0aD5pLmxlbmd0aClpZigib2JqZWN0Ij09dHlwZW9mIHQuYWRkaXRpb25hbEl0ZW1zKWZvcih2YXIgbD1pLmxlbmd0aDtsPGUuaXRlbXMubGVuZ3RoO2wrKyl7YT1uZXcgdGk7bGkoZS5pdGVtc1tsXSx0LmFkZGl0aW9uYWxJdGVtcyxhLG4pLHIubWVyZ2VQcm9wZXJ0eU1hdGNoKGEpfWVsc2UhMT09PXQuYWRkaXRpb25hbEl0ZW1zJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxtZXNzYWdlOnhuKCJhZGRpdGlvbmFsSXRlbXNXYXJuaW5nIiwiQXJyYXkgaGFzIHRvbyBtYW55IGl0ZW1zIGFjY29yZGluZyB0byBzY2hlbWEuIEV4cGVjdGVkIHswfSBvciBmZXdlci4iLGkubGVuZ3RoKX0pfWVsc2V7dmFyIHU9WG4odC5pdGVtcyk7aWYodSlmb3IodmFyIGg9MCxjPWUuaXRlbXM7aDxjLmxlbmd0aDtoKyspe3ZhciBkPWNbaF0sYT1uZXcgdGk7bGkoZCx1LGEsbiksci5tZXJnZVByb3BlcnR5TWF0Y2goYSl9fXZhciBmPVhuKHQuY29udGFpbnMpO2YmJihlLml0ZW1zLnNvbWUoZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IHRpO3JldHVybiBsaShlLGYsdCxZbi5pbnN0YW5jZSksIXQuaGFzUHJvYmxlbXMoKX0pfHxyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHx4bigicmVxdWlyZWRJdGVtTWlzc2luZ1dhcm5pbmciLCJBcnJheSBkb2VzIG5vdCBjb250YWluIHJlcXVpcmVkIGl0ZW0uIil9KSk7RnIodC5taW5JdGVtcykmJmUuaXRlbXMubGVuZ3RoPHQubWluSXRlbXMmJnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LG1lc3NhZ2U6eG4oIm1pbkl0ZW1zV2FybmluZyIsIkFycmF5IGhhcyB0b28gZmV3IGl0ZW1zLiBFeHBlY3RlZCB7MH0gb3IgbW9yZS4iLHQubWluSXRlbXMpfSk7RnIodC5tYXhJdGVtcykmJmUuaXRlbXMubGVuZ3RoPnQubWF4SXRlbXMmJnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LG1lc3NhZ2U6eG4oIm1heEl0ZW1zV2FybmluZyIsIkFycmF5IGhhcyB0b28gbWFueSBpdGVtcy4gRXhwZWN0ZWQgezB9IG9yIGZld2VyLiIsdC5tYXhJdGVtcyl9KTt7dmFyIG07ITAhPT10LnVuaXF1ZUl0ZW1zfHwobT1uaShlKSkuc29tZShmdW5jdGlvbihlLHQpe3JldHVybiB0IT09bS5sYXN0SW5kZXhPZihlKX0pJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxtZXNzYWdlOnhuKCJ1bmlxdWVJdGVtc1dhcm5pbmciLCJBcnJheSBoYXMgZHVwbGljYXRlIGl0ZW1zLiIpfSl9fShfLHYseSxiKTticmVhaztjYXNlInN0cmluZyI6IWZ1bmN0aW9uKGUsdCxyKXtGcih0Lm1pbkxlbmd0aCkmJmUudmFsdWUubGVuZ3RoPHQubWluTGVuZ3RoJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxtZXNzYWdlOnhuKCJtaW5MZW5ndGhXYXJuaW5nIiwiU3RyaW5nIGlzIHNob3J0ZXIgdGhhbiB0aGUgbWluaW11bSBsZW5ndGggb2YgezB9LiIsdC5taW5MZW5ndGgpfSk7RnIodC5tYXhMZW5ndGgpJiZlLnZhbHVlLmxlbmd0aD50Lm1heExlbmd0aCYmci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDplLmxlbmd0aH0sbWVzc2FnZTp4bigibWF4TGVuZ3RoV2FybmluZyIsIlN0cmluZyBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGggb2YgezB9LiIsdC5tYXhMZW5ndGgpfSk7e3ZhciBuOyJzdHJpbmciPT10eXBlb2YgdC5wYXR0ZXJuJiYobnVsbCE9KG49QnIodC5wYXR0ZXJuKSkmJm4udGVzdChlLnZhbHVlKXx8ci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDplLmxlbmd0aH0sbWVzc2FnZTp0LnBhdHRlcm5FcnJvck1lc3NhZ2V8fHQuZXJyb3JNZXNzYWdlfHx4bigicGF0dGVybldhcm5pbmciLCdTdHJpbmcgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4gb2YgInswfSIuJyx0LnBhdHRlcm4pfSkpfWlmKHQuZm9ybWF0KXN3aXRjaCh0LmZvcm1hdCl7Y2FzZSJ1cmkiOmNhc2UidXJpLXJlZmVyZW5jZSI6dmFyIGksbz12b2lkIDA7ZS52YWx1ZT8oaT0vXigoW146Lz8jXSs/KTopPyhcL1wvKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/Ly5leGVjKGUudmFsdWUpKT9pWzJdfHwidXJpIiE9PXQuZm9ybWF0fHwobz14bigidXJpU2NoZW1lTWlzc2luZyIsIlVSSSB3aXRoIGEgc2NoZW1lIGlzIGV4cGVjdGVkLiIpKTpvPXhuKCJ1cmlNaXNzaW5nIiwiVVJJIGlzIGV4cGVjdGVkLiIpOm89eG4oInVyaUVtcHR5IiwiVVJJIGV4cGVjdGVkLiIpLG8mJnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LG1lc3NhZ2U6dC5wYXR0ZXJuRXJyb3JNZXNzYWdlfHx0LmVycm9yTWVzc2FnZXx8eG4oInVyaUZvcm1hdFdhcm5pbmciLCJTdHJpbmcgaXMgbm90IGEgVVJJOiB7MH0iLG8pfSk7YnJlYWs7Y2FzZSJjb2xvci1oZXgiOmNhc2UiZGF0ZS10aW1lIjpjYXNlImRhdGUiOmNhc2UidGltZSI6Y2FzZSJlbWFpbCI6bz1Fblt0LmZvcm1hdF07ZS52YWx1ZSYmby5wYXR0ZXJuLmV4ZWMoZS52YWx1ZSl8fHIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LG1lc3NhZ2U6dC5wYXR0ZXJuRXJyb3JNZXNzYWdlfHx0LmVycm9yTWVzc2FnZXx8by5lcnJvck1lc3NhZ2V9KX19KF8sdix5KTticmVhaztjYXNlIm51bWJlciI6IWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1lLnZhbHVlO2Z1bmN0aW9uIGkoZSl7dmFyIHQ9L14oLT9cZCspKD86XC4oXGQrKSk/KD86ZShbLStdXGQrKSk/JC8uZXhlYyhlLnRvU3RyaW5nKCkpO3JldHVybiB0JiZ7dmFsdWU6TnVtYmVyKHRbMV0rKHRbMl18fCIiKSksbXVsdGlwbGllcjooKG51bGw9PT0oZT10WzJdKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5sZW5ndGgpfHwwKS0ocGFyc2VJbnQodFszXSl8fDApfX17dmFyIG8scyxhO0ZyKHQubXVsdGlwbGVPZikmJihoPS0xLE51bWJlci5pc0ludGVnZXIodC5tdWx0aXBsZU9mKT9oPW4ldC5tdWx0aXBsZU9mOihvPWkodC5tdWx0aXBsZU9mKSxzPWkobiksbyYmcyYmKGE9TWF0aC5wb3coMTAsTWF0aC5hYnMocy5tdWx0aXBsaWVyLW8ubXVsdGlwbGllcikpLHMubXVsdGlwbGllcjxvLm11bHRpcGxpZXI/cy52YWx1ZSo9YTpvLnZhbHVlKj1hLGg9cy52YWx1ZSVvLnZhbHVlKSksMCE9PWgmJnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LG1lc3NhZ2U6eG4oIm11bHRpcGxlT2ZXYXJuaW5nIiwiVmFsdWUgaXMgbm90IGRpdmlzaWJsZSBieSB7MH0uIix0Lm11bHRpcGxlT2YpfSkpfWZ1bmN0aW9uIGwoZSx0KXtyZXR1cm4gRnIodCk/dDpqcih0KSYmdD9lOnZvaWQgMH1mdW5jdGlvbiB1KGUsdCl7aWYoIWpyKHQpfHwhdClyZXR1cm4gZX12YXIgaD1sKHQubWluaW11bSx0LmV4Y2x1c2l2ZU1pbmltdW0pO0ZyKGgpJiZuPD1oJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxtZXNzYWdlOnhuKCJleGNsdXNpdmVNaW5pbXVtV2FybmluZyIsIlZhbHVlIGlzIGJlbG93IHRoZSBleGNsdXNpdmUgbWluaW11bSBvZiB7MH0uIixoKX0pO2g9bCh0Lm1heGltdW0sdC5leGNsdXNpdmVNYXhpbXVtKTtGcihoKSYmaDw9biYmci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDplLmxlbmd0aH0sbWVzc2FnZTp4bigiZXhjbHVzaXZlTWF4aW11bVdhcm5pbmciLCJWYWx1ZSBpcyBhYm92ZSB0aGUgZXhjbHVzaXZlIG1heGltdW0gb2YgezB9LiIsaCl9KTtoPXUodC5taW5pbXVtLHQuZXhjbHVzaXZlTWluaW11bSk7RnIoaCkmJm48aCYmci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDplLmxlbmd0aH0sbWVzc2FnZTp4bigibWluaW11bVdhcm5pbmciLCJWYWx1ZSBpcyBiZWxvdyB0aGUgbWluaW11bSBvZiB7MH0uIixoKX0pO3Q9dSh0Lm1heGltdW0sdC5leGNsdXNpdmVNYXhpbXVtKTtGcih0KSYmdDxuJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxtZXNzYWdlOnhuKCJtYXhpbXVtV2FybmluZyIsIlZhbHVlIGlzIGFib3ZlIHRoZSBtYXhpbXVtIG9mIHswfS4iLHQpfSl9KF8sdix5KTticmVhaztjYXNlInByb3BlcnR5IjpyZXR1cm4gbGkoXy52YWx1ZU5vZGUsdix5LGIpfSFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIF8udHlwZT09PWV8fCJpbnRlZ2VyIj09PWUmJiJudW1iZXIiPT09Xy50eXBlJiZfLmlzSW50ZWdlcn1BcnJheS5pc0FycmF5KHYudHlwZSk/di50eXBlLnNvbWUoZSl8fHkucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpfLm9mZnNldCxsZW5ndGg6Xy5sZW5ndGh9LG1lc3NhZ2U6di5lcnJvck1lc3NhZ2V8fHhuKCJ0eXBlQXJyYXlNaXNtYXRjaFdhcm5pbmciLCJJbmNvcnJlY3QgdHlwZS4gRXhwZWN0ZWQgb25lIG9mIHswfS4iLHYudHlwZS5qb2luKCIsICIpKX0pOnYudHlwZSYmKGUodi50eXBlKXx8eS5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0Ol8ub2Zmc2V0LGxlbmd0aDpfLmxlbmd0aH0sbWVzc2FnZTp2LmVycm9yTWVzc2FnZXx8eG4oInR5cGVNaXNtYXRjaFdhcm5pbmciLCdJbmNvcnJlY3QgdHlwZS4gRXhwZWN0ZWQgInswfSIuJyx2LnR5cGUpfSkpO2lmKEFycmF5LmlzQXJyYXkodi5hbGxPZikpZm9yKHZhciB0PTAscj12LmFsbE9mO3Q8ci5sZW5ndGg7dCsrKXt2YXIgbj1yW3RdO2xpKF8sWG4obikseSxiKX12YXIgaT1Ybih2Lm5vdCk7aWYoaSl7dmFyIG89bmV3IHRpLHM9Yi5uZXdTdWIoKTtsaShfLGksbyxzKSxvLmhhc1Byb2JsZW1zKCl8fHkucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpfLm9mZnNldCxsZW5ndGg6Xy5sZW5ndGh9LG1lc3NhZ2U6eG4oIm5vdFNjaGVtYVdhcm5pbmciLCJNYXRjaGVzIGEgc2NoZW1hIHRoYXQgaXMgbm90IGFsbG93ZWQuIil9KTtmb3IodmFyIGE9MCxsPXMuc2NoZW1hczthPGwubGVuZ3RoO2ErKyl7dmFyIHU9bFthXTt1LmludmVydGVkPSF1LmludmVydGVkLGIuYWRkKHUpfX1mdW5jdGlvbiBoKGUsdCl7Zm9yKHZhciByPVtdLG49dm9pZCAwLGk9MCxvPWU7aTxvLmxlbmd0aDtpKyspe3ZhciBzLGE9WG4ob1tpXSksbD1uZXcgdGksdT1iLm5ld1N1YigpO2xpKF8sYSxsLHUpLGwuaGFzUHJvYmxlbXMoKXx8ci5wdXNoKGEpLG4/dHx8bC5oYXNQcm9ibGVtcygpfHxuLnZhbGlkYXRpb25SZXN1bHQuaGFzUHJvYmxlbXMoKT8wPChzPWwuY29tcGFyZShuLnZhbGlkYXRpb25SZXN1bHQpKT9uPXtzY2hlbWE6YSx2YWxpZGF0aW9uUmVzdWx0OmwsbWF0Y2hpbmdTY2hlbWFzOnV9OjA9PT1zJiYobi5tYXRjaGluZ1NjaGVtYXMubWVyZ2UodSksbi52YWxpZGF0aW9uUmVzdWx0Lm1lcmdlRW51bVZhbHVlcyhsKSk6KG4ubWF0Y2hpbmdTY2hlbWFzLm1lcmdlKHUpLG4udmFsaWRhdGlvblJlc3VsdC5wcm9wZXJ0aWVzTWF0Y2hlcys9bC5wcm9wZXJ0aWVzTWF0Y2hlcyxuLnZhbGlkYXRpb25SZXN1bHQucHJvcGVydGllc1ZhbHVlTWF0Y2hlcys9bC5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzKTpuPXtzY2hlbWE6YSx2YWxpZGF0aW9uUmVzdWx0OmwsbWF0Y2hpbmdTY2hlbWFzOnV9fXJldHVybiAxPHIubGVuZ3RoJiZ0JiZ5LnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Xy5vZmZzZXQsbGVuZ3RoOjF9LG1lc3NhZ2U6eG4oIm9uZU9mV2FybmluZyIsIk1hdGNoZXMgbXVsdGlwbGUgc2NoZW1hcyB3aGVuIG9ubHkgb25lIG11c3QgdmFsaWRhdGUuIil9KSxuJiYoeS5tZXJnZShuLnZhbGlkYXRpb25SZXN1bHQpLHkucHJvcGVydGllc01hdGNoZXMrPW4udmFsaWRhdGlvblJlc3VsdC5wcm9wZXJ0aWVzTWF0Y2hlcyx5LnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMrPW4udmFsaWRhdGlvblJlc3VsdC5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzLGIubWVyZ2Uobi5tYXRjaGluZ1NjaGVtYXMpKSxyLmxlbmd0aH1BcnJheS5pc0FycmF5KHYuYW55T2YpJiZoKHYuYW55T2YsITEpO0FycmF5LmlzQXJyYXkodi5vbmVPZikmJmgodi5vbmVPZiwhMCk7ZnVuY3Rpb24gYyhlKXt2YXIgdD1uZXcgdGkscj1iLm5ld1N1YigpO2xpKF8sWG4oZSksdCxyKSx5Lm1lcmdlKHQpLHkucHJvcGVydGllc01hdGNoZXMrPXQucHJvcGVydGllc01hdGNoZXMseS5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzKz10LnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMsYi5tZXJnZShyKX1zPVhuKHYuaWYpO3MmJmZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1YbihlKSxpPW5ldyB0aSxlPWIubmV3U3ViKCk7bGkoXyxuLGksZSksYi5tZXJnZShlKSxpLmhhc1Byb2JsZW1zKCk/ciYmYyhyKTp0JiZjKHQpfShzLFhuKHYudGhlbiksWG4odi5lbHNlKSk7aWYoQXJyYXkuaXNBcnJheSh2LmVudW0pKXtmb3IodmFyIGQ9bmkoXyksZj0hMSxtPTAsZz12LmVudW07bTxnLmxlbmd0aDttKyspe3ZhciBwPWdbbV07aWYoRHIoZCxwKSl7Zj0hMDticmVha319eS5lbnVtVmFsdWVzPXYuZW51bSwoeS5lbnVtVmFsdWVNYXRjaD1mKXx8eS5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0Ol8ub2Zmc2V0LGxlbmd0aDpfLmxlbmd0aH0sY29kZTpwbi5FbnVtVmFsdWVNaXNtYXRjaCxtZXNzYWdlOnYuZXJyb3JNZXNzYWdlfHx4bigiZW51bVdhcm5pbmciLCJWYWx1ZSBpcyBub3QgYWNjZXB0ZWQuIFZhbGlkIHZhbHVlczogezB9LiIsdi5lbnVtLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSl9KS5qb2luKCIsICIpKX0pfUtyKHYuY29uc3QpJiYoRHIoZD1uaShfKSx2LmNvbnN0KT95LmVudW1WYWx1ZU1hdGNoPSEwOih5LnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Xy5vZmZzZXQsbGVuZ3RoOl8ubGVuZ3RofSxjb2RlOnBuLkVudW1WYWx1ZU1pc21hdGNoLG1lc3NhZ2U6di5lcnJvck1lc3NhZ2V8fHhuKCJjb25zdFdhcm5pbmciLCJWYWx1ZSBtdXN0IGJlIHswfS4iLEpTT04uc3RyaW5naWZ5KHYuY29uc3QpKX0pLHkuZW51bVZhbHVlTWF0Y2g9ITEpLHkuZW51bVZhbHVlcz1bdi5jb25zdF0pO3YuZGVwcmVjYXRpb25NZXNzYWdlJiZfLnBhcmVudCYmeS5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0Ol8ucGFyZW50Lm9mZnNldCxsZW5ndGg6Xy5wYXJlbnQubGVuZ3RofSxzZXZlcml0eTpici5XYXJuaW5nLG1lc3NhZ2U6di5kZXByZWNhdGlvbk1lc3NhZ2UsY29kZTpwbi5EZXByZWNhdGVkfSl9KCksYi5hZGQoe25vZGU6XyxzY2hlbWE6dn0pfX1mdW5jdGlvbiB1aShvLGUpe3ZhciBzPVtdLGE9LTEsbD1vLmdldFRleHQoKSx1PU9yKGwsITEpLHQ9ZSYmZS5jb2xsZWN0Q29tbWVudHM/W106dm9pZCAwO2Z1bmN0aW9uIGgoKXtmb3IoOzspe3ZhciBlPXUuc2NhbigpO3N3aXRjaCghZnVuY3Rpb24oKXtzd2l0Y2godS5nZXRUb2tlbkVycm9yKCkpe2Nhc2UgNDpyZXR1cm4gZCh4bigiSW52YWxpZFVuaWNvZGUiLCJJbnZhbGlkIHVuaWNvZGUgc2VxdWVuY2UgaW4gc3RyaW5nLiIpLHBuLkludmFsaWRVbmljb2RlKTtjYXNlIDU6cmV0dXJuIGQoeG4oIkludmFsaWRFc2NhcGVDaGFyYWN0ZXIiLCJJbnZhbGlkIGVzY2FwZSBjaGFyYWN0ZXIgaW4gc3RyaW5nLiIpLHBuLkludmFsaWRFc2NhcGVDaGFyYWN0ZXIpO2Nhc2UgMzpyZXR1cm4gZCh4bigiVW5leHBlY3RlZEVuZE9mTnVtYmVyIiwiVW5leHBlY3RlZCBlbmQgb2YgbnVtYmVyLiIpLHBuLlVuZXhwZWN0ZWRFbmRPZk51bWJlcik7Y2FzZSAxOnJldHVybiBkKHhuKCJVbmV4cGVjdGVkRW5kT2ZDb21tZW50IiwiVW5leHBlY3RlZCBlbmQgb2YgY29tbWVudC4iKSxwbi5VbmV4cGVjdGVkRW5kT2ZDb21tZW50KTtjYXNlIDI6cmV0dXJuIGQoeG4oIlVuZXhwZWN0ZWRFbmRPZlN0cmluZyIsIlVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZy4iKSxwbi5VbmV4cGVjdGVkRW5kT2ZTdHJpbmcpO2Nhc2UgNjpyZXR1cm4gZCh4bigiSW52YWxpZENoYXJhY3RlciIsIkludmFsaWQgY2hhcmFjdGVycyBpbiBzdHJpbmcuIENvbnRyb2wgY2hhcmFjdGVycyBtdXN0IGJlIGVzY2FwZWQuIikscG4uSW52YWxpZENoYXJhY3Rlcil9fSgpLGUpe2Nhc2UgMTI6Y2FzZSAxMzpBcnJheS5pc0FycmF5KHQpJiZ0LnB1c2gobXIuY3JlYXRlKG8ucG9zaXRpb25BdCh1LmdldFRva2VuT2Zmc2V0KCkpLG8ucG9zaXRpb25BdCh1LmdldFRva2VuT2Zmc2V0KCkrdS5nZXRUb2tlbkxlbmd0aCgpKSkpO2JyZWFrO2Nhc2UgMTU6Y2FzZSAxNDpicmVhaztkZWZhdWx0OnJldHVybiBlfX19ZnVuY3Rpb24gYyhlLHQscixuLGkpe3ZvaWQgMD09PWkmJihpPWJyLkVycm9yKSwwIT09cy5sZW5ndGgmJnI9PT1hfHwobj1tci5jcmVhdGUoby5wb3NpdGlvbkF0KHIpLG8ucG9zaXRpb25BdChuKSkscy5wdXNoKENyLmNyZWF0ZShuLGUsaSx0LG8ubGFuZ3VhZ2VJZCkpLGE9cil9ZnVuY3Rpb24gZChlLHQscixuLGkpe3ZvaWQgMD09PXImJihyPXZvaWQgMCksdm9pZCAwPT09biYmKG49W10pLHZvaWQgMD09PWkmJihpPVtdKTt2YXIgbz11LmdldFRva2VuT2Zmc2V0KCkscz11LmdldFRva2VuT2Zmc2V0KCkrdS5nZXRUb2tlbkxlbmd0aCgpO2lmKG89PT1zJiYwPG8pe2ZvcihvLS07MDxvJiYvXHMvLnRlc3QobC5jaGFyQXQobykpOylvLS07cz1vKzF9aWYoYyhlLHQsbyxzKSxyJiZmKHIsITEpLDA8bi5sZW5ndGgraS5sZW5ndGgpZm9yKHZhciBhPXUuZ2V0VG9rZW4oKTsxNyE9PWE7KXtpZigtMSE9PW4uaW5kZXhPZihhKSl7aCgpO2JyZWFrfWlmKC0xIT09aS5pbmRleE9mKGEpKWJyZWFrO2E9aCgpfXJldHVybiByfWZ1bmN0aW9uIGYoZSx0KXtyZXR1cm4gZS5sZW5ndGg9dS5nZXRUb2tlbk9mZnNldCgpK3UuZ2V0VG9rZW5MZW5ndGgoKS1lLm9mZnNldCx0JiZoKCksZX12YXIgbT1uZXcgcW4odm9pZCAwLDAsMCk7ZnVuY3Rpb24gcihlKXtpZigxPT09dS5nZXRUb2tlbigpKXt2YXIgdD1uZXcgSm4oZSx1LmdldFRva2VuT2Zmc2V0KCkpLHI9T2JqZWN0LmNyZWF0ZShudWxsKTtoKCk7Zm9yKHZhciBuPSExOzIhPT11LmdldFRva2VuKCkmJjE3IT09dS5nZXRUb2tlbigpOyl7aWYoNT09PXUuZ2V0VG9rZW4oKSl7bnx8ZCh4bigiUHJvcGVydHlFeHBlY3RlZCIsIlByb3BlcnR5IGV4cGVjdGVkIikscG4uUHJvcGVydHlFeHBlY3RlZCk7dmFyIGk9dS5nZXRUb2tlbk9mZnNldCgpO2lmKGgoKSwyPT09dS5nZXRUb2tlbigpKXtuJiZjKHhuKCJUcmFpbGluZ0NvbW1hIiwiVHJhaWxpbmcgY29tbWEiKSxwbi5UcmFpbGluZ0NvbW1hLGksaSsxKTtjb250aW51ZX19ZWxzZSBuJiZkKHhuKCJFeHBlY3RlZENvbW1hIiwiRXhwZWN0ZWQgY29tbWEiKSxwbi5Db21tYUV4cGVjdGVkKTtpPWZ1bmN0aW9uKGUsdCl7dmFyIHI9bmV3IFduKGUsdS5nZXRUb2tlbk9mZnNldCgpLG0pO2lmKCEoZT1nKHIpKSl7aWYoMTYhPT11LmdldFRva2VuKCkpcmV0dXJuO2QoeG4oIkRvdWJsZVF1b3Rlc0V4cGVjdGVkIiwiUHJvcGVydHkga2V5cyBtdXN0IGJlIGRvdWJsZXF1b3RlZCIpLHBuLlVuZGVmaW5lZCk7dmFyIG49bmV3IHFuKHIsdS5nZXRUb2tlbk9mZnNldCgpLHUuZ2V0VG9rZW5MZW5ndGgoKSk7bi52YWx1ZT11LmdldFRva2VuVmFsdWUoKSxlPW4saCgpfWlmKChuPXRbKHIua2V5Tm9kZT1lKS52YWx1ZV0pPyhjKHhuKCJEdXBsaWNhdGVLZXlXYXJuaW5nIiwiRHVwbGljYXRlIG9iamVjdCBrZXkiKSxwbi5EdXBsaWNhdGVLZXksci5rZXlOb2RlLm9mZnNldCxyLmtleU5vZGUub2Zmc2V0K3Iua2V5Tm9kZS5sZW5ndGgsYnIuV2FybmluZyksIm9iamVjdCI9PXR5cGVvZiBuJiZjKHhuKCJEdXBsaWNhdGVLZXlXYXJuaW5nIiwiRHVwbGljYXRlIG9iamVjdCBrZXkiKSxwbi5EdXBsaWNhdGVLZXksbi5rZXlOb2RlLm9mZnNldCxuLmtleU5vZGUub2Zmc2V0K24ua2V5Tm9kZS5sZW5ndGgsYnIuV2FybmluZyksdFtlLnZhbHVlXT0hMCk6dFtlLnZhbHVlXT1yLDY9PT11LmdldFRva2VuKCkpci5jb2xvbk9mZnNldD11LmdldFRva2VuT2Zmc2V0KCksaCgpO2Vsc2UgaWYoZCh4bigiQ29sb25FeHBlY3RlZCIsIkNvbG9uIGV4cGVjdGVkIikscG4uQ29sb25FeHBlY3RlZCksMTA9PT11LmdldFRva2VuKCkmJm8ucG9zaXRpb25BdChlLm9mZnNldCtlLmxlbmd0aCkubGluZTxvLnBvc2l0aW9uQXQodS5nZXRUb2tlbk9mZnNldCgpKS5saW5lKXJldHVybiByLmxlbmd0aD1lLmxlbmd0aCxyO3JldHVybihlPXAocikpPyhyLnZhbHVlTm9kZT1lLHIubGVuZ3RoPWUub2Zmc2V0K2UubGVuZ3RoLXIub2Zmc2V0LHIpOmQoeG4oIlZhbHVlRXhwZWN0ZWQiLCJWYWx1ZSBleHBlY3RlZCIpLHBuLlZhbHVlRXhwZWN0ZWQscixbXSxbMiw1XSl9KHQscik7aT90LnByb3BlcnRpZXMucHVzaChpKTpkKHhuKCJQcm9wZXJ0eUV4cGVjdGVkIiwiUHJvcGVydHkgZXhwZWN0ZWQiKSxwbi5Qcm9wZXJ0eUV4cGVjdGVkLHZvaWQgMCxbXSxbMiw1XSksbj0hMH1yZXR1cm4gMiE9PXUuZ2V0VG9rZW4oKT9kKHhuKCJFeHBlY3RlZENsb3NlQnJhY2UiLCJFeHBlY3RlZCBjb21tYSBvciBjbG9zaW5nIGJyYWNlIikscG4uQ29tbWFPckNsb3NlQnJhY2VFeHBlY3RlZCx0KTpmKHQsITApfX1mdW5jdGlvbiBnKGUpe2lmKDEwPT09dS5nZXRUb2tlbigpKXtlPW5ldyBxbihlLHUuZ2V0VG9rZW5PZmZzZXQoKSk7cmV0dXJuIGUudmFsdWU9dS5nZXRUb2tlblZhbHVlKCksZihlLCEwKX19ZnVuY3Rpb24gcChlKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYoMz09PXUuZ2V0VG9rZW4oKSl7dmFyIHQ9bmV3IFJuKGUsdS5nZXRUb2tlbk9mZnNldCgpKTtoKCk7Zm9yKHZhciByPSExOzQhPT11LmdldFRva2VuKCkmJjE3IT09dS5nZXRUb2tlbigpOyl7aWYoNT09PXUuZ2V0VG9rZW4oKSl7cnx8ZCh4bigiVmFsdWVFeHBlY3RlZCIsIlZhbHVlIGV4cGVjdGVkIikscG4uVmFsdWVFeHBlY3RlZCk7dmFyIG49dS5nZXRUb2tlbk9mZnNldCgpO2lmKGgoKSw0PT09dS5nZXRUb2tlbigpKXtyJiZjKHhuKCJUcmFpbGluZ0NvbW1hIiwiVHJhaWxpbmcgY29tbWEiKSxwbi5UcmFpbGluZ0NvbW1hLG4sbisxKTtjb250aW51ZX19ZWxzZSByJiZkKHhuKCJFeHBlY3RlZENvbW1hIiwiRXhwZWN0ZWQgY29tbWEiKSxwbi5Db21tYUV4cGVjdGVkKTtuPXAodCk7bj90Lml0ZW1zLnB1c2gobik6ZCh4bigiUHJvcGVydHlFeHBlY3RlZCIsIlZhbHVlIGV4cGVjdGVkIikscG4uVmFsdWVFeHBlY3RlZCx2b2lkIDAsW10sWzQsNV0pLHI9ITB9cmV0dXJuIDQhPT11LmdldFRva2VuKCk/ZCh4bigiRXhwZWN0ZWRDbG9zZUJyYWNrZXQiLCJFeHBlY3RlZCBjb21tYSBvciBjbG9zaW5nIGJyYWNrZXQiKSxwbi5Db21tYU9yQ2xvc2VCYWNrZXRFeHBlY3RlZCx0KTpmKHQsITApfX0oZSl8fHIoZSl8fGcoZSl8fGZ1bmN0aW9uKGUpe2lmKDExPT09dS5nZXRUb2tlbigpKXt2YXIgdD1uZXcgS24oZSx1LmdldFRva2VuT2Zmc2V0KCkpO2lmKDA9PT11LmdldFRva2VuRXJyb3IoKSl7ZT11LmdldFRva2VuVmFsdWUoKTt0cnl7dmFyIHI9SlNPTi5wYXJzZShlKTtpZighRnIocikpcmV0dXJuIGQoeG4oIkludmFsaWROdW1iZXJGb3JtYXQiLCJJbnZhbGlkIG51bWJlciBmb3JtYXQuIikscG4uVW5kZWZpbmVkLHQpO3QudmFsdWU9cn1jYXRjaChlKXtyZXR1cm4gZCh4bigiSW52YWxpZE51bWJlckZvcm1hdCIsIkludmFsaWQgbnVtYmVyIGZvcm1hdC4iKSxwbi5VbmRlZmluZWQsdCl9dC5pc0ludGVnZXI9LTE9PT1lLmluZGV4T2YoIi4iKX1yZXR1cm4gZih0LCEwKX19KGUpfHxmdW5jdGlvbihlKXtzd2l0Y2godS5nZXRUb2tlbigpKXtjYXNlIDc6cmV0dXJuIGYobmV3IE1uKGUsdS5nZXRUb2tlbk9mZnNldCgpKSwhMCk7Y2FzZSA4OnJldHVybiBmKG5ldyBJbihlLCEwLHUuZ2V0VG9rZW5PZmZzZXQoKSksITApO2Nhc2UgOTpyZXR1cm4gZihuZXcgSW4oZSwhMSx1LmdldFRva2VuT2Zmc2V0KCkpLCEwKTtkZWZhdWx0OnJldHVybn19KGUpfWU9dm9pZCAwO3JldHVybiAxNyE9PWgoKSYmKChlPXAoZSkpPzE3IT09dS5nZXRUb2tlbigpJiZkKHhuKCJFbmQgb2YgZmlsZSBleHBlY3RlZCIsIkVuZCBvZiBmaWxlIGV4cGVjdGVkLiIpLHBuLlVuZGVmaW5lZCk6ZCh4bigiSW52YWxpZCBzeW1ib2wiLCJFeHBlY3RlZCBhIEpTT04gb2JqZWN0LCBhcnJheSBvciBsaXRlcmFsLiIpLHBuLlVuZGVmaW5lZCkpLG5ldyBzaShlLHMsdCl9dmFyIGhpPVNuLGNpPShkaS5wcm90b3R5cGUuZG9SZXNvbHZlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLmNvbnRyaWJ1dGlvbnMubGVuZ3RoLTE7MDw9dDt0LS0pe3ZhciByPXRoaXMuY29udHJpYnV0aW9uc1t0XS5yZXNvbHZlQ29tcGxldGlvbjtpZihyKXtyPXIoZSk7aWYocilyZXR1cm4gcn19cmV0dXJuIHRoaXMucHJvbWlzZUNvbnN0cnVjdG9yLnJlc29sdmUoZSl9LGRpLnByb3RvdHlwZS5kb0NvbXBsZXRlPWZ1bmN0aW9uKHUsZSxoKXt2YXIgYz10aGlzLGQ9e2l0ZW1zOltdLGlzSW5jb21wbGV0ZTohMX0sZj11LmdldFRleHQoKSxtPXUub2Zmc2V0QXQoZSksZz1oLmdldE5vZGVGcm9tT2Zmc2V0KG0sITApO2lmKHRoaXMuaXNJbkNvbW1lbnQodSxnP2cub2Zmc2V0OjAsbSkpcmV0dXJuIFByb21pc2UucmVzb2x2ZShkKTtnJiZtPT09Zy5vZmZzZXQrZy5sZW5ndGgmJjA8bSYmKHQ9ZlttLTFdLCgib2JqZWN0Ij09PWcudHlwZSYmIn0iPT09dHx8ImFycmF5Ij09PWcudHlwZSYmIl0iPT09dCkmJihnPWcucGFyZW50KSk7dmFyIHQscD10aGlzLmdldEN1cnJlbnRXb3JkKHUsbSksdj0hZ3x8InN0cmluZyIhPT1nLnR5cGUmJiJudW1iZXIiIT09Zy50eXBlJiYiYm9vbGVhbiIhPT1nLnR5cGUmJiJudWxsIiE9PWcudHlwZT8oMDwodD1tLXAubGVuZ3RoKSYmJyInPT09Zlt0LTFdJiZ0LS0sbXIuY3JlYXRlKHUucG9zaXRpb25BdCh0KSxlKSk6bXIuY3JlYXRlKHUucG9zaXRpb25BdChnLm9mZnNldCksdS5wb3NpdGlvbkF0KGcub2Zmc2V0K2cubGVuZ3RoKSkseT17fSxiPXthZGQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sYWJlbCxyPXlbdF07cj8oci5kb2N1bWVudGF0aW9ufHwoci5kb2N1bWVudGF0aW9uPWUuZG9jdW1lbnRhdGlvbiksci5kZXRhaWx8fChyLmRldGFpbD1lLmRldGFpbCkpOig2MDwodD10LnJlcGxhY2UoL1tcbl0vZywi4oa1IikpLmxlbmd0aCYmKHI9dC5zdWJzdHIoMCw1NykudHJpbSgpKyIuLi4iLHlbcl18fCh0PXIpKSx2JiZ2b2lkIDAhPT1lLmluc2VydFRleHQmJihlLnRleHRFZGl0PXdyLnJlcGxhY2UodixlLmluc2VydFRleHQpKSxlLmxhYmVsPXQseVt0XT1lLGQuaXRlbXMucHVzaChlKSl9LHNldEFzSW5jb21wbGV0ZTpmdW5jdGlvbigpe2QuaXNJbmNvbXBsZXRlPSEwfSxlcnJvcjpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfSxsb2c6ZnVuY3Rpb24oZSl7Y29uc29sZS5sb2coZSl9LGdldE51bWJlck9mUHJvcG9zYWxzOmZ1bmN0aW9uKCl7cmV0dXJuIGQuaXRlbXMubGVuZ3RofX07cmV0dXJuIHRoaXMuc2NoZW1hU2VydmljZS5nZXRTY2hlbWFGb3JSZXNvdXJjZSh1LnVyaSxoKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0LHI9W10sbj0hMCxpPSIiLG89dm9pZCAwO2lmKGcmJigic3RyaW5nIiE9PWcudHlwZXx8KHQ9Zy5wYXJlbnQpJiYicHJvcGVydHkiPT09dC50eXBlJiZ0LmtleU5vZGU9PT1nJiYobj0hdC52YWx1ZU5vZGUsbz10LGk9Zi5zdWJzdHIoZy5vZmZzZXQrMSxnLmxlbmd0aC0yKSx0JiYoZz10LnBhcmVudCkpKSxnJiYib2JqZWN0Ij09PWcudHlwZSl7aWYoZy5vZmZzZXQ9PT1tKXJldHVybiBkO2cucHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe28mJm89PT1lfHwoeVtlLmtleU5vZGUudmFsdWVdPVlyLmNyZWF0ZSgiX18iKSl9KTt2YXIgcz0iIjtuJiYocz1jLmV2YWx1YXRlU2VwYXJhdG9yQWZ0ZXIodSx1Lm9mZnNldEF0KHYuZW5kKSkpLGU/Yy5nZXRQcm9wZXJ0eUNvbXBsZXRpb25zKGUsaCxnLG4scyxiKTpjLmdldFNjaGVtYUxlc3NQcm9wZXJ0eUNvbXBsZXRpb25zKGgsZyxpLGIpO3ZhciBhPWlpKGcpO2MuY29udHJpYnV0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2U9ZS5jb2xsZWN0UHJvcGVydHlDb21wbGV0aW9ucyh1LnVyaSxhLHAsbiwiIj09PXMsYik7ZSYmci5wdXNoKGUpfSksIWUmJjA8cC5sZW5ndGgmJiciJyE9PWYuY2hhckF0KG0tcC5sZW5ndGgtMSkmJihiLmFkZCh7a2luZDpYci5Qcm9wZXJ0eSxsYWJlbDpjLmdldExhYmVsRm9yVmFsdWUocCksaW5zZXJ0VGV4dDpjLmdldEluc2VydFRleHRGb3JQcm9wZXJ0eShwLHZvaWQgMCwhMSxzKSxpbnNlcnRUZXh0Rm9ybWF0OlpyLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pLGIuc2V0QXNJbmNvbXBsZXRlKCkpfXZhciBsPXt9O3JldHVybiBlP2MuZ2V0VmFsdWVDb21wbGV0aW9ucyhlLGgsZyxtLHUsYixsKTpjLmdldFNjaGVtYUxlc3NWYWx1ZUNvbXBsZXRpb25zKGgsZyxtLHUsYiksMDxjLmNvbnRyaWJ1dGlvbnMubGVuZ3RoJiZjLmdldENvbnRyaWJ1dGVkVmFsdWVDb21wbGV0aW9ucyhoLGcsbSx1LGIsciksYy5wcm9taXNlQ29uc3RydWN0b3IuYWxsKHIpLnRoZW4oZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gMD09PWIuZ2V0TnVtYmVyT2ZQcm9wb3NhbHMoKSYmKGU9bSwhZ3x8InN0cmluZyIhPT1nLnR5cGUmJiJudW1iZXIiIT09Zy50eXBlJiYiYm9vbGVhbiIhPT1nLnR5cGUmJiJudWxsIiE9PWcudHlwZXx8KGU9Zy5vZmZzZXQrZy5sZW5ndGgpLGU9Yy5ldmFsdWF0ZVNlcGFyYXRvckFmdGVyKHUsZSksYy5hZGRGaWxsZXJWYWx1ZUNvbXBsZXRpb25zKGwsZSxiKSksZH0pfSl9LGRpLnByb3RvdHlwZS5nZXRQcm9wZXJ0eUNvbXBsZXRpb25zPWZ1bmN0aW9uKGUsdCxzLGEsbCx1KXt2YXIgaD10aGlzO3QuZ2V0TWF0Y2hpbmdTY2hlbWFzKGUuc2NoZW1hLHMub2Zmc2V0KS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUubm9kZT09PXMmJiFlLmludmVydGVkKXt2YXIgcj1lLnNjaGVtYS5wcm9wZXJ0aWVzO3ImJk9iamVjdC5rZXlzKHIpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9cltlXTsib2JqZWN0IiE9dHlwZW9mIHR8fHQuZGVwcmVjYXRpb25NZXNzYWdlfHx0LmRvTm90U3VnZ2VzdHx8KGU9e2tpbmQ6WHIuUHJvcGVydHksbGFiZWw6ZSxpbnNlcnRUZXh0OmguZ2V0SW5zZXJ0VGV4dEZvclByb3BlcnR5KGUsdCxhLGwpLGluc2VydFRleHRGb3JtYXQ6WnIuU25pcHBldCxmaWx0ZXJUZXh0OmguZ2V0RmlsdGVyVGV4dEZvclZhbHVlKGUpLGRvY3VtZW50YXRpb246aC5mcm9tTWFya3VwKHQubWFya2Rvd25EZXNjcmlwdGlvbil8fHQuZGVzY3JpcHRpb258fCIifSx2b2lkIDAhPT10LnN1Z2dlc3RTb3J0VGV4dCYmKGUuc29ydFRleHQ9dC5zdWdnZXN0U29ydFRleHQpLGUuaW5zZXJ0VGV4dCYmcXIoZS5pbnNlcnRUZXh0LCIkMSIrbCkmJihlLmNvbW1hbmQ9e3RpdGxlOiJTdWdnZXN0Iixjb21tYW5kOiJlZGl0b3IuYWN0aW9uLnRyaWdnZXJTdWdnZXN0In0pLHUuYWRkKGUpKX0pO3ZhciBuPWUuc2NoZW1hLnByb3BlcnR5TmFtZXM7aWYoIm9iamVjdCI9PXR5cGVvZiBuJiYhbi5kZXByZWNhdGlvbk1lc3NhZ2UmJiFuLmRvTm90U3VnZ2VzdCl7dmFyIHQ9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD12b2lkIDApO3Q9e2tpbmQ6WHIuUHJvcGVydHksbGFiZWw6ZSxpbnNlcnRUZXh0OmguZ2V0SW5zZXJ0VGV4dEZvclByb3BlcnR5KGUsdm9pZCAwLGEsbCksaW5zZXJ0VGV4dEZvcm1hdDpaci5TbmlwcGV0LGZpbHRlclRleHQ6aC5nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUoZSksZG9jdW1lbnRhdGlvbjp0fHxoLmZyb21NYXJrdXAobi5tYXJrZG93bkRlc2NyaXB0aW9uKXx8bi5kZXNjcmlwdGlvbnx8IiJ9O3ZvaWQgMCE9PW4uc3VnZ2VzdFNvcnRUZXh0JiYodC5zb3J0VGV4dD1uLnN1Z2dlc3RTb3J0VGV4dCksdC5pbnNlcnRUZXh0JiZxcih0Lmluc2VydFRleHQsIiQxIitsKSYmKHQuY29tbWFuZD17dGl0bGU6IlN1Z2dlc3QiLGNvbW1hbmQ6ImVkaXRvci5hY3Rpb24udHJpZ2dlclN1Z2dlc3QifSksdS5hZGQodCl9O2lmKG4uZW51bSlmb3IodmFyIGk9MDtpPG4uZW51bS5sZW5ndGg7aSsrKXt2YXIgbz12b2lkIDA7bi5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnMmJmk8bi5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnMubGVuZ3RoP289aC5mcm9tTWFya3VwKG4ubWFya2Rvd25FbnVtRGVzY3JpcHRpb25zW2ldKTpuLmVudW1EZXNjcmlwdGlvbnMmJmk8bi5lbnVtRGVzY3JpcHRpb25zLmxlbmd0aCYmKG89bi5lbnVtRGVzY3JpcHRpb25zW2ldKSx0KG4uZW51bVtpXSxvKX1uLmNvbnN0JiZ0KG4uY29uc3QpfX19KX0sZGkucHJvdG90eXBlLmdldFNjaGVtYUxlc3NQcm9wZXJ0eUNvbXBsZXRpb25zPWZ1bmN0aW9uKGUsdCxyLG4pe2Z1bmN0aW9uIGkoZSl7ZS5wcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24oZSl7ZT1lLmtleU5vZGUudmFsdWU7bi5hZGQoe2tpbmQ6WHIuUHJvcGVydHksbGFiZWw6ZSxpbnNlcnRUZXh0OnMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKGUsIiIpLGluc2VydFRleHRGb3JtYXQ6WnIuU25pcHBldCxmaWx0ZXJUZXh0OnMuZ2V0RmlsdGVyVGV4dEZvclZhbHVlKGUpLGRvY3VtZW50YXRpb246IiJ9KX0pfXZhciBvLHM9dGhpczt0LnBhcmVudD8icHJvcGVydHkiPT09dC5wYXJlbnQudHlwZT8obz10LnBhcmVudC5rZXlOb2RlLnZhbHVlLGUudmlzaXQoZnVuY3Rpb24oZSl7cmV0dXJuInByb3BlcnR5Ij09PWUudHlwZSYmZSE9PXQucGFyZW50JiZlLmtleU5vZGUudmFsdWU9PT1vJiZlLnZhbHVlTm9kZSYmIm9iamVjdCI9PT1lLnZhbHVlTm9kZS50eXBlJiZpKGUudmFsdWVOb2RlKSwhMH0pKToiYXJyYXkiPT09dC5wYXJlbnQudHlwZSYmdC5wYXJlbnQuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihlKXsib2JqZWN0Ij09PWUudHlwZSYmZSE9PXQmJmkoZSl9KToib2JqZWN0Ij09PXQudHlwZSYmbi5hZGQoe2tpbmQ6WHIuUHJvcGVydHksbGFiZWw6IiRzY2hlbWEiLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yUHJvcGVydHkoIiRzY2hlbWEiLHZvaWQgMCwhMCwiIiksaW5zZXJ0VGV4dEZvcm1hdDpaci5TbmlwcGV0LGRvY3VtZW50YXRpb246IiIsZmlsdGVyVGV4dDp0aGlzLmdldEZpbHRlclRleHRGb3JWYWx1ZSgiJHNjaGVtYSIpfSl9LGRpLnByb3RvdHlwZS5nZXRTY2hlbWFMZXNzVmFsdWVDb21wbGV0aW9ucz1mdW5jdGlvbihlLHQscixuLGkpe3ZhciBvPXRoaXMscz1yO2lmKCF0fHwic3RyaW5nIiE9PXQudHlwZSYmIm51bWJlciIhPT10LnR5cGUmJiJib29sZWFuIiE9PXQudHlwZSYmIm51bGwiIT09dC50eXBlfHwocz10Lm9mZnNldCt0Lmxlbmd0aCx0PXQucGFyZW50KSwhdClyZXR1cm4gaS5hZGQoe2tpbmQ6dGhpcy5nZXRTdWdnZXN0aW9uS2luZCgib2JqZWN0IiksbGFiZWw6IkVtcHR5IG9iamVjdCIsaW5zZXJ0VGV4dDp0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZSh7fSwiIiksaW5zZXJ0VGV4dEZvcm1hdDpaci5TbmlwcGV0LGRvY3VtZW50YXRpb246IiJ9KSx2b2lkIGkuYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoImFycmF5IiksbGFiZWw6IkVtcHR5IGFycmF5IixpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKFtdLCIiKSxpbnNlcnRUZXh0Rm9ybWF0OlpyLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pO2Z1bmN0aW9uIGEoZSl7ZS5wYXJlbnQmJiFvaShlLnBhcmVudCxyLCEwKSYmaS5hZGQoe2tpbmQ6by5nZXRTdWdnZXN0aW9uS2luZChlLnR5cGUpLGxhYmVsOm8uZ2V0TGFiZWxUZXh0Rm9yTWF0Y2hpbmdOb2RlKGUsbiksaW5zZXJ0VGV4dDpvLmdldEluc2VydFRleHRGb3JNYXRjaGluZ05vZGUoZSxuLHUpLGluc2VydFRleHRGb3JtYXQ6WnIuU25pcHBldCxkb2N1bWVudGF0aW9uOiIifSksImJvb2xlYW4iPT09ZS50eXBlJiZvLmFkZEJvb2xlYW5WYWx1ZUNvbXBsZXRpb24oIWUudmFsdWUsdSxpKX12YXIgbCx1PXRoaXMuZXZhbHVhdGVTZXBhcmF0b3JBZnRlcihuLHMpO2lmKCJwcm9wZXJ0eSI9PT10LnR5cGUmJnI+KHQuY29sb25PZmZzZXR8fDApKXtzPXQudmFsdWVOb2RlO2lmKHMmJihyPnMub2Zmc2V0K3MubGVuZ3RofHwib2JqZWN0Ij09PXMudHlwZXx8ImFycmF5Ij09PXMudHlwZSkpcmV0dXJuO3ZhciBoPXQua2V5Tm9kZS52YWx1ZTtlLnZpc2l0KGZ1bmN0aW9uKGUpe3JldHVybiJwcm9wZXJ0eSI9PT1lLnR5cGUmJmUua2V5Tm9kZS52YWx1ZT09PWgmJmUudmFsdWVOb2RlJiZhKGUudmFsdWVOb2RlKSwhMH0pLCIkc2NoZW1hIj09PWgmJnQucGFyZW50JiYhdC5wYXJlbnQucGFyZW50JiZ0aGlzLmFkZERvbGxhclNjaGVtYUNvbXBsZXRpb25zKHUsaSl9ImFycmF5Ij09PXQudHlwZSYmKHQucGFyZW50JiYicHJvcGVydHkiPT09dC5wYXJlbnQudHlwZT8obD10LnBhcmVudC5rZXlOb2RlLnZhbHVlLGUudmlzaXQoZnVuY3Rpb24oZSl7cmV0dXJuInByb3BlcnR5Ij09PWUudHlwZSYmZS5rZXlOb2RlLnZhbHVlPT09bCYmZS52YWx1ZU5vZGUmJiJhcnJheSI9PT1lLnZhbHVlTm9kZS50eXBlJiZlLnZhbHVlTm9kZS5pdGVtcy5mb3JFYWNoKGEpLCEwfSkpOnQuaXRlbXMuZm9yRWFjaChhKSl9LGRpLnByb3RvdHlwZS5nZXRWYWx1ZUNvbXBsZXRpb25zPWZ1bmN0aW9uKGUsdCxyLG4saSxvLHMpe3ZhciBhPW4sbD12b2lkIDAsdT12b2lkIDA7aWYoIXJ8fCJzdHJpbmciIT09ci50eXBlJiYibnVtYmVyIiE9PXIudHlwZSYmImJvb2xlYW4iIT09ci50eXBlJiYibnVsbCIhPT1yLnR5cGV8fChhPXIub2Zmc2V0K3IubGVuZ3RoLHI9KHU9cikucGFyZW50KSxyKXtpZigicHJvcGVydHkiPT09ci50eXBlJiZuPihyLmNvbG9uT2Zmc2V0fHwwKSl7dmFyIGg9ci52YWx1ZU5vZGU7aWYoaCYmbj5oLm9mZnNldCtoLmxlbmd0aClyZXR1cm47bD1yLmtleU5vZGUudmFsdWUscj1yLnBhcmVudH1pZihyJiYodm9pZCAwIT09bHx8ImFycmF5Ij09PXIudHlwZSkpe2Zvcih2YXIgYz10aGlzLmV2YWx1YXRlU2VwYXJhdG9yQWZ0ZXIoaSxhKSxkPTAsZj10LmdldE1hdGNoaW5nU2NoZW1hcyhlLnNjaGVtYSxyLm9mZnNldCx1KTtkPGYubGVuZ3RoO2QrKyl7dmFyIG0sZz1mW2RdO2lmKGcubm9kZT09PXImJiFnLmludmVydGVkJiZnLnNjaGVtYSlpZigiYXJyYXkiPT09ci50eXBlJiZnLnNjaGVtYS5pdGVtcyYmKEFycmF5LmlzQXJyYXkoZy5zY2hlbWEuaXRlbXMpPyhtPXRoaXMuZmluZEl0ZW1BdE9mZnNldChyLGksbikpPGcuc2NoZW1hLml0ZW1zLmxlbmd0aCYmdGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGcuc2NoZW1hLml0ZW1zW21dLGMsbyxzKTp0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoZy5zY2hlbWEuaXRlbXMsYyxvLHMpKSx2b2lkIDAhPT1sKXt2YXIgcD0hMTtpZihnLnNjaGVtYS5wcm9wZXJ0aWVzJiYoYj1nLnNjaGVtYS5wcm9wZXJ0aWVzW2xdKSYmKHA9ITAsdGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGIsYyxvLHMpKSxnLnNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyYmIXApZm9yKHZhciB2PTAseT1PYmplY3Qua2V5cyhnLnNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcyk7djx5Lmxlbmd0aDt2Kyspe3ZhciBiLF89eVt2XSxDPUJyKF8pO251bGwhPUMmJkMudGVzdChsKSYmKHA9ITAsYj1nLnNjaGVtYS5wYXR0ZXJuUHJvcGVydGllc1tfXSx0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoYixjLG8scykpfWcuc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzJiYhcCYmKGI9Zy5zY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMsdGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGIsYyxvLHMpKX19IiRzY2hlbWEiIT09bHx8ci5wYXJlbnR8fHRoaXMuYWRkRG9sbGFyU2NoZW1hQ29tcGxldGlvbnMoYyxvKSxzLmJvb2xlYW4mJih0aGlzLmFkZEJvb2xlYW5WYWx1ZUNvbXBsZXRpb24oITAsYyxvKSx0aGlzLmFkZEJvb2xlYW5WYWx1ZUNvbXBsZXRpb24oITEsYyxvKSkscy5udWxsJiZ0aGlzLmFkZE51bGxWYWx1ZUNvbXBsZXRpb24oYyxvKX19ZWxzZSB0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoZS5zY2hlbWEsIiIsbyxzKX0sZGkucHJvdG90eXBlLmdldENvbnRyaWJ1dGVkVmFsdWVDb21wbGV0aW9ucz1mdW5jdGlvbihlLHQscixuLGksbyl7dmFyIHMsYSxsO3Q/KHQ9InN0cmluZyI9PT10LnR5cGV8fCJudW1iZXIiPT09dC50eXBlfHwiYm9vbGVhbiI9PT10LnR5cGV8fCJudWxsIj09PXQudHlwZT90LnBhcmVudDp0KSYmInByb3BlcnR5Ij09PXQudHlwZSYmcj4odC5jb2xvbk9mZnNldHx8MCkmJihzPXQua2V5Tm9kZS52YWx1ZSwoIShhPXQudmFsdWVOb2RlKXx8cjw9YS5vZmZzZXQrYS5sZW5ndGgpJiZ0LnBhcmVudCYmKGw9aWkodC5wYXJlbnQpLHRoaXMuY29udHJpYnV0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2U9ZS5jb2xsZWN0VmFsdWVDb21wbGV0aW9ucyhuLnVyaSxsLHMsaSk7ZSYmby5wdXNoKGUpfSkpKTp0aGlzLmNvbnRyaWJ1dGlvbnMuZm9yRWFjaChmdW5jdGlvbihlKXtlPWUuY29sbGVjdERlZmF1bHRDb21wbGV0aW9ucyhuLnVyaSxpKTtlJiZvLnB1c2goZSl9KX0sZGkucHJvdG90eXBlLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnM9ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGk9dGhpczsib2JqZWN0Ij09dHlwZW9mIGUmJih0aGlzLmFkZEVudW1WYWx1ZUNvbXBsZXRpb25zKGUsdCxyKSx0aGlzLmFkZERlZmF1bHRWYWx1ZUNvbXBsZXRpb25zKGUsdCxyKSx0aGlzLmNvbGxlY3RUeXBlcyhlLG4pLEFycmF5LmlzQXJyYXkoZS5hbGxPZikmJmUuYWxsT2YuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gaS5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGUsdCxyLG4pfSksQXJyYXkuaXNBcnJheShlLmFueU9mKSYmZS5hbnlPZi5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiBpLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoZSx0LHIsbil9KSxBcnJheS5pc0FycmF5KGUub25lT2YpJiZlLm9uZU9mLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGkuYWRkU2NoZW1hVmFsdWVDb21wbGV0aW9ucyhlLHQscixuKX0pKX0sZGkucHJvdG90eXBlLmFkZERlZmF1bHRWYWx1ZUNvbXBsZXRpb25zPWZ1bmN0aW9uKGgsYyxkLGYpe3ZhciBtPXRoaXM7dm9pZCAwPT09ZiYmKGY9MCk7dmFyIGc9ITE7aWYoS3IoaC5kZWZhdWx0KSl7Zm9yKHZhciBlPWgudHlwZSx0PWguZGVmYXVsdCxyPWY7MDxyO3ItLSl0PVt0XSxlPSJhcnJheSI7ZC5hZGQoe2tpbmQ6dGhpcy5nZXRTdWdnZXN0aW9uS2luZChlKSxsYWJlbDp0aGlzLmdldExhYmVsRm9yVmFsdWUodCksaW5zZXJ0VGV4dDp0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZSh0LGMpLGluc2VydFRleHRGb3JtYXQ6WnIuU25pcHBldCxkZXRhaWw6aGkoImpzb24uc3VnZ2VzdC5kZWZhdWx0IiwiRGVmYXVsdCB2YWx1ZSIpfSksZz0hMH1BcnJheS5pc0FycmF5KGguZXhhbXBsZXMpJiZoLmV4YW1wbGVzLmZvckVhY2goZnVuY3Rpb24oZSl7Zm9yKHZhciB0PWgudHlwZSxyPWUsbj1mOzA8bjtuLS0pcj1bcl0sdD0iYXJyYXkiO2QuYWRkKHtraW5kOm0uZ2V0U3VnZ2VzdGlvbktpbmQodCksbGFiZWw6bS5nZXRMYWJlbEZvclZhbHVlKHIpLGluc2VydFRleHQ6bS5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUocixjKSxpbnNlcnRUZXh0Rm9ybWF0OlpyLlNuaXBwZXR9KSxnPSEwfSksQXJyYXkuaXNBcnJheShoLmRlZmF1bHRTbmlwcGV0cykmJmguZGVmYXVsdFNuaXBwZXRzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQscixuPWgudHlwZSxpPWUuYm9keSxvPWUubGFiZWw7aWYoS3IoaSkpe2gudHlwZTtmb3IodmFyIHM9ZjswPHM7cy0tKWk9W2ldO3Q9bS5nZXRJbnNlcnRUZXh0Rm9yU25pcHBldFZhbHVlKGksYykscj1tLmdldEZpbHRlclRleHRGb3JTbmlwcGV0VmFsdWUoaSksbz1vfHxtLmdldExhYmVsRm9yU25pcHBldFZhbHVlKGkpfWVsc2V7aWYoInN0cmluZyIhPXR5cGVvZiBlLmJvZHlUZXh0KXJldHVybjtmb3IodmFyIGE9IiIsbD0iIix1PSIiLHM9ZjswPHM7cy0tKWE9YSt1KyJbXG4iLGw9bCsiXG4iK3UrIl0iLHUrPSJcdCIsbj0iYXJyYXkiO3Q9YSt1K2UuYm9keVRleHQuc3BsaXQoIlxuIikuam9pbigiXG4iK3UpK2wrYyxvPW98fHQscj10LnJlcGxhY2UoL1tcbl0vZywiIil9ZC5hZGQoe2tpbmQ6bS5nZXRTdWdnZXN0aW9uS2luZChuKSxsYWJlbDpvLGRvY3VtZW50YXRpb246bS5mcm9tTWFya3VwKGUubWFya2Rvd25EZXNjcmlwdGlvbil8fGUuZGVzY3JpcHRpb24saW5zZXJ0VGV4dDp0LGluc2VydFRleHRGb3JtYXQ6WnIuU25pcHBldCxmaWx0ZXJUZXh0OnJ9KSxnPSEwfSksIWcmJiJvYmplY3QiPT10eXBlb2YgaC5pdGVtcyYmIUFycmF5LmlzQXJyYXkoaC5pdGVtcykmJmY8NSYmdGhpcy5hZGREZWZhdWx0VmFsdWVDb21wbGV0aW9ucyhoLml0ZW1zLGMsZCxmKzEpfSxkaS5wcm90b3R5cGUuYWRkRW51bVZhbHVlQ29tcGxldGlvbnM9ZnVuY3Rpb24oZSx0LHIpe2lmKEtyKGUuY29uc3QpJiZyLmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKGUudHlwZSksbGFiZWw6dGhpcy5nZXRMYWJlbEZvclZhbHVlKGUuY29uc3QpLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoZS5jb25zdCx0KSxpbnNlcnRUZXh0Rm9ybWF0OlpyLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjp0aGlzLmZyb21NYXJrdXAoZS5tYXJrZG93bkRlc2NyaXB0aW9uKXx8ZS5kZXNjcmlwdGlvbn0pLEFycmF5LmlzQXJyYXkoZS5lbnVtKSlmb3IodmFyIG49MCxpPWUuZW51bS5sZW5ndGg7bjxpO24rKyl7dmFyIG89ZS5lbnVtW25dLHM9dGhpcy5mcm9tTWFya3VwKGUubWFya2Rvd25EZXNjcmlwdGlvbil8fGUuZGVzY3JpcHRpb247ZS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnMmJm48ZS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnMubGVuZ3RoJiZ0aGlzLmRvZXNTdXBwb3J0TWFya2Rvd24oKT9zPXRoaXMuZnJvbU1hcmt1cChlLm1hcmtkb3duRW51bURlc2NyaXB0aW9uc1tuXSk6ZS5lbnVtRGVzY3JpcHRpb25zJiZuPGUuZW51bURlc2NyaXB0aW9ucy5sZW5ndGgmJihzPWUuZW51bURlc2NyaXB0aW9uc1tuXSksci5hZGQoe2tpbmQ6dGhpcy5nZXRTdWdnZXN0aW9uS2luZChlLnR5cGUpLGxhYmVsOnRoaXMuZ2V0TGFiZWxGb3JWYWx1ZShvKSxpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKG8sdCksaW5zZXJ0VGV4dEZvcm1hdDpaci5TbmlwcGV0LGRvY3VtZW50YXRpb246c30pfX0sZGkucHJvdG90eXBlLmNvbGxlY3RUeXBlcz1mdW5jdGlvbihlLHQpe0FycmF5LmlzQXJyYXkoZS5lbnVtKXx8S3IoZS5jb25zdCl8fChlPWUudHlwZSxBcnJheS5pc0FycmF5KGUpP2UuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXT0hMH0pOmUmJih0W2VdPSEwKSl9LGRpLnByb3RvdHlwZS5hZGRGaWxsZXJWYWx1ZUNvbXBsZXRpb25zPWZ1bmN0aW9uKGUsdCxyKXtlLm9iamVjdCYmci5hZGQoe2tpbmQ6dGhpcy5nZXRTdWdnZXN0aW9uS2luZCgib2JqZWN0IiksbGFiZWw6Int9IixpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvckd1ZXNzZWRWYWx1ZSh7fSx0KSxpbnNlcnRUZXh0Rm9ybWF0OlpyLlNuaXBwZXQsZGV0YWlsOmhpKCJkZWZhdWx0cy5vYmplY3QiLCJOZXcgb2JqZWN0IiksZG9jdW1lbnRhdGlvbjoiIn0pLGUuYXJyYXkmJnIuYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoImFycmF5IiksbGFiZWw6IltdIixpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvckd1ZXNzZWRWYWx1ZShbXSx0KSxpbnNlcnRUZXh0Rm9ybWF0OlpyLlNuaXBwZXQsZGV0YWlsOmhpKCJkZWZhdWx0cy5hcnJheSIsIk5ldyBhcnJheSIpLGRvY3VtZW50YXRpb246IiJ9KX0sZGkucHJvdG90eXBlLmFkZEJvb2xlYW5WYWx1ZUNvbXBsZXRpb249ZnVuY3Rpb24oZSx0LHIpe3IuYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoImJvb2xlYW4iKSxsYWJlbDplPyJ0cnVlIjoiZmFsc2UiLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoZSx0KSxpbnNlcnRUZXh0Rm9ybWF0OlpyLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pfSxkaS5wcm90b3R5cGUuYWRkTnVsbFZhbHVlQ29tcGxldGlvbj1mdW5jdGlvbihlLHQpe3QuYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoIm51bGwiKSxsYWJlbDoibnVsbCIsaW5zZXJ0VGV4dDoibnVsbCIrZSxpbnNlcnRUZXh0Rm9ybWF0OlpyLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pfSxkaS5wcm90b3R5cGUuYWRkRG9sbGFyU2NoZW1hQ29tcGxldGlvbnM9ZnVuY3Rpb24odCxyKXt2YXIgbj10aGlzO3RoaXMuc2NoZW1hU2VydmljZS5nZXRSZWdpc3RlcmVkU2NoZW1hSWRzKGZ1bmN0aW9uKGUpe3JldHVybiJodHRwIj09PWV8fCJodHRwcyI9PT1lfSkuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gci5hZGQoe2tpbmQ6WHIuTW9kdWxlLGxhYmVsOm4uZ2V0TGFiZWxGb3JWYWx1ZShlKSxmaWx0ZXJUZXh0Om4uZ2V0RmlsdGVyVGV4dEZvclZhbHVlKGUpLGluc2VydFRleHQ6bi5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoZSx0KSxpbnNlcnRUZXh0Rm9ybWF0OlpyLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pfSl9LGRpLnByb3RvdHlwZS5nZXRMYWJlbEZvclZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBKU09OLnN0cmluZ2lmeShlKX0sZGkucHJvdG90eXBlLmdldEZpbHRlclRleHRGb3JWYWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSl9LGRpLnByb3RvdHlwZS5nZXRGaWx0ZXJUZXh0Rm9yU25pcHBldFZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBKU09OLnN0cmluZ2lmeShlKS5yZXBsYWNlKC9cJFx7XGQrOihbXn1dKylcfXxcJFxkKy9nLCIkMSIpfSxkaS5wcm90b3R5cGUuZ2V0TGFiZWxGb3JTbmlwcGV0VmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpLnJlcGxhY2UoL1wkXHtcZCs6KFtefV0rKVx9fFwkXGQrL2csIiQxIil9LGRpLnByb3RvdHlwZS5nZXRJbnNlcnRUZXh0Rm9yUGxhaW5UZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1tcXFwkXH1dL2csIlxcJCYiKX0sZGkucHJvdG90eXBlLmdldEluc2VydFRleHRGb3JWYWx1ZT1mdW5jdGlvbihlLHQpe2U9SlNPTi5zdHJpbmdpZnkoZSxudWxsLCJcdCIpO3JldHVybiJ7fSI9PT1lPyJ7JDF9Iit0OiJbXSI9PT1lPyJbJDFdIit0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclBsYWluVGV4dChlK3QpfSxkaS5wcm90b3R5cGUuZ2V0SW5zZXJ0VGV4dEZvclNuaXBwZXRWYWx1ZT1mdW5jdGlvbihlLHQpe3JldHVybiBmdW5jdGlvbiBlKHQscixuKXtpZihudWxsPT09dHx8Im9iamVjdCIhPXR5cGVvZiB0KXJldHVybiBuKHQpO3ZhciBpPXIrIlx0IjtpZihBcnJheS5pc0FycmF5KHQpKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuIltdIjtmb3IodmFyIG89IltcbiIscz0wO3M8dC5sZW5ndGg7cysrKW8rPWkrZSh0W3NdLGksbiksczx0Lmxlbmd0aC0xJiYobys9IiwiKSxvKz0iXG4iO3JldHVybiBvKz1yKyJdIn12YXIgYT1PYmplY3Qua2V5cyh0KTtpZigwPT09YS5sZW5ndGgpcmV0dXJuInt9Ijtmb3Iobz0ie1xuIixzPTA7czxhLmxlbmd0aDtzKyspe3ZhciBsPWFbc107bys9aStKU09OLnN0cmluZ2lmeShsKSsiOiAiK2UodFtsXSxpLG4pLHM8YS5sZW5ndGgtMSYmKG8rPSIsIiksbys9IlxuIn1yZXR1cm4gbys9cisifSJ9KGUsIiIsZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYiXiI9PT1lWzBdP2Uuc3Vic3RyKDEpOkpTT04uc3RyaW5naWZ5KGUpfSkrdH0sZGkucHJvdG90eXBlLmdldEluc2VydFRleHRGb3JHdWVzc2VkVmFsdWU9ZnVuY3Rpb24oZSx0KXtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uib2JqZWN0IjpyZXR1cm4gbnVsbD09PWU/IiR7MTpudWxsfSIrdDp0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZShlLHQpO2Nhc2Uic3RyaW5nIjp2YXIgcj0ocj1KU09OLnN0cmluZ2lmeShlKSkuc3Vic3RyKDEsci5sZW5ndGgtMik7cmV0dXJuJyIkezE6Jysocj10aGlzLmdldEluc2VydFRleHRGb3JQbGFpblRleHQocikpKyd9IicrdDtjYXNlIm51bWJlciI6Y2FzZSJib29sZWFuIjpyZXR1cm4iJHsxOiIrSlNPTi5zdHJpbmdpZnkoZSkrIn0iK3R9cmV0dXJuIHRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKGUsdCl9LGRpLnByb3RvdHlwZS5nZXRTdWdnZXN0aW9uS2luZD1mdW5jdGlvbihlKXt2YXIgdDtpZighKGU9QXJyYXkuaXNBcnJheShlKT8wPCh0PWUpLmxlbmd0aD90WzBdOnZvaWQgMDplKSlyZXR1cm4gWHIuVmFsdWU7c3dpdGNoKGUpe2Nhc2Uic3RyaW5nIjpyZXR1cm4gWHIuVmFsdWU7Y2FzZSJvYmplY3QiOnJldHVybiBYci5Nb2R1bGU7Y2FzZSJwcm9wZXJ0eSI6cmV0dXJuIFhyLlByb3BlcnR5O2RlZmF1bHQ6cmV0dXJuIFhyLlZhbHVlfX0sZGkucHJvdG90eXBlLmdldExhYmVsVGV4dEZvck1hdGNoaW5nTm9kZT1mdW5jdGlvbihlLHQpe3N3aXRjaChlLnR5cGUpe2Nhc2UiYXJyYXkiOnJldHVybiJbXSI7Y2FzZSJvYmplY3QiOnJldHVybiJ7fSI7ZGVmYXVsdDpyZXR1cm4gdC5nZXRUZXh0KCkuc3Vic3RyKGUub2Zmc2V0LGUubGVuZ3RoKX19LGRpLnByb3RvdHlwZS5nZXRJbnNlcnRUZXh0Rm9yTWF0Y2hpbmdOb2RlPWZ1bmN0aW9uKGUsdCxyKXtzd2l0Y2goZS50eXBlKXtjYXNlImFycmF5IjpyZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoW10scik7Y2FzZSJvYmplY3QiOnJldHVybiB0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZSh7fSxyKTtkZWZhdWx0OnZhciBuPXQuZ2V0VGV4dCgpLnN1YnN0cihlLm9mZnNldCxlLmxlbmd0aCkrcjtyZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yUGxhaW5UZXh0KG4pfX0sZGkucHJvdG90eXBlLmdldEluc2VydFRleHRGb3JQcm9wZXJ0eT1mdW5jdGlvbihlLHQscixuKXt2YXIgaT10aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZShlLCIiKTtpZighcilyZXR1cm4gaTt2YXIgbyxlPWkrIjogIixyPTA7aWYodCYmKEFycmF5LmlzQXJyYXkodC5kZWZhdWx0U25pcHBldHMpJiYoMSE9PXQuZGVmYXVsdFNuaXBwZXRzLmxlbmd0aHx8S3Iocz10LmRlZmF1bHRTbmlwcGV0c1swXS5ib2R5KSYmKG89dGhpcy5nZXRJbnNlcnRUZXh0Rm9yU25pcHBldFZhbHVlKHMsIiIpKSxyKz10LmRlZmF1bHRTbmlwcGV0cy5sZW5ndGgpLHQuZW51bSYmKG98fDEhPT10LmVudW0ubGVuZ3RofHwobz10aGlzLmdldEluc2VydFRleHRGb3JHdWVzc2VkVmFsdWUodC5lbnVtWzBdLCIiKSkscis9dC5lbnVtLmxlbmd0aCksS3IodC5kZWZhdWx0KSYmKG89b3x8dGhpcy5nZXRJbnNlcnRUZXh0Rm9yR3Vlc3NlZFZhbHVlKHQuZGVmYXVsdCwiIikscisrKSxBcnJheS5pc0FycmF5KHQuZXhhbXBsZXMpJiZ0LmV4YW1wbGVzLmxlbmd0aCYmKG89b3x8dGhpcy5nZXRJbnNlcnRUZXh0Rm9yR3Vlc3NlZFZhbHVlKHQuZXhhbXBsZXNbMF0sIiIpLHIrPXQuZXhhbXBsZXMubGVuZ3RoKSwwPT09cikpe3ZhciBzPUFycmF5LmlzQXJyYXkodC50eXBlKT90LnR5cGVbMF06dC50eXBlO3N3aXRjaChzfHwodC5wcm9wZXJ0aWVzP3M9Im9iamVjdCI6dC5pdGVtcyYmKHM9ImFycmF5IikpLHMpe2Nhc2UiYm9vbGVhbiI6bz0iJDEiO2JyZWFrO2Nhc2Uic3RyaW5nIjpvPSciJDEiJzticmVhaztjYXNlIm9iamVjdCI6bz0ieyQxfSI7YnJlYWs7Y2FzZSJhcnJheSI6bz0iWyQxXSI7YnJlYWs7Y2FzZSJudW1iZXIiOmNhc2UiaW50ZWdlciI6bz0iJHsxOjB9IjticmVhaztjYXNlIm51bGwiOm89IiR7MTpudWxsfSI7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gaX19cmV0dXJuIGUrKG89IW98fDE8cj8iJDEiOm8pK259LGRpLnByb3RvdHlwZS5nZXRDdXJyZW50V29yZD1mdW5jdGlvbihlLHQpe2Zvcih2YXIgcj10LTEsbj1lLmdldFRleHQoKTswPD1yJiYtMT09PScgXHRcblxyXHYiOntbLF19Jy5pbmRleE9mKG4uY2hhckF0KHIpKTspci0tO3JldHVybiBuLnN1YnN0cmluZyhyKzEsdCl9LGRpLnByb3RvdHlwZS5ldmFsdWF0ZVNlcGFyYXRvckFmdGVyPWZ1bmN0aW9uKGUsdCl7ZT1PcihlLmdldFRleHQoKSwhMCk7c3dpdGNoKGUuc2V0UG9zaXRpb24odCksZS5zY2FuKCkpe2Nhc2UgNTpjYXNlIDI6Y2FzZSA0OmNhc2UgMTc6cmV0dXJuIiI7ZGVmYXVsdDpyZXR1cm4iLCJ9fSxkaS5wcm90b3R5cGUuZmluZEl0ZW1BdE9mZnNldD1mdW5jdGlvbihlLHQscil7Zm9yKHZhciBuPU9yKHQuZ2V0VGV4dCgpLCEwKSxpPWUuaXRlbXMsbz1pLmxlbmd0aC0xOzA8PW87by0tKXt2YXIgcz1pW29dO2lmKHI+cy5vZmZzZXQrcy5sZW5ndGgpcmV0dXJuIG4uc2V0UG9zaXRpb24ocy5vZmZzZXQrcy5sZW5ndGgpLDU9PT1uLnNjYW4oKSYmcj49bi5nZXRUb2tlbk9mZnNldCgpK24uZ2V0VG9rZW5MZW5ndGgoKT9vKzE6bztpZihyPj1zLm9mZnNldClyZXR1cm4gb31yZXR1cm4gMH0sZGkucHJvdG90eXBlLmlzSW5Db21tZW50PWZ1bmN0aW9uKGUsdCxyKXt2YXIgbj1PcihlLmdldFRleHQoKSwhMSk7bi5zZXRQb3NpdGlvbih0KTtmb3IodmFyIGk9bi5zY2FuKCk7MTchPT1pJiZuLmdldFRva2VuT2Zmc2V0KCkrbi5nZXRUb2tlbkxlbmd0aCgpPHI7KWk9bi5zY2FuKCk7cmV0dXJuKDEyPT09aXx8MTM9PT1pKSYmbi5nZXRUb2tlbk9mZnNldCgpPD1yfSxkaS5wcm90b3R5cGUuZnJvbU1hcmt1cD1mdW5jdGlvbihlKXtpZihlJiZ0aGlzLmRvZXNTdXBwb3J0TWFya2Rvd24oKSlyZXR1cm57a2luZDp6ci5NYXJrZG93bix2YWx1ZTplfX0sZGkucHJvdG90eXBlLmRvZXNTdXBwb3J0TWFya2Rvd249ZnVuY3Rpb24oKXt2YXIgZTtyZXR1cm4gS3IodGhpcy5zdXBwb3J0c01hcmtkb3duKXx8KGU9dGhpcy5jbGllbnRDYXBhYmlsaXRpZXMudGV4dERvY3VtZW50JiZ0aGlzLmNsaWVudENhcGFiaWxpdGllcy50ZXh0RG9jdW1lbnQuY29tcGxldGlvbix0aGlzLnN1cHBvcnRzTWFya2Rvd249ZSYmZS5jb21wbGV0aW9uSXRlbSYmQXJyYXkuaXNBcnJheShlLmNvbXBsZXRpb25JdGVtLmRvY3VtZW50YXRpb25Gb3JtYXQpJiYtMSE9PWUuY29tcGxldGlvbkl0ZW0uZG9jdW1lbnRhdGlvbkZvcm1hdC5pbmRleE9mKHpyLk1hcmtkb3duKSksdGhpcy5zdXBwb3J0c01hcmtkb3dufSxkaS5wcm90b3R5cGUuZG9lc1N1cHBvcnRzQ29tbWl0Q2hhcmFjdGVycz1mdW5jdGlvbigpe3ZhciBlO3JldHVybiBLcih0aGlzLnN1cHBvcnRzQ29tbWl0Q2hhcmFjdGVycyl8fChlPXRoaXMuY2xpZW50Q2FwYWJpbGl0aWVzLnRleHREb2N1bWVudCYmdGhpcy5jbGllbnRDYXBhYmlsaXRpZXMudGV4dERvY3VtZW50LmNvbXBsZXRpb24sdGhpcy5zdXBwb3J0c0NvbW1pdENoYXJhY3RlcnM9ZSYmZS5jb21wbGV0aW9uSXRlbSYmISFlLmNvbXBsZXRpb25JdGVtLmNvbW1pdENoYXJhY3RlcnNTdXBwb3J0KSx0aGlzLnN1cHBvcnRzQ29tbWl0Q2hhcmFjdGVyc30sZGkpO2Z1bmN0aW9uIGRpKGUsdCxyLG4pe3ZvaWQgMD09PXQmJih0PVtdKSx2b2lkIDA9PT1yJiYocj1Qcm9taXNlKSx2b2lkIDA9PT1uJiYobj17fSksdGhpcy5zY2hlbWFTZXJ2aWNlPWUsdGhpcy5jb250cmlidXRpb25zPXQsdGhpcy5wcm9taXNlQ29uc3RydWN0b3I9cix0aGlzLmNsaWVudENhcGFiaWxpdGllcz1ufXZhciBmaSxtaSxnaT0ocGkucHJvdG90eXBlLmRvSG92ZXI9ZnVuY3Rpb24oZSx0LHMpe3ZhciByPWUub2Zmc2V0QXQodCksYT1zLmdldE5vZGVGcm9tT2Zmc2V0KHIpO2lmKCFhfHwoIm9iamVjdCI9PT1hLnR5cGV8fCJhcnJheSI9PT1hLnR5cGUpJiZyPmEub2Zmc2V0KzEmJnI8YS5vZmZzZXQrYS5sZW5ndGgtMSlyZXR1cm4gdGhpcy5wcm9taXNlLnJlc29sdmUobnVsbCk7dD1hO2lmKCJzdHJpbmciPT09YS50eXBlKXtyPWEucGFyZW50O2lmKHImJiJwcm9wZXJ0eSI9PT1yLnR5cGUmJnIua2V5Tm9kZT09PWEmJiEoYT1yLnZhbHVlTm9kZSkpcmV0dXJuIHRoaXMucHJvbWlzZS5yZXNvbHZlKG51bGwpfWZvcih2YXIgbj1tci5jcmVhdGUoZS5wb3NpdGlvbkF0KHQub2Zmc2V0KSxlLnBvc2l0aW9uQXQodC5vZmZzZXQrdC5sZW5ndGgpKSxsPWZ1bmN0aW9uKGUpe3JldHVybntjb250ZW50czplLHJhbmdlOm59fSxpPWlpKGEpLG89dGhpcy5jb250cmlidXRpb25zLmxlbmd0aC0xOzA8PW87by0tKXt2YXIgdT10aGlzLmNvbnRyaWJ1dGlvbnNbb10uZ2V0SW5mb0NvbnRyaWJ1dGlvbihlLnVyaSxpKTtpZih1KXJldHVybiB1LnRoZW4obCl9cmV0dXJuIHRoaXMuc2NoZW1hU2VydmljZS5nZXRTY2hlbWFGb3JSZXNvdXJjZShlLnVyaSxzKS50aGVuKGZ1bmN0aW9uKGUpe2lmKGUmJmEpe3ZhciB0PXMuZ2V0TWF0Y2hpbmdTY2hlbWFzKGUuc2NoZW1hLGEub2Zmc2V0KSxyPXZvaWQgMCxuPXZvaWQgMCxpPXZvaWQgMCxvPXZvaWQgMDt0LmV2ZXJ5KGZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBlLm5vZGU9PT1hJiYhZS5pbnZlcnRlZCYmZS5zY2hlbWEmJihyPXJ8fGUuc2NoZW1hLnRpdGxlLG49bnx8ZS5zY2hlbWEubWFya2Rvd25EZXNjcmlwdGlvbnx8dmkoZS5zY2hlbWEuZGVzY3JpcHRpb24pLGUuc2NoZW1hLmVudW0mJih0PWUuc2NoZW1hLmVudW0uaW5kZXhPZihuaShhKSksZS5zY2hlbWEubWFya2Rvd25FbnVtRGVzY3JpcHRpb25zP2k9ZS5zY2hlbWEubWFya2Rvd25FbnVtRGVzY3JpcHRpb25zW3RdOmUuc2NoZW1hLmVudW1EZXNjcmlwdGlvbnMmJihpPXZpKGUuc2NoZW1hLmVudW1EZXNjcmlwdGlvbnNbdF0pKSxpJiYic3RyaW5nIiE9dHlwZW9mKG89ZS5zY2hlbWEuZW51bVt0XSkmJihvPUpTT04uc3RyaW5naWZ5KG8pKSkpLCEwfSk7ZT0iIjtyZXR1cm4gciYmKGU9dmkocikpLG4mJigwPGUubGVuZ3RoJiYoZSs9IlxuXG4iKSxlKz1uKSxpJiYoMDxlLmxlbmd0aCYmKGUrPSJcblxuIiksZSs9ImAiKygtMT09PSh0PW8pLmluZGV4T2YoImAiKT90OiJgYCAiK3QrIiBgYCIpKyJgOiAiK2kpLGwoW2VdKX1yZXR1cm4gbnVsbH0pfSxwaSk7ZnVuY3Rpb24gcGkoZSx0LHIpe3ZvaWQgMD09PXQmJih0PVtdKSx0aGlzLnNjaGVtYVNlcnZpY2U9ZSx0aGlzLmNvbnRyaWJ1dGlvbnM9dCx0aGlzLnByb21pc2U9cnx8UHJvbWlzZX1mdW5jdGlvbiB2aShlKXtpZihlKXJldHVybiBlLnJlcGxhY2UoLyhbXlxuXHJdKShccj9cbikoW15cblxyXSkvZ20sIiQxXG5cbiQzIikucmVwbGFjZSgvW1xcYCpfe31bXF0oKSMrXC0uIV0vZywiXFwkJiIpfWZ1bmN0aW9uIHlpKGUpe2lmKG1pW2VdKXJldHVybiBtaVtlXS5leHBvcnRzO3ZhciB0PW1pW2VdPXtleHBvcnRzOnt9fTtyZXR1cm4gZmlbZV0odCx0LmV4cG9ydHMseWkpLHQuZXhwb3J0c31maT17NDcwOmU9PntmdW5jdGlvbiBkKGUpe2lmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJQYXRoIG11c3QgYmUgYSBzdHJpbmcuIFJlY2VpdmVkICIrSlNPTi5zdHJpbmdpZnkoZSkpfWZ1bmN0aW9uIG8oZSx0KXtmb3IodmFyIHIsbj0iIixpPTAsbz0tMSxzPTAsYT0wO2E8PWUubGVuZ3RoOysrYSl7aWYoYTxlLmxlbmd0aClyPWUuY2hhckNvZGVBdChhKTtlbHNle2lmKDQ3PT09cilicmVhaztyPTQ3fWlmKDQ3PT09cil7aWYobyE9PWEtMSYmMSE9PXMpaWYobyE9PWEtMSYmMj09PXMpe2lmKG4ubGVuZ3RoPDJ8fDIhPT1pfHw0NiE9PW4uY2hhckNvZGVBdChuLmxlbmd0aC0xKXx8NDYhPT1uLmNoYXJDb2RlQXQobi5sZW5ndGgtMikpaWYoMjxuLmxlbmd0aCl7dmFyIGw9bi5sYXN0SW5kZXhPZigiLyIpO2lmKGwhPT1uLmxlbmd0aC0xKXtpPS0xPT09bD8obj0iIiwwKToobj1uLnNsaWNlKDAsbCkpLmxlbmd0aC0xLW4ubGFzdEluZGV4T2YoIi8iKSxvPWEscz0wO2NvbnRpbnVlfX1lbHNlIGlmKDI9PT1uLmxlbmd0aHx8MT09PW4ubGVuZ3RoKXtuPSIiLG89YSxzPWk9MDtjb250aW51ZX10JiYoMDxuLmxlbmd0aD9uKz0iLy4uIjpuPSIuLiIsaT0yKX1lbHNlIDA8bi5sZW5ndGg/bis9Ii8iK2Uuc2xpY2UobysxLGEpOm49ZS5zbGljZShvKzEsYSksaT1hLW8tMTtvPWEscz0wfWVsc2UgNDY9PT1yJiYtMSE9PXM/KytzOnM9LTF9cmV0dXJuIG59dmFyIGY9e3Jlc29sdmU6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD0iIixyPSExLG49YXJndW1lbnRzLmxlbmd0aC0xOy0xPD1uJiYhcjtuLS0pe3ZhciBpPTA8PW4/YXJndW1lbnRzW25dOmU9dm9pZCAwPT09ZT9wcm9jZXNzLmN3ZCgpOmU7ZChpKSwwIT09aS5sZW5ndGgmJih0PWkrIi8iK3Qscj00Nz09PWkuY2hhckNvZGVBdCgwKSl9cmV0dXJuIHQ9byh0LCFyKSxyPzA8dC5sZW5ndGg/Ii8iK3Q6Ii8iOjA8dC5sZW5ndGg/dDoiLiJ9LG5vcm1hbGl6ZTpmdW5jdGlvbihlKXtpZihkKGUpLDA9PT1lLmxlbmd0aClyZXR1cm4iLiI7dmFyIHQ9NDc9PT1lLmNoYXJDb2RlQXQoMCkscj00Nz09PWUuY2hhckNvZGVBdChlLmxlbmd0aC0xKTtyZXR1cm4gMDwoZT0wPT09KGU9byhlLCF0KSkubGVuZ3RoJiYhdD8iLiI6ZSkubGVuZ3RoJiZyJiYoZSs9Ii8iKSx0PyIvIitlOmV9LGlzQWJzb2x1dGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGQoZSksMDxlLmxlbmd0aCYmNDc9PT1lLmNoYXJDb2RlQXQoMCl9LGpvaW46ZnVuY3Rpb24oKXtpZigwPT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4iLiI7Zm9yKHZhciBlLHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7Kyt0KXt2YXIgcj1hcmd1bWVudHNbdF07ZChyKSwwPHIubGVuZ3RoJiYodm9pZCAwPT09ZT9lPXI6ZSs9Ii8iK3IpfXJldHVybiB2b2lkIDA9PT1lPyIuIjpmLm5vcm1hbGl6ZShlKX0scmVsYXRpdmU6ZnVuY3Rpb24oZSx0KXtpZihkKGUpLGQodCksZT09PXQpcmV0dXJuIiI7aWYoKGU9Zi5yZXNvbHZlKGUpKT09PSh0PWYucmVzb2x2ZSh0KSkpcmV0dXJuIiI7Zm9yKHZhciByPTE7cjxlLmxlbmd0aCYmNDc9PT1lLmNoYXJDb2RlQXQocik7KytyKTtmb3IodmFyIG49ZS5sZW5ndGgsaT1uLXIsbz0xO288dC5sZW5ndGgmJjQ3PT09dC5jaGFyQ29kZUF0KG8pOysrbyk7Zm9yKHZhciBzPXQubGVuZ3RoLW8sYT1pPHM/aTpzLGw9LTEsdT0wO3U8PWE7Kyt1KXtpZih1PT09YSl7aWYoYTxzKXtpZig0Nz09PXQuY2hhckNvZGVBdChvK3UpKXJldHVybiB0LnNsaWNlKG8rdSsxKTtpZigwPT09dSlyZXR1cm4gdC5zbGljZShvK3UpfWVsc2UgYTxpJiYoNDc9PT1lLmNoYXJDb2RlQXQocit1KT9sPXU6MD09PXUmJihsPTApKTticmVha312YXIgaD1lLmNoYXJDb2RlQXQocit1KTtpZihoIT09dC5jaGFyQ29kZUF0KG8rdSkpYnJlYWs7NDc9PT1oJiYobD11KX1mb3IodmFyIGM9IiIsdT1yK2wrMTt1PD1uOysrdSl1IT09biYmNDchPT1lLmNoYXJDb2RlQXQodSl8fCgwPT09Yy5sZW5ndGg/Yys9Ii4uIjpjKz0iLy4uIik7cmV0dXJuIDA8Yy5sZW5ndGg/Yyt0LnNsaWNlKG8rbCk6KDQ3PT09dC5jaGFyQ29kZUF0KG8rPWwpJiYrK28sdC5zbGljZShvKSl9LF9tYWtlTG9uZzpmdW5jdGlvbihlKXtyZXR1cm4gZX0sZGlybmFtZTpmdW5jdGlvbihlKXtpZihkKGUpLDA9PT1lLmxlbmd0aClyZXR1cm4iLiI7Zm9yKHZhciB0PTQ3PT09ZS5jaGFyQ29kZUF0KDApLHI9LTEsbj0hMCxpPWUubGVuZ3RoLTE7MTw9aTstLWkpaWYoNDc9PT1lLmNoYXJDb2RlQXQoaSkpe2lmKCFuKXtyPWk7YnJlYWt9fWVsc2Ugbj0hMTtyZXR1cm4tMT09PXI/dD8iLyI6Ii4iOnQmJjE9PT1yPyIvLyI6ZS5zbGljZSgwLHIpfSxiYXNlbmFtZTpmdW5jdGlvbihlLHQpe2lmKHZvaWQgMCE9PXQmJiJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCciZXh0IiBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJyk7ZChlKTt2YXIgcj0wLG49LTEsaT0hMDtpZih2b2lkIDAhPT10JiYwPHQubGVuZ3RoJiZ0Lmxlbmd0aDw9ZS5sZW5ndGgpe2lmKHQubGVuZ3RoPT09ZS5sZW5ndGgmJnQ9PT1lKXJldHVybiIiO2Zvcih2YXIgbz10Lmxlbmd0aC0xLHM9LTEsYT1lLmxlbmd0aC0xOzA8PWE7LS1hKXt2YXIgbD1lLmNoYXJDb2RlQXQoYSk7aWYoNDc9PT1sKXtpZighaSl7cj1hKzE7YnJlYWt9fWVsc2UtMT09PXMmJihpPSExLHM9YSsxKSwwPD1vJiYobD09PXQuY2hhckNvZGVBdChvKT8tMT09LS1vJiYobj1hKToobz0tMSxuPXMpKX1yZXR1cm4gcj09PW4/bj1zOi0xPT09biYmKG49ZS5sZW5ndGgpLGUuc2xpY2UocixuKX1mb3IoYT1lLmxlbmd0aC0xOzA8PWE7LS1hKWlmKDQ3PT09ZS5jaGFyQ29kZUF0KGEpKXtpZighaSl7cj1hKzE7YnJlYWt9fWVsc2UtMT09PW4mJihpPSExLG49YSsxKTtyZXR1cm4tMT09PW4/IiI6ZS5zbGljZShyLG4pfSxleHRuYW1lOmZ1bmN0aW9uKGUpe2QoZSk7Zm9yKHZhciB0PS0xLHI9MCxuPS0xLGk9ITAsbz0wLHM9ZS5sZW5ndGgtMTswPD1zOy0tcyl7dmFyIGE9ZS5jaGFyQ29kZUF0KHMpO2lmKDQ3IT09YSktMT09PW4mJihpPSExLG49cysxKSw0Nj09PWE/LTE9PT10P3Q9czoxIT09byYmKG89MSk6LTEhPT10JiYobz0tMSk7ZWxzZSBpZighaSl7cj1zKzE7YnJlYWt9fXJldHVybi0xPT09dHx8LTE9PT1ufHwwPT09b3x8MT09PW8mJnQ9PT1uLTEmJnQ9PT1yKzE/IiI6ZS5zbGljZSh0LG4pfSxmb3JtYXQ6ZnVuY3Rpb24oZSl7aWYobnVsbD09PWV8fCJvYmplY3QiIT10eXBlb2YgZSl0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInBhdGhPYmplY3QiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgZSk7cmV0dXJuIHQ9ZS5kaXJ8fGUucm9vdCxyPWUuYmFzZXx8KGUubmFtZXx8IiIpKyhlLmV4dHx8IiIpLHQ/dD09PWUucm9vdD90K3I6dCsiLyIrcjpyO3ZhciB0LHJ9LHBhcnNlOmZ1bmN0aW9uKGUpe2QoZSk7dmFyIHQ9e3Jvb3Q6IiIsZGlyOiIiLGJhc2U6IiIsZXh0OiIiLG5hbWU6IiJ9O2lmKDA9PT1lLmxlbmd0aClyZXR1cm4gdDtmb3IodmFyIHIsbj00Nz09PShyPWUuY2hhckNvZGVBdCgwKSksaT1uPyh0LnJvb3Q9Ii8iLDEpOjAsbz0tMSxzPTAsYT0tMSxsPSEwLHU9ZS5sZW5ndGgtMSxoPTA7aTw9dTstLXUpaWYoNDchPT0ocj1lLmNoYXJDb2RlQXQodSkpKS0xPT09YSYmKGw9ITEsYT11KzEpLDQ2PT09cj8tMT09PW8/bz11OjEhPT1oJiYoaD0xKTotMSE9PW8mJihoPS0xKTtlbHNlIGlmKCFsKXtzPXUrMTticmVha31yZXR1cm4tMT09PW98fC0xPT09YXx8MD09PWh8fDE9PT1oJiZvPT09YS0xJiZvPT09cysxPy0xIT09YSYmKHQuYmFzZT10Lm5hbWU9MD09PXMmJm4/ZS5zbGljZSgxLGEpOmUuc2xpY2UocyxhKSk6KDA9PT1zJiZuPyh0Lm5hbWU9ZS5zbGljZSgxLG8pLHQuYmFzZT1lLnNsaWNlKDEsYSkpOih0Lm5hbWU9ZS5zbGljZShzLG8pLHQuYmFzZT1lLnNsaWNlKHMsYSkpLHQuZXh0PWUuc2xpY2UobyxhKSksMDxzP3QuZGlyPWUuc2xpY2UoMCxzLTEpOm4mJih0LmRpcj0iLyIpLHR9LHNlcDoiLyIsZGVsaW1pdGVyOiI6Iix3aW4zMjpudWxsLHBvc2l4Om51bGx9O2YucG9zaXg9ZixlLmV4cG9ydHM9Zn0sNDQ3OihlLHQscik9Pnt2YXIgbjtyLnIodCksci5kKHQse1VSSTooKT0+aCxVdGlsczooKT0+d30pLCJvYmplY3QiPT10eXBlb2YgcHJvY2Vzcz9uPSJ3aW4zMiI9PT1wcm9jZXNzLnBsYXRmb3JtOiJvYmplY3QiPT10eXBlb2YgbmF2aWdhdG9yJiYobj0wPD1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIldpbmRvd3MiKSk7dmFyIGksbyx0PShpPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGk9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKGUsdCl7ZS5fX3Byb3RvX189dH18fGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQscikmJihlW3JdPXRbcl0pfSkoZSx0KX0sZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfWkoZSx0KSxlLnByb3RvdHlwZT1udWxsPT09dD9PYmplY3QuY3JlYXRlKHQpOihyLnByb3RvdHlwZT10LnByb3RvdHlwZSxuZXcgcil9KSxzPS9eXHdbXHdcZCsuLV0qJC8sYT0vXlwvLyxsPS9eXC9cLy8sdT0vXigoW146Lz8jXSs/KTopPyhcL1wvKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/LyxoPShnLmlzVXJpPWZ1bmN0aW9uKGUpe3JldHVybiBlIGluc3RhbmNlb2YgZ3x8ISFlJiYic3RyaW5nIj09dHlwZW9mIGUuYXV0aG9yaXR5JiYic3RyaW5nIj09dHlwZW9mIGUuZnJhZ21lbnQmJiJzdHJpbmciPT10eXBlb2YgZS5wYXRoJiYic3RyaW5nIj09dHlwZW9mIGUucXVlcnkmJiJzdHJpbmciPT10eXBlb2YgZS5zY2hlbWUmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLmZzUGF0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUud2l0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUudG9TdHJpbmd9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShnLnByb3RvdHlwZSwiZnNQYXRoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHkodGhpcywhMSl9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksZy5wcm90b3R5cGUud2l0aD1mdW5jdGlvbihlKXtpZighZSlyZXR1cm4gdGhpczt2YXIgdD1lLnNjaGVtZSxyPWUuYXV0aG9yaXR5LG49ZS5wYXRoLGk9ZS5xdWVyeSxlPWUuZnJhZ21lbnQ7cmV0dXJuIHZvaWQgMD09PXQ/dD10aGlzLnNjaGVtZTpudWxsPT09dCYmKHQ9IiIpLHZvaWQgMD09PXI/cj10aGlzLmF1dGhvcml0eTpudWxsPT09ciYmKHI9IiIpLHZvaWQgMD09PW4/bj10aGlzLnBhdGg6bnVsbD09PW4mJihuPSIiKSx2b2lkIDA9PT1pP2k9dGhpcy5xdWVyeTpudWxsPT09aSYmKGk9IiIpLHZvaWQgMD09PWU/ZT10aGlzLmZyYWdtZW50Om51bGw9PT1lJiYoZT0iIiksdD09PXRoaXMuc2NoZW1lJiZyPT09dGhpcy5hdXRob3JpdHkmJm49PT10aGlzLnBhdGgmJmk9PT10aGlzLnF1ZXJ5JiZlPT09dGhpcy5mcmFnbWVudD90aGlzOm5ldyBkKHQscixuLGksZSl9LGcucGFyc2U9ZnVuY3Rpb24oZSx0KXt2b2lkIDA9PT10JiYodD0hMSk7ZT11LmV4ZWMoZSk7cmV0dXJuIGU/bmV3IGQoZVsyXXx8IiIsQyhlWzRdfHwiIiksQyhlWzVdfHwiIiksQyhlWzddfHwiIiksQyhlWzldfHwiIiksdCk6bmV3IGQoIiIsIiIsIiIsIiIsIiIpfSxnLmZpbGU9ZnVuY3Rpb24oZSl7dmFyIHQscj0iIjtyZXR1cm4iLyI9PT0oZT1uP2UucmVwbGFjZSgvXFwvZywiLyIpOmUpWzBdJiYiLyI9PT1lWzFdJiYoZT0tMT09PSh0PWUuaW5kZXhPZigiLyIsMikpPyhyPWUuc3Vic3RyaW5nKDIpLCIvIik6KHI9ZS5zdWJzdHJpbmcoMix0KSxlLnN1YnN0cmluZyh0KXx8Ii8iKSksbmV3IGQoImZpbGUiLHIsZSwiIiwiIil9LGcuZnJvbT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IGQoZS5zY2hlbWUsZS5hdXRob3JpdHksZS5wYXRoLGUucXVlcnksZS5mcmFnbWVudCl9LGcucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKGUpe3JldHVybiBiKHRoaXMsZT12b2lkIDA9PT1lPyExOmUpfSxnLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZy5yZXZpdmU9ZnVuY3Rpb24oZSl7aWYoZSl7aWYoZSBpbnN0YW5jZW9mIGcpcmV0dXJuIGU7dmFyIHQ9bmV3IGQoZSk7cmV0dXJuIHQuX2Zvcm1hdHRlZD1lLmV4dGVybmFsLHQuX2ZzUGF0aD1lLl9zZXA9PT1jP2UuZnNQYXRoOm51bGwsdH1yZXR1cm4gZX0sZyksYz1uPzE6dm9pZCAwLGQ9KHQobSxvPWgpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtLnByb3RvdHlwZSwiZnNQYXRoIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZzUGF0aHx8KHRoaXMuX2ZzUGF0aD15KHRoaXMsITEpKSx0aGlzLl9mc1BhdGh9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksbS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9dm9pZCAwPT09ZT8hMTplKT9iKHRoaXMsITApOih0aGlzLl9mb3JtYXR0ZWR8fCh0aGlzLl9mb3JtYXR0ZWQ9Yih0aGlzLCExKSksdGhpcy5fZm9ybWF0dGVkKX0sbS5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGU9eyRtaWQ6MX07cmV0dXJuIHRoaXMuX2ZzUGF0aCYmKGUuZnNQYXRoPXRoaXMuX2ZzUGF0aCxlLl9zZXA9YyksdGhpcy5fZm9ybWF0dGVkJiYoZS5leHRlcm5hbD10aGlzLl9mb3JtYXR0ZWQpLHRoaXMucGF0aCYmKGUucGF0aD10aGlzLnBhdGgpLHRoaXMuc2NoZW1lJiYoZS5zY2hlbWU9dGhpcy5zY2hlbWUpLHRoaXMuYXV0aG9yaXR5JiYoZS5hdXRob3JpdHk9dGhpcy5hdXRob3JpdHkpLHRoaXMucXVlcnkmJihlLnF1ZXJ5PXRoaXMucXVlcnkpLHRoaXMuZnJhZ21lbnQmJihlLmZyYWdtZW50PXRoaXMuZnJhZ21lbnQpLGV9LG0pLGY9KCh0PXt9KVs1OF09IiUzQSIsdFs0N109IiUyRiIsdFs2M109IiUzRiIsdFszNV09IiUyMyIsdFs5MV09IiU1QiIsdFs5M109IiU1RCIsdFs2NF09IiU0MCIsdFszM109IiUyMSIsdFszNl09IiUyNCIsdFszOF09IiUyNiIsdFszOV09IiUyNyIsdFs0MF09IiUyOCIsdFs0MV09IiUyOSIsdFs0Ml09IiUyQSIsdFs0M109IiUyQiIsdFs0NF09IiUyQyIsdFs1OV09IiUzQiIsdFs2MV09IiUzRCIsdFszMl09IiUyMCIsdCk7ZnVuY3Rpb24gbSgpe3ZhciBlPW51bGwhPT1vJiZvLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fZm9ybWF0dGVkPW51bGwsZS5fZnNQYXRoPW51bGwsZX1mdW5jdGlvbiBnKGUsdCxyLG4saSxvKXt2b2lkIDA9PT1vJiYobz0hMSksIm9iamVjdCI9PXR5cGVvZiBlPyh0aGlzLnNjaGVtZT1lLnNjaGVtZXx8IiIsdGhpcy5hdXRob3JpdHk9ZS5hdXRob3JpdHl8fCIiLHRoaXMucGF0aD1lLnBhdGh8fCIiLHRoaXMucXVlcnk9ZS5xdWVyeXx8IiIsdGhpcy5mcmFnbWVudD1lLmZyYWdtZW50fHwiIik6KHRoaXMuc2NoZW1lPWV8fG8/ZToiZmlsZSIsdGhpcy5hdXRob3JpdHk9dHx8IiIsdGhpcy5wYXRoPWZ1bmN0aW9uKGUsdCl7c3dpdGNoKGUpe2Nhc2UiaHR0cHMiOmNhc2UiaHR0cCI6Y2FzZSJmaWxlIjp0PyIvIiE9PXRbMF0mJih0PSIvIit0KTp0PSIvIn1yZXR1cm4gdH0odGhpcy5zY2hlbWUscnx8IiIpLHRoaXMucXVlcnk9bnx8IiIsdGhpcy5mcmFnbWVudD1pfHwiIixmdW5jdGlvbihlLHQpe2lmKCFlLnNjaGVtZSYmdCl0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IFNjaGVtZSBpcyBtaXNzaW5nOiB7c2NoZW1lOiAiIiwgYXV0aG9yaXR5OiAiJytlLmF1dGhvcml0eSsnIiwgcGF0aDogIicrZS5wYXRoKyciLCBxdWVyeTogIicrZS5xdWVyeSsnIiwgZnJhZ21lbnQ6ICInK2UuZnJhZ21lbnQrJyJ9Jyk7aWYoZS5zY2hlbWUmJiFzLnRlc3QoZS5zY2hlbWUpKXRocm93IG5ldyBFcnJvcigiW1VyaUVycm9yXTogU2NoZW1lIGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycy4iKTtpZihlLnBhdGgpaWYoZS5hdXRob3JpdHkpe2lmKCFhLnRlc3QoZS5wYXRoKSl0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGNvbnRhaW5zIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY29tcG9uZW50IG11c3QgZWl0aGVyIGJlIGVtcHR5IG9yIGJlZ2luIHdpdGggYSBzbGFzaCAoIi8iKSBjaGFyYWN0ZXInKX1lbHNlIGlmKGwudGVzdChlLnBhdGgpKXRocm93IG5ldyBFcnJvcignW1VyaUVycm9yXTogSWYgYSBVUkkgZG9lcyBub3QgY29udGFpbiBhbiBhdXRob3JpdHkgY29tcG9uZW50LCB0aGVuIHRoZSBwYXRoIGNhbm5vdCBiZWdpbiB3aXRoIHR3byBzbGFzaCBjaGFyYWN0ZXJzICgiLy8iKScpfSh0aGlzLG8pKX1mdW5jdGlvbiBwKGUsdCl7Zm9yKHZhciByPXZvaWQgMCxuPS0xLGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZS5jaGFyQ29kZUF0KGkpOzk3PD1vJiZvPD0xMjJ8fDY1PD1vJiZvPD05MHx8NDg8PW8mJm88PTU3fHw0NT09PW98fDQ2PT09b3x8OTU9PT1vfHwxMjY9PT1vfHx0JiY0Nz09PW8/KC0xIT09biYmKHIrPWVuY29kZVVSSUNvbXBvbmVudChlLnN1YnN0cmluZyhuLGkpKSxuPS0xKSx2b2lkIDAhPT1yJiYocis9ZS5jaGFyQXQoaSkpKToodm9pZCAwPT09ciYmKHI9ZS5zdWJzdHIoMCxpKSksdm9pZCAwIT09KG89ZltvXSk/KC0xIT09biYmKHIrPWVuY29kZVVSSUNvbXBvbmVudChlLnN1YnN0cmluZyhuLGkpKSxuPS0xKSxyKz1vKTotMT09PW4mJihuPWkpKX1yZXR1cm4tMSE9PW4mJihyKz1lbmNvZGVVUklDb21wb25lbnQoZS5zdWJzdHJpbmcobikpKSx2b2lkIDAhPT1yP3I6ZX1mdW5jdGlvbiB2KGUpe2Zvcih2YXIgdD12b2lkIDAscj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgbj1lLmNoYXJDb2RlQXQocik7MzU9PT1ufHw2Mz09PW4/KHZvaWQgMD09PXQmJih0PWUuc3Vic3RyKDAscikpLHQrPWZbbl0pOnZvaWQgMCE9PXQmJih0Kz1lW3JdKX1yZXR1cm4gdm9pZCAwIT09dD90OmV9ZnVuY3Rpb24geShlLHQpe2U9ZS5hdXRob3JpdHkmJjE8ZS5wYXRoLmxlbmd0aCYmImZpbGUiPT09ZS5zY2hlbWU/Ii8vIitlLmF1dGhvcml0eStlLnBhdGg6NDc9PT1lLnBhdGguY2hhckNvZGVBdCgwKSYmKDY1PD1lLnBhdGguY2hhckNvZGVBdCgxKSYmZS5wYXRoLmNoYXJDb2RlQXQoMSk8PTkwfHw5Nzw9ZS5wYXRoLmNoYXJDb2RlQXQoMSkmJmUucGF0aC5jaGFyQ29kZUF0KDEpPD0xMjIpJiY1OD09PWUucGF0aC5jaGFyQ29kZUF0KDIpP3Q/ZS5wYXRoLnN1YnN0cigxKTplLnBhdGhbMV0udG9Mb3dlckNhc2UoKStlLnBhdGguc3Vic3RyKDIpOmUucGF0aDtyZXR1cm4gZT1uP2UucmVwbGFjZSgvXC8vZywiXFwiKTplfWZ1bmN0aW9uIGIoZSx0KXt2YXIgcixuPXQ/djpwLGk9IiIsbz1lLnNjaGVtZSxzPWUuYXV0aG9yaXR5LGE9ZS5wYXRoLGw9ZS5xdWVyeSx1PWUuZnJhZ21lbnQ7cmV0dXJuIG8mJihpKz1vLGkrPSI6IiksIXMmJiJmaWxlIiE9PW98fChpKz0iLyIsaSs9Ii8iKSxzJiYoLTEhPT0oZT1zLmluZGV4T2YoIkAiKSkmJihvPXMuc3Vic3RyKDAsZSkscz1zLnN1YnN0cihlKzEpLC0xPT09KGU9by5pbmRleE9mKCI6IikpP2krPW4obywhMSk6KGkrPW4oby5zdWJzdHIoMCxlKSwhMSksaSs9IjoiLGkrPW4oby5zdWJzdHIoZSsxKSwhMSkpLGkrPSJAIiksLTE9PT0oZT0ocz1zLnRvTG93ZXJDYXNlKCkpLmluZGV4T2YoIjoiKSk/aSs9bihzLCExKTooaSs9bihzLnN1YnN0cigwLGUpLCExKSxpKz1zLnN1YnN0cihlKSkpLGEmJigzPD1hLmxlbmd0aCYmNDc9PT1hLmNoYXJDb2RlQXQoMCkmJjU4PT09YS5jaGFyQ29kZUF0KDIpPzY1PD0ocj1hLmNoYXJDb2RlQXQoMSkpJiZyPD05MCYmKGE9Ii8iK1N0cmluZy5mcm9tQ2hhckNvZGUociszMikrIjoiK2Euc3Vic3RyKDMpKToyPD1hLmxlbmd0aCYmNTg9PT1hLmNoYXJDb2RlQXQoMSkmJjY1PD0ocj1hLmNoYXJDb2RlQXQoMCkpJiZyPD05MCYmKGE9U3RyaW5nLmZyb21DaGFyQ29kZShyKzMyKSsiOiIrYS5zdWJzdHIoMikpLGkrPW4oYSwhMCkpLGwmJihpKz0iPyIsaSs9bihsLCExKSksdSYmKGkrPSIjIixpKz10P3U6cCh1LCExKSksaX12YXIgXz0vKCVbMC05QS1aYS16XVswLTlBLVphLXpdKSsvZztmdW5jdGlvbiBDKGUpe3JldHVybiBlLm1hdGNoKF8pP2UucmVwbGFjZShfLGZ1bmN0aW9uIHQocil7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQocil9Y2F0Y2goZSl7cmV0dXJuIDM8ci5sZW5ndGg/ci5zdWJzdHIoMCwzKSt0KHIuc3Vic3RyKDMpKTpyfX0pOmV9ZnVuY3Rpb24gUygpe2Zvcih2YXIgZT0wLHQ9MCxyPWFyZ3VtZW50cy5sZW5ndGg7dDxyO3QrKyllKz1hcmd1bWVudHNbdF0ubGVuZ3RoO2Zvcih2YXIgbj1BcnJheShlKSxpPTAsdD0wO3Q8cjt0KyspZm9yKHZhciBvPWFyZ3VtZW50c1t0XSxzPTAsYT1vLmxlbmd0aDtzPGE7cysrLGkrKyluW2ldPW9bc107cmV0dXJuIG59dmFyIHcscj1yKDQ3MCksQT1yLnBvc2l4fHxyOyhyPXc9d3x8e30pLmpvaW5QYXRoPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxyPTE7cjxhcmd1bWVudHMubGVuZ3RoO3IrKyl0W3ItMV09YXJndW1lbnRzW3JdO3JldHVybiBlLndpdGgoe3BhdGg6QS5qb2luLmFwcGx5KEEsUyhbZS5wYXRoXSx0KSl9KX0sci5yZXNvbHZlUGF0aD1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10scj0xO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspdFtyLTFdPWFyZ3VtZW50c1tyXTt2YXIgbj1lLnBhdGh8fCIvIjtyZXR1cm4gZS53aXRoKHtwYXRoOkEucmVzb2x2ZS5hcHBseShBLFMoW25dLHQpKX0pfSxyLmRpcm5hbWU9ZnVuY3Rpb24oZSl7dmFyIHQ9QS5kaXJuYW1lKGUucGF0aCk7cmV0dXJuIDE9PT10Lmxlbmd0aCYmNDY9PT10LmNoYXJDb2RlQXQoMCk/ZTplLndpdGgoe3BhdGg6dH0pfSxyLmJhc2VuYW1lPWZ1bmN0aW9uKGUpe3JldHVybiBBLmJhc2VuYW1lKGUucGF0aCl9LHIuZXh0bmFtZT1mdW5jdGlvbihlKXtyZXR1cm4gQS5leHRuYW1lKGUucGF0aCl9fX0sbWk9e30seWkuZD0oZSx0KT0+e2Zvcih2YXIgciBpbiB0KXlpLm8odCxyKSYmIXlpLm8oZSxyKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUscix7ZW51bWVyYWJsZTohMCxnZXQ6dFtyXX0pfSx5aS5vPShlLHQpPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KSx5aS5yPWU9PnsidW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLnRvU3RyaW5nVGFnJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxTeW1ib2wudG9TdHJpbmdUYWcse3ZhbHVlOiJNb2R1bGUifSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfTt2YXIgYmk9eWkoNDQ3KVsiVVJJIl07dmFyIF9pPVNuLENpPShTaS5wcm90b3R5cGUubWF0Y2hlc1BhdHRlcm49ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PSExLHI9MCxuPXRoaXMuZ2xvYldyYXBwZXJzO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdLG89aS5yZWdleHAsaT1pLmluY2x1ZGU7by50ZXN0KGUpJiYodD1pKX1yZXR1cm4gdH0sU2kucHJvdG90eXBlLmdldFVSSXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51cmlzfSxTaSk7ZnVuY3Rpb24gU2koZSx0KXt0aGlzLmdsb2JXcmFwcGVycz1bXTt0cnl7Zm9yKHZhciByPTAsbj1lO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdLG89IiEiIT09aVswXTswPChpPSFvP2kuc3Vic3RyaW5nKDEpOmkpLmxlbmd0aCYmKCIvIj09PWlbMF0mJihpPWkuc3Vic3RyaW5nKDEpKSx0aGlzLmdsb2JXcmFwcGVycy5wdXNoKHtyZWdleHA6ZnVuY3Rpb24oZSx0KXtpZigic3RyaW5nIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBzdHJpbmciKTtmb3IodmFyIHIsbj1TdHJpbmcoZSksaT0iIixvPSEhdCYmISF0LmV4dGVuZGVkLHM9ISF0JiYhIXQuZ2xvYnN0YXIsYT0hMSx0PXQmJiJzdHJpbmciPT10eXBlb2YgdC5mbGFncz90LmZsYWdzOiIiLGw9MCx1PW4ubGVuZ3RoO2w8dTtsKyspc3dpdGNoKHI9bltsXSl7Y2FzZSIvIjpjYXNlIiQiOmNhc2UiXiI6Y2FzZSIrIjpjYXNlIi4iOmNhc2UiKCI6Y2FzZSIpIjpjYXNlIj0iOmNhc2UiISI6Y2FzZSJ8IjppKz0iXFwiK3I7YnJlYWs7Y2FzZSI/IjppZihvKXtpKz0iLiI7YnJlYWt9Y2FzZSJbIjpjYXNlIl0iOmlmKG8pe2krPXI7YnJlYWt9Y2FzZSJ7IjppZihvKXthPSEwLGkrPSIoIjticmVha31jYXNlIn0iOmlmKG8pe2E9ITEsaSs9IikiO2JyZWFrfWNhc2UiLCI6aWYoYSl7aSs9InwiO2JyZWFrfWkrPSJcXCIrcjticmVhaztjYXNlIioiOmZvcih2YXIgaD1uW2wtMV0sYz0xOyIqIj09PW5bbCsxXTspYysrLGwrKzt2YXIgZD1uW2wrMV07cz8xPGMmJigiLyI9PT1ofHx2b2lkIDA9PT1ofHwieyI9PT1ofHwiLCI9PT1oKSYmKCIvIj09PWR8fHZvaWQgMD09PWR8fCIsIj09PWR8fCJ9Ij09PWQpPygiLyI9PT1kP2wrKzoiLyI9PT1oJiZpLmVuZHNXaXRoKCJcXC8iKSYmKGk9aS5zdWJzdHIoMCxpLmxlbmd0aC0yKSksaSs9IigoPzpbXi9dKig/Oi98JCkpKikiKTppKz0iKFteL10qKSI6aSs9Ii4qIjticmVhaztkZWZhdWx0OmkrPXJ9cmV0dXJuIHQmJn50LmluZGV4T2YoImciKXx8KGk9Il4iK2krIiQiKSxuZXcgUmVnRXhwKGksdCl9KCIqKi8iK2kse2V4dGVuZGVkOiEwLGdsb2JzdGFyOiEwfSksaW5jbHVkZTpvfSkpfXRoaXMudXJpcz10fWNhdGNoKGUpe3RoaXMuZ2xvYldyYXBwZXJzLmxlbmd0aD0wLHRoaXMudXJpcz1bXX19dmFyIHdpPShBaS5wcm90b3R5cGUuZ2V0VW5yZXNvbHZlZFNjaGVtYT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnVucmVzb2x2ZWRTY2hlbWF8fCh0aGlzLnVucmVzb2x2ZWRTY2hlbWE9dGhpcy5zZXJ2aWNlLmxvYWRTY2hlbWEodGhpcy51cmwpKSx0aGlzLnVucmVzb2x2ZWRTY2hlbWF9LEFpLnByb3RvdHlwZS5nZXRSZXNvbHZlZFNjaGVtYT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMucmVzb2x2ZWRTY2hlbWF8fCh0aGlzLnJlc29sdmVkU2NoZW1hPXRoaXMuZ2V0VW5yZXNvbHZlZFNjaGVtYSgpLnRoZW4oZnVuY3Rpb24oZSl7cmV0dXJuIHQuc2VydmljZS5yZXNvbHZlU2NoZW1hQ29udGVudChlLHQudXJsLHQuZGVwZW5kZW5jaWVzKX0pKSx0aGlzLnJlc29sdmVkU2NoZW1hfSxBaS5wcm90b3R5cGUuY2xlYXJTY2hlbWE9ZnVuY3Rpb24oKXt0aGlzLnJlc29sdmVkU2NoZW1hPXZvaWQgMCx0aGlzLnVucmVzb2x2ZWRTY2hlbWE9dm9pZCAwLHRoaXMuZGVwZW5kZW5jaWVzPXt9fSxBaSk7ZnVuY3Rpb24gQWkoZSx0LHIpe3RoaXMuc2VydmljZT1lLHRoaXMudXJsPXQsdGhpcy5kZXBlbmRlbmNpZXM9e30sciYmKHRoaXMudW5yZXNvbHZlZFNjaGVtYT10aGlzLnNlcnZpY2UucHJvbWlzZS5yZXNvbHZlKG5ldyB4aShyKSkpfXZhciB4aT1mdW5jdGlvbihlLHQpe3ZvaWQgMD09PXQmJih0PVtdKSx0aGlzLnNjaGVtYT1lLHRoaXMuZXJyb3JzPXR9LEVpPShOaS5wcm90b3R5cGUuZ2V0U2VjdGlvbj1mdW5jdGlvbihlKXtlPXRoaXMuZ2V0U2VjdGlvblJlY3Vyc2l2ZShlLHRoaXMuc2NoZW1hKTtpZihlKXJldHVybiBYbihlKX0sTmkucHJvdG90eXBlLmdldFNlY3Rpb25SZWN1cnNpdmU9ZnVuY3Rpb24oZSx0KXtpZighdHx8ImJvb2xlYW4iPT10eXBlb2YgdHx8MD09PWUubGVuZ3RoKXJldHVybiB0O3ZhciByPWUuc2hpZnQoKTtpZih0LnByb3BlcnRpZXMmJih0LnByb3BlcnRpZXNbcl0sMSkpcmV0dXJuIHRoaXMuZ2V0U2VjdGlvblJlY3Vyc2l2ZShlLHQucHJvcGVydGllc1tyXSk7aWYodC5wYXR0ZXJuUHJvcGVydGllcylmb3IodmFyIG49MCxpPU9iamVjdC5rZXlzKHQucGF0dGVyblByb3BlcnRpZXMpO248aS5sZW5ndGg7bisrKXt2YXIgbz1pW25dLHM9QnIobyk7aWYobnVsbCE9cyYmcy50ZXN0KHIpKXJldHVybiB0aGlzLmdldFNlY3Rpb25SZWN1cnNpdmUoZSx0LnBhdHRlcm5Qcm9wZXJ0aWVzW29dKX1lbHNle2lmKCJvYmplY3QiPT10eXBlb2YgdC5hZGRpdGlvbmFsUHJvcGVydGllcylyZXR1cm4gdGhpcy5nZXRTZWN0aW9uUmVjdXJzaXZlKGUsdC5hZGRpdGlvbmFsUHJvcGVydGllcyk7aWYoci5tYXRjaCgiWzAtOV0rIikpaWYoQXJyYXkuaXNBcnJheSh0Lml0ZW1zKSl7dmFyIGE9cGFyc2VJbnQociwxMCk7aWYoIWlzTmFOKGEpJiZ0Lml0ZW1zW2FdKXJldHVybiB0aGlzLmdldFNlY3Rpb25SZWN1cnNpdmUoZSx0Lml0ZW1zW2FdKX1lbHNlIGlmKHQuaXRlbXMpcmV0dXJuIHRoaXMuZ2V0U2VjdGlvblJlY3Vyc2l2ZShlLHQuaXRlbXMpfX0sTmkpO2Z1bmN0aW9uIE5pKGUsdCl7dm9pZCAwPT09dCYmKHQ9W10pLHRoaXMuc2NoZW1hPWUsdGhpcy5lcnJvcnM9dH12YXIgTGk9KGtpLnByb3RvdHlwZS5nZXRSZWdpc3RlcmVkU2NoZW1hSWRzPWZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3Qua2V5cyh0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzSWRzKS5maWx0ZXIoZnVuY3Rpb24oZSl7ZT1iaS5wYXJzZShlKS5zY2hlbWU7cmV0dXJuInNjaGVtYXNlcnZpY2UiIT09ZSYmKCF0fHx0KGUpKX0pfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoa2kucHJvdG90eXBlLCJwcm9taXNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvbWlzZUNvbnN0cnVjdG9yfSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLGtpLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7Zm9yKDswPHRoaXMuY2FsbE9uRGlzcG9zZS5sZW5ndGg7KXRoaXMuY2FsbE9uRGlzcG9zZS5wb3AoKSgpfSxraS5wcm90b3R5cGUub25SZXNvdXJjZUNoYW5nZT1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3RoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2U9dm9pZCAwO2Zvcih2YXIgcj0hMSxuPVtlPVRpKGUpXSxpPU9iamVjdC5rZXlzKHRoaXMuc2NoZW1hc0J5SWQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdC5zY2hlbWFzQnlJZFtlXX0pO24ubGVuZ3RoOylmb3IodmFyIG89bi5wb3AoKSxzPTA7czxpLmxlbmd0aDtzKyspe3ZhciBhPWlbc107YSYmKGEudXJsPT09b3x8YS5kZXBlbmRlbmNpZXNbb10pJiYoYS51cmwhPT1vJiZuLnB1c2goYS51cmwpLGEuY2xlYXJTY2hlbWEoKSxyPSEoaVtzXT12b2lkIDApKX1yZXR1cm4gcn0sa2kucHJvdG90eXBlLnNldFNjaGVtYUNvbnRyaWJ1dGlvbnM9ZnVuY3Rpb24oZSl7aWYoZS5zY2hlbWFzKXt2YXIgdCxyPWUuc2NoZW1hcztmb3IodCBpbiByKXt2YXIgbj1UaSh0KTt0aGlzLmNvbnRyaWJ1dGlvblNjaGVtYXNbbl09dGhpcy5hZGRTY2hlbWFIYW5kbGUobixyW3RdKX19aWYoQXJyYXkuaXNBcnJheShlLnNjaGVtYUFzc29jaWF0aW9ucykpZm9yKHZhciBpPTAsbz1lLnNjaGVtYUFzc29jaWF0aW9ucztpPG8ubGVuZ3RoO2krKyl7dmFyIHM9b1tpXSxhPXMudXJpcy5tYXAoVGkpLGE9dGhpcy5hZGRGaWxlUGF0dGVybkFzc29jaWF0aW9uKHMucGF0dGVybixhKTt0aGlzLmNvbnRyaWJ1dGlvbkFzc29jaWF0aW9ucy5wdXNoKGEpfX0sa2kucHJvdG90eXBlLmFkZFNjaGVtYUhhbmRsZT1mdW5jdGlvbihlLHQpe3Q9bmV3IHdpKHRoaXMsZSx0KTtyZXR1cm4gdGhpcy5zY2hlbWFzQnlJZFtlXT10fSxraS5wcm90b3R5cGUuZ2V0T3JBZGRTY2hlbWFIYW5kbGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5zY2hlbWFzQnlJZFtlXXx8dGhpcy5hZGRTY2hlbWFIYW5kbGUoZSx0KX0sa2kucHJvdG90eXBlLmFkZEZpbGVQYXR0ZXJuQXNzb2NpYXRpb249ZnVuY3Rpb24oZSx0KXt0PW5ldyBDaShlLHQpO3JldHVybiB0aGlzLmZpbGVQYXR0ZXJuQXNzb2NpYXRpb25zLnB1c2godCksdH0sa2kucHJvdG90eXBlLnJlZ2lzdGVyRXh0ZXJuYWxTY2hlbWE9ZnVuY3Rpb24oZSx0LHIpe2U9VGkoZSk7cmV0dXJuIHRoaXMucmVnaXN0ZXJlZFNjaGVtYXNJZHNbZV09ITAsdGhpcy5jYWNoZWRTY2hlbWFGb3JSZXNvdXJjZT12b2lkIDAsdCYmdGhpcy5hZGRGaWxlUGF0dGVybkFzc29jaWF0aW9uKHQsW2VdKSxyP3RoaXMuYWRkU2NoZW1hSGFuZGxlKGUscik6dGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZShlKX0sa2kucHJvdG90eXBlLmNsZWFyRXh0ZXJuYWxTY2hlbWFzPWZ1bmN0aW9uKCl7Zm9yKHZhciBlIGluIHRoaXMuc2NoZW1hc0J5SWQ9e30sdGhpcy5maWxlUGF0dGVybkFzc29jaWF0aW9ucz1bXSx0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzSWRzPXt9LHRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2U9dm9pZCAwLHRoaXMuY29udHJpYnV0aW9uU2NoZW1hcyl0aGlzLnNjaGVtYXNCeUlkW2VdPXRoaXMuY29udHJpYnV0aW9uU2NoZW1hc1tlXSx0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzSWRzW2VdPSEwO2Zvcih2YXIgdD0wLHI9dGhpcy5jb250cmlidXRpb25Bc3NvY2lhdGlvbnM7dDxyLmxlbmd0aDt0Kyspe3ZhciBuPXJbdF07dGhpcy5maWxlUGF0dGVybkFzc29jaWF0aW9ucy5wdXNoKG4pfX0sa2kucHJvdG90eXBlLmdldFJlc29sdmVkU2NoZW1hPWZ1bmN0aW9uKGUpe2U9VGkoZSksZT10aGlzLnNjaGVtYXNCeUlkW2VdO3JldHVybiBlP2UuZ2V0UmVzb2x2ZWRTY2hlbWEoKTp0aGlzLnByb21pc2UucmVzb2x2ZSh2b2lkIDApfSxraS5wcm90b3R5cGUubG9hZFNjaGVtYT1mdW5jdGlvbihyKXtpZih0aGlzLnJlcXVlc3RTZXJ2aWNlKXJldHVybiB0aGlzLnJlcXVlc3RTZXJ2aWNlKHIpLnRoZW4oZnVuY3Rpb24oZSl7aWYoIWUpe3ZhciB0PV9pKCJqc29uLnNjaGVtYS5ub2NvbnRlbnQiLCJVbmFibGUgdG8gbG9hZCBzY2hlbWEgZnJvbSAnezB9JzogTm8gY29udGVudC4iLE9pKHIpKTtyZXR1cm4gbmV3IHhpKHt9LFt0XSl9dD1bXSxlPUlyKGUsdCksdD10Lmxlbmd0aD9bX2koImpzb24uc2NoZW1hLmludmFsaWRGb3JtYXQiLCJVbmFibGUgdG8gcGFyc2UgY29udGVudCBmcm9tICd7MH0nOiBQYXJzZSBlcnJvciBhdCBvZmZzZXQgezF9LiIsT2kociksdFswXS5vZmZzZXQpXTpbXTtyZXR1cm4gbmV3IHhpKGUsdCl9LGZ1bmN0aW9uKGUpe3ZhciB0PWUudG9TdHJpbmcoKSxlPWUudG9TdHJpbmcoKS5zcGxpdCgiRXJyb3I6ICIpO3JldHVybiBxcih0PTE8ZS5sZW5ndGg/ZVsxXTp0LCIuIikmJih0PXQuc3Vic3RyKDAsdC5sZW5ndGgtMSkpLG5ldyB4aSh7fSxbX2koImpzb24uc2NoZW1hLm5vY29udGVudCIsIlVuYWJsZSB0byBsb2FkIHNjaGVtYSBmcm9tICd7MH0nOiB7MX0uIixPaShyKSx0KV0pfSk7dmFyIGU9X2koImpzb24uc2NoZW1hLm5vcmVxdWVzdHNlcnZpY2UiLCJVbmFibGUgdG8gbG9hZCBzY2hlbWEgZnJvbSAnezB9Jy4gTm8gc2NoZW1hIHJlcXVlc3Qgc2VydmljZSBhdmFpbGFibGUiLE9pKHIpKTtyZXR1cm4gdGhpcy5wcm9taXNlLnJlc29sdmUobmV3IHhpKHt9LFtlXSkpfSxraS5wcm90b3R5cGUucmVzb2x2ZVNjaGVtYUNvbnRlbnQ9ZnVuY3Rpb24oZSx0LHIpe3ZhciB1PXRoaXMsYT1lLmVycm9ycy5zbGljZSgwKSxuPWUuc2NoZW1hO2lmKG4uJHNjaGVtYSl7ZT1UaShuLiRzY2hlbWEpO2lmKCJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTAzL3NjaGVtYSI9PT1lKXJldHVybiB0aGlzLnByb21pc2UucmVzb2x2ZShuZXcgRWkoe30sW19pKCJqc29uLnNjaGVtYS5kcmFmdDAzLm5vdHN1cHBvcnRlZCIsIkRyYWZ0LTAzIHNjaGVtYXMgYXJlIG5vdCBzdXBwb3J0ZWQuIildKSk7Imh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMTktMDkvc2NoZW1hIj09PWUmJmEucHVzaChfaSgianNvbi5zY2hlbWEuZHJhZnQyMDE5MDkubm90c3VwcG9ydGVkIiwiRHJhZnQgMjAxOS0wOSBzY2hlbWFzIGFyZSBub3QgeWV0IGZ1bGx5IHN1cHBvcnRlZC4iKSl9dmFyIGw9dGhpcy5jb250ZXh0U2VydmljZSxzPWZ1bmN0aW9uKGUsdCl7aWYoIXQpcmV0dXJuIGU7dmFyIHI9ZTtyZXR1cm4odD0iLyI9PT10WzBdP3Quc3Vic3RyKDEpOnQpLnNwbGl0KCIvIikuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoL34xL2csIi8iKS5yZXBsYWNlKC9+MC9nLCJ+IiksIShyPXJbZV0pfSkscn0saD1mdW5jdGlvbihlLHQscixuKXt2YXIgbj1uP2RlY29kZVVSSUNvbXBvbmVudChuKTp2b2lkIDAsaT1zKHQsbik7aWYoaSlmb3IodmFyIG8gaW4gaSlpLmhhc093blByb3BlcnR5KG8pJiYhZS5oYXNPd25Qcm9wZXJ0eShvKSYmKGVbb109aVtvXSk7ZWxzZSBhLnB1c2goX2koImpzb24uc2NoZW1hLmludmFsaWRyZWYiLCIkcmVmICd7MH0nIGluICd7MX0nIGNhbiBub3QgYmUgcmVzb2x2ZWQuIixuLHIpKX0sYz1mdW5jdGlvbihyLG4saSxlLG8pe249VGkobj1sJiYhL15bQS1aYS16XVtBLVphLXowLTkrXC0uK10qOlwvXC8uKi8udGVzdChuKT9sLnJlc29sdmVSZWxhdGl2ZVBhdGgobixlKTpuKTt2YXIgcz11LmdldE9yQWRkU2NoZW1hSGFuZGxlKG4pO3JldHVybiBzLmdldFVucmVzb2x2ZWRTY2hlbWEoKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiBvW25dPSEwLGUuZXJyb3JzLmxlbmd0aCYmKHQ9aT9uKyIjIitpOm4sYS5wdXNoKF9pKCJqc29uLnNjaGVtYS5wcm9ibGVtbG9hZGluZ3JlZiIsIlByb2JsZW1zIGxvYWRpbmcgcmVmZXJlbmNlICd7MH0nOiB7MX0iLHQsZS5lcnJvcnNbMF0pKSksaChyLGUuc2NoZW1hLG4saSksZChyLGUuc2NoZW1hLG4scy5kZXBlbmRlbmNpZXMpfSl9LGQ9ZnVuY3Rpb24oZSxpLG8scyl7aWYoIWV8fCJvYmplY3QiIT10eXBlb2YgZSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO2Zvcih2YXIgbD1bZV0sdD1bXSxhPVtdLHI9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PVtdO2UuJHJlZjspe3ZhciByPWUuJHJlZixuPXIuc3BsaXQoIiMiLDIpO2lmKGRlbGV0ZSBlLiRyZWYsMDxuWzBdLmxlbmd0aClyZXR1cm4gdm9pZCBhLnB1c2goYyhlLG5bMF0sblsxXSxvLHMpKTstMT09PXQuaW5kZXhPZihyKSYmKGgoZSxpLG8sblsxXSksdC5wdXNoKHIpKX0hZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07Zm9yKHZhciByPTAsbj1lO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdOyJvYmplY3QiPT10eXBlb2YgaSYmbC5wdXNoKGkpfX0oZS5pdGVtcyxlLmFkZGl0aW9uYWxJdGVtcyxlLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLGUubm90LGUuY29udGFpbnMsZS5wcm9wZXJ0eU5hbWVzLGUuaWYsZS50aGVuLGUuZWxzZSksZnVuY3Rpb24oKXtmb3IodmFyIGU9W10sdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspZVt0XT1hcmd1bWVudHNbdF07Zm9yKHZhciByPTAsbj1lO3I8bi5sZW5ndGg7cisrKXt2YXIgaT1uW3JdO2lmKCJvYmplY3QiPT10eXBlb2YgaSlmb3IodmFyIG8gaW4gaSl7bz1pW29dOyJvYmplY3QiPT10eXBlb2YgbyYmbC5wdXNoKG8pfX19KGUuZGVmaW5pdGlvbnMsZS5wcm9wZXJ0aWVzLGUucGF0dGVyblByb3BlcnRpZXMsZS5kZXBlbmRlbmNpZXMpLGZ1bmN0aW9uKCl7Zm9yKHZhciBlPVtdLHQ9MDt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKWVbdF09YXJndW1lbnRzW3RdO2Zvcih2YXIgcj0wLG49ZTtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpZihBcnJheS5pc0FycmF5KGkpKWZvcih2YXIgbz0wLHM9aTtvPHMubGVuZ3RoO28rKyl7dmFyIGE9c1tvXTsib2JqZWN0Ij09dHlwZW9mIGEmJmwucHVzaChhKX19fShlLmFueU9mLGUuYWxsT2YsZS5vbmVPZixlLml0ZW1zKX07bC5sZW5ndGg7KXt2YXIgbj1sLnBvcCgpOzA8PXQuaW5kZXhPZihuKXx8KHQucHVzaChuKSxyKG4pKX1yZXR1cm4gdS5wcm9taXNlLmFsbChhKX07cmV0dXJuIGQobixuLHQscikudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gbmV3IEVpKG4sYSl9KX0sa2kucHJvdG90eXBlLmdldFNjaGVtYUZvclJlc291cmNlPWZ1bmN0aW9uKGUsdCl7aWYodCYmdC5yb290JiYib2JqZWN0Ij09PXQucm9vdC50eXBlKXt0PXQucm9vdC5wcm9wZXJ0aWVzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4iJHNjaGVtYSI9PT1lLmtleU5vZGUudmFsdWUmJmUudmFsdWVOb2RlJiYic3RyaW5nIj09PWUudmFsdWVOb2RlLnR5cGV9KTtpZigwPHQubGVuZ3RoKXt0PXRbMF0udmFsdWVOb2RlO2lmKHQmJiJzdHJpbmciPT09dC50eXBlKXt0PW5pKHQpO2lmKHQ9dCYmVXIodCwiLiIpJiZ0aGlzLmNvbnRleHRTZXJ2aWNlP3RoaXMuY29udGV4dFNlcnZpY2UucmVzb2x2ZVJlbGF0aXZlUGF0aCh0LGUpOnQpe3ZhciByPVRpKHQpO3JldHVybiB0aGlzLmdldE9yQWRkU2NoZW1hSGFuZGxlKHIpLmdldFJlc29sdmVkU2NoZW1hKCl9fX19aWYodGhpcy5jYWNoZWRTY2hlbWFGb3JSZXNvdXJjZSYmdGhpcy5jYWNoZWRTY2hlbWFGb3JSZXNvdXJjZS5yZXNvdXJjZT09PWUpcmV0dXJuIHRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2UucmVzb2x2ZWRTY2hlbWE7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksaT1bXSxvPWZ1bmN0aW9uKHQpe3RyeXtyZXR1cm4gYmkucGFyc2UodCkud2l0aCh7ZnJhZ21lbnQ6bnVsbCxxdWVyeTpudWxsfSkudG9TdHJpbmcoKX1jYXRjaChlKXtyZXR1cm4gdH19KGUpLHM9MCxhPXRoaXMuZmlsZVBhdHRlcm5Bc3NvY2lhdGlvbnM7czxhLmxlbmd0aDtzKyspe3ZhciBsPWFbc107aWYobC5tYXRjaGVzUGF0dGVybihvKSlmb3IodmFyIHU9MCxoPWwuZ2V0VVJJcygpO3U8aC5sZW5ndGg7dSsrKXt2YXIgYz1oW3VdO25bY118fChpLnB1c2goYyksbltjXT0hMCl9fXI9MDxpLmxlbmd0aD90aGlzLmNyZWF0ZUNvbWJpbmVkU2NoZW1hKGUsaSkuZ2V0UmVzb2x2ZWRTY2hlbWEoKTp0aGlzLnByb21pc2UucmVzb2x2ZSh2b2lkIDApO3JldHVybiB0aGlzLmNhY2hlZFNjaGVtYUZvclJlc291cmNlPXtyZXNvdXJjZTplLHJlc29sdmVkU2NoZW1hOnJ9LHJ9LGtpLnByb3RvdHlwZS5jcmVhdGVDb21iaW5lZFNjaGVtYT1mdW5jdGlvbihlLHQpe2lmKDE9PT10Lmxlbmd0aClyZXR1cm4gdGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZSh0WzBdKTtlPSJzY2hlbWFzZXJ2aWNlOi8vY29tYmluZWRTY2hlbWEvIitlbmNvZGVVUklDb21wb25lbnQoZSksdD17YWxsT2Y6dC5tYXAoZnVuY3Rpb24oZSl7cmV0dXJueyRyZWY6ZX19KX07cmV0dXJuIHRoaXMuYWRkU2NoZW1hSGFuZGxlKGUsdCl9LGtpLnByb3RvdHlwZS5nZXRNYXRjaGluZ1NjaGVtYXM9ZnVuY3Rpb24oZSx0LHIpe2lmKHIpe3ZhciBuPXIuaWR8fCJzY2hlbWFzZXJ2aWNlOi8vdW50aXRsZWQvbWF0Y2hpbmdTY2hlbWFzLyIrTWkrKztyZXR1cm4gdGhpcy5yZXNvbHZlU2NoZW1hQ29udGVudChuZXcgeGkociksbix7fSkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gdC5nZXRNYXRjaGluZ1NjaGVtYXMoZS5zY2hlbWEpLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5pbnZlcnRlZH0pfSl9cmV0dXJuIHRoaXMuZ2V0U2NoZW1hRm9yUmVzb3VyY2UoZS51cmksdCkudGhlbihmdW5jdGlvbihlKXtyZXR1cm4gZT90LmdldE1hdGNoaW5nU2NoZW1hcyhlLnNjaGVtYSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFlLmludmVydGVkfSk6W119KX0sa2kpO2Z1bmN0aW9uIGtpKGUsdCxyKXt0aGlzLmNvbnRleHRTZXJ2aWNlPXQsdGhpcy5yZXF1ZXN0U2VydmljZT1lLHRoaXMucHJvbWlzZUNvbnN0cnVjdG9yPXJ8fFByb21pc2UsdGhpcy5jYWxsT25EaXNwb3NlPVtdLHRoaXMuY29udHJpYnV0aW9uU2NoZW1hcz17fSx0aGlzLmNvbnRyaWJ1dGlvbkFzc29jaWF0aW9ucz1bXSx0aGlzLnNjaGVtYXNCeUlkPXt9LHRoaXMuZmlsZVBhdHRlcm5Bc3NvY2lhdGlvbnM9W10sdGhpcy5yZWdpc3RlcmVkU2NoZW1hc0lkcz17fX12YXIgTWk9MDtmdW5jdGlvbiBUaSh0KXt0cnl7cmV0dXJuIGJpLnBhcnNlKHQpLnRvU3RyaW5nKCl9Y2F0Y2goZSl7cmV0dXJuIHR9fWZ1bmN0aW9uIE9pKGUpe3RyeXt2YXIgdD1iaS5wYXJzZShlKTtpZigiZmlsZSI9PT10LnNjaGVtZSlyZXR1cm4gdC5mc1BhdGh9Y2F0Y2goZSl7fXJldHVybiBlfXZhciBJaT1TbixQaT0oVmkucHJvdG90eXBlLmNvbmZpZ3VyZT1mdW5jdGlvbihlKXtlJiYodGhpcy52YWxpZGF0aW9uRW5hYmxlZD0hMSE9PWUudmFsaWRhdGUsdGhpcy5jb21tZW50U2V2ZXJpdHk9ZS5hbGxvd0NvbW1lbnRzP3ZvaWQgMDpici5FcnJvcil9LFZpLnByb3RvdHlwZS5kb1ZhbGlkYXRpb249ZnVuY3Rpb24oYyxkLGYsZSl7dmFyIG09dGhpcztpZighdGhpcy52YWxpZGF0aW9uRW5hYmxlZClyZXR1cm4gdGhpcy5wcm9taXNlLnJlc29sdmUoW10pO2Z1bmN0aW9uIHQoZSl7dmFyIHQscixuPW51bGwhPWYmJmYudHJhaWxpbmdDb21tYXM/RGkoZi50cmFpbGluZ0NvbW1hcyk6YnIuRXJyb3IsaT1udWxsIT1mJiZmLmNvbW1lbnRzP0RpKGYuY29tbWVudHMpOm0uY29tbWVudFNldmVyaXR5LG89bnVsbCE9ZiYmZi5zY2hlbWFWYWxpZGF0aW9uP0RpKGYuc2NoZW1hVmFsaWRhdGlvbik6YnIuV2FybmluZyxzPW51bGwhPWYmJmYuc2NoZW1hUmVxdWVzdD9EaShmLnNjaGVtYVJlcXVlc3QpOmJyLldhcm5pbmc7ZSYmKGUuZXJyb3JzLmxlbmd0aCYmZC5yb290JiZzPyhyPSh0PSJvYmplY3QiPT09KHI9ZC5yb290KS50eXBlP3IucHJvcGVydGllc1swXTp2b2lkIDApJiYiJHNjaGVtYSI9PT10LmtleU5vZGUudmFsdWU/KHQ9dC52YWx1ZU5vZGV8fHQsbXIuY3JlYXRlKGMucG9zaXRpb25BdCh0Lm9mZnNldCksYy5wb3NpdGlvbkF0KHQub2Zmc2V0K3QubGVuZ3RoKSkpOm1yLmNyZWF0ZShjLnBvc2l0aW9uQXQoci5vZmZzZXQpLGMucG9zaXRpb25BdChyLm9mZnNldCsxKSkscChDci5jcmVhdGUocixlLmVycm9yc1swXSxzLHBuLlNjaGVtYVJlc29sdmVFcnJvcikpKTohb3x8KG89ZC52YWxpZGF0ZShjLGUuc2NoZW1hLG8pKSYmby5mb3JFYWNoKHApLGZ1bmN0aW9uIGUodCl7aWYodCYmIm9iamVjdCI9PXR5cGVvZiB0KXtpZihqcih0LmFsbG93Q29tbWVudHMpKXJldHVybiB0LmFsbG93Q29tbWVudHM7aWYodC5hbGxPZilmb3IodmFyIHI9MCxuPXQuYWxsT2Y7cjxuLmxlbmd0aDtyKyspe3ZhciBpPW5bcl0saT1lKGkpO2lmKGpyKGkpKXJldHVybiBpfX1yZXR1cm59KGUuc2NoZW1hKSYmKGk9dm9pZCAwKSxmdW5jdGlvbiBlKHQpe2lmKHQmJiJvYmplY3QiPT10eXBlb2YgdCl7aWYoanIodC5hbGxvd1RyYWlsaW5nQ29tbWFzKSlyZXR1cm4gdC5hbGxvd1RyYWlsaW5nQ29tbWFzO3ZhciByPXQ7aWYoanIoci5hbGxvd3NUcmFpbGluZ0NvbW1hcykpcmV0dXJuIHIuYWxsb3dzVHJhaWxpbmdDb21tYXM7aWYodC5hbGxPZilmb3IodmFyIG49MCxpPXQuYWxsT2Y7bjxpLmxlbmd0aDtuKyspe3ZhciBvPWlbbl0sbz1lKG8pO2lmKGpyKG8pKXJldHVybiBvfX1yZXR1cm59KGUuc2NoZW1hKSYmKG49dm9pZCAwKSk7Zm9yKHZhciBhLGw9MCx1PWQuc3ludGF4RXJyb3JzO2w8dS5sZW5ndGg7bCsrKXt2YXIgaD11W2xdO2lmKGguY29kZT09PXBuLlRyYWlsaW5nQ29tbWEpe2lmKCJudW1iZXIiIT10eXBlb2Ygbiljb250aW51ZTtoLnNldmVyaXR5PW59cChoKX1yZXR1cm4ibnVtYmVyIj09dHlwZW9mIGkmJihhPUlpKCJJbnZhbGlkQ29tbWVudFRva2VuIiwiQ29tbWVudHMgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gSlNPTi4iKSxkLmNvbW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7cChDci5jcmVhdGUoZSxhLGkscG4uQ29tbWVudE5vdFBlcm1pdHRlZCkpfSkpLGd9dmFyIGc9W10scj17fSxwPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmFuZ2Uuc3RhcnQubGluZSsiICIrZS5yYW5nZS5zdGFydC5jaGFyYWN0ZXIrIiAiK2UubWVzc2FnZTtyW3RdfHwoclt0XT0hMCxnLnB1c2goZSkpfTtpZihlKXt2YXIgbj1lLmlkfHwic2NoZW1hc2VydmljZTovL3VudGl0bGVkLyIrUmkrKztyZXR1cm4gdGhpcy5qc29uU2NoZW1hU2VydmljZS5yZXNvbHZlU2NoZW1hQ29udGVudChuZXcgeGkoZSksbix7fSkudGhlbih0KX1yZXR1cm4gdGhpcy5qc29uU2NoZW1hU2VydmljZS5nZXRTY2hlbWFGb3JSZXNvdXJjZShjLnVyaSxkKS50aGVuKHQpfSxWaSk7ZnVuY3Rpb24gVmkoZSx0KXt0aGlzLmpzb25TY2hlbWFTZXJ2aWNlPWUsdGhpcy5wcm9taXNlPXQsdGhpcy52YWxpZGF0aW9uRW5hYmxlZD0hMH12YXIgUmk9MDtmdW5jdGlvbiBEaShlKXtzd2l0Y2goZSl7Y2FzZSJlcnJvciI6cmV0dXJuIGJyLkVycm9yO2Nhc2Uid2FybmluZyI6cmV0dXJuIGJyLldhcm5pbmc7Y2FzZSJpZ25vcmUiOnJldHVybn19dmFyIEZpPTQ4LEtpPTU3LGppPTY1LFVpPTk3LHFpPTEwMjtmdW5jdGlvbiBCaShlKXtyZXR1cm4gZTxGaT8wOmU8PUtpP2UtRmk6KGU8VWkmJihlKz1VaS1qaSksVWk8PWUmJmU8PXFpP2UtVWkrMTA6MCl9dmFyICRpPShXaS5wcm90b3R5cGUuZmluZERvY3VtZW50U3ltYm9scz1mdW5jdGlvbihvLGUsdCl7dmFyIHM9dGhpczt2b2lkIDA9PT10JiYodD17cmVzdWx0TGltaXQ6TnVtYmVyLk1BWF9WQUxVRX0pO2U9ZS5yb290O2lmKCFlKXJldHVybltdO3ZhciBhPXQucmVzdWx0TGltaXR8fE51bWJlci5NQVhfVkFMVUUscj1vLnVyaTtpZigoInZzY29kZTovL2RlZmF1bHRzZXR0aW5ncy9rZXliaW5kaW5ncy5qc29uIj09PXJ8fHFyKHIudG9Mb3dlckNhc2UoKSwiL3VzZXIva2V5YmluZGluZ3MuanNvbiIpKSYmImFycmF5Ij09PWUudHlwZSl7Zm9yKHZhciBuPVtdLGk9MCxsPWUuaXRlbXM7aTxsLmxlbmd0aDtpKyspe3ZhciB1PWxbaV07aWYoIm9iamVjdCI9PT11LnR5cGUpZm9yKHZhciBoPTAsYz11LnByb3BlcnRpZXM7aDxjLmxlbmd0aDtoKyspe3ZhciBkPWNbaF07aWYoImtleSI9PT1kLmtleU5vZGUudmFsdWUmJmQudmFsdWVOb2RlKXt2YXIgZj1nci5jcmVhdGUoby51cmksSGkobyx1KSk7aWYobi5wdXNoKHtuYW1lOm5pKGQudmFsdWVOb2RlKSxraW5kOnNuLkZ1bmN0aW9uLGxvY2F0aW9uOmZ9KSwtLWE8PTApcmV0dXJuIHQmJnQub25SZXN1bHRMaW1pdEV4Y2VlZGVkJiZ0Lm9uUmVzdWx0TGltaXRFeGNlZWRlZChyKSxufX19cmV0dXJuIG59Zm9yKHZhciBtPVt7bm9kZTplLGNvbnRhaW5lck5hbWU6IiJ9XSxnPTAscD0hMSx2PVtdO2c8bS5sZW5ndGg7KXt2YXIgeT1tW2crK107IWZ1bmN0aW9uKGUsaSl7ImFycmF5Ij09PWUudHlwZT9lLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oZSl7ZSYmbS5wdXNoKHtub2RlOmUsY29udGFpbmVyTmFtZTppfSl9KToib2JqZWN0Ij09PWUudHlwZSYmZS5wcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQscixuPWUudmFsdWVOb2RlO24mJigwPGE/KGEtLSx0PWdyLmNyZWF0ZShvLnVyaSxIaShvLGUpKSxyPWk/aSsiLiIrZS5rZXlOb2RlLnZhbHVlOmUua2V5Tm9kZS52YWx1ZSx2LnB1c2goe25hbWU6cy5nZXRLZXlMYWJlbChlKSxraW5kOnMuZ2V0U3ltYm9sS2luZChuLnR5cGUpLGxvY2F0aW9uOnQsY29udGFpbmVyTmFtZTppfSksbS5wdXNoKHtub2RlOm4sY29udGFpbmVyTmFtZTpyfSkpOnA9ITApfSl9KHkubm9kZSx5LmNvbnRhaW5lck5hbWUpfXJldHVybiBwJiZ0JiZ0Lm9uUmVzdWx0TGltaXRFeGNlZWRlZCYmdC5vblJlc3VsdExpbWl0RXhjZWVkZWQociksdn0sV2kucHJvdG90eXBlLmZpbmREb2N1bWVudFN5bWJvbHMyPWZ1bmN0aW9uKHMsZSx0KXt2YXIgYT10aGlzO3ZvaWQgMD09PXQmJih0PXtyZXN1bHRMaW1pdDpOdW1iZXIuTUFYX1ZBTFVFfSk7dmFyIHI9ZS5yb290O2lmKCFyKXJldHVybltdO3ZhciBsPXQucmVzdWx0TGltaXR8fE51bWJlci5NQVhfVkFMVUUsbj1zLnVyaTtpZigoInZzY29kZTovL2RlZmF1bHRzZXR0aW5ncy9rZXliaW5kaW5ncy5qc29uIj09PW58fHFyKG4udG9Mb3dlckNhc2UoKSwiL3VzZXIva2V5YmluZGluZ3MuanNvbiIpKSYmImFycmF5Ij09PXIudHlwZSl7Zm9yKHZhciBpPVtdLG89MCx1PXIuaXRlbXM7bzx1Lmxlbmd0aDtvKyspe3ZhciBoPXVbb107aWYoIm9iamVjdCI9PT1oLnR5cGUpZm9yKHZhciBjPTAsZD1oLnByb3BlcnRpZXM7YzxkLmxlbmd0aDtjKyspe3ZhciBmPWRbY107aWYoImtleSI9PT1mLmtleU5vZGUudmFsdWUmJmYudmFsdWVOb2RlKXt2YXIgbT1IaShzLGgpLGc9SGkocyxmLmtleU5vZGUpO2lmKGkucHVzaCh7bmFtZTpuaShmLnZhbHVlTm9kZSksa2luZDpzbi5GdW5jdGlvbixyYW5nZTptLHNlbGVjdGlvblJhbmdlOmd9KSwtLWw8PTApcmV0dXJuIHQmJnQub25SZXN1bHRMaW1pdEV4Y2VlZGVkJiZ0Lm9uUmVzdWx0TGltaXRFeGNlZWRlZChuKSxpfX19cmV0dXJuIGl9Zm9yKHZhciBlPVtdLHA9W3tub2RlOnIscmVzdWx0OmV9XSx2PTAseT0hMTt2PHAubGVuZ3RoOyl7dmFyIGI9cFt2KytdOyFmdW5jdGlvbihlLG8peyJhcnJheSI9PT1lLnR5cGU/ZS5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGUsdCl7dmFyIHIsbjtlJiYoMDxsPyhsLS0sbj1yPUhpKHMsZSksbj17bmFtZTpTdHJpbmcodCksa2luZDphLmdldFN5bWJvbEtpbmQoZS50eXBlKSxyYW5nZTpyLHNlbGVjdGlvblJhbmdlOm4sY2hpbGRyZW46W119LG8ucHVzaChuKSxwLnB1c2goe3Jlc3VsdDpuLmNoaWxkcmVuLG5vZGU6ZX0pKTp5PSEwKX0pOiJvYmplY3QiPT09ZS50eXBlJiZlLnByb3BlcnRpZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdCxyLG4saT1lLnZhbHVlTm9kZTtpJiYoMDxsPyhsLS0sdD1IaShzLGUpLG49SGkocyxlLmtleU5vZGUpLHI9W10sbj17bmFtZTphLmdldEtleUxhYmVsKGUpLGtpbmQ6YS5nZXRTeW1ib2xLaW5kKGkudHlwZSkscmFuZ2U6dCxzZWxlY3Rpb25SYW5nZTpuLGNoaWxkcmVuOnIsZGV0YWlsOmEuZ2V0RGV0YWlsKGkpfSxvLnB1c2gobikscC5wdXNoKHtyZXN1bHQ6cixub2RlOml9KSk6eT0hMCl9KX0oYi5ub2RlLGIucmVzdWx0KX1yZXR1cm4geSYmdCYmdC5vblJlc3VsdExpbWl0RXhjZWVkZWQmJnQub25SZXN1bHRMaW1pdEV4Y2VlZGVkKG4pLGV9LFdpLnByb3RvdHlwZS5nZXRTeW1ib2xLaW5kPWZ1bmN0aW9uKGUpe3N3aXRjaChlKXtjYXNlIm9iamVjdCI6cmV0dXJuIHNuLk1vZHVsZTtjYXNlInN0cmluZyI6cmV0dXJuIHNuLlN0cmluZztjYXNlIm51bWJlciI6cmV0dXJuIHNuLk51bWJlcjtjYXNlImFycmF5IjpyZXR1cm4gc24uQXJyYXk7Y2FzZSJib29sZWFuIjpyZXR1cm4gc24uQm9vbGVhbjtkZWZhdWx0OnJldHVybiBzbi5WYXJpYWJsZX19LFdpLnByb3RvdHlwZS5nZXRLZXlMYWJlbD1mdW5jdGlvbihlKXt2YXIgZT1lLmtleU5vZGUudmFsdWU7cmV0dXJuKGU9ZSYmZS5yZXBsYWNlKC9bXG5dL2csIuKGtSIpKSYmZS50cmltKCk/ZTonIicrZSsnIid9LFdpLnByb3RvdHlwZS5nZXREZXRhaWw9ZnVuY3Rpb24oZSl7aWYoZSlyZXR1cm4iYm9vbGVhbiI9PT1lLnR5cGV8fCJudW1iZXIiPT09ZS50eXBlfHwibnVsbCI9PT1lLnR5cGV8fCJzdHJpbmciPT09ZS50eXBlP1N0cmluZyhlLnZhbHVlKToiYXJyYXkiPT09ZS50eXBlP2UuY2hpbGRyZW4ubGVuZ3RoP3ZvaWQgMDoiW10iOiJvYmplY3QiIT09ZS50eXBlfHxlLmNoaWxkcmVuLmxlbmd0aD92b2lkIDA6Int9In0sV2kucHJvdG90eXBlLmZpbmREb2N1bWVudENvbG9ycz1mdW5jdGlvbih1LGgsYyl7cmV0dXJuIHRoaXMuc2NoZW1hU2VydmljZS5nZXRTY2hlbWFGb3JSZXNvdXJjZSh1LnVyaSxoKS50aGVuKGZ1bmN0aW9uKGUpe3ZhciB0PVtdO2lmKGUpZm9yKHZhciByPWMmJiJudW1iZXIiPT10eXBlb2YgYy5yZXN1bHRMaW1pdD9jLnJlc3VsdExpbWl0Ok51bWJlci5NQVhfVkFMVUUsbj17fSxpPTAsbz1oLmdldE1hdGNoaW5nU2NoZW1hcyhlLnNjaGVtYSk7aTxvLmxlbmd0aDtpKyspe3ZhciBzPW9baV07aWYoIXMuaW52ZXJ0ZWQmJnMuc2NoZW1hJiYoImNvbG9yIj09PXMuc2NoZW1hLmZvcm1hdHx8ImNvbG9yLWhleCI9PT1zLnNjaGVtYS5mb3JtYXQpJiZzLm5vZGUmJiJzdHJpbmciPT09cy5ub2RlLnR5cGUpe3ZhciBhPVN0cmluZyhzLm5vZGUub2Zmc2V0KTtpZighblthXSl7dmFyIGw9ZnVuY3Rpb24oZSl7aWYoIiMiPT09ZVswXSlzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgNDpyZXR1cm57cmVkOjE3KkJpKGUuY2hhckNvZGVBdCgxKSkvMjU1LGdyZWVuOjE3KkJpKGUuY2hhckNvZGVBdCgyKSkvMjU1LGJsdWU6MTcqQmkoZS5jaGFyQ29kZUF0KDMpKS8yNTUsYWxwaGE6MX07Y2FzZSA1OnJldHVybntyZWQ6MTcqQmkoZS5jaGFyQ29kZUF0KDEpKS8yNTUsZ3JlZW46MTcqQmkoZS5jaGFyQ29kZUF0KDIpKS8yNTUsYmx1ZToxNypCaShlLmNoYXJDb2RlQXQoMykpLzI1NSxhbHBoYToxNypCaShlLmNoYXJDb2RlQXQoNCkpLzI1NX07Y2FzZSA3OnJldHVybntyZWQ6KDE2KkJpKGUuY2hhckNvZGVBdCgxKSkrQmkoZS5jaGFyQ29kZUF0KDIpKSkvMjU1LGdyZWVuOigxNipCaShlLmNoYXJDb2RlQXQoMykpK0JpKGUuY2hhckNvZGVBdCg0KSkpLzI1NSxibHVlOigxNipCaShlLmNoYXJDb2RlQXQoNSkpK0JpKGUuY2hhckNvZGVBdCg2KSkpLzI1NSxhbHBoYToxfTtjYXNlIDk6cmV0dXJue3JlZDooMTYqQmkoZS5jaGFyQ29kZUF0KDEpKStCaShlLmNoYXJDb2RlQXQoMikpKS8yNTUsZ3JlZW46KDE2KkJpKGUuY2hhckNvZGVBdCgzKSkrQmkoZS5jaGFyQ29kZUF0KDQpKSkvMjU1LGJsdWU6KDE2KkJpKGUuY2hhckNvZGVBdCg1KSkrQmkoZS5jaGFyQ29kZUF0KDYpKSkvMjU1LGFscGhhOigxNipCaShlLmNoYXJDb2RlQXQoNykpK0JpKGUuY2hhckNvZGVBdCg4KSkpLzI1NX19fShuaShzLm5vZGUpKTtpZihsJiYocz1IaSh1LHMubm9kZSksdC5wdXNoKHtjb2xvcjpsLHJhbmdlOnN9KSksblthXT0hMCwtLXI8PTApcmV0dXJuIGMmJmMub25SZXN1bHRMaW1pdEV4Y2VlZGVkJiZjLm9uUmVzdWx0TGltaXRFeGNlZWRlZCh1LnVyaSksdH19fXJldHVybiB0fSl9LFdpLnByb3RvdHlwZS5nZXRDb2xvclByZXNlbnRhdGlvbnM9ZnVuY3Rpb24oZSx0LHIsbil7dmFyIGk9W10sbz1NYXRoLnJvdW5kKDI1NSpyLnJlZCkscz1NYXRoLnJvdW5kKDI1NSpyLmdyZWVuKSxhPU1hdGgucm91bmQoMjU1KnIuYmx1ZSk7ZnVuY3Rpb24gbChlKXtlPWUudG9TdHJpbmcoMTYpO3JldHVybiAyIT09ZS5sZW5ndGg/IjAiK2U6ZX1yZXR1cm4gcj0xPT09ci5hbHBoYT8iIyIrbChvKStsKHMpK2woYSk6IiMiK2wobykrbChzKStsKGEpK2woTWF0aC5yb3VuZCgyNTUqci5hbHBoYSkpLGkucHVzaCh7bGFiZWw6cix0ZXh0RWRpdDp3ci5yZXBsYWNlKG4sSlNPTi5zdHJpbmdpZnkocikpfSksaX0sV2kpO2Z1bmN0aW9uIFdpKGUpe3RoaXMuc2NoZW1hU2VydmljZT1lfWZ1bmN0aW9uIEhpKGUsdCl7cmV0dXJuIG1yLmNyZWF0ZShlLnBvc2l0aW9uQXQodC5vZmZzZXQpLGUucG9zaXRpb25BdCh0Lm9mZnNldCt0Lmxlbmd0aCkpfXZhciB6aSxKaSxHaSxYaSxaaSxRaSxObj1TbixZaT17c2NoZW1hQXNzb2NpYXRpb25zOltdLHNjaGVtYXM6eyJodHRwOi8vanNvbi1zY2hlbWEub3JnL3NjaGVtYSMiOnskcmVmOiJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMifSwiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIjp7JHNjaGVtYToiaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIixkZWZpbml0aW9uczp7c2NoZW1hQXJyYXk6e3R5cGU6ImFycmF5IixtaW5JdGVtczoxLGl0ZW1zOnskcmVmOiIjIn19LHBvc2l0aXZlSW50ZWdlcjp7dHlwZToiaW50ZWdlciIsbWluaW11bTowfSxwb3NpdGl2ZUludGVnZXJEZWZhdWx0MDp7YWxsT2Y6W3skcmVmOiIjL2RlZmluaXRpb25zL3Bvc2l0aXZlSW50ZWdlciJ9LHtkZWZhdWx0OjB9XX0sc2ltcGxlVHlwZXM6e3R5cGU6InN0cmluZyIsZW51bTpbImFycmF5IiwiYm9vbGVhbiIsImludGVnZXIiLCJudWxsIiwibnVtYmVyIiwib2JqZWN0Iiwic3RyaW5nIl19LHN0cmluZ0FycmF5Ont0eXBlOiJhcnJheSIsaXRlbXM6e3R5cGU6InN0cmluZyJ9LG1pbkl0ZW1zOjEsdW5pcXVlSXRlbXM6ITB9fSx0eXBlOiJvYmplY3QiLHByb3BlcnRpZXM6e2lkOnt0eXBlOiJzdHJpbmciLGZvcm1hdDoidXJpIn0sJHNjaGVtYTp7dHlwZToic3RyaW5nIixmb3JtYXQ6InVyaSJ9LHRpdGxlOnt0eXBlOiJzdHJpbmcifSxkZXNjcmlwdGlvbjp7dHlwZToic3RyaW5nIn0sZGVmYXVsdDp7fSxtdWx0aXBsZU9mOnt0eXBlOiJudW1iZXIiLG1pbmltdW06MCxleGNsdXNpdmVNaW5pbXVtOiEwfSxtYXhpbXVtOnt0eXBlOiJudW1iZXIifSxleGNsdXNpdmVNYXhpbXVtOnt0eXBlOiJib29sZWFuIixkZWZhdWx0OiExfSxtaW5pbXVtOnt0eXBlOiJudW1iZXIifSxleGNsdXNpdmVNaW5pbXVtOnt0eXBlOiJib29sZWFuIixkZWZhdWx0OiExfSxtYXhMZW5ndGg6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXIifV19LG1pbkxlbmd0aDp7YWxsT2Y6W3skcmVmOiIjL2RlZmluaXRpb25zL3Bvc2l0aXZlSW50ZWdlckRlZmF1bHQwIn1dfSxwYXR0ZXJuOnt0eXBlOiJzdHJpbmciLGZvcm1hdDoicmVnZXgifSxhZGRpdGlvbmFsSXRlbXM6e2FueU9mOlt7dHlwZToiYm9vbGVhbiJ9LHskcmVmOiIjIn1dLGRlZmF1bHQ6e319LGl0ZW1zOnthbnlPZjpbeyRyZWY6IiMifSx7JHJlZjoiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSJ9XSxkZWZhdWx0Ont9fSxtYXhJdGVtczp7YWxsT2Y6W3skcmVmOiIjL2RlZmluaXRpb25zL3Bvc2l0aXZlSW50ZWdlciJ9XX0sbWluSXRlbXM6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXJEZWZhdWx0MCJ9XX0sdW5pcXVlSXRlbXM6e3R5cGU6ImJvb2xlYW4iLGRlZmF1bHQ6ITF9LG1heFByb3BlcnRpZXM6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXIifV19LG1pblByb3BlcnRpZXM6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXJEZWZhdWx0MCJ9XX0scmVxdWlyZWQ6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9zdHJpbmdBcnJheSJ9XX0sYWRkaXRpb25hbFByb3BlcnRpZXM6e2FueU9mOlt7dHlwZToiYm9vbGVhbiJ9LHskcmVmOiIjIn1dLGRlZmF1bHQ6e319LGRlZmluaXRpb25zOnt0eXBlOiJvYmplY3QiLGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnskcmVmOiIjIn0sZGVmYXVsdDp7fX0scHJvcGVydGllczp7dHlwZToib2JqZWN0IixhZGRpdGlvbmFsUHJvcGVydGllczp7JHJlZjoiIyJ9LGRlZmF1bHQ6e319LHBhdHRlcm5Qcm9wZXJ0aWVzOnt0eXBlOiJvYmplY3QiLGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnskcmVmOiIjIn0sZGVmYXVsdDp7fX0sZGVwZW5kZW5jaWVzOnt0eXBlOiJvYmplY3QiLGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnthbnlPZjpbeyRyZWY6IiMifSx7JHJlZjoiIy9kZWZpbml0aW9ucy9zdHJpbmdBcnJheSJ9XX19LGVudW06e3R5cGU6ImFycmF5IixtaW5JdGVtczoxLHVuaXF1ZUl0ZW1zOiEwfSx0eXBlOnthbnlPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvc2ltcGxlVHlwZXMifSx7dHlwZToiYXJyYXkiLGl0ZW1zOnskcmVmOiIjL2RlZmluaXRpb25zL3NpbXBsZVR5cGVzIn0sbWluSXRlbXM6MSx1bmlxdWVJdGVtczohMH1dfSxmb3JtYXQ6e2FueU9mOlt7dHlwZToic3RyaW5nIixlbnVtOlsiZGF0ZS10aW1lIiwidXJpIiwiZW1haWwiLCJob3N0bmFtZSIsImlwdjQiLCJpcHY2IiwicmVnZXgiXX0se3R5cGU6InN0cmluZyJ9XX0sYWxsT2Y6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSJ9XX0sYW55T2Y6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSJ9XX0sb25lT2Y6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSJ9XX0sbm90OnthbGxPZjpbeyRyZWY6IiMifV19fSxkZXBlbmRlbmNpZXM6e2V4Y2x1c2l2ZU1heGltdW06WyJtYXhpbXVtIl0sZXhjbHVzaXZlTWluaW11bTpbIm1pbmltdW0iXX0sZGVmYXVsdDp7fX0sImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hIyI6e2RlZmluaXRpb25zOntzY2hlbWFBcnJheTp7dHlwZToiYXJyYXkiLG1pbkl0ZW1zOjEsaXRlbXM6eyRyZWY6IiMifX0sbm9uTmVnYXRpdmVJbnRlZ2VyOnt0eXBlOiJpbnRlZ2VyIixtaW5pbXVtOjB9LG5vbk5lZ2F0aXZlSW50ZWdlckRlZmF1bHQwOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyIn0se2RlZmF1bHQ6MH1dfSxzaW1wbGVUeXBlczp7ZW51bTpbImFycmF5IiwiYm9vbGVhbiIsImludGVnZXIiLCJudWxsIiwibnVtYmVyIiwib2JqZWN0Iiwic3RyaW5nIl19LHN0cmluZ0FycmF5Ont0eXBlOiJhcnJheSIsaXRlbXM6e3R5cGU6InN0cmluZyJ9LHVuaXF1ZUl0ZW1zOiEwLGRlZmF1bHQ6W119fSx0eXBlOlsib2JqZWN0IiwiYm9vbGVhbiJdLHByb3BlcnRpZXM6eyRpZDp7dHlwZToic3RyaW5nIixmb3JtYXQ6InVyaS1yZWZlcmVuY2UifSwkc2NoZW1hOnt0eXBlOiJzdHJpbmciLGZvcm1hdDoidXJpIn0sJHJlZjp7dHlwZToic3RyaW5nIixmb3JtYXQ6InVyaS1yZWZlcmVuY2UifSwkY29tbWVudDp7dHlwZToic3RyaW5nIn0sdGl0bGU6e3R5cGU6InN0cmluZyJ9LGRlc2NyaXB0aW9uOnt0eXBlOiJzdHJpbmcifSxkZWZhdWx0OiEwLHJlYWRPbmx5Ont0eXBlOiJib29sZWFuIixkZWZhdWx0OiExfSxleGFtcGxlczp7dHlwZToiYXJyYXkiLGl0ZW1zOiEwfSxtdWx0aXBsZU9mOnt0eXBlOiJudW1iZXIiLGV4Y2x1c2l2ZU1pbmltdW06MH0sbWF4aW11bTp7dHlwZToibnVtYmVyIn0sZXhjbHVzaXZlTWF4aW11bTp7dHlwZToibnVtYmVyIn0sbWluaW11bTp7dHlwZToibnVtYmVyIn0sZXhjbHVzaXZlTWluaW11bTp7dHlwZToibnVtYmVyIn0sbWF4TGVuZ3RoOnskcmVmOiIjL2RlZmluaXRpb25zL25vbk5lZ2F0aXZlSW50ZWdlciJ9LG1pbkxlbmd0aDp7JHJlZjoiIy9kZWZpbml0aW9ucy9ub25OZWdhdGl2ZUludGVnZXJEZWZhdWx0MCJ9LHBhdHRlcm46e3R5cGU6InN0cmluZyIsZm9ybWF0OiJyZWdleCJ9LGFkZGl0aW9uYWxJdGVtczp7JHJlZjoiIyJ9LGl0ZW1zOnthbnlPZjpbeyRyZWY6IiMifSx7JHJlZjoiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSJ9XSxkZWZhdWx0OiEwfSxtYXhJdGVtczp7JHJlZjoiIy9kZWZpbml0aW9ucy9ub25OZWdhdGl2ZUludGVnZXIifSxtaW5JdGVtczp7JHJlZjoiIy9kZWZpbml0aW9ucy9ub25OZWdhdGl2ZUludGVnZXJEZWZhdWx0MCJ9LHVuaXF1ZUl0ZW1zOnt0eXBlOiJib29sZWFuIixkZWZhdWx0OiExfSxjb250YWluczp7JHJlZjoiIyJ9LG1heFByb3BlcnRpZXM6eyRyZWY6IiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyIn0sbWluUHJvcGVydGllczp7JHJlZjoiIy9kZWZpbml0aW9ucy9ub25OZWdhdGl2ZUludGVnZXJEZWZhdWx0MCJ9LHJlcXVpcmVkOnskcmVmOiIjL2RlZmluaXRpb25zL3N0cmluZ0FycmF5In0sYWRkaXRpb25hbFByb3BlcnRpZXM6eyRyZWY6IiMifSxkZWZpbml0aW9uczp7dHlwZToib2JqZWN0IixhZGRpdGlvbmFsUHJvcGVydGllczp7JHJlZjoiIyJ9LGRlZmF1bHQ6e319LHByb3BlcnRpZXM6e3R5cGU6Im9iamVjdCIsYWRkaXRpb25hbFByb3BlcnRpZXM6eyRyZWY6IiMifSxkZWZhdWx0Ont9fSxwYXR0ZXJuUHJvcGVydGllczp7dHlwZToib2JqZWN0IixhZGRpdGlvbmFsUHJvcGVydGllczp7JHJlZjoiIyJ9LHByb3BlcnR5TmFtZXM6e2Zvcm1hdDoicmVnZXgifSxkZWZhdWx0Ont9fSxkZXBlbmRlbmNpZXM6e3R5cGU6Im9iamVjdCIsYWRkaXRpb25hbFByb3BlcnRpZXM6e2FueU9mOlt7JHJlZjoiIyJ9LHskcmVmOiIjL2RlZmluaXRpb25zL3N0cmluZ0FycmF5In1dfX0scHJvcGVydHlOYW1lczp7JHJlZjoiIyJ9LGNvbnN0OiEwLGVudW06e3R5cGU6ImFycmF5IixpdGVtczohMCxtaW5JdGVtczoxLHVuaXF1ZUl0ZW1zOiEwfSx0eXBlOnthbnlPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvc2ltcGxlVHlwZXMifSx7dHlwZToiYXJyYXkiLGl0ZW1zOnskcmVmOiIjL2RlZmluaXRpb25zL3NpbXBsZVR5cGVzIn0sbWluSXRlbXM6MSx1bmlxdWVJdGVtczohMH1dfSxmb3JtYXQ6e3R5cGU6InN0cmluZyJ9LGNvbnRlbnRNZWRpYVR5cGU6e3R5cGU6InN0cmluZyJ9LGNvbnRlbnRFbmNvZGluZzp7dHlwZToic3RyaW5nIn0saWY6eyRyZWY6IiMifSx0aGVuOnskcmVmOiIjIn0sZWxzZTp7JHJlZjoiIyJ9LGFsbE9mOnskcmVmOiIjL2RlZmluaXRpb25zL3NjaGVtYUFycmF5In0sYW55T2Y6eyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifSxvbmVPZjp7JHJlZjoiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSJ9LG5vdDp7JHJlZjoiIyJ9fSxkZWZhdWx0OiEwfX19LGVvPXtpZDpObigic2NoZW1hLmpzb24uaWQiLCJBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc2NoZW1hLiIpLCRzY2hlbWE6Tm4oInNjaGVtYS5qc29uLiRzY2hlbWEiLCJUaGUgc2NoZW1hIHRvIHZlcmlmeSB0aGlzIGRvY3VtZW50IGFnYWluc3QuIiksdGl0bGU6Tm4oInNjaGVtYS5qc29uLnRpdGxlIiwiQSBkZXNjcmlwdGl2ZSB0aXRsZSBvZiB0aGUgZWxlbWVudC4iKSxkZXNjcmlwdGlvbjpObigic2NoZW1hLmpzb24uZGVzY3JpcHRpb24iLCJBIGxvbmcgZGVzY3JpcHRpb24gb2YgdGhlIGVsZW1lbnQuIFVzZWQgaW4gaG92ZXIgbWVudXMgYW5kIHN1Z2dlc3Rpb25zLiIpLGRlZmF1bHQ6Tm4oInNjaGVtYS5qc29uLmRlZmF1bHQiLCJBIGRlZmF1bHQgdmFsdWUuIFVzZWQgYnkgc3VnZ2VzdGlvbnMuIiksbXVsdGlwbGVPZjpObigic2NoZW1hLmpzb24ubXVsdGlwbGVPZiIsIkEgbnVtYmVyIHRoYXQgc2hvdWxkIGNsZWFubHkgZGl2aWRlIHRoZSBjdXJyZW50IHZhbHVlIChpLmUuIGhhdmUgbm8gcmVtYWluZGVyKS4iKSxtYXhpbXVtOk5uKCJzY2hlbWEuanNvbi5tYXhpbXVtIiwiVGhlIG1heGltdW0gbnVtZXJpY2FsIHZhbHVlLCBpbmNsdXNpdmUgYnkgZGVmYXVsdC4iKSxleGNsdXNpdmVNYXhpbXVtOk5uKCJzY2hlbWEuanNvbi5leGNsdXNpdmVNYXhpbXVtIiwiTWFrZXMgdGhlIG1heGltdW0gcHJvcGVydHkgZXhjbHVzaXZlLiIpLG1pbmltdW06Tm4oInNjaGVtYS5qc29uLm1pbmltdW0iLCJUaGUgbWluaW11bSBudW1lcmljYWwgdmFsdWUsIGluY2x1c2l2ZSBieSBkZWZhdWx0LiIpLGV4Y2x1c2l2ZU1pbmltdW06Tm4oInNjaGVtYS5qc29uLmV4Y2x1c2l2ZU1pbmludW0iLCJNYWtlcyB0aGUgbWluaW11bSBwcm9wZXJ0eSBleGNsdXNpdmUuIiksbWF4TGVuZ3RoOk5uKCJzY2hlbWEuanNvbi5tYXhMZW5ndGgiLCJUaGUgbWF4aW11bSBsZW5ndGggb2YgYSBzdHJpbmcuIiksbWluTGVuZ3RoOk5uKCJzY2hlbWEuanNvbi5taW5MZW5ndGgiLCJUaGUgbWluaW11bSBsZW5ndGggb2YgYSBzdHJpbmcuIikscGF0dGVybjpObigic2NoZW1hLmpzb24ucGF0dGVybiIsIkEgcmVndWxhciBleHByZXNzaW9uIHRvIG1hdGNoIHRoZSBzdHJpbmcgYWdhaW5zdC4gSXQgaXMgbm90IGltcGxpY2l0bHkgYW5jaG9yZWQuIiksYWRkaXRpb25hbEl0ZW1zOk5uKCJzY2hlbWEuanNvbi5hZGRpdGlvbmFsSXRlbXMiLCJGb3IgYXJyYXlzLCBvbmx5IHdoZW4gaXRlbXMgaXMgc2V0IGFzIGFuIGFycmF5LiBJZiBpdCBpcyBhIHNjaGVtYSwgdGhlbiB0aGlzIHNjaGVtYSB2YWxpZGF0ZXMgaXRlbXMgYWZ0ZXIgdGhlIG9uZXMgc3BlY2lmaWVkIGJ5IHRoZSBpdGVtcyBhcnJheS4gSWYgaXQgaXMgZmFsc2UsIHRoZW4gYWRkaXRpb25hbCBpdGVtcyB3aWxsIGNhdXNlIHZhbGlkYXRpb24gdG8gZmFpbC4iKSxpdGVtczpObigic2NoZW1hLmpzb24uaXRlbXMiLCJGb3IgYXJyYXlzLiBDYW4gZWl0aGVyIGJlIGEgc2NoZW1hIHRvIHZhbGlkYXRlIGV2ZXJ5IGVsZW1lbnQgYWdhaW5zdCBvciBhbiBhcnJheSBvZiBzY2hlbWFzIHRvIHZhbGlkYXRlIGVhY2ggaXRlbSBhZ2FpbnN0IGluIG9yZGVyICh0aGUgZmlyc3Qgc2NoZW1hIHdpbGwgdmFsaWRhdGUgdGhlIGZpcnN0IGVsZW1lbnQsIHRoZSBzZWNvbmQgc2NoZW1hIHdpbGwgdmFsaWRhdGUgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uIiksbWF4SXRlbXM6Tm4oInNjaGVtYS5qc29uLm1heEl0ZW1zIiwiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIGluc2lkZSBhbiBhcnJheS4gSW5jbHVzaXZlLiIpLG1pbkl0ZW1zOk5uKCJzY2hlbWEuanNvbi5taW5JdGVtcyIsIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBpbnNpZGUgYW4gYXJyYXkuIEluY2x1c2l2ZS4iKSx1bmlxdWVJdGVtczpObigic2NoZW1hLmpzb24udW5pcXVlSXRlbXMiLCJJZiBhbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBhcnJheSBtdXN0IGJlIHVuaXF1ZS4gRGVmYXVsdHMgdG8gZmFsc2UuIiksbWF4UHJvcGVydGllczpObigic2NoZW1hLmpzb24ubWF4UHJvcGVydGllcyIsIlRoZSBtYXhpbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzIGFuIG9iamVjdCBjYW4gaGF2ZS4gSW5jbHVzaXZlLiIpLG1pblByb3BlcnRpZXM6Tm4oInNjaGVtYS5qc29uLm1pblByb3BlcnRpZXMiLCJUaGUgbWluaW11bSBudW1iZXIgb2YgcHJvcGVydGllcyBhbiBvYmplY3QgY2FuIGhhdmUuIEluY2x1c2l2ZS4iKSxyZXF1aXJlZDpObigic2NoZW1hLmpzb24ucmVxdWlyZWQiLCJBbiBhcnJheSBvZiBzdHJpbmdzIHRoYXQgbGlzdHMgdGhlIG5hbWVzIG9mIGFsbCBwcm9wZXJ0aWVzIHJlcXVpcmVkIG9uIHRoaXMgb2JqZWN0LiIpLGFkZGl0aW9uYWxQcm9wZXJ0aWVzOk5uKCJzY2hlbWEuanNvbi5hZGRpdGlvbmFsUHJvcGVydGllcyIsIkVpdGhlciBhIHNjaGVtYSBvciBhIGJvb2xlYW4uIElmIGEgc2NoZW1hLCB0aGVuIHVzZWQgdG8gdmFsaWRhdGUgYWxsIHByb3BlcnRpZXMgbm90IG1hdGNoZWQgYnkgJ3Byb3BlcnRpZXMnIG9yICdwYXR0ZXJuUHJvcGVydGllcycuIElmIGZhbHNlLCB0aGVuIGFueSBwcm9wZXJ0aWVzIG5vdCBtYXRjaGVkIGJ5IGVpdGhlciB3aWxsIGNhdXNlIHRoaXMgc2NoZW1hIHRvIGZhaWwuIiksZGVmaW5pdGlvbnM6Tm4oInNjaGVtYS5qc29uLmRlZmluaXRpb25zIiwiTm90IHVzZWQgZm9yIHZhbGlkYXRpb24uIFBsYWNlIHN1YnNjaGVtYXMgaGVyZSB0aGF0IHlvdSB3aXNoIHRvIHJlZmVyZW5jZSBpbmxpbmUgd2l0aCAkcmVmLiIpLHByb3BlcnRpZXM6Tm4oInNjaGVtYS5qc29uLnByb3BlcnRpZXMiLCJBIG1hcCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBzY2hlbWFzIGZvciBlYWNoIHByb3BlcnR5LiIpLHBhdHRlcm5Qcm9wZXJ0aWVzOk5uKCJzY2hlbWEuanNvbi5wYXR0ZXJuUHJvcGVydGllcyIsIkEgbWFwIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgb24gcHJvcGVydHkgbmFtZXMgdG8gc2NoZW1hcyBmb3IgbWF0Y2hpbmcgcHJvcGVydGllcy4iKSxkZXBlbmRlbmNpZXM6Tm4oInNjaGVtYS5qc29uLmRlcGVuZGVuY2llcyIsIkEgbWFwIG9mIHByb3BlcnR5IG5hbWVzIHRvIGVpdGhlciBhbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBvciBhIHNjaGVtYS4gQW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgbWVhbnMgdGhlIHByb3BlcnR5IG5hbWVkIGluIHRoZSBrZXkgZGVwZW5kcyBvbiB0aGUgcHJvcGVydGllcyBpbiB0aGUgYXJyYXkgYmVpbmcgcHJlc2VudCBpbiB0aGUgb2JqZWN0IGluIG9yZGVyIHRvIGJlIHZhbGlkLiBJZiB0aGUgdmFsdWUgaXMgYSBzY2hlbWEsIHRoZW4gdGhlIHNjaGVtYSBpcyBvbmx5IGFwcGxpZWQgdG8gdGhlIG9iamVjdCBpZiB0aGUgcHJvcGVydHkgaW4gdGhlIGtleSBleGlzdHMgb24gdGhlIG9iamVjdC4iKSxlbnVtOk5uKCJzY2hlbWEuanNvbi5lbnVtIiwiVGhlIHNldCBvZiBsaXRlcmFsIHZhbHVlcyB0aGF0IGFyZSB2YWxpZC4iKSx0eXBlOk5uKCJzY2hlbWEuanNvbi50eXBlIiwiRWl0aGVyIGEgc3RyaW5nIG9mIG9uZSBvZiB0aGUgYmFzaWMgc2NoZW1hIHR5cGVzIChudW1iZXIsIGludGVnZXIsIG51bGwsIGFycmF5LCBvYmplY3QsIGJvb2xlYW4sIHN0cmluZykgb3IgYW4gYXJyYXkgb2Ygc3RyaW5ncyBzcGVjaWZ5aW5nIGEgc3Vic2V0IG9mIHRob3NlIHR5cGVzLiIpLGZvcm1hdDpObigic2NoZW1hLmpzb24uZm9ybWF0IiwiRGVzY3JpYmVzIHRoZSBmb3JtYXQgZXhwZWN0ZWQgZm9yIHRoZSB2YWx1ZS4iKSxhbGxPZjpObigic2NoZW1hLmpzb24uYWxsT2YiLCJBbiBhcnJheSBvZiBzY2hlbWFzLCBhbGwgb2Ygd2hpY2ggbXVzdCBtYXRjaC4iKSxhbnlPZjpObigic2NoZW1hLmpzb24uYW55T2YiLCJBbiBhcnJheSBvZiBzY2hlbWFzLCB3aGVyZSBhdCBsZWFzdCBvbmUgbXVzdCBtYXRjaC4iKSxvbmVPZjpObigic2NoZW1hLmpzb24ub25lT2YiLCJBbiBhcnJheSBvZiBzY2hlbWFzLCBleGFjdGx5IG9uZSBvZiB3aGljaCBtdXN0IG1hdGNoLiIpLG5vdDpObigic2NoZW1hLmpzb24ubm90IiwiQSBzY2hlbWEgd2hpY2ggbXVzdCBub3QgbWF0Y2guIiksJGlkOk5uKCJzY2hlbWEuanNvbi4kaWQiLCJBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc2NoZW1hLiIpLCRyZWY6Tm4oInNjaGVtYS5qc29uLiRyZWYiLCJSZWZlcmVuY2UgYSBkZWZpbml0aW9uIGhvc3RlZCBvbiBhbnkgbG9jYXRpb24uIiksJGNvbW1lbnQ6Tm4oInNjaGVtYS5qc29uLiRjb21tZW50IiwiQ29tbWVudHMgZnJvbSBzY2hlbWEgYXV0aG9ycyB0byByZWFkZXJzIG9yIG1haW50YWluZXJzIG9mIHRoZSBzY2hlbWEuIikscmVhZE9ubHk6Tm4oInNjaGVtYS5qc29uLnJlYWRPbmx5IiwiSW5kaWNhdGVzIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBpbnN0YW5jZSBpcyBtYW5hZ2VkIGV4Y2x1c2l2ZWx5IGJ5IHRoZSBvd25pbmcgYXV0aG9yaXR5LiIpLGV4YW1wbGVzOk5uKCJzY2hlbWEuanNvbi5leGFtcGxlcyIsIlNhbXBsZSBKU09OIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIHNjaGVtYSwgZm9yIHRoZSBwdXJwb3NlIG9mIGlsbHVzdHJhdGluZyB1c2FnZS4iKSxjb250YWluczpObigic2NoZW1hLmpzb24uY29udGFpbnMiLCdBbiBhcnJheSBpbnN0YW5jZSBpcyB2YWxpZCBhZ2FpbnN0ICJjb250YWlucyIgaWYgYXQgbGVhc3Qgb25lIG9mIGl0cyBlbGVtZW50cyBpcyB2YWxpZCBhZ2FpbnN0IHRoZSBnaXZlbiBzY2hlbWEuJykscHJvcGVydHlOYW1lczpObigic2NoZW1hLmpzb24ucHJvcGVydHlOYW1lcyIsIklmIHRoZSBpbnN0YW5jZSBpcyBhbiBvYmplY3QsIHRoaXMga2V5d29yZCB2YWxpZGF0ZXMgaWYgZXZlcnkgcHJvcGVydHkgbmFtZSBpbiB0aGUgaW5zdGFuY2UgdmFsaWRhdGVzIGFnYWluc3QgdGhlIHByb3ZpZGVkIHNjaGVtYS4iKSxjb25zdDpObigic2NoZW1hLmpzb24uY29uc3QiLCJBbiBpbnN0YW5jZSB2YWxpZGF0ZXMgc3VjY2Vzc2Z1bGx5IGFnYWluc3QgdGhpcyBrZXl3b3JkIGlmIGl0cyB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlIGtleXdvcmQuIiksY29udGVudE1lZGlhVHlwZTpObigic2NoZW1hLmpzb24uY29udGVudE1lZGlhVHlwZSIsIkRlc2NyaWJlcyB0aGUgbWVkaWEgdHlwZSBvZiBhIHN0cmluZyBwcm9wZXJ0eS4iKSxjb250ZW50RW5jb2Rpbmc6Tm4oInNjaGVtYS5qc29uLmNvbnRlbnRFbmNvZGluZyIsIkRlc2NyaWJlcyB0aGUgY29udGVudCBlbmNvZGluZyBvZiBhIHN0cmluZyBwcm9wZXJ0eS4iKSxpZjpObigic2NoZW1hLmpzb24uaWYiLCdUaGUgdmFsaWRhdGlvbiBvdXRjb21lIG9mIHRoZSAiaWYiIHN1YnNjaGVtYSBjb250cm9scyB3aGljaCBvZiB0aGUgInRoZW4iIG9yICJlbHNlIiBrZXl3b3JkcyBhcmUgZXZhbHVhdGVkLicpLHRoZW46Tm4oInNjaGVtYS5qc29uLnRoZW4iLCdUaGUgImlmIiBzdWJzY2hlbWEgaXMgdXNlZCBmb3IgdmFsaWRhdGlvbiB3aGVuIHRoZSAiaWYiIHN1YnNjaGVtYSBzdWNjZWVkcy4nKSxlbHNlOk5uKCJzY2hlbWEuanNvbi5lbHNlIiwnVGhlICJlbHNlIiBzdWJzY2hlbWEgaXMgdXNlZCBmb3IgdmFsaWRhdGlvbiB3aGVuIHRoZSAiaWYiIHN1YnNjaGVtYSBmYWlscy4nKX07Zm9yKFppIGluIFlpLnNjaGVtYXMpZm9yKFhpIGluKHppPVlpLnNjaGVtYXNbWmldKS5wcm9wZXJ0aWVzKSJib29sZWFuIj09dHlwZW9mKEppPXppLnByb3BlcnRpZXNbWGldKSYmKEppPXppLnByb3BlcnRpZXNbWGldPXt9KSwoR2k9ZW9bWGldKT9KaS5kZXNjcmlwdGlvbj1HaTpjb25zb2xlLmxvZyhYaSsiOiBsb2NhbGl6ZSgnc2NoZW1hLmpzb24uIitYaStgJywgIiIpYCk7ZnVuY3Rpb24gdG8oZSx0KXt2YXIgcj1bXSxuPVtdLGk9W10sbz0tMSxzPU9yKGUuZ2V0VGV4dCgpLCExKSxhPXMuc2NhbigpO2Z1bmN0aW9uIGwoZSl7ci5wdXNoKGUpLG4ucHVzaChpLmxlbmd0aCl9Zm9yKDsxNyE9PWE7KXtzd2l0Y2goYSl7Y2FzZSAxOmNhc2UgMzp2YXIgdT17c3RhcnRMaW5lOmg9ZS5wb3NpdGlvbkF0KHMuZ2V0VG9rZW5PZmZzZXQoKSkubGluZSxlbmRMaW5lOmgsa2luZDoxPT09YT8ib2JqZWN0IjoiYXJyYXkifTtpLnB1c2godSk7YnJlYWs7Y2FzZSAyOmNhc2UgNDowPGkubGVuZ3RoJiZpW2kubGVuZ3RoLTFdLmtpbmQ9PT0oMj09PWE/Im9iamVjdCI6ImFycmF5IikmJih1PWkucG9wKCksZD1lLnBvc2l0aW9uQXQocy5nZXRUb2tlbk9mZnNldCgpKS5saW5lLHUmJmQ+dS5zdGFydExpbmUrMSYmbyE9PXUuc3RhcnRMaW5lJiYodS5lbmRMaW5lPWQtMSxsKHUpLG89dS5zdGFydExpbmUpKTticmVhaztjYXNlIDEzOnZhciBoPWUucG9zaXRpb25BdChzLmdldFRva2VuT2Zmc2V0KCkpLmxpbmUsYz1lLnBvc2l0aW9uQXQocy5nZXRUb2tlbk9mZnNldCgpK3MuZ2V0VG9rZW5MZW5ndGgoKSkubGluZTsxPT09cy5nZXRUb2tlbkVycm9yKCkmJmgrMTxlLmxpbmVDb3VudD9zLnNldFBvc2l0aW9uKGUub2Zmc2V0QXQoZnIuY3JlYXRlKGgrMSwwKSkpOmg8YyYmKGwoe3N0YXJ0TGluZTpoLGVuZExpbmU6YyxraW5kOnZyLkNvbW1lbnR9KSxvPWgpO2JyZWFrO2Nhc2UgMTI6Yz1lLmdldFRleHQoKS5zdWJzdHIocy5nZXRUb2tlbk9mZnNldCgpLHMuZ2V0VG9rZW5MZW5ndGgoKSkubWF0Y2goL15cL1wvXHMqIyhyZWdpb25cYil8KGVuZHJlZ2lvblxiKS8pO2lmKGMpe3ZhciBkPWUucG9zaXRpb25BdChzLmdldFRva2VuT2Zmc2V0KCkpLmxpbmU7aWYoY1sxXSl7dT17c3RhcnRMaW5lOmQsZW5kTGluZTpkLGtpbmQ6dnIuUmVnaW9ufTtpLnB1c2godSl9ZWxzZXtmb3IodmFyIGY9aS5sZW5ndGgtMTswPD1mJiZpW2ZdLmtpbmQhPT12ci5SZWdpb247KWYtLTswPD1mJiYodT1pW2ZdLGkubGVuZ3RoPWYsZD51LnN0YXJ0TGluZSYmbyE9PXUuc3RhcnRMaW5lJiYodS5lbmRMaW5lPWQsbCh1KSxvPXUuc3RhcnRMaW5lKSl9fX1hPXMuc2NhbigpfXZhciBtPXQmJnQucmFuZ2VMaW1pdDtpZigibnVtYmVyIiE9dHlwZW9mIG18fHIubGVuZ3RoPD1tKXJldHVybiByO3QmJnQub25SYW5nZUxpbWl0RXhjZWVkZWQmJnQub25SYW5nZUxpbWl0RXhjZWVkZWQoZS51cmkpO2Zvcih2YXIgZz1bXSxwPTAsdj1uO3A8di5sZW5ndGg7cCsrKShDPXZbcF0pPDMwJiYoZ1tDXT0oZ1tDXXx8MCkrMSk7Zm9yKHZhciB5PTAsYj0wLGY9MDtmPGcubGVuZ3RoO2YrKyl7dmFyIF89Z1tmXTtpZihfKXtpZihtPF8reSl7Yj1mO2JyZWFrfXkrPV99fWZvcih2YXIgQyxTPVtdLGY9MDtmPHIubGVuZ3RoO2YrKykibnVtYmVyIj09dHlwZW9mKEM9bltmXSkmJihDPGJ8fEM9PT1iJiZ5Kys8bSkmJlMucHVzaChyW2ZdKTtyZXR1cm4gU31mdW5jdGlvbiBybyhoLGUsYyl7ZnVuY3Rpb24gZChlLHQpe3JldHVybiBtci5jcmVhdGUoaC5wb3NpdGlvbkF0KGUpLGgucG9zaXRpb25BdCh0KSl9dmFyIGY9T3IoaC5nZXRUZXh0KCksITApO3JldHVybiBlLm1hcChmdW5jdGlvbihlKXtmb3IodmFyIHQscixuPWgub2Zmc2V0QXQoZSksaT1jLmdldE5vZGVGcm9tT2Zmc2V0KG4sITApLG89W107aTspe3N3aXRjaChpLnR5cGUpe2Nhc2Uic3RyaW5nIjpjYXNlIm9iamVjdCI6Y2FzZSJhcnJheSI6dmFyIHM9aS5vZmZzZXQrMSxhPWkub2Zmc2V0K2kubGVuZ3RoLTE7czxhJiZzPD1uJiZuPD1hJiZvLnB1c2goZChzLGEpKSxvLnB1c2goZChpLm9mZnNldCxpLm9mZnNldCtpLmxlbmd0aCkpO2JyZWFrO2Nhc2UibnVtYmVyIjpjYXNlImJvb2xlYW4iOmNhc2UibnVsbCI6Y2FzZSJwcm9wZXJ0eSI6by5wdXNoKGQoaS5vZmZzZXQsaS5vZmZzZXQraS5sZW5ndGgpKX0oInByb3BlcnR5Ij09PWkudHlwZXx8aS5wYXJlbnQmJiJhcnJheSI9PT1pLnBhcmVudC50eXBlKSYmKHQ9aS5vZmZzZXQraS5sZW5ndGgscj01LGYuc2V0UG9zaXRpb24odCksLTEhPT0ocj1mLnNjYW4oKSE9PXI/LTE6Zi5nZXRUb2tlbk9mZnNldCgpK2YuZ2V0VG9rZW5MZW5ndGgoKSkmJm8ucHVzaChkKGkub2Zmc2V0LHIpKSksaT1pLnBhcmVudH1mb3IodmFyIGw9dm9pZCAwLHU9by5sZW5ndGgtMTswPD11O3UtLSlsPWFuLmNyZWF0ZShvW3VdLGwpO3JldHVybiBsPWx8fGFuLmNyZWF0ZShtci5jcmVhdGUoZSxlKSl9KX1mdW5jdGlvbiBubyhyLG4pe3ZhciBpPVtdO3JldHVybiBuLnZpc2l0KGZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiJwcm9wZXJ0eSI9PT1lLnR5cGUmJiIkcmVmIj09PWUua2V5Tm9kZS52YWx1ZSYmInN0cmluZyI9PT0obnVsbD09PSh0PWUudmFsdWVOb2RlKXx8dm9pZCAwPT09dD92b2lkIDA6dC50eXBlKSYmKHQ9ZS52YWx1ZU5vZGUudmFsdWUsKHQ9ZnVuY3Rpb24oZSx0KXt0PWZ1bmN0aW9uKGUpe3JldHVybiIjIiE9PWU/IiMiPT09ZVswXSYmIi8iPT09ZVsxXT9lLnN1YnN0cmluZygyKS5zcGxpdCgvXC8vKS5tYXAoaW8pOm51bGw6W119KHQpO3JldHVybiB0P2Z1bmN0aW9uIGUodCxyKXtpZighcilyZXR1cm4gbnVsbDtpZigwPT09dC5sZW5ndGgpcmV0dXJuIHI7dmFyIG49dC5zaGlmdCgpO3tpZihyJiYib2JqZWN0Ij09PXIudHlwZSl7dmFyIGk9ci5wcm9wZXJ0aWVzLmZpbmQoZnVuY3Rpb24oZSl7cmV0dXJuIGUua2V5Tm9kZS52YWx1ZT09PW59KTtyZXR1cm4gaT9lKHQsaS52YWx1ZU5vZGUpOm51bGx9aWYociYmImFycmF5Ij09PXIudHlwZSYmbi5tYXRjaCgvXigwfFsxLTldWzAtOV0qKSQvKSl7dmFyIGk9TnVtYmVyLnBhcnNlSW50KG4pLGk9ci5pdGVtc1tpXTtyZXR1cm4gaT9lKHQsaSk6bnVsbH19cmV0dXJuIG51bGx9KHQsZS5yb290KTpudWxsfShuLHQpKSYmKHQ9ci5wb3NpdGlvbkF0KHQub2Zmc2V0KSxpLnB1c2goe3RhcmdldDpyLnVyaSsiIyIrKHQubGluZSsxKSsiLCIrKHQuY2hhcmFjdGVyKzEpLHJhbmdlOih0PXIsZT1lLnZhbHVlTm9kZSxtci5jcmVhdGUodC5wb3NpdGlvbkF0KGUub2Zmc2V0KzEpLHQucG9zaXRpb25BdChlLm9mZnNldCtlLmxlbmd0aC0xKSkpfSkpKSwhMH0pLFByb21pc2UucmVzb2x2ZShpKX1mdW5jdGlvbiBpbyhlKXtyZXR1cm4gZS5yZXBsYWNlKC9+MS9nLCIvIikucmVwbGFjZSgvfjAvZywifiIpfWZ1bmN0aW9uIG9vKGUpe3ZhciB0PWUucHJvbWlzZUNvbnN0cnVjdG9yfHxQcm9taXNlLHI9bmV3IExpKGUuc2NoZW1hUmVxdWVzdFNlcnZpY2UsZS53b3Jrc3BhY2VDb250ZXh0LHQpO3Iuc2V0U2NoZW1hQ29udHJpYnV0aW9ucyhZaSk7dmFyIG49bmV3IGNpKHIsZS5jb250cmlidXRpb25zLHQsZS5jbGllbnRDYXBhYmlsaXRpZXMpLGk9bmV3IGdpKHIsZS5jb250cmlidXRpb25zLHQpLGU9bmV3ICRpKHIpLG89bmV3IFBpKHIsdCk7cmV0dXJue2NvbmZpZ3VyZTpmdW5jdGlvbihlKXtyLmNsZWFyRXh0ZXJuYWxTY2hlbWFzKCksZS5zY2hlbWFzJiZlLnNjaGVtYXMuZm9yRWFjaChmdW5jdGlvbihlKXtyLnJlZ2lzdGVyRXh0ZXJuYWxTY2hlbWEoZS51cmksZS5maWxlTWF0Y2gsZS5zY2hlbWEpfSksby5jb25maWd1cmUoZSl9LHJlc2V0U2NoZW1hOmZ1bmN0aW9uKGUpe3JldHVybiByLm9uUmVzb3VyY2VDaGFuZ2UoZSl9LGRvVmFsaWRhdGlvbjpvLmRvVmFsaWRhdGlvbi5iaW5kKG8pLHBhcnNlSlNPTkRvY3VtZW50OmZ1bmN0aW9uKGUpe3JldHVybiB1aShlLHtjb2xsZWN0Q29tbWVudHM6ITB9KX0sbmV3SlNPTkRvY3VtZW50OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG5ldyBzaShlLHQ9dm9pZCAwPT09KHQ9dCk/W106dCxbXSl9LGdldE1hdGNoaW5nU2NoZW1hczpyLmdldE1hdGNoaW5nU2NoZW1hcy5iaW5kKHIpLGRvUmVzb2x2ZTpuLmRvUmVzb2x2ZS5iaW5kKG4pLGRvQ29tcGxldGU6bi5kb0NvbXBsZXRlLmJpbmQobiksZmluZERvY3VtZW50U3ltYm9sczplLmZpbmREb2N1bWVudFN5bWJvbHMuYmluZChlKSxmaW5kRG9jdW1lbnRTeW1ib2xzMjplLmZpbmREb2N1bWVudFN5bWJvbHMyLmJpbmQoZSksZmluZERvY3VtZW50Q29sb3JzOmUuZmluZERvY3VtZW50Q29sb3JzLmJpbmQoZSksZ2V0Q29sb3JQcmVzZW50YXRpb25zOmUuZ2V0Q29sb3JQcmVzZW50YXRpb25zLmJpbmQoZSksZG9Ib3ZlcjppLmRvSG92ZXIuYmluZChpKSxnZXRGb2xkaW5nUmFuZ2VzOnRvLGdldFNlbGVjdGlvblJhbmdlczpybyxmaW5kRGVmaW5pdGlvbjpmdW5jdGlvbigpe3JldHVybiBQcm9taXNlLnJlc29sdmUoW10pfSxmaW5kTGlua3M6bm8sZm9ybWF0OmZ1bmN0aW9uKHQsZSxyKXt2YXIgbixpPXZvaWQgMDtlJiYoaT17b2Zmc2V0Om49dC5vZmZzZXRBdChlLnN0YXJ0KSxsZW5ndGg6dC5vZmZzZXRBdChlLmVuZCktbn0pO3I9e3RhYlNpemU6cj9yLnRhYlNpemU6NCxpbnNlcnRTcGFjZXM6ITA9PT0obnVsbD09cj92b2lkIDA6ci5pbnNlcnRTcGFjZXMpLGluc2VydEZpbmFsTmV3bGluZTohMD09PShudWxsPT1yP3ZvaWQgMDpyLmluc2VydEZpbmFsTmV3bGluZSksZW9sOiJcbiJ9O3JldHVybiB1cih0LmdldFRleHQoKSxpLHIpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gd3IucmVwbGFjZShtci5jcmVhdGUodC5wb3NpdGlvbkF0KGUub2Zmc2V0KSx0LnBvc2l0aW9uQXQoZS5vZmZzZXQrZS5sZW5ndGgpKSxlLmNvbnRlbnQpfSl9fX0idW5kZWZpbmVkIiE9dHlwZW9mIGZldGNoJiYoUWk9ZnVuY3Rpb24oZSl7cmV0dXJuIGZldGNoKGUpLnRoZW4oZT0+ZS50ZXh0KCkpfSk7dmFyIHNvPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5fY3R4PWUsdGhpcy5fbGFuZ3VhZ2VTZXR0aW5ncz10Lmxhbmd1YWdlU2V0dGluZ3MsdGhpcy5fbGFuZ3VhZ2VJZD10Lmxhbmd1YWdlSWQsdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlPW9vKHt3b3Jrc3BhY2VDb250ZXh0OntyZXNvbHZlUmVsYXRpdmVQYXRoOihlLHQpPT57cmV0dXJuIGZ1bmN0aW9uKGUsdCl7aWYoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckNvZGVBdCgwKT09PWFvfSh0KSl7Y29uc3Qgbj1iaS5wYXJzZShlKTt2YXIgcj10LnNwbGl0KCIvIik7cmV0dXJuIG4ud2l0aCh7cGF0aDp1byhyKX0pLnRvU3RyaW5nKCl9cmV0dXJuIGZ1bmN0aW9uKGUsdCl7Y29uc3Qgcj1iaS5wYXJzZShlKSxuPXIucGF0aC5zcGxpdCgiLyIpO2Zvcih2YXIgaSBvZiB0KW4ucHVzaCguLi5pLnNwbGl0KCIvIikpO3JldHVybiByLndpdGgoe3BhdGg6dW8obil9KS50b1N0cmluZygpfShlLFt0XSl9KHQuc3Vic3RyKDAsdC5sYXN0SW5kZXhPZigiLyIpKzEpLGUpfX0sc2NoZW1hUmVxdWVzdFNlcnZpY2U6dC5lbmFibGVTY2hlbWFSZXF1ZXN0P1FpOnZvaWQgMH0pLHRoaXMuX2xhbmd1YWdlU2VydmljZS5jb25maWd1cmUodGhpcy5fbGFuZ3VhZ2VTZXR0aW5ncyl9YXN5bmMgZG9WYWxpZGF0aW9uKGUpe3ZhciB0PXRoaXMuX2dldFRleHREb2N1bWVudChlKTtpZih0KXtlPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudCh0KTtyZXR1cm4gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmRvVmFsaWRhdGlvbih0LGUsdGhpcy5fbGFuZ3VhZ2VTZXR0aW5ncyl9cmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSl9YXN5bmMgZG9Db21wbGV0ZShlLHQpe3ZhciByPXRoaXMuX2dldFRleHREb2N1bWVudChlKTtpZighcilyZXR1cm4gbnVsbDtlPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudChyKTtyZXR1cm4gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmRvQ29tcGxldGUocix0LGUpfWFzeW5jIGRvUmVzb2x2ZShlKXtyZXR1cm4gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmRvUmVzb2x2ZShlKX1hc3luYyBkb0hvdmVyKGUsdCl7dmFyIHI9dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCFyKXJldHVybiBudWxsO2U9dGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLnBhcnNlSlNPTkRvY3VtZW50KHIpO3JldHVybiB0aGlzLl9sYW5ndWFnZVNlcnZpY2UuZG9Ib3ZlcihyLHQsZSl9YXN5bmMgZm9ybWF0KGUsdCxyKXtlPXRoaXMuX2dldFRleHREb2N1bWVudChlKTtpZighZSlyZXR1cm5bXTtyPXRoaXMuX2xhbmd1YWdlU2VydmljZS5mb3JtYXQoZSx0LHIpO3JldHVybiBQcm9taXNlLnJlc29sdmUocil9YXN5bmMgcmVzZXRTY2hlbWEoZSl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9sYW5ndWFnZVNlcnZpY2UucmVzZXRTY2hlbWEoZSkpfWFzeW5jIGZpbmREb2N1bWVudFN5bWJvbHMoZSl7dmFyIHQ9dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCF0KXJldHVybltdO2U9dGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLnBhcnNlSlNPTkRvY3VtZW50KHQpLGU9dGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmZpbmREb2N1bWVudFN5bWJvbHModCxlKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGUpfWFzeW5jIGZpbmREb2N1bWVudENvbG9ycyhlKXt2YXIgdD10aGlzLl9nZXRUZXh0RG9jdW1lbnQoZSk7aWYoIXQpcmV0dXJuW107ZT10aGlzLl9sYW5ndWFnZVNlcnZpY2UucGFyc2VKU09ORG9jdW1lbnQodCksZT10aGlzLl9sYW5ndWFnZVNlcnZpY2UuZmluZERvY3VtZW50Q29sb3JzKHQsZSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX1hc3luYyBnZXRDb2xvclByZXNlbnRhdGlvbnMoZSx0LHIpe3ZhciBuPXRoaXMuX2dldFRleHREb2N1bWVudChlKTtpZighbilyZXR1cm5bXTtlPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudChuKSxyPXRoaXMuX2xhbmd1YWdlU2VydmljZS5nZXRDb2xvclByZXNlbnRhdGlvbnMobixlLHQscik7cmV0dXJuIFByb21pc2UucmVzb2x2ZShyKX1hc3luYyBnZXRGb2xkaW5nUmFuZ2VzKGUsdCl7ZT10aGlzLl9nZXRUZXh0RG9jdW1lbnQoZSk7aWYoIWUpcmV0dXJuW107dD10aGlzLl9sYW5ndWFnZVNlcnZpY2UuZ2V0Rm9sZGluZ1JhbmdlcyhlLHQpO3JldHVybiBQcm9taXNlLnJlc29sdmUodCl9YXN5bmMgZ2V0U2VsZWN0aW9uUmFuZ2VzKGUsdCl7dmFyIHI9dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCFyKXJldHVybltdO2U9dGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLnBhcnNlSlNPTkRvY3VtZW50KHIpLGU9dGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmdldFNlbGVjdGlvblJhbmdlcyhyLHQsZSk7cmV0dXJuIFByb21pc2UucmVzb2x2ZShlKX1fZ2V0VGV4dERvY3VtZW50KGUpe3ZhciB0O2Zvcih0IG9mIHRoaXMuX2N0eC5nZXRNaXJyb3JNb2RlbHMoKSlpZih0LnVyaS50b1N0cmluZygpPT09ZSlyZXR1cm4gZ24uY3JlYXRlKGUsdGhpcy5fbGFuZ3VhZ2VJZCx0LnZlcnNpb24sdC5nZXRWYWx1ZSgpKTtyZXR1cm4gbnVsbH19LGFvPSIvIi5jaGFyQ29kZUF0KDApLGxvPSIuIi5jaGFyQ29kZUF0KDApO2Z1bmN0aW9uIHVvKGUpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IG4gb2YgZSkwPT09bi5sZW5ndGh8fDE9PT1uLmxlbmd0aCYmbi5jaGFyQ29kZUF0KDApPT09bG98fCgyPT09bi5sZW5ndGgmJm4uY2hhckNvZGVBdCgwKT09PWxvJiZuLmNoYXJDb2RlQXQoMSk9PT1sbz90LnBvcCgpOnQucHVzaChuKSk7MTxlLmxlbmd0aCYmMD09PWVbZS5sZW5ndGgtMV0ubGVuZ3RoJiZ0LnB1c2goIiIpO2xldCByPXQuam9pbigiLyIpO3JldHVybiAwPT09ZVswXS5sZW5ndGgmJihyPSIvIityKSxyfXNlbGYub25tZXNzYWdlPSgpPT57aXIoKGUsdCk9Pm5ldyBzbyhlLHQpKX19KCk7Cgo=', null, false);
4
4
  /* eslint-enable */
5
5
 
6
6
  export { WorkerFactory as default };