f67768158c5fb9544e73bc2d6efd252d.json 62 KB

1
  1. {"remainingRequest":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/thread-loader/dist/cjs.js!/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/babel-loader/lib/index.js!/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/element-ui/lib/utils/popper.js","dependencies":[{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/element-ui/lib/utils/popper.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/cache-loader/dist/cjs.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/thread-loader/dist/cjs.js","mtime":499162500000},{"path":"/usr/local/develop/php/www/waibao/project/NN2020060801/addons/admin/node_modules/babel-loader/lib/index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:J3VzZSBzdHJpY3QnOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbCIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5kZXNjcmlwdGlvbiIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvciIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZpbHRlciIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLmFycmF5LmZvci1lYWNoIik7CgpyZXF1aXJlKCJjb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaW5kZXgtb2YiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5tYXAiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5zbGljZSIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5vYmplY3Qua2V5cyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmciKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5yZWdleHAuZXhlYyIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnJlZ2V4cC50by1zdHJpbmciKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IiKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcucmVwbGFjZSIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL2VzLnN0cmluZy5zcGxpdCIpOwoKcmVxdWlyZSgiY29yZS1qcy9tb2R1bGVzL3dlYi5kb20tY29sbGVjdGlvbnMuZm9yLWVhY2giKTsKCnJlcXVpcmUoImNvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yIik7Cgp2YXIgX3R5cGVvZjIgPSByZXF1aXJlKCIvdXNyL2xvY2FsL2RldmVsb3AvcGhwL3d3dy93YWliYW8vcHJvamVjdC9OTjIwMjAwNjA4MDEvYWRkb25zL2FkbWluL25vZGVfbW9kdWxlcy9AYmFiZWwvcnVudGltZS9oZWxwZXJzL3R5cGVvZiIpOwoKdmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIF90eXBlb2YyKFN5bWJvbC5pdGVyYXRvcikgPT09ICJzeW1ib2wiID8gZnVuY3Rpb24gKG9iaikgewogIHJldHVybiBfdHlwZW9mMihvYmopOwp9IDogZnVuY3Rpb24gKG9iaikgewogIHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyAic3ltYm9sIiA6IF90eXBlb2YyKG9iaik7Cn07Ci8qKgogKiBAZmlsZU92ZXJ2aWV3IEtpY2thc3MgbGlicmFyeSB0byBjcmVhdGUgYW5kIHBsYWNlIHBvcHBlcnMgbmVhciB0aGVpciByZWZlcmVuY2UgZWxlbWVudHMuCiAqIEB2ZXJzaW9uIHt7dmVyc2lvbn19CiAqIEBsaWNlbnNlCiAqIENvcHlyaWdodCAoYykgMjAxNiBGZWRlcmljbyBaaXZvbG8gYW5kIGNvbnRyaWJ1dG9ycwogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAogKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgogKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAogKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQogKiBTT0ZUV0FSRS4KICovCi8vCi8vIENyb3NzIG1vZHVsZSBsb2FkZXIKLy8gU3VwcG9ydGVkOiBOb2RlLCBBTUQsIEJyb3dzZXIgZ2xvYmFscwovLwoKCjsKCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZS4KICAgIGRlZmluZShmYWN0b3J5KTsKICB9IGVsc2UgaWYgKCh0eXBlb2YgbW9kdWxlID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihtb2R1bGUpKSA9PT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMpIHsKICAgIC8vIE5vZGUuIERvZXMgbm90IHdvcmsgd2l0aCBzdHJpY3QgQ29tbW9uSlMsIGJ1dAogICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsCiAgICAvLyBsaWtlIE5vZGUuCiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTsKICB9IGVsc2UgewogICAgLy8gQnJvd3NlciBnbG9iYWxzIChyb290IGlzIHdpbmRvdykKICAgIHJvb3QuUG9wcGVyID0gZmFjdG9yeSgpOwogIH0KfSkodW5kZWZpbmVkLCBmdW5jdGlvbiAoKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgcm9vdCA9IHdpbmRvdzsgLy8gZGVmYXVsdCBvcHRpb25zCgogIHZhciBERUZBVUxUUyA9IHsKICAgIC8vIHBsYWNlbWVudCBvZiB0aGUgcG9wcGVyCiAgICBwbGFjZW1lbnQ6ICdib3R0b20nLAogICAgZ3B1QWNjZWxlcmF0aW9uOiB0cnVlLAogICAgLy8gc2hpZnQgcG9wcGVyIGZyb20gaXRzIG9yaWdpbiBieSB0aGUgZ2l2ZW4gYW1vdW50IG9mIHBpeGVscyAoY2FuIGJlIG5lZ2F0aXZlKQogICAgb2Zmc2V0OiAwLAogICAgLy8gdGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBhY3QgYXMgYm91bmRhcnkgb2YgdGhlIHBvcHBlcgogICAgYm91bmRhcmllc0VsZW1lbnQ6ICd2aWV3cG9ydCcsCiAgICAvLyBhbW91bnQgb2YgcGl4ZWwgdXNlZCB0byBkZWZpbmUgYSBtaW5pbXVtIGRpc3RhbmNlIGJldHdlZW4gdGhlIGJvdW5kYXJpZXMgYW5kIHRoZSBwb3BwZXIKICAgIGJvdW5kYXJpZXNQYWRkaW5nOiA1LAogICAgLy8gcG9wcGVyIHdpbGwgdHJ5IHRvIHByZXZlbnQgb3ZlcmZsb3cgZm9sbG93aW5nIHRoaXMgb3JkZXIsCiAgICAvLyBieSBkZWZhdWx0LCB0aGVuLCBpdCBjb3VsZCBvdmVyZmxvdyBvbiB0aGUgbGVmdCBhbmQgb24gdG9wIG9mIHRoZSBib3VuZGFyaWVzRWxlbWVudAogICAgcHJldmVudE92ZXJmbG93T3JkZXI6IFsnbGVmdCcsICdyaWdodCcsICd0b3AnLCAnYm90dG9tJ10sCiAgICAvLyB0aGUgYmVoYXZpb3IgdXNlZCBieSBmbGlwIHRvIGNoYW5nZSB0aGUgcGxhY2VtZW50IG9mIHRoZSBwb3BwZXIKICAgIGZsaXBCZWhhdmlvcjogJ2ZsaXAnLAogICAgYXJyb3dFbGVtZW50OiAnW3gtYXJyb3ddJywKICAgIGFycm93T2Zmc2V0OiAwLAogICAgLy8gbGlzdCBvZiBmdW5jdGlvbnMgdXNlZCB0byBtb2RpZnkgdGhlIG9mZnNldHMgYmVmb3JlIHRoZXkgYXJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlcgogICAgbW9kaWZpZXJzOiBbJ3NoaWZ0JywgJ29mZnNldCcsICdwcmV2ZW50T3ZlcmZsb3cnLCAna2VlcFRvZ2V0aGVyJywgJ2Fycm93JywgJ2ZsaXAnLCAnYXBwbHlTdHlsZSddLAogICAgbW9kaWZpZXJzSWdub3JlZDogW10sCiAgICBmb3JjZUFic29sdXRlOiBmYWxzZQogIH07CiAgLyoqCiAgICogQ3JlYXRlIGEgbmV3IFBvcHBlci5qcyBpbnN0YW5jZQogICAqIEBjb25zdHJ1Y3RvciBQb3BwZXIKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSByZWZlcmVuY2UgLSBUaGUgcmVmZXJlbmNlIGVsZW1lbnQgdXNlZCB0byBwb3NpdGlvbiB0aGUgcG9wcGVyCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudHxPYmplY3R9IHBvcHBlcgogICAqICAgICAgVGhlIEhUTUwgZWxlbWVudCB1c2VkIGFzIHBvcHBlciwgb3IgYSBjb25maWd1cmF0aW9uIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIHBvcHBlci4KICAgKiBAcGFyYW0ge1N0cmluZ30gW3BvcHBlci50YWdOYW1lPSdkaXYnXSBUaGUgdGFnIG5hbWUgb2YgdGhlIGdlbmVyYXRlZCBwb3BwZXIuCiAgICogQHBhcmFtIHtBcnJheX0gW3BvcHBlci5jbGFzc05hbWVzPVsncG9wcGVyJ11dIEFycmF5IG9mIGNsYXNzZXMgdG8gYXBwbHkgdG8gdGhlIGdlbmVyYXRlZCBwb3BwZXIuCiAgICogQHBhcmFtIHtBcnJheX0gW3BvcHBlci5hdHRyaWJ1dGVzXSBBcnJheSBvZiBhdHRyaWJ1dGVzIHRvIGFwcGx5LCBzcGVjaWZ5IGBhdHRyOnZhbHVlYCB0byBhc3NpZ24gYSB2YWx1ZSB0byBpdC4KICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fFN0cmluZ30gW3BvcHBlci5wYXJlbnQ9d2luZG93LmRvY3VtZW50LmJvZHldIFRoZSBwYXJlbnQgZWxlbWVudCwgZ2l2ZW4gYXMgSFRNTEVsZW1lbnQgb3IgYXMgcXVlcnkgc3RyaW5nLgogICAqIEBwYXJhbSB7U3RyaW5nfSBbcG9wcGVyLmNvbnRlbnQ9JyddIFRoZSBjb250ZW50IG9mIHRoZSBwb3BwZXIsIGl0IGNhbiBiZSB0ZXh0LCBodG1sLCBvciBub2RlOyBpZiBpdCBpcyBub3QgdGV4dCwgc2V0IGBjb250ZW50VHlwZWAgdG8gYGh0bWxgIG9yIGBub2RlYC4KICAgKiBAcGFyYW0ge1N0cmluZ30gW3BvcHBlci5jb250ZW50VHlwZT0ndGV4dCddIElmIGBodG1sYCwgdGhlIGBjb250ZW50YCB3aWxsIGJlIHBhcnNlZCBhcyBIVE1MLiBJZiBgbm9kZWAsIGl0IHdpbGwgYmUgYXBwZW5kZWQgYXMtaXMuCiAgICogQHBhcmFtIHtTdHJpbmd9IFtwb3BwZXIuYXJyb3dUYWdOYW1lPSdkaXYnXSBTYW1lIGFzIGBwb3BwZXIudGFnTmFtZWAgYnV0IGZvciB0aGUgYXJyb3cgZWxlbWVudC4KICAgKiBAcGFyYW0ge0FycmF5fSBbcG9wcGVyLmFycm93Q2xhc3NOYW1lcz0ncG9wcGVyX19hcnJvdyddIFNhbWUgYXMgYHBvcHBlci5jbGFzc05hbWVzYCBidXQgZm9yIHRoZSBhcnJvdyBlbGVtZW50LgogICAqIEBwYXJhbSB7U3RyaW5nfSBbcG9wcGVyLmFycm93QXR0cmlidXRlcz1bJ3gtYXJyb3cnXV0gU2FtZSBhcyBgcG9wcGVyLmF0dHJpYnV0ZXNgIGJ1dCBmb3IgdGhlIGFycm93IGVsZW1lbnQuCiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMKICAgKiBAcGFyYW0ge1N0cmluZ30gW29wdGlvbnMucGxhY2VtZW50PWJvdHRvbV0KICAgKiAgICAgIFBsYWNlbWVudCBvZiB0aGUgcG9wcGVyIGFjY2VwdGVkIHZhbHVlczogYHRvcCgtc3RhcnQsIC1lbmQpLCByaWdodCgtc3RhcnQsIC1lbmQpLCBib3R0b20oLXN0YXJ0LCAtcmlnaHQpLAogICAqICAgICAgbGVmdCgtc3RhcnQsIC1lbmQpYAogICAqCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudHxTdHJpbmd9IFtvcHRpb25zLmFycm93RWxlbWVudD0nW3gtYXJyb3ddJ10KICAgKiAgICAgIFRoZSBET00gTm9kZSB1c2VkIGFzIGFycm93IGZvciB0aGUgcG9wcGVyLCBvciBhIENTUyBzZWxlY3RvciB1c2VkIHRvIGdldCB0aGUgRE9NIG5vZGUuIEl0IG11c3QgYmUgY2hpbGQgb2YKICAgKiAgICAgIGl0cyBwYXJlbnQgUG9wcGVyLiBQb3BwZXIuanMgd2lsbCBhcHBseSB0byB0aGUgZ2l2ZW4gZWxlbWVudCB0aGUgc3R5bGUgcmVxdWlyZWQgdG8gYWxpZ24gdGhlIGFycm93IHdpdGggaXRzCiAgICogICAgICByZWZlcmVuY2UgZWxlbWVudC4KICAgKiAgICAgIEJ5IGRlZmF1bHQsIGl0IHdpbGwgbG9vayBmb3IgYSBjaGlsZCBub2RlIG9mIHRoZSBwb3BwZXIgd2l0aCB0aGUgYHgtYXJyb3dgIGF0dHJpYnV0ZS4KICAgKgogICAqIEBwYXJhbSB7Qm9vbGVhbn0gW29wdGlvbnMuZ3B1QWNjZWxlcmF0aW9uPXRydWVdCiAgICogICAgICBXaGVuIHRoaXMgcHJvcGVydHkgaXMgc2V0IHRvIHRydWUsIHRoZSBwb3BwZXIgcG9zaXRpb24gd2lsbCBiZSBhcHBsaWVkIHVzaW5nIENTUzMgdHJhbnNsYXRlM2QsIGFsbG93aW5nIHRoZQogICAqICAgICAgYnJvd3NlciB0byB1c2UgdGhlIEdQVSB0byBhY2NlbGVyYXRlIHRoZSByZW5kZXJpbmcuCiAgICogICAgICBJZiBzZXQgdG8gZmFsc2UsIHRoZSBwb3BwZXIgd2lsbCBiZSBwbGFjZWQgdXNpbmcgYHRvcGAgYW5kIGBsZWZ0YCBwcm9wZXJ0aWVzLCBub3QgdXNpbmcgdGhlIEdQVS4KICAgKgogICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5vZmZzZXQ9MF0KICAgKiAgICAgIEFtb3VudCBvZiBwaXhlbHMgdGhlIHBvcHBlciB3aWxsIGJlIHNoaWZ0ZWQgKGNhbiBiZSBuZWdhdGl2ZSkuCiAgICoKICAgKiBAcGFyYW0ge1N0cmluZ3xFbGVtZW50fSBbb3B0aW9ucy5ib3VuZGFyaWVzRWxlbWVudD0ndmlld3BvcnQnXQogICAqICAgICAgVGhlIGVsZW1lbnQgd2hpY2ggd2lsbCBkZWZpbmUgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHBvcHBlciBwb3NpdGlvbiwgdGhlIHBvcHBlciB3aWxsIG5ldmVyIGJlIHBsYWNlZCBvdXRzaWRlCiAgICogICAgICBvZiB0aGUgZGVmaW5lZCBib3VuZGFyaWVzIChleGNlcHQgaWYgYGtlZXBUb2dldGhlcmAgaXMgZW5hYmxlZCkKICAgKgogICAqIEBwYXJhbSB7TnVtYmVyfSBbb3B0aW9ucy5ib3VuZGFyaWVzUGFkZGluZz01XQogICAqICAgICAgQWRkaXRpb25hbCBwYWRkaW5nIGZvciB0aGUgYm91bmRhcmllcwogICAqCiAgICogQHBhcmFtIHtBcnJheX0gW29wdGlvbnMucHJldmVudE92ZXJmbG93T3JkZXI9WydsZWZ0JywgJ3JpZ2h0JywgJ3RvcCcsICdib3R0b20nXV0KICAgKiAgICAgIE9yZGVyIHVzZWQgd2hlbiBQb3BwZXIuanMgdHJpZXMgdG8gYXZvaWQgb3ZlcmZsb3dzIGZyb20gdGhlIGJvdW5kYXJpZXMsIHRoZXkgd2lsbCBiZSBjaGVja2VkIGluIG9yZGVyLAogICAqICAgICAgdGhpcyBtZWFucyB0aGF0IHRoZSBsYXN0IG9uZXMgd2lsbCBuZXZlciBvdmVyZmxvdwogICAqCiAgICogQHBhcmFtIHtTdHJpbmd8QXJyYXl9IFtvcHRpb25zLmZsaXBCZWhhdmlvcj0nZmxpcCddCiAgICogICAgICBUaGUgYmVoYXZpb3IgdXNlZCBieSB0aGUgYGZsaXBgIG1vZGlmaWVyIHRvIGNoYW5nZSB0aGUgcGxhY2VtZW50IG9mIHRoZSBwb3BwZXIgd2hlbiB0aGUgbGF0dGVyIGlzIHRyeWluZyB0bwogICAqICAgICAgb3ZlcmxhcCBpdHMgcmVmZXJlbmNlIGVsZW1lbnQuIERlZmluaW5nIGBmbGlwYCBhcyB2YWx1ZSwgdGhlIHBsYWNlbWVudCB3aWxsIGJlIGZsaXBwZWQgb24KICAgKiAgICAgIGl0cyBheGlzIChgcmlnaHQgLSBsZWZ0YCwgYHRvcCAtIGJvdHRvbWApLgogICAqICAgICAgWW91IGNhbiBldmVuIHBhc3MgYW4gYXJyYXkgb2YgcGxhY2VtZW50cyAoZWc6IGBbJ3JpZ2h0JywgJ2xlZnQnLCAndG9wJ11gICkgdG8gbWFudWFsbHkgc3BlY2lmeQogICAqICAgICAgaG93IGFsdGVyIHRoZSBwbGFjZW1lbnQgd2hlbiBhIGZsaXAgaXMgbmVlZGVkLiAoZWcuIGluIHRoZSBhYm92ZSBleGFtcGxlLCBpdCB3b3VsZCBmaXJzdCBmbGlwIGZyb20gcmlnaHQgdG8gbGVmdCwKICAgKiAgICAgIHRoZW4sIGlmIGV2ZW4gaW4gaXRzIG5ldyBwbGFjZW1lbnQsIHRoZSBwb3BwZXIgaXMgb3ZlcmxhcHBpbmcgaXRzIHJlZmVyZW5jZSBlbGVtZW50LCBpdCB3aWxsIGJlIG1vdmVkIHRvIHRvcCkKICAgKgogICAqIEBwYXJhbSB7QXJyYXl9IFtvcHRpb25zLm1vZGlmaWVycz1bICdzaGlmdCcsICdvZmZzZXQnLCAncHJldmVudE92ZXJmbG93JywgJ2tlZXBUb2dldGhlcicsICdhcnJvdycsICdmbGlwJywgJ2FwcGx5U3R5bGUnXV0KICAgKiAgICAgIExpc3Qgb2YgZnVuY3Rpb25zIHVzZWQgdG8gbW9kaWZ5IHRoZSBkYXRhIGJlZm9yZSB0aGV5IGFyZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIsIGFkZCB5b3VyIGN1c3RvbSBmdW5jdGlvbnMKICAgKiAgICAgIHRvIHRoaXMgYXJyYXkgdG8gZWRpdCB0aGUgb2Zmc2V0cyBhbmQgcGxhY2VtZW50LgogICAqICAgICAgVGhlIGZ1bmN0aW9uIHNob3VsZCByZWZsZWN0IHRoZSBAcGFyYW1zIGFuZCBAcmV0dXJucyBvZiBwcmV2ZW50T3ZlcmZsb3cKICAgKgogICAqIEBwYXJhbSB7QXJyYXl9IFtvcHRpb25zLm1vZGlmaWVyc0lnbm9yZWQ9W11dCiAgICogICAgICBQdXQgaGVyZSBhbnkgYnVpbHQtaW4gbW9kaWZpZXIgbmFtZSB5b3Ugd2FudCB0byBleGNsdWRlIGZyb20gdGhlIG1vZGlmaWVycyBsaXN0CiAgICogICAgICBUaGUgZnVuY3Rpb24gc2hvdWxkIHJlZmxlY3QgdGhlIEBwYXJhbXMgYW5kIEByZXR1cm5zIG9mIHByZXZlbnRPdmVyZmxvdwogICAqCiAgICogQHBhcmFtIHtCb29sZWFufSBbb3B0aW9ucy5yZW1vdmVPbkRlc3Ryb3k9ZmFsc2VdCiAgICogICAgICBTZXQgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBhdXRvbWF0aWNhbGx5IHJlbW92ZSB0aGUgcG9wcGVyIHdoZW4geW91IGNhbGwgdGhlIGBkZXN0cm95YCBtZXRob2QuCiAgICovCgogIGZ1bmN0aW9uIFBvcHBlcihyZWZlcmVuY2UsIHBvcHBlciwgb3B0aW9ucykgewogICAgdGhpcy5fcmVmZXJlbmNlID0gcmVmZXJlbmNlLmpxdWVyeSA/IHJlZmVyZW5jZVswXSA6IHJlZmVyZW5jZTsKICAgIHRoaXMuc3RhdGUgPSB7fTsgLy8gaWYgdGhlIHBvcHBlciB2YXJpYWJsZSBpcyBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBwYXJzZSBpdCB0byBnZW5lcmF0ZSBhbiBIVE1MRWxlbWVudAogICAgLy8gZ2VuZXJhdGUgYSBkZWZhdWx0IHBvcHBlciBpZiBpcyBub3QgZGVmaW5lZAoKICAgIHZhciBpc05vdERlZmluZWQgPSB0eXBlb2YgcG9wcGVyID09PSAndW5kZWZpbmVkJyB8fCBwb3BwZXIgPT09IG51bGw7CiAgICB2YXIgaXNDb25maWcgPSBwb3BwZXIgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHBvcHBlcikgPT09ICdbb2JqZWN0IE9iamVjdF0nOwoKICAgIGlmIChpc05vdERlZmluZWQgfHwgaXNDb25maWcpIHsKICAgICAgdGhpcy5fcG9wcGVyID0gdGhpcy5wYXJzZShpc0NvbmZpZyA/IHBvcHBlciA6IHt9KTsKICAgIH0gLy8gb3RoZXJ3aXNlLCB1c2UgdGhlIGdpdmVuIEhUTUxFbGVtZW50IGFzIHBvcHBlcgogICAgZWxzZSB7CiAgICAgICAgdGhpcy5fcG9wcGVyID0gcG9wcGVyLmpxdWVyeSA/IHBvcHBlclswXSA6IHBvcHBlcjsKICAgICAgfSAvLyB3aXRoIHt9IHdlIGNyZWF0ZSBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgb3B0aW9ucyBpbnNpZGUgaXQKCgogICAgdGhpcy5fb3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRTLCBvcHRpb25zKTsgLy8gcmVmYWN0b3JpbmcgbW9kaWZpZXJzJyBsaXN0CgogICAgdGhpcy5fb3B0aW9ucy5tb2RpZmllcnMgPSB0aGlzLl9vcHRpb25zLm1vZGlmaWVycy5tYXAoZnVuY3Rpb24gKG1vZGlmaWVyKSB7CiAgICAgIC8vIHJlbW92ZSBpZ25vcmVkIG1vZGlmaWVycwogICAgICBpZiAodGhpcy5fb3B0aW9ucy5tb2RpZmllcnNJZ25vcmVkLmluZGV4T2YobW9kaWZpZXIpICE9PSAtMSkgcmV0dXJuOyAvLyBzZXQgdGhlIHgtcGxhY2VtZW50IGF0dHJpYnV0ZSBiZWZvcmUgZXZlcnl0aGluZyBlbHNlIGJlY2F1c2UgaXQgY291bGQgYmUgdXNlZCB0byBhZGQgbWFyZ2lucyB0byB0aGUgcG9wcGVyCiAgICAgIC8vIG1hcmdpbnMgbmVlZHMgdG8gYmUgY2FsY3VsYXRlZCB0byBnZXQgdGhlIGNvcnJlY3QgcG9wcGVyIG9mZnNldHMKCiAgICAgIGlmIChtb2RpZmllciA9PT0gJ2FwcGx5U3R5bGUnKSB7CiAgICAgICAgdGhpcy5fcG9wcGVyLnNldEF0dHJpYnV0ZSgneC1wbGFjZW1lbnQnLCB0aGlzLl9vcHRpb25zLnBsYWNlbWVudCk7CiAgICAgIH0gLy8gcmV0dXJuIHByZWRlZmluZWQgbW9kaWZpZXIgaWRlbnRpZmllZCBieSBzdHJpbmcgb3Iga2VlcCB0aGUgY3VzdG9tIG9uZQoKCiAgICAgIHJldHVybiB0aGlzLm1vZGlmaWVyc1ttb2RpZmllcl0gfHwgbW9kaWZpZXI7CiAgICB9LmJpbmQodGhpcykpOyAvLyBtYWtlIHN1cmUgdG8gYXBwbHkgdGhlIHBvcHBlciBwb3NpdGlvbiBiZWZvcmUgYW55IGNvbXB1dGF0aW9uCgogICAgdGhpcy5zdGF0ZS5wb3NpdGlvbiA9IHRoaXMuX2dldFBvc2l0aW9uKHRoaXMuX3BvcHBlciwgdGhpcy5fcmVmZXJlbmNlKTsKICAgIHNldFN0eWxlKHRoaXMuX3BvcHBlciwgewogICAgICBwb3NpdGlvbjogdGhpcy5zdGF0ZS5wb3NpdGlvbiwKICAgICAgdG9wOiAwCiAgICB9KTsgLy8gZmlyZSB0aGUgZmlyc3QgdXBkYXRlIHRvIHBvc2l0aW9uIHRoZSBwb3BwZXIgaW4gdGhlIHJpZ2h0IHBsYWNlCgogICAgdGhpcy51cGRhdGUoKTsgLy8gc2V0dXAgZXZlbnQgbGlzdGVuZXJzLCB0aGV5IHdpbGwgdGFrZSBjYXJlIG9mIHVwZGF0ZSB0aGUgcG9zaXRpb24gaW4gc3BlY2lmaWMgc2l0dWF0aW9ucwoKICAgIHRoaXMuX3NldHVwRXZlbnRMaXN0ZW5lcnMoKTsKCiAgICByZXR1cm4gdGhpczsKICB9IC8vCiAgLy8gTWV0aG9kcwogIC8vCgogIC8qKgogICAqIERlc3Ryb3kgdGhlIHBvcHBlcgogICAqIEBtZXRob2QKICAgKiBAbWVtYmVyb2YgUG9wcGVyCiAgICovCgoKICBQb3BwZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICB0aGlzLl9wb3BwZXIucmVtb3ZlQXR0cmlidXRlKCd4LXBsYWNlbWVudCcpOwoKICAgIHRoaXMuX3BvcHBlci5zdHlsZS5sZWZ0ID0gJyc7CiAgICB0aGlzLl9wb3BwZXIuc3R5bGUucG9zaXRpb24gPSAnJzsKICAgIHRoaXMuX3BvcHBlci5zdHlsZS50b3AgPSAnJzsKICAgIHRoaXMuX3BvcHBlci5zdHlsZVtnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUoJ3RyYW5zZm9ybScpXSA9ICcnOwoKICAgIHRoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXJzKCk7IC8vIHJlbW92ZSB0aGUgcG9wcGVyIGlmIHVzZXIgZXhwbGljaXR5IGFza2VkIGZvciB0aGUgZGVsZXRpb24gb24gZGVzdHJveQoKCiAgICBpZiAodGhpcy5fb3B0aW9ucy5yZW1vdmVPbkRlc3Ryb3kpIHsKICAgICAgdGhpcy5fcG9wcGVyLnJlbW92ZSgpOwogICAgfQoKICAgIHJldHVybiB0aGlzOwogIH07CiAgLyoqCiAgICogVXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHBvcHBlciwgY29tcHV0aW5nIHRoZSBuZXcgb2Zmc2V0cyBhbmQgYXBwbHlpbmcgdGhlIG5ldyBzdHlsZQogICAqIEBtZXRob2QKICAgKiBAbWVtYmVyb2YgUG9wcGVyCiAgICovCgoKICBQb3BwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciBkYXRhID0gewogICAgICBpbnN0YW5jZTogdGhpcywKICAgICAgc3R5bGVzOiB7fQogICAgfTsgLy8gc3RvcmUgcGxhY2VtZW50IGluc2lkZSB0aGUgZGF0YSBvYmplY3QsIG1vZGlmaWVycyB3aWxsIGJlIGFibGUgdG8gZWRpdCBgcGxhY2VtZW50YCBpZiBuZWVkZWQKICAgIC8vIGFuZCByZWZlciB0byBfb3JpZ2luYWxQbGFjZW1lbnQgdG8ga25vdyB0aGUgb3JpZ2luYWwgdmFsdWUKCiAgICBkYXRhLnBsYWNlbWVudCA9IHRoaXMuX29wdGlvbnMucGxhY2VtZW50OwogICAgZGF0YS5fb3JpZ2luYWxQbGFjZW1lbnQgPSB0aGlzLl9vcHRpb25zLnBsYWNlbWVudDsgLy8gY29tcHV0ZSB0aGUgcG9wcGVyIGFuZCByZWZlcmVuY2Ugb2Zmc2V0cyBhbmQgcHV0IHRoZW0gaW5zaWRlIGRhdGEub2Zmc2V0cwoKICAgIGRhdGEub2Zmc2V0cyA9IHRoaXMuX2dldE9mZnNldHModGhpcy5fcG9wcGVyLCB0aGlzLl9yZWZlcmVuY2UsIGRhdGEucGxhY2VtZW50KTsgLy8gZ2V0IGJvdW5kYXJpZXMKCiAgICBkYXRhLmJvdW5kYXJpZXMgPSB0aGlzLl9nZXRCb3VuZGFyaWVzKGRhdGEsIHRoaXMuX29wdGlvbnMuYm91bmRhcmllc1BhZGRpbmcsIHRoaXMuX29wdGlvbnMuYm91bmRhcmllc0VsZW1lbnQpOwogICAgZGF0YSA9IHRoaXMucnVuTW9kaWZpZXJzKGRhdGEsIHRoaXMuX29wdGlvbnMubW9kaWZpZXJzKTsKCiAgICBpZiAodHlwZW9mIHRoaXMuc3RhdGUudXBkYXRlQ2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIHsKICAgICAgdGhpcy5zdGF0ZS51cGRhdGVDYWxsYmFjayhkYXRhKTsKICAgIH0KICB9OwogIC8qKgogICAqIElmIGEgZnVuY3Rpb24gaXMgcGFzc2VkLCBpdCB3aWxsIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBpbml0aWFsaXphdGlvbiBvZiBwb3BwZXIgd2l0aCBhcyBmaXJzdCBhcmd1bWVudCB0aGUgUG9wcGVyIGluc3RhbmNlLgogICAqIEBtZXRob2QKICAgKiBAbWVtYmVyb2YgUG9wcGVyCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sKICAgKi8KCgogIFBvcHBlci5wcm90b3R5cGUub25DcmVhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgIC8vIHRoZSBjcmVhdGVDYWxsYmFja3MgcmV0dXJuIGFzIGZpcnN0IGFyZ3VtZW50IHRoZSBwb3BwZXIgaW5zdGFuY2UKICAgIGNhbGxiYWNrKHRoaXMpOwogICAgcmV0dXJuIHRoaXM7CiAgfTsKICAvKioKICAgKiBJZiBhIGZ1bmN0aW9uIGlzIHBhc3NlZCwgaXQgd2lsbCBiZSBleGVjdXRlZCBhZnRlciBlYWNoIHVwZGF0ZSBvZiBwb3BwZXIgd2l0aCBhcyBmaXJzdCBhcmd1bWVudCB0aGUgc2V0IG9mIGNvb3JkaW5hdGVzIGFuZCBpbmZvcm1hdGlvbnMKICAgKiB1c2VkIHRvIHN0eWxlIHBvcHBlciBhbmQgaXRzIGFycm93LgogICAqIE5PVEU6IGl0IGRvZXNuJ3QgZ2V0IGZpcmVkIG9uIHRoZSBmaXJzdCBjYWxsIG9mIHRoZSBgUG9wcGVyLnVwZGF0ZSgpYCBtZXRob2QgaW5zaWRlIHRoZSBgUG9wcGVyYCBjb25zdHJ1Y3RvciEKICAgKiBAbWV0aG9kCiAgICogQG1lbWJlcm9mIFBvcHBlcgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrCiAgICovCgoKICBQb3BwZXIucHJvdG90eXBlLm9uVXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICB0aGlzLnN0YXRlLnVwZGF0ZUNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICByZXR1cm4gdGhpczsKICB9OwogIC8qKgogICAqIEhlbHBlciB1c2VkIHRvIGdlbmVyYXRlIHBvcHBlcnMgZnJvbSBhIGNvbmZpZ3VyYXRpb24gZmlsZQogICAqIEBtZXRob2QKICAgKiBAbWVtYmVyb2YgUG9wcGVyCiAgICogQHBhcmFtIGNvbmZpZyB7T2JqZWN0fSBjb25maWd1cmF0aW9uCiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fSBwb3BwZXIKICAgKi8KCgogIFBvcHBlci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAoY29uZmlnKSB7CiAgICB2YXIgZGVmYXVsdENvbmZpZyA9IHsKICAgICAgdGFnTmFtZTogJ2RpdicsCiAgICAgIGNsYXNzTmFtZXM6IFsncG9wcGVyJ10sCiAgICAgIGF0dHJpYnV0ZXM6IFtdLAogICAgICBwYXJlbnQ6IHJvb3QuZG9jdW1lbnQuYm9keSwKICAgICAgY29udGVudDogJycsCiAgICAgIGNvbnRlbnRUeXBlOiAndGV4dCcsCiAgICAgIGFycm93VGFnTmFtZTogJ2RpdicsCiAgICAgIGFycm93Q2xhc3NOYW1lczogWydwb3BwZXJfX2Fycm93J10sCiAgICAgIGFycm93QXR0cmlidXRlczogWyd4LWFycm93J10KICAgIH07CiAgICBjb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0Q29uZmlnLCBjb25maWcpOwogICAgdmFyIGQgPSByb290LmRvY3VtZW50OwogICAgdmFyIHBvcHBlciA9IGQuY3JlYXRlRWxlbWVudChjb25maWcudGFnTmFtZSk7CiAgICBhZGRDbGFzc05hbWVzKHBvcHBlciwgY29uZmlnLmNsYXNzTmFtZXMpOwogICAgYWRkQXR0cmlidXRlcyhwb3BwZXIsIGNvbmZpZy5hdHRyaWJ1dGVzKTsKCiAgICBpZiAoY29uZmlnLmNvbnRlbnRUeXBlID09PSAnbm9kZScpIHsKICAgICAgcG9wcGVyLmFwcGVuZENoaWxkKGNvbmZpZy5jb250ZW50LmpxdWVyeSA/IGNvbmZpZy5jb250ZW50WzBdIDogY29uZmlnLmNvbnRlbnQpOwogICAgfSBlbHNlIGlmIChjb25maWcuY29udGVudFR5cGUgPT09ICdodG1sJykgewogICAgICBwb3BwZXIuaW5uZXJIVE1MID0gY29uZmlnLmNvbnRlbnQ7CiAgICB9IGVsc2UgewogICAgICBwb3BwZXIudGV4dENvbnRlbnQgPSBjb25maWcuY29udGVudDsKICAgIH0KCiAgICBpZiAoY29uZmlnLmFycm93VGFnTmFtZSkgewogICAgICB2YXIgYXJyb3cgPSBkLmNyZWF0ZUVsZW1lbnQoY29uZmlnLmFycm93VGFnTmFtZSk7CiAgICAgIGFkZENsYXNzTmFtZXMoYXJyb3csIGNvbmZpZy5hcnJvd0NsYXNzTmFtZXMpOwogICAgICBhZGRBdHRyaWJ1dGVzKGFycm93LCBjb25maWcuYXJyb3dBdHRyaWJ1dGVzKTsKICAgICAgcG9wcGVyLmFwcGVuZENoaWxkKGFycm93KTsKICAgIH0KCiAgICB2YXIgcGFyZW50ID0gY29uZmlnLnBhcmVudC5qcXVlcnkgPyBjb25maWcucGFyZW50WzBdIDogY29uZmlnLnBhcmVudDsgLy8gaWYgdGhlIGdpdmVuIHBhcmVudCBpcyBhIHN0cmluZywgdXNlIGl0IHRvIG1hdGNoIGFuIGVsZW1lbnQKICAgIC8vIGlmIG1vcmUgdGhhbiBvbmUgZWxlbWVudCBpcyBtYXRjaGVkLCB0aGUgZmlyc3Qgb25lIHdpbGwgYmUgdXNlZCBhcyBwYXJlbnQKICAgIC8vIGlmIG5vIGVsZW1lbnRzIGFyZSBtYXRjaGVkLCB0aGUgc2NyaXB0IHdpbGwgdGhyb3cgYW4gZXJyb3IKCiAgICBpZiAodHlwZW9mIHBhcmVudCA9PT0gJ3N0cmluZycpIHsKICAgICAgcGFyZW50ID0gZC5xdWVyeVNlbGVjdG9yQWxsKGNvbmZpZy5wYXJlbnQpOwoKICAgICAgaWYgKHBhcmVudC5sZW5ndGggPiAxKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiB0aGUgZ2l2ZW4gYHBhcmVudGAgcXVlcnkoJyArIGNvbmZpZy5wYXJlbnQgKyAnKSBtYXRjaGVkIG1vcmUgdGhhbiBvbmUgZWxlbWVudCwgdGhlIGZpcnN0IG9uZSB3aWxsIGJlIHVzZWQnKTsKICAgICAgfQoKICAgICAgaWYgKHBhcmVudC5sZW5ndGggPT09IDApIHsKICAgICAgICB0aHJvdyAnRVJST1I6IHRoZSBnaXZlbiBgcGFyZW50YCBkb2VzblwndCBleGlzdHMhJzsKICAgICAgfQoKICAgICAgcGFyZW50ID0gcGFyZW50WzBdOwogICAgfSAvLyBpZiB0aGUgZ2l2ZW4gcGFyZW50IGlzIGEgRE9NIG5vZGVzIGxpc3Qgb3IgYW4gYXJyYXkgb2Ygbm9kZXMgd2l0aCBtb3JlIHRoYW4gb25lIGVsZW1lbnQsCiAgICAvLyB0aGUgZmlyc3Qgb25lIHdpbGwgYmUgdXNlZCBhcyBwYXJlbnQKCgogICAgaWYgKHBhcmVudC5sZW5ndGggPiAxICYmIHBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQgPT09IGZhbHNlKSB7CiAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogeW91IGhhdmUgcGFzc2VkIGFzIHBhcmVudCBhIGxpc3Qgb2YgZWxlbWVudHMsIHRoZSBmaXJzdCBvbmUgd2lsbCBiZSB1c2VkJyk7CiAgICAgIHBhcmVudCA9IHBhcmVudFswXTsKICAgIH0gLy8gYXBwZW5kIHRoZSBnZW5lcmF0ZWQgcG9wcGVyIHRvIGl0cyBwYXJlbnQKCgogICAgcGFyZW50LmFwcGVuZENoaWxkKHBvcHBlcik7CiAgICByZXR1cm4gcG9wcGVyOwogICAgLyoqCiAgICAgKiBBZGRzIGNsYXNzIG5hbWVzIHRvIHRoZSBnaXZlbiBlbGVtZW50CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBpZ25vcmUKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRhcmdldAogICAgICogQHBhcmFtIHtBcnJheX0gY2xhc3NlcwogICAgICovCgogICAgZnVuY3Rpb24gYWRkQ2xhc3NOYW1lcyhlbGVtZW50LCBjbGFzc05hbWVzKSB7CiAgICAgIGNsYXNzTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xhc3NOYW1lKSB7CiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7CiAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBBZGRzIGF0dHJpYnV0ZXMgdG8gdGhlIGdpdmVuIGVsZW1lbnQKICAgICAqIEBmdW5jdGlvbgogICAgICogQGlnbm9yZQogICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge0FycmF5fSBhdHRyaWJ1dGVzCiAgICAgKiBAZXhhbXBsZQogICAgICogYWRkQXR0cmlidXRlcyhlbGVtZW50LCBbICdkYXRhLWluZm86Zm9vYmFyJyBdKTsKICAgICAqLwoKCiAgICBmdW5jdGlvbiBhZGRBdHRyaWJ1dGVzKGVsZW1lbnQsIGF0dHJpYnV0ZXMpIHsKICAgICAgYXR0cmlidXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHsKICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUuc3BsaXQoJzonKVswXSwgYXR0cmlidXRlLnNwbGl0KCc6JylbMV0gfHwgJycpOwogICAgICB9KTsKICAgIH0KICB9OwogIC8qKgogICAqIEhlbHBlciB1c2VkIHRvIGdldCB0aGUgcG9zaXRpb24gd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBwb3BwZXIKICAgKiBAbWV0aG9kCiAgICogQG1lbWJlcm9mIFBvcHBlcgogICAqIEBwYXJhbSBjb25maWcge0hUTUxFbGVtZW50fSBwb3BwZXIgZWxlbWVudAogICAqIEBwYXJhbSByZWZlcmVuY2Uge0hUTUxFbGVtZW50fSByZWZlcmVuY2UgZWxlbWVudAogICAqIEByZXR1cm5zIHtTdHJpbmd9IHBvc2l0aW9uCiAgICovCgoKICBQb3BwZXIucHJvdG90eXBlLl9nZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChwb3BwZXIsIHJlZmVyZW5jZSkgewogICAgdmFyIGNvbnRhaW5lciA9IGdldE9mZnNldFBhcmVudChyZWZlcmVuY2UpOwoKICAgIGlmICh0aGlzLl9vcHRpb25zLmZvcmNlQWJzb2x1dGUpIHsKICAgICAgcmV0dXJuICdhYnNvbHV0ZSc7CiAgICB9IC8vIERlY2lkZSBpZiB0aGUgcG9wcGVyIHdpbGwgYmUgZml4ZWQKICAgIC8vIElmIHRoZSByZWZlcmVuY2UgZWxlbWVudCBpcyBpbnNpZGUgYSBmaXhlZCBjb250ZXh0LCB0aGUgcG9wcGVyIHdpbGwgYmUgZml4ZWQgYXMgd2VsbCB0byBhbGxvdyB0aGVtIHRvIHNjcm9sbCB0b2dldGhlcgoKCiAgICB2YXIgaXNQYXJlbnRGaXhlZCA9IGlzRml4ZWQocmVmZXJlbmNlLCBjb250YWluZXIpOwogICAgcmV0dXJuIGlzUGFyZW50Rml4ZWQgPyAnZml4ZWQnIDogJ2Fic29sdXRlJzsKICB9OwogIC8qKgogICAqIEdldCBvZmZzZXRzIHRvIHRoZSBwb3BwZXIKICAgKiBAbWV0aG9kCiAgICogQG1lbWJlcm9mIFBvcHBlcgogICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAqIEBwYXJhbSB7RWxlbWVudH0gcG9wcGVyIC0gdGhlIHBvcHBlciBlbGVtZW50CiAgICogQHBhcmFtIHtFbGVtZW50fSByZWZlcmVuY2UgLSB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgKHRoZSBwb3BwZXIgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGlzKQogICAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBvZmZzZXRzIHdoaWNoIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgcG9wcGVyCiAgICovCgoKICBQb3BwZXIucHJvdG90eXBlLl9nZXRPZmZzZXRzID0gZnVuY3Rpb24gKHBvcHBlciwgcmVmZXJlbmNlLCBwbGFjZW1lbnQpIHsKICAgIHBsYWNlbWVudCA9IHBsYWNlbWVudC5zcGxpdCgnLScpWzBdOwogICAgdmFyIHBvcHBlck9mZnNldHMgPSB7fTsKICAgIHBvcHBlck9mZnNldHMucG9zaXRpb24gPSB0aGlzLnN0YXRlLnBvc2l0aW9uOwogICAgdmFyIGlzUGFyZW50Rml4ZWQgPSBwb3BwZXJPZmZzZXRzLnBvc2l0aW9uID09PSAnZml4ZWQnOyAvLwogICAgLy8gR2V0IHJlZmVyZW5jZSBlbGVtZW50IHBvc2l0aW9uCiAgICAvLwoKICAgIHZhciByZWZlcmVuY2VPZmZzZXRzID0gZ2V0T2Zmc2V0UmVjdFJlbGF0aXZlVG9DdXN0b21QYXJlbnQocmVmZXJlbmNlLCBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKSwgaXNQYXJlbnRGaXhlZCk7IC8vCiAgICAvLyBHZXQgcG9wcGVyIHNpemVzCiAgICAvLwoKICAgIHZhciBwb3BwZXJSZWN0ID0gZ2V0T3V0ZXJTaXplcyhwb3BwZXIpOyAvLwogICAgLy8gQ29tcHV0ZSBvZmZzZXRzIG9mIHBvcHBlcgogICAgLy8KICAgIC8vIGRlcGVuZGluZyBieSB0aGUgcG9wcGVyIHBsYWNlbWVudCB3ZSBoYXZlIHRvIGNvbXB1dGUgaXRzIG9mZnNldHMgc2xpZ2h0bHkgZGlmZmVyZW50bHkKCiAgICBpZiAoWydyaWdodCcsICdsZWZ0J10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMSkgewogICAgICBwb3BwZXJPZmZzZXRzLnRvcCA9IHJlZmVyZW5jZU9mZnNldHMudG9wICsgcmVmZXJlbmNlT2Zmc2V0cy5oZWlnaHQgLyAyIC0gcG9wcGVyUmVjdC5oZWlnaHQgLyAyOwoKICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ2xlZnQnKSB7CiAgICAgICAgcG9wcGVyT2Zmc2V0cy5sZWZ0ID0gcmVmZXJlbmNlT2Zmc2V0cy5sZWZ0IC0gcG9wcGVyUmVjdC53aWR0aDsKICAgICAgfSBlbHNlIHsKICAgICAgICBwb3BwZXJPZmZzZXRzLmxlZnQgPSByZWZlcmVuY2VPZmZzZXRzLnJpZ2h0OwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBwb3BwZXJPZmZzZXRzLmxlZnQgPSByZWZlcmVuY2VPZmZzZXRzLmxlZnQgKyByZWZlcmVuY2VPZmZzZXRzLndpZHRoIC8gMiAtIHBvcHBlclJlY3Qud2lkdGggLyAyOwoKICAgICAgaWYgKHBsYWNlbWVudCA9PT0gJ3RvcCcpIHsKICAgICAgICBwb3BwZXJPZmZzZXRzLnRvcCA9IHJlZmVyZW5jZU9mZnNldHMudG9wIC0gcG9wcGVyUmVjdC5oZWlnaHQ7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcG9wcGVyT2Zmc2V0cy50b3AgPSByZWZlcmVuY2VPZmZzZXRzLmJvdHRvbTsKICAgICAgfQogICAgfSAvLyBBZGQgd2lkdGggYW5kIGhlaWdodCB0byBvdXIgb2Zmc2V0cyBvYmplY3QKCgogICAgcG9wcGVyT2Zmc2V0cy53aWR0aCA9IHBvcHBlclJlY3Qud2lkdGg7CiAgICBwb3BwZXJPZmZzZXRzLmhlaWdodCA9IHBvcHBlclJlY3QuaGVpZ2h0OwogICAgcmV0dXJuIHsKICAgICAgcG9wcGVyOiBwb3BwZXJPZmZzZXRzLAogICAgICByZWZlcmVuY2U6IHJlZmVyZW5jZU9mZnNldHMKICAgIH07CiAgfTsKICAvKioKICAgKiBTZXR1cCBuZWVkZWQgZXZlbnQgbGlzdGVuZXJzIHVzZWQgdG8gdXBkYXRlIHRoZSBwb3BwZXIgcG9zaXRpb24KICAgKiBAbWV0aG9kCiAgICogQG1lbWJlcm9mIFBvcHBlcgogICAqIEBhY2Nlc3MgcHJpdmF0ZQogICAqLwoKCiAgUG9wcGVyLnByb3RvdHlwZS5fc2V0dXBFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHsKICAgIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlCiAgICB0aGlzLnN0YXRlLnVwZGF0ZUJvdW5kID0gdGhpcy51cGRhdGUuYmluZCh0aGlzKTsKICAgIHJvb3QuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5zdGF0ZS51cGRhdGVCb3VuZCk7IC8vIGlmIHRoZSBib3VuZGFyaWVzRWxlbWVudCBpcyB3aW5kb3cgd2UgZG9uJ3QgbmVlZCB0byBsaXN0ZW4gZm9yIHRoZSBzY3JvbGwgZXZlbnQKCiAgICBpZiAodGhpcy5fb3B0aW9ucy5ib3VuZGFyaWVzRWxlbWVudCAhPT0gJ3dpbmRvdycpIHsKICAgICAgdmFyIHRhcmdldCA9IGdldFNjcm9sbFBhcmVudCh0aGlzLl9yZWZlcmVuY2UpOyAvLyBoZXJlIGl0IGNvdWxkIGJlIGJvdGggYGJvZHlgIG9yIGBkb2N1bWVudEVsZW1lbnRgIHRoYW5rcyB0byBGaXJlZm94LCB3ZSB0aGVuIGNoZWNrIGJvdGgKCiAgICAgIGlmICh0YXJnZXQgPT09IHJvb3QuZG9jdW1lbnQuYm9keSB8fCB0YXJnZXQgPT09IHJvb3QuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7CiAgICAgICAgdGFyZ2V0ID0gcm9vdDsKICAgICAgfQoKICAgICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc3RhdGUudXBkYXRlQm91bmQpOwogICAgICB0aGlzLnN0YXRlLnNjcm9sbFRhcmdldCA9IHRhcmdldDsKICAgIH0KICB9OwogIC8qKgogICAqIFJlbW92ZSBldmVudCBsaXN0ZW5lcnMgdXNlZCB0byB1cGRhdGUgdGhlIHBvcHBlciBwb3NpdGlvbgogICAqIEBtZXRob2QKICAgKiBAbWVtYmVyb2YgUG9wcGVyCiAgICogQGFjY2VzcyBwcml2YXRlCiAgICovCgoKICBQb3BwZXIucHJvdG90eXBlLl9yZW1vdmVFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uICgpIHsKICAgIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlCiAgICByb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMuc3RhdGUudXBkYXRlQm91bmQpOwoKICAgIGlmICh0aGlzLl9vcHRpb25zLmJvdW5kYXJpZXNFbGVtZW50ICE9PSAnd2luZG93JyAmJiB0aGlzLnN0YXRlLnNjcm9sbFRhcmdldCkgewogICAgICB0aGlzLnN0YXRlLnNjcm9sbFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnN0YXRlLnVwZGF0ZUJvdW5kKTsKICAgICAgdGhpcy5zdGF0ZS5zY3JvbGxUYXJnZXQgPSBudWxsOwogICAgfQoKICAgIHRoaXMuc3RhdGUudXBkYXRlQm91bmQgPSBudWxsOwogIH07CiAgLyoqCiAgICogQ29tcHV0ZWQgdGhlIGJvdW5kYXJpZXMgbGltaXRzIGFuZCByZXR1cm4gdGhlbQogICAqIEBtZXRob2QKICAgKiBAbWVtYmVyb2YgUG9wcGVyCiAgICogQGFjY2VzcyBwcml2YXRlCiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBPYmplY3QgY29udGFpbmluZyB0aGUgcHJvcGVydHkgIm9mZnNldHMiIGdlbmVyYXRlZCBieSBgX2dldE9mZnNldHNgCiAgICogQHBhcmFtIHtOdW1iZXJ9IHBhZGRpbmcgLSBCb3VuZGFyaWVzIHBhZGRpbmcKICAgKiBAcGFyYW0ge0VsZW1lbnR9IGJvdW5kYXJpZXNFbGVtZW50IC0gRWxlbWVudCB1c2VkIHRvIGRlZmluZSB0aGUgYm91bmRhcmllcwogICAqIEByZXR1cm5zIHtPYmplY3R9IENvb3JkaW5hdGVzIG9mIHRoZSBib3VuZGFyaWVzCiAgICovCgoKICBQb3BwZXIucHJvdG90eXBlLl9nZXRCb3VuZGFyaWVzID0gZnVuY3Rpb24gKGRhdGEsIHBhZGRpbmcsIGJvdW5kYXJpZXNFbGVtZW50KSB7CiAgICAvLyBOT1RFOiAxIERPTSBhY2Nlc3MgaGVyZQogICAgdmFyIGJvdW5kYXJpZXMgPSB7fTsKICAgIHZhciB3aWR0aCwgaGVpZ2h0OwoKICAgIGlmIChib3VuZGFyaWVzRWxlbWVudCA9PT0gJ3dpbmRvdycpIHsKICAgICAgdmFyIGJvZHkgPSByb290LmRvY3VtZW50LmJvZHksCiAgICAgICAgICBodG1sID0gcm9vdC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CiAgICAgIGhlaWdodCA9IE1hdGgubWF4KGJvZHkuc2Nyb2xsSGVpZ2h0LCBib2R5Lm9mZnNldEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLm9mZnNldEhlaWdodCk7CiAgICAgIHdpZHRoID0gTWF0aC5tYXgoYm9keS5zY3JvbGxXaWR0aCwgYm9keS5vZmZzZXRXaWR0aCwgaHRtbC5jbGllbnRXaWR0aCwgaHRtbC5zY3JvbGxXaWR0aCwgaHRtbC5vZmZzZXRXaWR0aCk7CiAgICAgIGJvdW5kYXJpZXMgPSB7CiAgICAgICAgdG9wOiAwLAogICAgICAgIHJpZ2h0OiB3aWR0aCwKICAgICAgICBib3R0b206IGhlaWdodCwKICAgICAgICBsZWZ0OiAwCiAgICAgIH07CiAgICB9IGVsc2UgaWYgKGJvdW5kYXJpZXNFbGVtZW50ID09PSAndmlld3BvcnQnKSB7CiAgICAgIHZhciBvZmZzZXRQYXJlbnQgPSBnZXRPZmZzZXRQYXJlbnQodGhpcy5fcG9wcGVyKTsKICAgICAgdmFyIHNjcm9sbFBhcmVudCA9IGdldFNjcm9sbFBhcmVudCh0aGlzLl9wb3BwZXIpOwogICAgICB2YXIgb2Zmc2V0UGFyZW50UmVjdCA9IGdldE9mZnNldFJlY3Qob2Zmc2V0UGFyZW50KTsgLy8gVGhhbmtzIHRoZSBmdWNraW5nIG5hdGl2ZSBBUEksIGBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcGAgJiBgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcGAKCiAgICAgIHZhciBnZXRTY3JvbGxUb3BWYWx1ZSA9IGZ1bmN0aW9uIGdldFNjcm9sbFRvcFZhbHVlKGVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gZWxlbWVudCA9PSBkb2N1bWVudC5ib2R5ID8gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApIDogZWxlbWVudC5zY3JvbGxUb3A7CiAgICAgIH07CgogICAgICB2YXIgZ2V0U2Nyb2xsTGVmdFZhbHVlID0gZnVuY3Rpb24gZ2V0U2Nyb2xsTGVmdFZhbHVlKGVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gZWxlbWVudCA9PSBkb2N1bWVudC5ib2R5ID8gTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQsIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCkgOiBlbGVtZW50LnNjcm9sbExlZnQ7CiAgICAgIH07IC8vIGlmIHRoZSBwb3BwZXIgaXMgZml4ZWQgd2UgZG9uJ3QgaGF2ZSB0byBzdWJzdHJhY3Qgc2Nyb2xsaW5nIGZyb20gdGhlIGJvdW5kYXJpZXMKCgogICAgICB2YXIgc2Nyb2xsVG9wID0gZGF0YS5vZmZzZXRzLnBvcHBlci5wb3NpdGlvbiA9PT0gJ2ZpeGVkJyA/IDAgOiBnZXRTY3JvbGxUb3BWYWx1ZShzY3JvbGxQYXJlbnQpOwogICAgICB2YXIgc2Nyb2xsTGVmdCA9IGRhdGEub2Zmc2V0cy5wb3BwZXIucG9zaXRpb24gPT09ICdmaXhlZCcgPyAwIDogZ2V0U2Nyb2xsTGVmdFZhbHVlKHNjcm9sbFBhcmVudCk7CiAgICAgIGJvdW5kYXJpZXMgPSB7CiAgICAgICAgdG9wOiAwIC0gKG9mZnNldFBhcmVudFJlY3QudG9wIC0gc2Nyb2xsVG9wKSwKICAgICAgICByaWdodDogcm9vdC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGggLSAob2Zmc2V0UGFyZW50UmVjdC5sZWZ0IC0gc2Nyb2xsTGVmdCksCiAgICAgICAgYm90dG9tOiByb290LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQgLSAob2Zmc2V0UGFyZW50UmVjdC50b3AgLSBzY3JvbGxUb3ApLAogICAgICAgIGxlZnQ6IDAgLSAob2Zmc2V0UGFyZW50UmVjdC5sZWZ0IC0gc2Nyb2xsTGVmdCkKICAgICAgfTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChnZXRPZmZzZXRQYXJlbnQodGhpcy5fcG9wcGVyKSA9PT0gYm91bmRhcmllc0VsZW1lbnQpIHsKICAgICAgICBib3VuZGFyaWVzID0gewogICAgICAgICAgdG9wOiAwLAogICAgICAgICAgbGVmdDogMCwKICAgICAgICAgIHJpZ2h0OiBib3VuZGFyaWVzRWxlbWVudC5jbGllbnRXaWR0aCwKICAgICAgICAgIGJvdHRvbTogYm91bmRhcmllc0VsZW1lbnQuY2xpZW50SGVpZ2h0CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBib3VuZGFyaWVzID0gZ2V0T2Zmc2V0UmVjdChib3VuZGFyaWVzRWxlbWVudCk7CiAgICAgIH0KICAgIH0KCiAgICBib3VuZGFyaWVzLmxlZnQgKz0gcGFkZGluZzsKICAgIGJvdW5kYXJpZXMucmlnaHQgLT0gcGFkZGluZzsKICAgIGJvdW5kYXJpZXMudG9wID0gYm91bmRhcmllcy50b3AgKyBwYWRkaW5nOwogICAgYm91bmRhcmllcy5ib3R0b20gPSBib3VuZGFyaWVzLmJvdHRvbSAtIHBhZGRpbmc7CiAgICByZXR1cm4gYm91bmRhcmllczsKICB9OwogIC8qKgogICAqIExvb3AgdHJvdWdoIHRoZSBsaXN0IG9mIG1vZGlmaWVycyBhbmQgcnVuIHRoZW0gaW4gb3JkZXIsIGVhY2ggb2YgdGhlbSB3aWxsIHRoZW4gZWRpdCB0aGUgZGF0YSBvYmplY3QKICAgKiBAbWV0aG9kCiAgICogQG1lbWJlcm9mIFBvcHBlcgogICAqIEBhY2Nlc3MgcHVibGljCiAgICogQHBhcmFtIHtPYmplY3R9IGRhdGEKICAgKiBAcGFyYW0ge0FycmF5fSBtb2RpZmllcnMKICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmRzCiAgICovCgoKICBQb3BwZXIucHJvdG90eXBlLnJ1bk1vZGlmaWVycyA9IGZ1bmN0aW9uIChkYXRhLCBtb2RpZmllcnMsIGVuZHMpIHsKICAgIHZhciBtb2RpZmllcnNUb1J1biA9IG1vZGlmaWVycy5zbGljZSgpOwoKICAgIGlmIChlbmRzICE9PSB1bmRlZmluZWQpIHsKICAgICAgbW9kaWZpZXJzVG9SdW4gPSB0aGlzLl9vcHRpb25zLm1vZGlmaWVycy5zbGljZSgwLCBnZXRBcnJheUtleUluZGV4KHRoaXMuX29wdGlvbnMubW9kaWZpZXJzLCBlbmRzKSk7CiAgICB9CgogICAgbW9kaWZpZXJzVG9SdW4uZm9yRWFjaChmdW5jdGlvbiAobW9kaWZpZXIpIHsKICAgICAgaWYgKGlzRnVuY3Rpb24obW9kaWZpZXIpKSB7CiAgICAgICAgZGF0YSA9IG1vZGlmaWVyLmNhbGwodGhpcywgZGF0YSk7CiAgICAgIH0KICAgIH0uYmluZCh0aGlzKSk7CiAgICByZXR1cm4gZGF0YTsKICB9OwogIC8qKgogICAqIEhlbHBlciB1c2VkIHRvIGtub3cgaWYgdGhlIGdpdmVuIG1vZGlmaWVyIGRlcGVuZHMgZnJvbSBhbm90aGVyIG9uZS4KICAgKiBAbWV0aG9kCiAgICogQG1lbWJlcm9mIFBvcHBlcgogICAqIEBwYXJhbSB7U3RyaW5nfSByZXF1ZXN0aW5nIC0gbmFtZSBvZiByZXF1ZXN0aW5nIG1vZGlmaWVyCiAgICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RlZCAtIG5hbWUgb2YgcmVxdWVzdGVkIG1vZGlmaWVyCiAgICogQHJldHVybnMge0Jvb2xlYW59CiAgICovCgoKICBQb3BwZXIucHJvdG90eXBlLmlzTW9kaWZpZXJSZXF1aXJlZCA9IGZ1bmN0aW9uIChyZXF1ZXN0aW5nLCByZXF1ZXN0ZWQpIHsKICAgIHZhciBpbmRleCA9IGdldEFycmF5S2V5SW5kZXgodGhpcy5fb3B0aW9ucy5tb2RpZmllcnMsIHJlcXVlc3RpbmcpOwogICAgcmV0dXJuICEhdGhpcy5fb3B0aW9ucy5tb2RpZmllcnMuc2xpY2UoMCwgaW5kZXgpLmZpbHRlcihmdW5jdGlvbiAobW9kaWZpZXIpIHsKICAgICAgcmV0dXJuIG1vZGlmaWVyID09PSByZXF1ZXN0ZWQ7CiAgICB9KS5sZW5ndGg7CiAgfTsgLy8KICAvLyBNb2RpZmllcnMKICAvLwoKICAvKioKICAgKiBNb2RpZmllcnMgbGlzdAogICAqIEBuYW1lc3BhY2UgUG9wcGVyLm1vZGlmaWVycwogICAqIEBtZW1iZXJvZiBQb3BwZXIKICAgKiBAdHlwZSB7T2JqZWN0fQogICAqLwoKCiAgUG9wcGVyLnByb3RvdHlwZS5tb2RpZmllcnMgPSB7fTsKICAvKioKICAgKiBBcHBseSB0aGUgY29tcHV0ZWQgc3R5bGVzIHRvIHRoZSBwb3BwZXIgZWxlbWVudAogICAqIEBtZXRob2QKICAgKiBAbWVtYmVyb2YgUG9wcGVyLm1vZGlmaWVycwogICAqIEBhcmd1bWVudCB7T2JqZWN0fSBkYXRhIC0gVGhlIGRhdGEgb2JqZWN0IGdlbmVyYXRlZCBieSBgdXBkYXRlYCBtZXRob2QKICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgc2FtZSBkYXRhIG9iamVjdAogICAqLwoKICBQb3BwZXIucHJvdG90eXBlLm1vZGlmaWVycy5hcHBseVN0eWxlID0gZnVuY3Rpb24gKGRhdGEpIHsKICAgIC8vIGFwcGx5IHRoZSBmaW5hbCBvZmZzZXRzIHRvIHRoZSBwb3BwZXIKICAgIC8vIE5PVEU6IDEgRE9NIGFjY2VzcyBoZXJlCiAgICB2YXIgc3R5bGVzID0gewogICAgICBwb3NpdGlvbjogZGF0YS5vZmZzZXRzLnBvcHBlci5wb3NpdGlvbgogICAgfTsgLy8gcm91bmQgdG9wIGFuZCBsZWZ0IHRvIGF2b2lkIGJsdXJyeSB0ZXh0CgogICAgdmFyIGxlZnQgPSBNYXRoLnJvdW5kKGRhdGEub2Zmc2V0cy5wb3BwZXIubGVmdCk7CiAgICB2YXIgdG9wID0gTWF0aC5yb3VuZChkYXRhLm9mZnNldHMucG9wcGVyLnRvcCk7IC8vIGlmIGdwdUFjY2VsZXJhdGlvbiBpcyBzZXQgdG8gdHJ1ZSBhbmQgdHJhbnNmb3JtIGlzIHN1cHBvcnRlZCwgd2UgdXNlIGB0cmFuc2xhdGUzZGAgdG8gYXBwbHkgdGhlIHBvc2l0aW9uIHRvIHRoZSBwb3BwZXIKICAgIC8vIHdlIGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBzdXBwb3J0ZWQgcHJlZml4ZWQgdmVyc2lvbiBpZiBuZWVkZWQKCiAgICB2YXIgcHJlZml4ZWRQcm9wZXJ0eTsKCiAgICBpZiAodGhpcy5fb3B0aW9ucy5ncHVBY2NlbGVyYXRpb24gJiYgKHByZWZpeGVkUHJvcGVydHkgPSBnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUoJ3RyYW5zZm9ybScpKSkgewogICAgICBzdHlsZXNbcHJlZml4ZWRQcm9wZXJ0eV0gPSAndHJhbnNsYXRlM2QoJyArIGxlZnQgKyAncHgsICcgKyB0b3AgKyAncHgsIDApJzsKICAgICAgc3R5bGVzLnRvcCA9IDA7CiAgICAgIHN0eWxlcy5sZWZ0ID0gMDsKICAgIH0gLy8gb3Rod2VyaXNlLCB3ZSB1c2UgdGhlIHN0YW5kYXJkIGBsZWZ0YCBhbmQgYHRvcGAgcHJvcGVydGllcwogICAgZWxzZSB7CiAgICAgICAgc3R5bGVzLmxlZnQgPSBsZWZ0OwogICAgICAgIHN0eWxlcy50b3AgPSB0b3A7CiAgICAgIH0gLy8gYW55IHByb3BlcnR5IHByZXNlbnQgaW4gYGRhdGEuc3R5bGVzYCB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIHBvcHBlciwKICAgIC8vIGluIHRoaXMgd2F5IHdlIGNhbiBtYWtlIHRoZSAzcmQgcGFydHkgbW9kaWZpZXJzIGFkZCBjdXN0b20gc3R5bGVzIHRvIGl0CiAgICAvLyBCZSBhd2FyZSwgbW9kaWZpZXJzIGNvdWxkIG92ZXJyaWRlIHRoZSBwcm9wZXJ0aWVzIGRlZmluZWQgaW4gdGhlIHByZXZpb3VzCiAgICAvLyBsaW5lcyBvZiB0aGlzIG1vZGlmaWVyIQoKCiAgICBPYmplY3QuYXNzaWduKHN0eWxlcywgZGF0YS5zdHlsZXMpOwogICAgc2V0U3R5bGUodGhpcy5fcG9wcGVyLCBzdHlsZXMpOyAvLyBzZXQgYW4gYXR0cmlidXRlIHdoaWNoIHdpbGwgYmUgdXNlZnVsIHRvIHN0eWxlIHRoZSB0b29sdGlwICh1c2UgaXQgdG8gcHJvcGVybHkgcG9zaXRpb24gaXRzIGFycm93KQogICAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmUKCiAgICB0aGlzLl9wb3BwZXIuc2V0QXR0cmlidXRlKCd4LXBsYWNlbWVudCcsIGRhdGEucGxhY2VtZW50KTsgLy8gaWYgdGhlIGFycm93IG1vZGlmaWVyIGlzIHJlcXVpcmVkIGFuZCB0aGUgYXJyb3cgc3R5bGUgaGFzIGJlZW4gY29tcHV0ZWQsIGFwcGx5IHRoZSBhcnJvdyBzdHlsZQoKCiAgICBpZiAodGhpcy5pc01vZGlmaWVyUmVxdWlyZWQodGhpcy5tb2RpZmllcnMuYXBwbHlTdHlsZSwgdGhpcy5tb2RpZmllcnMuYXJyb3cpICYmIGRhdGEub2Zmc2V0cy5hcnJvdykgewogICAgICBzZXRTdHlsZShkYXRhLmFycm93RWxlbWVudCwgZGF0YS5vZmZzZXRzLmFycm93KTsKICAgIH0KCiAgICByZXR1cm4gZGF0YTsKICB9OwogIC8qKgogICAqIE1vZGlmaWVyIHVzZWQgdG8gc2hpZnQgdGhlIHBvcHBlciBvbiB0aGUgc3RhcnQgb3IgZW5kIG9mIGl0cyByZWZlcmVuY2UgZWxlbWVudCBzaWRlCiAgICogQG1ldGhvZAogICAqIEBtZW1iZXJvZiBQb3BwZXIubW9kaWZpZXJzCiAgICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IGB1cGRhdGVgIG1ldGhvZAogICAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBkYXRhIG9iamVjdCwgcHJvcGVybHkgbW9kaWZpZWQKICAgKi8KCgogIFBvcHBlci5wcm90b3R5cGUubW9kaWZpZXJzLnNoaWZ0ID0gZnVuY3Rpb24gKGRhdGEpIHsKICAgIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudDsKICAgIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50LnNwbGl0KCctJylbMF07CiAgICB2YXIgc2hpZnRWYXJpYXRpb24gPSBwbGFjZW1lbnQuc3BsaXQoJy0nKVsxXTsgLy8gaWYgc2hpZnQgc2hpZnRWYXJpYXRpb24gaXMgc3BlY2lmaWVkLCBydW4gdGhlIG1vZGlmaWVyCgogICAgaWYgKHNoaWZ0VmFyaWF0aW9uKSB7CiAgICAgIHZhciByZWZlcmVuY2UgPSBkYXRhLm9mZnNldHMucmVmZXJlbmNlOwogICAgICB2YXIgcG9wcGVyID0gZ2V0UG9wcGVyQ2xpZW50UmVjdChkYXRhLm9mZnNldHMucG9wcGVyKTsKICAgICAgdmFyIHNoaWZ0T2Zmc2V0cyA9IHsKICAgICAgICB5OiB7CiAgICAgICAgICBzdGFydDogewogICAgICAgICAgICB0b3A6IHJlZmVyZW5jZS50b3AKICAgICAgICAgIH0sCiAgICAgICAgICBlbmQ6IHsKICAgICAgICAgICAgdG9wOiByZWZlcmVuY2UudG9wICsgcmVmZXJlbmNlLmhlaWdodCAtIHBvcHBlci5oZWlnaHQKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHg6IHsKICAgICAgICAgIHN0YXJ0OiB7CiAgICAgICAgICAgIGxlZnQ6IHJlZmVyZW5jZS5sZWZ0CiAgICAgICAgICB9LAogICAgICAgICAgZW5kOiB7CiAgICAgICAgICAgIGxlZnQ6IHJlZmVyZW5jZS5sZWZ0ICsgcmVmZXJlbmNlLndpZHRoIC0gcG9wcGVyLndpZHRoCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICB2YXIgYXhpcyA9IFsnYm90dG9tJywgJ3RvcCddLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgIT09IC0xID8gJ3gnIDogJ3knOwogICAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gT2JqZWN0LmFzc2lnbihwb3BwZXIsIHNoaWZ0T2Zmc2V0c1theGlzXVtzaGlmdFZhcmlhdGlvbl0pOwogICAgfQoKICAgIHJldHVybiBkYXRhOwogIH07CiAgLyoqCiAgICogTW9kaWZpZXIgdXNlZCB0byBtYWtlIHN1cmUgdGhlIHBvcHBlciBkb2VzIG5vdCBvdmVyZmxvd3MgZnJvbSBpdCdzIGJvdW5kYXJpZXMKICAgKiBAbWV0aG9kCiAgICogQG1lbWJlcm9mIFBvcHBlci5tb2RpZmllcnMKICAgKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgYHVwZGF0ZWAgbWV0aG9kCiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZAogICAqLwoKCiAgUG9wcGVyLnByb3RvdHlwZS5tb2RpZmllcnMucHJldmVudE92ZXJmbG93ID0gZnVuY3Rpb24gKGRhdGEpIHsKICAgIHZhciBvcmRlciA9IHRoaXMuX29wdGlvbnMucHJldmVudE92ZXJmbG93T3JkZXI7CiAgICB2YXIgcG9wcGVyID0gZ2V0UG9wcGVyQ2xpZW50UmVjdChkYXRhLm9mZnNldHMucG9wcGVyKTsKICAgIHZhciBjaGVjayA9IHsKICAgICAgbGVmdDogZnVuY3Rpb24gbGVmdCgpIHsKICAgICAgICB2YXIgbGVmdCA9IHBvcHBlci5sZWZ0OwoKICAgICAgICBpZiAocG9wcGVyLmxlZnQgPCBkYXRhLmJvdW5kYXJpZXMubGVmdCkgewogICAgICAgICAgbGVmdCA9IE1hdGgubWF4KHBvcHBlci5sZWZ0LCBkYXRhLmJvdW5kYXJpZXMubGVmdCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgbGVmdDogbGVmdAogICAgICAgIH07CiAgICAgIH0sCiAgICAgIHJpZ2h0OiBmdW5jdGlvbiByaWdodCgpIHsKICAgICAgICB2YXIgbGVmdCA9IHBvcHBlci5sZWZ0OwoKICAgICAgICBpZiAocG9wcGVyLnJpZ2h0ID4gZGF0YS5ib3VuZGFyaWVzLnJpZ2h0KSB7CiAgICAgICAgICBsZWZ0ID0gTWF0aC5taW4ocG9wcGVyLmxlZnQsIGRhdGEuYm91bmRhcmllcy5yaWdodCAtIHBvcHBlci53aWR0aCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gewogICAgICAgICAgbGVmdDogbGVmdAogICAgICAgIH07CiAgICAgIH0sCiAgICAgIHRvcDogZnVuY3Rpb24gdG9wKCkgewogICAgICAgIHZhciB0b3AgPSBwb3BwZXIudG9wOwoKICAgICAgICBpZiAocG9wcGVyLnRvcCA8IGRhdGEuYm91bmRhcmllcy50b3ApIHsKICAgICAgICAgIHRvcCA9IE1hdGgubWF4KHBvcHBlci50b3AsIGRhdGEuYm91bmRhcmllcy50b3ApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHRvcDogdG9wCiAgICAgICAgfTsKICAgICAgfSwKICAgICAgYm90dG9tOiBmdW5jdGlvbiBib3R0b20oKSB7CiAgICAgICAgdmFyIHRvcCA9IHBvcHBlci50b3A7CgogICAgICAgIGlmIChwb3BwZXIuYm90dG9tID4gZGF0YS5ib3VuZGFyaWVzLmJvdHRvbSkgewogICAgICAgICAgdG9wID0gTWF0aC5taW4ocG9wcGVyLnRvcCwgZGF0YS5ib3VuZGFyaWVzLmJvdHRvbSAtIHBvcHBlci5oZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHRvcDogdG9wCiAgICAgICAgfTsKICAgICAgfQogICAgfTsKICAgIG9yZGVyLmZvckVhY2goZnVuY3Rpb24gKGRpcmVjdGlvbikgewogICAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gT2JqZWN0LmFzc2lnbihwb3BwZXIsIGNoZWNrW2RpcmVjdGlvbl0oKSk7CiAgICB9KTsKICAgIHJldHVybiBkYXRhOwogIH07CiAgLyoqCiAgICogTW9kaWZpZXIgdXNlZCB0byBtYWtlIHN1cmUgdGhlIHBvcHBlciBpcyBhbHdheXMgbmVhciBpdHMgcmVmZXJlbmNlCiAgICogQG1ldGhvZAogICAqIEBtZW1iZXJvZiBQb3BwZXIubW9kaWZpZXJzCiAgICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IF91cGRhdGUgbWV0aG9kCiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZAogICAqLwoKCiAgUG9wcGVyLnByb3RvdHlwZS5tb2RpZmllcnMua2VlcFRvZ2V0aGVyID0gZnVuY3Rpb24gKGRhdGEpIHsKICAgIHZhciBwb3BwZXIgPSBnZXRQb3BwZXJDbGllbnRSZWN0KGRhdGEub2Zmc2V0cy5wb3BwZXIpOwogICAgdmFyIHJlZmVyZW5jZSA9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2U7CiAgICB2YXIgZiA9IE1hdGguZmxvb3I7CgogICAgaWYgKHBvcHBlci5yaWdodCA8IGYocmVmZXJlbmNlLmxlZnQpKSB7CiAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIubGVmdCA9IGYocmVmZXJlbmNlLmxlZnQpIC0gcG9wcGVyLndpZHRoOwogICAgfQoKICAgIGlmIChwb3BwZXIubGVmdCA+IGYocmVmZXJlbmNlLnJpZ2h0KSkgewogICAgICBkYXRhLm9mZnNldHMucG9wcGVyLmxlZnQgPSBmKHJlZmVyZW5jZS5yaWdodCk7CiAgICB9CgogICAgaWYgKHBvcHBlci5ib3R0b20gPCBmKHJlZmVyZW5jZS50b3ApKSB7CiAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIudG9wID0gZihyZWZlcmVuY2UudG9wKSAtIHBvcHBlci5oZWlnaHQ7CiAgICB9CgogICAgaWYgKHBvcHBlci50b3AgPiBmKHJlZmVyZW5jZS5ib3R0b20pKSB7CiAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIudG9wID0gZihyZWZlcmVuY2UuYm90dG9tKTsKICAgIH0KCiAgICByZXR1cm4gZGF0YTsKICB9OwogIC8qKgogICAqIE1vZGlmaWVyIHVzZWQgdG8gZmxpcCB0aGUgcGxhY2VtZW50IG9mIHRoZSBwb3BwZXIgd2hlbiB0aGUgbGF0dGVyIGlzIHN0YXJ0aW5nIG92ZXJsYXBwaW5nIGl0cyByZWZlcmVuY2UgZWxlbWVudC4KICAgKiBSZXF1aXJlcyB0aGUgYHByZXZlbnRPdmVyZmxvd2AgbW9kaWZpZXIgYmVmb3JlIGl0IGluIG9yZGVyIHRvIHdvcmsuCiAgICogKipOT1RFOioqIFRoaXMgbW9kaWZpZXIgd2lsbCBydW4gYWxsIGl0cyBwcmV2aW91cyBtb2RpZmllcnMgZXZlcnl0aW1lIGl0IHRyaWVzIHRvIGZsaXAgdGhlIHBvcHBlciEKICAgKiBAbWV0aG9kCiAgICogQG1lbWJlcm9mIFBvcHBlci5tb2RpZmllcnMKICAgKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgX3VwZGF0ZSBtZXRob2QKICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkCiAgICovCgoKICBQb3BwZXIucHJvdG90eXBlLm1vZGlmaWVycy5mbGlwID0gZnVuY3Rpb24gKGRhdGEpIHsKICAgIC8vIGNoZWNrIGlmIHByZXZlbnRPdmVyZmxvdyBpcyBpbiB0aGUgbGlzdCBvZiBtb2RpZmllcnMgYmVmb3JlIHRoZSBmbGlwIG1vZGlmaWVyLgogICAgLy8gb3RoZXJ3aXNlIGZsaXAgd291bGQgbm90IHdvcmsgYXMgZXhwZWN0ZWQuCiAgICBpZiAoIXRoaXMuaXNNb2RpZmllclJlcXVpcmVkKHRoaXMubW9kaWZpZXJzLmZsaXAsIHRoaXMubW9kaWZpZXJzLnByZXZlbnRPdmVyZmxvdykpIHsKICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBwcmV2ZW50T3ZlcmZsb3cgbW9kaWZpZXIgaXMgcmVxdWlyZWQgYnkgZmxpcCBtb2RpZmllciBpbiBvcmRlciB0byB3b3JrLCBiZSBzdXJlIHRvIGluY2x1ZGUgaXQgYmVmb3JlIGZsaXAhJyk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQoKICAgIGlmIChkYXRhLmZsaXBwZWQgJiYgZGF0YS5wbGFjZW1lbnQgPT09IGRhdGEuX29yaWdpbmFsUGxhY2VtZW50KSB7CiAgICAgIC8vIHNlZW1zIGxpa2UgZmxpcCBpcyB0cnlpbmcgdG8gbG9vcCwgcHJvYmFibHkgdGhlcmUncyBub3QgZW5vdWdoIHNwYWNlIG9uIGFueSBvZiB0aGUgZmxpcHBhYmxlIHNpZGVzCiAgICAgIHJldHVybiBkYXRhOwogICAgfQoKICAgIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdOwogICAgdmFyIHBsYWNlbWVudE9wcG9zaXRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KTsKICAgIHZhciB2YXJpYXRpb24gPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzFdIHx8ICcnOwogICAgdmFyIGZsaXBPcmRlciA9IFtdOwoKICAgIGlmICh0aGlzLl9vcHRpb25zLmZsaXBCZWhhdmlvciA9PT0gJ2ZsaXAnKSB7CiAgICAgIGZsaXBPcmRlciA9IFtwbGFjZW1lbnQsIHBsYWNlbWVudE9wcG9zaXRlXTsKICAgIH0gZWxzZSB7CiAgICAgIGZsaXBPcmRlciA9IHRoaXMuX29wdGlvbnMuZmxpcEJlaGF2aW9yOwogICAgfQoKICAgIGZsaXBPcmRlci5mb3JFYWNoKGZ1bmN0aW9uIChzdGVwLCBpbmRleCkgewogICAgICBpZiAocGxhY2VtZW50ICE9PSBzdGVwIHx8IGZsaXBPcmRlci5sZW5ndGggPT09IGluZGV4ICsgMSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgcGxhY2VtZW50ID0gZGF0YS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXTsKICAgICAgcGxhY2VtZW50T3Bwb3NpdGUgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpOwogICAgICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGdldFBvcHBlckNsaWVudFJlY3QoZGF0YS5vZmZzZXRzLnBvcHBlcik7IC8vIHRoaXMgYm9vbGVhbiBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIHJpZ2h0IGFuZCBib3R0b20gZnJvbSB0b3AgYW5kIGxlZnQKICAgICAgLy8gdGhleSBuZWVkIGRpZmZlcmVudCBjb21wdXRhdGlvbnMgdG8gZ2V0IGZsaXBwZWQKCiAgICAgIHZhciBhID0gWydyaWdodCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgIT09IC0xOyAvLyB1c2luZyBNYXRoLmZsb29yIGJlY2F1c2UgdGhlIHJlZmVyZW5jZSBvZmZzZXRzIG1heSBjb250YWluIGRlY2ltYWxzIHdlIGFyZSBub3QgZ29pbmcgdG8gY29uc2lkZXIgaGVyZQoKICAgICAgaWYgKGEgJiYgTWF0aC5mbG9vcihkYXRhLm9mZnNldHMucmVmZXJlbmNlW3BsYWNlbWVudF0pID4gTWF0aC5mbG9vcihwb3BwZXJPZmZzZXRzW3BsYWNlbWVudE9wcG9zaXRlXSkgfHwgIWEgJiYgTWF0aC5mbG9vcihkYXRhLm9mZnNldHMucmVmZXJlbmNlW3BsYWNlbWVudF0pIDwgTWF0aC5mbG9vcihwb3BwZXJPZmZzZXRzW3BsYWNlbWVudE9wcG9zaXRlXSkpIHsKICAgICAgICAvLyB3ZSdsbCB1c2UgdGhpcyBib29sZWFuIHRvIGRldGVjdCBhbnkgZmxpcCBsb29wCiAgICAgICAgZGF0YS5mbGlwcGVkID0gdHJ1ZTsKICAgICAgICBkYXRhLnBsYWNlbWVudCA9IGZsaXBPcmRlcltpbmRleCArIDFdOwoKICAgICAgICBpZiAodmFyaWF0aW9uKSB7CiAgICAgICAgICBkYXRhLnBsYWNlbWVudCArPSAnLScgKyB2YXJpYXRpb247CiAgICAgICAgfQoKICAgICAgICBkYXRhLm9mZnNldHMucG9wcGVyID0gdGhpcy5fZ2V0T2Zmc2V0cyh0aGlzLl9wb3BwZXIsIHRoaXMuX3JlZmVyZW5jZSwgZGF0YS5wbGFjZW1lbnQpLnBvcHBlcjsKICAgICAgICBkYXRhID0gdGhpcy5ydW5Nb2RpZmllcnMoZGF0YSwgdGhpcy5fb3B0aW9ucy5tb2RpZmllcnMsIHRoaXMuX2ZsaXApOwogICAgICB9CiAgICB9LmJpbmQodGhpcykpOwogICAgcmV0dXJuIGRhdGE7CiAgfTsKICAvKioKICAgKiBNb2RpZmllciB1c2VkIHRvIGFkZCBhbiBvZmZzZXQgdG8gdGhlIHBvcHBlciwgdXNlZnVsIGlmIHlvdSBtb3JlIGdyYW51bGFyaXR5IHBvc2l0aW9uaW5nIHlvdXIgcG9wcGVyLgogICAqIFRoZSBvZmZzZXRzIHdpbGwgc2hpZnQgdGhlIHBvcHBlciBvbiB0aGUgc2lkZSBvZiBpdHMgcmVmZXJlbmNlIGVsZW1lbnQuCiAgICogQG1ldGhvZAogICAqIEBtZW1iZXJvZiBQb3BwZXIubW9kaWZpZXJzCiAgICogQGFyZ3VtZW50IHtPYmplY3R9IGRhdGEgLSBUaGUgZGF0YSBvYmplY3QgZ2VuZXJhdGVkIGJ5IF91cGRhdGUgbWV0aG9kCiAgICogQHJldHVybnMge09iamVjdH0gVGhlIGRhdGEgb2JqZWN0LCBwcm9wZXJseSBtb2RpZmllZAogICAqLwoKCiAgUG9wcGVyLnByb3RvdHlwZS5tb2RpZmllcnMub2Zmc2V0ID0gZnVuY3Rpb24gKGRhdGEpIHsKICAgIHZhciBvZmZzZXQgPSB0aGlzLl9vcHRpb25zLm9mZnNldDsKICAgIHZhciBwb3BwZXIgPSBkYXRhLm9mZnNldHMucG9wcGVyOwoKICAgIGlmIChkYXRhLnBsYWNlbWVudC5pbmRleE9mKCdsZWZ0JykgIT09IC0xKSB7CiAgICAgIHBvcHBlci50b3AgLT0gb2Zmc2V0OwogICAgfSBlbHNlIGlmIChkYXRhLnBsYWNlbWVudC5pbmRleE9mKCdyaWdodCcpICE9PSAtMSkgewogICAgICBwb3BwZXIudG9wICs9IG9mZnNldDsKICAgIH0gZWxzZSBpZiAoZGF0YS5wbGFjZW1lbnQuaW5kZXhPZigndG9wJykgIT09IC0xKSB7CiAgICAgIHBvcHBlci5sZWZ0IC09IG9mZnNldDsKICAgIH0gZWxzZSBpZiAoZGF0YS5wbGFjZW1lbnQuaW5kZXhPZignYm90dG9tJykgIT09IC0xKSB7CiAgICAgIHBvcHBlci5sZWZ0ICs9IG9mZnNldDsKICAgIH0KCiAgICByZXR1cm4gZGF0YTsKICB9OwogIC8qKgogICAqIE1vZGlmaWVyIHVzZWQgdG8gbW92ZSB0aGUgYXJyb3dzIG9uIHRoZSBlZGdlIG9mIHRoZSBwb3BwZXIgdG8gbWFrZSBzdXJlIHRoZW0gYXJlIGFsd2F5cyBiZXR3ZWVuIHRoZSBwb3BwZXIgYW5kIHRoZSByZWZlcmVuY2UgZWxlbWVudAogICAqIEl0IHdpbGwgdXNlIHRoZSBDU1Mgb3V0ZXIgc2l6ZSBvZiB0aGUgYXJyb3cgZWxlbWVudCB0byBrbm93IGhvdyBtYW55IHBpeGVscyBvZiBjb25qdWN0aW9uIGFyZSBuZWVkZWQKICAgKiBAbWV0aG9kCiAgICogQG1lbWJlcm9mIFBvcHBlci5tb2RpZmllcnMKICAgKiBAYXJndW1lbnQge09iamVjdH0gZGF0YSAtIFRoZSBkYXRhIG9iamVjdCBnZW5lcmF0ZWQgYnkgX3VwZGF0ZSBtZXRob2QKICAgKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGF0YSBvYmplY3QsIHByb3Blcmx5IG1vZGlmaWVkCiAgICovCgoKICBQb3BwZXIucHJvdG90eXBlLm1vZGlmaWVycy5hcnJvdyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICB2YXIgYXJyb3cgPSB0aGlzLl9vcHRpb25zLmFycm93RWxlbWVudDsKICAgIHZhciBhcnJvd09mZnNldCA9IHRoaXMuX29wdGlvbnMuYXJyb3dPZmZzZXQ7IC8vIGlmIHRoZSBhcnJvd0VsZW1lbnQgaXMgYSBzdHJpbmcsIHN1cHBvc2UgaXQncyBhIENTUyBzZWxlY3RvcgoKICAgIGlmICh0eXBlb2YgYXJyb3cgPT09ICdzdHJpbmcnKSB7CiAgICAgIGFycm93ID0gdGhpcy5fcG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3cpOwogICAgfSAvLyBpZiBhcnJvdyBlbGVtZW50IGlzIG5vdCBmb3VuZCwgZG9uJ3QgcnVuIHRoZSBtb2RpZmllcgoKCiAgICBpZiAoIWFycm93KSB7CiAgICAgIHJldHVybiBkYXRhOwogICAgfSAvLyB0aGUgYXJyb3cgZWxlbWVudCBtdXN0IGJlIGNoaWxkIG9mIGl0cyBwb3BwZXIKCgogICAgaWYgKCF0aGlzLl9wb3BwZXIuY29udGFpbnMoYXJyb3cpKSB7CiAgICAgIGNvbnNvbGUud2FybignV0FSTklORzogYGFycm93RWxlbWVudGAgbXVzdCBiZSBjaGlsZCBvZiBpdHMgcG9wcGVyIGVsZW1lbnQhJyk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfSAvLyBhcnJvdyBkZXBlbmRzIG9uIGtlZXBUb2dldGhlciBpbiBvcmRlciB0byB3b3JrCgoKICAgIGlmICghdGhpcy5pc01vZGlmaWVyUmVxdWlyZWQodGhpcy5tb2RpZmllcnMuYXJyb3csIHRoaXMubW9kaWZpZXJzLmtlZXBUb2dldGhlcikpIHsKICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBrZWVwVG9nZXRoZXIgbW9kaWZpZXIgaXMgcmVxdWlyZWQgYnkgYXJyb3cgbW9kaWZpZXIgaW4gb3JkZXIgdG8gd29yaywgYmUgc3VyZSB0byBpbmNsdWRlIGl0IGJlZm9yZSBhcnJvdyEnKTsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CgogICAgdmFyIGFycm93U3R5bGUgPSB7fTsKICAgIHZhciBwbGFjZW1lbnQgPSBkYXRhLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdOwogICAgdmFyIHBvcHBlciA9IGdldFBvcHBlckNsaWVudFJlY3QoZGF0YS5vZmZzZXRzLnBvcHBlcik7CiAgICB2YXIgcmVmZXJlbmNlID0gZGF0YS5vZmZzZXRzLnJlZmVyZW5jZTsKICAgIHZhciBpc1ZlcnRpY2FsID0gWydsZWZ0JywgJ3JpZ2h0J10uaW5kZXhPZihwbGFjZW1lbnQpICE9PSAtMTsKICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ2hlaWdodCcgOiAnd2lkdGgnOwogICAgdmFyIHNpZGUgPSBpc1ZlcnRpY2FsID8gJ3RvcCcgOiAnbGVmdCc7CiAgICB2YXIgdHJhbnNsYXRlID0gaXNWZXJ0aWNhbCA/ICd0cmFuc2xhdGVZJyA6ICd0cmFuc2xhdGVYJzsKICAgIHZhciBhbHRTaWRlID0gaXNWZXJ0aWNhbCA/ICdsZWZ0JyA6ICd0b3AnOwogICAgdmFyIG9wU2lkZSA9IGlzVmVydGljYWwgPyAnYm90dG9tJyA6ICdyaWdodCc7CiAgICB2YXIgYXJyb3dTaXplID0gZ2V0T3V0ZXJTaXplcyhhcnJvdylbbGVuXTsgLy8KICAgIC8vIGV4dGVuZHMga2VlcFRvZ2V0aGVyIGJlaGF2aW9yIG1ha2luZyBzdXJlIHRoZSBwb3BwZXIgYW5kIGl0cyByZWZlcmVuY2UgaGF2ZSBlbm91Z2ggcGl4ZWxzIGluIGNvbmp1Y3Rpb24KICAgIC8vCiAgICAvLyB0b3AvbGVmdCBzaWRlCgogICAgaWYgKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dTaXplIDwgcG9wcGVyW3NpZGVdKSB7CiAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gLT0gcG9wcGVyW3NpZGVdIC0gKHJlZmVyZW5jZVtvcFNpZGVdIC0gYXJyb3dTaXplKTsKICAgIH0gLy8gYm90dG9tL3JpZ2h0IHNpZGUKCgogICAgaWYgKHJlZmVyZW5jZVtzaWRlXSArIGFycm93U2l6ZSA+IHBvcHBlcltvcFNpZGVdKSB7CiAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXJbc2lkZV0gKz0gcmVmZXJlbmNlW3NpZGVdICsgYXJyb3dTaXplIC0gcG9wcGVyW29wU2lkZV07CiAgICB9IC8vIGNvbXB1dGUgY2VudGVyIG9mIHRoZSBwb3BwZXIKCgogICAgdmFyIGNlbnRlciA9IHJlZmVyZW5jZVtzaWRlXSArIChhcnJvd09mZnNldCB8fCByZWZlcmVuY2VbbGVuXSAvIDIgLSBhcnJvd1NpemUgLyAyKTsKICAgIHZhciBzaWRlVmFsdWUgPSBjZW50ZXIgLSBwb3BwZXJbc2lkZV07IC8vIHByZXZlbnQgYXJyb3cgZnJvbSBiZWluZyBwbGFjZWQgbm90IGNvbnRpZ3VvdXNseSB0byBpdHMgcG9wcGVyCgogICAgc2lkZVZhbHVlID0gTWF0aC5tYXgoTWF0aC5taW4ocG9wcGVyW2xlbl0gLSBhcnJvd1NpemUgLSA4LCBzaWRlVmFsdWUpLCA4KTsKICAgIGFycm93U3R5bGVbc2lkZV0gPSBzaWRlVmFsdWU7CiAgICBhcnJvd1N0eWxlW2FsdFNpZGVdID0gJyc7IC8vIG1ha2Ugc3VyZSB0byByZW1vdmUgYW55IG9sZCBzdHlsZSBmcm9tIHRoZSBhcnJvdwoKICAgIGRhdGEub2Zmc2V0cy5hcnJvdyA9IGFycm93U3R5bGU7CiAgICBkYXRhLmFycm93RWxlbWVudCA9IGFycm93OwogICAgcmV0dXJuIGRhdGE7CiAgfTsgLy8KICAvLyBIZWxwZXJzCiAgLy8KCiAgLyoqCiAgICogR2V0IHRoZSBvdXRlciBzaXplcyBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAob2Zmc2V0IHNpemUgKyBtYXJnaW5zKQogICAqIEBmdW5jdGlvbgogICAqIEBpZ25vcmUKICAgKiBAYXJndW1lbnQge0VsZW1lbnR9IGVsZW1lbnQKICAgKiBAcmV0dXJucyB7T2JqZWN0fSBvYmplY3QgY29udGFpbmluZyB3aWR0aCBhbmQgaGVpZ2h0IHByb3BlcnRpZXMKICAgKi8KCgogIGZ1bmN0aW9uIGdldE91dGVyU2l6ZXMoZWxlbWVudCkgewogICAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmUKICAgIHZhciBfZGlzcGxheSA9IGVsZW1lbnQuc3R5bGUuZGlzcGxheSwKICAgICAgICBfdmlzaWJpbGl0eSA9IGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eTsKICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJzsKICAgIHZhciBjYWxjV2lkdGhUb0ZvcmNlUmVwYWludCA9IGVsZW1lbnQub2Zmc2V0V2lkdGg7IC8vIG9yaWdpbmFsIG1ldGhvZAoKICAgIHZhciBzdHlsZXMgPSByb290LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7CiAgICB2YXIgeCA9IHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblRvcCkgKyBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5Cb3R0b20pOwogICAgdmFyIHkgPSBwYXJzZUZsb2F0KHN0eWxlcy5tYXJnaW5MZWZ0KSArIHBhcnNlRmxvYXQoc3R5bGVzLm1hcmdpblJpZ2h0KTsKICAgIHZhciByZXN1bHQgPSB7CiAgICAgIHdpZHRoOiBlbGVtZW50Lm9mZnNldFdpZHRoICsgeSwKICAgICAgaGVpZ2h0OiBlbGVtZW50Lm9mZnNldEhlaWdodCArIHgKICAgIH07IC8vIHJlc2V0IGVsZW1lbnQgc3R5bGVzCgogICAgZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gX2Rpc3BsYXk7CiAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBfdmlzaWJpbGl0eTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIC8qKgogICAqIEdldCB0aGUgb3Bwb3NpdGUgcGxhY2VtZW50IG9mIHRoZSBnaXZlbiBvbmUvCiAgICogQGZ1bmN0aW9uCiAgICogQGlnbm9yZQogICAqIEBhcmd1bWVudCB7U3RyaW5nfSBwbGFjZW1lbnQKICAgKiBAcmV0dXJucyB7U3RyaW5nfSBmbGlwcGVkIHBsYWNlbWVudAogICAqLwoKCiAgZnVuY3Rpb24gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQocGxhY2VtZW50KSB7CiAgICB2YXIgaGFzaCA9IHsKICAgICAgbGVmdDogJ3JpZ2h0JywKICAgICAgcmlnaHQ6ICdsZWZ0JywKICAgICAgYm90dG9tOiAndG9wJywKICAgICAgdG9wOiAnYm90dG9tJwogICAgfTsKICAgIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvbGVmdHxyaWdodHxib3R0b218dG9wL2csIGZ1bmN0aW9uIChtYXRjaGVkKSB7CiAgICAgIHJldHVybiBoYXNoW21hdGNoZWRdOwogICAgfSk7CiAgfQogIC8qKgogICAqIEdpdmVuIHRoZSBwb3BwZXIgb2Zmc2V0cywgZ2VuZXJhdGUgYW4gb3V0cHV0IHNpbWlsYXIgdG8gZ2V0Qm91bmRpbmdDbGllbnRSZWN0CiAgICogQGZ1bmN0aW9uCiAgICogQGlnbm9yZQogICAqIEBhcmd1bWVudCB7T2JqZWN0fSBwb3BwZXJPZmZzZXRzCiAgICogQHJldHVybnMge09iamVjdH0gQ2xpZW50UmVjdCBsaWtlIG91dHB1dAogICAqLwoKCiAgZnVuY3Rpb24gZ2V0UG9wcGVyQ2xpZW50UmVjdChwb3BwZXJPZmZzZXRzKSB7CiAgICB2YXIgb2Zmc2V0cyA9IE9iamVjdC5hc3NpZ24oe30sIHBvcHBlck9mZnNldHMpOwogICAgb2Zmc2V0cy5yaWdodCA9IG9mZnNldHMubGVmdCArIG9mZnNldHMud2lkdGg7CiAgICBvZmZzZXRzLmJvdHRvbSA9IG9mZnNldHMudG9wICsgb2Zmc2V0cy5oZWlnaHQ7CiAgICByZXR1cm4gb2Zmc2V0czsKICB9CiAgLyoqCiAgICogR2l2ZW4gYW4gYXJyYXkgYW5kIHRoZSBrZXkgdG8gZmluZCwgcmV0dXJucyBpdHMgaW5kZXgKICAgKiBAZnVuY3Rpb24KICAgKiBAaWdub3JlCiAgICogQGFyZ3VtZW50IHtBcnJheX0gYXJyCiAgICogQGFyZ3VtZW50IGtleVRvRmluZAogICAqIEByZXR1cm5zIGluZGV4IG9yIG51bGwKICAgKi8KCgogIGZ1bmN0aW9uIGdldEFycmF5S2V5SW5kZXgoYXJyLCBrZXlUb0ZpbmQpIHsKICAgIHZhciBpID0gMCwKICAgICAgICBrZXk7CgogICAgZm9yIChrZXkgaW4gYXJyKSB7CiAgICAgIGlmIChhcnJba2V5XSA9PT0ga2V5VG9GaW5kKSB7CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0KCiAgICAgIGkrKzsKICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CiAgLyoqCiAgICogR2V0IENTUyBjb21wdXRlZCBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudAogICAqIEBmdW5jdGlvbgogICAqIEBpZ25vcmUKICAgKiBAYXJndW1lbnQge0VlbWVudH0gZWxlbWVudAogICAqIEBhcmd1bWVudCB7U3RyaW5nfSBwcm9wZXJ0eQogICAqLwoKCiAgZnVuY3Rpb24gZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KGVsZW1lbnQsIHByb3BlcnR5KSB7CiAgICAvLyBOT1RFOiAxIERPTSBhY2Nlc3MgaGVyZQogICAgdmFyIGNzcyA9IHJvb3QuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LCBudWxsKTsKICAgIHJldHVybiBjc3NbcHJvcGVydHldOwogIH0KICAvKioKICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgcGFyZW50IG9mIHRoZSBnaXZlbiBlbGVtZW50CiAgICogQGZ1bmN0aW9uCiAgICogQGlnbm9yZQogICAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudAogICAqIEByZXR1cm5zIHtFbGVtZW50fSBvZmZzZXQgcGFyZW50CiAgICovCgoKICBmdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkgewogICAgLy8gTk9URTogMSBET00gYWNjZXNzIGhlcmUKICAgIHZhciBvZmZzZXRQYXJlbnQgPSBlbGVtZW50Lm9mZnNldFBhcmVudDsKICAgIHJldHVybiBvZmZzZXRQYXJlbnQgPT09IHJvb3QuZG9jdW1lbnQuYm9keSB8fCAhb2Zmc2V0UGFyZW50ID8gcm9vdC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgOiBvZmZzZXRQYXJlbnQ7CiAgfQogIC8qKgogICAqIFJldHVybnMgdGhlIHNjcm9sbGluZyBwYXJlbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnQKICAgKiBAZnVuY3Rpb24KICAgKiBAaWdub3JlCiAgICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50CiAgICogQHJldHVybnMge0VsZW1lbnR9IG9mZnNldCBwYXJlbnQKICAgKi8KCgogIGZ1bmN0aW9uIGdldFNjcm9sbFBhcmVudChlbGVtZW50KSB7CiAgICB2YXIgcGFyZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOwoKICAgIGlmICghcGFyZW50KSB7CiAgICAgIHJldHVybiBlbGVtZW50OwogICAgfQoKICAgIGlmIChwYXJlbnQgPT09IHJvb3QuZG9jdW1lbnQpIHsKICAgICAgLy8gRmlyZWZveCBwdXRzIHRoZSBzY3JvbGxUT3AgdmFsdWUgb24gYGRvY3VtZW50RWxlbWVudGAgaW5zdGVhZCBvZiBgYm9keWAsIHdlIHRoZW4gY2hlY2sgd2hpY2ggb2YgdGhlbSBpcwogICAgICAvLyBncmVhdGVyIHRoYW4gMCBhbmQgcmV0dXJuIHRoZSBwcm9wZXIgZWxlbWVudAogICAgICBpZiAocm9vdC5kb2N1bWVudC5ib2R5LnNjcm9sbFRvcCB8fCByb290LmRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCkgewogICAgICAgIHJldHVybiByb290LmRvY3VtZW50LmJvZHk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHJvb3QuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgICB9CiAgICB9IC8vIEZpcmVmb3ggd2FudCB1cyB0byBjaGVjayBgLXhgIGFuZCBgLXlgIHZhcmlhdGlvbnMgYXMgd2VsbAoKCiAgICBpZiAoWydzY3JvbGwnLCAnYXV0byddLmluZGV4T2YoZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KHBhcmVudCwgJ292ZXJmbG93JykpICE9PSAtMSB8fCBbJ3Njcm9sbCcsICdhdXRvJ10uaW5kZXhPZihnZXRTdHlsZUNvbXB1dGVkUHJvcGVydHkocGFyZW50LCAnb3ZlcmZsb3cteCcpKSAhPT0gLTEgfHwgWydzY3JvbGwnLCAnYXV0byddLmluZGV4T2YoZ2V0U3R5bGVDb21wdXRlZFByb3BlcnR5KHBhcmVudCwgJ292ZXJmbG93LXknKSkgIT09IC0xKSB7CiAgICAgIC8vIElmIHRoZSBkZXRlY3RlZCBzY3JvbGxQYXJlbnQgaXMgYm9keSwgd2UgcGVyZm9ybSBhbiBhZGRpdGlvbmFsIGNoZWNrIG9uIGl0cyBwYXJlbnROb2RlCiAgICAgIC8vIGluIHRoaXMgd2F5IHdlJ2xsIGdldCBib2R5IGlmIHRoZSBicm93c2VyIGlzIENocm9tZS1pc2gsIG9yIGRvY3VtZW50RWxlbWVudCBvdGhlcndpc2UKICAgICAgLy8gZml4ZXMgaXNzdWUgIzY1CiAgICAgIHJldHVybiBwYXJlbnQ7CiAgICB9CgogICAgcmV0dXJuIGdldFNjcm9sbFBhcmVudChlbGVtZW50LnBhcmVudE5vZGUpOwogIH0KICAvKioKICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZWxlbWVudCBpcyBmaXhlZCBvciBpcyBpbnNpZGUgYSBmaXhlZCBwYXJlbnQKICAgKiBAZnVuY3Rpb24KICAgKiBAaWdub3JlCiAgICogQGFyZ3VtZW50IHtFbGVtZW50fSBlbGVtZW50CiAgICogQGFyZ3VtZW50IHtFbGVtZW50fSBjdXN0b21Db250YWluZXIKICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gYW5zd2VyIHRvICJpc0ZpeGVkPyIKICAgKi8KCgogIGZ1bmN0aW9uIGlzRml4ZWQoZWxlbWVudCkgewogICAgaWYgKGVsZW1lbnQgPT09IHJvb3QuZG9jdW1lbnQuYm9keSkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgaWYgKGdldFN0eWxlQ29tcHV0ZWRQcm9wZXJ0eShlbGVtZW50LCAncG9zaXRpb24nKSA9PT0gJ2ZpeGVkJykgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICByZXR1cm4gZWxlbWVudC5wYXJlbnROb2RlID8gaXNGaXhlZChlbGVtZW50LnBhcmVudE5vZGUpIDogZWxlbWVudDsKICB9CiAgLyoqCiAgICogU2V0IHRoZSBzdHlsZSB0byB0aGUgZ2l2ZW4gcG9wcGVyCiAgICogQGZ1bmN0aW9uCiAgICogQGlnbm9yZQogICAqIEBhcmd1bWVudCB7RWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gYXBwbHkgdGhlIHN0eWxlIHRvCiAgICogQGFyZ3VtZW50IHtPYmplY3R9IHN0eWxlcyAtIE9iamVjdCB3aXRoIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgd2hpY2ggd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBlbGVtZW50CiAgICovCgoKICBmdW5jdGlvbiBzZXRTdHlsZShlbGVtZW50LCBzdHlsZXMpIHsKICAgIGZ1bmN0aW9uIGlzX251bWVyaWMobikgewogICAgICByZXR1cm4gbiAhPT0gJycgJiYgIWlzTmFOKHBhcnNlRmxvYXQobikpICYmIGlzRmluaXRlKG4pOwogICAgfQoKICAgIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkgewogICAgICB2YXIgdW5pdCA9ICcnOyAvLyBhZGQgdW5pdCBpZiB0aGUgdmFsdWUgaXMgbnVtZXJpYyBhbmQgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcKCiAgICAgIGlmIChbJ3dpZHRoJywgJ2hlaWdodCcsICd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXS5pbmRleE9mKHByb3ApICE9PSAtMSAmJiBpc19udW1lcmljKHN0eWxlc1twcm9wXSkpIHsKICAgICAgICB1bml0ID0gJ3B4JzsKICAgICAgfQoKICAgICAgZWxlbWVudC5zdHlsZVtwcm9wXSA9IHN0eWxlc1twcm9wXSArIHVuaXQ7CiAgICB9KTsKICB9CiAgLyoqCiAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24KICAgKiBAZnVuY3Rpb24KICAgKiBAaWdub3JlCiAgICogQGFyZ3VtZW50IHsqfSBmdW5jdGlvblRvQ2hlY2sgLSB2YXJpYWJsZSB0byBjaGVjawogICAqIEByZXR1cm5zIHtCb29sZWFufSBhbnN3ZXIgdG86IGlzIGEgZnVuY3Rpb24/CiAgICovCgoKICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGZ1bmN0aW9uVG9DaGVjaykgewogICAgdmFyIGdldFR5cGUgPSB7fTsKICAgIHJldHVybiBmdW5jdGlvblRvQ2hlY2sgJiYgZ2V0VHlwZS50b1N0cmluZy5jYWxsKGZ1bmN0aW9uVG9DaGVjaykgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7CiAgfQogIC8qKgogICAqIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGdpdmVuIGVsZW1lbnQsIHJlbGF0aXZlIHRvIGl0cyBvZmZzZXQgcGFyZW50CiAgICogQGZ1bmN0aW9uCiAgICogQGlnbm9yZQogICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudAogICAqIEByZXR1cm4ge09iamVjdH0gcG9zaXRpb24gLSBDb29yZGluYXRlcyBvZiB0aGUgZWxlbWVudCBhbmQgaXRzIGBzY3JvbGxUb3BgCiAgICovCgoKICBmdW5jdGlvbiBnZXRPZmZzZXRSZWN0KGVsZW1lbnQpIHsKICAgIHZhciBlbGVtZW50UmVjdCA9IHsKICAgICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsCiAgICAgIGhlaWdodDogZWxlbWVudC5vZmZzZXRIZWlnaHQsCiAgICAgIGxlZnQ6IGVsZW1lbnQub2Zmc2V0TGVmdCwKICAgICAgdG9wOiBlbGVtZW50Lm9mZnNldFRvcAogICAgfTsKICAgIGVsZW1lbnRSZWN0LnJpZ2h0ID0gZWxlbWVudFJlY3QubGVmdCArIGVsZW1lbnRSZWN0LndpZHRoOwogICAgZWxlbWVudFJlY3QuYm90dG9tID0gZWxlbWVudFJlY3QudG9wICsgZWxlbWVudFJlY3QuaGVpZ2h0OyAvLyBwb3NpdGlvbgoKICAgIHJldHVybiBlbGVtZW50UmVjdDsKICB9CiAgLyoqCiAgICogR2V0IGJvdW5kaW5nIGNsaWVudCByZWN0IG9mIGdpdmVuIGVsZW1lbnQKICAgKiBAZnVuY3Rpb24KICAgKiBAaWdub3JlCiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudAogICAqIEByZXR1cm4ge09iamVjdH0gY2xpZW50IHJlY3QKICAgKi8KCgogIGZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KSB7CiAgICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IC8vIHdoZXRoZXIgdGhlIElFIHZlcnNpb24gaXMgbG93ZXIgdGhhbiAxMQoKICAgIHZhciBpc0lFID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJNU0lFIikgIT0gLTE7IC8vIGZpeCBpZSBkb2N1bWVudCBib3VuZGluZyB0b3AgYWx3YXlzIDAgYnVnCgogICAgdmFyIHJlY3RUb3AgPSBpc0lFICYmIGVsZW1lbnQudGFnTmFtZSA9PT0gJ0hUTUwnID8gLWVsZW1lbnQuc2Nyb2xsVG9wIDogcmVjdC50b3A7CiAgICByZXR1cm4gewogICAgICBsZWZ0OiByZWN0LmxlZnQsCiAgICAgIHRvcDogcmVjdFRvcCwKICAgICAgcmlnaHQ6IHJlY3QucmlnaHQsCiAgICAgIGJvdHRvbTogcmVjdC5ib3R0b20sCiAgICAgIHdpZHRoOiByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0LAogICAgICBoZWlnaHQ6IHJlY3QuYm90dG9tIC0gcmVjdFRvcAogICAgfTsKICB9CiAgLyoqCiAgICogR2l2ZW4gYW4gZWxlbWVudCBhbmQgb25lIG9mIGl0cyBwYXJlbnRzLCByZXR1cm4gdGhlIG9mZnNldAogICAqIEBmdW5jdGlvbgogICAqIEBpZ25vcmUKICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50CiAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gcGFyZW50CiAgICogQHJldHVybiB7T2JqZWN0fSByZWN0CiAgICovCgoKICBmdW5jdGlvbiBnZXRPZmZzZXRSZWN0UmVsYXRpdmVUb0N1c3RvbVBhcmVudChlbGVtZW50LCBwYXJlbnQsIGZpeGVkKSB7CiAgICB2YXIgZWxlbWVudFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCk7CiAgICB2YXIgcGFyZW50UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChwYXJlbnQpOwoKICAgIGlmIChmaXhlZCkgewogICAgICB2YXIgc2Nyb2xsUGFyZW50ID0gZ2V0U2Nyb2xsUGFyZW50KHBhcmVudCk7CiAgICAgIHBhcmVudFJlY3QudG9wICs9IHNjcm9sbFBhcmVudC5zY3JvbGxUb3A7CiAgICAgIHBhcmVudFJlY3QuYm90dG9tICs9IHNjcm9sbFBhcmVudC5zY3JvbGxUb3A7CiAgICAgIHBhcmVudFJlY3QubGVmdCArPSBzY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdDsKICAgICAgcGFyZW50UmVjdC5yaWdodCArPSBzY3JvbGxQYXJlbnQuc2Nyb2xsTGVmdDsKICAgIH0KCiAgICB2YXIgcmVjdCA9IHsKICAgICAgdG9wOiBlbGVtZW50UmVjdC50b3AgLSBwYXJlbnRSZWN0LnRvcCwKICAgICAgbGVmdDogZWxlbWVudFJlY3QubGVmdCAtIHBhcmVudFJlY3QubGVmdCwKICAgICAgYm90dG9tOiBlbGVtZW50UmVjdC50b3AgLSBwYXJlbnRSZWN0LnRvcCArIGVsZW1lbnRSZWN0LmhlaWdodCwKICAgICAgcmlnaHQ6IGVsZW1lbnRSZWN0LmxlZnQgLSBwYXJlbnRSZWN0LmxlZnQgKyBlbGVtZW50UmVjdC53aWR0aCwKICAgICAgd2lkdGg6IGVsZW1lbnRSZWN0LndpZHRoLAogICAgICBoZWlnaHQ6IGVsZW1lbnRSZWN0LmhlaWdodAogICAgfTsKICAgIHJldHVybiByZWN0OwogIH0KICAvKioKICAgKiBHZXQgdGhlIHByZWZpeGVkIHN1cHBvcnRlZCBwcm9wZXJ0eSBuYW1lCiAgICogQGZ1bmN0aW9uCiAgICogQGlnbm9yZQogICAqIEBhcmd1bWVudCB7U3RyaW5nfSBwcm9wZXJ0eSAoY2FtZWxDYXNlKQogICAqIEByZXR1cm5zIHtTdHJpbmd9IHByZWZpeGVkIHByb3BlcnR5IChjYW1lbENhc2UpCiAgICovCgoKICBmdW5jdGlvbiBnZXRTdXBwb3J0ZWRQcm9wZXJ0eU5hbWUocHJvcGVydHkpIHsKICAgIHZhciBwcmVmaXhlcyA9IFsnJywgJ21zJywgJ3dlYmtpdCcsICdtb3onLCAnbyddOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJlZml4ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHRvQ2hlY2sgPSBwcmVmaXhlc1tpXSA/IHByZWZpeGVzW2ldICsgcHJvcGVydHkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eS5zbGljZSgxKSA6IHByb3BlcnR5OwoKICAgICAgaWYgKHR5cGVvZiByb290LmRvY3VtZW50LmJvZHkuc3R5bGVbdG9DaGVja10gIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgcmV0dXJuIHRvQ2hlY2s7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbnVsbDsKICB9CiAgLyoqCiAgICogVGhlIE9iamVjdC5hc3NpZ24oKSBtZXRob2QgaXMgdXNlZCB0byBjb3B5IHRoZSB2YWx1ZXMgb2YgYWxsIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSBvbmUgb3IgbW9yZSBzb3VyY2UKICAgKiBvYmplY3RzIHRvIGEgdGFyZ2V0IG9iamVjdC4gSXQgd2lsbCByZXR1cm4gdGhlIHRhcmdldCBvYmplY3QuCiAgICogVGhpcyBwb2x5ZmlsbCBkb2Vzbid0IHN1cHBvcnQgc3ltYm9sIHByb3BlcnRpZXMsIHNpbmNlIEVTNSBkb2Vzbid0IGhhdmUgc3ltYm9scyBhbnl3YXkKICAgKiBTb3VyY2U6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ24KICAgKiBAZnVuY3Rpb24KICAgKiBAaWdub3JlCiAgICovCgoKICBpZiAoIU9iamVjdC5hc3NpZ24pIHsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPYmplY3QsICdhc3NpZ24nLCB7CiAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgIHdyaXRhYmxlOiB0cnVlLAogICAgICB2YWx1ZTogZnVuY3Rpb24gdmFsdWUodGFyZ2V0KSB7CiAgICAgICAgaWYgKHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCkgewogICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgZmlyc3QgYXJndW1lbnQgdG8gb2JqZWN0Jyk7CiAgICAgICAgfQoKICAgICAgICB2YXIgdG8gPSBPYmplY3QodGFyZ2V0KTsKCiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBuZXh0U291cmNlID0gYXJndW1lbnRzW2ldOwoKICAgICAgICAgIGlmIChuZXh0U291cmNlID09PSB1bmRlZmluZWQgfHwgbmV4dFNvdXJjZSA9PT0gbnVsbCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBuZXh0U291cmNlID0gT2JqZWN0KG5leHRTb3VyY2UpOwogICAgICAgICAgdmFyIGtleXNBcnJheSA9IE9iamVjdC5rZXlzKG5leHRTb3VyY2UpOwoKICAgICAgICAgIGZvciAodmFyIG5leHRJbmRleCA9IDAsIGxlbiA9IGtleXNBcnJheS5sZW5ndGg7IG5leHRJbmRleCA8IGxlbjsgbmV4dEluZGV4KyspIHsKICAgICAgICAgICAgdmFyIG5leHRLZXkgPSBrZXlzQXJyYXlbbmV4dEluZGV4XTsKICAgICAgICAgICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5leHRTb3VyY2UsIG5leHRLZXkpOwoKICAgICAgICAgICAgaWYgKGRlc2MgIT09IHVuZGVmaW5lZCAmJiBkZXNjLmVudW1lcmFibGUpIHsKICAgICAgICAgICAgICB0b1tuZXh0S2V5XSA9IG5leHRTb3VyY2VbbmV4dEtleV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiB0bzsKICAgICAgfQogICAgfSk7CiAgfQoKICByZXR1cm4gUG9wcGVyOwp9KTs="},null]}