@myop/sdk 0.3.29 → 0.3.30

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.
Files changed (35) hide show
  1. package/dist/bundled-declarations.d.ts +7 -1
  2. package/dist/cjs/{_IframeSDK.aad83b0e.min.js → _IframeSDK.54e9c00a.min.js} +1 -1
  3. package/dist/cjs/{_IframeSDK.a588c953.js → _IframeSDK.58a92ae6.js} +11 -1
  4. package/dist/cjs/{_IframeSDK.a588c953.js.map → _IframeSDK.58a92ae6.js.map} +2 -2
  5. package/dist/cjs/_MyopHelpers.172384f4.min.js +1 -0
  6. package/dist/cjs/{_MyopHelpers.39adea76.js → _MyopHelpers.95610381.js} +14 -1
  7. package/dist/cjs/{_MyopHelpers.39adea76.js.map → _MyopHelpers.95610381.js.map} +2 -2
  8. package/dist/cjs/{_WebComponentSDK.7cb826f6.min.js → _WebComponentSDK.2c337f58.min.js} +1 -1
  9. package/dist/cjs/{_WebComponentSDK.54cf170b.js → _WebComponentSDK.70ad04f1.js} +11 -1
  10. package/dist/cjs/{_WebComponentSDK.54cf170b.js.map → _WebComponentSDK.70ad04f1.js.map} +2 -2
  11. package/dist/cjs/{_hostSDK.cde5ef67.js → _hostSDK.3da4ff63.js} +11 -1
  12. package/dist/cjs/{_hostSDK.cde5ef67.js.map → _hostSDK.3da4ff63.js.map} +2 -2
  13. package/dist/cjs/{_hostSDK.5ff6334c.min.js → _hostSDK.e22156b3.min.js} +1 -1
  14. package/dist/cjs/myop_sdk.js +14 -14
  15. package/dist/cjs/myop_sdk.js.map +1 -1
  16. package/dist/cjs/myop_sdk.min.js +1 -1
  17. package/dist/cjs-bundled/myop_sdk.bundled.js +16 -3
  18. package/dist/cjs-bundled/myop_sdk.bundled.js.map +2 -2
  19. package/dist/cjs-bundled/myop_sdk.bundled.min.js +1 -1
  20. package/dist/module/Iframe/index.js +12 -2
  21. package/dist/module/Iframe/index.js.map +2 -2
  22. package/dist/module/SDK.js +16 -3
  23. package/dist/module/SDK.js.map +2 -2
  24. package/dist/module/embeddedSDK.js +1 -1
  25. package/dist/module/helpers/CloudRepository.d.ts +6 -0
  26. package/dist/module/helpers/cloudRepositoryHelpers.d.ts +1 -1
  27. package/dist/module/helpers/index.js +15 -2
  28. package/dist/module/helpers/index.js.map +2 -2
  29. package/dist/module/host/embeddedSDK.js +1 -1
  30. package/dist/module/host/index.js +12 -2
  31. package/dist/module/host/index.js.map +2 -2
  32. package/dist/module/webcomponent/index.js +12 -2
  33. package/dist/module/webcomponent/index.js.map +2 -2
  34. package/package.json +1 -1
  35. package/dist/cjs/_MyopHelpers.ce80c342.min.js +0 -1
@@ -2138,7 +2138,7 @@ var WebcomponentLoader = class extends BaseMyopLoader {
2138
2138
  };
2139
2139
 
2140
2140
  // version:myop-sdk-version
2141
- var myop_sdk_version_default = "0.3.29";
2141
+ var myop_sdk_version_default = "0.3.30";
2142
2142
 
2143
2143
  // src/webcomponent/messageHandlers/BaseWebComponentMessageHandler.ts
2144
2144
  var BaseWebComponentMessageHandler = class extends BaseContextMessageHandler {
@@ -2879,6 +2879,7 @@ var _CloudRepository = class _CloudRepository {
2879
2879
  __publicField(this, "_defaultEnv", "production");
2880
2880
  __publicField(this, "_envExplicitlySet", false);
2881
2881
  __publicField(this, "_staticMode", false);
2882
+ __publicField(this, "_queryParams", {});
2882
2883
  }
2883
2884
  static get Main() {
2884
2885
  const globalMain = getGlobalMain();
@@ -2899,6 +2900,13 @@ var _CloudRepository = class _CloudRepository {
2899
2900
  enableStaticMode() {
2900
2901
  this._staticMode = true;
2901
2902
  }
2903
+ /**
2904
+ * Set query parameters to append to all fetch URLs (e.g. for CDN cache busting).
2905
+ * Example: `setQueryParams({ lastupdate: '11112026' })`
2906
+ */
2907
+ setQueryParams(params) {
2908
+ this._queryParams = params;
2909
+ }
2902
2910
  /**
2903
2911
  * Set the default environment for this CloudRepository instance
2904
2912
  */
@@ -2968,6 +2976,8 @@ var _CloudRepository = class _CloudRepository {
2968
2976
  if (this._staticMode) {
2969
2977
  const file = usePreview ? "preview" : env;
2970
2978
  url = `${this._baseUrl}/components/${componentId}/${file}.json`;
2979
+ const qs = new URLSearchParams(this._queryParams).toString();
2980
+ if (qs) url += `?${qs}`;
2971
2981
  } else {
2972
2982
  url = `${this._baseUrl}/consume?id=${componentId}&env=${env}`;
2973
2983
  if (usePreview) {
@@ -3712,4 +3722,4 @@ defineDynamicImport("IframeSDK", IframeSDK);
3712
3722
  export {
3713
3723
  IframeSDK
3714
3724
  };
3715
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9CYXNlTXlvcFNESy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb25zdHMudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9nTWVzc2FnZXMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvQ2xvdWRSZXBvc2l0b3J5LnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcE92ZXJyaWRlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2hvc3RTREsudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi91dGlscy9kb21PYnNlcnZlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9JZnJhbWVTREsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+ID0gVCB8IChzdHJpbmcgJiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPik7XG5cbmV4cG9ydCB0eXBlIE15b3BNZXNzYWdlS2V5ID0gU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzIHwga2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcy5Jbj47XG5cbmV4cG9ydCBjb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLy9ob3N0IHRvIGNvbXBvbmVudFxuICAgICdJbml0UmVxdWVzdCc6ICdJbml0UmVxdWVzdCcsXG4gICAgJ0luaXRSZXNwb25zZSc6ICdJbml0UmVzcG9uc2UnLFxuICAgICdJbml0TWVzc2FnZSc6ICdJbml0TWVzc2FnZScsXG4gICAgJ0Rpc3Bvc2VNZXNzYWdlJzogJ0Rpc3Bvc2VNZXNzYWdlJyxcblxuICAgICdDaGFuZ2VUZXh0TWVzc2FnZSc6ICdDaGFuZ2VUZXh0TWVzc2FnZScsXG4gICAgJ0JpbmRDbGlja01lc3NhZ2UnOiAnQmluZENsaWNrTWVzc2FnZScsXG4gICAgJ0RldGVjdE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnLFxuXG4gICAgJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJyxcblxuICAgICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc6ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZScsXG4gICAgJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnU2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc6ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJyxcbiAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJzogJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnLFxuICAgICdHZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ1NldElubmVySHRtbCc6ICdTZXRJbm5lckh0bWwnLFxuXG4gICAgLy9jb21wb25lbnQgbWVzc2FnZXNcbiAgICAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc6ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJyxcbiAgICAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJyxcblxuICAgICdDbGVhbnVwTWVzc2FnZSc6ICdDbGVhbnVwTWVzc2FnZScsXG5cbiAgICAvLyBleHRlcm5hbCB0byBob3N0IDpcbiAgICBJbjoge1xuICAgICAgICAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnLFxuICAgICAgICAnQ2xpY2tSZXBsYXlNZXNzYWdlJzogJ0NsaWNrUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnLFxuXG4gICAgICAgICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJzogJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnLFxuICAgICAgICAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSc6ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJyxcblxuICAgICAgICBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIjogXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCIsXG4gICAgICAgICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSc6ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZScsXG4gICAgICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgICAgICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgICAgICdDbGVhbnVwUmVwbGF5TWVzc2FnZSc6ICdDbGVhbnVwUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJ1xuICAgIH1cbn1cbiIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICIvL1RPRE8gOiByZXVzZSBmcm9tIG9uZSBwbGFjZS5cbi8vIG5lZWRzIHRvIGJlIHVzZWQgaW4gbXlvcC1zZGssIG15b3AtZGFzaGJhb3JkLCBteW9wLXNlcnZlciwgbXlvcC1jbGkgLi5cblxuZXhwb3J0IGNvbnN0IHV1aWR2NCA9ICgpID0+IHtcbiAgICByZXR1cm4gXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XG4gICAgICAgICgrYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gK2MgLyA0KS50b1N0cmluZygxNilcbiAgICApO1xufVxuXG4vLyBDb252ZXJ0IFVVSUQgc3RyaW5nIHRvIGJ5dGVzXG5leHBvcnQgY29uc3QgdXVpZFRvQnl0ZXMgPSAodXVpZDogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgdXVpZC5yZXBsYWNlKC8tL2csICcnKS5tYXRjaCgvLnsxLDJ9L2cpIS5tYXAoYnl0ZSA9PiBwYXJzZUludChieXRlLCAxNikpXG4gICAgKTtcbn07XG5cbi8vIENvbnZlcnQgYnl0ZXMgdG8gVVVJRCBzdHJpbmdcbmV4cG9ydCBjb25zdCBieXRlc1RvVXVpZCA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgaGV4ID0gWy4uLmJ5dGVzXS5tYXAoYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBoZXguc2xpY2UoMCwgOCksXG4gICAgICAgIGhleC5zbGljZSg4LCAxMiksXG4gICAgICAgIGhleC5zbGljZSgxMiwgMTYpLFxuICAgICAgICBoZXguc2xpY2UoMTYsIDIwKSxcbiAgICAgICAgaGV4LnNsaWNlKDIwKVxuICAgIF0uam9pbignLScpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGVuY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZSA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ5dGVzKSk7XG4gICAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZGVjb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRGVjb2RlID0gKHN0cjogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgbGV0IGJhc2U2NCA9IHN0ci5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChiYXNlNjQubGVuZ3RoICUgNCkgYmFzZTY0ICs9ICc9JztcbiAgICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NCk7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKTtcbn07XG5cbi8vIENvbXByZXNzIGFuIGFycmF5IG9mIFVVSURzIGludG8gYSBzaG9ydCBVUkwtc2FmZSBzdHJpbmdcbmV4cG9ydCBjb25zdCBjb21wcmVzc1VVSURzID0gKHV1aWRzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYWxsQnl0ZXMgPSB1dWlkcy5mbGF0TWFwKHV1aWQgPT4gQXJyYXkuZnJvbSh1dWlkVG9CeXRlcyh1dWlkKSkpO1xuICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoYWxsQnl0ZXMpKTtcbn07XG5cbi8vIERlY29tcHJlc3MgZnJvbSBVUkwtc2FmZSBzdHJpbmcgYmFjayB0byBhbiBhcnJheSBvZiBVVUlEc1xuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NVVUlEcyA9IChlbmNvZGVkOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoZW5jb2RlZCk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAlIDE2ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgbGVuZ3RoJyk7XG5cbiAgICBjb25zdCB1dWlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAxNikge1xuICAgICAgICB1dWlkcy5wdXNoKGJ5dGVzVG9VdWlkKGJ5dGVzLnNsaWNlKGksIGkgKyAxNikpKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWRzO1xufTtcbiIsICJleHBvcnQgKiBmcm9tICcuL3V1aWQudHMnXG5cbmV4cG9ydCBjb25zdCB3YWl0ID0gKG1zOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHtJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGlyZWN0aW9uIHtcbiAgICBzdGF0aWMgZG93biA9ICdkb3duJyBhcyBjb25zdFxuICAgIHN0YXRpYyB1cCA9ICd1cCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZURpcmVjdGlvbk9wdGlvbiA9ICd1cCcgfCAnZG93bic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcE1lc3NhZ2U8VCA9IGFueT4ge1xuICAgIGlkID0gdXVpZHY0KClcblxuICAgIHN0YXRpYyBjcmVhdGU8VCwgVSBleHRlbmRzIG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+KSA9PiBUID0gdHlwZW9mIHRoaXM+KFxuICAgICAgICB0aGlzOiBVLFxuICAgICAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT5cbiAgICApOiBJbnN0YW5jZVR5cGU8dHlwZW9mIHRoaXM+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ21lZXNhZ2UgaWQgY3JlYXRlZCcsIHRoaXMuaWQsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIG15b3AgPSB0cnVlXG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXkgfCBzdHJpbmc7XG5cbiAgICBjb250ZW50PzogVFxuXG4gICAgLy8gVE9ETyA6IGNhbnQgYmUgb3B0aW9uYWwgXG4gICAgc291cmNlPzogc3RyaW5nXG4gICAgZGVzdGluYXRpb24/OiBzdHJpbmdcblxuICAgIHJvdXRlPzogc3RyaW5nW11cblxuICAgIHJlZj86IFJlZlxuXG4gICAgZGlyZWN0aW9uPzogTWVzc2FnZURpcmVjdGlvbk9wdGlvblxuXG4gICAgY2xlYW5hYmxlOiBib29sZWFuID0gZmFsc2VcblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wRWxlbWVudE1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZikge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRNZXNzYWdlPFQgPSBhbnksIFIgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5O1xuXG4gICAgcHVibGljIGhhbmRsZXJVbmlxdWVJZCA9IHV1aWR2NCgpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IFIpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZiB7XG4gICAgcHVibGljIG15b3AgPSB0cnVlO1xuXG4gICAgcHVibGljIF9fbm9uUHJveGllZD86IFJlZjtcblxuICAgIHN0YXRpYyBjcmVhdGUoc2VsZWN0b3I6IHN0cmluZywgcmVmQ29uZmlnPzogSVJlZkNvbmZpZywgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgbGV0IF9yZWZDb25maWcgPSByZWZDb25maWc7XG4gICAgICAgIGlmICghX3JlZkNvbmZpZykge1xuICAgICAgICAgICAgX3JlZkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmKF9yZWZDb25maWcsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZywgcHVibGljIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX19ub25Qcm94aWVkID0ge1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIGNvbXBvbmVudDogbnVsbCAvLyBpbiBvcmRlciB0byBiZSBzZXJpYWxpemFibGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsaWNrUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEJpbmRDbGlja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xpY2tSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdCaW5kQ2xpY2tNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xpY2tSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaWNrUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdDaGFuZ2VUZXh0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0ZXh0XG4gICAgfVxufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJ1xuXG5jb25zdCBmdW5jdGlvbkJvZHlSZWdleCA9IC8oPzpmdW5jdGlvblxccypcXHcqXFxzKlxcKFteKV0qXFwpXFxzKlxceyhbXFxzXFxTXSo/KVxcfXwoXFwoW14pXSpcXClcXHMqPT5cXHMqXFx7KFtcXHNcXFNdKj8pXFx9KSlcXHMqJC87XG5jb25zdCBleHByZXNzaW9uQm9keVJlZ2V4ID0gL1xcKFxccypbXildK1xccypcXClcXHMqPT5cXHMqKC4rKS87XG5cbmV4cG9ydCBjb25zdCBzdHJpcEZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnVuY3Rpb25Cb2R5UmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChleHByZXNzaW9uQm9keVJlZ2V4KTtcbiAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIHNjcmlwdElucHV0cyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG59IHwge307XG5cbmV4cG9ydCB0eXBlIHNjcmlwdFZhcnM8VD4gPSB7XG4gICAgc2VuZDogKGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgLy8gY29tcGxldGVTdHJlYW06ICgpID0+IHZvaWQ7XG4gICAgcm9vdFJlZjogUm9vdFJlZjtcbiAgICBtYWtlU2VyaWFsaXphYmxlOiB0eXBlb2YgbWFrZVNlcmlhbGl6YWJsZVxufVxuXG5leHBvcnQgdHlwZSBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4gPSB7XG4gICAgW0sgaW4ga2V5b2YgSV06IElbS107XG59ICYgc2NyaXB0VmFyczxUPlxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8c3RyaW5nLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+PiB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG4gICAgc2NyaXB0OiBzdHJpbmcgPSAnJ1xuXG4gICAgc3RhdGljIHJlcGxpZXJLZXkgPSAnc2VuZCc7XG4gICAgc3RhdGljIGNvbXBsZXRlU3RyZWFtS2V5ID0gJ2NvbXBsZXRlU3RyZWFtJztcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPikgPT4gVCwgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgfSwgcHVibGljIHNjcmlwdElucHV0cz86IEkpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy9UT0RPOiBjYW4gYmUgcmVtb3ZlXG4gICAgICAgIHRoaXMuY29udGVudCA9IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmlwRnVuY3Rpb24odGhpcy5jb250ZW50KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQ+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGNvbnRlbnQ6IFQpIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSxcbiAgICBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlLFxuICAgIGV4dGVuZGVkU2NyaXB0VmFycyxcbiAgICBzY3JpcHRJbnB1dHMsIHN0cmlwRnVuY3Rpb25cbn0gZnJvbSBcIi4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IHR5cGUgY3VzdG9tUmVmU2NyaXB0SW5wdXRzID0ge1xuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIHJlZj86IEhUTUxFbGVtZW50LFxuICAgIF9zY3JpcHQ/OiBzdHJpbmcsXG4gICAgX19zY3JpcHRJbnB1dHM/OiBPYmplY3Rcbn07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZWZNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IGV4dGVuZHMgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4ge1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+KSA9PiBULFxuICAgICAgICAgICAgICAgIHB1YmxpYyBzY3JpcHRJbnB1dHM6IEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSkge1xuXG4gICAgICAgIC8vbW9jayB2YXJzXG4gICAgICAgIC8vIGxldCByb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzO1xuICAgICAgICBzdXBlcigoe3Jvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHN9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZzID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvckFsbChgWyR7J215b3AtaWQnfT0nJHtlbGVtZW50SWR9J11gKTtcbiAgICAgICAgICAgIGlmIChyZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vICBjb25zdCByZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgZXhwb3NpbmcgXCJyZWZzXCIgYW5kIG5vdCBvbmx5IFwicmVmXCJcbiAgICAgICAgICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSB0aGUgUmVmIGhhcyBtdWx0aXBsYXRlIGltcGxlbWVudGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIF9fc2NyaXB0SW5wdXRzLnJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtfc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIEZ1bmN0aW9uKCdyZWYnLCAncm9vdFJlZicsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgX3NjcmlwdCEpKHJlZiwgcm9vdFJlZiwgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBUO1xuICAgICAgICB9LCBoYW5kbGVyKTtcblxuICAgICAgICB0aGlzLnNjcmlwdElucHV0cyA9IHtcbiAgICAgICAgICAgIC4uLnNjcmlwdElucHV0cyxcbiAgICAgICAgICAgIC8vX3NjcmlwdDogc3RyaXBGdW5jdGlvbihzY3JpcHQudG9TdHJpbmcoKSksXG4gICAgICAgICAgICBfc2NyaXB0OiBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZVNrZWxldG9ufSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U8VCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXAgPSBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZSB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4gPSBmYWxzZSAvLyB7fSAvLyBlbXB0eVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgdHlwZTogVCwgcHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgd2l0aFNlcmlhbGl6YWJsZVNrZWxldG9uKHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPikge1xuICAgICAgICB0aGlzLnNlcmlhbGl6YWJsZVNrZWxldG9uID0gc2VyaWFsaXphYmxlU2tlbGV0b247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGU6IFNlcmlhbGl6YWJsZTxFdmVudD4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0ge1xuICAgICAgICAgICAgZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWYsfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBTZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRm9ybURhdGFFbnRyeSA9IHtcbiAgICBpZD86IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHZhbHVlPzogSW5wdXRFbGVtZW50VmFsdWUsXG4gICAgcmVxdWlyZWQ/OiBib29sZWFuLFxuICAgIHZhbGlkaXR5PzogU2VyaWFsaXphYmxlPFZhbGlkaXR5U3RhdGU+LFxuICAgIG15b3BJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgPSB7XG4gICAgZm9ybURhdGE/OiB7IFtrZXk6IHN0cmluZ106IEZvcm1EYXRhRW50cnkgfVxuICAgIHVubWFwcGVkRGF0YT86IEZvcm1EYXRhRW50cnlbXVxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50VmFsdWUgPSBzdHJpbmcgfCBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBJbnB1dEVsZW1lbnRWYWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWwgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRJbm5lckh0bWwnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBpbm5lckh0bWw6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbm5lckh0bWxcbiAgICB9XG59IiwgImltcG9ydCB7IEJhc2VNeW9wTWVzc2FnZSB9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbi8vIHNlbnQgYnkgaG9zdCB0byBjb21wb25lbnRzLCBjb250YWlucyB0aGllciBpZCBcbmV4cG9ydCBjbGFzcyBJbml0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTx7IGlkOiBzdHJpbmcgfT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7IGlkIH1cbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG4vLyBjb21wb25lbnQgbm90aWZ5IGhvc3QgdGhlIGl0IHdhcyBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVzcG9uc2UgZXh0ZW5kcyBJbml0TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlc3BvbnNlJztcbn1cblxuLy8gY29tcG9uZW50IGFzayB0byBob3N0IHRvIGdldCBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVxdWVzdCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlcXVlc3QnO1xufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50Q29uZmlnLCBJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0L2hvc3RTREsudHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvcHRpb25zOiBsb2FkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSkgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG5cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5lc3RlZFJlZiA9IHtcbiAgICByZWZOYW1lOiBzdHJpbmcsXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIG5lc3RlZFJlZnM6IE5lc3RlZFJlZltdLCBwdWJsaWMgZmFpbGVkPzogYm9vbGVhbikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEVudmVsb3BlZE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0VudmVsb3BlZE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGRlc3RpbmF0aW9uOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBjb25zdCBpbm5lckVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yb3V0ZSA9IFtkZXN0aW5hdGlvbiwgLi4uaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlID8gaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlIDogW11dO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lFbGVtZW50UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8YW55LCBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0RldGVjdE15b3BSZWZzTWVzc2FnZSdcbiAgICByZXBseU1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xufVxuXG5leHBvcnQgY2xhc3MgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8SUVsZW1lbnRSZWZbXT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBteW9wRWxlbWVudFJlZnM6IElFbGVtZW50UmVmW10pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBteW9wRWxlbWVudFJlZnM7XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2U8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG50eXBlIE1ldGhvZE5hbWVzPFQ+ID0ge1xuICAgIC8vIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBLIDogbmV2ZXI7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoKSA9PiB2b2lkID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLy8gRGVmaW5lIGEgdHlwZSB0aGF0IGFsbG93cyBvbmx5IHN0cmluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kIG5hbWVzIG9mIFRcbnR5cGUgTWV0aG9kU3RyaW5nPFQ+ID0gTWV0aG9kTmFtZXM8VD4gZXh0ZW5kcyBpbmZlciBNID8gTSBleHRlbmRzIHN0cmluZyA/IE0gOiBuZXZlciA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXRob2Q6IE1ldGhvZFN0cmluZzxJTXlvcENvbXBvbmVudD4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsZWFudXBSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ2xlYW51cE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xlYW51cFJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NsZWFudXBNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGVhbnVwRm9yTWVzc2FnZUlkOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3VzdG9tQ2xlYW51cDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEaXNwb3NlTWVzc2FnZSc7XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIHJ1bkV4ZWN1dG9yQ2xlYW51cH0gZnJvbSBcIi4vaW5kZXgudHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9iYXNlTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLCBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEVudmVsb3BlZE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIEhvc3RlZENvbXBvbmVudDxUID0gYW55PiB7XG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICB9XG5cbiAgICAvL29uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBJTXlvcE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaWQ6IHN0cmluZywgcHVibGljIGNvbnRleHQ/OiBUKSB7XG5cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BTREsge1xuICAgIGluaXQ6ICgpID0+IHZvaWQ7XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXM6IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD47XG59XG5cbi8vIGNvbnN0IGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcyA9IFtcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QsXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSxcbi8vICAgICAvL015b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlLFxuLy8gXVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BTREsgaW1wbGVtZW50cyBJTXlvcFNESyB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGFic3RyYWN0IHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIG1lc3NhZ2VUb0hhbmRsZUFmdGVySW5pdDogQmFzZU15b3BNZXNzYWdlW10gPSBbXTtcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD4gPSB7fTtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3Q6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgbWVzc2FnZUNsZWFudXBDYWNoZTogUmVjb3JkPHN0cmluZywgQ2xlYW51cEhhbmRsZXIgfCBQcm9taXNlPENsZWFudXBIYW5kbGVyPj4gfCBQcm9taXNlPHZvaWQ+ID0ge307XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlcyhldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGV2ZW50LmRhdGEgPyBldmVudC5kYXRhIDogZXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgLy8gbm90IG15b3AgbWFya2VkIGV2ZW50IFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24uZG93bikge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBiYXNlU0RLLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgKGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcy5pbmNsdWRlcyhtZXNzYWdlLm1lc3NhZ2VUeXBlKSkge1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICAgIC8vVE9ETyA6IGZpeCBkaXJlY3Rpb24gPyBtZXNzYWdlIHdpbGwgbm90IHByb2NjZXNzIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5EaXNwb3NlTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzaG91bGQgbm90IGJlIG9wdGlvbmFsLCBmaXggYW5kIHJlbW92ZSAnaWYnXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbl1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdlIGdvdCBvdXIgaWQgZnJvbSBvdXIgaG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IFNESyBtYXkgc2VydmUgbW9yZSB0aGFuIDEgY29tcG9uZW50IC4uIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKFwicmVjaGl2ZWQgaW5pdCBtZXNzYWdlIGZvciBhbiBleHNpc2luZyBjb21wb25lbnQuXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdID0gbmV3IEhvc3RlZENvbXBvbmVudChuZXdDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXNwb25zZShuZXdDb21wb25lbnRJZCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZm9yIHNhbWUgSG9zdFNESyBjYXNlc1xuICAgICAgICAgICAgLy8gd2hlbiBib3RoIFJlZkNvbXBvbmVudCBhbmQgcmVhbENvbXBvbmVudCBob3N0ZWQgaW4gdGhlIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyTWVzc2FnZSA9IGVudmVsb3BlZE1lc3NhZ2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gaW5uZXJNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCB8fCB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbiFdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gaW5uZXJNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGVudmVsb3BlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKXtcbiAgICAgICAgICAgIC8vICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgOiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlID0gbWVzc2FnZSBhcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuICAgICAgICAgICAgLy8gLy8gICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DbGVhbnVwTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENsZWFudXBNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwTWVzc2FnZSA9IG5ldyBDbGVhbnVwUmVwbGF5TWVzc2FnZSghIWNsZWFudXApO1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwTWVzc2FnZS5kZXN0aW5hdGlvbiA9IG1lc3NhZ2UuZGVzdGluYXRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5FeGVjdXRvckNsZWFudXAoY2xlYW51cCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRlbCBlcnJvcj9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25IYW5kbGVyRm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIubWVzc2FnZVR5cGUgPT09IG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkhhbmRsZXJGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gaGFuZGxlci5leGVjdXRvcihtZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuY2xlYW5hYmxlICYmIGNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbbWVzc2FnZS5pZF0gPSBjbGVhbnVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYW51cCAmJiAhbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIG5vbi1jbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2xlYW51cCAmJiBtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3IgYSBjbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25IYW5kbGVyRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogcHJpbnQgd2l0aCBkZWJ1ZyBjb25maWcgb25seVxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBtZXNzYWdlIGhhbmRsZXIgd2FzIGZvdW5kIGZvciAnLCBtZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Vuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZScpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbml0OiAoKSA9PiB2b2lkO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgKiBmcm9tICcuL015b3BFbGVtZW50UmVmJztcbmV4cG9ydCAqIGZyb20gJy4vYmFzZU1lc3NhZ2VIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQmFzZU15b3BTREsnO1xuXG5leHBvcnQgdHlwZSBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgRGljdGlvbmFyeTxUPiA9IHsgW2tleTogc3RyaW5nXTogVDsgfTtcblxuLy9leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9ICdJZnJhbWVMb2FkZXInIHwgJ1dlYkNvbXBvbmVudExvYWRlcicgfCAnSFRNTExvYWRlcicgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBTa2luTG9hZGVycyA9IHtcbiAgICBcIklmcmFtZUxvYWRlclwiOiBcIklmcmFtZUxvYWRlclwiLFxuICAgIFwiV2ViQ29tcG9uZW50TG9hZGVyXCI6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCIsXG4gICAgXCJIVE1MTG9hZGVyXCI6IFwiSFRNTExvYWRlclwiLFxuICAgIFwiTWluaW1pemVkTG9hZGVyXCI6IFwiTWluaW1pemVkTG9hZGVyXCJcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9IGtleW9mIHR5cGVvZiBTa2luTG9hZGVycztcblxuZXhwb3J0IHR5cGUgUHJvcFR5cGUgPSAnYW55JyB8ICdzdHJpbmcnIHwgJ251bWJlcicgfCBzdHJpbmc7IC8vIFRPRE8gOiA8XG5leHBvcnQgdHlwZSBSZWZTZWxlY3RvclR5cGUgPSAnaWQtYXR0cmlidXRlJyB8ICdjc3Mtc2VsZWN0b3InIHwgJ3hwYXRoJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IExvYWRlckZyYW1ld29ya3MgPSB7XG4gICAgXCJyZWFjdFwiOiBcInJlYWN0XCIsXG4gICAgXCJ2dWVcIjogXCJ2dWVcIixcbiAgICBcImFuZ3VsYXJcIjogXCJhbmd1bGFyXCIsXG59IGFzIGNvbnN0XG5leHBvcnQgdHlwZSBMb2FkZXJGcmFtZXdvcmtUeXBlID0ga2V5b2YgdHlwZW9mIExvYWRlckZyYW1ld29ya3M7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIldlYkNvbXBvbmVudExvYWRlclwiO1xuICAgIHVybDogc3RyaW5nLFxuICAgIHRhZzogc3RyaW5nLFxuICAgIGZyYW1ld29yaz86IExvYWRlckZyYW1ld29ya1R5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSWZyYW1lTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSWZyYW1lTG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmdcbiAgICBhdXRvSGVpZ2h0OiBib29sZWFuXG4gICAgaGVpZ2h0Pzogc3RyaW5nXG4gICAgd2lkdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNoYWRvd1Jvb3RNb2RlVHlwZSA9IHtcbiAgICBcIm9wZW5cIjogXCJvcGVuXCIsXG4gICAgXCJjbG9zZWRcIjogXCJjbG9zZWRcIixcbiAgICBcIm5vbmVcIjogXCJub25lXCIsXG4gICAgXCJsb2NhbEZyYW1lXCI6IFwibG9jYWxGcmFtZVwiXG59IGFzIGNvbnN0O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUhUTUxMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJIVE1MTG9hZGVyXCI7XG4gICAgSFRNTDogc3RyaW5nO1xuICAgIC8vVE9ETzogcmVuYW1lKHJvb3RNb2RlL2N1c3RvbUVsZW1lbnRNb2RlKSArIGRiIG1pZ3JhdGlvblxuICAgIHNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZTtcbiAgICBhdXRvSGVpZ2h0PzogYm9vbGVhbjtcbiAgICBoZWlnaHQ/OiBzdHJpbmc7XG4gICAgd2lkdGg/OiBzdHJpbmc7XG59XG5cbi8vZm9yIGludGVybmFsIGRhc2hib2FyZCB1c2FnZVxuZXhwb3J0IGludGVyZmFjZSBJTWluaW1pemVkTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiTWluaW1pemVkTG9hZGVyXCI7XG59XG5cbmludGVyZmFjZSBEYXNoYm9hcmRPYmplY3Qge1xuICAgIF90ZW1wX2NsaWVudF9pZD86IHN0cmluZyxcbn1cblxudHlwZSBFeHRlbmQ8VCwgVT4gPSBUICYgVTtcblxudHlwZSBFeHRlbmRSZWN1cnNpdmVseTxULCBFPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBFXTogRVtLXTtcbn0gJiB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3RcbiAgICAgICAgPyBFeHRlbmRSZWN1cnNpdmVseTxUW0tdLCBFPlxuICAgICAgICA6IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBJRGFzaGJvYXJkPFQ+ID0gRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRGFzaGJvYXJkT2JqZWN0PjtcblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGVcblxuICAgIFtrZXk6IHN0cmluZ106IGFueTsgLy8gQWxsb3dzIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JUmVsZWFzZU1ldGFkYXRhIHtcbiAgICBlbnZpcm9ubWVudElkOiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnRJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgcmVsZWFzZWRPbj86IHN0cmluZztcbiAgICByZWxlYXNlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lWYXJpYW50Q29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcmVsZWFzZXM/OiB2Ml9JUmVsZWFzZU1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVNraW5Db25maWcgZXh0ZW5kcyBJU2tpbkNvbmZpZyB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50UnVsZSB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcGVyYXRvcjogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgdmVyc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXQge1xuICAgIHZlcnNpb25zOiBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcnVsZXM6IElFeHBlcmllbmNlU2VnbWVudFJ1bGVbXTtcbiAgICB1c2VBYjogYm9vbGVhbjtcbiAgICBjb21wb25lbnRWYXJpYW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gICAgYWJTcGxpdD86IElFeHBlcmllbmNlQUJTcGxpdDtcbiAgICBzdGlja3lQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBkZWZpbml0aW9uIGNvbmZpZyAodjIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VEZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSURzICovXG4gICAgY29tcG9uZW50czogc3RyaW5nW107XG4gICAgLyoqIFNlZ21lbnQgY29uZmlndXJhdGlvbnMgKi9cbiAgICBzZWdtZW50czogSUV4cGVyaWVuY2VTZWdtZW50W107XG4gICAgLyoqIEZhbGxiYWNrIHZhcmlhbnQgcGVyIGNvbXBvbmVudCAqL1xuICAgIGZhbGxiYWNrOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIC8qKiBUYWdzICovXG4gICAgdGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lNeW9wU3RvcmVkT2JqZWN0IGV4dGVuZHMgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRBY2Nlc3Mge1xuICAgIHZpc2liaWxpdHk6ICdwcml2YXRlJyB8ICd1bmxpc3RlZCcgfCAncHVibGljJztcbiAgICB1bmxpc3RlZD86IHtcbiAgICAgICAgc2x1Zzogc3RyaW5nO1xuICAgIH07XG4gICAgbWFya2V0cGxhY2U/OiB7XG4gICAgICAgIHN0YXR1czogJ2RyYWZ0JyB8ICdzdWJtaXR0ZWQnIHwgJ2NsYWltZWQnIHwgJ2Nsb3NlZCc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIGNvbnRhY3RFbWFpbDogc3RyaW5nO1xuICAgICAgICBkZWFkbGluZTogc3RyaW5nO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgdmFyaWFudHNfaWRzOiBzdHJpbmdbXSxcbiAgICBEVE9zOiB2Ml9JRFRPW10sXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgYWNjZXNzPzogQ29tcG9uZW50QWNjZXNzLFxuXG4gICAgLy9cbiAgICB2YXJpYW50c19uYW1lczogc3RyaW5nW10sXG4gICAgdmFyaWFudHNfZGF0YToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlkOiBzdHJpbmdcbiAgICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xuICAgICAgICBoYXNfcmVsZWFzZXM/OiBib29sZWFuXG4gICAgfVtdLFxuXG4gICAgcHJldmlld192YXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZztcbiAgICBleHRyYT86IHtcbiAgICAgICAgZmlyc3RWYXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZzsgLy93aGVuIG5ldyBjb21wb25lbnQgY3JlYXRlcyBhdCB0aGUgY2xpZW50XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lEVE8gZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgZGF0YTogb2JqZWN0XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5JbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcyxcbiAgICAvL3NraW5zOiBJU2tpbkluc3RhbmNlQ29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IFNlZ21lbnRUeXBlID0ge1xuICAgIFwiRnVuY3Rpb25SZXN1bHRcIjogXCJGdW5jdGlvblJlc3VsdFwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEluc3RhbmNlIHtcbiAgICBzZWdtZW50SWQ6IHN0cmluZztcbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNlZ21lbnRUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQgZXh0ZW5kcyBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogdHlwZW9mIFNlZ21lbnRUeXBlLkZ1bmN0aW9uUmVzdWx0XG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGZ1bmN0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNraW5TZWxlY3RvclR5cGVzID0ge1xuICAgIFwiU2VnbWVudGVkXCI6IFwiU2VnbWVudGVkXCIsXG4gICAgXCJEZWRpY2F0ZWRcIjogXCJEZWRpY2F0ZWRcIixcblxuICAgIC8qKlxuICAgICAqIFRoaXMgU2VsZWN0b3IgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgXCJEZWZhdWx0XCI6IFwiRGVmYXVsdFwiXG59IGFzIGNvbnN0O1xuXG5cbi8qKlxuICogVGhpcyBTa2luIENvbmZpZyBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gKlxuICogQHR5cGUge0lEZWZhdWx0U2tpbkNvbmZpZ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGVmYXVsdFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVmYXVsdCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQsXG4gICAgc2VnbWVudHM6IElTZWdtZW50SW5zdGFuY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZWRpY2F0ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2tpbn0gaW5zdGVhZC5cbiAgICAgKiBQcm9wZXJ0eSBza2lucyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIHRvIHVzZSB7QGxpbmsgc2tpbn0gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBza2lucz86IElTa2luSW5zdGFuY2VDb25maWdbXSAvLyBkZXByZWNhdGVkXG4gICAgc2tpbjogSVNraW5JbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgLy9UT0RPIDpcbiAgICAvLyBSZWZJRCA/IHRvIHN1cHBvcnQgbW9yZSB0aGFuIDEgY29tcG9uZW50IGZyb20gdGhlIHNhbWUgdHlwZSBpbiBjb21wb3NpdGVzID9cblxuICAgIC8vVE9ETyA6IHJlbW92ZVxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZzsgLy8gPDwgY2hlY2tcblxuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xuXG4gICAgLy8gc3RvcmluZyB0aGUgbmVzdGVkIGNvbmZpZyBmb3IgcmVmIGNvbXBvbmVudHNcbiAgICBuZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW11cblxuICAgIC8vb25seSBvbiBHRVQ/XG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIHJlc29sdmVkRXhwZXJpZW5jZXM/OiBJRXhwZXJpZW5jZVtdXG4gICAgLy8gd2lsbCBpbmNsdWRlIGluc3RhbmNlIGFuZCBkZWYgY29uZmlnIGluIG9yZGVyIHRvIHJlbmRlciBpbiBwcm9kdWN0aW9uXG4gICAgcmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBFeHBlcmllbmNlVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50XCI6IFwiU2VnbWVudFwiLFxuICAgIFwiUHJvbW9cIjogXCJQcm9tb1wiLFxuICAgIFwiQUJcIjogXCJBQlwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIC8vc3RpY2tpbmVzc0ZhY3RvclxuICAgIC8vRW5kRGF0ZVxufVxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2VHcm91cCB7XG4vLyAgICAgaWQ6IHN0cmluZ1xuLy8gICAgIG5hbWU6IHN0cmluZ1xuLy8gICAgIHBlcmNlbnRhZ2U6IG51bWJlclxuLy8gfVxuXG5leHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZTogdHlwZW9mIEV4cGVyaWVuY2VUeXBlcy5BQlxuICAgIC8vIGdyb3VwczogSUFCRXhwZXJpZW5jZUdyb3VwW11cbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIHBlcmNlbnRhZ2U6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRlUmFuZ2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBzdGFydDogRGF0ZVxuICAgIGVuZDogRGF0ZVxuICAgIHRpbWV6b25lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIHNlZ21lbnQ6IElTZWdtZW50RGVmaW5pdGlvblxuICAgIGRhdGVSYW5nZT86IElEYXRlUmFuZ2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3dEZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdO1xuICAgIG9yaWdpbnM6IHN0cmluZ1tdLFxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xuICAgIHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvLyBUT0RPIDogdmVyaWZ5IHVuaXF1ZW5lc3MgKGRhc2hib2FyZCAmIHNlcnZlcilcbiAgICBuYW1lOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIElCcmFuY2hhYmxlIHtcbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3cgZXh0ZW5kcyBPbWl0PElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4sIElCcmFuY2hhYmxlIHtcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdD86IFNoYWRvd1Jvb3QpIHtcblxuICAgIH1cblxuICAgIGdldFJvb3REaXYgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yKCdkaXYnKVxuICAgIH1cblxuICAgIGdldFJvb3QgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BBdHRyaWJ1dGVzID0ge1xuICAgIGlkOiAnbXlvcC1pZCdcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBJRWxlbWVudFJlZiwgTXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcbiAgICAgICAgLy9jb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAqYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBJRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgLy9sZXQgY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIH0gLy9lbHNlIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWNvdW50ZXJzW2l0ZW0udGFnTmFtZV0pIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IDA7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSBjb3VudGVyc1tpdGVtLnRhZ05hbWVdICsgMTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgbXlvcFJlZnMucHVzaChuZXcgWFBhdGhFbGVtZW50UmVmKGAke2l0ZW0udGFnTmFtZX0oJHtjb3VudGVyc1tpdGVtLnRhZ05hbWVdfSlgLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHtSZWZ9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke3JlZi5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpcnN0RWxlbWVudEJ5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0RWxlbWVudHNCeVJlZihyZWYsIGVsKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVtKDApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKCksIGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsZWFuVXBUYXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goY2xlYW5VcFRhc2spO1xuICAgICAgICB9KTtcblxuICAgICAgICAvL2NsZWFuIHVwXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTXlvcE1lc3NhZ2VzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q2hhbmdlVGV4dE1lc3NhZ2U+IHtcbiAgXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG4gICAgXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENoYW5nZVRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJleHBvcnQgdHlwZSBTZXJpYWxpemFibGU8VD4gPVxuICAgIFQgZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogLy8gRXhjbHVkZSBmdW5jdGlvbnNcbiAgICAgICAgVCBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gU2VyaWFsaXphYmxlPFU+W10gOiAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICAgICAgICBUIGV4dGVuZHMgb2JqZWN0ID8ge1xuICAgICAgICAgICAgICAgIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiBLXTogU2VyaWFsaXphYmxlPFRbS10+XG4gICAgICAgICAgICB9IDogVDsgLy8gSGFuZGxlIG9iamVjdHNcblxuY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgIT09IE9iamVjdCh2YWx1ZSk7XG59XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgY29uc3QgY29udGFpbnNQcmltaXRpdmVzT25seSA9IChvYmopID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIGlmIGl0J3MgYSBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIEl0J3MgYSBwcmltaXRpdmUsIHNvIHdlIGNhbiBza2lwIGl0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZvdW5kIGEgbm9uLXByaW1pdGl2ZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7IC8vIEFsbCB2YWx1ZXMgYXJlIHByaW1pdGl2ZXMgb3IgbmVzdGVkIG9iamVjdHMgd2l0aCBwcmltaXRpdmVzXG59XG5cbi8vIGN1cnJlbnRseSBzdXBwb3J0IHJvb3QgbGV2ZWwgb25seVxuLy8ge3g6IDEsIHkgOiAnYScsIHogOiAoKT0+ey4uLn0sIGlubmVyIDogeyB4OiAxICwgeSA6ICdhJ30gfVxuLy8ge3g6IDEsIHkgOiAnYSd9XG4vL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvR2xvc3NhcnkvRmFsc3lcbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgYm9vbGVhbiB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+Pj4gfCBib29sZWFuO1xuXG5leHBvcnQgY29uc3QgbWFrZVNlcmlhbGl6YWJsZSA9IDxUPihcbiAgICBvYmo6IFQsXG4gICAgc2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0ge30sXG4gICAgaW5jbHVkZUZhbHN5S2V5czogYm9vbGVhbiA9IHRydWUsIC8vIFRPRE8gOiB1c2UgdGhhdCBhcmdcbiAgICBzZWVuOiBXZWFrTWFwPG9iamVjdCwgU2VyaWFsaXphYmxlPGFueT4+ID0gbmV3IFdlYWtNYXAoKVxuKTogU2VyaWFsaXphYmxlPFQ+ID0+IHtcblxuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiBvYmogYXMgU2VyaWFsaXphYmxlPFQ+OyAvLyBEaXJlY3RseSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlc1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBhcnJheSBzZXJpYWxpemF0aW9uXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZUFycmF5OiBTZXJpYWxpemFibGU8YW55PltdID0gW107XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlQXJyYXkpOyAvLyBTdG9yZSB0aGUgYXJyYXkgaW4gc2VlblxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvYmoubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gb2JqW2luZGV4XTtcbiAgICAgICAgICAgIHNlcmlhbGl6YWJsZUFycmF5W2luZGV4XSA9IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudCwgc2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVBcnJheSBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBDaGVjayBmb3IgY3ljbGljIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVPYmplY3Q6IFBhcnRpYWw8U2VyaWFsaXphYmxlPFQ+PiA9IHt9O1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZU9iamVjdCk7IC8vIFN0b3JlIHRoZSBvYmplY3QgaW4gc2VlblxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBpbiB0aGUgc2tlbGV0b24gYW5kIGlmIGl0J3MgYSB2YWxpZCBrZXkgdG8gc2VyaWFsaXplXG5cbiAgICAgICAgICAgIGNvbnN0IGtleUluU2tlbGV0b24gPSB0eXBlb2Ygc2tlbGV0b24gPT0gXCJib29sZWFuXCIgPyBza2VsZXRvbiA6IHNrZWxldG9uW2tleV07XG5cbiAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyB0byBzZXJpYWxpemUgdGhpcyBrZXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVGYWxzeUtleXMgPyBvYmpba2V5XSAhPT0gdW5kZWZpbmVkIDogb2JqW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwgdHJ1ZSwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXlJblNrZWxldG9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIG5lc3RlZCBrZXlzIHRvIHNlcmlhbGl6ZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwga2V5SW5Ta2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVPYmplY3QgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB7fSBhcyBhbnk7IC8vIFJldHVybiBhbiBlbXB0eSBvYmplY3QgZm9yIG90aGVyIGNhc2VzXG59XG4iLCAiaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCByZXBsaWVyOiAoZGF0YTogYW55KSA9PiB2b2lkLCByb290UmVmOiBSb290UmVmKSA9PiB7XG4gICAgY29uc3QgX19zY3JpcHRJbnB1dHMgPSBldmVudC5zY3JpcHRJbnB1dHMgPyBldmVudC5zY3JpcHRJbnB1dHMgOiB7fVxuICAgIF9fc2NyaXB0SW5wdXRzLm1ha2VTZXJpYWxpemFibGUgPSBtYWtlU2VyaWFsaXphYmxlO1xuXG4gICAgX19zY3JpcHRJbnB1dHMuc2VuZCA9IHJlcGxpZXI7XG4gICAgX19zY3JpcHRJbnB1dHMucm9vdFJlZiA9IHJvb3RSZWY7XG4gICAgX19zY3JpcHRJbnB1dHMuX19zY3JpcHRJbnB1dHMgPSBfX3NjcmlwdElucHV0cztcblxuICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke2V2ZW50LnNjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICBjb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgLy8gY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gRnVuY3Rpb24oJ3NlbmQnLCAncm9vdFJlZicsJ19fc2NyaXB0SW5wdXRzJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBldmVudC5jb250ZW50ID8gZXZlbnQuY29udGVudCA6ICcnKVxuICAgIC8vY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKHJlcGxpZXIsIHJvb3RSZWYsIF9fc2NyaXB0SW5wdXRzLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSk7XG4gICAgcmVwbGllcihyZXQpO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlciwgUm9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgbmV3IFJvb3RSZWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVyTWVzc2FnZSwgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxBZGRFdmVudExpc3RlbmVyTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChtZXNzYWdlOiBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihtZXNzYWdlLnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdCByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG1ha2VTZXJpYWxpemFibGUoZSwgbWVzc2FnZS5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIobWVzc2FnZS50eXBlLCBoYW5kbGVyKVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHtcbiAgICAgICAgICAgICAgICB0YXNrKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRBdHRyaWJ1dGVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5LCBNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBEaXNwb3NlTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCwgTWVzc2FnZURpcmVjdGlvbixcbiAgICBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNESywgbG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkgb2JzZXJ2ZUF1dG9TaXplIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVSZXN1bHQge1xuICAgIC8qKiBDdXJyZW50IHdpZHRoIChmcm9tIGNvbnRlbnQpICovXG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICAvKiogQ3VycmVudCBoZWlnaHQgKGZyb20gY29udGVudCkgKi9cbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICAvKiogV2hldGhlciB3aWR0aCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ1dpZHRoOiBib29sZWFuO1xuICAgIC8qKiBXaGV0aGVyIGhlaWdodCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ0hlaWdodDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBvYnNlcnZlQXV0b1NpemUgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVPcHRpb25zIHtcbiAgICAvKiogQ2FsbGJhY2sgY2FsbGVkIHdpdGggc2l6ZSBpbmZvIHdoZW5ldmVyIHNpemUgY2hhbmdlcyAqL1xuICAgIG9uU2l6ZUNoYW5nZT86IChyZXN1bHQ6IEF1dG9TaXplUmVzdWx0KSA9PiB2b2lkO1xuICAgIC8qKiBNaW5pbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtaW5XaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSB3aWR0aCBjb25zdHJhaW50ICovXG4gICAgbWF4V2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1pbmltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtaW5IZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1heGltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtYXhIZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIEV4cGxpY2l0IHdpZHRoIHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIHdpZHRoICovXG4gICAgZXhwbGljaXRXaWR0aD86IHN0cmluZyB8IG51bWJlcjtcbiAgICAvKiogRXhwbGljaXQgaGVpZ2h0IHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIGhlaWdodCAqL1xuICAgIGV4cGxpY2l0SGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBGb3JjZSBhdXRvLXNpemUgZXZlbiBpZiBjb250YWluZXIgaGFzIGRpbWVuc2lvbnMgKi9cbiAgICBmb3JjZUF1dG9TaXplPzogYm9vbGVhbjtcbiAgICAvKiogTWluIGhlaWdodCB1c2VkIGJ5IGxvYWRlciB0byBkZXRlY3QgY29sbGFwc2UgKGRlZmF1bHQ6IDUwKSAqL1xuICAgIGxvYWRlck1pbkhlaWdodD86IG51bWJlcjtcbn1cblxuLy9UT0RPIDogY2hhbmdlIElNeW9wQ29tcG9uZW50IHRvIHJlZiBzcGVjaWZpYyBpbXBsXG50eXBlIFJlZlR5cGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IElNeW9wQ29tcG9uZW50IHwgUmVmXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgPSBhbnk+IHtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbjtcblxuICAgIG1hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuO1xuXG4gICAgc2V0SW5pdGlhdGVkOiAoKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gICAgLy9yZWYgY29tcG9uZW50cyBjYW4gYmUgZWxlbWVudC1sZXNzXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBzZW5kOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IENsZWFudXBIYW5kbGVyXG5cbiAgICBiaW5kKG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBiaW5kPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgLy8gYm9vbGVhbiByZXR1cm5lZCB2YWx1ZSA9IGhhbmRsZWQgb3Igbm90XG4gICAgb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gYm9vbGVhblxuXG4gICAgaW5pdGlhdGVkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBkaXNwb3NlOiAoKSA9PiB2b2lkXG5cbiAgICBoaWRlKCk6IHZvaWQ7XG5cbiAgICBzaG93KCk6IHZvaWQ7XG5cbiAgICBpbnNwZWN0KCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgaWZyYW1lIGNvbnRlbnQgc2l6ZSBhbmQgYXV0b21hdGljYWxseSBzeW5jcyBpdCB0byB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICogT25seSBhdmFpbGFibGUgZm9yIGlmcmFtZS1iYXNlZCBjb21wb25lbnRzLiBVc2VzIGRpcmVjdCBjb250ZW50RG9jdW1lbnQgYWNjZXNzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBzaXplIGNoYW5nZSBjYWxsYmFjayBhbmQgbWluL21heCBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmdcbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemU/OiAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucykgPT4gQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZWQgbXlvcDpzaXplIG1ldGEgdGFnIGZyb20gdGhlIGNvbXBvbmVudCBIVE1MLlxuICAgICAqIFNldCBieSBIVE1MQ29tcG9uZW50TG9hZGVyIGJlZm9yZSBpZnJhbWUgY3JlYXRpb24uXG4gICAgICogVXNlZCBieSB0aGUgUmVhY3QgaG9zdCB0byBkZXRlcm1pbmUgc2l6aW5nIG1vZGUgKGZpbGwgdnMgY29udGVudCkuXG4gICAgICovXG4gICAgc2l6ZU1ldGE/OiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGw7XG5cbiAgICBwYXJlbnQ/OiBJTXlvcENvbXBvbmVudDtcblxuICAgIHByb3BzOiBQXG5cbiAgICByZWZzOiBSXG59XG5cbmZ1bmN0aW9uIGlzSW5oZXJpdEZyb20ob2JqOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gYmFzZUNsYXNzLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luaGVyaXRGcm9tKHByb3RvLCBiYXNlQ2xhc3MpO1xufVxuXG4vLyBUT0RPIDogbW92ZSA6IFxudHlwZSBtZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiBib29sZWFuO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiBleHRlbmRzIFJlZlR5cGVzID0gUmVmVHlwZXM+IGltcGxlbWVudHMgSU15b3BDb21wb25lbnQ8UD4ge1xuICAgIGlkOiBzdHJpbmcgPSAnJ1xuXG4gICAgbWVzc2FnZUhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBtZXNzYWdlSGFuZGxlcjxhbnk+W10+ID0ge307XG5cbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgfHwgSG9zdFNESy5JbnN0YW5jZSgpLmFzc2lnbklkKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/IG9wdGlvbnM/LnRpbWVvdXQgOiA1ICogMTAwMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQgJiYgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCAmJiAhdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGB0aW1lb3V0XyR7dGltZW91dH0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAvLyBUT0RPIDogYXV0byBpbnNwZWN0LCBjb250cm9sIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAod2luZG93Lm15b3AuaG9zdFNESy5pbnNwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2Ugc2RrLmxvZ2dlclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlzcG9zaW5nIGJlZm9yZSBpc0luaXRpYXRlZCcsIHRoaXMuaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICBjb25zdCBvbkRpc3Bvc2VIYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzWydvbkRpc3Bvc2UnXVxuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBjb25zdCBFcnJvcnMgPSB7XG4gICAgbm90U2VyaWFsaXphYmxlUmVmQ2FsbDogKHByb3AsIGFyZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuVGhlIGlucHV0IHByb3ZpZGVkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGlzIG5vdCBzZXJpYWxpemFibGUuIFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgY2FuIGJlIHNhZmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgc2tpbiBpbXBsZW1lbnRhdGlvbi4gXG5UaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQgbm9uLXNlcmlhbGl6YWJsZSBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZDpcblxuLSBGdW5jdGlvbnNcbi0gRE9NIGVsZW1lbnRzXG4tIENsYXNzIGluc3RhbmNlc1xuLSBDaXJjdWxhciByZWZlcmVuY2VzXG4tIFN5bWJvbHNcbi0gQmlnSW50IHZhbHVlc1xuXG5JbiB0aGUgZm9sbG93aW5nIGV4ZWN1dGlvbiB3ZSBkZXRlY3RlZCA6XG5+fn5+fn5+flxuJHthcmd9IFxufn5+fn5+fn5cbmFzIG5vdCBzZXJpYWxpemFibGUuXG5cblRvIHJlc29sdmUgdGhpcyBpc3N1ZSwgcGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBpbnB1dHMgcGFzc2VkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGFyZSBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtYXQuXG5UaGlzIHR5cGljYWxseSBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zKSwgYXJyYXlzLCBhbmQgcGxhaW4gb2JqZWN0cy4gXG5JZiB5b3UgbmVlZCB0byBpbmNsdWRlIGNvbXBsZXggZGF0YSB0eXBlcywgY29uc2lkZXIgY29udmVydGluZyB0aGVtIHRvIGEgc2VyaWFsaXphYmxlIHN0cnVjdHVyZSBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBmdW5jdGlvbi5cbk9yIHVzZSBNeW9wIG1lc3NhZ2UgdGhhdCBzdXBwb3J0IGl0OiBDdXN0b21SZWZNZXNzYWdlLCBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSBvciBFeGVjdXRlU2NyaXB0TWVzc2FnZS5cblxuU3VnZ2VzdGVkIEZpeDpcbjEuIFJlbW92ZSBvciByZXBsYWNlIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIGZyb20geW91ciBpbnB1dC5cbjIuIElmIHVzaW5nIG9iamVjdHMsIGVuc3VyZSB0aGV5IGRvIG5vdCBjb250YWluIGFueSBmdW5jdGlvbnMgb3IgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbjMuIENvbnZlcnQgYW55IGNsYXNzIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzIG9yIEpTT04tY29tcGF0aWJsZSBmb3JtYXRzLlxuNC4gVXNlIGRlZGljYXRlZCBNeW9wIG1lc3NhZ2UuXG5cbkZvciBtb3JlIGRldGFpbHMgb24gc2VyaWFsaXphdGlvbiBhbmQgTXlvcCBtZXNzYWdlIGV4YW1wbGVzLCByZWZlciB0byBodHRwczovL2RvY3MubXlvcC5kZXZcXC5cblxuYCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudCwgSU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VudmVsb3BlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9FbnZlbG9wZWRNZXNzYWdlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wUmVmQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgcGFyZW50OiBJTXlvcENvbXBvbmVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgLy9UT0RPIDogY2hlY2sgcGFyZW50Q29tcG9uZW50LmNvbnRhaW5lci4uLlxuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBwYXJlbnQuY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICAvL3RoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZChhcmd1bWVudHMuY2FsbGVlLm5hbWUpKTtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdoaWRlJykpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2hvdycpKTtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlYWwgY2xlYW51cFxuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgaW5zcGVjdCBjYWxsZWQsIGNyZWF0aW5nIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgaW5zcGVjdCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIHRoaXMuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdpbnNwZWN0JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0JykpO1xuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJykge1xuICAgICAgICAvLyAgZGVidWdnZXI7XG4gICAgICAgIC8vICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBtZXNzYWdlIHNlbmRpbmcgJywgbWVzc2FnZSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gdGhpcy5pZCB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUgbmVzdGVkIGNvbXBvbmVudFxuICAgICAgICB0aGlzLnBhcmVudC5zZW5kKG5ldyBFbnZlbG9wZWRNZXNzYWdlKHRoaXMuaWQsIG1lc3NhZ2UpKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnZGlzcG9zZScpKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5cbi8qKlxuICogQ29tcG9uZW50IHdyYXBwZXIgZm9yIE15b3AgV2ViIENvbXBvbmVudHMgdGhhdCBhcmUgZXh0cmFjdGVkIGZyb20gSFRNTFxuICogYW5kIHJ1biBkaXJlY3RseSBvbiB0aGUgaG9zdCBkb2N1bWVudCAobm90IGluIGFuIGlmcmFtZSkuXG4gKlxuICogVGhlc2UgY29tcG9uZW50cyB1c2UgdGhlIG5hdGl2ZSBXZWIgQ29tcG9uZW50cyBBUEkgKEN1c3RvbSBFbGVtZW50cyArIFNoYWRvdyBET00pXG4gKiBhbmQgY29tbXVuaWNhdGUgdmlhIGRpcmVjdCBtZXRob2QgY2FsbHMgYW5kIEN1c3RvbUV2ZW50cyBpbnN0ZWFkIG9mIHBvc3RNZXNzYWdlLlxuICovXG5leHBvcnQgY2xhc3MgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIGN0YUNsZWFudXA/OiAoKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YUhhbmRsZXI/OiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhUXVldWU6IEFycmF5PHthY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bn0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSB0YWdOYW1lOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgYXJlIGluaXRpYXRlZCBpbW1lZGlhdGVseSAobm8gcG9zdE1lc3NhZ2UgaGFuZHNoYWtlIG5lZWRlZClcbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7fTtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudCB3aXRoIGRhdGEgYnkgY2FsbGluZyBteW9wX2luaXRfaW50ZXJmYWNlIGRpcmVjdGx5XG4gICAgICovXG4gICAgaW5pdFdpdGhEYXRhKGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBkYXRhIGZyb20gdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIGdldERhdGEoKTogdW5rbm93biB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IENUQSBoYW5kbGVyIC0gdW5pZmllZCBBUEkgd2l0aCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgKiBDYWxsZWQgdmlhIHByb3BzLm15b3BfY3RhX2hhbmRsZXIgPSBoYW5kbGVyXG4gICAgICovXG4gICAgc2V0Q3RhSGFuZGxlcihoYW5kbGVyOiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgcHJldmlvdXMgbGlzdGVuZXIgaWYgZXhpc3RzXG4gICAgICAgIGlmICh0aGlzLmN0YUNsZWFudXApIHtcbiAgICAgICAgICAgIHRoaXMuY3RhQ2xlYW51cCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3RhSGFuZGxlciA9IGhhbmRsZXI7XG5cbiAgICAgICAgLy8gRmx1c2ggYW55IHF1ZXVlZCBDVEFzIHRoYXQgZmlyZWQgYmVmb3JlIGhhbmRsZXIgd2FzIHNldFxuICAgICAgICBpZiAodGhpcy5fY3RhUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcXVldWUgPSBbLi4udGhpcy5fY3RhUXVldWVdO1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUgPSBbXTtcbiAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdXAgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgICAgICAgIGlmIChjdXN0b21FdmVudC5kZXRhaWw/LmFjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N0YUhhbmRsZXIoY3VzdG9tRXZlbnQuZGV0YWlsLmFjdGlvbiwgY3VzdG9tRXZlbnQuZGV0YWlsLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2N0YUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUXVldWUgaWYgaGFuZGxlciBub3QgeWV0IHNldCAoc2hvdWxkbid0IGhhcHBlbiBhZnRlciBzZXRDdGFIYW5kbGVyLCBidXQgc2FmZXR5KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogY3VzdG9tRXZlbnQuZGV0YWlsLmFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGN1c3RvbUV2ZW50LmRldGFpbC5wYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbXlvcC1jdGEnLCBsaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuY3RhQ2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdteW9wLWN0YScsIGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1lc3NhZ2UtYmFzZWQgY29tcG9uZW50cy5cbiAgICAgKiBXZWIgY29tcG9uZW50cyBkb24ndCB1c2UgcG9zdE1lc3NhZ2UsIHNvIHRoaXMgaXMgYSBuby1vcCBmb3IgbW9zdCBtZXNzYWdlcy5cbiAgICAgKi9cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIC8vIFdlYiBjb21wb25lbnRzIGRvbid0IHVzZSB0aGUgcG9zdE1lc3NhZ2Ugc3lzdGVtXG4gICAgICAgIC8vIEluc3RlYWQsIGludGVyYWN0IGRpcmVjdGx5IHZpYSBwcm9wcy5teW9wX2luaXRfaW50ZXJmYWNlIGFuZCBwcm9wcy5teW9wX2N0YV9oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyBMb2cgZm9yIGRlYnVnZ2luZ1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudF0gc2VuZCgpIGNhbGxlZCAtIHdlYiBjb21wb25lbnRzIHVzZSBkaXJlY3QgQVBJIGluc3RlYWQnLCBtZXNzYWdlKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY3RhQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5jdGFDbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiLy90eXBlIEFDb25zdHJ1Y3RvclR5cGVPZjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEN1c3RvbVJlZk1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBtZXNzYWdlcyBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQ2xlYW51cEhhbmRsZXIsIElDb21wb25lbnRDb25maWcsXG4gICAgdHlwZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50UmVmQmVoYXZpb3IsIElIVE1MTG9hZGVyQ29uZmlnLCBJUHJvcENvZGVCZWhhdmlvcixcbiAgICBJUHJvcENvbmZpZywgSVNraW5Db25maWcsIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIFJlZkJlaGF2aW9yVHlwZSwgU2hhZG93Um9vdE1vZGVUeXBlLCBTa2luTG9hZGVycywgU2tpbkxvYWRlclR5cGVcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtjb250YWluc1ByaW1pdGl2ZXNPbmx5fSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7RXJyb3JzfSBmcm9tIFwiLi9sb2dNZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuL2hvc3RTREtcIjtcblxudHlwZSBjb21wb25lbnREZWZpbml0aW9uUHJvcHMgPSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1sncHJvcHMnXVxuXG5jb25zdCBjcmVhdGVEZWJ1Z1RpdGxlID0gKHRleHQ6IHN0cmluZywgdG9wOiBudW1iZXIsIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB0aXRsZUVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aXRsZUVsLnN0eWxlLnBhZGRpbmcgPSAnMCA1cHgnO1xuICAgIHRpdGxlRWwuc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XG4gICAgdGl0bGVFbC5zdHlsZVsndG9wJ10gPSAnMCc7XG4gICAgdGl0bGVFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIC8vdGl0bGVFbC5zdHlsZS5sZWZ0ID0gJzUwJSc7XG4gICAgdGl0bGVFbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgdGl0bGVFbC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICB0aXRsZUVsLmhyZWYgPSBgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudERlZmluaXRpb25Db25maWcuaWR9YFxuXG4gICAgcmV0dXJuIHRpdGxlRWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVidWdTdHlsZSA9IChpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgIC8vIzAwN0JGRiAoYmx1ZSkgb3IgI0ZGNTcyMiAob3JhbmdlKVxuICAgIC8vIzRDQUY1MCAoZ3JlZW4pIG9yICNGRkMxMDcgKGFtYmVyKVxuICAgIC8vIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2lkfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2NvbXBvbmVudERlZmluaXRpb25Db25maWcubmFtZX0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvcFRleHQsIGNvbXBvbmVudEVsZW1lbnQpO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDA3QkZGJztcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAndW5zZXQnO1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9wVGV4dCk7XG4gICAgfVxufVxuXG5jb25zdCByZXBvcnRFcnJvciA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBpZiAoIXByb3BDb25maWcpIHtcblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yOiBVbmRlZmluZWQgUHJvcFxcblxcbmAgK1xuICAgICAgICAgICAgYEl0IGxvb2tzIGxpa2UgeW91J3ZlIHRyaWVkIHRvIHVzZSBhIHByb3AgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgcHJvcCBuYW1lIGZvciBhbnkgdHlwb3Mgb3IgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVmaW5lZCBpbiB0aGUgY29tcG9uZW50J3MgcHJvcCBsaXN0LlxcblxcbmAgK1xuICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgcmVwb3J0VW5zdXBwb3J0ZWQgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yOiBDb2RlIFByb3AgTm90IFN1cHBvcnRlZFxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudGx5LCBjb2RlIHByb3BzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsb2NhbCBmcmFtZSBjb21wb25lbnRzLlxcbmAgK1xuICAgICAgICBgXHUyNkEwXHVGRTBGIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGZlYXR1cmUgXHUyMDE0IGNvZGUgcHJvcHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnMuXFxuXFxuYCArXG4gICAgICAgIGBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gdXNlIG1lc3NhZ2UgcHJvcHMuXFxuXFxuYCArXG4gICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RQcm9wcyA9IDxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBwcm9wc0NvbmZpZzogSVByb3BDb25maWdbXSwgc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuXG4gICAgY29uc3QgcHJvcHNNYXAgPSBwcm9wc0NvbmZpZy5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICAgIFtjdXJyZW50VmFsdWUubmFtZV06IHsuLi5jdXJyZW50VmFsdWV9XG4gICAgICAgIH1cbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCBwcm9wc0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgZ2V0cy9zZXRzIGRhdGEgKG1hdGNoZXMgaWZyYW1lIGJlaGF2aW9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG15b3BfY3RhX2hhbmRsZXIsIHJldHVybiB1bmRlZmluZWQgKGl0J3Mgd3JpdGUtb25seSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgaWZyYW1lIChsb2NhbEZyYW1lKSBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuZWxlbWVudC5jb250ZW50V2luZG93W3R5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3BdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ291dHB1dCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgRklSU1QgKGJlZm9yZSBsb2NhbEZyYW1lIGNoZWNrKVxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIG1heSBoYXZlIHNoYWRvd1Jvb3RNb2RlOiBsb2NhbEZyYW1lIGluIHRoZWlyIGNvbmZpZ1xuICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGV5IHJ1biBkaXJlY3RseSBvbiB0aGUgaG9zdCBkb2N1bWVudCwgbm90IGluIGFuIGlmcmFtZVxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0Q3RhSGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGlmcmFtZSAobG9jYWxGcmFtZSkgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gKGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50KS5jb250ZW50V2luZG93IGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSByZWFsIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaW5kb3dbcHJvcE5hbWVdID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIENUQSBxdWV1ZSBpZiB0aGlzIGlzIG15b3BfY3RhX2hhbmRsZXIgYW5kIHF1ZXVlIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicgJiYgY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVldWUgPSBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlID0gbnVsbDsgLy8gQ2xlYXIgdG8gcHJldmVudCBkb3VibGUtZmx1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKChpdGVtOiB7YWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IGFueX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBjb21wb25lbnQgd2FzIGRpc3Bvc2VkIGR1cmluZyBmbHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYocHJvcENvbmZpZy5iZWhhdmlvciA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMubWVzc2FnZSlcbiAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgbXVsdGkgYmVoYXZpb3JzXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3I6IFVuc3VwcG9ydGVkIEJlaGF2aW9yXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSAnYmVoYXZpb3InIGZpZWxkIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCZWhhdmlvciBGaWVsZDogJHtwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGV9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB2YWxpZCBiZWhhdmlvciBvcHRpb25zLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnQucHJvcHMgPSB7fTtcbiAgICBjb21wb25lbnQucHJvcHMgPSBuZXcgUHJveHkoY29tcG9uZW50LnByb3BzLCBwcm9wc0hhbmRsZXIpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyAoT21pdDxJTXlvcENvbXBvbmVudCwgJ3Byb3BzJz4gJiB7XG4gICAgICAgIHByb3BzOiBwcm9wVHlwZXM8VD5cbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmUHJveHkgPSAodGFyZ2V0OiBSZWYsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG5cbiAgICAgICAgICAgIC8vIGlmIChwcm9wID09PSAnX19ub25Qcm94aWVkJykge1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0YXJnZXRbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZ2V0dGVyRnVuY3Rpb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmZvckVhY2goYXJnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seShhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLm5vdFNlcmlhbGl6YWJsZVJlZkNhbGwocHJvcCwgYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgZnVuY3Rpb25BcmdzLCBtYWtlU2VyaWFsaXphYmxlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZltwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHJlZltwcm9wTmFtZV0oLi4uZnVuY3Rpb25BcmdzKSwgdHJ1ZSkgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIGl0cyByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHZhbHVlLCB0cnVlKTsgLy8gUmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IHRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3M6IGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtc2cuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vVE9ETzogd2UgY2FuIGltcGxlbWVudCB0aGluZ3MgbGlrZSBhdXRvIHNlcmlhbGl6YXRpb24gYW5kIGJpbmRpbmcgZnVuY3Rpb25zIGhlcmVcbiAgICAgICAgICAgIC8vZ2V0dGVyRnVuY3Rpb24udGVzdCA9ICcxMjMnO1xuXG4gICAgICAgICAgICByZXR1cm4gZ2V0dGVyRnVuY3Rpb247XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3A6IHN0cmluZywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgcHJvcFZhbHVlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogZml4IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2c/XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZkNvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4ocmVmOiBSZWYsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBjb25zdCBjb21wb25lbnQgPSByZWYuY29tcG9uZW50O1xuICAgIGlmICghY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbnQgY3JlYXRlUmVmQ29tcG9uZW50IHdpdGggZGV0YWNoZWQgcmVmJyk7XG5cbiAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJywgcmVmLCBjb21wb25lbnRDb25maWcpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLnR5cGUsIGNvbXBvbmVudCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaChyZWZDb21wb25lbnQpO1xuXG4gICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHJlZiBjb21wb25lbnRzIGRlZmluZSBpbiB0aGUgY29tcG9uZW50IGNvbmZpZ1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByb290IGNvbXBvbmVudCB0aGUgYmUgaW5pdGlhdGVkIGJlZm9yZSBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuXG4gICAgICAgIC8vVE9ETyA6XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vcmVqZWN0KCd0aW1lb3V0PycpO1xuICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgIH0sIDUwMDApO1xuXG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKHJlZi5yZWZDb25maWcsXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyA/IG9wdGlvbnMgOiB7fSxcbiAgICAgICAgICAgICAgICBpZDogcmVmQ29tcG9uZW50LmlkLFxuICAgICAgICAgICAgICAgIF9oYXNQYXJlbnQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyAobWVzc2FnZSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGltZW91dCBhbHJlYWR5IHBhc3NlZFxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOlxuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT0gcmVmQ29tcG9uZW50LmlkKTtcblxuICAgICAgICAgICAgICAgIC8vc2FtZSBtZW1vcnkgZW52LCBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21wb25lbnQgIT09IHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBjbGVhbiByZWZDb21wb25lbnQgP1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaGVyZSA+XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogd2hhdCBhYm91dCByZWFwdGVycyA/ISBkeW5hbWljID8hXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZXhzaXN0aW5nUmVmQ29tcG9uZW50ID0gY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSBhcyBNeW9wUmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vIGlmIChleHNpc3RpbmdSZWZDb21wb25lbnQuaWQgJiYgZXhzaXN0aW5nUmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gW2NvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0sIHJlZkNvbXBvbmVudF07XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0ucHVzaChyZWZDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7IC8vaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSByZWZDb21wb25lbnQuaWQpITtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBpbiB3ZWJjb21wb25lbnQgY2FzZSB0aGUgc2FtZSBpZCB3aWxsIGFscmVkYXkgYmUgaGVyZSwgd2hpY2ggaXMgZ29vZCAhXG4gICAgICAgICAgICAgICAgLy8gbmFtZTpcbiAgICAgICAgICAgICAgICAvLyAgICAgaWRcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkXG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgaW5uZXIgY29tcG9uZW50cyBpbnNpZGUgcmVmIGNvbXBvbmVudCA6XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5uZXN0ZWRSZWZzLmZvckVhY2gobmVzdGVkUmVmQ29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHMhLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpIS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zPy5maW5kKGRlZiA9PiBkZWYuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpITtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVmQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLnR5cGUucmVmcy5maW5kKHIgPT4gci5uYW1lID09PSBuZXN0ZWRSZWZDb25maWcucmVmTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlZkNvbmZpZyBmb3VuZCBmb3IgbmVzdGVkIHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uLCByZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDb21wb25lbnQuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5yZWZzW25lc3RlZFJlZkNvbmZpZy5yZWZOYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKG5lc3RlZENvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKHJlZkNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOnVzZSBjb25maWcgY2hlY2sgZm9yIGF1dG8taGlnaHQgYW5kIGNvbnZlcnQgdHlwZSBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWZDb21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UmVmcyA9IGFzeW5jIChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIHdpdGhvdXRSZWZDb21wb25lbnRzOiBib29sZWFuID0gZmFsc2UpID0+IHtcblxuICAgIGlmICghY29tcG9uZW50LnJlZnMpXG4gICAgICAgIGNvbXBvbmVudC5yZWZzID0ge307XG5cbiAgICBjb25zdCB3YWl0Rm9yID0gT2JqZWN0LnZhbHVlcyhjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZWZzKS5tYXAocmVmID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWYuYmVoYXZpb3IudHlwZSA9PSBSZWZCZWhhdmlvclR5cGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID1cblxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0UmVmQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hhbmdlIHRvIGdldCBpdCBmcm9tIHRoZSBmbG93XG4gICAgICAgICAgICAgICAgbGV0IHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmNvbXBvbmVudElkO1xuICAgICAgICAgICAgICAgIGlmICghcmVmQ29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmluc3RhbmNlLmNvbXBvbmVudElkXG5cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy90aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMhLmZpbmQoY29tcGRlZiA9PiBjb21wZGVmLmlkID09PSByZWZDb21wb25lbnRJZCkhO1xuICAgICAgICAgICAgICAgIC8vIC8vY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGF3YWl0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcoY29tcG9uZW50SW5zdGFuY2VDb25maWcuY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGlmIHdlIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlIHdlIHdpbGwgbmVlZCBpbnN0YW5jZSBpZCBoZXJlIC4uLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/LmZpbmQobmVzdGVkQ29tcG9uZW50ID0+IG5lc3RlZENvbXBvbmVudC50eXBlLmlkID09PSByZWZDb21wb25lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZENvbXBvbmVudENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IG5lc3RlZENvbXBvbmVudENvbmZpZyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jb25zdCBjb21wb25lbnRJbnN0YW5jZUNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5uZXN0ZWRDb21wb25lbnRzPy5maW5kKGNvbXBvbmVudEluc3RhY2UgPT4gY29tcG9uZW50SW5zdGFjZS5jb21wb25lbnRJZCA9PT0gY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpe1xuICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8gVE9ETyBUT0RPICcpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDp0aGluayBhYm91dCB0aGF0IDpcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWcucmVzb2x2ZWREZWZpbml0aW9ucyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM7XG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgaW5zdGFuY2U6IG5lc3RlZENvbXBvbmVudENvbmZpZy5pbnN0YW5jZSEsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgbmFtZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLm5hbWVcbiAgICAgICAgICAgICAgICAvLyAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IF9yZWYgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCduZXN0ZWQgISEgY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQoX3JlZiwgbmVzdGVkQ29tcG9uZW50Q29uZmlnISwgY29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgICAgLy9URE9PIDogcHV0IHRoYXQgcmVmIGNvbXBvbmVudCBzb21ld2hlcmU/XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vblByb3hpZWQgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IGNyZWF0ZVJlZlByb3h5KF9fbm9uUHJveGllZCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnPycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB0eXBlIHByb3BUeXBlczxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPiA9IHtcbiAgICBbUHJvcGVydHkgaW4ga2V5b2YgVF06XG4gICAgVFtQcm9wZXJ0eV0gZXh0ZW5kcyB7IG1vZGU6ICdpbnB1dCcgfSA/XG4gICAgICAgIFRbUHJvcGVydHldWyd0eXBlJ10gOlxuICAgICAgICBQcm9taXNlPFRbUHJvcGVydHldWyd0eXBlJ10+XG59XG5cbmV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG5cbmV4cG9ydCBjb25zdCBhY3RBcyA9IDxUPihyZWY6IFJlZikgPT4ge1xuICAgIHJldHVybiByZWYgYXMgdW5rbm93biBhcyBGdW5jdGlvbmlmeVJlZjxUPlxufVxuXG5leHBvcnQgdHlwZSBGdW5jdGlvbmlmeVJlZjxUID0gYW55PiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIC8vIElmIGl0J3MgYSBmdW5jdGlvblxuICAgICAgICA/ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFI+IC8vIENvbnZlcnQgaXQgdG8gYSBwcm9taXNlZCBmdW5jdGlvblxuICAgICAgICA6IFRbS11cbn07XG4iLCAiaW1wb3J0IHtBdXRvU2l6ZU9wdGlvbnMsIEJhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTWVzc2FnZURpcmVjdGlvblxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzLnRzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgcHJpdmF0ZSBfYXV0b1NpemVDbGVhbnVwPzogQ2xlYW51cEhhbmRsZXI7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemVPcHRpb25zPzogQXV0b1NpemVPcHRpb25zO1xuICAgIHByaXZhdGUgX2F1dG9TaXplVXBkYXRlPzogKCkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnRDb25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudENvbmZpZywgY29udGFpbmVyLCBvcHRpb25zKVxuXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgLy8gdGhpcy5JZnJhbWVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QpXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgSWZyYW1lRWxlbWVudCBlcnJvcmApO1xuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBzaXplTWV0YT86IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbDtcblxuICAgIGNsZWFudXBJbnNwZWN0PzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvLyBUT0RPIDogdXNlIGJldHRlciBjaGVjayBmb3IgaW5zcGVjdCBtb2RlXG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdpbnNwZWN0IGNhbGwgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BJZnJhbWVDb21wb25lbnQnLCAxMCwgdGhpcy5jb250YWluZXIsIHRoaXMuSWZyYW1lRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QhKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9ic2VydmVTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7c2VuZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBzZW5kKHtoZWlnaHQsIHdpZHRofSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MgKHNhbWUtb3JpZ2luIG9ubHkpIGZvciBhY2N1cmF0ZSBtZWFzdXJlbWVudHMuXG4gICAgICpcbiAgICAgKiBSZWVudHJhbnQ6IHdoZW4gY2FsbGVkIGFnYWluIHdoaWxlIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCB1cGRhdGVzIG9wdGlvbnMgYW5kXG4gICAgICogcmUtZXZhbHVhdGVzIHNpemluZyB3aXRob3V0IHJlY3JlYXRpbmcgb2JzZXJ2ZXJzLiBDbGVhbnVwICsgcmUtY2FsbCAoZS5nLiBSZWFjdFxuICAgICAqIHJlLXJlbmRlcikgY3JlYXRlcyBmcmVzaCBvYnNlcnZlcnMgc2luY2UgY2xlYW51cCBjbGVhcnMgdGhlIGV4aXN0aW5nIG9uZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplID0gKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIC8vIFN0b3JlIG9wdGlvbnMgc28gdXBkYXRlU2l6ZSBhbHdheXMgcmVhZHMgdGhlIGxhdGVzdFxuICAgICAgICB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIC8vIElmIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCByZS1ldmFsdWF0ZSB3aXRoIG5ldyBvcHRpb25zIGFuZCByZXVzZSB0aGVtXG4gICAgICAgIGlmICh0aGlzLl9hdXRvU2l6ZUNsZWFudXAgJiYgdGhpcy5fYXV0b1NpemVVcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXV0b1NpemVDbGVhbnVwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICBjb25zdCBkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tNeW9wSWZyYW1lQ29tcG9uZW50XSBDYW5ub3Qgb2JzZXJ2ZSBhdXRvIHNpemU6IGNvbnRlbnREb2N1bWVudCBub3QgYWNjZXNzaWJsZScpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhbXAgPSAodmFsdWU6IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgbWluKSByZXR1cm4gbWluO1xuICAgICAgICAgICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlID4gbWF4KSByZXR1cm4gbWF4O1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFBhcnNlIENTUyBzaXplIHZhbHVlcyB0byBudW1iZXJzXG4gICAgICAgIGNvbnN0IHBhcnNlU2l6ZSA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4ocGFyc2VkKSA/IHVuZGVmaW5lZCA6IHBhcnNlZDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB1cGRhdGVTaXplID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnREb2MpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuX2F1dG9TaXplT3B0aW9ucztcblxuICAgICAgICAgICAgY29uc3QgbWluV2lkdGggPSBwYXJzZVNpemUob3B0cz8ubWluV2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbWF4V2lkdGggPSBwYXJzZVNpemUob3B0cz8ubWF4V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gcGFyc2VTaXplKG9wdHM/Lm1pbkhlaWdodCk7XG4gICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSBwYXJzZVNpemUob3B0cz8ubWF4SGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlck1pbkhlaWdodCA9IG9wdHM/LmxvYWRlck1pbkhlaWdodCA/PyA1MDtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSBleHBsaWNpdCBkaW1lbnNpb25zOiBob3N0IG9wdGlvbnMgXHUyMTkyIHNpemVNZXRhIGZpbGwgbW9kZSBcdTIxOTIgd2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCJcbiAgICAgICAgICAgIC8vIFdpZHRoIGRlZmF1bHRzIHRvIFwiMTAwJVwiIChibG9jayBlbGVtZW50IGJlaGF2aW9yKSB0byBwcmV2ZW50IHRoZSBzaHJpbmstdG8tMCBtZWFzdXJlbWVudCBidWcuXG4gICAgICAgICAgICAvLyBIZWlnaHQgaGFzIG5vIGRlZmF1bHQgc28gaXQgYXV0by1zaXplcyB0byBjb250ZW50LlxuICAgICAgICAgICAgLy8gT25seSBzaXplTWV0YSBcIjEwMCVcIiAoZmlsbCBtb2RlKSBpcyB0cmVhdGVkIGFzIGV4cGxpY2l0IGFuZCBkaXNhYmxlcyBhdXRvLXNpemluZy5cbiAgICAgICAgICAgIC8vIFBpeGVsIHNpemVNZXRhIHZhbHVlcyAoZS5nLiwgaGVpZ2h0OiAyMDApIGFyZSBpbml0aWFsIGhpbnRzLCBOT1QgZXhwbGljaXQgY29uc3RyYWludHMuXG4gICAgICAgICAgICBjb25zdCBzaXplTWV0YUZpbGxXaWR0aCA9IHRoaXMuc2l6ZU1ldGE/LndpZHRoID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGFGaWxsSGVpZ2h0ID0gdGhpcy5zaXplTWV0YT8uaGVpZ2h0ID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID0gb3B0cz8uZXhwbGljaXRXaWR0aCA/PyBzaXplTWV0YUZpbGxXaWR0aCA/PyBcIjEwMCVcIjtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPSBvcHRzPy5leHBsaWNpdEhlaWdodCA/PyBzaXplTWV0YUZpbGxIZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFdpZHRoID0gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdEhlaWdodCA9IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgLy8gRGV0ZWN0IGNvbGxhcHNlZCBkaW1lbnNpb25zIGZyb20gY29udGFpbmVyICh0aGlzLmNvbnRhaW5lcilcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZFdpZHRoID0gY29udGFpbmVyUmVjdC53aWR0aCA9PT0gMDtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIGNvbGxhcHNlZCBpZiBoZWlnaHQgaXMgMCBPUiBlcXVhbHMgdGhlIGxvYWRlciBtaW5IZWlnaHRcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZEhlaWdodCA9IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSAwIHx8IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSBsb2FkZXJNaW5IZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSB3aGljaCBkaW1lbnNpb25zIHRvIGF1dG8tc2l6ZTpcbiAgICAgICAgICAgIC8vIC0gSWYgZm9yY2VBdXRvU2l6ZSBpcyB0cnVlLCBhdXRvLXNpemUgdW5sZXNzIGV4cGxpY2l0IGRpbWVuc2lvbiBpcyBzZXRcbiAgICAgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBhdXRvLXNpemUgb25seSBpZiBjb2xsYXBzZWRcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEF1dG9XaWR0aCA9IG9wdHM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgICAgICA/ICFoYXNFeHBsaWNpdFdpZHRoXG4gICAgICAgICAgICAgICAgOiAoY29sbGFwc2VkV2lkdGggJiYgIWhhc0V4cGxpY2l0V2lkdGgpO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQXV0b0hlaWdodCA9IG9wdHM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgICAgICA/ICFoYXNFeHBsaWNpdEhlaWdodFxuICAgICAgICAgICAgICAgIDogKGNvbGxhcHNlZEhlaWdodCAmJiAhaGFzRXhwbGljaXRIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBJZiBub3RoaW5nIG5lZWRzIGF1dG8tc2l6aW5nLCBhcHBseSBleHBsaWNpdC9wZXJjZW50YWdlIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICghc2hvdWxkQXV0b1dpZHRoICYmICFzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0V2lkdGh9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0SGVpZ2h0fXB4YCA6ICcxMDAlJztcblxuICAgICAgICAgICAgICAgIG9wdHM/Lm9uU2l6ZUNoYW5nZT8uKHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGlzYWJsZSBDU1MgdHJhbnNpdGlvbnMgb24gaWZyYW1lIGFuZCBjb250YWluZXIgZm9yIHRoZSBlbnRpcmVcbiAgICAgICAgICAgIC8vIG1lYXN1cmVtZW50ICsgaGVpZ2h0LXNldHRpbmcgY3ljbGUuIEhvc3QgYXBwcyBtYXkgc2V0IGB0cmFuc2l0aW9uOiBhbGxgXG4gICAgICAgICAgICAvLyB3aGljaCB3b3VsZCBhbmltYXRlIHRoZSAwcHggY29sbGFwc2UgYW5kIGZpbmFsIGhlaWdodCBjaGFuZ2UsIGNhdXNpbmdcbiAgICAgICAgICAgIC8vIHZpc2libGUganVtcHMgZHVyaW5nIHNjcm9sbC5cbiAgICAgICAgICAgIGNvbnN0IHByZXZUcmFuc2l0aW9uID0gaWZyYW1lLnN0eWxlLnRyYW5zaXRpb247XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgICAgIGNvbnN0IHByZXZDb250YWluZXJUcmFuc2l0aW9uID0gY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb247XG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAvLyBRdWljayBwcmUtY2hlY2s6IHJlYWQgc2Nyb2xsSGVpZ2h0L1dpZHRoIEJFRk9SRSBjb2xsYXBzaW5nIHRoZSBpZnJhbWUuXG4gICAgICAgICAgICAvLyBJZiBjb250ZW50IG9ubHkgZ3JldyAoc2Nyb2xsSGVpZ2h0ID4gaWZyYW1lIGhlaWdodCksIHdlIGNhbiBza2lwIHRoZVxuICAgICAgICAgICAgLy8gMHB4IGNvbGxhcHNlIFx1MjAxNCBzY3JvbGxIZWlnaHQgbmF0dXJhbGx5IGV4cGFuZHMgYmV5b25kIHRoZSBpZnJhbWUuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SWZyYW1lSGVpZ2h0ID0gaWZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVXaWR0aCA9IGlmcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHByZVNjcm9sbEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcbiAgICAgICAgICAgIGNvbnN0IHByZVNjcm9sbFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkpO1xuXG4gICAgICAgICAgICBsZXQgY29udGVudFdpZHRoID0gcHJlU2Nyb2xsV2lkdGg7XG4gICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHByZVNjcm9sbEhlaWdodDtcblxuICAgICAgICAgICAgY29uc3QgaGVpZ2h0R3JldyA9IHNob3VsZEF1dG9IZWlnaHQgJiYgcHJlU2Nyb2xsSGVpZ2h0ID4gY3VycmVudElmcmFtZUhlaWdodCArIDE7XG4gICAgICAgICAgICBjb25zdCB3aWR0aEdyZXcgPSBzaG91bGRBdXRvV2lkdGggJiYgcHJlU2Nyb2xsV2lkdGggPiBjdXJyZW50SWZyYW1lV2lkdGggKyAxO1xuXG4gICAgICAgICAgICAvLyBGb3Igbm9uLWdyb3cgY2FzZXMgKHNocmluayBvciBuby1jaGFuZ2UpLCB3ZSBtdXN0IGNvbGxhcHNlIHRvIDBweCB0b1xuICAgICAgICAgICAgLy8gbWVhc3VyZSB0aGUgdHJ1ZSBjb250ZW50IGhlaWdodC4gc2Nyb2xsSGVpZ2h0IGNhbiBuZXZlciBkZWNyZWFzZSBiZWxvd1xuICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSdzIGNsaWVudEhlaWdodCwgc28gc2hyaW5rIGlzIHVuZGV0ZWN0YWJsZSB3aXRob3V0IGNvbGxhcHNpbmcuXG4gICAgICAgICAgICAvLyBXaXRoIHRyYW5zaXRpb25zIGRpc2FibGVkICsgY29udGFpbmVyIG1pbi1oZWlnaHQgaGVsZCwgdGhlIGNvbGxhcHNlXG4gICAgICAgICAgICAvLyBpcyBpbnZpc2libGUgKG5vIGxheW91dCBzaGlmdCwgbm8gYW5pbWF0aW9uKS5cbiAgICAgICAgICAgIGNvbnN0IG5lZWRzSGVpZ2h0Q29sbGFwc2UgPSBzaG91bGRBdXRvSGVpZ2h0ICYmICFoZWlnaHRHcmV3O1xuICAgICAgICAgICAgY29uc3QgbmVlZHNXaWR0aENvbGxhcHNlID0gc2hvdWxkQXV0b1dpZHRoICYmICF3aWR0aEdyZXc7XG5cbiAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlIHx8IG5lZWRzV2lkdGhDb2xsYXBzZSkge1xuICAgICAgICAgICAgICAgIC8vIEhvbGQgdGhlIGNvbnRhaW5lcidzIG1pbi1oZWlnaHQvd2lkdGggZHVyaW5nIG1lYXN1cmVtZW50IHRvIHByZXZlbnRcbiAgICAgICAgICAgICAgICAvLyBsYXlvdXQgc2hpZnQgKGVsZW1lbnRzIGJlbG93IHRoZSBpZnJhbWUgd29uJ3QganVtcCkuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk1pbkhlaWdodCA9IGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk1pbldpZHRoID0gY29udGFpbmVyLnN0eWxlLm1pbldpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlKSBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gYCR7Y3VycmVudElmcmFtZUhlaWdodH1weGA7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzV2lkdGhDb2xsYXBzZSkgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gYCR7Y3VycmVudElmcmFtZVdpZHRofXB4YDtcblxuICAgICAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlKSBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzV2lkdGhDb2xsYXBzZSkgaWZyYW1lLnN0eWxlLndpZHRoID0gJzBweCc7XG5cbiAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG4gICAgICAgICAgICAgICAgY29udGVudEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcblxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBpZiBjb2xsYXBzaW5nIHRvIDBweCBnYXZlIGEgbmVhci16ZXJvIG1lYXN1cmVtZW50LCB0aGUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy8gbGlrZWx5IGhhcyBgaGVpZ2h0OiAxMDAlYCBjaGFpbnMgKGh0bWwgPiBib2R5ID4gLmFwcC1jb250YWluZXIpIHRoYXQgY2FzY2FkZWRcbiAgICAgICAgICAgICAgICAvLyB0aGUgY29sbGFwc2UgaW50byBhbGwgY2hpbGRyZW4uIFJldHJ5IHdpdGggYSBudWNsZWFyIG92ZXJyaWRlIHRoYXQgZm9yY2VzIGFsbFxuICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRvIGludHJpbnNpYyBzaXppbmcuIFRoaXMgaXMgb25seSBhIGZhbGxiYWNrIGJlY2F1c2UgdGhlIG92ZXJyaWRlXG4gICAgICAgICAgICAgICAgLy8gYnJlYWtzIGV4cGxpY2l0IHBpeGVsIGhlaWdodHMgKGUuZy4gOHB4IGluZGljYXRvciBkb3RzIFx1MjE5MiAwcHgpLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRzTnVjbGVhckhlaWdodCA9IG5lZWRzSGVpZ2h0Q29sbGFwc2UgJiYgY29udGVudEhlaWdodCA8IDI7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZHNOdWNsZWFyV2lkdGggPSBuZWVkc1dpZHRoQ29sbGFwc2UgJiYgY29udGVudFdpZHRoIDwgMjtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFySGVpZ2h0IHx8IG5lZWRzTnVjbGVhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVTdHlsZSA9IGNvbnRlbnREb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLmlkID0gJ19fbXlvcF9tZWFzdXJlJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goJ2hlaWdodDogYXV0byAhaW1wb3J0YW50JywgJ21pbi1oZWlnaHQ6IDAgIWltcG9ydGFudCcsICdtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goJ3dpZHRoOiBhdXRvICFpbXBvcnRhbnQnLCAnbWluLXdpZHRoOiAwICFpbXBvcnRhbnQnLCAnbWF4LXdpZHRoOiBub25lICFpbXBvcnRhbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUudGV4dENvbnRlbnQgPSBgKiwgKjo6YmVmb3JlLCAqOjphZnRlciB7ICR7cnVsZXMuam9pbignOyAnKX07IGZsZXgtYmFzaXM6IGF1dG8gIWltcG9ydGFudDsgZmxleC1ncm93OiAwICFpbXBvcnRhbnQ7IH1gO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RG9jLmhlYWQuYXBwZW5kQ2hpbGQobWVhc3VyZVN0eWxlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgY29udGFpbmVyIGNvbnN0cmFpbnRzIGltbWVkaWF0ZWx5IChzYW1lIGZyYW1lLCBiZWZvcmUgcGFpbnQpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodCA9IHByZXZNaW5IZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gcHJldk1pbldpZHRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNsYW1wKGNvbnRlbnRXaWR0aCwgbWluV2lkdGgsIG1heFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGNsYW1wKGNvbnRlbnRIZWlnaHQsIG1pbkhlaWdodCwgbWF4SGVpZ2h0KTtcblxuICAgICAgICAgICAgLy8gU2V0IGF1dG8tc2l6ZWQgZGltZW5zaW9ucyB0byBtZWFzdXJlZCB2YWx1ZXMsIG5vbi1hdXRvIHRvIGV4cGxpY2l0LzEwMCVcbiAgICAgICAgICAgIGlmIChzaG91bGRBdXRvV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdFdpZHRofXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0SGVpZ2h0fXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yY2UgcmVmbG93IHNvIHRoZSBmaW5hbCBkaW1lbnNpb25zIGFyZSBhcHBsaWVkIHdpdGhvdXQgdHJhbnNpdGlvbixcbiAgICAgICAgICAgIC8vIHRoZW4gcmVzdG9yZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbnMuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgICAgICAgICBpZnJhbWUub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgaWZyYW1lLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gcHJldkNvbnRhaW5lclRyYW5zaXRpb247XG5cbiAgICAgICAgICAgIC8vIERvbid0IGZvcmNlIG92ZXJmbG93IFx1MjAxNCBsZXQgdGhlIGNvbXBvbmVudC9wYXJlbnQgY29udHJvbCBzY3JvbGxpbmcuXG4gICAgICAgICAgICAvLyBPbmx5IHNldCBvdmVyZmxvdzogYXV0byB3aGVuIGNvbnRlbnQgZXhjZWVkcyBtYXggY29uc3RyYWludHMuXG4gICAgICAgICAgICBjb25zdCBpc1dpZHRoQ29uc3RyYWluZWQgPSBzaG91bGRBdXRvV2lkdGggJiYgbWF4V2lkdGggIT09IHVuZGVmaW5lZCAmJiBjb250ZW50V2lkdGggPiBtYXhXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGlzSGVpZ2h0Q29uc3RyYWluZWQgPSBzaG91bGRBdXRvSGVpZ2h0ICYmIG1heEhlaWdodCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRIZWlnaHQgPiBtYXhIZWlnaHQ7XG4gICAgICAgICAgICBjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1ggPSBpc1dpZHRoQ29uc3RyYWluZWQgPyAnYXV0bycgOiAnJztcbiAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGlzSGVpZ2h0Q29uc3RyYWluZWQgPyAnYXV0bycgOiAnJztcblxuICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nV2lkdGg6IHNob3VsZEF1dG9XaWR0aCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBzaG91bGRBdXRvSGVpZ2h0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJbml0aWFsIHNpemUgKHJ1biBzeW5jaHJvbm91c2x5LCBub3QgZGVib3VuY2VkKVxuICAgICAgICB1cGRhdGVTaXplKCk7XG5cbiAgICAgICAgLy8gU3RvcmUgdXBkYXRlU2l6ZSBmb3IgcmVlbnRyYW50IGNhbGxzXG4gICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlID0gdXBkYXRlU2l6ZTtcblxuICAgICAgICAvLyBEZWJvdW5jZSBvYnNlcnZlciBjYWxsYmFja3MgdmlhIHJBRiBcdTIwMTQgYXQgbW9zdCBvbmUgdXBkYXRlU2l6ZSBwZXIgZnJhbWUuXG4gICAgICAgIC8vIFByZXZlbnRzIGxheW91dCB0aHJhc2hpbmcgZnJvbSBoaWdoLWZyZXF1ZW5jeSBtdXRhdGlvbnMgKGUuZy4gQ1NTIGFuaW1hdGlvbnMpLlxuICAgICAgICBsZXQgcmFmSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVVcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmFmSWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJhZklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE9ic2VydmUgZm9yIGNoYW5nZXNcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gc2NoZWR1bGVVcGRhdGUoKSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHkpO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvYy5kb2N1bWVudEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIE11dGF0aW9uT2JzZXJ2ZXIgY2F0Y2hlcyBET00gY29udGVudCBjaGFuZ2VzIChlLmcuIHJlbW92aW5nIGxpc3QgaXRlbXMsIHRvZ2dsaW5nIHZpZXdzKVxuICAgICAgICAvLyB0aGF0IGRvbid0IHRyaWdnZXIgUmVzaXplT2JzZXJ2ZXIgYmVjYXVzZSB0aGUgYm9keSBib3gtc2l6ZSBzdGF5cyB0aGUgc2FtZVxuICAgICAgICAvLyAoYm9keSBmaWxscyBpZnJhbWUsIGlmcmFtZSBoYXNuJ3Qgc2hydW5rIHlldCkuXG4gICAgICAgIC8vIGBhdHRyaWJ1dGVzOiB0cnVlYCBjYXRjaGVzIENTUyBjbGFzcy9zdHlsZSBjaGFuZ2VzIChlLmcuIGRpc3BsYXk6bm9uZSB0b2dnbGluZyB2aWV3cykuXG4gICAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiBzY2hlZHVsZVVwZGF0ZSgpKTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKGRvYy5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBpZiAocmFmSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcbiAgICAgICAgICAgICAgICByYWZJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSBjbGVhbnVwO1xuICAgICAgICByZXR1cm4gY2xlYW51cDtcbiAgICB9XG5cbiAgICBzZXRTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgKyAncHgnO1xuXG5cbiAgICAgICAgICAgIC8vVE9ETzogZml4IHRoYXQgaGFjaywga2VlcCB0aGUgZnVuY3Rpb24gaW4gcmlnaHQgZm9ybWF0IHdoaWxlIG1pbmlmaWVkIDooXG4gICAgICAgICAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRvIGVuc3VyZSBpdCdzIG5vdCBvcHRpbWl6ZWQgYXdheSwgeW91IGNhbiBjYWxsIGl0IGF0IGxlYXN0IG9uY2VcbiAgICAgICAgICAgIGxldCB4ID0gbm9PcCgpO1xuICAgICAgICAgICAgeCsrO1xuICAgICAgICAgICAgeC0tO1xuXG4gICAgICAgICAgICAvL3JldHVybiBgJHt3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0ICsxID9cbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgLCB3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpICsgeCArICdweCdcblxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gcmV0LmNvbnRlbnQ7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG4gICAgICAgIC8vVE9ETyA6ID8hPyEgc2hvdWxkIGl0IGJlIGhlcmUgP1xuICAgICAgICBpZiAobWVzc2FnZV8ubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZV8gYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZClcbiAgICAgICAgICAgIHRoaXNbdHlwZWRNZXNzYWdlLm1ldGhvZF0oKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrIDooXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgbWVzc2FnZV8uZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKG1lc3NhZ2VfLCAnKicpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5NdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuICAgICAgICAgICAgfHwgaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLlJlc2l6ZU9ic2VydmVyTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAvL3RoaXMuc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwKCk7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpXG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0KCk7XG5cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQodGhpcy5JZnJhbWVFbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyVHlwZX0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wTG9hZGVyIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcExvYWRlciBpbXBsZW1lbnRzIElNeW9wTG9hZGVyIHtcbiAgICBhYnN0cmFjdCB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBhYnN0cmFjdCBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG5cbiAgICBhcHBlbmRDaGlsZCA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yZWxhdGl2ZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG9wdGlvbnMucmVsYXRpdmUuY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IG9wdGlvbnMucmVsYXRpdmUuY2hpbGQ/Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcgOiBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IGFkZFF1ZXJ5UGFyYW0gPSAodXJsOiBzdHJpbmcsIHBhcmFtOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAvLyBDcmVhdGUgYSBVUkwgb2JqZWN0XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgLy8gQWRkIHRoZSBxdWVyeSBwYXJhbWV0ZXJcbiAgICB1cmxPYmouc2VhcmNoUGFyYW1zLmFwcGVuZChwYXJhbSwgdmFsdWUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIFVSTFxuICAgIHJldHVybiB1cmxPYmoudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLklmcmFtZUxvYWRlclxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuICAgICAgICBsZXQgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgdHlwZWRMb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lcj8ubm9kZU5hbWUgPT09IFwiSUZSQU1FXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCduZWVkcyB0byBsb2FkIGludG8gYW4gZXhzaXN0aW5nIElmcmFtZS4uLicsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IChjb250YWluZXIgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHR5cGVkTG9hZGVyQ29uZmlnLnVybFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgICAgIC8vIFNldCBhbGwgc3R5bGVzIEJFRk9SRSBhcHBlbmRpbmcgdG8gcHJldmVudCBmbGFzaCBhdCB3cm9uZyBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgaWZyYW1lU3R5bGVzID0gYFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICBpbnNldDogMDtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICR7dHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCB8fCAhdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0ID8gJzEwMCUnIDogdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0fTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGlmcmFtZVN0eWxlcztcblxuICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgYXR0cmlidXRlcyBpZiBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVsZW1lbnRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5lbGVtZW50QXR0cmlidXRlcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBpc3N1ZSB0byBsb2FkIGlmcmFtZSBpbnNpZGUgYW4gaWZyYW1lIHdpdGggdGhlIHNhbWUgdXJsXG4gICAgICAgICAgICBsZXQgdXJsMmxvYWQgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykudXJsO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9oYXNQYXJlbnQpXG4gICAgICAgICAgICAgICAgdXJsMmxvYWQgPSBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9teW9wLWNvbXBcIiwgdW5pcUlkKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB1cmwybG9hZDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy8gICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tSWQpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy9OTyA6IElmcmFtZUVsZW1lbnQgPSBjb250YWluZXIubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgJzAuMy4yOSc7IiwgImltcG9ydCB7QmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlciwgSG9zdGVkQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCwgUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pj4ge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZVRvSG9zdDogYW55LCBwdWJsaWMgY29udGV4dDogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pikge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbm5lckV4ZWN1dG9yOiAoZXZlbnQ6IFQsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHZvaWQ7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogVCkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBpZiAoZXZlbnQuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZXZlbnQuZGVzdGluYXRpb247XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBwYXRjaCB0aGUgc291cmNlIGlkLCB0aGluayBhYm91dCB0aGF0ID9cbiAgICAgICAgICAgICAgICBjb25zdCBfbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBldmVudC5kZXN0aW5hdGlvbiA/IGV2ZW50LmRlc3RpbmF0aW9uIDogZXZlbnQuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb246IGV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZSA6IGV2ZW50LmRlc3RpbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbm5lckV4ZWN1dG9yKGV2ZW50LCB0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQsIF9tZXNzYWdlVG9Ib3N0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KVxuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8TXlvcEVsZW1lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2hhZG93Um9vdFJlZiBleHRlbmRzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBzdXBlcihjb250YWluZXIsIHNoYWRvd1Jvb3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IERldGVjdE15b3BSZWZzTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuXG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBNeW9wRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiB0YWtlIHRoYXQgYmFjayB0byB0aGUgZGFzaGJvYXJkP1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuXG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnd2MgcmVjdCcsICBpdGVtLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLm9mZnNldFRvcCwgaXRlbS5vZmZzZXRMZWZ0KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH07XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cblxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSxcbiAgICBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpbiBmYWN0IHdoZW4gcnVubmluZyBpbiBXZWJDb21wb25lbnQgd2UgY2FuIHRyYW5zZmVyIHRoZSBvcmlnaW5hbCBlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IHVzaW5nIG1ha2VTZXJpYWxpemFibGUgZm9yIG5lc3RlZCBjYXNlcywgdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCAgbWFrZVNlcmlhbGl6YWJsZShlLCBldmVudC5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWY/LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcblxuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGV2ZW50Lm9wdGlvbnMuaWQpITtcbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vLy8+Pj4+XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhgZmFpbGVkIHRvIGZpbmQgJHtldmVudC5vcHRpb25zLmlkfSBpbiBtZW0gc2NvcGVgLCBob3N0U0RLKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoZSByZWYgY29tcG9uZW50IGluIG91ciBIb3N0U0RLIChzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyAgcmVmQ29tcG9uZW50LnBhcmVudCA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSByZWYgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBob3N0U0RLLmNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFNESy5jb21wb25lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgcmVtb3ZlZCB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHVzaW5nIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vIG5lZWQgdGhpcywgcGFzcyBvcHRpb25zIGZyb20gcGFyZW50XG4gICAgICAgICAgICAgICAgLy9pbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pZCA9IGV2ZW50LnByZWRlZmluZWRJZDtcbiAgICAgICAgICAgICAgICAvL3JlZkNvbXBvbmVudC5pZCArPSAnLic7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBub3QgcmVhbGx5IG5lZWRlZCA/XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgaW1wbGVtZW50YXRpb25Db21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpXG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3J9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVTY3JpcHRNZXNzYWdlXG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIGRhdGEpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yKGV2ZW50LCByZXBsaWVyLCBzaGFkb3dSb290UmVmKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShnZXRJbnB1dFZhbHVlKGl0ZW0pKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tICdAbXlvcC9zZGsvd2ViY29tcG9uZW50JztcbiAqIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290IFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkNvbXBvbmVudFNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgPSB0cnVlO1xuXG4gICAgLy93aGVuIG5ldyB3ZWIgY29tcG9uZW50IGNyZWF0ZWQuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2sgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgc2hhZG93OiBTaGFkb3dSb290KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZS5kYXRhID8gZS5kYXRhIDogZS5kZXRhaWw7XG4gICAgICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY3ZpZWQgd2ViY29tcG9uZW50X21lc3NhZ2Ugd2l0aCB3cm9uZyB0eXBlJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIGNvbnRhaW5lciAvIGNvbXBvZW5udCBpZGVudGlmaWVyIGZvciBtdWx0aWwgY29tcG9uZW50cyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcyhlKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0uY29udGV4dCA9IG5ldyBTaGFkb3dSb290UmVmKGNvbnRhaW5lciwgc2hhZG93KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhbmRsZXIuY29udGV4dCA9IHRoaXMuc2hhZG93Um9vdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLiByYWNlIGNvbmRpdGlvbiB3aXRoIGhvc3QubG9hZCB3aGVuIG1vZHVsZSBsb2FkZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgICAgIH0sIDEpXG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cFxuICAgICAgICAvL21lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgLy9cbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgLy90aGlzLm15Q29tcG9uZW50SWRcbiAgICAgICAgLy90aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzXG4gICAgfVxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdXZWJDb21wb25lbnRTREsnLCBXZWJDb21wb25lbnRTREspO1xuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJSFRNTExvYWRlckNvbmZpZyxcbiAgICBJU2tpbkNvbmZpZywgU2hhZG93Um9vdE1vZGVUeXBlLFxuICAgIFNraW5Mb2FkZXJzXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHNcIjtcbmltcG9ydCB7RU1CRURERURfU0RLX0NPTlRFTlQsIEhBU19FTUJFRERFRF9TREt9IGZyb20gXCIuLi9lbWJlZGRlZFNESy50c1wiO1xuLy9pbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSBcIi4uLy4uL1NESy50c1wiO1xuXG5jb25zdCBNWU9QX1dFQl9DT01QT05FTlRfTUFSS0VSID0gJzwhLS0gbXlvcC13ZWItY29tcG9uZW50IC0tPic7XG5jb25zdCBNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEID0gJ215b3Atd2ViLWNvbXBvbmVudCc7XG5cbi8vIFRyYWNrIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50IHNjcmlwdHMgdG8gcHJldmVudCBkb3VibGUgcmVnaXN0cmF0aW9uXG5jb25zdCBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuY29uc3Qgc2Vlbjogc3RyaW5nW10gPSBbXTtcbmxldCBzZGs7XG5jb25zdCBnZXRJbml0aWF0ZWRTZGsgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzZGspIHtcbiAgICAgICAgLy9jb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpXG4gICAgICAgIHNkayA9IG5ldyBXZWJDb21wb25lbnRTREsoKTtcbiAgICAgICAgc2RrLmluaXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNkaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sU3RyaW5nOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSk6IG5ldyAoKSA9PiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZSA9IFNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUub3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnO1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGV9KTtcbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayh0aGlzLCBzaGFkb3cpO1xuICAgICAgICAgICAgICAgIHNoYWRvdy5pbm5lckhUTUwgPSBodG1sU3RyaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuY29uc3QgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50ID0gKGNvbXBvbmVudE5hbWU6IHN0cmluZywgaHRtbDogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpID0+IHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoY29tcG9uZW50TmFtZSwgY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sLCBTaGFkb3dSb290TW9kZSkpO1xuICAgIGNvbnNvbGUubG9nKGBkZWZpbmUoJyR7Y29tcG9uZW50TmFtZX0nKSB3YXMgY2FsbGVkLCB3ZWIgY29tcG9uZW50IHJlYWR5IHRvIHVzZWApO1xufVxuXG5jb25zdCB0b1dlYkNvbXBvbmVudE5hbWUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgdXBwZXJjYXNlIGxldHRlcnNcbiAgICAgICAgLnJlcGxhY2UoLyhcXGQrKS9nLCAnLSQxJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgZGlnaXRzXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpOyAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxufVxuXG5jb25zdCB0b0N1c3RvbUVsZW1lbnROYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIG5hbWUgPSB0b1dlYkNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXy9nLCAnLScpO1xufVxuXG5sZXQgcGFyc2VyOiBET01QYXJzZXI7IC8vID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgY2xhc3MgSFRNTENvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5IVE1MTG9hZGVyXG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3QgaWYgSFRNTCBpcyBhIE15b3AgV2ViIENvbXBvbmVudCAoc3RhcnRzIHdpdGggbWFya2VyIGNvbW1lbnQpXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc015b3BXZWJDb21wb25lbnQoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBodG1sLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCB0aGUgd2ViIGNvbXBvbmVudCBzY3JpcHQgY29udGVudCBmcm9tIEhUTUxcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvYy5nZXRFbGVtZW50QnlJZChNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEKTtcbiAgICAgICAgcmV0dXJuIHNjcmlwdD8udGV4dENvbnRlbnQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBvbiB0aGUgaG9zdCBkb2N1bWVudFxuICAgICAqL1xuICAgIHByaXZhdGUgZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50OiBzdHJpbmcsIHNjcmlwdElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBleGVjdXRlZCAoYnkgc2NyaXB0IGNvbnRlbnQgaGFzaClcbiAgICAgICAgaWYgKGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuaGFzKHNjcmlwdElkKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgYWxyZWFkeSBleGVjdXRlZCBmb3IgJHtzY3JpcHRJZH0sIHNraXBwaW5nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgc2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0Q29udGVudDtcbiAgICAgICAgc2NyaXB0LmlkID0gYG15b3AtZXh0cmFjdGVkLSR7c2NyaXB0SWR9YDtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXG4gICAgICAgIGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuYWRkKHNjcmlwdElkKTtcbiAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBFeGVjdXRlZCB3ZWIgY29tcG9uZW50IHNjcmlwdDogJHtzY3JpcHRJZH1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgTXlvcCBXZWIgQ29tcG9uZW50IChleHRyYWN0ZWQgYW5kIHJ1biBvbiBob3N0IGRvY3VtZW50KVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICBodG1sOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKTogUHJvbWlzZTxNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50PiB7XG4gICAgICAgIGNvbnN0IHNjcmlwdENvbnRlbnQgPSB0aGlzLmV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbCk7XG5cbiAgICAgICAgaWYgKCFzY3JpcHRDb250ZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tNeW9wV2ViQ29tcG9uZW50XSBObyA8c2NyaXB0IGlkPVwibXlvcC13ZWItY29tcG9uZW50XCI+IGZvdW5kIGluIEhUTUwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBjb21wb25lbnQgZGVmaW5pdGlvbiBpZCBhcyBzY3JpcHQgaWRlbnRpZmllciBmb3IgZGVkdXBsaWNhdGlvblxuICAgICAgICBjb25zdCBzY3JpcHRJZCA9IGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9LSR7c2tpbi5pZH1gO1xuXG4gICAgICAgIC8vIFN0b3JlIF9fTVlPUF9UQUdfTkFNRV9fIGJlZm9yZSBleGVjdXRpb24gdG8gY2FwdHVyZSBpdFxuICAgICAgICBjb25zdCBwcmV2aW91c1RhZ05hbWUgPSAod2luZG93IGFzIGFueSkuX19NWU9QX1RBR19OQU1FX187XG5cbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgc2NyaXB0IG9uIHRoZSBob3N0IGRvY3VtZW50XG4gICAgICAgIHRoaXMuZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50LCBzY3JpcHRJZCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSB0YWcgbmFtZSB0aGF0IHdhcyBzZXQgYnkgdGhlIHNjcmlwdFxuICAgICAgICBjb25zdCB0YWdOYW1lID0gKHdpbmRvdyBhcyBhbnkpLl9fTVlPUF9UQUdfTkFNRV9fO1xuXG4gICAgICAgIGlmICghdGFnTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gU2NyaXB0IGRpZCBub3Qgc2V0IHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyB0YWcgbmFtZSBpZiB0aGlzIHdhcyBhIHJlLXJlZ2lzdHJhdGlvblxuICAgICAgICBpZiAocHJldmlvdXNUYWdOYW1lICYmIHByZXZpb3VzVGFnTmFtZSAhPT0gdGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbTXlvcFdlYkNvbXBvbmVudF0gX19NWU9QX1RBR19OQU1FX18gY2hhbmdlZCBmcm9tICR7cHJldmlvdXNUYWdOYW1lfSB0byAke3RhZ05hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGN1c3RvbSBlbGVtZW50XG4gICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWA7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIGNvbnRhaW5lciBpZiBuZWVkZWRcbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSkge1xuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgY29tcG9uZW50IHdyYXBwZXJcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQoXG4gICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uLFxuICAgICAgICAgICAgc2tpbixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICB0YWdOYW1lLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBkYXRhIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmIChvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBbTXlvcFdlYkNvbXBvbmVudF0gTG9hZGVkIDwke3RhZ05hbWV9PiBpbnRvIGNvbnRhaW5lcmApO1xuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgTXlvcCBXZWIgQ29tcG9uZW50IChleHRyYWN0ZWQgd2ViIGNvbXBvbmVudCBtb2RlKVxuICAgICAgICBpZiAodGhpcy5pc015b3BXZWJDb21wb25lbnQobG9hZGVyQ29uZmlnLkhUTUwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkRXh0cmFjdGVkV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgbG9hZGVyQ29uZmlnLkhUTUwsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgbGV0IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBjb250ZW50IGludG8gdGhlIGlmcmFtZVxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBkb2MgPSBJZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBJZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgICBkb2Mub3BlbigpO1xuXG5cbiAgICAgICAgICAgIC8vIFBhcnNlIG15b3A6c2l6ZSBtZXRhIHRhZyBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uIChzYW1lIERPTVBhcnNlciBwYXNzIHBhdHRlcm4gYXMgbXlvcF9wcmV2aWV3IHJlbW92YWwpLlxuICAgICAgICAgICAgLy8gVGhpcyBsZXRzIHRoZSBSZWFjdCBob3N0IGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KSBmcm9tIHRoZSBzdGFydC5cbiAgICAgICAgICAgIGxldCBwYXJzZWRTaXplTWV0YTogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBfcHJlUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVEb2MgPSBfcHJlUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhID0gX3ByZURvYy5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJteW9wOnNpemVcIl0nKTtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZU1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyc2VkU2l6ZU1ldGEgPSBKU09OLnBhcnNlKHNpemVNZXRhLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIHx8ICd7fScpOyB9IGNhdGNoIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgSFRNTDJSZW5kZXIgPSBsb2FkZXJDb25maWcuSFRNTDtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9pbnNwZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9pbmplY3QgaW5zcGVjdGlvbiBzY3JpcHQgZm9yIHByb3BzIGRldGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IHBhcnQgb2YgQUkgY29tcG9uZW50cywgdGhpbmsgYWJvdXQgdGhhdCwgZG9jdW1lbnQgaXQuXG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQ/LnJlbW92ZUF0dHJpYnV0ZSgndHlwZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGluamVjdGVkIEhUTUwgc3RyaW5nIGludG8gYSBub2RlXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IF9kb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgdGVtcC5ib2R5LmlubmVySFRNTCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlS2V5c1dpbmRvdyA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUtleXNXaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGVtcC5ib2R5LmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBfZG9jLmhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RvYy5oZWFkLmluc2VydEJlZm9yZShfZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSksIF9kb2MuaGVhZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9IF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGltcHJvdmUgYnkgZG8gaXQgb24gdGhlIHNlcnZlIG9uY2VcblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBteW9wX3ByZXZpZXcgc2NyaXB0IHdoZW4gbm90IGluIGluc3BlY3Rpb24gbW9kZVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BfcHJldmlld19zY3JpcHQgPSBfZG9jLmdldEVsZW1lbnRCeUlkKCdteW9wX3ByZXZpZXcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChteW9wX3ByZXZpZXdfc2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBkb2Mud3JpdGVsbihIVE1MMlJlbmRlcik7XG5cbiAgICAgICAgICAgIC8vIHdpbmRvdy5fX2ZlZGVyYXRpb25fXyA9XG4gICAgICAgICAgICAvLyAgICAgeyAuLi53aW5kb3cuX19mZWRlcmF0aW9uX18sXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vVE9ETyA6IGdldCBmcm9tIEVOViBhdCBidWlsZCB0aW1lLFxuICAgICAgICAgICAgLy8gICAgICAgICAvLyBpbmplY3QgdmFsdWUgdG8gbW9kdWxlIGF0IGJ1aWxkIHRpbWVcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gdG9kYXkgd2UgZG9pbmcgc28ganVzdCBmb3IgdGhlIENKUyB2ZXJzaW9uXG4gICAgICAgICAgICAvLyAgICAgICAgIF9fcHVibGljX3BhdGhfXyA6J2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0J1xuICAgICAgICAgICAgLy8gICAgICAgICAsLi4uJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fKVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9O1xuXG4gICAgICAgICAgICAvLyBGb3IgbnBtIHBhY2thZ2UgdXNlcnMgd2l0aCBidW5kbGVycyAoVml0ZS9XZWJwYWNrKSwgaW5qZWN0IFNESyBpbmxpbmVcbiAgICAgICAgICAgIC8vIEZvciBDRE4gdXNlcnMgKHNjcmlwdCB0YWcpLCB1c2UgQ0ROIFVSTFxuICAgICAgICAgICAgY29uc3Qgc2RrU2NyaXB0ID0gSEFTX0VNQkVEREVEX1NES1xuICAgICAgICAgICAgICAgID8gYDxzY3JpcHQ+JHtFTUJFRERFRF9TREtfQ09OVEVOVH08L3NjcmlwdD5gXG4gICAgICAgICAgICAgICAgOiBgPHNjcmlwdCBzcmM9XCIke3dpbmRvdy5teW9wLl9fUk9PVF9TREtfUFVCTElDX1VSTF9ffVwiPjwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIC8vIERpZmZlcmVudCBpbml0IHNjcmlwdCBmb3IgZW1iZWRkZWQgdnMgQ0ROIFNES1xuICAgICAgICAgICAgLy8gLSBFbWJlZGRlZCAoYnVuZGxlZCBJSUZFKTogdXNlcyBNeW9wU0RLLmdldElmcmFtZU1vZHVsZSgpIHdoaWNoIHJldHVybnMgbW9kdWxlIGRpcmVjdGx5XG4gICAgICAgICAgICAvLyAtIENETiAoZHluYW1pYyBsb2FkaW5nKTogdXNlcyB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpIHdoaWNoIHdyYXBzIHdpdGggLmdldCgpXG4gICAgICAgICAgICBjb25zdCBpbml0U2NyaXB0ID0gSEFTX0VNQkVEREVEX1NES1xuICAgICAgICAgICAgICAgID8gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWVNb2R1bGUgPSBhd2FpdCBNeW9wU0RLLmdldElmcmFtZU1vZHVsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWZyYW1lU0RLID0gaWZyYW1lTW9kdWxlLklmcmFtZVNESztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX18gPSB3aW5kb3cuX19mZWRlcmF0aW9uX18uX19wdWJsaWNfcGF0aF9fO1xuICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbXlvcF9pbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZGsgPSBuZXcgSWZyYW1lU0RLKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZGsuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICBfX215b3BfaW5pdCgpLnRoZW4oKTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICBkb2Mud3JpdGVsbihgJHtzZGtTY3JpcHR9JHtpbml0U2NyaXB0fWApO1xuXG4gICAgICAgICAgICAvLyBJbmplY3QgZGF0YSBzY3JpcHQgaWYgZGF0YSBvcHRpb24gaXMgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXR1cCBDVEEgcXVldWUgLSBjYXB0dXJlcyBhbnkgQ1RBcyBlbWl0dGVkIGR1cmluZyBpbml0IGJlZm9yZSBob3N0IHJlZ2lzdGVycyBoYW5kbGVyXG4gICAgICAgICAgICAgICAgY29uc3QgY3RhUXVldWVTY3JpcHQgPSBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3BfY3RhX2hhbmRsZXIgPSBmdW5jdGlvbihhY3Rpb24sIHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfY3RhX3F1ZXVlLnB1c2goe2FjdGlvbjogYWN0aW9uLCBwYXlsb2FkOiBwYXlsb2FkfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgICAgIC8vIEVzY2FwZSBkYXRhIGZvciBzYWZlIGVtYmVkZGluZyBpbiBzY3JpcHQgdGFnXG4gICAgICAgICAgICAgICAgLy8gSlNPTi5zdHJpbmdpZnkgZG9lc24ndCBlc2NhcGUgPC9zY3JpcHQ+IHdoaWNoIGNvdWxkIGJyZWFrIEhUTUwgcGFyc2luZ1xuICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWREYXRhID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvPFxcL3NjcmlwdC9naSwgJ1xcXFx1MDAzYy9zY3JpcHQnKTtcblxuICAgICAgICAgICAgICAgIC8vIFNlbGYtY29udGFpbmVkIGRhdGEgaW5qZWN0aW9uIHNjcmlwdCB0aGF0OlxuICAgICAgICAgICAgICAgIC8vIDEuIENhbGxzIG15b3BfaW5pdF9pbnRlcmZhY2UgaW1tZWRpYXRlbHkgaWYgYWxyZWFkeSBkZWZpbmVkXG4gICAgICAgICAgICAgICAgLy8gMi4gV2F0Y2hlcyBmb3IgbGF0ZS1kZWZpbmVkIG15b3BfaW5pdF9pbnRlcmZhY2UgdmlhIGRlZmluZVByb3BlcnR5XG4gICAgICAgICAgICAgICAgLy8gMy4gQ2xlYW5zIHVwIGFmdGVyIGl0c2VsZiAocmVtb3ZlcyBzY3JpcHQgdGFnIGFuZCB3aW5kb3cgZGF0YSlcbiAgICAgICAgICAgICAgICAvLyA0LiBQb3N0cyBtZXNzYWdlIHRvIHBhcmVudCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nIChwcmUtaW5qZWN0ZWQgaW5pdCopXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YVNjcmlwdCA9IGA8c2NyaXB0IGlkPVwiX19teW9wX2luaXRfZGF0YV9zY3JpcHRcIj5cbiAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSAke2VzY2FwZWREYXRhfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY3JpcHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdfX215b3BfaW5pdF9kYXRhX3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbEluaXRJbnRlcmZhY2UgPSBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFzIHByZS1pbmplY3RlZCBkYXRhIGNhbGwgZm9yIGV4dGVuc2lvbiB0cmFja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfaW5pdF9wcmVpbmplY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4oZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aWZ5IGV4dGVuc2lvbiB2aWEgcG9zdE1lc3NhZ2UgKGluaXQqID0gcHJlLWluamVjdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01ZT1BfUFJFSU5KRUNURURfSU5JVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICcqJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFudXA6IHJlbW92ZSBzY3JpcHQgdGFnIGFuZCBzdG9yZWQgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY3JpcHRFbCAmJiBzY3JpcHRFbC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0RWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gYWxyZWFkeSBleGlzdHMgLSBjYWxsIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2Uod2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBub3QgeWV0IGRlZmluZWQgLSBzdG9yZSBkYXRhIGFuZCB3YXRjaCBmb3IgZGVmaW5pdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfaW5pdF9kYXRhID0gZGF0YTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfb3JpZ2luYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ215b3BfaW5pdF9pbnRlcmZhY2UnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29yaWdpbmFsID0gZm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Ll9fbXlvcF9pbml0X2RhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZWREYXRhID0gd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5fX215b3BfaW5pdF9kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxJbml0SW50ZXJmYWNlKGZuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfb3JpZ2luYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZWxuKGN0YVF1ZXVlU2NyaXB0ICsgZGF0YVNjcmlwdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvYy5jbG9zZSgpO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogY29udHJvbCBmcm9tIGRhc2hib2FyZFxuICAgICAgICAgICAgLy8gIChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS5hdXRvSGVpZ2h0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgY29uc3QgY29tcCA9IG5ldyBNeW9wSWZyYW1lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIC8vIFN0b3JlIHBhcnNlZCBzaXplTWV0YSBvbiB0aGUgY29tcG9uZW50IHNvIHRoZSBSZWFjdCBob3N0IGNhbiByZWFkIGl0XG4gICAgICAgICAgICBjb21wLnNpemVNZXRhID0gcGFyc2VkU2l6ZU1ldGE7XG5cbiAgICAgICAgICAgIC8vIEF1dG8tc2l6ZTogb2JzZXJ2ZSBjb250ZW50IHNpemUgYW5kIHN5bmMgdG8gaWZyYW1lIGRpbWVuc2lvbnMuXG4gICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGZvciBhbGwgaG9zdHMgKHZhbmlsbGEgU0RLLCBSZWFjdCwgVnVlLCBBbmd1bGFyKS5cbiAgICAgICAgICAgIC8vIElmIGEgZnJhbWV3b3JrIGhvc3QgKGUuZy4gQG15b3AvcmVhY3QpIGFsc28gY2FsbHMgb2JzZXJ2ZUF1dG9TaXplKCksXG4gICAgICAgICAgICAvLyBpdCBjbGVhbmx5IHJlcGxhY2VzIHRoZXNlIG9ic2VydmVycyB2aWEgX2F1dG9TaXplQ2xlYW51cCB0cmFja2luZy5cbiAgICAgICAgICAgIGNvbXAuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmF1dG9TaXplID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBhdXRvLXNpemluZy4gSWZyYW1lIHN0YXlzIHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgY29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBIb3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucyAoZS5nLiBSZWFjdCBOYXRpdmUgV2ViVmlldykuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNob3duID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29tcC5vYnNlcnZlQXV0b1NpemUoe1xuICAgICAgICAgICAgICAgICAgICBmb3JjZUF1dG9TaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvblNpemVDaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgYWZ0ZXIgZmlyc3QgbWVhc3VyZW1lbnQgY29tcGxldGVzIChub3QgYmVmb3JlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNpdGlvbnMgZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBtZWFzdXJlZCBoZWlnaHQsIHByZXZlbnRpbmcgZmxhc2ggYXQgd3Jvbmcgc2l6ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd24gJiYgIW9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyBjb21wLnByb3BzLl9nbG9iYWwgPSBjb21wLmVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICAgICAgICAgIHJldHVybiBjb21wO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubm9uZSkge1xuICAgICAgICAgICAgLy8gcGFyc2VyID0gcGFyc2VyID8gcGFyc2VyIDogbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgLy8gY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIGRvbUlkKTtcblxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7Ly8udHJpbSgpO1xuICAgICAgICAgICAgZWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIC8vICAgY29uc3QgZmlyc3RFbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIC8vICAgY29uc3QgeiA9IGZpcnN0RWxlbWVudCA/IGZpcnN0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgICAgICAgLy8gICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2codGVtcGxhdGUsIGZpcnN0RWxlbWVudCwgeilcbiAgICAgICAgICAgIC8vICAgZWxlbWVudCA9IGZpcnN0RWxlbWVudFxuXG4gICAgICAgICAgICAvLyBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpO1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBjb250YWluZXIuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2soZWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudE5hbWUgPSB0b0N1c3RvbUVsZW1lbnROYW1lKGNvbXBvbmVudERlZmluaXRpb24ubmFtZSArIHNraW4uaWQpO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlZGVmaW5lICFcbiAgICAgICAgICAgIGlmICghc2Vlbi5pbmNsdWRlcyhjdXN0b21FbGVtZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQoY3VzdG9tRWxlbWVudE5hbWUsIGxvYWRlckNvbmZpZy5IVE1MLCBsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUpO1xuICAgICAgICAgICAgICAgIHNlZW4ucHVzaChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtjdXN0b21FbGVtZW50TmFtZX0gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJUHJvcENvbmZpZyxcbiAgICBJU2tpbkNvbmZpZyxcbiAgICBJVXNlckZsb3csXG4gICAgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgdjJfSVZhcmlhbnRDb25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcgPSAoY29uZmlnOiB2Ml9JVmFyaWFudENvbmZpZyk6IElDb21wb25lbnRDb25maWcgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGluc3RhbmNlOiB7XG4gICAgICAgICAgICBpZDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbmZpZy5jb21wb25lbnRJZCxcbiAgICAgICAgICAgIGNvbXBvbmVudE5hbWU6IGNvbmZpZy5uYW1lLFxuXG4gICAgICAgICAgICBza2luU2VsZWN0b3I6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgfSBhcyBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIGlkOiBjb25maWcuaWQsXG4gICAgICAgICAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBjb25maWcuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwcm9wczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdteW9wX2luaXRfaW50ZXJmYWNlJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGFzIElQcm9wQ29uZmlnLFxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ291dF9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdteW9wX2N0YV9oYW5kbGVyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGFzIElQcm9wQ29uZmlnXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVmczogW10sXG4gICAgICAgICAgICBza2luczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kbGUgZW1wdHkgOlxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlcjogY29uZmlnLmNvbnN1bWVfdmFyaWFudFswXS5sb2FkZXJcbiAgICAgICAgICAgICAgICB9IGFzIElTa2luQ29uZmlnXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZGVmYXVsdFNraW46IDBcbiAgICAgICAgfSBhcyBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgbmFtZTogY29uZmlnLm5hbWVcbiAgICB9IGFzIElDb21wb25lbnRDb25maWc7XG59O1xuXG4vKipcbiAqIENsb3VkUmVwb3NpdG9yeSAtIFVuaWZpZWQgY2xvdWQgZGF0YSBhY2Nlc3MgbGF5ZXIgZm9yIE15b3AgY29tcG9uZW50c1xuICpcbiAqIFN1cHBvcnRzIGJvdGggdjIgKGRlZmF1bHQpIGFuZCB2MSBtb2RlczpcbiAqIC0gdjI6IFVzZXMgL2NvbnN1bWUgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHZhcmlhbnRzXG4gKiAtIHYxOiBVc2VzIC9mbG93IGVuZHBvaW50IGZvciBmZXRjaGluZyB1c2VyIGZsb3dzXG4gKi9cbi8vIFVzZSBhIGdsb2JhbCBzaW5nbGV0b24gdG8gZW5zdXJlIG9ubHkgb25lIENsb3VkUmVwb3NpdG9yeS5NYWluIGV4aXN0c1xuLy8gZXZlbiB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzIGJ5IGRpZmZlcmVudCBidW5kbGVyc1xuY29uc3QgR0xPQkFMX0tFWSA9ICdfX01ZT1BfQ0xPVURfUkVQT1NJVE9SWV9NQUlOX18nO1xuXG5jb25zdCBnZXRHbG9iYWxNYWluID0gKCk6IENsb3VkUmVwb3NpdG9yeSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSlbR0xPQkFMX0tFWV07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSlbR0xPQkFMX0tFWV07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBzZXRHbG9iYWxNYWluID0gKGluc3RhbmNlOiBDbG91ZFJlcG9zaXRvcnkpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKHdpbmRvdyBhcyBhbnkpW0dMT0JBTF9LRVldID0gaW5zdGFuY2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KVtHTE9CQUxfS0VZXSA9IGluc3RhbmNlO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBDbG91ZFJlcG9zaXRvcnkge1xuICAgIHByaXZhdGUgc3RhdGljIF9tYWluOiBDbG91ZFJlcG9zaXRvcnkgfCBudWxsID0gbnVsbDtcblxuICAgIHN0YXRpYyBnZXQgTWFpbigpOiBDbG91ZFJlcG9zaXRvcnkge1xuICAgICAgICAvLyBDaGVjayBpZiBhIGdsb2JhbCBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cyAoZnJvbSBhbm90aGVyIGJ1bmRsZSlcbiAgICAgICAgY29uc3QgZ2xvYmFsTWFpbiA9IGdldEdsb2JhbE1haW4oKTtcbiAgICAgICAgaWYgKGdsb2JhbE1haW4pIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxNYWluO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIG5ldyBpbnN0YW5jZSBpZiBuZWVkZWRcbiAgICAgICAgaWYgKCFDbG91ZFJlcG9zaXRvcnkuX21haW4pIHtcbiAgICAgICAgICAgIENsb3VkUmVwb3NpdG9yeS5fbWFpbiA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoKTtcbiAgICAgICAgICAgIHNldEdsb2JhbE1haW4oQ2xvdWRSZXBvc2l0b3J5Ll9tYWluKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2xvdWRSZXBvc2l0b3J5Ll9tYWluO1xuICAgIH1cblxuICAgIC8vIHYyIGNhY2hlIC0ga2V5ZWQgYnkgY29tcG9uZW50SWQ6ZW52OnByZXZpZXd8bGl2ZVxuICAgIC8vIEVhY2ggUHJvbWlzZSBpcyB0YWdnZWQgd2l0aCBhIGByZXNvbHZlZGAgcHJvcGVydHkgYWZ0ZXIgc2V0dGxpbmcgKHNlZSBmZXRjaENvbXBvbmVudFYyKS5cbiAgICBwcml2YXRlIHZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElDb21wb25lbnRDb25maWc+ICYgeyByZXNvbHZlZD86IElDb21wb25lbnRDb25maWcgfT4gPSB7fTtcblxuICAgIC8vIFRyYWNrIHdoaWNoIGNvbXBvbmVudHMgd2VyZSBwcmVsb2FkZWQgYW5kIHdpdGggd2hhdCBwYXJhbXNcbiAgICAvLyBLZXk6IGNvbXBvbmVudElkLCBWYWx1ZTogeyBlbnYsIHByZXZpZXcgfVxuICAgIHByaXZhdGUgcHJlbG9hZGVkQ29tcG9uZW50czogUmVjb3JkPHN0cmluZywgeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9PiA9IHt9O1xuXG4gICAgLy8gdjEgY2FjaGVcbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEVudiA9ICdwcm9kdWN0aW9uJztcbiAgICBwcml2YXRlIF9lbnZFeHBsaWNpdGx5U2V0ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc3RhdGljTW9kZSA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2Jykge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEVuYWJsZSBzdGF0aWMgbW9kZSBmb3Igc2VsZi1ob3N0ZWQgY29tcG9uZW50IHJlZ2lzdHJpZXMuXG4gICAgICogSW4gc3RhdGljIG1vZGUsIFVSTHMgYXJlIGNvbnN0cnVjdGVkIGFzIGZpbGUgcGF0aHMgaW5zdGVhZCBvZiBxdWVyeSBwYXJhbXM6XG4gICAgICogICAke2Jhc2VVcmx9L2NvbXBvbmVudHMvJHtjb21wb25lbnRJZH0vJHtlbnZ9Lmpzb25cbiAgICAgKi9cbiAgICBlbmFibGVTdGF0aWNNb2RlKCkge1xuICAgICAgICB0aGlzLl9zdGF0aWNNb2RlID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGRlZmF1bHQgZW52aXJvbm1lbnQgZm9yIHRoaXMgQ2xvdWRSZXBvc2l0b3J5IGluc3RhbmNlXG4gICAgICovXG4gICAgc2V0RW52aXJvbm1lbnQoZW52OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdEVudiA9IGVudjtcbiAgICAgICAgdGhpcy5fZW52RXhwbGljaXRseVNldCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IGRlZmF1bHQgZW52aXJvbm1lbnRcbiAgICAgKi9cbiAgICBnZXREZWZhdWx0RW52aXJvbm1lbnQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYyIE1ldGhvZHMgKERlZmF1bHQpID09PT09PT09PT09PVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBjb21wb25lbnQgaXMgYWxyZWFkeSBjYWNoZWQvcHJlbG9hZGVkICh2MilcbiAgICAgKiBJZiBlbnYgYW5kIHByZXZpZXcgYXJlIG5vdCBwcm92aWRlZCwgY2hlY2tzIGlmIEFOWSB2ZXJzaW9uIGlzIHByZWxvYWRlZFxuICAgICAqL1xuICAgIGlzUHJlbG9hZGVkKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgLy8gSWYgc3BlY2lmaWMgZW52L3ByZXZpZXcgcmVxdWVzdGVkLCBjaGVjayBleGFjdCBtYXRjaFxuICAgICAgICBpZiAoZW52ICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke2NvbXBvbmVudElkfToke2VudiB8fCB0aGlzLl9kZWZhdWx0RW52fToke3ByZXZpZXcgPyAncHJldmlldycgOiAnbGl2ZSd9YDtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZUtleSBpbiB0aGlzLnZhcmlhbnRzO1xuICAgICAgICB9XG4gICAgICAgIC8vIE90aGVyd2lzZSBjaGVjayBpZiBhbnkgdmVyc2lvbiB3YXMgcHJlbG9hZGVkXG4gICAgICAgIHJldHVybiBjb21wb25lbnRJZCBpbiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwcmVsb2FkZWQgcGFyYW1zIGZvciBhIGNvbXBvbmVudCAoaWYgcHJlbG9hZGVkKVxuICAgICAqIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBwcmVsb2FkZWRcbiAgICAgKi9cbiAgICBnZXRQcmVsb2FkZWRQYXJhbXMoY29tcG9uZW50SWQ6IHN0cmluZyk6IHsgZW52OiBzdHJpbmc7IHByZXZpZXc6IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgdjIgY29tcG9uZW50IGNvbmZpZ1xuICAgICAqIElmIGVudi9wcmV2aWV3IG5vdCBzcGVjaWZpZWQgYW5kIGNvbXBvbmVudCB3YXMgcHJlbG9hZGVkLCB1c2VzIHByZWxvYWRlZCBwYXJhbXNcbiAgICAgKi9cbiAgICBhc3luYyBmZXRjaENvbXBvbmVudFYyKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudmlyb25tZW50SWRlbnRpZmllcj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBQcm9taXNlPElDb21wb25lbnRDb25maWc+IHtcbiAgICAgICAgLy8gSWYgbm8gZXhwbGljaXQgZW52L3ByZXZpZXcgYW5kIGNvbXBvbmVudCB3YXMgcHJlbG9hZGVkLCB1c2UgcHJlbG9hZGVkIHBhcmFtc1xuICAgICAgICBjb25zdCBwcmVsb2FkZWQgPSB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdO1xuICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFBhcmFtcyA9IGVudmlyb25tZW50SWRlbnRpZmllciAhPT0gdW5kZWZpbmVkIHx8IHByZXZpZXcgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICBsZXQgZW52OiBzdHJpbmc7XG4gICAgICAgIGxldCB1c2VQcmV2aWV3OiBib29sZWFuO1xuXG4gICAgICAgIGlmICghaGFzRXhwbGljaXRQYXJhbXMgJiYgcHJlbG9hZGVkKSB7XG4gICAgICAgICAgICAvLyBVc2UgcHJlbG9hZGVkIHBhcmFtc1xuICAgICAgICAgICAgZW52ID0gcHJlbG9hZGVkLmVudjtcbiAgICAgICAgICAgIHVzZVByZXZpZXcgPSBwcmVsb2FkZWQucHJldmlldztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVzZSBwcm92aWRlZCBwYXJhbXMgb3IgZGVmYXVsdHNcbiAgICAgICAgICAgIGVudiA9IGVudmlyb25tZW50SWRlbnRpZmllciB8fCB0aGlzLl9kZWZhdWx0RW52O1xuICAgICAgICAgICAgLy8gSWYgcHJldmlldyBleHBsaWNpdGx5IHRydWUgXHUyMTkyIHRydWVcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgZXhwbGljaXRseSBmYWxzZSBcdTIxOTIgZmFsc2VcbiAgICAgICAgICAgIC8vIElmIHByZXZpZXcgdW5kZWZpbmVkOiBlbnYgd2FzIHNwZWNpZmllZCAodmlhIHBhcmFtIG9yIHNldEVudmlyb25tZW50KSBcdTIxOTIgZmFsc2UsIG90aGVyd2lzZSBcdTIxOTIgdHJ1ZVxuICAgICAgICAgICAgY29uc3QgaGFzRWZmZWN0aXZlRW52ID0gZW52aXJvbm1lbnRJZGVudGlmaWVyIHx8IHRoaXMuX2VudkV4cGxpY2l0bHlTZXQ7XG4gICAgICAgICAgICB1c2VQcmV2aWV3ID0gcHJldmlldyA9PT0gdHJ1ZSA/IHRydWUgOiAocHJldmlldyA9PT0gZmFsc2UgPyBmYWxzZSA6ICFoYXNFZmZlY3RpdmVFbnYpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBgJHtjb21wb25lbnRJZH06JHtlbnZ9OiR7dXNlUHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdbQ2xvdWRSZXBvc2l0b3J5XSBmZXRjaENvbXBvbmVudFYyJywge1xuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbXBvbmVudElkLnNsaWNlKDAsIDgpICsgJy4uLicsXG4gICAgICAgICAgICBlbnYsXG4gICAgICAgICAgICB1c2VQcmV2aWV3LFxuICAgICAgICAgICAgY2FjaGVLZXksXG4gICAgICAgICAgICBjYWNoZWQ6IGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHNcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSkge1xuICAgICAgICAgICAgLy8gVHJhY2sgdGhpcyBhcyBwcmVsb2FkZWQgKGZpcnN0IGZldGNoIGNvdW50cyBhcyBwcmVsb2FkKVxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVsb2FkZWRDb21wb25lbnRzW2NvbXBvbmVudElkXSA9IHsgZW52LCBwcmV2aWV3OiB1c2VQcmV2aWV3IH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmw6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0aWNNb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IHVzZVByZXZpZXcgPyAncHJldmlldycgOiBlbnY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsID0gYCR7dGhpcy5fYmFzZVVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2ZpbGV9Lmpzb25gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBgJHt0aGlzLl9iYXNlVXJsfS9jb25zdW1lP2lkPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnByZXZpZXc9dHJ1ZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgY29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiAoJHtyZXMuc3RhdHVzfSR7dGhpcy5fc3RhdGljTW9kZSA/IGAgZnJvbSAke3VybH1gIDogJyd9KWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBqc29uLml0ZW07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50LmNvbnN1bWVfdmFyaWFudCB8fCAhdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCJgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcodmFyaWFudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWcgdGhlIFByb21pc2Ugc28gZ2V0UmVzb2x2ZWRDb25maWcgY2FuIHJlYWQgaXQgc3luY2hyb25vdXNseVxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBjb21wb25lbnRDb25maWc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBjYWNoZWQgcmVqZWN0ZWQgcHJvbWlzZSBzbyB0aGUgbmV4dCBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlcyBhIGZyZXNoIHJlcXVlc3QgKGUuZy4gYWZ0ZXIgbmV0d29yayByZWNvdmVyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3luY2hyb25vdXMgdmVyc2lvbiBvZiBmZXRjaENvbXBvbmVudFYyIFx1MjAxNCByZXR1cm5zIHRoZSBjb25maWcgb25seSBpZlxuICAgICAqIHRoZSBmZXRjaCBhbHJlYWR5IGNvbXBsZXRlZCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBVc2VzIHRoZSBzYW1lIGB0aGlzLnZhcmlhbnRzYCBjYWNoZSB0aGF0IGZldGNoQ29tcG9uZW50VjIvcHJlbG9hZENvbXBvbmVudHNcbiAgICAgKiBwb3B1bGF0ZS4gRWFjaCBjYWNoZWQgUHJvbWlzZSBpcyB0YWdnZWQgd2l0aCBhIGAucmVzb2x2ZWRgIHByb3BlcnR5IHdoZW5cbiAgICAgKiBpdCBzZXR0bGVzIFx1MjAxNCB0aGlzIG1ldGhvZCBqdXN0IHJlYWRzIHRoYXQgcHJvcGVydHkuIE5vIHNlcGFyYXRlIGNhY2hlLlxuICAgICAqXG4gICAgICogV2h5IHRoaXMgZXhpc3RzOiBSZWFjdCBOYXRpdmUgbmVlZHMgdGhlIGNvbmZpZyBhdCByZW5kZXIgdGltZSB0byBlbWJlZCBpdFxuICAgICAqIGluIHRoZSBXZWJWaWV3IEhUTUwgKGNhbid0IGF3YWl0IGluIHVzZVN0YXRlKS4gSWYgcHJlbG9hZENvbXBvbmVudHMgcmFuXG4gICAgICogZWFybGllciBhbmQgdGhlIGZldGNoIGNvbXBsZXRlZCwgdGhpcyByZXR1cm5zIHRoZSByZXN1bHQgc3luY2hyb25vdXNseSxcbiAgICAgKiBza2lwcGluZyB0aGUgV0VCVklFV19SRUFEWSBcdTIxOTIgZmV0Y2ggXHUyMTkyIGluamVjdCByb3VuZCB0cmlwIGVudGlyZWx5LlxuICAgICAqL1xuICAgIGdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBJQ29tcG9uZW50Q29uZmlnIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHByZWxvYWRlZCA9IHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0UGFyYW1zID0gZW52ICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCByZXNvbHZlZEVudjogc3RyaW5nO1xuICAgICAgICBsZXQgdXNlUHJldmlldzogYm9vbGVhbjtcblxuICAgICAgICBpZiAoIWhhc0V4cGxpY2l0UGFyYW1zICYmIHByZWxvYWRlZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWRFbnYgPSBwcmVsb2FkZWQuZW52O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZWxvYWRlZC5wcmV2aWV3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZWRFbnYgPSBlbnYgfHwgdGhpcy5fZGVmYXVsdEVudjtcbiAgICAgICAgICAgIGNvbnN0IGhhc0VmZmVjdGl2ZUVudiA9IGVudiB8fCB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZXZpZXcgPT09IHRydWUgPyB0cnVlIDogKHByZXZpZXcgPT09IGZhbHNlID8gZmFsc2UgOiAhaGFzRWZmZWN0aXZlRW52KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29tcG9uZW50SWR9OiR7cmVzb2x2ZWRFbnZ9OiR7dXNlUHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gO1xuICAgICAgICByZXR1cm4gdGhpcy52YXJpYW50c1tjYWNoZUtleV0/LnJlc29sdmVkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYxIE1ldGhvZHMgKExlZ2FjeSkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYxIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEF1dG9GbG93KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEF1dG9GbG93KGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2Zsb3dJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tmbG93SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBmZXRjaENvbXBvbmVudFYyIG9yIGZldGNoQ29tcG9uZW50VjEgZXhwbGljaXRseVxuICAgICAqIERlZmF1bHRzIHRvIHYxIGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkLCBmbG93SWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2xvdWRSZXBvc2l0b3J5IGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHYyX0Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeTtcbiIsICJpbXBvcnQgeyBDbG91ZFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9DbG91ZFJlcG9zaXRvcnlcIjtcblxubGV0IF9jbG91ZFJlcG9zaXRvcnkgPSBDbG91ZFJlcG9zaXRvcnkuTWFpbjtcblxuZXhwb3J0IGNvbnN0IGdldENsb3VkUmVwb3NpdG9yeSA9ICgpID0+IF9jbG91ZFJlcG9zaXRvcnk7XG5cbmV4cG9ydCBjb25zdCBpc1ByZWxvYWRlZCA9IChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuaXNQcmVsb2FkZWQoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UHJlbG9hZGVkUGFyYW1zID0gKGNvbXBvbmVudElkOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5nZXRQcmVsb2FkZWRQYXJhbXMoY29tcG9uZW50SWQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGVuYWJsZUxvY2FsRGV2ID0gKCkgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KFwiaHR0cDovL2xvY2FsaG9zdDo5MjkyXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldENsb3VkUmVwb3NpdG9yeVVybCA9ICh1cmw6IHN0cmluZykgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KHVybCk7XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyZSB0aGUgU0RLIHRvIGZldGNoIGNvbXBvbmVudHMgZnJvbSBhIHNlbGYtaG9zdGVkIHN0YXRpYyByZWdpc3RyeSAoUzMsIENETiwgZXRjLilcbiAqIGluc3RlYWQgb2YgdGhlIE15b3AgY2xvdWQuIENvbXBvbmVudHMgYXJlIHNlcnZlZCBhcyBzdGF0aWMgSlNPTiBmaWxlczpcbiAqICAgYCR7Y2RuVXJsfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9LyR7ZW52aXJvbm1lbnR9Lmpzb25gXG4gKi9cbmV4cG9ydCBjb25zdCBlbmFibGVTZWxmSG9zdGVkID0gKGNkblVybDogc3RyaW5nKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoY2RuVXJsKTtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LmVuYWJsZVN0YXRpY01vZGUoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDbG91ZFJlcG9zaXRvcnkgPSAocmVwb3NpdG9yeTogQ2xvdWRSZXBvc2l0b3J5KSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RW52aXJvbm1lbnQgPSAoZW52OiBzdHJpbmcpID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5LnNldEVudmlyb25tZW50KGVudik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzb2x2ZWRDb25maWcgPSAoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbikgPT4ge1xuICAgIHJldHVybiBfY2xvdWRSZXBvc2l0b3J5LmdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkLCBlbnYsIHByZXZpZXcpO1xufTtcblxuZXhwb3J0IGNvbnN0IHByZWxvYWRDb21wb25lbnRzID0gYXN5bmMgKGlkczogc3RyaW5nW10sIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pID0+IHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgICBpZHMubWFwKChpZCkgPT4gX2Nsb3VkUmVwb3NpdG9yeS5mZXRjaENvbXBvbmVudFYyKGlkLCBlbnYsIHByZXZpZXcpKSxcbiAgICApO1xufTtcbiIsICJpbXBvcnQge2RlY29tcHJlc3NVVUlEc30gZnJvbSBcIi4uL3V0aWxzL3V1aWQudHNcIjtcbmltcG9ydCB7Q2xvdWRSZXBvc2l0b3J5fSBmcm9tIFwiLi4vaGVscGVyc1wiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZywgSURlZGljYXRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRlZFNraW5Db25maWcsXG4gICAgSVNlZ21lbnRFeHBlcmllbmNlLCBJU2tpbkluc3RhbmNlQ29uZmlnLFxuICAgIFNraW5TZWxlY3RvclR5cGVzXG59IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNvbnN0IGNoZWNrTXlvcE92ZXJyaWRlID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyk6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZyB8IG51bGw+ID0+IHtcbiAgICB0cnkge1xuICAgICAgICAvL1RPRE86IHN1cHBvcnQgZGlzYWJsaW5nIHRoZSBtZWNoYW5pc21cbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXModXJsLnNlYXJjaCk7XG4gICAgICAgIGNvbnN0IG15b3BPdmVycmlkZSA9IHBhcmFtcy5nZXQoJ215b3BPdmVycmlkZScpO1xuICAgICAgICBpZiAobXlvcE92ZXJyaWRlKSB7XG4gICAgICAgICAgICBjb25zdCBbc291cmNlLCAuLi51dWlkc10gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcblxuICAgICAgICAgICAgc3dpdGNoIChzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtjb21wb25lbnRJZCwgc2tpbklkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogY2hlY2sgZmV0Y2hBdXRvRmxvdy4gTG9va3MgbGlrZSBvbmx5IG9uZSBza2luIGlzIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBza2luID0gY29tcG9uZW50VG9PdmVycmlkZS50eXBlLnNraW5zLmZpbmQoc2tpbiA9PiBza2luLmlkID09PSBza2luSWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBmb3Igbm93IGp1c3Qgc2V0IHNraW4gaWQuIENoZWNrIHRoZSBjbG91ZCBpbXBsZW1lbnRhdGlvblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHNraW5JZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElTa2luSW5zdGFuY2VDb25maWdcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vICAgIGNhc2UgJ2Zsb3cnOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdCA6IHtcbiAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSBkZWNvbXByZXNzVVVJRHMobXlvcE92ZXJyaWRlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUb092ZXJyaWRlID0gZmxvdy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IGNvbXBvbmVudENvbmZpZy50eXBlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3Rvci50eXBlID09PSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBlcmllbmNlID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLmZpbmQoZSA9PiBlLmlkID09PSBleHBlcmltZW50SWQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZEV4cGVyaWVuY2U/LnR5cGUgPT09IEV4cGVyaWVuY2VUeXBlcy5TZWdtZW50KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlID0gcmVzb2x2ZWRFeHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yIGFzIElTZWdtZW50ZWRTa2luQ29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gdHlwZWRTa2luU2VsZWN0b3Iuc2VnbWVudHMuZmluZChzID0+IHMuc2VnbWVudElkID09PSB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZS5zZWdtZW50LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSBzZWdtZW50Py5za2luU2VsZWN0b3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0lNeW9wTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0lNeW9wTG9hZGVyXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEVudmVsb3BlZE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLCBNZXNzYWdlRGlyZWN0aW9uLCBSZWZcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BJZnJhbWVMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvaWZyYW1lTG9hZGVyXCI7XG5pbXBvcnQge1dlYmNvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy93ZWJjb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB0eXBlIHtJZnJhbWVTREt9IGZyb20gXCIuLi9JZnJhbWVcIjtcbmltcG9ydCB7Y29ubmVjdFByb3BzLCBjb25uZWN0UmVmcywgY3JlYXRlUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLCBJRXhwZXJpZW5jZSwgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQsIElTZWdtZW50ZWRTa2luQ29uZmlnLCBJU2VnbWVudEV4cGVyaWVuY2UsXG4gICAgSVNraW5Db25maWcsIElTa2luU2VsZWN0b3JDb25maWcsIFNraW5TZWxlY3RvclR5cGVzLFxuXG5cbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7SFRNTENvbXBvbmVudExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9IVE1MQ29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQge2NoZWNrTXlvcE92ZXJyaWRlfSBmcm9tIFwiLi9teW9wT3ZlcnJpZGUudHNcIjtcblxuaW50ZXJmYWNlIGNvbXBvbmVudExvYWRlckNyZWF0b3Ige1xuICAgIG5ldyhsb2FkZXJzOiBJTXlvcExvYWRlcltdKTogYW55O1xufVxuXG4vLyBjb25zdCBnZXRDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXN5bmMgKGlkOiBzdHJpbmcpID0+IHtcbi8vICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgaHR0cDovL2xvY2FsaG9zdDozMDAwL2NvbXBvbmVudD9pZD0ke2lkfWApO1xuLy8gICAgIGNvbnN0IGNvbXBvbmVudERlZjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgPSAoYXdhaXQgcmVzLmpzb24oKSkuaXRlbTtcbi8vICAgICByZXR1cm4gY29tcG9uZW50RGVmXG4vLyB9XG5cbi8vY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9kZmRsazJwMW0xODd2LmNsb3VkZnJvbnQubmV0L215b3Bfc2RrLm1pbi5qcydcbmNvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0L215b3Bfc2RrLm1pbi5qcydcblxuLyoqXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgSG9zdFNESyB7XG4gICAgc3RhdGljIEluc3RhbmNlID0gKCkgPT4gd2luZG93Lm15b3AuaG9zdFNESztcblxuICAgIGNvbXBvbmVudHMyaW5pdDogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzTG9hZGVyczogSU15b3BMb2FkZXJbXSA9IFtdO1xuXG4gICAgcHVibGljIGluaXRpYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgcHVibGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgdHlwZTJJbnN0YW5jZUNvdW50OiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gICAgcHVibGljIGFzc2lnbklkID0gKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0pIHtcbiAgICAgICAgICAgIHRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdID0gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Y29tcG9uZW50RGVmaW5pdGlvbi5pZH1fJHsrK3RoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdfWA7XG4gICAgfVxuXG4gICAgLy9UT0RPIDogZml4IHRoZSBpbnNwZWN0IGltcGxlbWVudGF0aW9uIGluc2lkZSByZWZDb21wb25lbnRcbiAgICAvL3RoZW4gaW5zcGVjdGVkIG1heWJlIGNhbiBiZSBkcm9wcGVkXG4gICAgcHJpdmF0ZSBpbnNwZWN0ZWQgPSBmYWxzZTtcbiAgICBwdWJsaWMgaW5zcGVjdCA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5zcGVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMuaW5zcGVjdGVkID0gdHJ1ZTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5pbnNwZWN0KSB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Lmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5jb21pbmdNZXNzYWdlSGFuZGxlciA9IChldmVudDogTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4pID0+IHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnaW5jb21pbmdNZXNzYWdlSGFuZGxlciBHT1QgJywgZXZlbnQpXG4gICAgICAgIC8vVE9ETyA6ICBpZiAoZXZlbnQub3JpZ2luICE9PSBcImh0dHA6Ly9leGFtcGxlLm9yZzo4MDgwXCIpIHJldHVybjtcbiAgICAgICAgaWYgKGV2ZW50Lm9yaWdpbiA9PT0gZG9jdW1lbnQubG9jYXRpb24ub3JpZ2luKSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdJIEtub3cgdGhhdCAhISEnKTtcbiAgICAgICAgICAgIC8vICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy9jb25zb2xlLmxvZyhcImV2ZW50IG9uIGhvc3Qgc2lkZSBcIiwgZXZlbnQpO1xuXG4gICAgICAgIGlmIChldmVudC5kYXRhLm15b3ApIHtcbiAgICAgICAgICAgIGlmIChldmVudC5kYXRhLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi51cCAmJiBldmVudC5kYXRhLm1lc3NhZ2VUeXBlICE9PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBob3N0c2RrLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UgPSBldmVudC5kYXRhO1xuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0LmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEluaXRNZXNzYWdlKGNvbXBvbmVudC5pZCkpXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0UmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBjb21wb25lbnRzIDIgaW5pdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdCA9IHRoaXMuY29tcG9uZW50czJpbml0LmZpbHRlcihjb21wb25lbnQgPT4gY29tcG9uZW50LmlkICE9PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50LmlkKVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5pdGlhdGVkQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudD8uaWQpO1xuICAgICAgICAgICAgICAgIGluaXRpYXRlZENvbXBvbmVudD8uc2V0SW5pdGlhdGVkKClcbiAgICAgICAgICAgICAgICAvL2luaXRpYXRlZENvbXBvbmVudD8ucGFyZW50Py5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobXlvcE1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSBteW9wTWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLmRlc3RpbmF0aW9uKTtcblxuICAgICAgICAgICAgICAgIGlmIChyZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTWVzc2FnZS5kaXJlY3Rpb24gPT09IE1lc3NhZ2VEaXJlY3Rpb24uZG93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTWVzc2FnZS5tZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRNZXNzYWdlLm1lc3NhZ2Uucm91dGUgPSB0eXBlZE1lc3NhZ2Uucm91dGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5uZXJDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UubWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lckNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBsb2cgP1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL2NvbXBvbmVudC5yZWZzLmJvZHkub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UubWVzc2FnZSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IG15b3BNZXNzYWdlLmRlc3RpbmF0aW9uKTtcblxuICAgICAgICAgICAgaWYgKCFjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAvL25vIGluIG1lbSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAvL3Bhc3MgdG8gcGFyZW50IEhvc3RTREsgdG8gdHJ5IHByb2Nlc3MgdGhlcmVcbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESy5tZXNzYWdlVG9Ib3N0KG15b3BNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vbm90IHByb2Nlc3NlZCBpbiBvbk1lc3NhZ2VSZWNlaXZlZFxuICAgICAgICAgICAgICAgICAgICAvL3Bhc3MgdG8gcGFyZW50IEhvc3RTREsgdG8gdHJ5IHByb2Nlc3MgdGhlcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESylcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESy5tZXNzYWdlVG9Ib3N0KG15b3BNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBldmVudC5zb3VyY2UucG9zdE1lc3NhZ2UoXG4gICAgICAgIC8vICAgICBcImhpIHRoZXJlIHlvdXJzZWxmISAgdGhlIHNlY3JldCByZXNwb25zZSBcIiArIFwiaXM6IHJoZWVlZWV0IVwiLFxuICAgICAgICAvLyAgICAgZXZlbnQub3JpZ2luLFxuICAgICAgICAvLyAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHN5bnRoZXRpY0V2ZW50ID0gbmV3IE1lc3NhZ2VFdmVudDxCYXNlTXlvcE1lc3NhZ2U+KCcnLFxuICAgICAgICAgICAge2RhdGE6IG1lc3NhZ2V9XG4gICAgICAgIClcblxuICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIoc3ludGhldGljRXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0ID0gKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzPzogY29tcG9uZW50TG9hZGVyQ3JlYXRvcltdKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYXRlZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdob3N0U0RLIGFscmVhZHkgaW5pdGlhdGVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNpY0xvYWRlcnMgPSBbXG4gICAgICAgICAgICBuZXcgTXlvcElmcmFtZUxvYWRlcigpLFxuICAgICAgICAgICAgbmV3IFdlYmNvbXBvbmVudExvYWRlcigpLFxuICAgICAgICAgICAgbmV3IEhUTUxDb21wb25lbnRMb2FkZXIoKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBbXG4gICAgICAgICAgICAuLi5iYXNpY0xvYWRlcnNcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMpIHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBsb2FkZXJCeVR5cGU6IFJlY29yZDxzdHJpbmcsIElNeW9wTG9hZGVyPiA9IHt9O1xuXG4gICAgICAgICAgICBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycy5mb3JFYWNoKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUxvYWRlciA9IG5ldyBjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yKHRoaXMuY29tcG9uZW50c0xvYWRlcnMpO1xuICAgICAgICAgICAgICAgIGxvYWRlckJ5VHlwZVtjdXN0b21Mb2FkZXIudHlwZV0gPSBjdXN0b21Mb2FkZXI7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZvckVhY2gobG9hZGVyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWxvYWRlckJ5VHlwZVtsb2FkZXIudHlwZV0pXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlckJ5VHlwZVtsb2FkZXIudHlwZV0gPSBsb2FkZXI7XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gT2JqZWN0LnZhbHVlcyhsb2FkZXJCeVR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5jb21taW5nIG1lc3NhZ2VzIGZyb20gSUZyYW1lc1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgIFwibWVzc2FnZVwiLFxuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyLFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ215b3AgaG9zdFNESyBpbml0aWF0ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgdGhpcy5pbml0aWF0ZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yID0gYXN5bmMgKHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZywgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW10gPSBbXSwgaG9va3M/OiBsb2FkZXJIb29rcyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gICAgICAgIGFzeW5jIGZ1bmN0aW9uIGFzeW5jRmluZDxUPihcbiAgICAgICAgICAgIGFycmF5OiBUW10sXG4gICAgICAgICAgICBwcmVkaWNhdGU6IChpdGVtOiBUKSA9PiBQcm9taXNlPGJvb2xlYW4+XG4gICAgICAgICk6IFByb21pc2U8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgaWYgKGF3YWl0IHByZWRpY2F0ZShpdGVtKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBSZXR1cm4gdW5kZWZpbmVkIGlmIG5vIG1hdGNoIGlzIGZvdW5kXG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHNraW5TZWxlY3Rvci50eXBlKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjYXNlIFwiRGVkaWNhdGVkU2tpblwiIDogLy9iYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZDoge1xuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFNraW5JZCA9IChza2luU2VsZWN0b3IgYXMgSURlZGljYXRlZFNraW5Db25maWcpLnNraW4/LmlkXG4gICAgICAgICAgICAgICAgICAgIHx8IChza2luU2VsZWN0b3IgYXMgSURlZGljYXRlZFNraW5Db25maWcpLnNraW5zIVswXS5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFNraW5JZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSAoc2tpblNlbGVjdG9yIGFzIElTZWdtZW50ZWRTa2luQ29uZmlnKVxuICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSBhd2FpdCBhc3luY0ZpbmQodHlwZWRTa2luU2VsZWN0b3Iuc2VnbWVudHMsIGFzeW5jIHNlZ21lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5zZWdtZW50SWQgPT09ICdEZWZhdWx0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBlcmllbmNlID0gZXhwZXJpZW5jZXMuZmluZChleHBlcmllbmNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHBlcmllbmNlLnR5cGUgPT09IEV4cGVyaWVuY2VUeXBlcy5TZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZSkuc2VnbWVudC5pZCA9PT0gc2VnbWVudC5zZWdtZW50SWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFleHBlcmllbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBlcmllbmNlIG5vdCBmb3VuZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkRXhwZXJpZW5jZSA9IGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNlZ21lbnQgPSAodHlwZWRFeHBlcmllbmNlLnNlZ21lbnQgYXMgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQpXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudEZ1bmN0aW9uID0gKGhvb2tzID8gaG9va3MgOiB7fSlbdHlwZWRTZWdtZW50LmZ1bmN0aW9uXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnRGdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHNlZ21lbnRGdW5jdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYHNlZ21lbnRJZDoke3NlZ21lbnQuc2VnbWVudElkfSwgJHt0eXBlZFNlZ21lbnQuZnVuY3Rpb259IGZ1bmN0aW9uIG5vdCBwcm92aWRlZCAhYClcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWdtZW50KVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U2tpbklkQnlTa2luU2VsZWN0b3Ioc2VnbWVudC5za2luU2VsZWN0b3IsIGV4cGVyaWVuY2VzKTtcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJyAvL1RPRE9cbiAgICB9XG5cbiAgICBwcml2YXRlIHJ1blNraW5TZWxlY3RvciA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGhvb2tzPzogbG9hZGVySG9va3MpID0+IHtcbiAgICAgICAgY29uc3Qgc2tpbklkID0gYXdhaXQgdGhpcy5fZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnNraW5TZWxlY3RvciwgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMsIGhvb2tzKTtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudENvbmZpZy50eXBlLnNraW5zLmZpbmQoc2tpbiA9PiBza2luLmlkID09PSBza2luSWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBsb2FkZXJIb29rcz86IGxvYWRlckhvb2tzO1xuXG4gICAgcHVibGljIGxvYWRDb21wb25lbnQgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29udGFpbmVyPzogSFRNTEVsZW1lbnQgfCBSZWYsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKTpcbiAgICAgICAgUHJvbWlzZTxUPiA9PiB7XG5cbiAgICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdubyBjb250YWluZXIgd2FzIGZvdW5kIGZvciB0aGlzIGNvbXBvbmVudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgb3ZlcnJpZGRlbkNvbmZpZyA9IGF3YWl0IGNoZWNrTXlvcE92ZXJyaWRlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgIGlmIChvdmVycmlkZGVuQ29uZmlnKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBsb2dcbiAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IG92ZXJyaWRkZW5Db25maWc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vIGlmICghY29udGFpbmVyLl9fbm9uUHJveGllZCkge1xuICAgICAgICAvLyAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gKGNvbnRhaW5lciBhcyB1bmtub3duIGFzIE15b3BSZWZDb21wb25lbnQpO1xuICAgICAgICAvLyAgICAgLy9pZiB3ZSBnb3QgbG9hZENvbXBvbmVudCBvdmVyIE15b3BSZWZDb21wb25lbnRcbiAgICAgICAgLy8gICAgIGlmIChyZWZDb21wb25lbnQuaWQgJiYgcmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiB0aGlzLmxvYWRDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLCByZWZDb21wb25lbnQucmVmLCBvcHRpb25zKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyBsZXQgcm9vdENvbXBvbmVudDogSU15b3BDb21wb25lbnQgPSByZWZDb21wb25lbnQ7XG4gICAgICAgIC8vICAgICAgICAgLy8gd2hpbGUoIXJvb3RDb21wb25lbnQuZWxlbWVudCAmJiByb290Q29tcG9uZW50LnBhcmVudCl7XG4gICAgICAgIC8vICAgICAgICAgLy8gICAgIHJvb3RDb21wb25lbnQgPSByb290Q29tcG9uZW50LnBhcmVudFxuICAgICAgICAvLyAgICAgICAgIC8vIH1cbiAgICAgICAgLy8gICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIHJvb3RDb21wb25lbnQuZWxlbWVudFxuICAgICAgICAvLyAgICAgICAgIC8vIC8vd2hhdCBub3cgP1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgY29uc3QgaG9va3MgPSB7Li4uKHRoaXMubG9hZGVySG9va3MgPz8ge30pLCAuLi4ob3B0aW9ucz8uaG9va3MgPz8ge30pfTtcblxuICAgICAgICBjb25zdCByZWYgPSBjb250YWluZXIgYXMgUmVmO1xuICAgICAgICBpZiAocmVmLm15b3ApIHtcbiAgICAgICAgICAgIGlmIChyZWYuY29tcG9uZW50KSB7XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSB7Li4uY29tcG9uZW50Q29uZmlnfTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2UgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNvbXBvbmVudENvbmZpZy5pbnN0YW5jZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFNraW4gPSBhd2FpdCB0aGlzLnJ1blNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcsIGhvb2tzKSFcbiAgICAgICAgICAgICAgICBpZiAoIXNlbGVjdGVkU2tpbikge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zPy5ob29rcz8uYWZ0ZXJTa2luU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICBza2luOiBzZWxlY3RlZFNraW5cbiAgICAgICAgICAgICAgICAgICAgLy8gIHNraW5zOiBbc2VsZWN0ZWRTa2luXVxuICAgICAgICAgICAgICAgIH0gYXMgSURlZGljYXRlZFNraW5Db25maWdcblxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSB7Li4ub3B0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnMuaG9va3NcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQ8VD4ocmVmLCBjb21wb25lbnRDb25maWcsIHRoaXMuY29tcG9uZW50cywgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjb25uZWN0IHJlZnMgYW5kIHByb3BzIGluc29kZSBjcmVhdGVSZWZDb21wb25lbnQsIGVsc2V3aGVyZSBpdHMgbm90IHJlYWxseSA8VD5cbiAgICAgICAgICAgICAgICByZXR1cm4gcmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2xvYWQgY29tcG9uZW50IGdvdCBhIGRldGFjaGVkIHJlZi4nKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGFpbmVyID0gY29udGFpbmVyIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKlxuICAgICAgICAgKiBjaG9vc2Ugc2tpbiBvbiBydW50aW1lIC4uLlxuICAgICAgICAgKiAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnNraW5TZWxlY3Rvci50eXBlXG4gICAgICAgICAqL1xuXG4gICAgICAgIGxldCBzZWxlY3RlZFNraW4gPSBhd2FpdCB0aGlzLnJ1blNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcsIGhvb2tzKSFcblxuICAgICAgICBpZiAoIXNlbGVjdGVkU2tpbikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5ob29rcz8uYWZ0ZXJTa2luU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudExvYWRlciA9IHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZmluZChsb2FkZXIgPT4gbG9hZGVyLnR5cGUgPT09IHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSk7XG5cbiAgICAgICAgaWYgKCFjb21wb25lbnRMb2FkZXIpIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBsb2FkZXIgXCIke3NlbGVjdGVkU2tpbi5sb2FkZXIudHlwZX1cIiB3YXMgZm91bmQgZm9yIGNvbXBvbmVudGApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9mb3IgbG9hZGVkIHdlYmNvbXBvbmVudCBtb2R1bGVzIHRvIGZvbGxvd2luZyBsaW5lIGNyZWF0ZXMgYSByYWNlIGNvbmRpdGlvbiB3aXRoIHRoZSBpbml0IG1lc3NhZ2UgZmxvd1xuICAgICAgICBsZXQgY29tcG9uZW50ID0gYXdhaXQgY29tcG9uZW50TG9hZGVyLmxvYWQoY29tcG9uZW50Q29uZmlnLnR5cGUsIHNlbGVjdGVkU2tpbiwgY29udGFpbmVyLCBvcHRpb25zKTtcblxuICAgICAgICAvLyBUT0RPIDogd2hlbiB0aGlzIGlzIG5vdCB0cnVlID9cbiAgICAgICAgaWYgKCFjb21wb25lbnQuaXNJbml0aWF0ZWQpXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5wdXNoKGNvbXBvbmVudClcblxuICAgICAgICBjb21wb25lbnQuYmluZCgnb25EaXNwb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY29tcG9uZW50IGRpc3Bvc2UnLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcblxuICAgICAgICAvLyB0cnVlIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMuY29ubmVjdFByb3BzICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSB0eXBlIGZpZWxkIGNvbmRpdGlvbmFsIHR5cGUgaW5mZXIgXCJzdHJpbmdcIiA+IHN0cmluZywgXCJudW1iZXJcIiA+IG51bWJlciwgZXRjLi4uXG4gICAgICAgICAgICBjb21wb25lbnQgPSBjb25uZWN0UHJvcHMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcudHlwZS5wcm9wcywgc2VsZWN0ZWRTa2luKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIG9wdGlvbmFsP1xuICAgICAgICAgICAgLy9UT0RPIDogZml4IGlzc3VlcyB3aXRoIHRpbWVvdXQgYW5kIHdyb25nIHJlZiBuYW1lcyBmcm9tIGNvbmZpZyB2cyBjdXJyZW50IHNraW5cbiAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIFRPT0QgOiB0aHJvdyA/XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcHRpb25zPy5za2lwSW5pdClcbiAgICAgICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICByZXR1cm4gY29tcG9uZW50IGFzIFQ7XG4gICAgfVxuXG4gICAgcHVibGljIG5hdmlnYXRlID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBuZXdDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIG9wdGlvbnM/OiBuYXZpZ2F0aW9uT3B0aW9ucykgPT4ge1xuICAgICAgICBpZiAoY29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOYXZpZ2F0aW5nIG9uIHJlbW90ZSByZWYgY29tcG9uZW50cyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2NvbXBvbmVudC5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgLy8gaWYgKG9wdGlvbnM/LmlucGxhY2UpIHtcbiAgICAgICAgLy8gICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAvLyAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAgICAgYXdhaXQgbmV3Q29tcG9uZW50LmluaXRpYXRlZCgpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgIC8vICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgICAgIHRocm93IG5ldyBFcnJvcignLi4uJylcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGlmIChvcHRpb25zPy5zdGFnZWQpIHtcbiAgICAgICAgICAgIC8vY29uc3Qgc2VsZWN0ZWRTa2luID0gdGhpcy5ydW5Ta2luU2VsZWN0b3IobmV3Q29tcG9uZW50Q29uZmlnKVxuICAgICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICBoaWRkZW46IHRydWUsXG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtkaXJlY3Rpb246ICdhZnRlcicsIGNoaWxkOiBjb21wb25lbnQuZWxlbWVudCF9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAgICAgICAgIGF3YWl0IG9wdGlvbnMuaW5pdChuZXdDb21wb25lbnQpO1xuXG4gICAgICAgICAgICBuZXdDb21wb25lbnQuc2hvdygpO1xuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiBuZXdDb21wb25lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IGNvbXBvbmVudC5lbGVtZW50IS5uZXh0U2libGluZztcblxuICAgICAgICAgICAgY29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgcmVsYXRpdmU6IHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uOiBcImJlZm9yZVwiLFxuICAgICAgICAgICAgICAgICAgICBjaGlsZDogbmV4dFNpYmxpbmcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgbmF2aWdhdGlvbk9wdGlvbnMgPSB7XG4gICAgc3RhZ2VkPzogYm9vbGVhbixcbiAgICAvL2lucGxhY2U/OiBib29sZWFuLFxuICAgIGluaXQ/OiAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4gUHJvbWlzZTx2b2lkPlxuICAgIHNraXBJbml0PzogYm9vbGVhblxufSAmIGxvYWRlck9wdGlvbnNcblxudHlwZSByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb24gPSAnYmVmb3JlJyB8ICdhZnRlcic7XG5cblxuZXhwb3J0IHR5cGUgbG9hZGVySG9va3MgPSB7XG4gICAgYWZ0ZXJTa2luU2VsZWN0ZWQ/OiAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4gUHJvbWlzZTxJU2tpbkNvbmZpZz5cbn0gJlxuICAgIC8vIHNlZ21lbnRhdGlvbiBob29rc1xuICAgICh7IFtrZXk6IHN0cmluZ106ICgpID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuIH0gfCB7fSlcblxuLy9UT0RPOiBzdXBwb3J0IHNlcmlhbGl6YWJsZSB2ZXJzaW9uIG9mIHRoYXQgb2JqZWN0XG5leHBvcnQgaW50ZXJmYWNlIHJlbGF0aXZlTG9hZENvbmZpZyB7XG4gICAgLy9JZiB0aGlzIGlzIG51bGwsIHRoZW4gbmV3Tm9kZSBpcyBpbnNlcnRlZCBhdCB0aGUgZW5kIG9mIG5vZGUncyBjaGlsZCBub2Rlcy5cbiAgICAvL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Ob2RlL2luc2VydEJlZm9yZVxuICAgIGNoaWxkOiBDaGlsZE5vZGUgfCBudWxsXG4gICAgZGlyZWN0aW9uOiByZWxhdGl2ZUxvYWRDb25maWdEaXJlY3Rpb25cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW52aXJvbm1lbnQge1xuICAgIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG50eXBlIEVsZW1lbnRBdHRyaWJ1dGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCB1bmRlZmluZWQgfCBudWxsO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBsb2FkZXJPcHRpb25zIHtcbiAgICBpZD86IHN0cmluZ1xuICAgIGhpZGRlbj86IGJvb2xlYW5cbiAgICBjb25uZWN0UHJvcHM/OiBib29sZWFuXG4gICAgdGltZW91dD86IG51bWJlclxuICAgIHNraXBJbml0PzogYm9vbGVhblxuICAgIHJlbGF0aXZlPzogcmVsYXRpdmVMb2FkQ29uZmlnXG4gICAgaG9va3M/OiBsb2FkZXJIb29rc1xuICAgIGVsZW1lbnRBdHRyaWJ1dGVzPzogRWxlbWVudEF0dHJpYnV0ZXNcbiAgICBfZW52aXJvbm1lbnQ/OiBJRW52aXJvbm1lbnRcbiAgICBfaGFzUGFyZW50PzogYm9vbGVhblxuICAgIF9pbnNwZWN0aW9uPzogYm9vbGVhblxuICAgIGRhdGE/OiBhbnlcbiAgICAvKipcbiAgICAgKiBDb250cm9sIGlmcmFtZSBhdXRvLXNpemluZyBiZWhhdmlvci5cbiAgICAgKiAtIHRydWUgKGRlZmF1bHQpOiBpZnJhbWUgYXV0by1zaXplcyB0byBjb250ZW50IGhlaWdodCwgd2lkdGggZmlsbHMgcGFyZW50LlxuICAgICAqIC0gZmFsc2U6IG5vIHNpemluZyBsb2dpYyBydW5zLiBObyBvYnNlcnZlcnMsIG5vIG1lYXN1cmVtZW50cywgbm8gc3R5bGUgY2hhbmdlcy5cbiAgICAgKiAgIFRoZSBpZnJhbWUgc3RheXMgYXQgcG9zaXRpb246YWJzb2x1dGUgZmlsbGluZyB0aGUgY29udGFpbmVyLlxuICAgICAqICAgVGhlIGhvc3QgaXMgZnVsbHkgcmVzcG9uc2libGUgZm9yIGNvbnRhaW5lciBkaW1lbnNpb25zLlxuICAgICAqL1xuICAgIGF1dG9TaXplPzogYm9vbGVhblxufVxuXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH07XG59XG5cbmlmICghd2luZG93Lm15b3AuaG9zdFNESykge1xuICAgIGNvbnN0IF9ob3N0U0RLID0gbmV3IEhvc3RTREsoKTtcbiAgICAvL1RPRE86IGVuYWJsZSBsYXp5IGluaXQ/XG4gICAgX2hvc3RTREsuaW5pdCgpO1xuXG4gICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93Lm15b3AuaG9zdFNESyA9IF9ob3N0U0RLO1xufVxuXG4vLyBAdHMtaWdub3JlXG5leHBvcnQgY29uc3QgaG9zdFNESzogSG9zdFNESyA9IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ2hvc3RTREsnLCBob3N0U0RLKTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBteW9wOiB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXzogc3RyaW5nLFxuICAgICAgICAgICAgaG9zdFNESzogSG9zdFNESyxcbiAgICAgICAgICAgIElmcmFtZVNESzogSW5zdGFuY2VUeXBlPHR5cGVvZiBJZnJhbWVTREs+XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50c1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2UgcmVmIGhlbHBlciBoZXJlXG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy8gd2UgbmVlZCBpdCB0byBwYXNzIHRoZSBhc3NpZ25lZCBpZHNcbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyZWZDb21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IHJlZkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpO1xuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICIvLyBAdHMtbm9jaGVja1xuZXhwb3J0IGNvbnN0IG9ic2VydmVET00gPSAob2JqOiBIVE1MRWxlbWVudCB8IG51bGwsIGNhbGxiYWNrOiAobXV0YXRpb25SZWNvcmRzPzogTXV0YXRpb25SZWNvcmRbXSkgPT4gdm9pZCkgPT4ge1xuICAgIGlmICghb2JqKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCduJyk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IE11dGF0aW9uT2JzZXJ2ZXIgPSB3aW5kb3cuTXV0YXRpb25PYnNlcnZlciB8fCB3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuICAgIGlmICghb2JqIHx8IG9iai5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuO1xuXG4gICAgaWYgKE11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgLy8gZGVmaW5lIGEgbmV3IG9ic2VydmVyXG4gICAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaylcbiAgICAgICAgLy8gaGF2ZSB0aGUgb2JzZXJ2ZXIgb2JzZXJ2ZSBmb3IgY2hhbmdlcyBpbiBjaGlsZHJlblxuICAgICAgICBjb25zdCBjb25maWcgPSB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlfTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKG9iaiwgY29uZmlnKVxuICAgICAgICByZXR1cm4gbXV0YXRpb25PYnNlcnZlclxuICAgIH1cblxuICAgIC8vIGJyb3dzZXIgc3VwcG9ydCBmYWxsYmFja1xuICAgIGVsc2UgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7XG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlSW5zZXJ0ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKCdET01Ob2RlUmVtb3ZlZCcsIGNhbGxiYWNrLCBmYWxzZSlcbiAgICB9XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7b2JzZXJ2ZURPTX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9kb21PYnNlcnZlclwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChldmVudC5zb3VyY2UpIHtcbiAgICAgICAgICAgIG9ic2VydmVET00oZG9jdW1lbnQuYm9keSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UoKVxuICAgICAgICAgICAgICAgICAgICAvLyAgbmV3IEVudmVsb3BlZE1lc3NhZ2UoZXZlbnQuc291cmNlISwgbmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKCkpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cblxuICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKCFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldIHx8ICFkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlIHx8IG5vZGVEYXRhLnZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFrZXkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2goZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRhdGFPYmplY3Q7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWxlbWVudC50eXBlID09PSAncmFkaW8nKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmNoZWNrZWQgPyBlbGVtZW50LnZhbHVlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaW5wdXQgYW5kIHRleHRhcmVhIGVsZW1lbnRzXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCBlbGVtZW50LnRhZ05hbWUgPT09ICdURVhUQVJFQScpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIHNlbGVjdCBlbGVtZW50cyAoZHJvcGRvd25zKVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBlZGl0YWJsZSBkaXZzIChjb250ZW50RWRpdGFibGUpXG4gICAgaWYgKGVsZW1lbnQuaXNDb250ZW50RWRpdGFibGUpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuaW5uZXJUZXh0IHx8IGVsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgfVxuXG4gICAgLy8gSWYgaXQncyBhbiB1bnN1cHBvcnRlZCBlbGVtZW50IHR5cGVcbiAgICByZXR1cm4gbnVsbDtcbn1cblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8R2V0RWxlbWVudFZhbHVlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0RWxlbWVudFZhbHVlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShcbiAgICAgICAgICAgICAgICBnZXRJbnB1dFZhbHVlKGl0ZW0pXG4gICAgICAgICAgICApLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlTWVzc2FnZSwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEZpcnN0RWxlbWVudEJ5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0QXR0cmlidXRlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gZ2V0Rmlyc3RFbGVtZW50QnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudClcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZShpdGVtLmdldEF0dHJpYnV0ZShldmVudC5uYW1lKSksIGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSwgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tICcuLi8uLi9tZXNzYWdlcydcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMpID0+IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHBhc3MgdGhlIGhlaWdodFxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZXNpemVPYnNlcnZlck1lc3NhZ2UoKSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvY3VtZW50LmJvZHkpO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICByZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KClcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIFNldElubmVySHRtbEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0SW5uZXJIdG1sPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRJbm5lckh0bWw7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0SW5uZXJIdG1sKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0uaW5uZXJIVE1MID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuICogQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuICogVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cbiAqXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtJZnJhbWVTREt9IGZyb20gJ0BteW9wL3Nkay9pZnJhbWUnO1xuIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgSW5pdFJlcXVlc3QsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXJcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldFJlc2l6ZU9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWxIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50c1wiO1xuXG4vKipcbiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiBCeSBpbXBvcnRpbmcgdGhlIElmcmFtZSBTREssIGRldmVsb3BlcnMgZ2FpbiBhY2Nlc3MgdG8gdG9vbHMgYW5kIHV0aWxpdGllcyBuZWNlc3NhcnkgZm9yIGhhbmRsaW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhbmQgdGhlIGVtYmVkZGVkIGlmcmFtZS1iYXNlZCBNeW9wIGNvbXBvbmVudHM8YnIvPjxici8+XG4gVGhpcyBTREsgZmFjaWxpdGF0ZXMgc2VjdXJlIGlzb2xhdGlvbiwgYWxsb3dpbmcgY29tcG9uZW50cyB0byBmdW5jdGlvbiBpbmRlcGVuZGVudGx5IHdoaWxlIHN0aWxsIGJlbmVmaXRpbmcgZnJvbSB0aGUgb3ZlcmFsbCBzdHJ1Y3R1cmUgYW5kIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGJ5IHRoZSBob3N0IGFwcGxpY2F0aW9uLjxici8+PGJyLz5cblxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJZnJhbWVTREsgZXh0ZW5kcyBCYXNlTXlvcFNESyB7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB3aW5kb3cubXlvcCA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsgPSB0aGlzO1xuICAgIH1cblxuICAgIG1lc3NhZ2VUb0hvc3QgPSAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudElkcyA9IE9iamVjdC5rZXlzKHRoaXMuY29tcG9uZW50cyk7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKSB7XG4gICAgICAgICAgICBpZiAocmVwbGF5VG8/LnJvdXRlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGFraW5nIHRoZSBmaXJzdCBjb21wb25lbnQgdGhhdCBpbml0aWF0ZWQgdGhhdCBjeWNsZVxuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSByZXBsYXlUby5yb3V0ZVtyZXBsYXlUby5yb3V0ZS5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IGNvbXBvbmVudElkc1swXVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IGNvbXBvbmVudElkc1swXTtcblxuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24udXBcblxuICAgICAgICB3aW5kb3cucGFyZW50Py5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAuLi5tZXNzYWdlXG4gICAgICAgIH0sICcqJyk7XG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEJpbmRPbkNsaWNrSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgRXhlY3V0ZVNjcmlwdEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBHZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG5cbiAgICAgICAgLy9jb21wb3NpdGUgc3VwcG9ydCBtZXNzYWdlcyA6XG4gICAgICAgIG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICB3aW5kb3cub25tZXNzYWdlID0gdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcy5iaW5kKHRoaXMpXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICB9XG5cbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnSWZyYW1lU0RLJywgSWZyYW1lU0RLKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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YTtBQUFBLE1BQ3pDLElBQUksNkJBQTZCLEtBQUssYUFBYTtBQUFBLE1BQ25ELElBQUkscUJBQXFCLEtBQUssYUFBYTtBQUFBLE1BQzNDLElBQUksd0JBQXdCLEtBQUssYUFBYTtBQUFBLE1BQzlDLElBQUksb0JBQW9CLEtBQUssYUFBYTtBQUFBLE1BQzFDLElBQUlDLHdCQUF1QixLQUFLLGFBQWE7QUFBQSxNQUM3QyxJQUFJLDJCQUEyQixLQUFLLGFBQWE7QUFBQSxNQUNqRCxJQUFJLHlCQUF5QixLQUFLLGFBQWE7QUFBQSxNQUMvQyxJQUFJLG9CQUFvQixLQUFLLGFBQWE7QUFBQTtBQUFBLE1BRzFDLElBQUlDLGtDQUFpQyxLQUFLLGFBQWE7QUFBQSxJQUMzRDtBQUVBLHdCQUFPLFFBQU8sTUFBTTtBQUNoQixhQUFPLFlBQVksS0FBSyxxQkFBcUIsS0FBSyxJQUFJO0FBQ3RELFdBQUssY0FBYyxJQUFJLFlBQVksQ0FBQztBQUFBLElBQ3hDO0FBcERJLFFBQUksQ0FBQyxPQUFPLE1BQU07QUFFZCxhQUFPLE9BQU8sQ0FBQztBQUFBLElBQ25CO0FBRUEsV0FBTyxLQUFLLFlBQVk7QUFBQSxFQUM1QjtBQWdESjtBQUVBLG9CQUFvQixhQUFhLFNBQVM7IiwKICAibmFtZXMiOiBbIlJlcGxheU1lc3NhZ2VLZXkiLCAibWF0Y2giLCAic2NyaXB0SW5wdXRzIiwgInNjcmlwdElucHV0cyIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJzZWVuIiwgInRhcmdldCIsICJtYWtlU2VyaWFsaXphYmxlIiwgImhlaWdodCIsICJ3aWR0aCIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJzZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgImhvc3RTREsiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiZWxlbWVudCIsICJDaGFuZ2VUZXh0SGFuZGxlciIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJzZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgIkV4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgInNlZW4iLCAic2RrIiwgImRvbUlkIiwgInNkayIsICJzZWVuIiwgInNraW4iLCAiY29tcG9uZW50IiwgInNlZ21lbnQiLCAiZXhwZXJpZW5jZSIsICJzZWxlY3RlZFNraW4iLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaG9zdFNESyIsICJNdXRhdGlvbk9ic2VydmVyIiwgImdldElucHV0VmFsdWUiLCAiZWxlbWVudCIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiU2V0SW5uZXJIdG1sSGFuZGxlciIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIl0KfQo=
3725
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL015b3BNZXNzYWdlcy50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvaW5kZXgudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9CYXNlTXlvcFNESy50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL2luZGV4LnRzIiwgIi4uLy4uLy4uL3NyYy9jb25zdHMudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbG9nTWVzc2FnZXMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvY29tcG9uZW50cy9teW9wUmVmQ29tcG9uZW50LnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXIudHMiLCAiLi4vLi4vLi4vc3JjL2hlbHBlcnMvQ2xvdWRSZXBvc2l0b3J5LnRzIiwgIi4uLy4uLy4uL3NyYy9oZWxwZXJzL2Nsb3VkUmVwb3NpdG9yeUhlbHBlcnMudHMiLCAiLi4vLi4vLi4vc3JjL2hvc3QvbXlvcE92ZXJyaWRlLnRzIiwgIi4uLy4uLy4uL3NyYy9ob3N0L2hvc3RTREsudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL2NvbW1vbi91dGlscy9kb21PYnNlcnZlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzIiwgIi4uLy4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHMiLCAiLi4vLi4vLi4vc3JjL0lmcmFtZS9JZnJhbWVTREsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAidHlwZSBTdHJpbmdXaXRoQXV0b2NvbXBsZXRlPFQ+ID0gVCB8IChzdHJpbmcgJiBSZWNvcmQ8bmV2ZXIsIG5ldmVyPik7XG5cbmV4cG9ydCB0eXBlIE15b3BNZXNzYWdlS2V5ID0gU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxrZXlvZiB0eXBlb2YgTXlvcE1lc3NhZ2VzIHwga2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcy5Jbj47XG5cbmV4cG9ydCBjb25zdCBNeW9wTWVzc2FnZXMgPSB7XG4gICAgLy9ob3N0IHRvIGNvbXBvbmVudFxuICAgICdJbml0UmVxdWVzdCc6ICdJbml0UmVxdWVzdCcsXG4gICAgJ0luaXRSZXNwb25zZSc6ICdJbml0UmVzcG9uc2UnLFxuICAgICdJbml0TWVzc2FnZSc6ICdJbml0TWVzc2FnZScsXG4gICAgJ0Rpc3Bvc2VNZXNzYWdlJzogJ0Rpc3Bvc2VNZXNzYWdlJyxcblxuICAgICdDaGFuZ2VUZXh0TWVzc2FnZSc6ICdDaGFuZ2VUZXh0TWVzc2FnZScsXG4gICAgJ0JpbmRDbGlja01lc3NhZ2UnOiAnQmluZENsaWNrTWVzc2FnZScsXG4gICAgJ0RldGVjdE15b3BSZWZzTWVzc2FnZSc6ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnLFxuXG4gICAgJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRNZXNzYWdlJyxcblxuICAgICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc6ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZScsXG4gICAgJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnOiAnU2V0QXR0cmlidXRlTWVzc2FnZScsXG5cbiAgICAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc6ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJyxcbiAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJzogJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnLFxuICAgICdHZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ1NldElubmVySHRtbCc6ICdTZXRJbm5lckh0bWwnLFxuXG4gICAgLy9jb21wb25lbnQgbWVzc2FnZXNcbiAgICAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc6ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJyxcbiAgICAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJyxcblxuICAgICdDbGVhbnVwTWVzc2FnZSc6ICdDbGVhbnVwTWVzc2FnZScsXG5cbiAgICAvLyBleHRlcm5hbCB0byBob3N0IDpcbiAgICBJbjoge1xuICAgICAgICAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnLFxuICAgICAgICAnQ2xpY2tSZXBsYXlNZXNzYWdlJzogJ0NsaWNrUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJzogJ0V4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UnLFxuXG4gICAgICAgICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJzogJ0V2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UnLFxuICAgICAgICAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSc6ICdFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlJyxcblxuICAgICAgICBcIkdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2VcIjogXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCIsXG4gICAgICAgICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSc6ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZScsXG4gICAgICAgICdFbnZlbG9wZWRNZXNzYWdlJzogJ0VudmVsb3BlZE1lc3NhZ2UnLFxuXG4gICAgICAgICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc6ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScsXG4gICAgICAgICdDbGVhbnVwUmVwbGF5TWVzc2FnZSc6ICdDbGVhbnVwUmVwbGF5TWVzc2FnZScsXG4gICAgICAgICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnOiAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJ1xuICAgIH1cbn1cbiIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICIvL1RPRE8gOiByZXVzZSBmcm9tIG9uZSBwbGFjZS5cbi8vIG5lZWRzIHRvIGJlIHVzZWQgaW4gbXlvcC1zZGssIG15b3AtZGFzaGJhb3JkLCBteW9wLXNlcnZlciwgbXlvcC1jbGkgLi5cblxuZXhwb3J0IGNvbnN0IHV1aWR2NCA9ICgpID0+IHtcbiAgICByZXR1cm4gXCIxMDAwMDAwMC0xMDAwLTQwMDAtODAwMC0xMDAwMDAwMDAwMDBcIi5yZXBsYWNlKC9bMDE4XS9nLCBjID0+XG4gICAgICAgICgrYyBeIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMSkpWzBdICYgMTUgPj4gK2MgLyA0KS50b1N0cmluZygxNilcbiAgICApO1xufVxuXG4vLyBDb252ZXJ0IFVVSUQgc3RyaW5nIHRvIGJ5dGVzXG5leHBvcnQgY29uc3QgdXVpZFRvQnl0ZXMgPSAodXVpZDogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShcbiAgICAgICAgdXVpZC5yZXBsYWNlKC8tL2csICcnKS5tYXRjaCgvLnsxLDJ9L2cpIS5tYXAoYnl0ZSA9PiBwYXJzZUludChieXRlLCAxNikpXG4gICAgKTtcbn07XG5cbi8vIENvbnZlcnQgYnl0ZXMgdG8gVVVJRCBzdHJpbmdcbmV4cG9ydCBjb25zdCBieXRlc1RvVXVpZCA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgaGV4ID0gWy4uLmJ5dGVzXS5tYXAoYiA9PiBiLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpKS5qb2luKCcnKTtcbiAgICByZXR1cm4gW1xuICAgICAgICBoZXguc2xpY2UoMCwgOCksXG4gICAgICAgIGhleC5zbGljZSg4LCAxMiksXG4gICAgICAgIGhleC5zbGljZSgxMiwgMTYpLFxuICAgICAgICBoZXguc2xpY2UoMTYsIDIwKSxcbiAgICAgICAgaGV4LnNsaWNlKDIwKVxuICAgIF0uam9pbignLScpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGVuY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybEVuY29kZSA9IChieXRlczogVWludDhBcnJheSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlKC4uLmJ5dGVzKSk7XG4gICAgcmV0dXJuIGJhc2U2NC5yZXBsYWNlKC9cXCsvZywgJy0nKS5yZXBsYWNlKC9cXC8vZywgJ18nKS5yZXBsYWNlKC89KyQvLCAnJyk7XG59O1xuXG4vLyBCYXNlNjQgVVJMLXNhZmUgZGVjb2RlXG5leHBvcnQgY29uc3QgYmFzZTY0VXJsRGVjb2RlID0gKHN0cjogc3RyaW5nKTogVWludDhBcnJheSA9PiB7XG4gICAgbGV0IGJhc2U2NCA9IHN0ci5yZXBsYWNlKC8tL2csICcrJykucmVwbGFjZSgvXy9nLCAnLycpO1xuICAgIHdoaWxlIChiYXNlNjQubGVuZ3RoICUgNCkgYmFzZTY0ICs9ICc9JztcbiAgICBjb25zdCBiaW5hcnkgPSBhdG9iKGJhc2U2NCk7XG4gICAgcmV0dXJuIFVpbnQ4QXJyYXkuZnJvbShiaW5hcnksIGNoYXIgPT4gY2hhci5jaGFyQ29kZUF0KDApKTtcbn07XG5cbi8vIENvbXByZXNzIGFuIGFycmF5IG9mIFVVSURzIGludG8gYSBzaG9ydCBVUkwtc2FmZSBzdHJpbmdcbmV4cG9ydCBjb25zdCBjb21wcmVzc1VVSURzID0gKHV1aWRzOiBzdHJpbmdbXSk6IHN0cmluZyA9PiB7XG4gICAgY29uc3QgYWxsQnl0ZXMgPSB1dWlkcy5mbGF0TWFwKHV1aWQgPT4gQXJyYXkuZnJvbSh1dWlkVG9CeXRlcyh1dWlkKSkpO1xuICAgIHJldHVybiBiYXNlNjRVcmxFbmNvZGUobmV3IFVpbnQ4QXJyYXkoYWxsQnl0ZXMpKTtcbn07XG5cbi8vIERlY29tcHJlc3MgZnJvbSBVUkwtc2FmZSBzdHJpbmcgYmFjayB0byBhbiBhcnJheSBvZiBVVUlEc1xuZXhwb3J0IGNvbnN0IGRlY29tcHJlc3NVVUlEcyA9IChlbmNvZGVkOiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XG4gICAgY29uc3QgYnl0ZXMgPSBiYXNlNjRVcmxEZWNvZGUoZW5jb2RlZCk7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCAlIDE2ICE9PSAwKSB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgaW5wdXQgbGVuZ3RoJyk7XG5cbiAgICBjb25zdCB1dWlkczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSArPSAxNikge1xuICAgICAgICB1dWlkcy5wdXNoKGJ5dGVzVG9VdWlkKGJ5dGVzLnNsaWNlKGksIGkgKyAxNikpKTtcbiAgICB9XG4gICAgcmV0dXJuIHV1aWRzO1xufTtcbiIsICJleHBvcnQgKiBmcm9tICcuL3V1aWQudHMnXG5cbmV4cG9ydCBjb25zdCB3YWl0ID0gKG1zOiBudW1iZXIpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHtJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBNZXNzYWdlRGlyZWN0aW9uIHtcbiAgICBzdGF0aWMgZG93biA9ICdkb3duJyBhcyBjb25zdFxuICAgIHN0YXRpYyB1cCA9ICd1cCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgTWVzc2FnZURpcmVjdGlvbk9wdGlvbiA9ICd1cCcgfCAnZG93bic7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcE1lc3NhZ2U8VCA9IGFueT4ge1xuICAgIGlkID0gdXVpZHY0KClcblxuICAgIHN0YXRpYyBjcmVhdGU8VCwgVSBleHRlbmRzIG5ldyAoLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+KSA9PiBUID0gdHlwZW9mIHRoaXM+KFxuICAgICAgICB0aGlzOiBVLFxuICAgICAgICAuLi5hcmdzOiBDb25zdHJ1Y3RvclBhcmFtZXRlcnM8VT5cbiAgICApOiBJbnN0YW5jZVR5cGU8dHlwZW9mIHRoaXM+IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByZXR1cm4gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ21lZXNhZ2UgaWQgY3JlYXRlZCcsIHRoaXMuaWQsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgIH1cblxuICAgIG15b3AgPSB0cnVlXG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXkgfCBzdHJpbmc7XG5cbiAgICBjb250ZW50PzogVFxuXG4gICAgLy8gVE9ETyA6IGNhbnQgYmUgb3B0aW9uYWwgXG4gICAgc291cmNlPzogc3RyaW5nXG4gICAgZGVzdGluYXRpb24/OiBzdHJpbmdcblxuICAgIHJvdXRlPzogc3RyaW5nW11cblxuICAgIHJlZj86IFJlZlxuXG4gICAgZGlyZWN0aW9uPzogTWVzc2FnZURpcmVjdGlvbk9wdGlvblxuXG4gICAgY2xlYW5hYmxlOiBib29sZWFuID0gZmFsc2VcblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtc2cubWVzc2FnZVR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVcbiAgICB9XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBNeW9wRWxlbWVudE1lc3NhZ2U8VCA9IGFueT4gZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8VD4ge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZikge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyPzogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEJpbmRNZXNzYWdlPFQgPSBhbnksIFIgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcblxuICAgIHB1YmxpYyBhYnN0cmFjdCByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5O1xuXG4gICAgcHVibGljIGhhbmRsZXJVbmlxdWVJZCA9IHV1aWR2NCgpXG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaGFuZGxlcjogKG1lc3NhZ2U6IFIpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJlZiB7XG4gICAgcHVibGljIG15b3AgPSB0cnVlO1xuXG4gICAgcHVibGljIF9fbm9uUHJveGllZD86IFJlZjtcblxuICAgIHN0YXRpYyBjcmVhdGUoc2VsZWN0b3I6IHN0cmluZywgcmVmQ29uZmlnPzogSVJlZkNvbmZpZywgY29tcG9uZW50PzogSU15b3BDb21wb25lbnQpIHtcbiAgICAgICAgbGV0IF9yZWZDb25maWcgPSByZWZDb25maWc7XG4gICAgICAgIGlmICghX3JlZkNvbmZpZykge1xuICAgICAgICAgICAgX3JlZkNvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVmKF9yZWZDb25maWcsIGNvbXBvbmVudCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZywgcHVibGljIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuX19ub25Qcm94aWVkID0ge1xuICAgICAgICAgICAgLi4udGhpcyxcbiAgICAgICAgICAgIGNvbXBvbmVudDogbnVsbCAvLyBpbiBvcmRlciB0byBiZSBzZXJpYWxpemFibGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsaWNrUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEJpbmRDbGlja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xpY2tSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdCaW5kQ2xpY2tNZXNzYWdlJztcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xpY2tSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaWNrUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdDaGFuZ2VUZXh0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHRleHQ6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0ZXh0XG4gICAgfVxufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJ1xuXG5jb25zdCBmdW5jdGlvbkJvZHlSZWdleCA9IC8oPzpmdW5jdGlvblxccypcXHcqXFxzKlxcKFteKV0qXFwpXFxzKlxceyhbXFxzXFxTXSo/KVxcfXwoXFwoW14pXSpcXClcXHMqPT5cXHMqXFx7KFtcXHNcXFNdKj8pXFx9KSlcXHMqJC87XG5jb25zdCBleHByZXNzaW9uQm9keVJlZ2V4ID0gL1xcKFxccypbXildK1xccypcXClcXHMqPT5cXHMqKC4rKS87XG5cbmV4cG9ydCBjb25zdCBzdHJpcEZ1bmN0aW9uID0gKGNvbnRlbnQ6IHN0cmluZykgPT4ge1xuICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZnVuY3Rpb25Cb2R5UmVnZXgpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4gbWF0Y2hbMV0gfHwgbWF0Y2hbM107XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IG1hdGNoID0gY29udGVudC5tYXRjaChleHByZXNzaW9uQm9keVJlZ2V4KTtcbiAgICAgICAgaWYgKG1hdGNoKVxuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzFdLnRyaW0oKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIHNjcmlwdElucHV0cyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuXG59IHwge307XG5cbmV4cG9ydCB0eXBlIHNjcmlwdFZhcnM8VD4gPSB7XG4gICAgc2VuZDogKGRhdGE6IFQpID0+IHZvaWQ7XG4gICAgLy8gY29tcGxldGVTdHJlYW06ICgpID0+IHZvaWQ7XG4gICAgcm9vdFJlZjogUm9vdFJlZjtcbiAgICBtYWtlU2VyaWFsaXphYmxlOiB0eXBlb2YgbWFrZVNlcmlhbGl6YWJsZVxufVxuXG5leHBvcnQgdHlwZSBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4gPSB7XG4gICAgW0sgaW4ga2V5b2YgSV06IElbS107XG59ICYgc2NyaXB0VmFyczxUPlxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCA9IGFueSwgSSBleHRlbmRzIHNjcmlwdElucHV0cyA9IGFueT4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8c3RyaW5nLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+PiB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc7XG4gICAgc2NyaXB0OiBzdHJpbmcgPSAnJ1xuXG4gICAgc3RhdGljIHJlcGxpZXJLZXkgPSAnc2VuZCc7XG4gICAgc3RhdGljIGNvbXBsZXRlU3RyZWFtS2V5ID0gJ2NvbXBsZXRlU3RyZWFtJztcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJPikgPT4gVCwgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgfSwgcHVibGljIHNjcmlwdElucHV0cz86IEkpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgICAgIHRoaXMuc2NyaXB0ID0gc2NyaXB0LnRvU3RyaW5nKCk7XG5cbiAgICAgICAgLy9UT0RPOiBjYW4gYmUgcmVtb3ZlXG4gICAgICAgIHRoaXMuY29udGVudCA9IHNjcmlwdC50b1N0cmluZygpXG4gICAgICAgIHRoaXMuY29udGVudCA9IHN0cmlwRnVuY3Rpb24odGhpcy5jb250ZW50KTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPFQ+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGNvbnRlbnQ6IFQpIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSxcbiAgICBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlLFxuICAgIGV4dGVuZGVkU2NyaXB0VmFycyxcbiAgICBzY3JpcHRJbnB1dHMsIHN0cmlwRnVuY3Rpb25cbn0gZnJvbSBcIi4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UudHNcIjtcblxuZXhwb3J0IHR5cGUgY3VzdG9tUmVmU2NyaXB0SW5wdXRzID0ge1xuICAgIGVsZW1lbnRJZDogc3RyaW5nLFxuICAgIHJlZj86IEhUTUxFbGVtZW50LFxuICAgIF9zY3JpcHQ/OiBzdHJpbmcsXG4gICAgX19zY3JpcHRJbnB1dHM/OiBPYmplY3Rcbn07XG5cbmV4cG9ydCBjbGFzcyBDdXN0b21SZWZNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IGV4dGVuZHMgRXhlY3V0ZVNjcmlwdE1lc3NhZ2U8VCwgSSAmIGN1c3RvbVJlZlNjcmlwdElucHV0cz4ge1xuXG4gICAgY29uc3RydWN0b3Ioc2NyaXB0OiAodmFyczogZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+KSA9PiBULFxuICAgICAgICAgICAgICAgIHB1YmxpYyBzY3JpcHRJbnB1dHM6IEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAgICAgaGFuZGxlcjogKG1lc3NhZ2U6IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2U8VD4pID0+IHZvaWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgfSkge1xuXG4gICAgICAgIC8vbW9jayB2YXJzXG4gICAgICAgIC8vIGxldCByb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzO1xuICAgICAgICBzdXBlcigoe3Jvb3RSZWYsIGVsZW1lbnRJZCwgX3NjcmlwdCwgX19zY3JpcHRJbnB1dHN9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWZzID0gKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvckFsbChgWyR7J215b3AtaWQnfT0nJHtlbGVtZW50SWR9J11gKTtcbiAgICAgICAgICAgIGlmIChyZWZzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vICBjb25zdCByZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgZXhwb3NpbmcgXCJyZWZzXCIgYW5kIG5vdCBvbmx5IFwicmVmXCJcbiAgICAgICAgICAgICAgICAvL2ZvciBjYXNlcyB3aGVyZSB0aGUgUmVmIGhhcyBtdWx0aXBsYXRlIGltcGxlbWVudGF0aW9uc1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIF9fc2NyaXB0SW5wdXRzLnJlZiA9IHJlZnNbMF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBuZXcgRnVuY3Rpb24oYHJldHVybiAoJHtfc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vcmV0dXJuIEZ1bmN0aW9uKCdyZWYnLCAncm9vdFJlZicsIC4uLk9iamVjdC5rZXlzKF9fc2NyaXB0SW5wdXRzKSwgX3NjcmlwdCEpKHJlZiwgcm9vdFJlZiwgLi4uT2JqZWN0LnZhbHVlcyhfX3NjcmlwdElucHV0cykpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbCBhcyBUO1xuICAgICAgICB9LCBoYW5kbGVyKTtcblxuICAgICAgICB0aGlzLnNjcmlwdElucHV0cyA9IHtcbiAgICAgICAgICAgIC4uLnNjcmlwdElucHV0cyxcbiAgICAgICAgICAgIC8vX3NjcmlwdDogc3RyaXBGdW5jdGlvbihzY3JpcHQudG9TdHJpbmcoKSksXG4gICAgICAgICAgICBfc2NyaXB0OiBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZVNrZWxldG9ufSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U8VCBleHRlbmRzIGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXAgPSBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwPiBleHRlbmRzIE15b3BCaW5kTWVzc2FnZSB7XG5cbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbiAgICBtZXNzYWdlVHlwZSA9ICdBZGRFdmVudExpc3RlbmVyTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4gPSBmYWxzZSAvLyB7fSAvLyBlbXB0eVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgdHlwZTogVCwgcHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpXG4gICAgfVxuXG4gICAgd2l0aFNlcmlhbGl6YWJsZVNrZWxldG9uKHNlcmlhbGl6YWJsZVNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxIVE1MRWxlbWVudEV2ZW50TWFwW1RdPikge1xuICAgICAgICB0aGlzLnNlcmlhbGl6YWJsZVNrZWxldG9uID0gc2VyaWFsaXphYmxlU2tlbGV0b247XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIGU6IFNlcmlhbGl6YWJsZTxFdmVudD4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0ge1xuICAgICAgICAgICAgZVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWYsfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG5cbmV4cG9ydCBjbGFzcyBTZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcblxuICAgIG1lc3NhZ2VUeXBlID0gJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIGhhbmRsZXI6IChtZXNzYWdlOiBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgRm9ybURhdGFFbnRyeSA9IHtcbiAgICBpZD86IHN0cmluZyxcbiAgICBuYW1lPzogc3RyaW5nLFxuICAgIHZhbHVlPzogSW5wdXRFbGVtZW50VmFsdWUsXG4gICAgcmVxdWlyZWQ/OiBib29sZWFuLFxuICAgIHZhbGlkaXR5PzogU2VyaWFsaXphYmxlPFZhbGlkaXR5U3RhdGU+LFxuICAgIG15b3BJZD86IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgPSB7XG4gICAgZm9ybURhdGE/OiB7IFtrZXk6IHN0cmluZ106IEZvcm1EYXRhRW50cnkgfVxuICAgIHVubWFwcGVkRGF0YT86IEZvcm1EYXRhRW50cnlbXVxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50VmFsdWUgPSBzdHJpbmcgfCBJbnB1dEVsZW1lbnRGb3JtVmFsdWUgfCBudWxsIHwgdW5kZWZpbmVkXG5cbmV4cG9ydCBjbGFzcyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBJbnB1dEVsZW1lbnRWYWx1ZSkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWwgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8c3RyaW5nPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRJbm5lckh0bWwnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBpbm5lckh0bWw6IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbm5lckh0bWxcbiAgICB9XG59IiwgImltcG9ydCB7IEJhc2VNeW9wTWVzc2FnZSB9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbi8vIHNlbnQgYnkgaG9zdCB0byBjb21wb25lbnRzLCBjb250YWlucyB0aGllciBpZCBcbmV4cG9ydCBjbGFzcyBJbml0TWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTx7IGlkOiBzdHJpbmcgfT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB7IGlkIH1cbiAgICB9XG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG4vLyBjb21wb25lbnQgbm90aWZ5IGhvc3QgdGhlIGl0IHdhcyBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVzcG9uc2UgZXh0ZW5kcyBJbml0TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlc3BvbnNlJztcbn1cblxuLy8gY29tcG9uZW50IGFzayB0byBob3N0IHRvIGdldCBpbml0YXRlZCBcbmV4cG9ydCBjbGFzcyBJbml0UmVxdWVzdCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnSW5pdFJlcXVlc3QnO1xufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50Q29uZmlnLCBJUmVmQ29uZmlnfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0L2hvc3RTREsudHNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZkNvbmZpZzogSVJlZkNvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgbmVzdGVkQ29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvcHRpb25zOiBsb2FkZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSkgPT4gdm9pZCxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG5cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIE5lc3RlZFJlZiA9IHtcbiAgICByZWZOYW1lOiBzdHJpbmcsXG4gICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgcHVibGljIG5lc3RlZFJlZnM6IE5lc3RlZFJlZltdLCBwdWJsaWMgZmFpbGVkPzogYm9vbGVhbikge1xuICAgICAgICBzdXBlcihyZXBsYXlUb0hhbmRsZXIpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIEVudmVsb3BlZE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0VudmVsb3BlZE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGRlc3RpbmF0aW9uOiBzdHJpbmcsIHB1YmxpYyBtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICBjb25zdCBpbm5lckVudmVsb3BlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBFbnZlbG9wZWRNZXNzYWdlKTtcbiAgICAgICAgdGhpcy5yb3V0ZSA9IFtkZXN0aW5hdGlvbiwgLi4uaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlID8gaW5uZXJFbnZlbG9wZWRNZXNzYWdlLnJvdXRlIDogW11dO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lFbGVtZW50UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8YW55LCBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0RldGVjdE15b3BSZWZzTWVzc2FnZSdcbiAgICByZXBseU1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5O1xufVxuXG5leHBvcnQgY2xhc3MgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2U8SUVsZW1lbnRSZWZbXT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5O1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcjogc3RyaW5nLCBteW9wRWxlbWVudFJlZnM6IElFbGVtZW50UmVmW10pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBteW9wRWxlbWVudFJlZnM7XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2U8YW55Pik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnR2V0QXR0cmlidXRlTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IHN0cmluZyB8IG51bGwpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG50eXBlIE1ldGhvZE5hbWVzPFQ+ID0ge1xuICAgIC8vIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgPyBLIDogbmV2ZXI7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyAoKSA9PiB2b2lkID8gSyA6IG5ldmVyO1xufVtrZXlvZiBUXTtcblxuLy8gRGVmaW5lIGEgdHlwZSB0aGF0IGFsbG93cyBvbmx5IHN0cmluZ3MgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kIG5hbWVzIG9mIFRcbnR5cGUgTWV0aG9kU3RyaW5nPFQ+ID0gTWV0aG9kTmFtZXM8VD4gZXh0ZW5kcyBpbmZlciBNID8gTSBleHRlbmRzIHN0cmluZyA/IE0gOiBuZXZlciA6IG5ldmVyO1xuXG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFeGVjdXRlQ29tcG9uZW50TWV0aG9kJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXRob2Q6IE1ldGhvZFN0cmluZzxJTXlvcENvbXBvbmVudD4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJztcbn1cblxuZXhwb3J0IGNsYXNzIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0NsZWFudXBSZXBsYXlNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgQ2xlYW51cE1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2U8dm9pZCwgQ2xlYW51cFJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0NsZWFudXBNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGVhbnVwRm9yTWVzc2FnZUlkOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhbnVwUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY3VzdG9tQ2xlYW51cDogYm9vbGVhbikge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2VNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEaXNwb3NlTWVzc2FnZSc7XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBjbGVhbmFibGUgPSB0cnVlO1xuICAgIG1lc3NhZ2VUeXBlID0gJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVPYnNlcnZlck1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSc7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIHJ1bkV4ZWN1dG9yQ2xlYW51cH0gZnJvbSBcIi4vaW5kZXgudHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9iYXNlTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLCBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEVudmVsb3BlZE1lc3NhZ2UsXG4gICAgSW5pdE1lc3NhZ2UsXG4gICAgSW5pdFJlc3BvbnNlLFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIEhvc3RlZENvbXBvbmVudDxUID0gYW55PiB7XG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICB9XG5cbiAgICAvL29uTWVzc2FnZVJlY2VpdmVkOiAobXNnOiBJTXlvcE1lc3NhZ2UpID0+IHZvaWQ7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgaWQ6IHN0cmluZywgcHVibGljIGNvbnRleHQ/OiBUKSB7XG5cbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU15b3BTREsge1xuICAgIGluaXQ6ICgpID0+IHZvaWQ7XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgaGFuZGxlSW5jb21lTWVzc2FnZXM6IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD47XG59XG5cbi8vIGNvbnN0IGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcyA9IFtcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QsXG4vLyAgICAgTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSxcbi8vICAgICAvL015b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlLFxuLy8gXVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BTREsgaW1wbGVtZW50cyBJTXlvcFNESyB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGFic3RyYWN0IHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXTtcblxuICAgIG1lc3NhZ2VUb0hhbmRsZUFmdGVySW5pdDogQmFzZU15b3BNZXNzYWdlW10gPSBbXTtcblxuICAgIGNvbXBvbmVudHM6IFJlY29yZDxzdHJpbmcsIEhvc3RlZENvbXBvbmVudD4gPSB7fTtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3Q6IGJvb2xlYW4gPSBmYWxzZVxuXG4gICAgbWVzc2FnZUNsZWFudXBDYWNoZTogUmVjb3JkPHN0cmluZywgQ2xlYW51cEhhbmRsZXIgfCBQcm9taXNlPENsZWFudXBIYW5kbGVyPj4gfCBQcm9taXNlPHZvaWQ+ID0ge307XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlcyhldmVudDogYW55KSB7XG4gICAgICAgIGNvbnN0IGV2ZW50Q29udGVudCA9IGV2ZW50LmRhdGEgPyBldmVudC5kYXRhIDogZXZlbnQuZGV0YWlsO1xuXG4gICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgLy8gbm90IG15b3AgbWFya2VkIGV2ZW50IFxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBldmVudENvbnRlbnQgYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24uZG93bikge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ21lc3NhZ2UgZHJvcHBlZCBpbiBiYXNlU0RLLCBkaXJlY3Rpb24gd2FzICcsIGV2ZW50LmRhdGEuZGlyZWN0aW9uKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgKGxvY2FsSG9zdEhhbmRsZWRNZXNzYWdlcy5pbmNsdWRlcyhtZXNzYWdlLm1lc3NhZ2VUeXBlKSkge1xuICAgICAgICAgICAgLy8gICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICAgIC8vVE9ETyA6IGZpeCBkaXJlY3Rpb24gPyBtZXNzYWdlIHdpbGwgbm90IHByb2NjZXNzIG90aGVyd2lzZVxuICAgICAgICAgICAgLy8gICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5EaXNwb3NlTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzaG91bGQgbm90IGJlIG9wdGlvbmFsLCBmaXggYW5kIHJlbW92ZSAnaWYnXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZGVzdGluYXRpb24pXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbl1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdlIGdvdCBvdXIgaWQgZnJvbSBvdXIgaG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IFNESyBtYXkgc2VydmUgbW9yZSB0aGFuIDEgY29tcG9uZW50IC4uIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgbmV3IEVycm9yKFwicmVjaGl2ZWQgaW5pdCBtZXNzYWdlIGZvciBhbiBleHNpc2luZyBjb21wb25lbnQuXCIpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNbbmV3Q29tcG9uZW50SWRdID0gbmV3IEhvc3RlZENvbXBvbmVudChuZXdDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXNwb25zZShuZXdDb21wb25lbnRJZCkpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZm9yIHNhbWUgSG9zdFNESyBjYXNlc1xuICAgICAgICAgICAgLy8gd2hlbiBib3RoIFJlZkNvbXBvbmVudCBhbmQgcmVhbENvbXBvbmVudCBob3N0ZWQgaW4gdGhlIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkTWVzc2FnZSA9IChtZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyTWVzc2FnZSA9IGVudmVsb3BlZE1lc3NhZ2UubWVzc2FnZTtcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gaW5uZXJNZXNzYWdlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCB8fCB0aGlzLmNvbXBvbmVudHNbbWVzc2FnZS5kZXN0aW5hdGlvbiFdKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gaW5uZXJNZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkNvbXBvbmVudC5zZW5kKGlubmVyTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50ID0gbXlvcC5ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGVudmVsb3BlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudmVsb3BlZERlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKXtcbiAgICAgICAgICAgIC8vICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgOiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlID0gbWVzc2FnZSBhcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuICAgICAgICAgICAgLy8gLy8gICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5DbGVhbnVwTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENsZWFudXBNZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwTWVzc2FnZSA9IG5ldyBDbGVhbnVwUmVwbGF5TWVzc2FnZSghIWNsZWFudXApO1xuICAgICAgICAgICAgICAgICAgICBjbGVhbnVwTWVzc2FnZS5kZXN0aW5hdGlvbiA9IG1lc3NhZ2UuZGVzdGluYXRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEhY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVt0eXBlZE1lc3NhZ2UuY2xlYW51cEZvck1lc3NhZ2VJZF07XG4gICAgICAgICAgICAgICAgICAgICAgICBydW5FeGVjdXRvckNsZWFudXAoY2xlYW51cCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KGNsZWFudXBNZXNzYWdlLCB0eXBlZE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRlbCBlcnJvcj9cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBhY3Rpb25IYW5kbGVyRm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIubWVzc2FnZVR5cGUgPT09IG1lc3NhZ2UubWVzc2FnZVR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkhhbmRsZXJGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gaGFuZGxlci5leGVjdXRvcihtZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuY2xlYW5hYmxlICYmIGNsZWFudXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbbWVzc2FnZS5pZF0gPSBjbGVhbnVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xlYW51cCAmJiAhbWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENsZWFudXAgaGFuZGxlciBnZW5lcmF0ZWQgZm9yIG5vbi1jbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2xlYW51cCAmJiBtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gY2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3IgYSBjbGVhbmFibGUgbWVzc2FnZS4gXG5tZXNzYWdlVHlwZSAtICR7bWVzc2FnZS5tZXNzYWdlVHlwZX0sIGhhbmRsZXIgZXhlY3V0b3Igd2FzIC0gJHtoYW5kbGVyLmV4ZWN1dG9yfVxuXG5QbGVhc2UgcmV2aWV3IHRoZSBtZXNzYWdlIGRlZmluaXRpb24gb2JqZWN0ICYgbWVzc2FnZSBoYW5kbGVyLlxuVG8gZW5zdXJlIGNsZWFudXAgcHJvcGVybHkgc2V0ICdjbGVhbmFibGUnIHRydWUgYXQgbWVzc2FnZSBkZWZpbml0aW9uIGFuZCByZXR1cm4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgZnJvbSB5b3VyIGhhbmRsZXJzLmApXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgaWYgKCFhY3Rpb25IYW5kbGVyRm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogcHJpbnQgd2l0aCBkZWJ1ZyBjb25maWcgb25seVxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBtZXNzYWdlIGhhbmRsZXIgd2FzIGZvdW5kIGZvciAnLCBtZXNzYWdlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ3Vuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZScpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbml0OiAoKSA9PiB2b2lkO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgKiBmcm9tICcuL015b3BFbGVtZW50UmVmJztcbmV4cG9ydCAqIGZyb20gJy4vYmFzZU1lc3NhZ2VIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQmFzZU15b3BTREsnO1xuXG5leHBvcnQgdHlwZSBDbGVhbnVwSGFuZGxlciA9ICgpID0+IHZvaWRcblxuZXhwb3J0IHR5cGUgRGljdGlvbmFyeTxUPiA9IHsgW2tleTogc3RyaW5nXTogVDsgfTtcblxuLy9leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9ICdJZnJhbWVMb2FkZXInIHwgJ1dlYkNvbXBvbmVudExvYWRlcicgfCAnSFRNTExvYWRlcicgfCBzdHJpbmc7XG5cbmV4cG9ydCBjb25zdCBTa2luTG9hZGVycyA9IHtcbiAgICBcIklmcmFtZUxvYWRlclwiOiBcIklmcmFtZUxvYWRlclwiLFxuICAgIFwiV2ViQ29tcG9uZW50TG9hZGVyXCI6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCIsXG4gICAgXCJIVE1MTG9hZGVyXCI6IFwiSFRNTExvYWRlclwiLFxuICAgIFwiTWluaW1pemVkTG9hZGVyXCI6IFwiTWluaW1pemVkTG9hZGVyXCJcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9IGtleW9mIHR5cGVvZiBTa2luTG9hZGVycztcblxuZXhwb3J0IHR5cGUgUHJvcFR5cGUgPSAnYW55JyB8ICdzdHJpbmcnIHwgJ251bWJlcicgfCBzdHJpbmc7IC8vIFRPRE8gOiA8XG5leHBvcnQgdHlwZSBSZWZTZWxlY3RvclR5cGUgPSAnaWQtYXR0cmlidXRlJyB8ICdjc3Mtc2VsZWN0b3InIHwgJ3hwYXRoJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IExvYWRlckZyYW1ld29ya3MgPSB7XG4gICAgXCJyZWFjdFwiOiBcInJlYWN0XCIsXG4gICAgXCJ2dWVcIjogXCJ2dWVcIixcbiAgICBcImFuZ3VsYXJcIjogXCJhbmd1bGFyXCIsXG59IGFzIGNvbnN0XG5leHBvcnQgdHlwZSBMb2FkZXJGcmFtZXdvcmtUeXBlID0ga2V5b2YgdHlwZW9mIExvYWRlckZyYW1ld29ya3M7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIldlYkNvbXBvbmVudExvYWRlclwiO1xuICAgIHVybDogc3RyaW5nLFxuICAgIHRhZzogc3RyaW5nLFxuICAgIGZyYW1ld29yaz86IExvYWRlckZyYW1ld29ya1R5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSWZyYW1lTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSWZyYW1lTG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmdcbiAgICBhdXRvSGVpZ2h0OiBib29sZWFuXG4gICAgaGVpZ2h0Pzogc3RyaW5nXG4gICAgd2lkdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNoYWRvd1Jvb3RNb2RlVHlwZSA9IHtcbiAgICBcIm9wZW5cIjogXCJvcGVuXCIsXG4gICAgXCJjbG9zZWRcIjogXCJjbG9zZWRcIixcbiAgICBcIm5vbmVcIjogXCJub25lXCIsXG4gICAgXCJsb2NhbEZyYW1lXCI6IFwibG9jYWxGcmFtZVwiXG59IGFzIGNvbnN0O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUhUTUxMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJIVE1MTG9hZGVyXCI7XG4gICAgSFRNTDogc3RyaW5nO1xuICAgIC8vVE9ETzogcmVuYW1lKHJvb3RNb2RlL2N1c3RvbUVsZW1lbnRNb2RlKSArIGRiIG1pZ3JhdGlvblxuICAgIHNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZTtcbiAgICBhdXRvSGVpZ2h0PzogYm9vbGVhbjtcbiAgICBoZWlnaHQ/OiBzdHJpbmc7XG4gICAgd2lkdGg/OiBzdHJpbmc7XG59XG5cbi8vZm9yIGludGVybmFsIGRhc2hib2FyZCB1c2FnZVxuZXhwb3J0IGludGVyZmFjZSBJTWluaW1pemVkTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiTWluaW1pemVkTG9hZGVyXCI7XG59XG5cbmludGVyZmFjZSBEYXNoYm9hcmRPYmplY3Qge1xuICAgIF90ZW1wX2NsaWVudF9pZD86IHN0cmluZyxcbn1cblxudHlwZSBFeHRlbmQ8VCwgVT4gPSBUICYgVTtcblxudHlwZSBFeHRlbmRSZWN1cnNpdmVseTxULCBFPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBFXTogRVtLXTtcbn0gJiB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3RcbiAgICAgICAgPyBFeHRlbmRSZWN1cnNpdmVseTxUW0tdLCBFPlxuICAgICAgICA6IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBJRGFzaGJvYXJkPFQ+ID0gRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRGFzaGJvYXJkT2JqZWN0PjtcblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGVcblxuICAgIFtrZXk6IHN0cmluZ106IGFueTsgLy8gQWxsb3dzIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSB2Ml9JUmVsZWFzZU1ldGFkYXRhIHtcbiAgICBlbnZpcm9ubWVudElkOiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnRJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgcmVsZWFzZWRPbj86IHN0cmluZztcbiAgICByZWxlYXNlZEJ5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lWYXJpYW50Q29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgcmVsZWFzZXM/OiB2Ml9JUmVsZWFzZU1ldGFkYXRhW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG4gICAgY3JlYXRlZEJ5Pzogc3RyaW5nXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSVNraW5Db25maWcgZXh0ZW5kcyBJU2tpbkNvbmZpZyB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElCaW5kTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGNvbnN0IFByb3BNZXNzYWdlTW9kZXMgPSB7XG4gICAgXCJpbnB1dFwiOiBcImlucHV0XCIsXG4gICAgXCJvdXRwdXRcIjogXCJvdXRwdXRcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGNvbnN0IFByb3BDb25maWdCZWhhdmlvclR5cGVzID0ge1xuICAgIFwibWVzc2FnZVwiOiBcIm1lc3NhZ2VcIixcbiAgICBcImNvZGVcIjogXCJjb2RlXCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbSB7XG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29kZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJjb2RlXCJcbiAgICByZW1hcD86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yIGV4dGVuZHMgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZTogXCJtZXNzYWdlXCJcbiAgICBtZXNzYWdlOiBNeW9wTWVzc2FnZUtleVxuICAgIHJlZjogc3RyaW5nLCAvL1RPRE8gbWFrZSBpdCBpZFxuICAgIHBhcmFtczogSVByb3BNZXNzYWdlQmVoYXZpb3JQYXJhbVtdXG4gICAgbW9kZToga2V5b2YgdHlwZW9mIFByb3BNZXNzYWdlTW9kZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIGJlaGF2aW9yOiBJUHJvcEJlaGF2aW9yXG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZkJlaGF2aW9yVHlwZSB7XG4gICAgc3RhdGljIGNvZGUgPSAnY29kZScgYXMgY29uc3RcbiAgICBzdGF0aWMgY29tcG9uZW50ID0gJ2NvbXBvbmVudCcgYXMgY29uc3Rcbn1cblxuZXhwb3J0IHR5cGUgSVJlZkJlaGF2aW9yVHlwZSA9ICdjb2RlJyB8ICdjb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogSVJlZkJlaGF2aW9yVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvbXBvbmVudCdcbiAgICBjb21wb25lbnRJZDogc3RyaW5nXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqIFByb3BlcnR5IGluc3RhbmNlIGlzIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuXG4gICAgICovXG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb2RlUmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb2RlJ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElSZWZDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgc2VsZWN0b3JUeXBlOiBSZWZTZWxlY3RvclR5cGVcbiAgICBzZWxlY3Rvcjogc3RyaW5nXG4gICAgYmVoYXZpb3I6IElSZWZCZWhhdmlvclxufVxuXG4vKipcbiAqIEV4cGVyaWVuY2Ugc2VnbWVudCBydWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VTZWdtZW50UnVsZSB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBvcGVyYXRvcjogc3RyaW5nO1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBBL0Igc3BsaXQgdmVyc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlQUJTcGxpdFZlcnNpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4cGVyaWVuY2UgQS9CIHNwbGl0IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZUFCU3BsaXQge1xuICAgIHZlcnNpb25zOiBJRXhwZXJpZW5jZUFCU3BsaXRWZXJzaW9uW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBzZWdtZW50IGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZVNlZ21lbnQge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcnVsZXM6IElFeHBlcmllbmNlU2VnbWVudFJ1bGVbXTtcbiAgICB1c2VBYjogYm9vbGVhbjtcbiAgICBjb21wb25lbnRWYXJpYW50czogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nPj47XG4gICAgYWJTcGxpdD86IElFeHBlcmllbmNlQUJTcGxpdDtcbiAgICBzdGlja3lQcm9wZXJ0aWVzPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogRXhwZXJpZW5jZSBkZWZpbml0aW9uIGNvbmZpZyAodjIpXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV4cGVyaWVuY2VEZWZpbml0aW9uQ29uZmlnIGV4dGVuZHMgdjJfSU15b3BTdG9yZWRPYmplY3Qge1xuICAgIC8qKiBTZWxlY3RlZCBjb21wb25lbnQgSURzICovXG4gICAgY29tcG9uZW50czogc3RyaW5nW107XG4gICAgLyoqIFNlZ21lbnQgY29uZmlndXJhdGlvbnMgKi9cbiAgICBzZWdtZW50czogSUV4cGVyaWVuY2VTZWdtZW50W107XG4gICAgLyoqIEZhbGxiYWNrIHZhcmlhbnQgcGVyIGNvbXBvbmVudCAqL1xuICAgIGZhbGxiYWNrOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIC8qKiBUYWdzICovXG4gICAgdGFnczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xuICAgIGNyZWF0ZWRCeT86IHN0cmluZ1xuICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xufVxuXG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICBpZDogc3RyaW5nLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lNeW9wU3RvcmVkT2JqZWN0IGV4dGVuZHMgdjJfSUJhc2VNeW9wT2JqZWN0IHtcbiAgICB1cGRhdGVkT24/OiBzdHJpbmdcbiAgICB1cGRhdGVkQnk/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDb21wb25lbnRBY2Nlc3Mge1xuICAgIHZpc2liaWxpdHk6ICdwcml2YXRlJyB8ICd1bmxpc3RlZCcgfCAncHVibGljJztcbiAgICB1bmxpc3RlZD86IHtcbiAgICAgICAgc2x1Zzogc3RyaW5nO1xuICAgIH07XG4gICAgbWFya2V0cGxhY2U/OiB7XG4gICAgICAgIHN0YXR1czogJ2RyYWZ0JyB8ICdzdWJtaXR0ZWQnIHwgJ2NsYWltZWQnIHwgJ2Nsb3NlZCc7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgICAgIGNvbnRhY3RFbWFpbDogc3RyaW5nO1xuICAgICAgICBkZWFkbGluZTogc3RyaW5nO1xuICAgIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgdjJfSUNvbXBvbmVudERlZmluaXRpb25Db25maWcgZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgdmFyaWFudHNfaWRzOiBzdHJpbmdbXSxcbiAgICBEVE9zOiB2Ml9JRFRPW10sXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgYWNjZXNzPzogQ29tcG9uZW50QWNjZXNzLFxuXG4gICAgLy9cbiAgICB2YXJpYW50c19uYW1lczogc3RyaW5nW10sXG4gICAgdmFyaWFudHNfZGF0YToge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGlkOiBzdHJpbmdcbiAgICAgICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgICAgICAgdXBkYXRlZE9uPzogc3RyaW5nXG4gICAgICAgIHVwZGF0ZWRCeT86IHN0cmluZ1xuICAgICAgICBoYXNfcmVsZWFzZXM/OiBib29sZWFuXG4gICAgfVtdLFxuXG4gICAgcHJldmlld192YXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZztcbiAgICBleHRyYT86IHtcbiAgICAgICAgZmlyc3RWYXJpYW50OiB2Ml9JVmFyaWFudENvbmZpZzsgLy93aGVuIG5ldyBjb21wb25lbnQgY3JlYXRlcyBhdCB0aGUgY2xpZW50XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIHYyX0lEVE8gZXh0ZW5kcyB2Ml9JTXlvcFN0b3JlZE9iamVjdCB7XG4gICAgZGF0YTogb2JqZWN0XG4gICAgbWV0aG9kTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5JbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcyxcbiAgICAvL3NraW5zOiBJU2tpbkluc3RhbmNlQ29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IFNlZ21lbnRUeXBlID0ge1xuICAgIFwiRnVuY3Rpb25SZXN1bHRcIjogXCJGdW5jdGlvblJlc3VsdFwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEluc3RhbmNlIHtcbiAgICBzZWdtZW50SWQ6IHN0cmluZztcbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNlZ21lbnRUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQgZXh0ZW5kcyBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogdHlwZW9mIFNlZ21lbnRUeXBlLkZ1bmN0aW9uUmVzdWx0XG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGZ1bmN0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNraW5TZWxlY3RvclR5cGVzID0ge1xuICAgIFwiU2VnbWVudGVkXCI6IFwiU2VnbWVudGVkXCIsXG4gICAgXCJEZWRpY2F0ZWRcIjogXCJEZWRpY2F0ZWRcIixcblxuICAgIC8qKlxuICAgICAqIFRoaXMgU2VsZWN0b3IgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgXCJEZWZhdWx0XCI6IFwiRGVmYXVsdFwiXG59IGFzIGNvbnN0O1xuXG5cbi8qKlxuICogVGhpcyBTa2luIENvbmZpZyBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gKlxuICogQHR5cGUge0lEZWZhdWx0U2tpbkNvbmZpZ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGVmYXVsdFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVmYXVsdCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQsXG4gICAgc2VnbWVudHM6IElTZWdtZW50SW5zdGFuY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZWRpY2F0ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2tpbn0gaW5zdGVhZC5cbiAgICAgKiBQcm9wZXJ0eSBza2lucyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIHRvIHVzZSB7QGxpbmsgc2tpbn0gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBza2lucz86IElTa2luSW5zdGFuY2VDb25maWdbXSAvLyBkZXByZWNhdGVkXG4gICAgc2tpbjogSVNraW5JbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgLy9UT0RPIDpcbiAgICAvLyBSZWZJRCA/IHRvIHN1cHBvcnQgbW9yZSB0aGFuIDEgY29tcG9uZW50IGZyb20gdGhlIHNhbWUgdHlwZSBpbiBjb21wb3NpdGVzID9cblxuICAgIC8vVE9ETyA6IHJlbW92ZVxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZzsgLy8gPDwgY2hlY2tcblxuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xuXG4gICAgLy8gc3RvcmluZyB0aGUgbmVzdGVkIGNvbmZpZyBmb3IgcmVmIGNvbXBvbmVudHNcbiAgICBuZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW11cblxuICAgIC8vb25seSBvbiBHRVQ/XG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIHJlc29sdmVkRXhwZXJpZW5jZXM/OiBJRXhwZXJpZW5jZVtdXG4gICAgLy8gd2lsbCBpbmNsdWRlIGluc3RhbmNlIGFuZCBkZWYgY29uZmlnIGluIG9yZGVyIHRvIHJlbmRlciBpbiBwcm9kdWN0aW9uXG4gICAgcmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBFeHBlcmllbmNlVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50XCI6IFwiU2VnbWVudFwiLFxuICAgIFwiUHJvbW9cIjogXCJQcm9tb1wiLFxuICAgIFwiQUJcIjogXCJBQlwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIC8vc3RpY2tpbmVzc0ZhY3RvclxuICAgIC8vRW5kRGF0ZVxufVxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2VHcm91cCB7XG4vLyAgICAgaWQ6IHN0cmluZ1xuLy8gICAgIG5hbWU6IHN0cmluZ1xuLy8gICAgIHBlcmNlbnRhZ2U6IG51bWJlclxuLy8gfVxuXG5leHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZTogdHlwZW9mIEV4cGVyaWVuY2VUeXBlcy5BQlxuICAgIC8vIGdyb3VwczogSUFCRXhwZXJpZW5jZUdyb3VwW11cbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIHBlcmNlbnRhZ2U6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRlUmFuZ2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBzdGFydDogRGF0ZVxuICAgIGVuZDogRGF0ZVxuICAgIHRpbWV6b25lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIHNlZ21lbnQ6IElTZWdtZW50RGVmaW5pdGlvblxuICAgIGRhdGVSYW5nZT86IElEYXRlUmFuZ2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3dEZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdO1xuICAgIG9yaWdpbnM6IHN0cmluZ1tdLFxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xuICAgIHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvLyBUT0RPIDogdmVyaWZ5IHVuaXF1ZW5lc3MgKGRhc2hib2FyZCAmIHNlcnZlcilcbiAgICBuYW1lOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIElCcmFuY2hhYmxlIHtcbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3cgZXh0ZW5kcyBPbWl0PElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4sIElCcmFuY2hhYmxlIHtcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdD86IFNoYWRvd1Jvb3QpIHtcblxuICAgIH1cblxuICAgIGdldFJvb3REaXYgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yKCdkaXYnKVxuICAgIH1cblxuICAgIGdldFJvb3QgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BBdHRyaWJ1dGVzID0ge1xuICAgIGlkOiAnbXlvcC1pZCdcbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBJRWxlbWVudFJlZiwgTXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcbiAgICAgICAgLy9jb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAqYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBJRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgLy9sZXQgY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIH0gLy9lbHNlIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWNvdW50ZXJzW2l0ZW0udGFnTmFtZV0pIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IDA7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSBjb3VudGVyc1tpdGVtLnRhZ05hbWVdICsgMTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgbXlvcFJlZnMucHVzaChuZXcgWFBhdGhFbGVtZW50UmVmKGAke2l0ZW0udGFnTmFtZX0oJHtjb3VudGVyc1tpdGVtLnRhZ05hbWVdfSlgLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHtSZWZ9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke3JlZi5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpcnN0RWxlbWVudEJ5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0RWxlbWVudHNCeVJlZihyZWYsIGVsKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVtKDApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKCksIGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsZWFuVXBUYXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goY2xlYW5VcFRhc2spO1xuICAgICAgICB9KTtcblxuICAgICAgICAvL2NsZWFuIHVwXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTXlvcE1lc3NhZ2VzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q2hhbmdlVGV4dE1lc3NhZ2U+IHtcbiAgXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG4gICAgXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENoYW5nZVRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJleHBvcnQgdHlwZSBTZXJpYWxpemFibGU8VD4gPVxuICAgIFQgZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogLy8gRXhjbHVkZSBmdW5jdGlvbnNcbiAgICAgICAgVCBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gU2VyaWFsaXphYmxlPFU+W10gOiAvLyBIYW5kbGUgYXJyYXlzXG4gICAgICAgICAgICBUIGV4dGVuZHMgb2JqZWN0ID8ge1xuICAgICAgICAgICAgICAgIFtLIGluIGtleW9mIFQgYXMgVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiBLXTogU2VyaWFsaXphYmxlPFRbS10+XG4gICAgICAgICAgICB9IDogVDsgLy8gSGFuZGxlIG9iamVjdHNcblxuY29uc3QgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdmFsdWUgIT09IE9iamVjdCh2YWx1ZSk7XG59XG5cbmNvbnN0IGlzRnVuY3Rpb24gPSAodmFsdWUpID0+IHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xufVxuXG5leHBvcnQgY29uc3QgY29udGFpbnNQcmltaXRpdmVzT25seSA9IChvYmopID0+IHtcbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGlmIChPYmplY3QuZ2V0UHJvdG90eXBlT2Yob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNoZWNrIGlmIGl0J3MgYSBuZXN0ZWQgb2JqZWN0XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUHJpbWl0aXZlc09ubHkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIEl0J3MgYSBwcmltaXRpdmUsIHNvIHdlIGNhbiBza2lwIGl0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIEZvdW5kIGEgbm9uLXByaW1pdGl2ZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7IC8vIEFsbCB2YWx1ZXMgYXJlIHByaW1pdGl2ZXMgb3IgbmVzdGVkIG9iamVjdHMgd2l0aCBwcmltaXRpdmVzXG59XG5cbi8vIGN1cnJlbnRseSBzdXBwb3J0IHJvb3QgbGV2ZWwgb25seVxuLy8ge3g6IDEsIHkgOiAnYScsIHogOiAoKT0+ey4uLn0sIGlubmVyIDogeyB4OiAxICwgeSA6ICdhJ30gfVxuLy8ge3g6IDEsIHkgOiAnYSd9XG4vL2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvR2xvc3NhcnkvRmFsc3lcbmV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0gUGFydGlhbDxSZWNvcmQ8a2V5b2YgVCwgYm9vbGVhbiB8IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbj4+Pj4gfCBib29sZWFuO1xuXG5leHBvcnQgY29uc3QgbWFrZVNlcmlhbGl6YWJsZSA9IDxUPihcbiAgICBvYmo6IFQsXG4gICAgc2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPFQ+ID0ge30sXG4gICAgaW5jbHVkZUZhbHN5S2V5czogYm9vbGVhbiA9IHRydWUsIC8vIFRPRE8gOiB1c2UgdGhhdCBhcmdcbiAgICBzZWVuOiBXZWFrTWFwPG9iamVjdCwgU2VyaWFsaXphYmxlPGFueT4+ID0gbmV3IFdlYWtNYXAoKVxuKTogU2VyaWFsaXphYmxlPFQ+ID0+IHtcblxuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiBvYmogYXMgU2VyaWFsaXphYmxlPFQ+OyAvLyBEaXJlY3RseSByZXR1cm4gcHJpbWl0aXZlIHZhbHVlc1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhhbmRsZSBhcnJheSBzZXJpYWxpemF0aW9uXG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZUFycmF5OiBTZXJpYWxpemFibGU8YW55PltdID0gW107XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlQXJyYXkpOyAvLyBTdG9yZSB0aGUgYXJyYXkgaW4gc2VlblxuXG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBvYmoubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gb2JqW2luZGV4XTtcbiAgICAgICAgICAgIHNlcmlhbGl6YWJsZUFycmF5W2luZGV4XSA9IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudCwgc2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVBcnJheSBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgaWYgKG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBDaGVjayBmb3IgY3ljbGljIHJlZmVyZW5jZXNcbiAgICAgICAgaWYgKHNlZW4uaGFzKG9iaikpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWVuLmdldChvYmopITsgLy8gUmV0dXJuIHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVPYmplY3Q6IFBhcnRpYWw8U2VyaWFsaXphYmxlPFQ+PiA9IHt9O1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZU9iamVjdCk7IC8vIFN0b3JlIHRoZSBvYmplY3QgaW4gc2VlblxuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGtleSBpcyBpbiB0aGUgc2tlbGV0b24gYW5kIGlmIGl0J3MgYSB2YWxpZCBrZXkgdG8gc2VyaWFsaXplXG5cbiAgICAgICAgICAgIGNvbnN0IGtleUluU2tlbGV0b24gPSB0eXBlb2Ygc2tlbGV0b24gPT0gXCJib29sZWFuXCIgPyBza2VsZXRvbiA6IHNrZWxldG9uW2tleV07XG5cbiAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24gPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyB0byBzZXJpYWxpemUgdGhpcyBrZXlcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluY2x1ZGVGYWxzeUtleXMgPyBvYmpba2V5XSAhPT0gdW5kZWZpbmVkIDogb2JqW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwgdHJ1ZSwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBrZXlJblNrZWxldG9uID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIG5lc3RlZCBrZXlzIHRvIHNlcmlhbGl6ZVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YWJsZU9iamVjdFtrZXldID0gbWFrZVNlcmlhbGl6YWJsZShvYmpba2V5XSwga2V5SW5Ta2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXJpYWxpemFibGVPYmplY3QgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIHJldHVybiB7fSBhcyBhbnk7IC8vIFJldHVybiBhbiBlbXB0eSBvYmplY3QgZm9yIG90aGVyIGNhc2VzXG59XG4iLCAiaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCByZXBsaWVyOiAoZGF0YTogYW55KSA9PiB2b2lkLCByb290UmVmOiBSb290UmVmKSA9PiB7XG4gICAgY29uc3QgX19zY3JpcHRJbnB1dHMgPSBldmVudC5zY3JpcHRJbnB1dHMgPyBldmVudC5zY3JpcHRJbnB1dHMgOiB7fVxuICAgIF9fc2NyaXB0SW5wdXRzLm1ha2VTZXJpYWxpemFibGUgPSBtYWtlU2VyaWFsaXphYmxlO1xuXG4gICAgX19zY3JpcHRJbnB1dHMuc2VuZCA9IHJlcGxpZXI7XG4gICAgX19zY3JpcHRJbnB1dHMucm9vdFJlZiA9IHJvb3RSZWY7XG4gICAgX19zY3JpcHRJbnB1dHMuX19zY3JpcHRJbnB1dHMgPSBfX3NjcmlwdElucHV0cztcblxuICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke2V2ZW50LnNjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICBjb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgLy8gY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gRnVuY3Rpb24oJ3NlbmQnLCAncm9vdFJlZicsJ19fc2NyaXB0SW5wdXRzJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBldmVudC5jb250ZW50ID8gZXZlbnQuY29udGVudCA6ICcnKVxuICAgIC8vY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKHJlcGxpZXIsIHJvb3RSZWYsIF9fc2NyaXB0SW5wdXRzLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSk7XG4gICAgcmVwbGllcihyZXQpO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlciwgUm9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50c1wiO1xuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8RXhlY3V0ZVNjcmlwdE1lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5FeGVjdXRlU2NyaXB0TWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBkYXRhKSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcihldmVudCwgcmVwbGllciwgbmV3IFJvb3RSZWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk7XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVyTWVzc2FnZSwgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxBZGRFdmVudExpc3RlbmVyTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChtZXNzYWdlOiBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihtZXNzYWdlLnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdCByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG1ha2VTZXJpYWxpemFibGUoZSwgbWVzc2FnZS5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIobWVzc2FnZS50eXBlLCBoYW5kbGVyKVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHtcbiAgICAgICAgICAgICAgICB0YXNrKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRBdHRyaWJ1dGVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5LCBNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBEaXNwb3NlTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCwgTWVzc2FnZURpcmVjdGlvbixcbiAgICBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNESywgbG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuLyoqXG4gKiBSZXN1bHQgcmV0dXJuZWQgYnkgb2JzZXJ2ZUF1dG9TaXplIGNhbGxiYWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVSZXN1bHQge1xuICAgIC8qKiBDdXJyZW50IHdpZHRoIChmcm9tIGNvbnRlbnQpICovXG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICAvKiogQ3VycmVudCBoZWlnaHQgKGZyb20gY29udGVudCkgKi9cbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICAvKiogV2hldGhlciB3aWR0aCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ1dpZHRoOiBib29sZWFuO1xuICAgIC8qKiBXaGV0aGVyIGhlaWdodCBpcyBiZWluZyBhdXRvLXNpemVkICovXG4gICAgYXV0b1NpemluZ0hlaWdodDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBvYnNlcnZlQXV0b1NpemUgbWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1NpemVPcHRpb25zIHtcbiAgICAvKiogQ2FsbGJhY2sgY2FsbGVkIHdpdGggc2l6ZSBpbmZvIHdoZW5ldmVyIHNpemUgY2hhbmdlcyAqL1xuICAgIG9uU2l6ZUNoYW5nZT86IChyZXN1bHQ6IEF1dG9TaXplUmVzdWx0KSA9PiB2b2lkO1xuICAgIC8qKiBNaW5pbXVtIHdpZHRoIGNvbnN0cmFpbnQgKi9cbiAgICBtaW5XaWR0aD86IG51bWJlciB8IHN0cmluZztcbiAgICAvKiogTWF4aW11bSB3aWR0aCBjb25zdHJhaW50ICovXG4gICAgbWF4V2lkdGg/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1pbmltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtaW5IZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIE1heGltdW0gaGVpZ2h0IGNvbnN0cmFpbnQgKi9cbiAgICBtYXhIZWlnaHQ/OiBudW1iZXIgfCBzdHJpbmc7XG4gICAgLyoqIEV4cGxpY2l0IHdpZHRoIHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIHdpZHRoICovXG4gICAgZXhwbGljaXRXaWR0aD86IHN0cmluZyB8IG51bWJlcjtcbiAgICAvKiogRXhwbGljaXQgaGVpZ2h0IHNldCBieSBob3N0IC0gaWYgZGVmaW5lZCwgZG9uJ3QgYXV0by1zaXplIGhlaWdodCAqL1xuICAgIGV4cGxpY2l0SGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8qKiBGb3JjZSBhdXRvLXNpemUgZXZlbiBpZiBjb250YWluZXIgaGFzIGRpbWVuc2lvbnMgKi9cbiAgICBmb3JjZUF1dG9TaXplPzogYm9vbGVhbjtcbiAgICAvKiogTWluIGhlaWdodCB1c2VkIGJ5IGxvYWRlciB0byBkZXRlY3QgY29sbGFwc2UgKGRlZmF1bHQ6IDUwKSAqL1xuICAgIGxvYWRlck1pbkhlaWdodD86IG51bWJlcjtcbn1cblxuLy9UT0RPIDogY2hhbmdlIElNeW9wQ29tcG9uZW50IHRvIHJlZiBzcGVjaWZpYyBpbXBsXG50eXBlIFJlZlR5cGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IElNeW9wQ29tcG9uZW50IHwgUmVmXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgPSBhbnk+IHtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbjtcblxuICAgIG1hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuO1xuXG4gICAgc2V0SW5pdGlhdGVkOiAoKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gICAgLy9yZWYgY29tcG9uZW50cyBjYW4gYmUgZWxlbWVudC1sZXNzXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBzZW5kOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IENsZWFudXBIYW5kbGVyXG5cbiAgICBiaW5kKG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBiaW5kPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgLy8gYm9vbGVhbiByZXR1cm5lZCB2YWx1ZSA9IGhhbmRsZWQgb3Igbm90XG4gICAgb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gYm9vbGVhblxuXG4gICAgaW5pdGlhdGVkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBkaXNwb3NlOiAoKSA9PiB2b2lkXG5cbiAgICBoaWRlKCk6IHZvaWQ7XG5cbiAgICBzaG93KCk6IHZvaWQ7XG5cbiAgICBpbnNwZWN0KCk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBPYnNlcnZlcyB0aGUgaWZyYW1lIGNvbnRlbnQgc2l6ZSBhbmQgYXV0b21hdGljYWxseSBzeW5jcyBpdCB0byB0aGUgaWZyYW1lIGVsZW1lbnQuXG4gICAgICogT25seSBhdmFpbGFibGUgZm9yIGlmcmFtZS1iYXNlZCBjb21wb25lbnRzLiBVc2VzIGRpcmVjdCBjb250ZW50RG9jdW1lbnQgYWNjZXNzLlxuICAgICAqIEBwYXJhbSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIGluY2x1ZGluZyBzaXplIGNoYW5nZSBjYWxsYmFjayBhbmQgbWluL21heCBjb25zdHJhaW50c1xuICAgICAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gc3RvcCBvYnNlcnZpbmdcbiAgICAgKi9cbiAgICBvYnNlcnZlQXV0b1NpemU/OiAob3B0aW9ucz86IEF1dG9TaXplT3B0aW9ucykgPT4gQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZWQgbXlvcDpzaXplIG1ldGEgdGFnIGZyb20gdGhlIGNvbXBvbmVudCBIVE1MLlxuICAgICAqIFNldCBieSBIVE1MQ29tcG9uZW50TG9hZGVyIGJlZm9yZSBpZnJhbWUgY3JlYXRpb24uXG4gICAgICogVXNlZCBieSB0aGUgUmVhY3QgaG9zdCB0byBkZXRlcm1pbmUgc2l6aW5nIG1vZGUgKGZpbGwgdnMgY29udGVudCkuXG4gICAgICovXG4gICAgc2l6ZU1ldGE/OiB7IHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyOyBoZWlnaHQ/OiBzdHJpbmcgfCBudW1iZXI7IG1pbldpZHRoPzogbnVtYmVyOyBtYXhXaWR0aD86IG51bWJlcjsgbWluSGVpZ2h0PzogbnVtYmVyOyBtYXhIZWlnaHQ/OiBudW1iZXIgfSB8IG51bGw7XG5cbiAgICBwYXJlbnQ/OiBJTXlvcENvbXBvbmVudDtcblxuICAgIHByb3BzOiBQXG5cbiAgICByZWZzOiBSXG59XG5cbmZ1bmN0aW9uIGlzSW5oZXJpdEZyb20ob2JqOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gYmFzZUNsYXNzLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luaGVyaXRGcm9tKHByb3RvLCBiYXNlQ2xhc3MpO1xufVxuXG4vLyBUT0RPIDogbW92ZSA6IFxudHlwZSBtZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiBib29sZWFuO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiBleHRlbmRzIFJlZlR5cGVzID0gUmVmVHlwZXM+IGltcGxlbWVudHMgSU15b3BDb21wb25lbnQ8UD4ge1xuICAgIGlkOiBzdHJpbmcgPSAnJ1xuXG4gICAgbWVzc2FnZUhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBtZXNzYWdlSGFuZGxlcjxhbnk+W10+ID0ge307XG5cbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgfHwgSG9zdFNESy5JbnN0YW5jZSgpLmFzc2lnbklkKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/IG9wdGlvbnM/LnRpbWVvdXQgOiA1ICogMTAwMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQgJiYgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCAmJiAhdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGB0aW1lb3V0XyR7dGltZW91dH0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAvLyBUT0RPIDogYXV0byBpbnNwZWN0LCBjb250cm9sIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAod2luZG93Lm15b3AuaG9zdFNESy5pbnNwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2Ugc2RrLmxvZ2dlclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlzcG9zaW5nIGJlZm9yZSBpc0luaXRpYXRlZCcsIHRoaXMuaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICBjb25zdCBvbkRpc3Bvc2VIYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzWydvbkRpc3Bvc2UnXVxuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBjb25zdCBFcnJvcnMgPSB7XG4gICAgbm90U2VyaWFsaXphYmxlUmVmQ2FsbDogKHByb3AsIGFyZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuVGhlIGlucHV0IHByb3ZpZGVkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGlzIG5vdCBzZXJpYWxpemFibGUuIFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgY2FuIGJlIHNhZmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgc2tpbiBpbXBsZW1lbnRhdGlvbi4gXG5UaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQgbm9uLXNlcmlhbGl6YWJsZSBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZDpcblxuLSBGdW5jdGlvbnNcbi0gRE9NIGVsZW1lbnRzXG4tIENsYXNzIGluc3RhbmNlc1xuLSBDaXJjdWxhciByZWZlcmVuY2VzXG4tIFN5bWJvbHNcbi0gQmlnSW50IHZhbHVlc1xuXG5JbiB0aGUgZm9sbG93aW5nIGV4ZWN1dGlvbiB3ZSBkZXRlY3RlZCA6XG5+fn5+fn5+flxuJHthcmd9IFxufn5+fn5+fn5cbmFzIG5vdCBzZXJpYWxpemFibGUuXG5cblRvIHJlc29sdmUgdGhpcyBpc3N1ZSwgcGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBpbnB1dHMgcGFzc2VkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGFyZSBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtYXQuXG5UaGlzIHR5cGljYWxseSBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zKSwgYXJyYXlzLCBhbmQgcGxhaW4gb2JqZWN0cy4gXG5JZiB5b3UgbmVlZCB0byBpbmNsdWRlIGNvbXBsZXggZGF0YSB0eXBlcywgY29uc2lkZXIgY29udmVydGluZyB0aGVtIHRvIGEgc2VyaWFsaXphYmxlIHN0cnVjdHVyZSBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBmdW5jdGlvbi5cbk9yIHVzZSBNeW9wIG1lc3NhZ2UgdGhhdCBzdXBwb3J0IGl0OiBDdXN0b21SZWZNZXNzYWdlLCBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSBvciBFeGVjdXRlU2NyaXB0TWVzc2FnZS5cblxuU3VnZ2VzdGVkIEZpeDpcbjEuIFJlbW92ZSBvciByZXBsYWNlIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIGZyb20geW91ciBpbnB1dC5cbjIuIElmIHVzaW5nIG9iamVjdHMsIGVuc3VyZSB0aGV5IGRvIG5vdCBjb250YWluIGFueSBmdW5jdGlvbnMgb3IgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbjMuIENvbnZlcnQgYW55IGNsYXNzIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzIG9yIEpTT04tY29tcGF0aWJsZSBmb3JtYXRzLlxuNC4gVXNlIGRlZGljYXRlZCBNeW9wIG1lc3NhZ2UuXG5cbkZvciBtb3JlIGRldGFpbHMgb24gc2VyaWFsaXphdGlvbiBhbmQgTXlvcCBtZXNzYWdlIGV4YW1wbGVzLCByZWZlciB0byBodHRwczovL2RvY3MubXlvcC5kZXZcXC5cblxuYCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudCwgSU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VudmVsb3BlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9FbnZlbG9wZWRNZXNzYWdlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wUmVmQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgcGFyZW50OiBJTXlvcENvbXBvbmVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgLy9UT0RPIDogY2hlY2sgcGFyZW50Q29tcG9uZW50LmNvbnRhaW5lci4uLlxuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBwYXJlbnQuY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICAvL3RoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZChhcmd1bWVudHMuY2FsbGVlLm5hbWUpKTtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdoaWRlJykpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2hvdycpKTtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlYWwgY2xlYW51cFxuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgaW5zcGVjdCBjYWxsZWQsIGNyZWF0aW5nIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgaW5zcGVjdCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIHRoaXMuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdpbnNwZWN0JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0JykpO1xuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJykge1xuICAgICAgICAvLyAgZGVidWdnZXI7XG4gICAgICAgIC8vICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBtZXNzYWdlIHNlbmRpbmcgJywgbWVzc2FnZSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gdGhpcy5pZCB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUgbmVzdGVkIGNvbXBvbmVudFxuICAgICAgICB0aGlzLnBhcmVudC5zZW5kKG5ldyBFbnZlbG9wZWRNZXNzYWdlKHRoaXMuaWQsIG1lc3NhZ2UpKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnZGlzcG9zZScpKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5cbi8qKlxuICogQ29tcG9uZW50IHdyYXBwZXIgZm9yIE15b3AgV2ViIENvbXBvbmVudHMgdGhhdCBhcmUgZXh0cmFjdGVkIGZyb20gSFRNTFxuICogYW5kIHJ1biBkaXJlY3RseSBvbiB0aGUgaG9zdCBkb2N1bWVudCAobm90IGluIGFuIGlmcmFtZSkuXG4gKlxuICogVGhlc2UgY29tcG9uZW50cyB1c2UgdGhlIG5hdGl2ZSBXZWIgQ29tcG9uZW50cyBBUEkgKEN1c3RvbSBFbGVtZW50cyArIFNoYWRvdyBET00pXG4gKiBhbmQgY29tbXVuaWNhdGUgdmlhIGRpcmVjdCBtZXRob2QgY2FsbHMgYW5kIEN1c3RvbUV2ZW50cyBpbnN0ZWFkIG9mIHBvc3RNZXNzYWdlLlxuICovXG5leHBvcnQgY2xhc3MgTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcbiAgICBwcml2YXRlIGN0YUNsZWFudXA/OiAoKSA9PiB2b2lkO1xuICAgIHByaXZhdGUgX2N0YUhhbmRsZXI/OiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQ7XG4gICAgcHJpdmF0ZSBfY3RhUXVldWU6IEFycmF5PHthY3Rpb246IHN0cmluZywgcGF5bG9hZDogdW5rbm93bn0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgcHJpdmF0ZSB0YWdOYW1lOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudERlZmluaXRpb24sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG5cbiAgICAgICAgLy8gV2ViIGNvbXBvbmVudHMgYXJlIGluaXRpYXRlZCBpbW1lZGlhdGVseSAobm8gcG9zdE1lc3NhZ2UgaGFuZHNoYWtlIG5lZWRlZClcbiAgICAgICAgdGhpcy5zZXRJbml0aWF0ZWQoKTtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7fTtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEluaXRpYWxpemUgdGhlIGNvbXBvbmVudCB3aXRoIGRhdGEgYnkgY2FsbGluZyBteW9wX2luaXRfaW50ZXJmYWNlIGRpcmVjdGx5XG4gICAgICovXG4gICAgaW5pdFdpdGhEYXRhKGRhdGE6IHVua25vd24pOiB2b2lkIHtcbiAgICAgICAgaWYgKHR5cGVvZiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UoZGF0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgY3VycmVudCBkYXRhIGZyb20gdGhlIGNvbXBvbmVudFxuICAgICAqL1xuICAgIGdldERhdGEoKTogdW5rbm93biB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuY3VzdG9tRWxlbWVudCBhcyBhbnkpLm15b3BfaW5pdF9pbnRlcmZhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5jdXN0b21FbGVtZW50IGFzIGFueSkubXlvcF9pbml0X2ludGVyZmFjZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IENUQSBoYW5kbGVyIC0gdW5pZmllZCBBUEkgd2l0aCBpZnJhbWUgY29tcG9uZW50cy5cbiAgICAgKiBDYWxsZWQgdmlhIHByb3BzLm15b3BfY3RhX2hhbmRsZXIgPSBoYW5kbGVyXG4gICAgICovXG4gICAgc2V0Q3RhSGFuZGxlcihoYW5kbGVyOiAoYWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2xlYW4gdXAgcHJldmlvdXMgbGlzdGVuZXIgaWYgZXhpc3RzXG4gICAgICAgIGlmICh0aGlzLmN0YUNsZWFudXApIHtcbiAgICAgICAgICAgIHRoaXMuY3RhQ2xlYW51cCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY3RhSGFuZGxlciA9IGhhbmRsZXI7XG5cbiAgICAgICAgLy8gRmx1c2ggYW55IHF1ZXVlZCBDVEFzIHRoYXQgZmlyZWQgYmVmb3JlIGhhbmRsZXIgd2FzIHNldFxuICAgICAgICBpZiAodGhpcy5fY3RhUXVldWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgcXVldWUgPSBbLi4udGhpcy5fY3RhUXVldWVdO1xuICAgICAgICAgICAgdGhpcy5fY3RhUXVldWUgPSBbXTtcbiAgICAgICAgICAgIHF1ZXVlLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIoaXRlbS5hY3Rpb24sIGl0ZW0ucGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdXAgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAoZTogRXZlbnQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gZSBhcyBDdXN0b21FdmVudDtcbiAgICAgICAgICAgIGlmIChjdXN0b21FdmVudC5kZXRhaWw/LmFjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jdGFIYW5kbGVyICYmICF0aGlzLm1hcmtlZEZvckRpc3Bvc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2N0YUhhbmRsZXIoY3VzdG9tRXZlbnQuZGV0YWlsLmFjdGlvbiwgY3VzdG9tRXZlbnQuZGV0YWlsLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2N0YUhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUXVldWUgaWYgaGFuZGxlciBub3QgeWV0IHNldCAoc2hvdWxkbid0IGhhcHBlbiBhZnRlciBzZXRDdGFIYW5kbGVyLCBidXQgc2FmZXR5KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdGFRdWV1ZS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogY3VzdG9tRXZlbnQuZGV0YWlsLmFjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQ6IGN1c3RvbUV2ZW50LmRldGFpbC5wYXlsb2FkXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbXlvcC1jdGEnLCBsaXN0ZW5lcik7XG4gICAgICAgIHRoaXMuY3RhQ2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdteW9wLWN0YScsIGxpc3RlbmVyKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1lc3NhZ2UtYmFzZWQgY29tcG9uZW50cy5cbiAgICAgKiBXZWIgY29tcG9uZW50cyBkb24ndCB1c2UgcG9zdE1lc3NhZ2UsIHNvIHRoaXMgaXMgYSBuby1vcCBmb3IgbW9zdCBtZXNzYWdlcy5cbiAgICAgKi9cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZTxhbnk+KSA9PiB7XG4gICAgICAgIC8vIFdlYiBjb21wb25lbnRzIGRvbid0IHVzZSB0aGUgcG9zdE1lc3NhZ2Ugc3lzdGVtXG4gICAgICAgIC8vIEluc3RlYWQsIGludGVyYWN0IGRpcmVjdGx5IHZpYSBwcm9wcy5teW9wX2luaXRfaW50ZXJmYWNlIGFuZCBwcm9wcy5teW9wX2N0YV9oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlKTtcblxuICAgICAgICAvLyBMb2cgZm9yIGRlYnVnZ2luZ1xuICAgICAgICBjb25zb2xlLmRlYnVnKCdbTXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudF0gc2VuZCgpIGNhbGxlZCAtIHdlYiBjb21wb25lbnRzIHVzZSBkaXJlY3QgQVBJIGluc3RlYWQnLCBtZXNzYWdlKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY3RhQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5jdGFDbGVhbnVwKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiLy90eXBlIEFDb25zdHJ1Y3RvclR5cGVPZjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEN1c3RvbVJlZk1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBtZXNzYWdlcyBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQ2xlYW51cEhhbmRsZXIsIElDb21wb25lbnRDb25maWcsXG4gICAgdHlwZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50UmVmQmVoYXZpb3IsIElIVE1MTG9hZGVyQ29uZmlnLCBJUHJvcENvZGVCZWhhdmlvcixcbiAgICBJUHJvcENvbmZpZywgSVNraW5Db25maWcsIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIFJlZkJlaGF2aW9yVHlwZSwgU2hhZG93Um9vdE1vZGVUeXBlLCBTa2luTG9hZGVycywgU2tpbkxvYWRlclR5cGVcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtjb250YWluc1ByaW1pdGl2ZXNPbmx5fSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7RXJyb3JzfSBmcm9tIFwiLi9sb2dNZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcEV4dHJhY3RlZFdlYkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuL2hvc3RTREtcIjtcblxudHlwZSBjb21wb25lbnREZWZpbml0aW9uUHJvcHMgPSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1sncHJvcHMnXVxuXG5jb25zdCBjcmVhdGVEZWJ1Z1RpdGxlID0gKHRleHQ6IHN0cmluZywgdG9wOiBudW1iZXIsIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSA9PiB7XG4gICAgY29uc3QgdGl0bGVFbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICB0aXRsZUVsLnRleHRDb250ZW50ID0gdGV4dDtcbiAgICB0aXRsZUVsLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJztcbiAgICB0aXRsZUVsLnN0eWxlLnBhZGRpbmcgPSAnMCA1cHgnO1xuICAgIHRpdGxlRWwuc3R5bGUuZm9udFNpemUgPSAnMTRweCc7XG4gICAgdGl0bGVFbC5zdHlsZVsndG9wJ10gPSAnMCc7XG4gICAgdGl0bGVFbC5zdHlsZS50b3AgPSBgJHt0b3B9cHhgO1xuICAgIC8vdGl0bGVFbC5zdHlsZS5sZWZ0ID0gJzUwJSc7XG4gICAgdGl0bGVFbC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgtNTAlKSc7XG4gICAgdGl0bGVFbC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICB0aXRsZUVsLmhyZWYgPSBgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudERlZmluaXRpb25Db25maWcuaWR9YFxuXG4gICAgcmV0dXJuIHRpdGxlRWw7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0RGVidWdTdHlsZSA9IChpZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RWxlbWVudDogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgIC8vIzAwN0JGRiAoYmx1ZSkgb3IgI0ZGNTcyMiAob3JhbmdlKVxuICAgIC8vIzRDQUY1MCAoZ3JlZW4pIG9yICNGRkMxMDcgKGFtYmVyKVxuICAgIC8vIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2lkfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnN0IHRvcFRleHQgPSBjcmVhdGVEZWJ1Z1RpdGxlKGAke2NvbXBvbmVudERlZmluaXRpb25Db25maWcubmFtZX0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKHRvcFRleHQsIGNvbXBvbmVudEVsZW1lbnQpO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjMDA3QkZGJztcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAndW5zZXQnO1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ2hpbGQodG9wVGV4dCk7XG4gICAgfVxufVxuXG5jb25zdCByZXBvcnRFcnJvciA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBpZiAoIXByb3BDb25maWcpIHtcblxuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgLy8gdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEVycm9yOiBVbmRlZmluZWQgUHJvcFxcblxcbmAgK1xuICAgICAgICAgICAgYEl0IGxvb2tzIGxpa2UgeW91J3ZlIHRyaWVkIHRvIHVzZSBhIHByb3AgdGhhdCBoYXNuJ3QgYmVlbiBkZWZpbmVkLlxcbmAgK1xuICAgICAgICAgICAgYFBsZWFzZSBjaGVjayB0aGUgcHJvcCBuYW1lIGZvciBhbnkgdHlwb3Mgb3IgZW5zdXJlIHRoYXQgaXQgaXMgcHJvcGVybHkgZGVmaW5lZCBpbiB0aGUgY29tcG9uZW50J3MgcHJvcCBsaXN0LlxcblxcbmAgK1xuICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2Vcbn1cblxuY29uc3QgcmVwb3J0VW5zdXBwb3J0ZWQgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yOiBDb2RlIFByb3AgTm90IFN1cHBvcnRlZFxcblxcbmAgK1xuICAgICAgICBgQ3VycmVudGx5LCBjb2RlIHByb3BzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBsb2NhbCBmcmFtZSBjb21wb25lbnRzLlxcbmAgK1xuICAgICAgICBgXHUyNkEwXHVGRTBGIFRoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGZlYXR1cmUgXHUyMDE0IGNvZGUgcHJvcHMgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gdXBjb21pbmcgdmVyc2lvbnMuXFxuXFxuYCArXG4gICAgICAgIGBJbiB0aGUgbWVhbnRpbWUsIHlvdSBjYW4gdXNlIG1lc3NhZ2UgcHJvcHMuXFxuXFxuYCArXG4gICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgIGBDb21wb25lbnQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ubmFtZX0sIElEOiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfVxcblxcbmAgK1xuICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RQcm9wcyA9IDxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPihjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBwcm9wc0NvbmZpZzogSVByb3BDb25maWdbXSwgc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuXG4gICAgY29uc3QgcHJvcHNNYXAgPSBwcm9wc0NvbmZpZy5yZWR1Y2UoKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4ucHJldmlvdXNWYWx1ZSxcbiAgICAgICAgICAgIFtjdXJyZW50VmFsdWUubmFtZV06IHsuLi5jdXJyZW50VmFsdWV9XG4gICAgICAgIH1cbiAgICB9LCB7fSk7XG5cbiAgICBjb25zdCBwcm9wc0hhbmRsZXIgPSB7XG4gICAgICAgIGdldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIEZJUlNUXG4gICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wTmFtZSA9IHR5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3A7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9pbml0X2ludGVyZmFjZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgZ2V0cy9zZXRzIGRhdGEgKG1hdGNoZXMgaWZyYW1lIGJlaGF2aW9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkYXRhPzogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG15b3BfY3RhX2hhbmRsZXIsIHJldHVybiB1bmRlZmluZWQgKGl0J3Mgd3JpdGUtb25seSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBGb3IgaWZyYW1lIChsb2NhbEZyYW1lKSBjb21wb25lbnRzXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZExvYWRlci5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuZWxlbWVudC5jb250ZW50V2luZG93W3R5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3BdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcubW9kZSA9PT0gJ291dHB1dCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVBhcmFtczogYW55W10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaChSZWYuY3JlYXRlKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IG1lc3NhZ2VDdG9yKC4uLm1lc3NhZ2VQYXJhbXMpKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZywgdmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleHRyYWN0ZWQgd2ViIGNvbXBvbmVudHMgRklSU1QgKGJlZm9yZSBsb2NhbEZyYW1lIGNoZWNrKVxuICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgZXh0cmFjdGVkIHdlYiBjb21wb25lbnRzIG1heSBoYXZlIHNoYWRvd1Jvb3RNb2RlOiBsb2NhbEZyYW1lIGluIHRoZWlyIGNvbmZpZ1xuICAgICAgICAgICAgICAgIC8vIGJ1dCB0aGV5IHJ1biBkaXJlY3RseSBvbiB0aGUgaG9zdCBkb2N1bWVudCwgbm90IGluIGFuIGlmcmFtZVxuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUHJvcEJlaGF2aW9yID0gcHJvcENvbmZpZy5iZWhhdmlvciBhcyBJUHJvcENvZGVCZWhhdmlvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSB0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfY3RhX2hhbmRsZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2V0Q3RhSGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gJ215b3BfaW5pdF9pbnRlcmZhY2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5pdFdpdGhEYXRhKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRm9yIGlmcmFtZSAobG9jYWxGcmFtZSkgY29tcG9uZW50c1xuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUgPT09IFNraW5Mb2FkZXJzLkhUTUxMb2FkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRMb2FkZXIgPSBzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50V2luZG93ID0gKGNvbXBvbmVudC5lbGVtZW50IGFzIEhUTUxJRnJhbWVFbGVtZW50KS5jb250ZW50V2luZG93IGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BOYW1lID0gdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSByZWFsIGhhbmRsZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRXaW5kb3dbcHJvcE5hbWVdID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIENUQSBxdWV1ZSBpZiB0aGlzIGlzIG15b3BfY3RhX2hhbmRsZXIgYW5kIHF1ZXVlIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BOYW1lID09PSAnbXlvcF9jdGFfaGFuZGxlcicgJiYgY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVldWUgPSBjb250ZW50V2luZG93Ll9fbXlvcF9jdGFfcXVldWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFdpbmRvdy5fX215b3BfY3RhX3F1ZXVlID0gbnVsbDsgLy8gQ2xlYXIgdG8gcHJldmVudCBkb3VibGUtZmx1c2hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS5mb3JFYWNoKChpdGVtOiB7YWN0aW9uOiBzdHJpbmcsIHBheWxvYWQ6IGFueX0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBjb21wb25lbnQgd2FzIGRpc3Bvc2VkIGR1cmluZyBmbHVzaFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkKSByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKGl0ZW0uYWN0aW9uLCBpdGVtLnBheWxvYWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYocHJvcENvbmZpZy5iZWhhdmlvciA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMubWVzc2FnZSlcbiAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgbXVsdGkgYmVoYXZpb3JzXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3I6IFVuc3VwcG9ydGVkIEJlaGF2aW9yXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSAnYmVoYXZpb3InIGZpZWxkIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCZWhhdmlvciBGaWVsZDogJHtwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGV9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB2YWxpZCBiZWhhdmlvciBvcHRpb25zLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnQucHJvcHMgPSB7fTtcbiAgICBjb21wb25lbnQucHJvcHMgPSBuZXcgUHJveHkoY29tcG9uZW50LnByb3BzLCBwcm9wc0hhbmRsZXIpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyAoT21pdDxJTXlvcENvbXBvbmVudCwgJ3Byb3BzJz4gJiB7XG4gICAgICAgIHByb3BzOiBwcm9wVHlwZXM8VD5cbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmUHJveHkgPSAodGFyZ2V0OiBSZWYsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG5cbiAgICAgICAgICAgIC8vIGlmIChwcm9wID09PSAnX19ub25Qcm94aWVkJykge1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0YXJnZXRbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZ2V0dGVyRnVuY3Rpb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmZvckVhY2goYXJnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seShhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLm5vdFNlcmlhbGl6YWJsZVJlZkNhbGwocHJvcCwgYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgZnVuY3Rpb25BcmdzLCBtYWtlU2VyaWFsaXphYmxlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZltwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHJlZltwcm9wTmFtZV0oLi4uZnVuY3Rpb25BcmdzKSwgdHJ1ZSkgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIGl0cyByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHZhbHVlLCB0cnVlKTsgLy8gUmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IHRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3M6IGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtc2cuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vVE9ETzogd2UgY2FuIGltcGxlbWVudCB0aGluZ3MgbGlrZSBhdXRvIHNlcmlhbGl6YXRpb24gYW5kIGJpbmRpbmcgZnVuY3Rpb25zIGhlcmVcbiAgICAgICAgICAgIC8vZ2V0dGVyRnVuY3Rpb24udGVzdCA9ICcxMjMnO1xuXG4gICAgICAgICAgICByZXR1cm4gZ2V0dGVyRnVuY3Rpb247XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3A6IHN0cmluZywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgcHJvcFZhbHVlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogZml4IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2c/XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZkNvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4ocmVmOiBSZWYsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBjb25zdCBjb21wb25lbnQgPSByZWYuY29tcG9uZW50O1xuICAgIGlmICghY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbnQgY3JlYXRlUmVmQ29tcG9uZW50IHdpdGggZGV0YWNoZWQgcmVmJyk7XG5cbiAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJywgcmVmLCBjb21wb25lbnRDb25maWcpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLnR5cGUsIGNvbXBvbmVudCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaChyZWZDb21wb25lbnQpO1xuXG4gICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHJlZiBjb21wb25lbnRzIGRlZmluZSBpbiB0aGUgY29tcG9uZW50IGNvbmZpZ1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByb290IGNvbXBvbmVudCB0aGUgYmUgaW5pdGlhdGVkIGJlZm9yZSBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuXG4gICAgICAgIC8vVE9ETyA6XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vcmVqZWN0KCd0aW1lb3V0PycpO1xuICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgIH0sIDUwMDApO1xuXG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKHJlZi5yZWZDb25maWcsXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyA/IG9wdGlvbnMgOiB7fSxcbiAgICAgICAgICAgICAgICBpZDogcmVmQ29tcG9uZW50LmlkLFxuICAgICAgICAgICAgICAgIF9oYXNQYXJlbnQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyAobWVzc2FnZSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGltZW91dCBhbHJlYWR5IHBhc3NlZFxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOlxuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT0gcmVmQ29tcG9uZW50LmlkKTtcblxuICAgICAgICAgICAgICAgIC8vc2FtZSBtZW1vcnkgZW52LCBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21wb25lbnQgIT09IHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBjbGVhbiByZWZDb21wb25lbnQgP1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaGVyZSA+XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogd2hhdCBhYm91dCByZWFwdGVycyA/ISBkeW5hbWljID8hXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZXhzaXN0aW5nUmVmQ29tcG9uZW50ID0gY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSBhcyBNeW9wUmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vIGlmIChleHNpc3RpbmdSZWZDb21wb25lbnQuaWQgJiYgZXhzaXN0aW5nUmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gW2NvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0sIHJlZkNvbXBvbmVudF07XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0ucHVzaChyZWZDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7IC8vaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSByZWZDb21wb25lbnQuaWQpITtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBpbiB3ZWJjb21wb25lbnQgY2FzZSB0aGUgc2FtZSBpZCB3aWxsIGFscmVkYXkgYmUgaGVyZSwgd2hpY2ggaXMgZ29vZCAhXG4gICAgICAgICAgICAgICAgLy8gbmFtZTpcbiAgICAgICAgICAgICAgICAvLyAgICAgaWRcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkXG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgaW5uZXIgY29tcG9uZW50cyBpbnNpZGUgcmVmIGNvbXBvbmVudCA6XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5uZXN0ZWRSZWZzLmZvckVhY2gobmVzdGVkUmVmQ29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHMhLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpIS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zPy5maW5kKGRlZiA9PiBkZWYuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpITtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVmQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLnR5cGUucmVmcy5maW5kKHIgPT4gci5uYW1lID09PSBuZXN0ZWRSZWZDb25maWcucmVmTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlZkNvbmZpZyBmb3VuZCBmb3IgbmVzdGVkIHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uLCByZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDb21wb25lbnQuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5yZWZzW25lc3RlZFJlZkNvbmZpZy5yZWZOYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKG5lc3RlZENvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKHJlZkNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOnVzZSBjb25maWcgY2hlY2sgZm9yIGF1dG8taGlnaHQgYW5kIGNvbnZlcnQgdHlwZSBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWZDb21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UmVmcyA9IGFzeW5jIChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIHdpdGhvdXRSZWZDb21wb25lbnRzOiBib29sZWFuID0gZmFsc2UpID0+IHtcblxuICAgIGlmICghY29tcG9uZW50LnJlZnMpXG4gICAgICAgIGNvbXBvbmVudC5yZWZzID0ge307XG5cbiAgICBjb25zdCB3YWl0Rm9yID0gT2JqZWN0LnZhbHVlcyhjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZWZzKS5tYXAocmVmID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWYuYmVoYXZpb3IudHlwZSA9PSBSZWZCZWhhdmlvclR5cGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID1cblxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0UmVmQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hhbmdlIHRvIGdldCBpdCBmcm9tIHRoZSBmbG93XG4gICAgICAgICAgICAgICAgbGV0IHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmNvbXBvbmVudElkO1xuICAgICAgICAgICAgICAgIGlmICghcmVmQ29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmluc3RhbmNlLmNvbXBvbmVudElkXG5cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy90aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMhLmZpbmQoY29tcGRlZiA9PiBjb21wZGVmLmlkID09PSByZWZDb21wb25lbnRJZCkhO1xuICAgICAgICAgICAgICAgIC8vIC8vY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGF3YWl0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcoY29tcG9uZW50SW5zdGFuY2VDb25maWcuY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGlmIHdlIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlIHdlIHdpbGwgbmVlZCBpbnN0YW5jZSBpZCBoZXJlIC4uLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/LmZpbmQobmVzdGVkQ29tcG9uZW50ID0+IG5lc3RlZENvbXBvbmVudC50eXBlLmlkID09PSByZWZDb21wb25lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZENvbXBvbmVudENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IG5lc3RlZENvbXBvbmVudENvbmZpZyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jb25zdCBjb21wb25lbnRJbnN0YW5jZUNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5uZXN0ZWRDb21wb25lbnRzPy5maW5kKGNvbXBvbmVudEluc3RhY2UgPT4gY29tcG9uZW50SW5zdGFjZS5jb21wb25lbnRJZCA9PT0gY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpe1xuICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8gVE9ETyBUT0RPICcpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDp0aGluayBhYm91dCB0aGF0IDpcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWcucmVzb2x2ZWREZWZpbml0aW9ucyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM7XG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgaW5zdGFuY2U6IG5lc3RlZENvbXBvbmVudENvbmZpZy5pbnN0YW5jZSEsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgbmFtZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLm5hbWVcbiAgICAgICAgICAgICAgICAvLyAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IF9yZWYgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCduZXN0ZWQgISEgY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQoX3JlZiwgbmVzdGVkQ29tcG9uZW50Q29uZmlnISwgY29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgICAgLy9URE9PIDogcHV0IHRoYXQgcmVmIGNvbXBvbmVudCBzb21ld2hlcmU/XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vblByb3hpZWQgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IGNyZWF0ZVJlZlByb3h5KF9fbm9uUHJveGllZCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnPycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB0eXBlIHByb3BUeXBlczxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPiA9IHtcbiAgICBbUHJvcGVydHkgaW4ga2V5b2YgVF06XG4gICAgVFtQcm9wZXJ0eV0gZXh0ZW5kcyB7IG1vZGU6ICdpbnB1dCcgfSA/XG4gICAgICAgIFRbUHJvcGVydHldWyd0eXBlJ10gOlxuICAgICAgICBQcm9taXNlPFRbUHJvcGVydHldWyd0eXBlJ10+XG59XG5cbmV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG5cbmV4cG9ydCBjb25zdCBhY3RBcyA9IDxUPihyZWY6IFJlZikgPT4ge1xuICAgIHJldHVybiByZWYgYXMgdW5rbm93biBhcyBGdW5jdGlvbmlmeVJlZjxUPlxufVxuXG5leHBvcnQgdHlwZSBGdW5jdGlvbmlmeVJlZjxUID0gYW55PiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIC8vIElmIGl0J3MgYSBmdW5jdGlvblxuICAgICAgICA/ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFI+IC8vIENvbnZlcnQgaXQgdG8gYSBwcm9taXNlZCBmdW5jdGlvblxuICAgICAgICA6IFRbS11cbn07XG4iLCAiaW1wb3J0IHtBdXRvU2l6ZU9wdGlvbnMsIEJhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTWVzc2FnZURpcmVjdGlvblxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzLnRzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgcHJpdmF0ZSBfYXV0b1NpemVDbGVhbnVwPzogQ2xlYW51cEhhbmRsZXI7XG4gICAgcHJpdmF0ZSBfYXV0b1NpemVPcHRpb25zPzogQXV0b1NpemVPcHRpb25zO1xuICAgIHByaXZhdGUgX2F1dG9TaXplVXBkYXRlPzogKCkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnRDb25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudENvbmZpZywgY29udGFpbmVyLCBvcHRpb25zKVxuXG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuSWZyYW1lRWxlbWVudDtcbiAgICAgICAgLy8gdGhpcy5JZnJhbWVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKCkgPT4ge1xuICAgICAgICAvLyAgICAgaWYgKHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QpXG4gICAgICAgIC8vICAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdChgSWZyYW1lRWxlbWVudCBlcnJvcmApO1xuICAgICAgICAvLyB9KTtcbiAgICB9XG5cbiAgICBzaXplTWV0YT86IHsgd2lkdGg/OiBzdHJpbmcgfCBudW1iZXI7IGhlaWdodD86IHN0cmluZyB8IG51bWJlcjsgbWluV2lkdGg/OiBudW1iZXI7IG1heFdpZHRoPzogbnVtYmVyOyBtaW5IZWlnaHQ/OiBudW1iZXI7IG1heEhlaWdodD86IG51bWJlciB9IHwgbnVsbDtcblxuICAgIGNsZWFudXBJbnNwZWN0PzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvLyBUT0RPIDogdXNlIGJldHRlciBjaGVjayBmb3IgaW5zcGVjdCBtb2RlXG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdpbnNwZWN0IGNhbGwgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BJZnJhbWVDb21wb25lbnQnLCAxMCwgdGhpcy5jb250YWluZXIsIHRoaXMuSWZyYW1lRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QhKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9ic2VydmVTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7c2VuZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBzZW5kKHtoZWlnaHQsIHdpZHRofSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT2JzZXJ2ZXMgdGhlIGlmcmFtZSBjb250ZW50IHNpemUgYW5kIGF1dG9tYXRpY2FsbHkgc3luY3MgaXQgdG8gdGhlIGlmcmFtZSBlbGVtZW50LlxuICAgICAqIFVzZXMgZGlyZWN0IGNvbnRlbnREb2N1bWVudCBhY2Nlc3MgKHNhbWUtb3JpZ2luIG9ubHkpIGZvciBhY2N1cmF0ZSBtZWFzdXJlbWVudHMuXG4gICAgICpcbiAgICAgKiBSZWVudHJhbnQ6IHdoZW4gY2FsbGVkIGFnYWluIHdoaWxlIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCB1cGRhdGVzIG9wdGlvbnMgYW5kXG4gICAgICogcmUtZXZhbHVhdGVzIHNpemluZyB3aXRob3V0IHJlY3JlYXRpbmcgb2JzZXJ2ZXJzLiBDbGVhbnVwICsgcmUtY2FsbCAoZS5nLiBSZWFjdFxuICAgICAqIHJlLXJlbmRlcikgY3JlYXRlcyBmcmVzaCBvYnNlcnZlcnMgc2luY2UgY2xlYW51cCBjbGVhcnMgdGhlIGV4aXN0aW5nIG9uZXMuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgc2l6ZSBjaGFuZ2UgY2FsbGJhY2sgYW5kIG1pbi9tYXggY29uc3RyYWludHNcbiAgICAgKiBAcmV0dXJucyBDbGVhbnVwIGZ1bmN0aW9uIHRvIHN0b3Agb2JzZXJ2aW5nXG4gICAgICovXG4gICAgb2JzZXJ2ZUF1dG9TaXplID0gKG9wdGlvbnM/OiBBdXRvU2l6ZU9wdGlvbnMpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIC8vIFN0b3JlIG9wdGlvbnMgc28gdXBkYXRlU2l6ZSBhbHdheXMgcmVhZHMgdGhlIGxhdGVzdFxuICAgICAgICB0aGlzLl9hdXRvU2l6ZU9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIC8vIElmIG9ic2VydmVycyBhbHJlYWR5IGV4aXN0LCByZS1ldmFsdWF0ZSB3aXRoIG5ldyBvcHRpb25zIGFuZCByZXVzZSB0aGVtXG4gICAgICAgIGlmICh0aGlzLl9hdXRvU2l6ZUNsZWFudXAgJiYgdGhpcy5fYXV0b1NpemVVcGRhdGUpIHtcbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fYXV0b1NpemVDbGVhbnVwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICBjb25zdCBkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50O1xuXG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ1tNeW9wSWZyYW1lQ29tcG9uZW50XSBDYW5ub3Qgb2JzZXJ2ZSBhdXRvIHNpemU6IGNvbnRlbnREb2N1bWVudCBub3QgYWNjZXNzaWJsZScpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhbXAgPSAodmFsdWU6IG51bWJlciwgbWluPzogbnVtYmVyLCBtYXg/OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgICAgICAgaWYgKG1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlIDwgbWluKSByZXR1cm4gbWluO1xuICAgICAgICAgICAgaWYgKG1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlID4gbWF4KSByZXR1cm4gbWF4O1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFBhcnNlIENTUyBzaXplIHZhbHVlcyB0byBudW1iZXJzXG4gICAgICAgIGNvbnN0IHBhcnNlU2l6ZSA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gaXNOYU4ocGFyc2VkKSA/IHVuZGVmaW5lZCA6IHBhcnNlZDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB1cGRhdGVTaXplID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udGVudERvYyA9IGlmcmFtZS5jb250ZW50RG9jdW1lbnQ7XG4gICAgICAgICAgICBpZiAoIWNvbnRlbnREb2MpIHJldHVybjtcblxuICAgICAgICAgICAgY29uc3Qgb3B0cyA9IHRoaXMuX2F1dG9TaXplT3B0aW9ucztcblxuICAgICAgICAgICAgY29uc3QgbWluV2lkdGggPSBwYXJzZVNpemUob3B0cz8ubWluV2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbWF4V2lkdGggPSBwYXJzZVNpemUob3B0cz8ubWF4V2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gcGFyc2VTaXplKG9wdHM/Lm1pbkhlaWdodCk7XG4gICAgICAgICAgICBjb25zdCBtYXhIZWlnaHQgPSBwYXJzZVNpemUob3B0cz8ubWF4SGVpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlck1pbkhlaWdodCA9IG9wdHM/LmxvYWRlck1pbkhlaWdodCA/PyA1MDtcblxuICAgICAgICAgICAgLy8gUmVzb2x2ZSBleHBsaWNpdCBkaW1lbnNpb25zOiBob3N0IG9wdGlvbnMgXHUyMTkyIHNpemVNZXRhIGZpbGwgbW9kZSBcdTIxOTIgd2lkdGggZGVmYXVsdHMgdG8gXCIxMDAlXCJcbiAgICAgICAgICAgIC8vIFdpZHRoIGRlZmF1bHRzIHRvIFwiMTAwJVwiIChibG9jayBlbGVtZW50IGJlaGF2aW9yKSB0byBwcmV2ZW50IHRoZSBzaHJpbmstdG8tMCBtZWFzdXJlbWVudCBidWcuXG4gICAgICAgICAgICAvLyBIZWlnaHQgaGFzIG5vIGRlZmF1bHQgc28gaXQgYXV0by1zaXplcyB0byBjb250ZW50LlxuICAgICAgICAgICAgLy8gT25seSBzaXplTWV0YSBcIjEwMCVcIiAoZmlsbCBtb2RlKSBpcyB0cmVhdGVkIGFzIGV4cGxpY2l0IGFuZCBkaXNhYmxlcyBhdXRvLXNpemluZy5cbiAgICAgICAgICAgIC8vIFBpeGVsIHNpemVNZXRhIHZhbHVlcyAoZS5nLiwgaGVpZ2h0OiAyMDApIGFyZSBpbml0aWFsIGhpbnRzLCBOT1QgZXhwbGljaXQgY29uc3RyYWludHMuXG4gICAgICAgICAgICBjb25zdCBzaXplTWV0YUZpbGxXaWR0aCA9IHRoaXMuc2l6ZU1ldGE/LndpZHRoID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3Qgc2l6ZU1ldGFGaWxsSGVpZ2h0ID0gdGhpcy5zaXplTWV0YT8uaGVpZ2h0ID09PSBcIjEwMCVcIiA/IFwiMTAwJVwiIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRFeHBsaWNpdFdpZHRoID0gb3B0cz8uZXhwbGljaXRXaWR0aCA/PyBzaXplTWV0YUZpbGxXaWR0aCA/PyBcIjEwMCVcIjtcbiAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgPSBvcHRzPy5leHBsaWNpdEhlaWdodCA/PyBzaXplTWV0YUZpbGxIZWlnaHQ7XG4gICAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdFdpZHRoID0gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBoYXNFeHBsaWNpdEhlaWdodCA9IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgIT09IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgLy8gRGV0ZWN0IGNvbGxhcHNlZCBkaW1lbnNpb25zIGZyb20gY29udGFpbmVyICh0aGlzLmNvbnRhaW5lcilcbiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSB0aGlzLmNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZFdpZHRoID0gY29udGFpbmVyUmVjdC53aWR0aCA9PT0gMDtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyIGNvbGxhcHNlZCBpZiBoZWlnaHQgaXMgMCBPUiBlcXVhbHMgdGhlIGxvYWRlciBtaW5IZWlnaHRcbiAgICAgICAgICAgIGNvbnN0IGNvbGxhcHNlZEhlaWdodCA9IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSAwIHx8IGNvbnRhaW5lclJlY3QuaGVpZ2h0ID09PSBsb2FkZXJNaW5IZWlnaHQ7XG5cbiAgICAgICAgICAgIC8vIERldGVybWluZSB3aGljaCBkaW1lbnNpb25zIHRvIGF1dG8tc2l6ZTpcbiAgICAgICAgICAgIC8vIC0gSWYgZm9yY2VBdXRvU2l6ZSBpcyB0cnVlLCBhdXRvLXNpemUgdW5sZXNzIGV4cGxpY2l0IGRpbWVuc2lvbiBpcyBzZXRcbiAgICAgICAgICAgIC8vIC0gT3RoZXJ3aXNlLCBhdXRvLXNpemUgb25seSBpZiBjb2xsYXBzZWRcbiAgICAgICAgICAgIGNvbnN0IHNob3VsZEF1dG9XaWR0aCA9IG9wdHM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgICAgICA/ICFoYXNFeHBsaWNpdFdpZHRoXG4gICAgICAgICAgICAgICAgOiAoY29sbGFwc2VkV2lkdGggJiYgIWhhc0V4cGxpY2l0V2lkdGgpO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkQXV0b0hlaWdodCA9IG9wdHM/LmZvcmNlQXV0b1NpemVcbiAgICAgICAgICAgICAgICA/ICFoYXNFeHBsaWNpdEhlaWdodFxuICAgICAgICAgICAgICAgIDogKGNvbGxhcHNlZEhlaWdodCAmJiAhaGFzRXhwbGljaXRIZWlnaHQpO1xuXG4gICAgICAgICAgICAvLyBJZiBub3RoaW5nIG5lZWRzIGF1dG8tc2l6aW5nLCBhcHBseSBleHBsaWNpdC9wZXJjZW50YWdlIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICghc2hvdWxkQXV0b1dpZHRoICYmICFzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLndpZHRoID0gdHlwZW9mIHJlc29sdmVkRXhwbGljaXRXaWR0aCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0V2lkdGh9cHhgIDogJzEwMCUnO1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0SGVpZ2h0fXB4YCA6ICcxMDAlJztcblxuICAgICAgICAgICAgICAgIG9wdHM/Lm9uU2l6ZUNoYW5nZT8uKHtcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gcmVzb2x2ZWRFeHBsaWNpdFdpZHRoIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0SGVpZ2h0ID09PSAnbnVtYmVyJyA/IHJlc29sdmVkRXhwbGljaXRIZWlnaHQgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdXaWR0aDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9TaXppbmdIZWlnaHQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGlzYWJsZSBDU1MgdHJhbnNpdGlvbnMgb24gaWZyYW1lIGFuZCBjb250YWluZXIgZm9yIHRoZSBlbnRpcmVcbiAgICAgICAgICAgIC8vIG1lYXN1cmVtZW50ICsgaGVpZ2h0LXNldHRpbmcgY3ljbGUuIEhvc3QgYXBwcyBtYXkgc2V0IGB0cmFuc2l0aW9uOiBhbGxgXG4gICAgICAgICAgICAvLyB3aGljaCB3b3VsZCBhbmltYXRlIHRoZSAwcHggY29sbGFwc2UgYW5kIGZpbmFsIGhlaWdodCBjaGFuZ2UsIGNhdXNpbmdcbiAgICAgICAgICAgIC8vIHZpc2libGUganVtcHMgZHVyaW5nIHNjcm9sbC5cbiAgICAgICAgICAgIGNvbnN0IHByZXZUcmFuc2l0aW9uID0gaWZyYW1lLnN0eWxlLnRyYW5zaXRpb247XG4gICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLmNvbnRhaW5lcjtcbiAgICAgICAgICAgIGNvbnN0IHByZXZDb250YWluZXJUcmFuc2l0aW9uID0gY29udGFpbmVyLnN0eWxlLnRyYW5zaXRpb247XG4gICAgICAgICAgICBpZnJhbWUuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAvLyBRdWljayBwcmUtY2hlY2s6IHJlYWQgc2Nyb2xsSGVpZ2h0L1dpZHRoIEJFRk9SRSBjb2xsYXBzaW5nIHRoZSBpZnJhbWUuXG4gICAgICAgICAgICAvLyBJZiBjb250ZW50IG9ubHkgZ3JldyAoc2Nyb2xsSGVpZ2h0ID4gaWZyYW1lIGhlaWdodCksIHdlIGNhbiBza2lwIHRoZVxuICAgICAgICAgICAgLy8gMHB4IGNvbGxhcHNlIFx1MjAxNCBzY3JvbGxIZWlnaHQgbmF0dXJhbGx5IGV4cGFuZHMgYmV5b25kIHRoZSBpZnJhbWUuXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50SWZyYW1lSGVpZ2h0ID0gaWZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJZnJhbWVXaWR0aCA9IGlmcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHByZVNjcm9sbEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcbiAgICAgICAgICAgIGNvbnN0IHByZVNjcm9sbFdpZHRoID0gTWF0aC5jZWlsKE1hdGgubWF4KGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFdpZHRoLCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCkpO1xuXG4gICAgICAgICAgICBsZXQgY29udGVudFdpZHRoID0gcHJlU2Nyb2xsV2lkdGg7XG4gICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHByZVNjcm9sbEhlaWdodDtcblxuICAgICAgICAgICAgY29uc3QgaGVpZ2h0R3JldyA9IHNob3VsZEF1dG9IZWlnaHQgJiYgcHJlU2Nyb2xsSGVpZ2h0ID4gY3VycmVudElmcmFtZUhlaWdodCArIDE7XG4gICAgICAgICAgICBjb25zdCB3aWR0aEdyZXcgPSBzaG91bGRBdXRvV2lkdGggJiYgcHJlU2Nyb2xsV2lkdGggPiBjdXJyZW50SWZyYW1lV2lkdGggKyAxO1xuXG4gICAgICAgICAgICAvLyBGb3Igbm9uLWdyb3cgY2FzZXMgKHNocmluayBvciBuby1jaGFuZ2UpLCB3ZSBtdXN0IGNvbGxhcHNlIHRvIDBweCB0b1xuICAgICAgICAgICAgLy8gbWVhc3VyZSB0aGUgdHJ1ZSBjb250ZW50IGhlaWdodC4gc2Nyb2xsSGVpZ2h0IGNhbiBuZXZlciBkZWNyZWFzZSBiZWxvd1xuICAgICAgICAgICAgLy8gdGhlIGlmcmFtZSdzIGNsaWVudEhlaWdodCwgc28gc2hyaW5rIGlzIHVuZGV0ZWN0YWJsZSB3aXRob3V0IGNvbGxhcHNpbmcuXG4gICAgICAgICAgICAvLyBXaXRoIHRyYW5zaXRpb25zIGRpc2FibGVkICsgY29udGFpbmVyIG1pbi1oZWlnaHQgaGVsZCwgdGhlIGNvbGxhcHNlXG4gICAgICAgICAgICAvLyBpcyBpbnZpc2libGUgKG5vIGxheW91dCBzaGlmdCwgbm8gYW5pbWF0aW9uKS5cbiAgICAgICAgICAgIGNvbnN0IG5lZWRzSGVpZ2h0Q29sbGFwc2UgPSBzaG91bGRBdXRvSGVpZ2h0ICYmICFoZWlnaHRHcmV3O1xuICAgICAgICAgICAgY29uc3QgbmVlZHNXaWR0aENvbGxhcHNlID0gc2hvdWxkQXV0b1dpZHRoICYmICF3aWR0aEdyZXc7XG5cbiAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlIHx8IG5lZWRzV2lkdGhDb2xsYXBzZSkge1xuICAgICAgICAgICAgICAgIC8vIEhvbGQgdGhlIGNvbnRhaW5lcidzIG1pbi1oZWlnaHQvd2lkdGggZHVyaW5nIG1lYXN1cmVtZW50IHRvIHByZXZlbnRcbiAgICAgICAgICAgICAgICAvLyBsYXlvdXQgc2hpZnQgKGVsZW1lbnRzIGJlbG93IHRoZSBpZnJhbWUgd29uJ3QganVtcCkuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk1pbkhlaWdodCA9IGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldk1pbldpZHRoID0gY29udGFpbmVyLnN0eWxlLm1pbldpZHRoO1xuICAgICAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlKSBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gYCR7Y3VycmVudElmcmFtZUhlaWdodH1weGA7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzV2lkdGhDb2xsYXBzZSkgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gYCR7Y3VycmVudElmcmFtZVdpZHRofXB4YDtcblxuICAgICAgICAgICAgICAgIGlmIChuZWVkc0hlaWdodENvbGxhcHNlKSBpZnJhbWUuc3R5bGUuaGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWRzV2lkdGhDb2xsYXBzZSkgaWZyYW1lLnN0eWxlLndpZHRoID0gJzBweCc7XG5cbiAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG4gICAgICAgICAgICAgICAgY29udGVudEhlaWdodCA9IE1hdGguY2VpbChNYXRoLm1heChjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxIZWlnaHQsIGNvbnRlbnREb2MuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQpKTtcblxuICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBpZiBjb2xsYXBzaW5nIHRvIDBweCBnYXZlIGEgbmVhci16ZXJvIG1lYXN1cmVtZW50LCB0aGUgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy8gbGlrZWx5IGhhcyBgaGVpZ2h0OiAxMDAlYCBjaGFpbnMgKGh0bWwgPiBib2R5ID4gLmFwcC1jb250YWluZXIpIHRoYXQgY2FzY2FkZWRcbiAgICAgICAgICAgICAgICAvLyB0aGUgY29sbGFwc2UgaW50byBhbGwgY2hpbGRyZW4uIFJldHJ5IHdpdGggYSBudWNsZWFyIG92ZXJyaWRlIHRoYXQgZm9yY2VzIGFsbFxuICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIHRvIGludHJpbnNpYyBzaXppbmcuIFRoaXMgaXMgb25seSBhIGZhbGxiYWNrIGJlY2F1c2UgdGhlIG92ZXJyaWRlXG4gICAgICAgICAgICAgICAgLy8gYnJlYWtzIGV4cGxpY2l0IHBpeGVsIGhlaWdodHMgKGUuZy4gOHB4IGluZGljYXRvciBkb3RzIFx1MjE5MiAwcHgpLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRzTnVjbGVhckhlaWdodCA9IG5lZWRzSGVpZ2h0Q29sbGFwc2UgJiYgY29udGVudEhlaWdodCA8IDI7XG4gICAgICAgICAgICAgICAgY29uc3QgbmVlZHNOdWNsZWFyV2lkdGggPSBuZWVkc1dpZHRoQ29sbGFwc2UgJiYgY29udGVudFdpZHRoIDwgMjtcbiAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFySGVpZ2h0IHx8IG5lZWRzTnVjbGVhcldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVTdHlsZSA9IGNvbnRlbnREb2MuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLmlkID0gJ19fbXlvcF9tZWFzdXJlJztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZWVkc051Y2xlYXJIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goJ2hlaWdodDogYXV0byAhaW1wb3J0YW50JywgJ21pbi1oZWlnaHQ6IDAgIWltcG9ydGFudCcsICdtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobmVlZHNOdWNsZWFyV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVzLnB1c2goJ3dpZHRoOiBhdXRvICFpbXBvcnRhbnQnLCAnbWluLXdpZHRoOiAwICFpbXBvcnRhbnQnLCAnbWF4LXdpZHRoOiBub25lICFpbXBvcnRhbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBtZWFzdXJlU3R5bGUudGV4dENvbnRlbnQgPSBgKiwgKjo6YmVmb3JlLCAqOjphZnRlciB7ICR7cnVsZXMuam9pbignOyAnKX07IGZsZXgtYmFzaXM6IGF1dG8gIWltcG9ydGFudDsgZmxleC1ncm93OiAwICFpbXBvcnRhbnQ7IH1gO1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RG9jLmhlYWQuYXBwZW5kQ2hpbGQobWVhc3VyZVN0eWxlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb250ZW50V2lkdGggPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsV2lkdGgsIGNvbnRlbnREb2MuYm9keS5zY3JvbGxXaWR0aCwgY29udGVudERvYy5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRIZWlnaHQgPSBNYXRoLmNlaWwoTWF0aC5tYXgoY29udGVudERvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuc2Nyb2xsSGVpZ2h0LCBjb250ZW50RG9jLmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbWVhc3VyZVN0eWxlLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgY29udGFpbmVyIGNvbnN0cmFpbnRzIGltbWVkaWF0ZWx5IChzYW1lIGZyYW1lLCBiZWZvcmUgcGFpbnQpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbkhlaWdodCA9IHByZXZNaW5IZWlnaHQ7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gcHJldk1pbldpZHRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IGNsYW1wKGNvbnRlbnRXaWR0aCwgbWluV2lkdGgsIG1heFdpZHRoKTtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGNsYW1wKGNvbnRlbnRIZWlnaHQsIG1pbkhlaWdodCwgbWF4SGVpZ2h0KTtcblxuICAgICAgICAgICAgLy8gU2V0IGF1dG8tc2l6ZWQgZGltZW5zaW9ucyB0byBtZWFzdXJlZCB2YWx1ZXMsIG5vbi1hdXRvIHRvIGV4cGxpY2l0LzEwMCVcbiAgICAgICAgICAgIGlmIChzaG91bGRBdXRvV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBpZnJhbWUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS53aWR0aCA9IHR5cGVvZiByZXNvbHZlZEV4cGxpY2l0V2lkdGggPT09ICdudW1iZXInID8gYCR7cmVzb2x2ZWRFeHBsaWNpdFdpZHRofXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaG91bGRBdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgaWZyYW1lLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSB0eXBlb2YgcmVzb2x2ZWRFeHBsaWNpdEhlaWdodCA9PT0gJ251bWJlcicgPyBgJHtyZXNvbHZlZEV4cGxpY2l0SGVpZ2h0fXB4YCA6ICcxMDAlJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yY2UgcmVmbG93IHNvIHRoZSBmaW5hbCBkaW1lbnNpb25zIGFyZSBhcHBsaWVkIHdpdGhvdXQgdHJhbnNpdGlvbixcbiAgICAgICAgICAgIC8vIHRoZW4gcmVzdG9yZSB0aGUgb3JpZ2luYWwgdHJhbnNpdGlvbnMuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgICAgICAgICBpZnJhbWUub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgaWZyYW1lLnN0eWxlLnRyYW5zaXRpb24gPSBwcmV2VHJhbnNpdGlvbjtcbiAgICAgICAgICAgIGNvbnRhaW5lci5zdHlsZS50cmFuc2l0aW9uID0gcHJldkNvbnRhaW5lclRyYW5zaXRpb247XG5cbiAgICAgICAgICAgIC8vIERvbid0IGZvcmNlIG92ZXJmbG93IFx1MjAxNCBsZXQgdGhlIGNvbXBvbmVudC9wYXJlbnQgY29udHJvbCBzY3JvbGxpbmcuXG4gICAgICAgICAgICAvLyBPbmx5IHNldCBvdmVyZmxvdzogYXV0byB3aGVuIGNvbnRlbnQgZXhjZWVkcyBtYXggY29uc3RyYWludHMuXG4gICAgICAgICAgICBjb25zdCBpc1dpZHRoQ29uc3RyYWluZWQgPSBzaG91bGRBdXRvV2lkdGggJiYgbWF4V2lkdGggIT09IHVuZGVmaW5lZCAmJiBjb250ZW50V2lkdGggPiBtYXhXaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGlzSGVpZ2h0Q29uc3RyYWluZWQgPSBzaG91bGRBdXRvSGVpZ2h0ICYmIG1heEhlaWdodCAhPT0gdW5kZWZpbmVkICYmIGNvbnRlbnRIZWlnaHQgPiBtYXhIZWlnaHQ7XG4gICAgICAgICAgICBjb250ZW50RG9jLmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvd1ggPSBpc1dpZHRoQ29uc3RyYWluZWQgPyAnYXV0bycgOiAnJztcbiAgICAgICAgICAgIGNvbnRlbnREb2MuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93WSA9IGlzSGVpZ2h0Q29uc3RyYWluZWQgPyAnYXV0bycgOiAnJztcblxuICAgICAgICAgICAgb3B0cz8ub25TaXplQ2hhbmdlPy4oe1xuICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nV2lkdGg6IHNob3VsZEF1dG9XaWR0aCxcbiAgICAgICAgICAgICAgICBhdXRvU2l6aW5nSGVpZ2h0OiBzaG91bGRBdXRvSGVpZ2h0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBJbml0aWFsIHNpemUgKHJ1biBzeW5jaHJvbm91c2x5LCBub3QgZGVib3VuY2VkKVxuICAgICAgICB1cGRhdGVTaXplKCk7XG5cbiAgICAgICAgLy8gU3RvcmUgdXBkYXRlU2l6ZSBmb3IgcmVlbnRyYW50IGNhbGxzXG4gICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlID0gdXBkYXRlU2l6ZTtcblxuICAgICAgICAvLyBEZWJvdW5jZSBvYnNlcnZlciBjYWxsYmFja3MgdmlhIHJBRiBcdTIwMTQgYXQgbW9zdCBvbmUgdXBkYXRlU2l6ZSBwZXIgZnJhbWUuXG4gICAgICAgIC8vIFByZXZlbnRzIGxheW91dCB0aHJhc2hpbmcgZnJvbSBoaWdoLWZyZXF1ZW5jeSBtdXRhdGlvbnMgKGUuZy4gQ1NTIGFuaW1hdGlvbnMpLlxuICAgICAgICBsZXQgcmFmSWQ6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVVcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmFmSWQgIT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmFmSWQgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJhZklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVNpemUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE9ic2VydmUgZm9yIGNoYW5nZXNcbiAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gc2NoZWR1bGVVcGRhdGUoKSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jLmJvZHkpO1xuICAgICAgICByZXNpemVPYnNlcnZlci5vYnNlcnZlKGRvYy5kb2N1bWVudEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIE11dGF0aW9uT2JzZXJ2ZXIgY2F0Y2hlcyBET00gY29udGVudCBjaGFuZ2VzIChlLmcuIHJlbW92aW5nIGxpc3QgaXRlbXMsIHRvZ2dsaW5nIHZpZXdzKVxuICAgICAgICAvLyB0aGF0IGRvbid0IHRyaWdnZXIgUmVzaXplT2JzZXJ2ZXIgYmVjYXVzZSB0aGUgYm9keSBib3gtc2l6ZSBzdGF5cyB0aGUgc2FtZVxuICAgICAgICAvLyAoYm9keSBmaWxscyBpZnJhbWUsIGlmcmFtZSBoYXNuJ3Qgc2hydW5rIHlldCkuXG4gICAgICAgIC8vIGBhdHRyaWJ1dGVzOiB0cnVlYCBjYXRjaGVzIENTUyBjbGFzcy9zdHlsZSBjaGFuZ2VzIChlLmcuIGRpc3BsYXk6bm9uZSB0b2dnbGluZyB2aWV3cykuXG4gICAgICAgIGNvbnN0IG11dGF0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiBzY2hlZHVsZVVwZGF0ZSgpKTtcbiAgICAgICAgbXV0YXRpb25PYnNlcnZlci5vYnNlcnZlKGRvYy5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZSwgYXR0cmlidXRlczogdHJ1ZSB9KTtcblxuICAgICAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgICAgICAgbXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICBpZiAocmFmSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZklkKTtcbiAgICAgICAgICAgICAgICByYWZJZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2F1dG9TaXplVXBkYXRlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSBjbGVhbnVwO1xuICAgICAgICByZXR1cm4gY2xlYW51cDtcbiAgICB9XG5cbiAgICBzZXRTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgKyAncHgnO1xuXG5cbiAgICAgICAgICAgIC8vVE9ETzogZml4IHRoYXQgaGFjaywga2VlcCB0aGUgZnVuY3Rpb24gaW4gcmlnaHQgZm9ybWF0IHdoaWxlIG1pbmlmaWVkIDooXG4gICAgICAgICAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRvIGVuc3VyZSBpdCdzIG5vdCBvcHRpbWl6ZWQgYXdheSwgeW91IGNhbiBjYWxsIGl0IGF0IGxlYXN0IG9uY2VcbiAgICAgICAgICAgIGxldCB4ID0gbm9PcCgpO1xuICAgICAgICAgICAgeCsrO1xuICAgICAgICAgICAgeC0tO1xuXG4gICAgICAgICAgICAvL3JldHVybiBgJHt3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0ICsxID9cbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgLCB3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpICsgeCArICdweCdcblxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gcmV0LmNvbnRlbnQ7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG4gICAgICAgIC8vVE9ETyA6ID8hPyEgc2hvdWxkIGl0IGJlIGhlcmUgP1xuICAgICAgICBpZiAobWVzc2FnZV8ubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZV8gYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZClcbiAgICAgICAgICAgIHRoaXNbdHlwZWRNZXNzYWdlLm1ldGhvZF0oKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrIDooXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgbWVzc2FnZV8uZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKG1lc3NhZ2VfLCAnKicpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5NdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuICAgICAgICAgICAgfHwgaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLlJlc2l6ZU9ic2VydmVyTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAvL3RoaXMuc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2F1dG9TaXplQ2xlYW51cCkge1xuICAgICAgICAgICAgdGhpcy5fYXV0b1NpemVDbGVhbnVwKCk7XG4gICAgICAgICAgICB0aGlzLl9hdXRvU2l6ZUNsZWFudXAgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpXG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0KCk7XG5cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQodGhpcy5JZnJhbWVFbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyVHlwZX0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wTG9hZGVyIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcExvYWRlciBpbXBsZW1lbnRzIElNeW9wTG9hZGVyIHtcbiAgICBhYnN0cmFjdCB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBhYnN0cmFjdCBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG5cbiAgICBhcHBlbmRDaGlsZCA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yZWxhdGl2ZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG9wdGlvbnMucmVsYXRpdmUuY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IG9wdGlvbnMucmVsYXRpdmUuY2hpbGQ/Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcgOiBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IGFkZFF1ZXJ5UGFyYW0gPSAodXJsOiBzdHJpbmcsIHBhcmFtOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAvLyBDcmVhdGUgYSBVUkwgb2JqZWN0XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgLy8gQWRkIHRoZSBxdWVyeSBwYXJhbWV0ZXJcbiAgICB1cmxPYmouc2VhcmNoUGFyYW1zLmFwcGVuZChwYXJhbSwgdmFsdWUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIFVSTFxuICAgIHJldHVybiB1cmxPYmoudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLklmcmFtZUxvYWRlclxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuICAgICAgICBsZXQgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgdHlwZWRMb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lcj8ubm9kZU5hbWUgPT09IFwiSUZSQU1FXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCduZWVkcyB0byBsb2FkIGludG8gYW4gZXhzaXN0aW5nIElmcmFtZS4uLicsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IChjb250YWluZXIgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHR5cGVkTG9hZGVyQ29uZmlnLnVybFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgICAgIC8vIFNldCBhbGwgc3R5bGVzIEJFRk9SRSBhcHBlbmRpbmcgdG8gcHJldmVudCBmbGFzaCBhdCB3cm9uZyBwb3NpdGlvblxuICAgICAgICAgICAgY29uc3QgaWZyYW1lU3R5bGVzID0gYFxuICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgICAgICBpbnNldDogMDtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6ICR7dHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCB8fCAhdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0ID8gJzEwMCUnIDogdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0fTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAke29wdGlvbnM/LmhpZGRlbiA/ICcwJyA6ICcxJ307XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IGlmcmFtZVN0eWxlcztcblxuICAgICAgICAgICAgLy8gU2V0IGVsZW1lbnQgYXR0cmlidXRlcyBpZiBwcm92aWRlZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmVsZW1lbnRBdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5lbGVtZW50QXR0cmlidXRlcykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoa2V5LCAnJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZShrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluIG9yZGVyIHRvIGhhbmRsZSBpc3N1ZSB0byBsb2FkIGlmcmFtZSBpbnNpZGUgYW4gaWZyYW1lIHdpdGggdGhlIHNhbWUgdXJsXG4gICAgICAgICAgICBsZXQgdXJsMmxvYWQgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykudXJsO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9oYXNQYXJlbnQpXG4gICAgICAgICAgICAgICAgdXJsMmxvYWQgPSBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9teW9wLWNvbXBcIiwgdW5pcUlkKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB1cmwybG9hZDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy8gICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tSWQpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy9OTyA6IElmcmFtZUVsZW1lbnQgPSBjb250YWluZXIubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiZXhwb3J0IGRlZmF1bHQgJzAuMy4zMCc7IiwgImltcG9ydCB7QmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlciwgSG9zdGVkQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCwgUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pj4ge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZVRvSG9zdDogYW55LCBwdWJsaWMgY29udGV4dDogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pikge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbm5lckV4ZWN1dG9yOiAoZXZlbnQ6IFQsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHZvaWQ7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogVCkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBpZiAoZXZlbnQuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZXZlbnQuZGVzdGluYXRpb247XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBwYXRjaCB0aGUgc291cmNlIGlkLCB0aGluayBhYm91dCB0aGF0ID9cbiAgICAgICAgICAgICAgICBjb25zdCBfbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBldmVudC5kZXN0aW5hdGlvbiA/IGV2ZW50LmRlc3RpbmF0aW9uIDogZXZlbnQuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb246IGV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZSA6IGV2ZW50LmRlc3RpbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbm5lckV4ZWN1dG9yKGV2ZW50LCB0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQsIF9tZXNzYWdlVG9Ib3N0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEJpbmRDbGlja01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KVxuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8TXlvcEVsZW1lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DaGFuZ2VUZXh0TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS50ZXh0Q29udGVudCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2hhZG93Um9vdFJlZiBleHRlbmRzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdDogU2hhZG93Um9vdCkge1xuICAgICAgICBzdXBlcihjb250YWluZXIsIHNoYWRvd1Jvb3QpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IERldGVjdE15b3BSZWZzTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuXG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBNeW9wRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiB0YWtlIHRoYXQgYmFjayB0byB0aGUgZGFzaGJvYXJkP1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhpdGVtLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuXG4gICAgICAgICAgICBpZiAobXlvcElkKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnd2MgcmVjdCcsICBpdGVtLnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLm9mZnNldFRvcCwgaXRlbS5vZmZzZXRMZWZ0KSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbXlvcFJlZnMpKVxuICAgIH07XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5EZXRlY3RNeW9wUmVmc01lc3NhZ2U7XG5cblxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogU2V0QXR0cmlidXRlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSxcbiAgICBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlLFxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBpbiBmYWN0IHdoZW4gcnVubmluZyBpbiBXZWJDb21wb25lbnQgd2UgY2FuIHRyYW5zZmVyIHRoZSBvcmlnaW5hbCBlXG4gICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IHVzaW5nIG1ha2VTZXJpYWxpemFibGUgZm9yIG5lc3RlZCBjYXNlcywgdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCAgbWFrZVNlcmlhbGl6YWJsZShlLCBldmVudC5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcblxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSlcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWY/LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcblxuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IGV2ZW50Lm9wdGlvbnMuaWQpITtcbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vLy8+Pj4+XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vICBjb25zb2xlLmxvZyhgZmFpbGVkIHRvIGZpbmQgJHtldmVudC5vcHRpb25zLmlkfSBpbiBtZW0gc2NvcGVgLCBob3N0U0RLKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy93ZSBoYXZlIHRoZSByZWYgY29tcG9uZW50IGluIG91ciBIb3N0U0RLIChzYW1lIG1lbW9yeSB3aGVuIHVzaW5nIHdlYmNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyAgcmVmQ29tcG9uZW50LnBhcmVudCA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vZGVsZXRlIHRoZSByZWYgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBob3N0U0RLLmNvbXBvbmVudHMuaW5kZXhPZihyZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgaG9zdFNESy5jb21wb25lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgcmVtb3ZlZCB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHVzaW5nIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vIG5lZWQgdGhpcywgcGFzcyBvcHRpb25zIGZyb20gcGFyZW50XG4gICAgICAgICAgICAgICAgLy9pbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pZCA9IGV2ZW50LnByZWRlZmluZWRJZDtcbiAgICAgICAgICAgICAgICAvL3JlZkNvbXBvbmVudC5pZCArPSAnLic7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBub3QgcmVhbGx5IG5lZWRlZCA/XG4gICAgICAgICAgICAgICAgLy8gYXdhaXQgaW1wbGVtZW50YXRpb25Db21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRSZWZDb25maWc6IGFueVtdID0gW107XG5cbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcblxuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3JlYXRlUmVmKCkudGhlbigpXG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3J9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVTY3JpcHRNZXNzYWdlXG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIGRhdGEpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yKGV2ZW50LCByZXBsaWVyLCBzaGFkb3dSb290UmVmKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShnZXRJbnB1dFZhbHVlKGl0ZW0pKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tICdAbXlvcC9zZGsvd2ViY29tcG9uZW50JztcbiAqIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290IFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkNvbXBvbmVudFNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgPSB0cnVlO1xuXG4gICAgLy93aGVuIG5ldyB3ZWIgY29tcG9uZW50IGNyZWF0ZWQuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2sgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgc2hhZG93OiBTaGFkb3dSb290KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZS5kYXRhID8gZS5kYXRhIDogZS5kZXRhaWw7XG4gICAgICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY3ZpZWQgd2ViY29tcG9uZW50X21lc3NhZ2Ugd2l0aCB3cm9uZyB0eXBlJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIGNvbnRhaW5lciAvIGNvbXBvZW5udCBpZGVudGlmaWVyIGZvciBtdWx0aWwgY29tcG9uZW50cyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcyhlKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0uY29udGV4dCA9IG5ldyBTaGFkb3dSb290UmVmKGNvbnRhaW5lciwgc2hhZG93KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhbmRsZXIuY29udGV4dCA9IHRoaXMuc2hhZG93Um9vdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLiByYWNlIGNvbmRpdGlvbiB3aXRoIGhvc3QubG9hZCB3aGVuIG1vZHVsZSBsb2FkZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgICAgIH0sIDEpXG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cFxuICAgICAgICAvL21lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgLy9cbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgLy90aGlzLm15Q29tcG9uZW50SWRcbiAgICAgICAgLy90aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzXG4gICAgfVxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdXZWJDb21wb25lbnRTREsnLCBXZWJDb21wb25lbnRTREspO1xuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJSFRNTExvYWRlckNvbmZpZyxcbiAgICBJU2tpbkNvbmZpZywgU2hhZG93Um9vdE1vZGVUeXBlLFxuICAgIFNraW5Mb2FkZXJzXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHNcIjtcbmltcG9ydCB7RU1CRURERURfU0RLX0NPTlRFTlQsIEhBU19FTUJFRERFRF9TREt9IGZyb20gXCIuLi9lbWJlZGRlZFNESy50c1wiO1xuLy9pbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSBcIi4uLy4uL1NESy50c1wiO1xuXG5jb25zdCBNWU9QX1dFQl9DT01QT05FTlRfTUFSS0VSID0gJzwhLS0gbXlvcC13ZWItY29tcG9uZW50IC0tPic7XG5jb25zdCBNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEID0gJ215b3Atd2ViLWNvbXBvbmVudCc7XG5cbi8vIFRyYWNrIGV4dHJhY3RlZCB3ZWIgY29tcG9uZW50IHNjcmlwdHMgdG8gcHJldmVudCBkb3VibGUgcmVnaXN0cmF0aW9uXG5jb25zdCBleHRyYWN0ZWRXZWJDb21wb25lbnRTY3JpcHRzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuY29uc3Qgc2Vlbjogc3RyaW5nW10gPSBbXTtcbmxldCBzZGs7XG5jb25zdCBnZXRJbml0aWF0ZWRTZGsgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzZGspIHtcbiAgICAgICAgLy9jb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpXG4gICAgICAgIHNkayA9IG5ldyBXZWJDb21wb25lbnRTREsoKTtcbiAgICAgICAgc2RrLmluaXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNkaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sU3RyaW5nOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSk6IG5ldyAoKSA9PiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZSA9IFNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUub3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnO1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGV9KTtcbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayh0aGlzLCBzaGFkb3cpO1xuICAgICAgICAgICAgICAgIHNoYWRvdy5pbm5lckhUTUwgPSBodG1sU3RyaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuY29uc3QgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50ID0gKGNvbXBvbmVudE5hbWU6IHN0cmluZywgaHRtbDogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpID0+IHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoY29tcG9uZW50TmFtZSwgY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sLCBTaGFkb3dSb290TW9kZSkpO1xuICAgIGNvbnNvbGUubG9nKGBkZWZpbmUoJyR7Y29tcG9uZW50TmFtZX0nKSB3YXMgY2FsbGVkLCB3ZWIgY29tcG9uZW50IHJlYWR5IHRvIHVzZWApO1xufVxuXG5jb25zdCB0b1dlYkNvbXBvbmVudE5hbWUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgdXBwZXJjYXNlIGxldHRlcnNcbiAgICAgICAgLnJlcGxhY2UoLyhcXGQrKS9nLCAnLSQxJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgZGlnaXRzXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpOyAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxufVxuXG5jb25zdCB0b0N1c3RvbUVsZW1lbnROYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIG5hbWUgPSB0b1dlYkNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXy9nLCAnLScpO1xufVxuXG5sZXQgcGFyc2VyOiBET01QYXJzZXI7IC8vID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgY2xhc3MgSFRNTENvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5IVE1MTG9hZGVyXG5cbiAgICAvKipcbiAgICAgKiBEZXRlY3QgaWYgSFRNTCBpcyBhIE15b3AgV2ViIENvbXBvbmVudCAoc3RhcnRzIHdpdGggbWFya2VyIGNvbW1lbnQpXG4gICAgICovXG4gICAgcHJpdmF0ZSBpc015b3BXZWJDb21wb25lbnQoaHRtbDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBodG1sLnRyaW1TdGFydCgpLnN0YXJ0c1dpdGgoTVlPUF9XRUJfQ09NUE9ORU5UX01BUktFUik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXh0cmFjdCB0aGUgd2ViIGNvbXBvbmVudCBzY3JpcHQgY29udGVudCBmcm9tIEhUTUxcbiAgICAgKi9cbiAgICBwcml2YXRlIGV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhodG1sLCAndGV4dC9odG1sJyk7XG4gICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvYy5nZXRFbGVtZW50QnlJZChNWU9QX1dFQl9DT01QT05FTlRfU0NSSVBUX0lEKTtcbiAgICAgICAgcmV0dXJuIHNjcmlwdD8udGV4dENvbnRlbnQgfHwgbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIHRoZSB3ZWIgY29tcG9uZW50IHNjcmlwdCBvbiB0aGUgaG9zdCBkb2N1bWVudFxuICAgICAqL1xuICAgIHByaXZhdGUgZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50OiBzdHJpbmcsIHNjcmlwdElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBleGVjdXRlZCAoYnkgc2NyaXB0IGNvbnRlbnQgaGFzaClcbiAgICAgICAgaWYgKGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuaGFzKHNjcmlwdElkKSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBTY3JpcHQgYWxyZWFkeSBleGVjdXRlZCBmb3IgJHtzY3JpcHRJZH0sIHNraXBwaW5nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzY3JpcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcbiAgICAgICAgc2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0Q29udGVudDtcbiAgICAgICAgc2NyaXB0LmlkID0gYG15b3AtZXh0cmFjdGVkLSR7c2NyaXB0SWR9YDtcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuXG4gICAgICAgIGV4dHJhY3RlZFdlYkNvbXBvbmVudFNjcmlwdHMuYWRkKHNjcmlwdElkKTtcbiAgICAgICAgY29uc29sZS5sb2coYFtNeW9wV2ViQ29tcG9uZW50XSBFeGVjdXRlZCB3ZWIgY29tcG9uZW50IHNjcmlwdDogJHtzY3JpcHRJZH1gKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgTXlvcCBXZWIgQ29tcG9uZW50IChleHRyYWN0ZWQgYW5kIHJ1biBvbiBob3N0IGRvY3VtZW50KVxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZEV4dHJhY3RlZFdlYkNvbXBvbmVudChcbiAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgICAgIHNraW46IElTa2luQ29uZmlnLFxuICAgICAgICBjb250YWluZXI6IEhUTUxFbGVtZW50LFxuICAgICAgICBodG1sOiBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zXG4gICAgKTogUHJvbWlzZTxNeW9wRXh0cmFjdGVkV2ViQ29tcG9uZW50PiB7XG4gICAgICAgIGNvbnN0IHNjcmlwdENvbnRlbnQgPSB0aGlzLmV4dHJhY3RXZWJDb21wb25lbnRTY3JpcHQoaHRtbCk7XG5cbiAgICAgICAgaWYgKCFzY3JpcHRDb250ZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1tNeW9wV2ViQ29tcG9uZW50XSBObyA8c2NyaXB0IGlkPVwibXlvcC13ZWItY29tcG9uZW50XCI+IGZvdW5kIGluIEhUTUwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBjb21wb25lbnQgZGVmaW5pdGlvbiBpZCBhcyBzY3JpcHQgaWRlbnRpZmllciBmb3IgZGVkdXBsaWNhdGlvblxuICAgICAgICBjb25zdCBzY3JpcHRJZCA9IGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9LSR7c2tpbi5pZH1gO1xuXG4gICAgICAgIC8vIFN0b3JlIF9fTVlPUF9UQUdfTkFNRV9fIGJlZm9yZSBleGVjdXRpb24gdG8gY2FwdHVyZSBpdFxuICAgICAgICBjb25zdCBwcmV2aW91c1RhZ05hbWUgPSAod2luZG93IGFzIGFueSkuX19NWU9QX1RBR19OQU1FX187XG5cbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgc2NyaXB0IG9uIHRoZSBob3N0IGRvY3VtZW50XG4gICAgICAgIHRoaXMuZXhlY3V0ZVdlYkNvbXBvbmVudFNjcmlwdChzY3JpcHRDb250ZW50LCBzY3JpcHRJZCk7XG5cbiAgICAgICAgLy8gR2V0IHRoZSB0YWcgbmFtZSB0aGF0IHdhcyBzZXQgYnkgdGhlIHNjcmlwdFxuICAgICAgICBjb25zdCB0YWdOYW1lID0gKHdpbmRvdyBhcyBhbnkpLl9fTVlPUF9UQUdfTkFNRV9fO1xuXG4gICAgICAgIGlmICghdGFnTmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdbTXlvcFdlYkNvbXBvbmVudF0gU2NyaXB0IGRpZCBub3Qgc2V0IHdpbmRvdy5fX01ZT1BfVEFHX05BTUVfXycpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyB0YWcgbmFtZSBpZiB0aGlzIHdhcyBhIHJlLXJlZ2lzdHJhdGlvblxuICAgICAgICBpZiAocHJldmlvdXNUYWdOYW1lICYmIHByZXZpb3VzVGFnTmFtZSAhPT0gdGFnTmFtZSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBbTXlvcFdlYkNvbXBvbmVudF0gX19NWU9QX1RBR19OQU1FX18gY2hhbmdlZCBmcm9tICR7cHJldmlvdXNUYWdOYW1lfSB0byAke3RhZ05hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGN1c3RvbSBlbGVtZW50XG4gICAgICAgIGNvbnN0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWA7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIGNvbnRhaW5lciBpZiBuZWVkZWRcbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSkge1xuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIENyZWF0ZSB0aGUgY29tcG9uZW50IHdyYXBwZXJcbiAgICAgICAgY29uc3QgY29tcG9uZW50ID0gbmV3IE15b3BFeHRyYWN0ZWRXZWJDb21wb25lbnQoXG4gICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uLFxuICAgICAgICAgICAgc2tpbixcbiAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICB0YWdOYW1lLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBkYXRhIGlmIHByb3ZpZGVkXG4gICAgICAgIGlmIChvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5pbml0V2l0aERhdGEob3B0aW9ucy5kYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBbTXlvcFdlYkNvbXBvbmVudF0gTG9hZGVkIDwke3RhZ05hbWV9PiBpbnRvIGNvbnRhaW5lcmApO1xuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgTXlvcCBXZWIgQ29tcG9uZW50IChleHRyYWN0ZWQgd2ViIGNvbXBvbmVudCBtb2RlKVxuICAgICAgICBpZiAodGhpcy5pc015b3BXZWJDb21wb25lbnQobG9hZGVyQ29uZmlnLkhUTUwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkRXh0cmFjdGVkV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgbG9hZGVyQ29uZmlnLkhUTUwsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgbGV0IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICAgICAgLy8gU2V0IGFsbCBzdHlsZXMgQkVGT1JFIGFwcGVuZGluZyB0byBwcmV2ZW50IGZsYXNoIGF0IHdyb25nIHBvc2l0aW9uXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIGluc2V0OiAwO1xuICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBXcml0ZSBjb250ZW50IGludG8gdGhlIGlmcmFtZVxuICAgICAgICAgICAgLy9AdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBkb2MgPSBJZnJhbWVFbGVtZW50LmNvbnRlbnREb2N1bWVudCB8fCBJZnJhbWVFbGVtZW50LmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gICAgICAgICAgICBkb2Mub3BlbigpO1xuXG5cbiAgICAgICAgICAgIC8vIFBhcnNlIG15b3A6c2l6ZSBtZXRhIHRhZyBiZWZvcmUgaWZyYW1lIGNyZWF0aW9uIChzYW1lIERPTVBhcnNlciBwYXNzIHBhdHRlcm4gYXMgbXlvcF9wcmV2aWV3IHJlbW92YWwpLlxuICAgICAgICAgICAgLy8gVGhpcyBsZXRzIHRoZSBSZWFjdCBob3N0IGRldGVybWluZSBzaXppbmcgbW9kZSAoZmlsbCB2cyBjb250ZW50KSBmcm9tIHRoZSBzdGFydC5cbiAgICAgICAgICAgIGxldCBwYXJzZWRTaXplTWV0YTogeyB3aWR0aD86IHN0cmluZyB8IG51bWJlcjsgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyOyBtaW5XaWR0aD86IG51bWJlcjsgbWF4V2lkdGg/OiBudW1iZXI7IG1pbkhlaWdodD86IG51bWJlcjsgbWF4SGVpZ2h0PzogbnVtYmVyIH0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb25zdCBfcHJlUGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9wcmVEb2MgPSBfcHJlUGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNpemVNZXRhID0gX3ByZURvYy5xdWVyeVNlbGVjdG9yKCdtZXRhW25hbWU9XCJteW9wOnNpemVcIl0nKTtcbiAgICAgICAgICAgICAgICBpZiAoc2l6ZU1ldGEpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHsgcGFyc2VkU2l6ZU1ldGEgPSBKU09OLnBhcnNlKHNpemVNZXRhLmdldEF0dHJpYnV0ZSgnY29udGVudCcpIHx8ICd7fScpOyB9IGNhdGNoIHt9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgSFRNTDJSZW5kZXIgPSBsb2FkZXJDb25maWcuSFRNTDtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9pbnNwZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9pbmplY3QgaW5zcGVjdGlvbiBzY3JpcHQgZm9yIHByb3BzIGRldGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IHBhcnQgb2YgQUkgY29tcG9uZW50cywgdGhpbmsgYWJvdXQgdGhhdCwgZG9jdW1lbnQgaXQuXG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcF9wcmV2aWV3X3NjcmlwdCA9IF9kb2MuZ2V0RWxlbWVudEJ5SWQoJ215b3BfcHJldmlldycpO1xuICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQ/LnJlbW92ZUF0dHJpYnV0ZSgndHlwZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGluamVjdGVkIEhUTUwgc3RyaW5nIGludG8gYSBub2RlXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IF9kb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgdGVtcC5ib2R5LmlubmVySFRNTCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlS2V5c1dpbmRvdyA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUtleXNXaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGVtcC5ib2R5LmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBfZG9jLmhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RvYy5oZWFkLmluc2VydEJlZm9yZShfZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSksIF9kb2MuaGVhZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9IF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucz8uZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGltcHJvdmUgYnkgZG8gaXQgb24gdGhlIHNlcnZlIG9uY2VcblxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBteW9wX3ByZXZpZXcgc2NyaXB0IHdoZW4gbm90IGluIGluc3BlY3Rpb24gbW9kZVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BfcHJldmlld19zY3JpcHQgPSBfZG9jLmdldEVsZW1lbnRCeUlkKCdteW9wX3ByZXZpZXcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChteW9wX3ByZXZpZXdfc2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgICAgIG15b3BfcHJldmlld19zY3JpcHQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIEhUTUwyUmVuZGVyID0gX2RvYy5kb2N1bWVudEVsZW1lbnQub3V0ZXJIVE1MO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuXG4gICAgICAgICAgICBkb2Mud3JpdGVsbihIVE1MMlJlbmRlcik7XG5cbiAgICAgICAgICAgIC8vIHdpbmRvdy5fX2ZlZGVyYXRpb25fXyA9XG4gICAgICAgICAgICAvLyAgICAgeyAuLi53aW5kb3cuX19mZWRlcmF0aW9uX18sXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vVE9ETyA6IGdldCBmcm9tIEVOViBhdCBidWlsZCB0aW1lLFxuICAgICAgICAgICAgLy8gICAgICAgICAvLyBpbmplY3QgdmFsdWUgdG8gbW9kdWxlIGF0IGJ1aWxkIHRpbWVcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gdG9kYXkgd2UgZG9pbmcgc28ganVzdCBmb3IgdGhlIENKUyB2ZXJzaW9uXG4gICAgICAgICAgICAvLyAgICAgICAgIF9fcHVibGljX3BhdGhfXyA6J2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0J1xuICAgICAgICAgICAgLy8gICAgICAgICAsLi4uJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fKVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICAgICB9O1xuXG4gICAgICAgICAgICAvLyBGb3IgbnBtIHBhY2thZ2UgdXNlcnMgd2l0aCBidW5kbGVycyAoVml0ZS9XZWJwYWNrKSwgaW5qZWN0IFNESyBpbmxpbmVcbiAgICAgICAgICAgIC8vIEZvciBDRE4gdXNlcnMgKHNjcmlwdCB0YWcpLCB1c2UgQ0ROIFVSTFxuICAgICAgICAgICAgY29uc3Qgc2RrU2NyaXB0ID0gSEFTX0VNQkVEREVEX1NES1xuICAgICAgICAgICAgICAgID8gYDxzY3JpcHQ+JHtFTUJFRERFRF9TREtfQ09OVEVOVH08L3NjcmlwdD5gXG4gICAgICAgICAgICAgICAgOiBgPHNjcmlwdCBzcmM9XCIke3dpbmRvdy5teW9wLl9fUk9PVF9TREtfUFVCTElDX1VSTF9ffVwiPjwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgIC8vIERpZmZlcmVudCBpbml0IHNjcmlwdCBmb3IgZW1iZWRkZWQgdnMgQ0ROIFNES1xuICAgICAgICAgICAgLy8gLSBFbWJlZGRlZCAoYnVuZGxlZCBJSUZFKTogdXNlcyBNeW9wU0RLLmdldElmcmFtZU1vZHVsZSgpIHdoaWNoIHJldHVybnMgbW9kdWxlIGRpcmVjdGx5XG4gICAgICAgICAgICAvLyAtIENETiAoZHluYW1pYyBsb2FkaW5nKTogdXNlcyB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpIHdoaWNoIHdyYXBzIHdpdGggLmdldCgpXG4gICAgICAgICAgICBjb25zdCBpbml0U2NyaXB0ID0gSEFTX0VNQkVEREVEX1NES1xuICAgICAgICAgICAgICAgID8gYDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZnJhbWVNb2R1bGUgPSBhd2FpdCBNeW9wU0RLLmdldElmcmFtZU1vZHVsZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSWZyYW1lU0RLID0gaWZyYW1lTW9kdWxlLklmcmFtZVNESztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNkayA9IG5ldyBJZnJhbWVTREsoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmBcbiAgICAgICAgICAgICAgICA6IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX18gPSB3aW5kb3cuX19mZWRlcmF0aW9uX18uX19wdWJsaWNfcGF0aF9fO1xuICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbXlvcF9pbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZGsgPSBuZXcgSWZyYW1lU0RLKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZGsuaW5pdCgpO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICBfX215b3BfaW5pdCgpLnRoZW4oKTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICBkb2Mud3JpdGVsbihgJHtzZGtTY3JpcHR9JHtpbml0U2NyaXB0fWApO1xuXG4gICAgICAgICAgICAvLyBJbmplY3QgZGF0YSBzY3JpcHQgaWYgZGF0YSBvcHRpb24gaXMgcHJvdmlkZWRcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5kYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXR1cCBDVEEgcXVldWUgLSBjYXB0dXJlcyBhbnkgQ1RBcyBlbWl0dGVkIGR1cmluZyBpbml0IGJlZm9yZSBob3N0IHJlZ2lzdGVycyBoYW5kbGVyXG4gICAgICAgICAgICAgICAgY29uc3QgY3RhUXVldWVTY3JpcHQgPSBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9jdGFfcXVldWUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3BfY3RhX2hhbmRsZXIgPSBmdW5jdGlvbihhY3Rpb24sIHBheWxvYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfY3RhX3F1ZXVlLnB1c2goe2FjdGlvbjogYWN0aW9uLCBwYXlsb2FkOiBwYXlsb2FkfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgPC9zY3JpcHQ+YDtcblxuICAgICAgICAgICAgICAgIC8vIEVzY2FwZSBkYXRhIGZvciBzYWZlIGVtYmVkZGluZyBpbiBzY3JpcHQgdGFnXG4gICAgICAgICAgICAgICAgLy8gSlNPTi5zdHJpbmdpZnkgZG9lc24ndCBlc2NhcGUgPC9zY3JpcHQ+IHdoaWNoIGNvdWxkIGJyZWFrIEhUTUwgcGFyc2luZ1xuICAgICAgICAgICAgICAgIGNvbnN0IGVzY2FwZWREYXRhID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5kYXRhKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvPFxcL3NjcmlwdC9naSwgJ1xcXFx1MDAzYy9zY3JpcHQnKTtcblxuICAgICAgICAgICAgICAgIC8vIFNlbGYtY29udGFpbmVkIGRhdGEgaW5qZWN0aW9uIHNjcmlwdCB0aGF0OlxuICAgICAgICAgICAgICAgIC8vIDEuIENhbGxzIG15b3BfaW5pdF9pbnRlcmZhY2UgaW1tZWRpYXRlbHkgaWYgYWxyZWFkeSBkZWZpbmVkXG4gICAgICAgICAgICAgICAgLy8gMi4gV2F0Y2hlcyBmb3IgbGF0ZS1kZWZpbmVkIG15b3BfaW5pdF9pbnRlcmZhY2UgdmlhIGRlZmluZVByb3BlcnR5XG4gICAgICAgICAgICAgICAgLy8gMy4gQ2xlYW5zIHVwIGFmdGVyIGl0c2VsZiAocmVtb3ZlcyBzY3JpcHQgdGFnIGFuZCB3aW5kb3cgZGF0YSlcbiAgICAgICAgICAgICAgICAvLyA0LiBQb3N0cyBtZXNzYWdlIHRvIHBhcmVudCBmb3IgZXh0ZW5zaW9uIHRyYWNraW5nIChwcmUtaW5qZWN0ZWQgaW5pdCopXG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YVNjcmlwdCA9IGA8c2NyaXB0IGlkPVwiX19teW9wX2luaXRfZGF0YV9zY3JpcHRcIj5cbiAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSAke2VzY2FwZWREYXRhfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzY3JpcHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdfX215b3BfaW5pdF9kYXRhX3NjcmlwdCcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FsbEluaXRJbnRlcmZhY2UgPSBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFzIHByZS1pbmplY3RlZCBkYXRhIGNhbGwgZm9yIGV4dGVuc2lvbiB0cmFja2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfaW5pdF9wcmVpbmplY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4oZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Ll9fbXlvcF9pbml0X3ByZWluamVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRUaW1lO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aWZ5IGV4dGVuc2lvbiB2aWEgcG9zdE1lc3NhZ2UgKGluaXQqID0gcHJlLWluamVjdGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ01ZT1BfUFJFSU5KRUNURURfSU5JVCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sICcqJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFudXA6IHJlbW92ZSBzY3JpcHQgdGFnIGFuZCBzdG9yZWQgZGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzY3JpcHRFbCAmJiBzY3JpcHRFbC5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0RWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5teW9wX2luaXRfaW50ZXJmYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gYWxyZWFkeSBleGlzdHMgLSBjYWxsIGltbWVkaWF0ZWx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEluaXRJbnRlcmZhY2Uod2luZG93Lm15b3BfaW5pdF9pbnRlcmZhY2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBub3QgeWV0IGRlZmluZWQgLSBzdG9yZSBkYXRhIGFuZCB3YXRjaCBmb3IgZGVmaW5pdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX215b3BfaW5pdF9kYXRhID0gZGF0YTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBfb3JpZ2luYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywgJ215b3BfaW5pdF9pbnRlcmZhY2UnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbihmbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29yaWdpbmFsID0gZm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Ll9fbXlvcF9pbml0X2RhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdG9yZWREYXRhID0gd2luZG93Ll9fbXlvcF9pbml0X2RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHdpbmRvdy5fX215b3BfaW5pdF9kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxJbml0SW50ZXJmYWNlKGZuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfb3JpZ2luYWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuICAgICAgICAgICAgICAgIGRvYy53cml0ZWxuKGN0YVF1ZXVlU2NyaXB0ICsgZGF0YVNjcmlwdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvYy5jbG9zZSgpO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogY29udHJvbCBmcm9tIGRhc2hib2FyZFxuICAgICAgICAgICAgLy8gIChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS5hdXRvSGVpZ2h0ID0gdHJ1ZTtcblxuICAgICAgICAgICAgY29uc3QgY29tcCA9IG5ldyBNeW9wSWZyYW1lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgICAgIC8vIFN0b3JlIHBhcnNlZCBzaXplTWV0YSBvbiB0aGUgY29tcG9uZW50IHNvIHRoZSBSZWFjdCBob3N0IGNhbiByZWFkIGl0XG4gICAgICAgICAgICBjb21wLnNpemVNZXRhID0gcGFyc2VkU2l6ZU1ldGE7XG5cbiAgICAgICAgICAgIC8vIEF1dG8tc2l6ZTogb2JzZXJ2ZSBjb250ZW50IHNpemUgYW5kIHN5bmMgdG8gaWZyYW1lIGRpbWVuc2lvbnMuXG4gICAgICAgICAgICAvLyBUaGlzIHdvcmtzIGZvciBhbGwgaG9zdHMgKHZhbmlsbGEgU0RLLCBSZWFjdCwgVnVlLCBBbmd1bGFyKS5cbiAgICAgICAgICAgIC8vIElmIGEgZnJhbWV3b3JrIGhvc3QgKGUuZy4gQG15b3AvcmVhY3QpIGFsc28gY2FsbHMgb2JzZXJ2ZUF1dG9TaXplKCksXG4gICAgICAgICAgICAvLyBpdCBjbGVhbmx5IHJlcGxhY2VzIHRoZXNlIG9ic2VydmVycyB2aWEgX2F1dG9TaXplQ2xlYW51cCB0cmFja2luZy5cbiAgICAgICAgICAgIGNvbXAuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmF1dG9TaXplID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBObyBhdXRvLXNpemluZy4gSWZyYW1lIHN0YXlzIHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgY29udGFpbmVyLlxuICAgICAgICAgICAgICAgICAgICAvLyBIb3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucyAoZS5nLiBSZWFjdCBOYXRpdmUgV2ViVmlldykuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHNob3duID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29tcC5vYnNlcnZlQXV0b1NpemUoe1xuICAgICAgICAgICAgICAgICAgICBmb3JjZUF1dG9TaXplOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBvblNpemVDaGFuZ2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNob3cgYWZ0ZXIgZmlyc3QgbWVhc3VyZW1lbnQgY29tcGxldGVzIChub3QgYmVmb3JlKS5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpZnJhbWUgdHJhbnNpdGlvbnMgZnJvbSBhYnNvbHV0ZSBvdmVybGF5IHRvIGRvY3VtZW50IGZsb3dcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBtZWFzdXJlZCBoZWlnaHQsIHByZXZlbnRpbmcgZmxhc2ggYXQgd3Jvbmcgc2l6ZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd24gJiYgIW9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3duID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyBjb21wLnByb3BzLl9nbG9iYWwgPSBjb21wLmVsZW1lbnQuY29udGVudFdpbmRvdztcbiAgICAgICAgICAgIHJldHVybiBjb21wO1xuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubm9uZSkge1xuICAgICAgICAgICAgLy8gcGFyc2VyID0gcGFyc2VyID8gcGFyc2VyIDogbmV3IERPTVBhcnNlcigpO1xuICAgICAgICAgICAgLy8gY29uc3QgZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGRvYy5ib2R5LmZpcnN0Q2hpbGQ7XG4gICAgICAgICAgICAvL2VsZW1lbnQuc2V0QXR0cmlidXRlKCdpZCcsIGRvbUlkKTtcblxuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7Ly8udHJpbSgpO1xuICAgICAgICAgICAgZWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIC8vICAgY29uc3QgZmlyc3RFbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgICAgIC8vICAgY29uc3QgeiA9IGZpcnN0RWxlbWVudCA/IGZpcnN0RWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgOiBudWxsO1xuICAgICAgICAgICAgLy8gICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vICAgY29uc29sZS5sb2codGVtcGxhdGUsIGZpcnN0RWxlbWVudCwgeilcbiAgICAgICAgICAgIC8vICAgZWxlbWVudCA9IGZpcnN0RWxlbWVudFxuXG4gICAgICAgICAgICAvLyBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Ym9keScpO1xuICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBjb250YWluZXIuaW5uZXJIVE1MID0gbG9hZGVyQ29uZmlnLkhUTUw7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gY29udGFpbmVyLmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2soZWxlbWVudCwgZWxlbWVudCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY3VzdG9tRWxlbWVudE5hbWUgPSB0b0N1c3RvbUVsZW1lbnROYW1lKGNvbXBvbmVudERlZmluaXRpb24ubmFtZSArIHNraW4uaWQpO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlZGVmaW5lICFcbiAgICAgICAgICAgIGlmICghc2Vlbi5pbmNsdWRlcyhjdXN0b21FbGVtZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVDdXN0b21XZWJDb21wb25lbnQoY3VzdG9tRWxlbWVudE5hbWUsIGxvYWRlckNvbmZpZy5IVE1MLCBsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUpO1xuICAgICAgICAgICAgICAgIHNlZW4ucHVzaChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChjdXN0b21FbGVtZW50TmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtjdXN0b21FbGVtZW50TmFtZX0gLz5gO1xuICAgICAgICByZXR1cm4gbmV3IE15b3BXZWJDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJUHJvcENvbmZpZyxcbiAgICBJU2tpbkNvbmZpZyxcbiAgICBJVXNlckZsb3csXG4gICAgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgdjJfSVZhcmlhbnRDb25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcgPSAoY29uZmlnOiB2Ml9JVmFyaWFudENvbmZpZyk6IElDb21wb25lbnRDb25maWcgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIGluc3RhbmNlOiB7XG4gICAgICAgICAgICBpZDogJ2F1dG8nLFxuICAgICAgICAgICAgY29tcG9uZW50SWQ6IGNvbmZpZy5jb21wb25lbnRJZCxcbiAgICAgICAgICAgIGNvbXBvbmVudE5hbWU6IGNvbmZpZy5uYW1lLFxuXG4gICAgICAgICAgICBza2luU2VsZWN0b3I6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiAnc2tpbl9hdXRvX3YyX2NvbnZlcnRlZCdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgfSBhcyBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcsXG4gICAgICAgIHR5cGU6IHtcbiAgICAgICAgICAgIGlkOiBjb25maWcuaWQsXG4gICAgICAgICAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBjb25maWcuZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBwcm9wczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdpbl9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdteW9wX2luaXRfaW50ZXJmYWNlJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGFzIElQcm9wQ29uZmlnLFxuXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBpZDogJ291dF9hdXRvX3YyX2NvbnZlcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdteW9wX2N0YV9oYW5kbGVyJyxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2FueScsXG4gICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGFzIElQcm9wQ29uZmlnXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcmVmczogW10sXG4gICAgICAgICAgICBza2luczogW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdza2luX2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2F1dG9fdjJfY29udmVydGVkJyxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBoYW5kbGUgZW1wdHkgOlxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlcjogY29uZmlnLmNvbnN1bWVfdmFyaWFudFswXS5sb2FkZXJcbiAgICAgICAgICAgICAgICB9IGFzIElTa2luQ29uZmlnXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZGVmYXVsdFNraW46IDBcbiAgICAgICAgfSBhcyBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICAgICAgbmFtZTogY29uZmlnLm5hbWVcbiAgICB9IGFzIElDb21wb25lbnRDb25maWc7XG59O1xuXG4vKipcbiAqIENsb3VkUmVwb3NpdG9yeSAtIFVuaWZpZWQgY2xvdWQgZGF0YSBhY2Nlc3MgbGF5ZXIgZm9yIE15b3AgY29tcG9uZW50c1xuICpcbiAqIFN1cHBvcnRzIGJvdGggdjIgKGRlZmF1bHQpIGFuZCB2MSBtb2RlczpcbiAqIC0gdjI6IFVzZXMgL2NvbnN1bWUgZW5kcG9pbnQgZm9yIGZldGNoaW5nIHZhcmlhbnRzXG4gKiAtIHYxOiBVc2VzIC9mbG93IGVuZHBvaW50IGZvciBmZXRjaGluZyB1c2VyIGZsb3dzXG4gKi9cbi8vIFVzZSBhIGdsb2JhbCBzaW5nbGV0b24gdG8gZW5zdXJlIG9ubHkgb25lIENsb3VkUmVwb3NpdG9yeS5NYWluIGV4aXN0c1xuLy8gZXZlbiB3aGVuIHRoZSBtb2R1bGUgaXMgbG9hZGVkIG11bHRpcGxlIHRpbWVzIGJ5IGRpZmZlcmVudCBidW5kbGVyc1xuY29uc3QgR0xPQkFMX0tFWSA9ICdfX01ZT1BfQ0xPVURfUkVQT1NJVE9SWV9NQUlOX18nO1xuXG5jb25zdCBnZXRHbG9iYWxNYWluID0gKCk6IENsb3VkUmVwb3NpdG9yeSB8IHVuZGVmaW5lZCA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHJldHVybiAod2luZG93IGFzIGFueSlbR0xPQkFMX0tFWV07XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSlbR0xPQkFMX0tFWV07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBzZXRHbG9iYWxNYWluID0gKGluc3RhbmNlOiBDbG91ZFJlcG9zaXRvcnkpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKHdpbmRvdyBhcyBhbnkpW0dMT0JBTF9LRVldID0gaW5zdGFuY2U7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgKGdsb2JhbFRoaXMgYXMgYW55KVtHTE9CQUxfS0VZXSA9IGluc3RhbmNlO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjbGFzcyBDbG91ZFJlcG9zaXRvcnkge1xuICAgIHByaXZhdGUgc3RhdGljIF9tYWluOiBDbG91ZFJlcG9zaXRvcnkgfCBudWxsID0gbnVsbDtcblxuICAgIHN0YXRpYyBnZXQgTWFpbigpOiBDbG91ZFJlcG9zaXRvcnkge1xuICAgICAgICAvLyBDaGVjayBpZiBhIGdsb2JhbCBpbnN0YW5jZSBhbHJlYWR5IGV4aXN0cyAoZnJvbSBhbm90aGVyIGJ1bmRsZSlcbiAgICAgICAgY29uc3QgZ2xvYmFsTWFpbiA9IGdldEdsb2JhbE1haW4oKTtcbiAgICAgICAgaWYgKGdsb2JhbE1haW4pIHtcbiAgICAgICAgICAgIHJldHVybiBnbG9iYWxNYWluO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ3JlYXRlIG5ldyBpbnN0YW5jZSBpZiBuZWVkZWRcbiAgICAgICAgaWYgKCFDbG91ZFJlcG9zaXRvcnkuX21haW4pIHtcbiAgICAgICAgICAgIENsb3VkUmVwb3NpdG9yeS5fbWFpbiA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoKTtcbiAgICAgICAgICAgIHNldEdsb2JhbE1haW4oQ2xvdWRSZXBvc2l0b3J5Ll9tYWluKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ2xvdWRSZXBvc2l0b3J5Ll9tYWluO1xuICAgIH1cblxuICAgIC8vIHYyIGNhY2hlIC0ga2V5ZWQgYnkgY29tcG9uZW50SWQ6ZW52OnByZXZpZXd8bGl2ZVxuICAgIC8vIEVhY2ggUHJvbWlzZSBpcyB0YWdnZWQgd2l0aCBhIGByZXNvbHZlZGAgcHJvcGVydHkgYWZ0ZXIgc2V0dGxpbmcgKHNlZSBmZXRjaENvbXBvbmVudFYyKS5cbiAgICBwcml2YXRlIHZhcmlhbnRzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElDb21wb25lbnRDb25maWc+ICYgeyByZXNvbHZlZD86IElDb21wb25lbnRDb25maWcgfT4gPSB7fTtcblxuICAgIC8vIFRyYWNrIHdoaWNoIGNvbXBvbmVudHMgd2VyZSBwcmVsb2FkZWQgYW5kIHdpdGggd2hhdCBwYXJhbXNcbiAgICAvLyBLZXk6IGNvbXBvbmVudElkLCBWYWx1ZTogeyBlbnYsIHByZXZpZXcgfVxuICAgIHByaXZhdGUgcHJlbG9hZGVkQ29tcG9uZW50czogUmVjb3JkPHN0cmluZywgeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9PiA9IHt9O1xuXG4gICAgLy8gdjEgY2FjaGVcbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgcHJpdmF0ZSBfZGVmYXVsdEVudiA9ICdwcm9kdWN0aW9uJztcbiAgICBwcml2YXRlIF9lbnZFeHBsaWNpdGx5U2V0ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfc3RhdGljTW9kZSA9IGZhbHNlO1xuICAgIHByaXZhdGUgX3F1ZXJ5UGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIHN0YXRpYyBtb2RlIGZvciBzZWxmLWhvc3RlZCBjb21wb25lbnQgcmVnaXN0cmllcy5cbiAgICAgKiBJbiBzdGF0aWMgbW9kZSwgVVJMcyBhcmUgY29uc3RydWN0ZWQgYXMgZmlsZSBwYXRocyBpbnN0ZWFkIG9mIHF1ZXJ5IHBhcmFtczpcbiAgICAgKiAgICR7YmFzZVVybH0vY29tcG9uZW50cy8ke2NvbXBvbmVudElkfS8ke2Vudn0uanNvblxuICAgICAqL1xuICAgIGVuYWJsZVN0YXRpY01vZGUoKSB7XG4gICAgICAgIHRoaXMuX3N0YXRpY01vZGUgPSB0cnVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGFwcGVuZCB0byBhbGwgZmV0Y2ggVVJMcyAoZS5nLiBmb3IgQ0ROIGNhY2hlIGJ1c3RpbmcpLlxuICAgICAqIEV4YW1wbGU6IGBzZXRRdWVyeVBhcmFtcyh7IGxhc3R1cGRhdGU6ICcxMTExMjAyNicgfSlgXG4gICAgICovXG4gICAgc2V0UXVlcnlQYXJhbXMocGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgICAgIHRoaXMuX3F1ZXJ5UGFyYW1zID0gcGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgZGVmYXVsdCBlbnZpcm9ubWVudCBmb3IgdGhpcyBDbG91ZFJlcG9zaXRvcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBzZXRFbnZpcm9ubWVudChlbnY6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9kZWZhdWx0RW52ID0gZW52O1xuICAgICAgICB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGVmYXVsdCBlbnZpcm9ubWVudFxuICAgICAqL1xuICAgIGdldERlZmF1bHRFbnZpcm9ubWVudCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdEVudjtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gVjIgTWV0aG9kcyAoRGVmYXVsdCkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhIGNvbXBvbmVudCBpcyBhbHJlYWR5IGNhY2hlZC9wcmVsb2FkZWQgKHYyKVxuICAgICAqIElmIGVudiBhbmQgcHJldmlldyBhcmUgbm90IHByb3ZpZGVkLCBjaGVja3MgaWYgQU5ZIHZlcnNpb24gaXMgcHJlbG9hZGVkXG4gICAgICovXG4gICAgaXNQcmVsb2FkZWQoY29tcG9uZW50SWQ6IHN0cmluZywgZW52Pzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICAvLyBJZiBzcGVjaWZpYyBlbnYvcHJldmlldyByZXF1ZXN0ZWQsIGNoZWNrIGV4YWN0IG1hdGNoXG4gICAgICAgIGlmIChlbnYgIT09IHVuZGVmaW5lZCB8fCBwcmV2aWV3ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29tcG9uZW50SWR9OiR7ZW52IHx8IHRoaXMuX2RlZmF1bHRFbnZ9OiR7cHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gO1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlS2V5IGluIHRoaXMudmFyaWFudHM7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGNoZWNrIGlmIGFueSB2ZXJzaW9uIHdhcyBwcmVsb2FkZWRcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudElkIGluIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIHByZWxvYWRlZCBwYXJhbXMgZm9yIGEgY29tcG9uZW50IChpZiBwcmVsb2FkZWQpXG4gICAgICogUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IHByZWxvYWRlZFxuICAgICAqL1xuICAgIGdldFByZWxvYWRlZFBhcmFtcyhjb21wb25lbnRJZDogc3RyaW5nKTogeyBlbnY6IHN0cmluZzsgcHJldmlldzogYm9vbGVhbiB9IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYSB2MiBjb21wb25lbnQgY29uZmlnXG4gICAgICogSWYgZW52L3ByZXZpZXcgbm90IHNwZWNpZmllZCBhbmQgY29tcG9uZW50IHdhcyBwcmVsb2FkZWQsIHVzZXMgcHJlbG9hZGVkIHBhcmFtc1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjIoY29tcG9uZW50SWQ6IHN0cmluZywgZW52aXJvbm1lbnRJZGVudGlmaWVyPzogc3RyaW5nLCBwcmV2aWV3PzogYm9vbGVhbik6IFByb21pc2U8SUNvbXBvbmVudENvbmZpZz4ge1xuICAgICAgICAvLyBJZiBubyBleHBsaWNpdCBlbnYvcHJldmlldyBhbmQgY29tcG9uZW50IHdhcyBwcmVsb2FkZWQsIHVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgIGNvbnN0IHByZWxvYWRlZCA9IHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0UGFyYW1zID0gZW52aXJvbm1lbnRJZGVudGlmaWVyICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCBlbnY6IHN0cmluZztcbiAgICAgICAgbGV0IHVzZVByZXZpZXc6IGJvb2xlYW47XG5cbiAgICAgICAgaWYgKCFoYXNFeHBsaWNpdFBhcmFtcyAmJiBwcmVsb2FkZWQpIHtcbiAgICAgICAgICAgIC8vIFVzZSBwcmVsb2FkZWQgcGFyYW1zXG4gICAgICAgICAgICBlbnYgPSBwcmVsb2FkZWQuZW52O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZWxvYWRlZC5wcmV2aWV3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVXNlIHByb3ZpZGVkIHBhcmFtcyBvciBkZWZhdWx0c1xuICAgICAgICAgICAgZW52ID0gZW52aXJvbm1lbnRJZGVudGlmaWVyIHx8IHRoaXMuX2RlZmF1bHRFbnY7XG4gICAgICAgICAgICAvLyBJZiBwcmV2aWV3IGV4cGxpY2l0bHkgdHJ1ZSBcdTIxOTIgdHJ1ZVxuICAgICAgICAgICAgLy8gSWYgcHJldmlldyBleHBsaWNpdGx5IGZhbHNlIFx1MjE5MiBmYWxzZVxuICAgICAgICAgICAgLy8gSWYgcHJldmlldyB1bmRlZmluZWQ6IGVudiB3YXMgc3BlY2lmaWVkICh2aWEgcGFyYW0gb3Igc2V0RW52aXJvbm1lbnQpIFx1MjE5MiBmYWxzZSwgb3RoZXJ3aXNlIFx1MjE5MiB0cnVlXG4gICAgICAgICAgICBjb25zdCBoYXNFZmZlY3RpdmVFbnYgPSBlbnZpcm9ubWVudElkZW50aWZpZXIgfHwgdGhpcy5fZW52RXhwbGljaXRseVNldDtcbiAgICAgICAgICAgIHVzZVByZXZpZXcgPSBwcmV2aWV3ID09PSB0cnVlID8gdHJ1ZSA6IChwcmV2aWV3ID09PSBmYWxzZSA/IGZhbHNlIDogIWhhc0VmZmVjdGl2ZUVudik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IGAke2NvbXBvbmVudElkfToke2Vudn06JHt1c2VQcmV2aWV3ID8gJ3ByZXZpZXcnIDogJ2xpdmUnfWA7XG5cbiAgICAgICAgY29uc29sZS5sb2coJ1tDbG91ZFJlcG9zaXRvcnldIGZldGNoQ29tcG9uZW50VjInLCB7XG4gICAgICAgICAgICBjb21wb25lbnRJZDogY29tcG9uZW50SWQuc2xpY2UoMCwgOCkgKyAnLi4uJyxcbiAgICAgICAgICAgIGVudixcbiAgICAgICAgICAgIHVzZVByZXZpZXcsXG4gICAgICAgICAgICBjYWNoZUtleSxcbiAgICAgICAgICAgIGNhY2hlZDogY2FjaGVLZXkgaW4gdGhpcy52YXJpYW50c1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXRoaXMudmFyaWFudHNbY2FjaGVLZXldKSB7XG4gICAgICAgICAgICAvLyBUcmFjayB0aGlzIGFzIHByZWxvYWRlZCAoZmlyc3QgZmV0Y2ggY291bnRzIGFzIHByZWxvYWQpXG4gICAgICAgICAgICBpZiAoIXRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZWxvYWRlZENvbXBvbmVudHNbY29tcG9uZW50SWRdID0geyBlbnYsIHByZXZpZXc6IHVzZVByZXZpZXcgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudmFyaWFudHNbY2FjaGVLZXldID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVybDogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRpY01vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gdXNlUHJldmlldyA/ICdwcmV2aWV3JyA6IGVudjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBgJHt0aGlzLl9iYXNlVXJsfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9LyR7ZmlsZX0uanNvbmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHRoaXMuX3F1ZXJ5UGFyYW1zKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxcykgdXJsICs9IGA/JHtxc31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmwgPSBgJHt0aGlzLl9iYXNlVXJsfS9jb25zdW1lP2lkPSR7Y29tcG9uZW50SWR9JmVudj0ke2Vudn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VQcmV2aWV3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCArPSAnJnByZXZpZXc9dHJ1ZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgY29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiAoJHtyZXMuc3RhdHVzfSR7dGhpcy5fc3RhdGljTW9kZSA/IGAgZnJvbSAke3VybH1gIDogJyd9KWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhbnQgPSBqc29uLml0ZW07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFyaWFudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYENvbXBvbmVudCBcIiR7Y29tcG9uZW50SWR9XCIgbm90IGZvdW5kYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YXJpYW50LmNvbnN1bWVfdmFyaWFudCB8fCAhdmFyaWFudC5jb25zdW1lX3ZhcmlhbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQ29tcG9uZW50IFwiJHtjb21wb25lbnRJZH1cIiBoYXMgbm8gaW1wbGVtZW50YXRpb24gZm9yIGVudmlyb25tZW50IFwiJHtlbnZ9XCJgKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRDb25maWcgPSBjb252ZXJ0VjJWYXJpYW50VG9Db21wb25lbnRDb25maWcodmFyaWFudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUYWcgdGhlIFByb21pc2Ugc28gZ2V0UmVzb2x2ZWRDb25maWcgY2FuIHJlYWQgaXQgc3luY2hyb25vdXNseVxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMudmFyaWFudHNbY2FjaGVLZXldIGFzIGFueSkucmVzb2x2ZWQgPSBjb21wb25lbnRDb25maWc7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNvbXBvbmVudENvbmZpZyk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBjYWNoZWQgcmVqZWN0ZWQgcHJvbWlzZSBzbyB0aGUgbmV4dCBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlcyBhIGZyZXNoIHJlcXVlc3QgKGUuZy4gYWZ0ZXIgbmV0d29yayByZWNvdmVyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZhcmlhbnRzW2NhY2hlS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy52YXJpYW50c1tjYWNoZUtleV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3luY2hyb25vdXMgdmVyc2lvbiBvZiBmZXRjaENvbXBvbmVudFYyIFx1MjAxNCByZXR1cm5zIHRoZSBjb25maWcgb25seSBpZlxuICAgICAqIHRoZSBmZXRjaCBhbHJlYWR5IGNvbXBsZXRlZCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICpcbiAgICAgKiBVc2VzIHRoZSBzYW1lIGB0aGlzLnZhcmlhbnRzYCBjYWNoZSB0aGF0IGZldGNoQ29tcG9uZW50VjIvcHJlbG9hZENvbXBvbmVudHNcbiAgICAgKiBwb3B1bGF0ZS4gRWFjaCBjYWNoZWQgUHJvbWlzZSBpcyB0YWdnZWQgd2l0aCBhIGAucmVzb2x2ZWRgIHByb3BlcnR5IHdoZW5cbiAgICAgKiBpdCBzZXR0bGVzIFx1MjAxNCB0aGlzIG1ldGhvZCBqdXN0IHJlYWRzIHRoYXQgcHJvcGVydHkuIE5vIHNlcGFyYXRlIGNhY2hlLlxuICAgICAqXG4gICAgICogV2h5IHRoaXMgZXhpc3RzOiBSZWFjdCBOYXRpdmUgbmVlZHMgdGhlIGNvbmZpZyBhdCByZW5kZXIgdGltZSB0byBlbWJlZCBpdFxuICAgICAqIGluIHRoZSBXZWJWaWV3IEhUTUwgKGNhbid0IGF3YWl0IGluIHVzZVN0YXRlKS4gSWYgcHJlbG9hZENvbXBvbmVudHMgcmFuXG4gICAgICogZWFybGllciBhbmQgdGhlIGZldGNoIGNvbXBsZXRlZCwgdGhpcyByZXR1cm5zIHRoZSByZXN1bHQgc3luY2hyb25vdXNseSxcbiAgICAgKiBza2lwcGluZyB0aGUgV0VCVklFV19SRUFEWSBcdTIxOTIgZmV0Y2ggXHUyMTkyIGluamVjdCByb3VuZCB0cmlwIGVudGlyZWx5LlxuICAgICAqL1xuICAgIGdldFJlc29sdmVkQ29uZmlnKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pOiBJQ29tcG9uZW50Q29uZmlnIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IHByZWxvYWRlZCA9IHRoaXMucHJlbG9hZGVkQ29tcG9uZW50c1tjb21wb25lbnRJZF07XG4gICAgICAgIGNvbnN0IGhhc0V4cGxpY2l0UGFyYW1zID0gZW52ICE9PSB1bmRlZmluZWQgfHwgcHJldmlldyAhPT0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGxldCByZXNvbHZlZEVudjogc3RyaW5nO1xuICAgICAgICBsZXQgdXNlUHJldmlldzogYm9vbGVhbjtcblxuICAgICAgICBpZiAoIWhhc0V4cGxpY2l0UGFyYW1zICYmIHByZWxvYWRlZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWRFbnYgPSBwcmVsb2FkZWQuZW52O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZWxvYWRlZC5wcmV2aWV3O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzb2x2ZWRFbnYgPSBlbnYgfHwgdGhpcy5fZGVmYXVsdEVudjtcbiAgICAgICAgICAgIGNvbnN0IGhhc0VmZmVjdGl2ZUVudiA9IGVudiB8fCB0aGlzLl9lbnZFeHBsaWNpdGx5U2V0O1xuICAgICAgICAgICAgdXNlUHJldmlldyA9IHByZXZpZXcgPT09IHRydWUgPyB0cnVlIDogKHByZXZpZXcgPT09IGZhbHNlID8gZmFsc2UgOiAhaGFzRWZmZWN0aXZlRW52KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gYCR7Y29tcG9uZW50SWR9OiR7cmVzb2x2ZWRFbnZ9OiR7dXNlUHJldmlldyA/ICdwcmV2aWV3JyA6ICdsaXZlJ31gO1xuICAgICAgICByZXR1cm4gdGhpcy52YXJpYW50c1tjYWNoZUtleV0/LnJlc29sdmVkIHx8IG51bGw7XG4gICAgfVxuXG4gICAgLy8gPT09PT09PT09PT09IFYxIE1ldGhvZHMgKExlZ2FjeSkgPT09PT09PT09PT09XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIHYxIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50VjEoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEF1dG9GbG93KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHNbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBmZXRjaEF1dG9GbG93KGNvbXBvbmVudElkOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKCF0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tjb21wb25lbnRJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Y29tcG9uZW50SWR9JmF1dG89dHJ1ZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoanNvbi5pdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2Zsb3dJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tmbG93SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09PT09PT0gQmFja3dhcmQgQ29tcGF0aWJpbGl0eSA9PT09PT09PT09PT1cblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSBmZXRjaENvbXBvbmVudFYyIG9yIGZldGNoQ29tcG9uZW50VjEgZXhwbGljaXRseVxuICAgICAqIERlZmF1bHRzIHRvIHYxIGJlaGF2aW9yIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgY29kZVxuICAgICAqL1xuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5mZXRjaENvbXBvbmVudFYxKGNvbXBvbmVudElkLCBmbG93SWQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgQ2xvdWRSZXBvc2l0b3J5IGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IHYyX0Nsb3VkUmVwb3NpdG9yeSA9IENsb3VkUmVwb3NpdG9yeTtcbiIsICJpbXBvcnQgeyBDbG91ZFJlcG9zaXRvcnkgfSBmcm9tIFwiLi9DbG91ZFJlcG9zaXRvcnlcIjtcblxubGV0IF9jbG91ZFJlcG9zaXRvcnkgPSBDbG91ZFJlcG9zaXRvcnkuTWFpbjtcblxuZXhwb3J0IGNvbnN0IGdldENsb3VkUmVwb3NpdG9yeSA9ICgpID0+IF9jbG91ZFJlcG9zaXRvcnk7XG5cbmV4cG9ydCBjb25zdCBpc1ByZWxvYWRlZCA9IChjb21wb25lbnRJZDogc3RyaW5nLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKTogYm9vbGVhbiA9PiB7XG4gICAgcmV0dXJuIF9jbG91ZFJlcG9zaXRvcnkuaXNQcmVsb2FkZWQoY29tcG9uZW50SWQsIGVudiwgcHJldmlldyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UHJlbG9hZGVkUGFyYW1zID0gKGNvbXBvbmVudElkOiBzdHJpbmcpID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5nZXRQcmVsb2FkZWRQYXJhbXMoY29tcG9uZW50SWQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGVuYWJsZUxvY2FsRGV2ID0gKCkgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KFwiaHR0cDovL2xvY2FsaG9zdDo5MjkyXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldENsb3VkUmVwb3NpdG9yeVVybCA9ICh1cmw6IHN0cmluZykgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KHVybCk7XG59O1xuXG4vKipcbiAqIENvbmZpZ3VyZSB0aGUgU0RLIHRvIGZldGNoIGNvbXBvbmVudHMgZnJvbSBhIHNlbGYtaG9zdGVkIHN0YXRpYyByZWdpc3RyeSAoUzMsIENETiwgZXRjLilcbiAqIGluc3RlYWQgb2YgdGhlIE15b3AgY2xvdWQuIENvbXBvbmVudHMgYXJlIHNlcnZlZCBhcyBzdGF0aWMgSlNPTiBmaWxlczpcbiAqICAgYCR7Y2RuVXJsfS9jb21wb25lbnRzLyR7Y29tcG9uZW50SWR9LyR7ZW52aXJvbm1lbnR9Lmpzb25gXG4gKi9cbmV4cG9ydCBjb25zdCBlbmFibGVTZWxmSG9zdGVkID0gKGNkblVybDogc3RyaW5nLCBxdWVyeVBhcmFtcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+IHtcbiAgICBfY2xvdWRSZXBvc2l0b3J5ID0gbmV3IENsb3VkUmVwb3NpdG9yeShjZG5VcmwpO1xuICAgIF9jbG91ZFJlcG9zaXRvcnkuZW5hYmxlU3RhdGljTW9kZSgpO1xuICAgIGlmIChxdWVyeVBhcmFtcykge1xuICAgICAgICBfY2xvdWRSZXBvc2l0b3J5LnNldFF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q2xvdWRSZXBvc2l0b3J5ID0gKHJlcG9zaXRvcnk6IENsb3VkUmVwb3NpdG9yeSkgPT4ge1xuICAgIF9jbG91ZFJlcG9zaXRvcnkgPSByZXBvc2l0b3J5O1xufTtcblxuZXhwb3J0IGNvbnN0IHNldEVudmlyb25tZW50ID0gKGVudjogc3RyaW5nKSA9PiB7XG4gICAgX2Nsb3VkUmVwb3NpdG9yeS5zZXRFbnZpcm9ubWVudChlbnYpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlc29sdmVkQ29uZmlnID0gKGNvbXBvbmVudElkOiBzdHJpbmcsIGVudj86IHN0cmluZywgcHJldmlldz86IGJvb2xlYW4pID0+IHtcbiAgICByZXR1cm4gX2Nsb3VkUmVwb3NpdG9yeS5nZXRSZXNvbHZlZENvbmZpZyhjb21wb25lbnRJZCwgZW52LCBwcmV2aWV3KTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcmVsb2FkQ29tcG9uZW50cyA9IGFzeW5jIChpZHM6IHN0cmluZ1tdLCBlbnY/OiBzdHJpbmcsIHByZXZpZXc/OiBib29sZWFuKSA9PiB7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAgaWRzLm1hcCgoaWQpID0+IF9jbG91ZFJlcG9zaXRvcnkuZmV0Y2hDb21wb25lbnRWMihpZCwgZW52LCBwcmV2aWV3KSksXG4gICAgKTtcbn07XG4iLCAiaW1wb3J0IHtkZWNvbXByZXNzVVVJRHN9IGZyb20gXCIuLi91dGlscy91dWlkLnRzXCI7XG5pbXBvcnQge0Nsb3VkUmVwb3NpdG9yeX0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50RXhwZXJpZW5jZSwgSVNraW5JbnN0YW5jZUNvbmZpZyxcbiAgICBTa2luU2VsZWN0b3JUeXBlc1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjb25zdCBjaGVja015b3BPdmVycmlkZSA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcpOiBQcm9taXNlPElDb21wb25lbnRDb25maWcgfCBudWxsPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy9UT0RPOiBzdXBwb3J0IGRpc2FibGluZyB0aGUgbWVjaGFuaXNtXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgICAgICBjb25zdCBteW9wT3ZlcnJpZGUgPSBwYXJhbXMuZ2V0KCdteW9wT3ZlcnJpZGUnKTtcbiAgICAgICAgaWYgKG15b3BPdmVycmlkZSkge1xuICAgICAgICAgICAgY29uc3QgW3NvdXJjZSwgLi4udXVpZHNdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbY29tcG9uZW50SWQsIHNraW5JZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGZldGNoQXV0b0Zsb3cuIExvb2tzIGxpa2Ugb25seSBvbmUgc2tpbiBpcyByZXR1cm5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbiA9IGNvbXBvbmVudFRvT3ZlcnJpZGUudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogZm9yIG5vdyBqdXN0IHNldCBza2luIGlkLiBDaGVjayB0aGUgY2xvdWQgaW1wbGVtZW50YXRpb25cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBza2luSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJU2tpbkluc3RhbmNlQ29uZmlnXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyAgICBjYXNlICdmbG93Jzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7XG4gICAgICAgICAgICAgICAgICAgLy8gY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRDb25maWcudHlwZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZSA9PT0gU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwZXJpZW5jZSA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcy5maW5kKGUgPT4gZS5pZCA9PT0gZXhwZXJpbWVudElkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRFeHBlcmllbmNlPy50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZSA9IHJlc29sdmVkRXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLmZpbmQocyA9PiBzLnNlZ21lbnRJZCA9PT0gdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2Uuc2VnbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0gc2VnbWVudD8uc2tpblNlbGVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtJTXlvcExvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50cy9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBFbnZlbG9wZWRNZXNzYWdlLCBFeGVjdXRlQ29tcG9uZW50TWV0aG9kLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXNwb25zZSwgTWVzc2FnZURpcmVjdGlvbiwgUmVmXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wSWZyYW1lTG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL2lmcmFtZUxvYWRlclwiO1xuaW1wb3J0IHtXZWJjb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvd2ViY29tcG9uZW50TG9hZGVyXCI7XG5pbXBvcnQgdHlwZSB7SWZyYW1lU0RLfSBmcm9tIFwiLi4vSWZyYW1lXCI7XG5pbXBvcnQge2Nvbm5lY3RQcm9wcywgY29ubmVjdFJlZnMsIGNyZWF0ZVJlZkNvbXBvbmVudH0gZnJvbSBcIi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtcbiAgICBFeHBlcmllbmNlVHlwZXMsXG4gICAgSUNvbXBvbmVudENvbmZpZyxcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSUV4cGVyaWVuY2UsIElGdW5jdGlvblJlc3VsdHNTZWdtZW50LCBJU2VnbWVudGVkU2tpbkNvbmZpZywgSVNlZ21lbnRFeHBlcmllbmNlLFxuICAgIElTa2luQ29uZmlnLCBJU2tpblNlbGVjdG9yQ29uZmlnLCBTa2luU2VsZWN0b3JUeXBlcyxcblxuXG59IGZyb20gXCIuLi9jb21tb25cIjtcbi8vIEB0cy1pZ25vcmUgaGFuZGxlZCBieSBjdXN0b20gZXNidWlsZCBwbHVnaW5cbmltcG9ydCB2ZXJzaW9uIGZyb20gXCJteW9wLXNkay12ZXJzaW9uXCI7XG5pbXBvcnQge0hUTUxDb21wb25lbnRMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHtjaGVja015b3BPdmVycmlkZX0gZnJvbSBcIi4vbXlvcE92ZXJyaWRlLnRzXCI7XG5cbmludGVyZmFjZSBjb21wb25lbnRMb2FkZXJDcmVhdG9yIHtcbiAgICBuZXcobG9hZGVyczogSU15b3BMb2FkZXJbXSk6IGFueTtcbn1cblxuLy8gY29uc3QgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGFzeW5jIChpZDogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC9jb21wb25lbnQ/aWQ9JHtpZH1gKTtcbi8vICAgICBjb25zdCBjb21wb25lbnREZWY6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gKGF3YWl0IHJlcy5qc29uKCkpLml0ZW07XG4vLyAgICAgcmV0dXJuIGNvbXBvbmVudERlZlxuLy8gfVxuXG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbi8qKlxuICogVGhlIEhvc3QgU0RLIGlzIGRlc2lnbmVkIGZvciBpbnRlZ3JhdGlvbiB3aXRoaW4gdGhlIGhvc3QgYXBwbGljYXRpb24gdGhhdCBzZXJ2ZXMgYXMgdGhlIGNvbnRhaW5lciBmb3IgTXlvcCAgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBJdCBwcm92aWRlcyBlc3NlbnRpYWwgZnVuY3Rpb25hbGl0aWVzIGFuZCBBUElzIGZvciByZWdpc3RlcmluZywgbWFuYWdpbmcsIGFuZCBjb21tdW5pY2F0aW5nIHdpdGggTXlvcCBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGVuYWJsZXMgc2VhbWxlc3MgZW1iZWRkaW5nIG9mIGluZGVwZW5kZW50bHkgZGV2ZWxvcGVkIGNvbXBvbmVudHMgaW50byB0aGUgaG9zdCBhcHBsaWNhdGlvbiwgZW5zdXJpbmcgc21vb3RoIGludGVyb3BlcmFiaWxpdHkgYW5kIGNvbnNpc3RlbnQgdXNlciBleHBlcmllbmNlIGFjcm9zcyB2YXJpb3VzIE15b3AgY29tcG9uZW50IGltcGxlbWVudGF0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhvc3RTREsge1xuICAgIHN0YXRpYyBJbnN0YW5jZSA9ICgpID0+IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbiAgICBjb21wb25lbnRzMmluaXQ6IElNeW9wQ29tcG9uZW50W10gPSBbXTtcbiAgICBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50c0xvYWRlcnM6IElNeW9wTG9hZGVyW10gPSBbXTtcblxuICAgIHB1YmxpYyBpbml0aWF0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIHR5cGUySW5zdGFuY2VDb3VudDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHt9O1xuICAgIHB1YmxpYyBhc3NpZ25JZCA9IChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICBpZiAoIXRoaXMudHlwZTJJbnN0YW5jZUNvdW50W2NvbXBvbmVudERlZmluaXRpb24uaWRdKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke2NvbXBvbmVudERlZmluaXRpb24uaWR9XyR7Kyt0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXX1gO1xuICAgIH1cblxuICAgIC8vVE9ETyA6IGZpeCB0aGUgaW5zcGVjdCBpbXBsZW1lbnRhdGlvbiBpbnNpZGUgcmVmQ29tcG9uZW50XG4gICAgLy90aGVuIGluc3BlY3RlZCBtYXliZSBjYW4gYmUgZHJvcHBlZFxuICAgIHByaXZhdGUgaW5zcGVjdGVkID0gZmFsc2U7XG4gICAgcHVibGljIGluc3BlY3QgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmluc3BlY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICB0aGlzLmluc3BlY3RlZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGlmIChjb21wb25lbnQuaW5zcGVjdCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5pbnNwZWN0KClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICBwcml2YXRlIGluY29taW5nTWVzc2FnZUhhbmRsZXIgPSAoZXZlbnQ6IE1lc3NhZ2VFdmVudDxCYXNlTXlvcE1lc3NhZ2U+KSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ2luY29taW5nTWVzc2FnZUhhbmRsZXIgR09UICcsIGV2ZW50KVxuICAgICAgICAvL1RPRE8gOiAgaWYgKGV2ZW50Lm9yaWdpbiAhPT0gXCJodHRwOi8vZXhhbXBsZS5vcmc6ODA4MFwiKSByZXR1cm47XG4gICAgICAgIGlmIChldmVudC5vcmlnaW4gPT09IGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbikge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnSSBLbm93IHRoYXQgISEhJyk7XG4gICAgICAgICAgICAvLyAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICBpZiAoZXZlbnQuZGF0YS5teW9wKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5kaXJlY3Rpb24gIT09IE1lc3NhZ2VEaXJlY3Rpb24udXAgJiYgZXZlbnQuZGF0YS5tZXNzYWdlVHlwZSAhPT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdtZXNzYWdlIGRyb3BwZWQgaW4gaG9zdHNkaywgZGlyZWN0aW9uIHdhcyAnLCBldmVudC5kYXRhLmRpcmVjdGlvbilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImV2ZW50IG9uIGhvc3Qgc2lkZSBcIiwgZXZlbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlID0gZXZlbnQuZGF0YTtcblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlcXVlc3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdC5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBJbml0TWVzc2FnZShjb21wb25lbnQuaWQpKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gY29tcG9uZW50cyAyIGluaXRcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCAhPT0gKG15b3BNZXNzYWdlIGFzIEluaXRSZXNwb25zZSkuY29udGVudC5pZClcblxuICAgICAgICAgICAgICAgIGNvbnN0IGluaXRpYXRlZENvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQ/LmlkKTtcbiAgICAgICAgICAgICAgICBpbml0aWF0ZWRDb21wb25lbnQ/LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgLy9pbml0aWF0ZWRDb21wb25lbnQ/LnBhcmVudD8uc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyA6IGlzIGl0IHRydWUgdG8gbm90IHBhc3MgZnVydGhlciAoIHRvIHRoZSBjb21wb25lbnQgKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG15b3BNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRW52ZWxvcGVkTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gbXlvcE1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UuZGlyZWN0aW9uID09PSBNZXNzYWdlRGlyZWN0aW9uLmRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlZE1lc3NhZ2UubWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gRXhlY3V0ZUNvbXBvbmVudE1ldGhvZC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkTWVzc2FnZS5tZXNzYWdlLnJvdXRlID0gdHlwZWRNZXNzYWdlLnJvdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQ29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gdHlwZWRNZXNzYWdlLm1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyQ29tcG9uZW50LnNlbmQodHlwZWRNZXNzYWdlLm1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIDogbG9nID9cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgLy9jb21wb25lbnQucmVmcy5ib2R5Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlLm1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSBteW9wTWVzc2FnZS5kZXN0aW5hdGlvbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy9ubyBpbiBtZW0gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5teW9wLklmcmFtZVNESykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQub25NZXNzYWdlUmVjZWl2ZWQobXlvcE1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL25vdCBwcm9jZXNzZWQgaW4gb25NZXNzYWdlUmVjZWl2ZWRcbiAgICAgICAgICAgICAgICAgICAgLy9wYXNzIHRvIHBhcmVudCBIb3N0U0RLIHRvIHRyeSBwcm9jZXNzIHRoZXJlXG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcC5JZnJhbWVTREsubWVzc2FnZVRvSG9zdChteW9wTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZXZlbnQuc291cmNlLnBvc3RNZXNzYWdlKFxuICAgICAgICAvLyAgICAgXCJoaSB0aGVyZSB5b3Vyc2VsZiEgIHRoZSBzZWNyZXQgcmVzcG9uc2UgXCIgKyBcImlzOiByaGVlZWVldCFcIixcbiAgICAgICAgLy8gICAgIGV2ZW50Lm9yaWdpbixcbiAgICAgICAgLy8gICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBzeW50aGV0aWNFdmVudCA9IG5ldyBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPignJyxcbiAgICAgICAgICAgIHtkYXRhOiBtZXNzYWdlfVxuICAgICAgICApXG5cbiAgICAgICAgdGhpcy5pbmNvbWluZ01lc3NhZ2VIYW5kbGVyKHN5bnRoZXRpY0V2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5pdCA9IChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycz86IGNvbXBvbmVudExvYWRlckNyZWF0b3JbXSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbml0aWF0ZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaG9zdFNESyBhbHJlYWR5IGluaXRpYXRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzaWNMb2FkZXJzID0gW1xuICAgICAgICAgICAgbmV3IE15b3BJZnJhbWVMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBXZWJjb21wb25lbnRMb2FkZXIoKSxcbiAgICAgICAgICAgIG5ldyBIVE1MQ29tcG9uZW50TG9hZGVyKClcbiAgICAgICAgXTtcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHNMb2FkZXJzID0gW1xuICAgICAgICAgICAgLi4uYmFzaWNMb2FkZXJzXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzKSB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgbG9hZGVyQnlUeXBlOiBSZWNvcmQ8c3RyaW5nLCBJTXlvcExvYWRlcj4gPSB7fTtcblxuICAgICAgICAgICAgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnMuZm9yRWFjaChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9yID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXN0b21Mb2FkZXIgPSBuZXcgY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcih0aGlzLmNvbXBvbmVudHNMb2FkZXJzKTtcbiAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbY3VzdG9tTG9hZGVyLnR5cGVdID0gY3VzdG9tTG9hZGVyO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycy5mb3JFYWNoKGxvYWRlciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdKVxuICAgICAgICAgICAgICAgICAgICBsb2FkZXJCeVR5cGVbbG9hZGVyLnR5cGVdID0gbG9hZGVyO1xuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IE9iamVjdC52YWx1ZXMobG9hZGVyQnlUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluY29tbWluZyBtZXNzYWdlcyBmcm9tIElGcmFtZXNcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgICAgICBcIm1lc3NhZ2VcIixcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcixcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnNvbGUubG9nKCdteW9wIGhvc3RTREsgaW5pdGlhdGVkJywgZG9jdW1lbnQubG9jYXRpb24uaHJlZik7XG4gICAgICAgIHRoaXMuaW5pdGlhdGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9nZXRTa2luSWRCeVNraW5TZWxlY3RvciA9IGFzeW5jIChza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWcsIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdID0gW10sIGhvb2tzPzogbG9hZGVySG9va3MpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY0ZpbmQ8VD4oXG4gICAgICAgICAgICBhcnJheTogVFtdLFxuICAgICAgICAgICAgcHJlZGljYXRlOiAoaXRlbTogVCkgPT4gUHJvbWlzZTxib29sZWFuPlxuICAgICAgICApOiBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBhcnJheSkge1xuICAgICAgICAgICAgICAgIGlmIChhd2FpdCBwcmVkaWNhdGUoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gUmV0dXJuIHVuZGVmaW5lZCBpZiBubyBtYXRjaCBpcyBmb3VuZFxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoIChza2luU2VsZWN0b3IudHlwZSkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY2FzZSBcIkRlZGljYXRlZFNraW5cIiA6IC8vYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQ6IHtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luSWQgPSAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2luPy5pZFxuICAgICAgICAgICAgICAgICAgICB8fCAoc2tpblNlbGVjdG9yIGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnKS5za2lucyFbMF0uaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRTa2luSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZDoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gKHNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZylcbiAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50ID0gYXdhaXQgYXN5bmNGaW5kKHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLCBhc3luYyBzZWdtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuc2VnbWVudElkID09PSAnRGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwZXJpZW5jZSA9IGV4cGVyaWVuY2VzLmZpbmQoZXhwZXJpZW5jZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwZXJpZW5jZS50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2UpLnNlZ21lbnQuaWQgPT09IHNlZ21lbnQuc2VnbWVudElkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZXhwZXJpZW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiZXhwZXJpZW5jZSBub3QgZm91bmRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZEV4cGVyaWVuY2UgPSBleHBlcmllbmNlIGFzIElTZWdtZW50RXhwZXJpZW5jZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTZWdtZW50ID0gKHR5cGVkRXhwZXJpZW5jZS5zZWdtZW50IGFzIElGdW5jdGlvblJlc3VsdHNTZWdtZW50KVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnRGdW5jdGlvbiA9IChob29rcyA/IGhvb2tzIDoge30pW3R5cGVkU2VnbWVudC5mdW5jdGlvbl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50RnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBzZWdtZW50RnVuY3Rpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBzZWdtZW50SWQ6JHtzZWdtZW50LnNlZ21lbnRJZH0sICR7dHlwZWRTZWdtZW50LmZ1bmN0aW9ufSBmdW5jdGlvbiBub3QgcHJvdmlkZWQgIWApXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VnbWVudClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKHNlZ21lbnQuc2tpblNlbGVjdG9yLCBleHBlcmllbmNlcyk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJycgLy9UT0RPXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydW5Ta2luU2VsZWN0b3IgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBob29rcz86IGxvYWRlckhvb2tzKSA9PiB7XG4gICAgICAgIGNvbnN0IHNraW5JZCA9IGF3YWl0IHRoaXMuX2dldFNraW5JZEJ5U2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IsIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzLCBob29rcyk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRDb25maWcudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbG9hZGVySG9va3M/OiBsb2FkZXJIb29rcztcblxuICAgIHB1YmxpYyBsb2FkQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50Pihjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbnRhaW5lcj86IEhUTUxFbGVtZW50IHwgUmVmLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6XG4gICAgICAgIFByb21pc2U8VD4gPT4ge1xuXG4gICAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbm8gY29udGFpbmVyIHdhcyBmb3VuZCBmb3IgdGhpcyBjb21wb25lbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG92ZXJyaWRkZW5Db25maWcgPSBhd2FpdCBjaGVja015b3BPdmVycmlkZShjb21wb25lbnRDb25maWcpO1xuICAgICAgICBpZiAob3ZlcnJpZGRlbkNvbmZpZykge1xuICAgICAgICAgICAgLy9UT0RPIDogbG9nXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcgPSBvdmVycmlkZGVuQ29uZmlnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAvLyBpZiAoIWNvbnRhaW5lci5fX25vblByb3hpZWQpIHtcbiAgICAgICAgLy8gICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IChjb250YWluZXIgYXMgdW5rbm93biBhcyBNeW9wUmVmQ29tcG9uZW50KTtcbiAgICAgICAgLy8gICAgIC8vaWYgd2UgZ290IGxvYWRDb21wb25lbnQgb3ZlciBNeW9wUmVmQ29tcG9uZW50XG4gICAgICAgIC8vICAgICBpZiAocmVmQ29tcG9uZW50LmlkICYmIHJlZkNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50KGNvbXBvbmVudENvbmZpZywgcmVmQ29tcG9uZW50LnJlZiwgb3B0aW9ucyk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gbGV0IHJvb3RDb21wb25lbnQ6IElNeW9wQ29tcG9uZW50ID0gcmVmQ29tcG9uZW50O1xuICAgICAgICAvLyAgICAgICAgIC8vIHdoaWxlKCFyb290Q29tcG9uZW50LmVsZW1lbnQgJiYgcm9vdENvbXBvbmVudC5wYXJlbnQpe1xuICAgICAgICAvLyAgICAgICAgIC8vICAgICByb290Q29tcG9uZW50ID0gcm9vdENvbXBvbmVudC5wYXJlbnRcbiAgICAgICAgLy8gICAgICAgICAvLyB9XG4gICAgICAgIC8vICAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICAvLyByb290Q29tcG9uZW50LmVsZW1lbnRcbiAgICAgICAgLy8gICAgICAgICAvLyAvL3doYXQgbm93ID9cbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gfVxuXG4gICAgICAgIGNvbnN0IGhvb2tzID0gey4uLih0aGlzLmxvYWRlckhvb2tzID8/IHt9KSwgLi4uKG9wdGlvbnM/Lmhvb2tzID8/IHt9KX07XG5cbiAgICAgICAgY29uc3QgcmVmID0gY29udGFpbmVyIGFzIFJlZjtcbiAgICAgICAgaWYgKHJlZi5teW9wKSB7XG4gICAgICAgICAgICBpZiAocmVmLmNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gey4uLmNvbXBvbmVudENvbmZpZ307XG4gICAgICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnLmluc3RhbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5jb21wb25lbnRDb25maWcuaW5zdGFuY2VcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG4gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwicnVuU2tpblNlbGVjdG9yIGZhaWxlZCB0byBjaG9vc2Ugc2tpbiwgY2hlY2sgdGhlIHByb3ZpZGVkIGNvbmZpZ1wiKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2tpbiA9IGF3YWl0IG9wdGlvbnMuaG9va3MuYWZ0ZXJTa2luU2VsZWN0ZWQoey4uLnNlbGVjdGVkU2tpbn0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgc2tpbjogc2VsZWN0ZWRTa2luXG4gICAgICAgICAgICAgICAgICAgIC8vICBza2luczogW3NlbGVjdGVkU2tpbl1cbiAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gey4uLm9wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLmhvb2tzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgY3JlYXRlUmVmQ29tcG9uZW50PFQ+KHJlZiwgY29tcG9uZW50Q29uZmlnLCB0aGlzLmNvbXBvbmVudHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY29ubmVjdCByZWZzIGFuZCBwcm9wcyBpbnNvZGUgY3JlYXRlUmVmQ29tcG9uZW50LCBlbHNld2hlcmUgaXRzIG5vdCByZWFsbHkgPFQ+XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2FkIGNvbXBvbmVudCBnb3QgYSBkZXRhY2hlZCByZWYuJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvKipcbiAgICAgICAgICpcbiAgICAgICAgICogY2hvb3NlIHNraW4gb24gcnVudGltZSAuLi5cbiAgICAgICAgICogICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZVxuICAgICAgICAgKi9cblxuICAgICAgICBsZXQgc2VsZWN0ZWRTa2luID0gYXdhaXQgdGhpcy5ydW5Ta2luU2VsZWN0b3IoY29tcG9uZW50Q29uZmlnLCBob29rcykhXG5cbiAgICAgICAgaWYgKCFzZWxlY3RlZFNraW4pIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uaG9va3M/LmFmdGVyU2tpblNlbGVjdGVkKSB7XG4gICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wb25lbnRMb2FkZXIgPSB0aGlzLmNvbXBvbmVudHNMb2FkZXJzLmZpbmQobG9hZGVyID0+IGxvYWRlci50eXBlID09PSBzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGUpO1xuXG4gICAgICAgIGlmICghY29tcG9uZW50TG9hZGVyKSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gbG9hZGVyIFwiJHtzZWxlY3RlZFNraW4ubG9hZGVyLnR5cGV9XCIgd2FzIGZvdW5kIGZvciBjb21wb25lbnRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vZm9yIGxvYWRlZCB3ZWJjb21wb25lbnQgbW9kdWxlcyB0byBmb2xsb3dpbmcgbGluZSBjcmVhdGVzIGEgcmFjZSBjb25kaXRpb24gd2l0aCB0aGUgaW5pdCBtZXNzYWdlIGZsb3dcbiAgICAgICAgbGV0IGNvbXBvbmVudCA9IGF3YWl0IGNvbXBvbmVudExvYWRlci5sb2FkKGNvbXBvbmVudENvbmZpZy50eXBlLCBzZWxlY3RlZFNraW4sIGNvbnRhaW5lciwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IHdoZW4gdGhpcyBpcyBub3QgdHJ1ZSA/XG4gICAgICAgIGlmICghY29tcG9uZW50LmlzSW5pdGlhdGVkKVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQucHVzaChjb21wb25lbnQpXG5cbiAgICAgICAgY29tcG9uZW50LmJpbmQoJ29uRGlzcG9zZScsICgpID0+IHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NvbXBvbmVudCBkaXNwb3NlJywgY29tcG9uZW50KTtcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IHRoaXMuY29tcG9uZW50cy5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMyaW5pdCA9IHRoaXMuY29tcG9uZW50czJpbml0LmZpbHRlcihjID0+IGMgIT09IGNvbXBvbmVudClcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudCk7XG5cbiAgICAgICAgLy8gdHJ1ZSBieSBkZWZhdWx0XG4gICAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLmNvbm5lY3RQcm9wcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2UgdHlwZSBmaWVsZCBjb25kaXRpb25hbCB0eXBlIGluZmVyIFwic3RyaW5nXCIgPiBzdHJpbmcsIFwibnVtYmVyXCIgPiBudW1iZXIsIGV0Yy4uLlxuICAgICAgICAgICAgY29tcG9uZW50ID0gY29ubmVjdFByb3BzKGNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLnR5cGUucHJvcHMsIHNlbGVjdGVkU2tpbik7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy9UT0RPIDogbWFrZSBvcHRpb25hbD9cbiAgICAgICAgICAgIC8vVE9ETyA6IGZpeCBpc3N1ZXMgd2l0aCB0aW1lb3V0IGFuZCB3cm9uZyByZWYgbmFtZXMgZnJvbSBjb25maWcgdnMgY3VycmVudCBza2luXG4gICAgICAgICAgICBhd2FpdCBjb25uZWN0UmVmcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAvLyBUT09EIDogdGhyb3cgP1xuICAgICAgICB9XG4gICAgICAgIGlmICghb3B0aW9ucz8uc2tpcEluaXQpXG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQuaW5pdGlhdGVkKCk7XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudCBhcyBUO1xuICAgIH1cblxuICAgIHB1YmxpYyBuYXZpZ2F0ZSA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgbmV3Q29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBvcHRpb25zPzogbmF2aWdhdGlvbk9wdGlvbnMpID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5wYXJlbnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTmF2aWdhdGluZyBvbiByZW1vdGUgcmVmIGNvbXBvbmVudHMgaXMgbm90IGltcGxlbWVudGVkIHlldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jb21wb25lbnQubWFya2VkRm9yRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGlmIChvcHRpb25zPy5pbnBsYWNlKSB7XG4gICAgICAgIC8vICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgLy8gICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgICAgIGF3YWl0IG5ld0NvbXBvbmVudC5pbml0aWF0ZWQoKTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICBpZiAob3B0aW9ucy5pbml0KVxuICAgICAgICAvLyAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy8gICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJy4uLicpXG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZiAob3B0aW9ucz8uc3RhZ2VkKSB7XG4gICAgICAgICAgICAvL2NvbnN0IHNlbGVjdGVkU2tpbiA9IHRoaXMucnVuU2tpblNlbGVjdG9yKG5ld0NvbXBvbmVudENvbmZpZylcbiAgICAgICAgICAgIGxldCBuZXdDb21wb25lbnQgPSBhd2FpdCB0aGlzLmxvYWRDb21wb25lbnQ8VD4obmV3Q29tcG9uZW50Q29uZmlnLCBjb21wb25lbnQuY29udGFpbmVyLCB7XG4gICAgICAgICAgICAgICAgaGlkZGVuOiB0cnVlLFxuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7ZGlyZWN0aW9uOiAnYWZ0ZXInLCBjaGlsZDogY29tcG9uZW50LmVsZW1lbnQhfSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgICAgICAgICBhd2FpdCBvcHRpb25zLmluaXQobmV3Q29tcG9uZW50KTtcblxuICAgICAgICAgICAgbmV3Q29tcG9uZW50LnNob3coKTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gbmV3Q29tcG9uZW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBjb21wb25lbnQuZWxlbWVudCEubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIGNvbXBvbmVudC5kaXNwb3NlKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlOiB7XG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogXCJiZWZvcmVcIixcbiAgICAgICAgICAgICAgICAgICAgY2hpbGQ6IG5leHRTaWJsaW5nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIG5hdmlnYXRpb25PcHRpb25zID0ge1xuICAgIHN0YWdlZD86IGJvb2xlYW4sXG4gICAgLy9pbnBsYWNlPzogYm9vbGVhbixcbiAgICBpbml0PzogKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IFByb21pc2U8dm9pZD5cbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbn0gJiBsb2FkZXJPcHRpb25zXG5cbnR5cGUgcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uID0gJ2JlZm9yZScgfCAnYWZ0ZXInO1xuXG5cbmV4cG9ydCB0eXBlIGxvYWRlckhvb2tzID0ge1xuICAgIGFmdGVyU2tpblNlbGVjdGVkPzogKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IFByb21pc2U8SVNraW5Db25maWc+XG59ICZcbiAgICAvLyBzZWdtZW50YXRpb24gaG9va3NcbiAgICAoeyBba2V5OiBzdHJpbmddOiAoKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbiB9IHwge30pXG5cbi8vVE9ETzogc3VwcG9ydCBzZXJpYWxpemFibGUgdmVyc2lvbiBvZiB0aGF0IG9iamVjdFxuZXhwb3J0IGludGVyZmFjZSByZWxhdGl2ZUxvYWRDb25maWcge1xuICAgIC8vSWYgdGhpcyBpcyBudWxsLCB0aGVuIG5ld05vZGUgaXMgaW5zZXJ0ZWQgYXQgdGhlIGVuZCBvZiBub2RlJ3MgY2hpbGQgbm9kZXMuXG4gICAgLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvTm9kZS9pbnNlcnRCZWZvcmVcbiAgICBjaGlsZDogQ2hpbGROb2RlIHwgbnVsbFxuICAgIGRpcmVjdGlvbjogcmVsYXRpdmVMb2FkQ29uZmlnRGlyZWN0aW9uXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVudmlyb25tZW50IHtcbiAgICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxudHlwZSBFbGVtZW50QXR0cmlidXRlcyA9IHtcbiAgICBba2V5OiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgbG9hZGVyT3B0aW9ucyB7XG4gICAgaWQ/OiBzdHJpbmdcbiAgICBoaWRkZW4/OiBib29sZWFuXG4gICAgY29ubmVjdFByb3BzPzogYm9vbGVhblxuICAgIHRpbWVvdXQ/OiBudW1iZXJcbiAgICBza2lwSW5pdD86IGJvb2xlYW5cbiAgICByZWxhdGl2ZT86IHJlbGF0aXZlTG9hZENvbmZpZ1xuICAgIGhvb2tzPzogbG9hZGVySG9va3NcbiAgICBlbGVtZW50QXR0cmlidXRlcz86IEVsZW1lbnRBdHRyaWJ1dGVzXG4gICAgX2Vudmlyb25tZW50PzogSUVudmlyb25tZW50XG4gICAgX2hhc1BhcmVudD86IGJvb2xlYW5cbiAgICBfaW5zcGVjdGlvbj86IGJvb2xlYW5cbiAgICBkYXRhPzogYW55XG4gICAgLyoqXG4gICAgICogQ29udHJvbCBpZnJhbWUgYXV0by1zaXppbmcgYmVoYXZpb3IuXG4gICAgICogLSB0cnVlIChkZWZhdWx0KTogaWZyYW1lIGF1dG8tc2l6ZXMgdG8gY29udGVudCBoZWlnaHQsIHdpZHRoIGZpbGxzIHBhcmVudC5cbiAgICAgKiAtIGZhbHNlOiBubyBzaXppbmcgbG9naWMgcnVucy4gTm8gb2JzZXJ2ZXJzLCBubyBtZWFzdXJlbWVudHMsIG5vIHN0eWxlIGNoYW5nZXMuXG4gICAgICogICBUaGUgaWZyYW1lIHN0YXlzIGF0IHBvc2l0aW9uOmFic29sdXRlIGZpbGxpbmcgdGhlIGNvbnRhaW5lci5cbiAgICAgKiAgIFRoZSBob3N0IGlzIGZ1bGx5IHJlc3BvbnNpYmxlIGZvciBjb250YWluZXIgZGltZW5zaW9ucy5cbiAgICAgKi9cbiAgICBhdXRvU2l6ZT86IGJvb2xlYW5cbn1cblxuaWYgKCF3aW5kb3cubXlvcCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICB9O1xufVxuXG5pZiAoIXdpbmRvdy5teW9wLmhvc3RTREspIHtcbiAgICBjb25zdCBfaG9zdFNESyA9IG5ldyBIb3N0U0RLKCk7XG4gICAgLy9UT0RPOiBlbmFibGUgbGF6eSBpbml0P1xuICAgIF9ob3N0U0RLLmluaXQoKTtcblxuICAgIGlmICghd2luZG93Lm15b3ApIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgICAgIH07XG4gICAgfVxuICAgIHdpbmRvdy5teW9wLmhvc3RTREsgPSBfaG9zdFNESztcbn1cblxuLy8gQHRzLWlnbm9yZVxuZXhwb3J0IGNvbnN0IGhvc3RTREs6IEhvc3RTREsgPSB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdob3N0U0RLJywgaG9zdFNESyk7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICAgICAgbXlvcDoge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX186IHN0cmluZyxcbiAgICAgICAgICAgIGhvc3RTREs6IEhvc3RTREssXG4gICAgICAgICAgICBJZnJhbWVTREs6IEluc3RhbmNlVHlwZTx0eXBlb2YgSWZyYW1lU0RLPlxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UudHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9UT0RPIDogdXNlIHJlZiBoZWxwZXIgaGVyZVxuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgaXQgdG8gcGFzcyB0aGUgYXNzaWduZWQgaWRzXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVmQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSByZWZDb21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKTtcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmV4cG9ydCBjb25zdCBvYnNlcnZlRE9NID0gKG9iajogSFRNTEVsZW1lbnQgfCBudWxsLCBjYWxsYmFjazogKG11dGF0aW9uUmVjb3Jkcz86IE11dGF0aW9uUmVjb3JkW10pID0+IHZvaWQpID0+IHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICBjb25zb2xlLmxvZygnbicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBpZiAoIW9iaiB8fCBvYmoubm9kZVR5cGUgIT09IDEpIHJldHVybjtcblxuICAgIGlmIChNdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICAgIC8vIGRlZmluZSBhIG5ldyBvYnNlcnZlclxuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spXG4gICAgICAgIC8vIGhhdmUgdGhlIG9ic2VydmVyIG9ic2VydmUgZm9yIGNoYW5nZXMgaW4gY2hpbGRyZW5cbiAgICAgICAgY29uc3QgY29uZmlnID0ge2F0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX07XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShvYmosIGNvbmZpZylcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uT2JzZXJ2ZXJcbiAgICB9XG5cbiAgICAvLyBicm93c2VyIHN1cHBvcnQgZmFsbGJhY2tcbiAgICBlbHNlIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgY2FsbGJhY2ssIGZhbHNlKVxuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgfVxufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge29ic2VydmVET019IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuc291cmNlKSB7XG4gICAgICAgICAgICBvYnNlcnZlRE9NKGRvY3VtZW50LmJvZHksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgICAgLy8gIG5ldyBFbnZlbG9wZWRNZXNzYWdlKGV2ZW50LnNvdXJjZSEsIG5ldyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSgpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZighZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSB8fCAhZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSB8fCBub2RlRGF0YS52YWx1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgZ2V0SW5wdXRWYWx1ZShpdGVtKVxuICAgICAgICAgICAgKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZU1lc3NhZ2UsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRGaXJzdEVsZW1lbnRCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxHZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEdldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGdldEZpcnN0RWxlbWVudEJ5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpXG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UoaXRlbS5nZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSkpLCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSZXNpemVPYnNlcnZlck1lc3NhZ2UsIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZX0gZnJvbSAnLi4vLi4vbWVzc2FnZXMnXG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRSZXNpemVPYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiBwYXNzIHRoZSBoZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldElubmVySHRtbCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiAqIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG4gKlxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7SWZyYW1lU0RLfSBmcm9tICdAbXlvcC9zZGsvaWZyYW1lJztcbiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtHZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZ2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRSZXNpemVPYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRSZXNpemVPYnNlcnZlckhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gVGhlIElmcmFtZSBTREsgaXMgaW50ZW5kZWQgZm9yIHNjZW5hcmlvcyB3aGVyZSBkZXZlbG9wZXJzIHdpc2ggdG8gaW1wbGVtZW50IE15b3AgY29tcG9uZW50cyBhcyBzZXBhcmF0ZSB3ZWIgYXBwbGljYXRpb25zIGhvc3RlZCB3aXRoaW4gaWZyYW1lcy48YnIvPjxici8+XG4gQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG5cbiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gYGBganNcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtnZXRJZnJhbWVNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSWZyYW1lU0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgcHVibGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgd2luZG93Lm15b3AgPSB7fVxuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLID0gdGhpcztcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICBjb25zdCBjb21wb25lbnRJZHMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbXBvbmVudHMpO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgaWYgKHJlcGxheVRvPy5yb3V0ZSkge1xuICAgICAgICAgICAgICAgIC8vIHRha2luZyB0aGUgZmlyc3QgY29tcG9uZW50IHRoYXQgaW5pdGlhdGVkIHRoYXQgY3ljbGVcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gcmVwbGF5VG8ucm91dGVbcmVwbGF5VG8ucm91dGUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSBjb21wb25lbnRJZHNbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2Uuc291cmNlKVxuICAgICAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSBjb21wb25lbnRJZHNbMF07XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG5cbiAgICAgICAgd2luZG93LnBhcmVudD8ucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4ubWVzc2FnZVxuICAgICAgICB9LCAnKicpO1xuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldFJlc2l6ZU9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuXG4gICAgICAgIC8vY29tcG9zaXRlIHN1cHBvcnQgbWVzc2FnZXMgOlxuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgd2luZG93Lm9ubWVzc2FnZSA9IHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMuYmluZCh0aGlzKVxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgfVxuXG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ0lmcmFtZVNESycsIElmcmFtZVNESyk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJPLElBQU0saUJBQU4sTUFBNEM7QUFBQSxFQUMvQyxZQUFtQixRQUNBLGFBQ0EsY0FDQSxXQUNBLFlBQXFCO0FBSnJCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJbkIsd0JBQWdCLFFBQWU7QUFBQSxFQUYvQjtBQUdKOzs7QUN6Qk8sSUFBTSxxQkFBcUIsQ0FBTyxTQUFrQztBQUN2RSxNQUFJLE9BQU8sU0FBUyxZQUFZO0FBRTVCLFNBQUs7QUFBQSxFQUNULFdBQVcsZ0JBQWdCLFNBQVM7QUFFaEMsVUFBTSxTQUFTLE1BQU07QUFFckIsUUFBSSxPQUFPLFdBQVcsWUFBWTtBQUU5QixhQUFPO0FBQUEs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QUFBLE1BQzFDLElBQUlDLHdCQUF1QixLQUFLLGFBQWE7QUFBQSxNQUM3QyxJQUFJLDJCQUEyQixLQUFLLGFBQWE7QUFBQSxNQUNqRCxJQUFJLHlCQUF5QixLQUFLLGFBQWE7QUFBQSxNQUMvQyxJQUFJLG9CQUFvQixLQUFLLGFBQWE7QUFBQTtBQUFBLE1BRzFDLElBQUlDLGtDQUFpQyxLQUFLLGFBQWE7QUFBQSxJQUMzRDtBQUVBLHdCQUFPLFFBQU8sTUFBTTtBQUNoQixhQUFPLFlBQVksS0FBSyxxQkFBcUIsS0FBSyxJQUFJO0FBQ3RELFdBQUssY0FBYyxJQUFJLFlBQVksQ0FBQztBQUFBLElBQ3hDO0FBcERJLFFBQUksQ0FBQyxPQUFPLE1BQU07QUFFZCxhQUFPLE9BQU8sQ0FBQztBQUFBLElBQ25CO0FBRUEsV0FBTyxLQUFLLFlBQVk7QUFBQSxFQUM1QjtBQWdESjtBQUVBLG9CQUFvQixhQUFhLFNBQVM7IiwKICAibmFtZXMiOiBbIlJlcGxheU1lc3NhZ2VLZXkiLCAibWF0Y2giLCAic2NyaXB0SW5wdXRzIiwgInNjcmlwdElucHV0cyIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJzZWVuIiwgInRhcmdldCIsICJtYWtlU2VyaWFsaXphYmxlIiwgImhlaWdodCIsICJ3aWR0aCIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJzZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgImhvc3RTREsiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiZWxlbWVudCIsICJDaGFuZ2VUZXh0SGFuZGxlciIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJzZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgIkV4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgInNlZW4iLCAic2RrIiwgImRvbUlkIiwgInNkayIsICJzZWVuIiwgInNraW4iLCAiY29tcG9uZW50IiwgInNlZ21lbnQiLCAiZXhwZXJpZW5jZSIsICJzZWxlY3RlZFNraW4iLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaG9zdFNESyIsICJNdXRhdGlvbk9ic2VydmVyIiwgImdldElucHV0VmFsdWUiLCAiZWxlbWVudCIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiU2V0SW5uZXJIdG1sSGFuZGxlciIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIl0KfQo=