@myop/sdk 0.1.45 → 0.1.46
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.
- package/README.md +1 -1
- package/dist/bundled-declarations.d.ts +9 -1
- package/dist/cjs/_IframeSDK.71663203.min.js +1 -0
- package/dist/cjs/{_IframeSDK.6e68e329.js → _IframeSDK.b1e6c181.js} +4 -6
- package/dist/cjs/_IframeSDK.b1e6c181.js.map +7 -0
- package/dist/cjs/_WebComponentSDK.3474ea7a.min.js +1 -0
- package/dist/cjs/{_WebComponentSDK.1f50ec03.js → _WebComponentSDK.bf4ad0dd.js} +4 -6
- package/dist/cjs/_WebComponentSDK.bf4ad0dd.js.map +7 -0
- package/dist/cjs/{_hostSDK.3215ab07.js → _hostSDK.7c59d1ae.js} +4 -6
- package/dist/cjs/_hostSDK.7c59d1ae.js.map +7 -0
- package/dist/cjs/_hostSDK.8b543e61.min.js +1 -0
- package/dist/cjs/myop_sdk.js +11 -11
- package/dist/cjs/myop_sdk.js.map +1 -1
- package/dist/cjs/myop_sdk.min.js +1 -1
- package/dist/module/Iframe/index.js +15 -19
- package/dist/module/Iframe/index.js.map +2 -2
- package/dist/module/SDK.js +15 -19
- package/dist/module/SDK.js.map +2 -2
- package/dist/module/common/index.d.ts +9 -1
- package/dist/module/common/index.js +3 -2
- package/dist/module/common/index.js.map +2 -2
- package/dist/module/host/index.js +15 -19
- package/dist/module/host/index.js.map +2 -2
- package/dist/module/webcomponent/index.js +15 -19
- package/dist/module/webcomponent/index.js.map +2 -2
- package/package.json +1 -1
- package/dist/cjs/_IframeSDK.1993fad2.min.js +0 -1
- package/dist/cjs/_IframeSDK.6e68e329.js.map +0 -7
- package/dist/cjs/_WebComponentSDK.1f50ec03.js.map +0 -7
- package/dist/cjs/_WebComponentSDK.c0dcea75.min.js +0 -1
- package/dist/cjs/_hostSDK.3215ab07.js.map +0 -7
- package/dist/cjs/_hostSDK.f697667b.min.js +0 -1
package/dist/module/SDK.js
CHANGED
|
@@ -68,7 +68,7 @@ var init_defineDynamicImport = __esm({
|
|
|
68
68
|
var myop_sdk_version_default;
|
|
69
69
|
var init_myop_sdk_version = __esm({
|
|
70
70
|
"version:myop-sdk-version"() {
|
|
71
|
-
myop_sdk_version_default = "0.1.
|
|
71
|
+
myop_sdk_version_default = "0.1.46";
|
|
72
72
|
}
|
|
73
73
|
});
|
|
74
74
|
|
|
@@ -1112,7 +1112,8 @@ var init_common = __esm({
|
|
|
1112
1112
|
SkinLoaders = {
|
|
1113
1113
|
"IframeLoader": "IframeLoader",
|
|
1114
1114
|
"WebComponentLoader": "WebComponentLoader",
|
|
1115
|
-
"HTMLLoader": "HTMLLoader"
|
|
1115
|
+
"HTMLLoader": "HTMLLoader",
|
|
1116
|
+
"MinimizedLoader": "MinimizedLoader"
|
|
1116
1117
|
};
|
|
1117
1118
|
ShadowRootModeType = {
|
|
1118
1119
|
"open": "open",
|
|
@@ -2610,22 +2611,17 @@ var init_HTMLComponentLoader = __esm({
|
|
|
2610
2611
|
doc.writeln(HTML2Render);
|
|
2611
2612
|
doc.writeln(`<script src="${window.myop.__ROOT_SDK_PUBLIC_URL__}"><\/script>
|
|
2612
2613
|
<script>
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
|
|
2621
|
-
|
|
2622
|
-
|
|
2623
|
-
|
|
2624
|
-
const {IframeSDK} = (await window.myop.rootSDK.getIframeModule());
|
|
2625
|
-
const sdk = new IframeSDK()
|
|
2626
|
-
sdk.init();
|
|
2627
|
-
}
|
|
2628
|
-
__myop_init().then();
|
|
2614
|
+
|
|
2615
|
+
window.__federation__.__public_path__ = window.__federation__.__public_path__;
|
|
2616
|
+
|
|
2617
|
+
const __myop_init = async () => {
|
|
2618
|
+
const {IframeSDK} = (await window.myop.rootSDK.getIframeModule());
|
|
2619
|
+
const sdk = new IframeSDK()
|
|
2620
|
+
sdk.init();
|
|
2621
|
+
}
|
|
2622
|
+
|
|
2623
|
+
__myop_init().then();
|
|
2624
|
+
|
|
2629
2625
|
<\/script>`);
|
|
2630
2626
|
doc.close();
|
|
2631
2627
|
const comp = new MyopIframeComponent(componentDefinition, skin, container, IframeElement, options);
|
|
@@ -4021,4 +4017,4 @@ export {
|
|
|
4021
4017
|
getIframeModule,
|
|
4022
4018
|
getWebcomponentModule
|
|
4023
4019
|
};
|
|
4024
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL0Jhc2VNeW9wU0RLLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vaW5kZXgudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvZ01lc3NhZ2VzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbnN0cy50cyIsICIuLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvZXhlYy50cyIsICIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyIsICIuLi8uLi9zcmMvaG9zdC9teW9wT3ZlcnJpZGUudHMiLCAiLi4vLi4vc3JjL2hvc3QvaG9zdFNESy50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvSWZyYW1lU0RLLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvTXlvcEhlbHBlcnMudHMiLCAiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvbG9hZF9fZmVkZXJhdGlvbl9fLnRzIiwgIi4uLy4uL3NyYy9TREsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAiZXhwb3J0IGRlZmF1bHQgJzAuMS40NSc7IiwgInR5cGUgU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxUPiA9IFQgfCAoc3RyaW5nICYgUmVjb3JkPG5ldmVyLCBuZXZlcj4pO1xuXG5leHBvcnQgdHlwZSBNeW9wTWVzc2FnZUtleSA9IFN0cmluZ1dpdGhBdXRvY29tcGxldGU8a2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcyB8IGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMuSW4+O1xuXG5leHBvcnQgY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC8vaG9zdCB0byBjb21wb25lbnRcbiAgICAnSW5pdFJlcXVlc3QnOiAnSW5pdFJlcXVlc3QnLFxuICAgICdJbml0UmVzcG9uc2UnOiAnSW5pdFJlc3BvbnNlJyxcbiAgICAnSW5pdE1lc3NhZ2UnOiAnSW5pdE1lc3NhZ2UnLFxuICAgICdEaXNwb3NlTWVzc2FnZSc6ICdEaXNwb3NlTWVzc2FnZScsXG5cbiAgICAnQ2hhbmdlVGV4dE1lc3NhZ2UnOiAnQ2hhbmdlVGV4dE1lc3NhZ2UnLFxuICAgICdCaW5kQ2xpY2tNZXNzYWdlJzogJ0JpbmRDbGlja01lc3NhZ2UnLFxuICAgICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJyxcblxuICAgICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0TWVzc2FnZScsXG5cbiAgICAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnOiAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnLFxuICAgICdTZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnOiAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZScsXG4gICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc6ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJyxcbiAgICAnR2V0QXR0cmlidXRlTWVzc2FnZSc6ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdTZXRJbm5lckh0bWwnOiAnU2V0SW5uZXJIdG1sJyxcblxuICAgIC8vY29tcG9uZW50IG1lc3NhZ2VzXG4gICAgJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnOiAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCcsXG4gICAgJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZScsXG5cbiAgICAnQ2xlYW51cE1lc3NhZ2UnOiAnQ2xlYW51cE1lc3NhZ2UnLFxuXG4gICAgLy8gZXh0ZXJuYWwgdG8gaG9zdCA6XG4gICAgSW46IHtcbiAgICAgICAgJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJyxcbiAgICAgICAgJ0NsaWNrUmVwbGF5TWVzc2FnZSc6ICdDbGlja1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJyxcblxuICAgICAgICAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSc6ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJyxcbiAgICAgICAgJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnOiAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZScsXG5cbiAgICAgICAgXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCI6IFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiLFxuICAgICAgICAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnOiAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnLFxuICAgICAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICAgICAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICAgICAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnOiAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSdcbiAgICB9XG59XG4iLCAiLy9UT0RPIDogcmV1c2UgZnJvbSBvbmUgcGxhY2UuXG4vLyBuZWVkcyB0byBiZSB1c2VkIGluIG15b3Atc2RrLCBteW9wLWRhc2hiYW9yZCwgbXlvcC1zZXJ2ZXIsIG15b3AtY2xpIC4uXG5cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxuICAgICAgICAoK2MgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+ICtjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuLy8gQ29udmVydCBVVUlEIHN0cmluZyB0byBieXRlc1xuZXhwb3J0IGNvbnN0IHV1aWRUb0J5dGVzID0gKHV1aWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIHV1aWQucmVwbGFjZSgvLS9nLCAnJykubWF0Y2goLy57MSwyfS9nKSEubWFwKGJ5dGUgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKVxuICAgICk7XG59O1xuXG4vLyBDb252ZXJ0IGJ5dGVzIHRvIFVVSUQgc3RyaW5nXG5leHBvcnQgY29uc3QgYnl0ZXNUb1V1aWQgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGhleCA9IFsuLi5ieXRlc10ubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaGV4LnNsaWNlKDAsIDgpLFxuICAgICAgICBoZXguc2xpY2UoOCwgMTIpLFxuICAgICAgICBoZXguc2xpY2UoMTIsIDE2KSxcbiAgICAgICAgaGV4LnNsaWNlKDE2LCAyMCksXG4gICAgICAgIGhleC5zbGljZSgyMClcbiAgICBdLmpvaW4oJy0nKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBlbmNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxFbmNvZGUgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpO1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGRlY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybERlY29kZSA9IChzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGxldCBiYXNlNjQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoYmFzZTY0Lmxlbmd0aCAlIDQpIGJhc2U2NCArPSAnPSc7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluYXJ5LCBjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG59O1xuXG4vLyBDb21wcmVzcyBhbiBhcnJheSBvZiBVVUlEcyBpbnRvIGEgc2hvcnQgVVJMLXNhZmUgc3RyaW5nXG5leHBvcnQgY29uc3QgY29tcHJlc3NVVUlEcyA9ICh1dWlkczogc3RyaW5nW10pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGFsbEJ5dGVzID0gdXVpZHMuZmxhdE1hcCh1dWlkID0+IEFycmF5LmZyb20odXVpZFRvQnl0ZXModXVpZCkpKTtcbiAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGFsbEJ5dGVzKSk7XG59O1xuXG4vLyBEZWNvbXByZXNzIGZyb20gVVJMLXNhZmUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkgb2YgVVVJRHNcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzVVVJRHMgPSAoZW5jb2RlZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKGVuY29kZWQpO1xuICAgIGlmIChieXRlcy5sZW5ndGggJSAxNiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGxlbmd0aCcpO1xuXG4gICAgY29uc3QgdXVpZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdXVpZHMucHVzaChieXRlc1RvVXVpZChieXRlcy5zbGljZShpLCBpICsgMTYpKSk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkcztcbn07XG4iLCAiZXhwb3J0ICogZnJvbSAnLi91dWlkLnRzJ1xuXG5leHBvcnQgY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7SVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZURpcmVjdGlvbiB7XG4gICAgc3RhdGljIGRvd24gPSAnZG93bicgYXMgY29uc3RcbiAgICBzdGF0aWMgdXAgPSAndXAnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VEaXJlY3Rpb25PcHRpb24gPSAndXAnIHwgJ2Rvd24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BNZXNzYWdlPFQgPSBhbnk+IHtcbiAgICBpZCA9IHV1aWR2NCgpXG5cbiAgICBzdGF0aWMgY3JlYXRlPFQsIFUgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPikgPT4gVCA9IHR5cGVvZiB0aGlzPihcbiAgICAgICAgdGhpczogVSxcbiAgICAgICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+XG4gICAgKTogSW5zdGFuY2VUeXBlPHR5cGVvZiB0aGlzPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZWVzYWdlIGlkIGNyZWF0ZWQnLCB0aGlzLmlkLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICB9XG5cbiAgICBteW9wID0gdHJ1ZVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5IHwgc3RyaW5nO1xuXG4gICAgY29udGVudD86IFRcblxuICAgIC8vIFRPRE8gOiBjYW50IGJlIG9wdGlvbmFsIFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nXG5cbiAgICByb3V0ZT86IHN0cmluZ1tdXG5cbiAgICByZWY/OiBSZWZcblxuICAgIGRpcmVjdGlvbj86IE1lc3NhZ2VEaXJlY3Rpb25PcHRpb25cblxuICAgIGNsZWFuYWJsZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEVsZW1lbnRNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcj86IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kTWVzc2FnZTxUID0gYW55LCBSIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleTtcblxuICAgIHB1YmxpYyBoYW5kbGVyVW5pcXVlSWQgPSB1dWlkdjQoKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBSKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWYge1xuICAgIHB1YmxpYyBteW9wID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBfX25vblByb3hpZWQ/OiBSZWY7XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNlbGVjdG9yOiBzdHJpbmcsIHJlZkNvbmZpZz86IElSZWZDb25maWcsIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIGxldCBfcmVmQ29uZmlnID0gcmVmQ29uZmlnO1xuICAgICAgICBpZiAoIV9yZWZDb25maWcpIHtcbiAgICAgICAgICAgIF9yZWZDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElSZWZDb25maWdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZihfcmVmQ29uZmlnLCBjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsIHB1YmxpYyBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9fbm9uUHJveGllZCA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBjb21wb25lbnQ6IG51bGwgLy8gaW4gb3JkZXIgdG8gYmUgc2VyaWFsaXphYmxlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGlja1JlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBCaW5kQ2xpY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsaWNrUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQmluZENsaWNrTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IENsaWNrUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGlja1JlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gdGV4dFxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSdcblxuY29uc3QgZnVuY3Rpb25Cb2R5UmVnZXggPSAvKD86ZnVuY3Rpb25cXHMqXFx3KlxccypcXChbXildKlxcKVxccypcXHsoW1xcc1xcU10qPylcXH18KFxcKFteKV0qXFwpXFxzKj0+XFxzKlxceyhbXFxzXFxTXSo/KVxcfSkpXFxzKiQvO1xuY29uc3QgZXhwcmVzc2lvbkJvZHlSZWdleCA9IC9cXChcXHMqW14pXStcXHMqXFwpXFxzKj0+XFxzKiguKykvO1xuXG5leHBvcnQgY29uc3Qgc3RyaXBGdW5jdGlvbiA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZ1bmN0aW9uQm9keVJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdIHx8IG1hdGNoWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZXhwcmVzc2lvbkJvZHlSZWdleCk7XG4gICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXS50cmltKCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBzY3JpcHRJbnB1dHMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxufSB8IHt9O1xuXG5leHBvcnQgdHlwZSBzY3JpcHRWYXJzPFQ+ID0ge1xuICAgIHNlbmQ6IChkYXRhOiBUKSA9PiB2b2lkO1xuICAgIC8vIGNvbXBsZXRlU3RyZWFtOiAoKSA9PiB2b2lkO1xuICAgIHJvb3RSZWY6IFJvb3RSZWY7XG4gICAgbWFrZVNlcmlhbGl6YWJsZTogdHlwZW9mIG1ha2VTZXJpYWxpemFibGVcbn1cblxuZXhwb3J0IHR5cGUgZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+ID0ge1xuICAgIFtLIGluIGtleW9mIEldOiBJW0tdO1xufSAmIHNjcmlwdFZhcnM8VD5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHN0cmluZywgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPj4ge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuICAgIHNjcmlwdDogc3RyaW5nID0gJydcblxuICAgIHN0YXRpYyByZXBsaWVyS2V5ID0gJ3NlbmQnO1xuICAgIHN0YXRpYyBjb21wbGV0ZVN0cmVhbUtleSA9ICdjb21wbGV0ZVN0cmVhbSc7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4pID0+IFQsIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIH0sIHB1YmxpYyBzY3JpcHRJbnB1dHM/OiBJKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdC50b1N0cmluZygpO1xuXG4gICAgICAgIC8vVE9ETzogY2FuIGJlIHJlbW92ZVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzdHJpcEZ1bmN0aW9uKHRoaXMuY29udGVudCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBjb250ZW50OiBUKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsXG4gICAgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSxcbiAgICBleHRlbmRlZFNjcmlwdFZhcnMsXG4gICAgc2NyaXB0SW5wdXRzLCBzdHJpcEZ1bmN0aW9uXG59IGZyb20gXCIuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVJlZlNjcmlwdElucHV0cyA9IHtcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICByZWY/OiBIVE1MRWxlbWVudCxcbiAgICBfc2NyaXB0Pzogc3RyaW5nLFxuICAgIF9fc2NyaXB0SW5wdXRzPzogT2JqZWN0XG59O1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVmTWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiBleHRlbmRzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IHtcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPikgPT4gVCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgc2NyaXB0SW5wdXRzOiBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH0pIHtcblxuICAgICAgICAvL21vY2sgdmFyc1xuICAgICAgICAvLyBsZXQgcm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0cztcbiAgICAgICAgc3VwZXIoKHtyb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3JBbGwoYFskeydteW9wLWlkJ309JyR7ZWxlbWVudElkfSddYCk7XG4gICAgICAgICAgICBpZiAocmVmcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyAgY29uc3QgcmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IGV4cG9zaW5nIFwicmVmc1wiIGFuZCBub3Qgb25seSBcInJlZlwiXG4gICAgICAgICAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgdGhlIFJlZiBoYXMgbXVsdGlwbGF0ZSBpbXBsZW1lbnRhdGlvbnNcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBfX3NjcmlwdElucHV0cy5yZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7X3NjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL3JldHVybiBGdW5jdGlvbigncmVmJywgJ3Jvb3RSZWYnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIF9zY3JpcHQhKShyZWYsIHJvb3RSZWYsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgVDtcbiAgICAgICAgfSwgaGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5zY3JpcHRJbnB1dHMgPSB7XG4gICAgICAgICAgICAuLi5zY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAvL19zY3JpcHQ6IHN0cmlwRnVuY3Rpb24oc2NyaXB0LnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgX3NjcmlwdDogc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlLCBTZXJpYWxpemFibGVTa2VsZXRvbn0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPFQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwID0ga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcD4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2Uge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+ID0gZmFsc2UgLy8ge30gLy8gZW1wdHlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIHR5cGU6IFQsIHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKVxuICAgIH1cblxuICAgIHdpdGhTZXJpYWxpemFibGVTa2VsZXRvbihzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4pIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemFibGVTa2VsZXRvbiA9IHNlcmlhbGl6YWJsZVNrZWxldG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBlOiBTZXJpYWxpemFibGU8RXZlbnQ+KSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHtcbiAgICAgICAgICAgIGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmLH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuXG5leHBvcnQgY2xhc3MgU2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvcm1EYXRhRW50cnkgPSB7XG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICB2YWx1ZT86IElucHV0RWxlbWVudFZhbHVlLFxuICAgIHJlcXVpcmVkPzogYm9vbGVhbixcbiAgICB2YWxpZGl0eT86IFNlcmlhbGl6YWJsZTxWYWxpZGl0eVN0YXRlPixcbiAgICBteW9wSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50Rm9ybVZhbHVlID0ge1xuICAgIGZvcm1EYXRhPzogeyBba2V5OiBzdHJpbmddOiBGb3JtRGF0YUVudHJ5IH1cbiAgICB1bm1hcHBlZERhdGE/OiBGb3JtRGF0YUVudHJ5W11cbn07XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudFZhbHVlID0gc3RyaW5nIHwgSW5wdXRFbGVtZW50Rm9ybVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuXG5leHBvcnQgY2xhc3MgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogSW5wdXRFbGVtZW50VmFsdWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZS50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0SW5uZXJIdG1sJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaW5uZXJIdG1sOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gaW5uZXJIdG1sXG4gICAgfVxufSIsICJpbXBvcnQgeyBCYXNlTXlvcE1lc3NhZ2UgfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG4vLyBzZW50IGJ5IGhvc3QgdG8gY29tcG9uZW50cywgY29udGFpbnMgdGhpZXIgaWQgXG5leHBvcnQgY2xhc3MgSW5pdE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8eyBpZDogc3RyaW5nIH0+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0geyBpZCB9XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuLy8gY29tcG9uZW50IG5vdGlmeSBob3N0IHRoZSBpdCB3YXMgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlc3BvbnNlIGV4dGVuZHMgSW5pdE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXNwb25zZSc7XG59XG5cbi8vIGNvbXBvbmVudCBhc2sgdG8gaG9zdCB0byBnZXQgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlcXVlc3QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXF1ZXN0Jztcbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudENvbmZpZywgSVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdC9ob3N0U0RLLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb3B0aW9uczogbG9hZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UpID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXN0ZWRSZWYgPSB7XG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBuZXN0ZWRSZWZzOiBOZXN0ZWRSZWZbXSwgcHVibGljIGZhaWxlZD86IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnZlbG9wZWRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFbnZlbG9wZWRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkZXN0aW5hdGlvbjogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5uZXJFbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucm91dGUgPSBbZGVzdGluYXRpb24sIC4uLmlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA/IGlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA6IFtdXTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJRWxlbWVudFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPGFueSwgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnXG4gICAgcmVwbHlNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbn1cblxuZXhwb3J0IGNsYXNzIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPElFbGVtZW50UmVmW10+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgbXlvcEVsZW1lbnRSZWZzOiBJRWxlbWVudFJlZltdKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250ZW50ID0gbXlvcEVsZW1lbnRSZWZzO1xuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlPGFueT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0dldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxudHlwZSBNZXRob2ROYW1lczxUPiA9IHtcbiAgICAvLyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gSyA6IG5ldmVyO1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKCkgPT4gdm9pZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbi8vIERlZmluZSBhIHR5cGUgdGhhdCBhbGxvd3Mgb25seSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ldGhvZCBuYW1lcyBvZiBUXG50eXBlIE1ldGhvZFN0cmluZzxUPiA9IE1ldGhvZE5hbWVzPFQ+IGV4dGVuZHMgaW5mZXIgTSA/IE0gZXh0ZW5kcyBzdHJpbmcgPyBNIDogbmV2ZXIgOiBuZXZlcjtcblxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWV0aG9kOiBNZXRob2RTdHJpbmc8SU15b3BDb21wb25lbnQ+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGVhbnVwUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENsZWFudXBNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsZWFudXBSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDbGVhbnVwTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2xlYW51cEZvck1lc3NhZ2VJZDogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYW51cFJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbUNsZWFudXA6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGlzcG9zZU1lc3NhZ2UnO1xufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufSIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5LCBNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBEaXNwb3NlTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCwgTWVzc2FnZURpcmVjdGlvbixcbiAgICBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNESywgbG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuLy9UT0RPIDogY2hhbmdlIElNeW9wQ29tcG9uZW50IHRvIHJlZiBzcGVjaWZpYyBpbXBsXG50eXBlIFJlZlR5cGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IElNeW9wQ29tcG9uZW50IHwgUmVmXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgPSBhbnk+IHtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbjtcblxuICAgIG1hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuO1xuXG4gICAgc2V0SW5pdGlhdGVkOiAoKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gICAgLy9yZWYgY29tcG9uZW50cyBjYW4gYmUgZWxlbWVudC1sZXNzXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBzZW5kOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IENsZWFudXBIYW5kbGVyXG5cbiAgICBiaW5kKG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBiaW5kPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgLy8gYm9vbGVhbiByZXR1cm5lZCB2YWx1ZSA9IGhhbmRsZWQgb3Igbm90XG4gICAgb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gYm9vbGVhblxuXG4gICAgaW5pdGlhdGVkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBkaXNwb3NlOiAoKSA9PiB2b2lkXG5cbiAgICBoaWRlKCk6IHZvaWQ7XG5cbiAgICBzaG93KCk6IHZvaWQ7XG5cbiAgICBpbnNwZWN0KCk6IHZvaWQ7XG5cbiAgICBwYXJlbnQ/OiBJTXlvcENvbXBvbmVudDtcblxuICAgIHByb3BzOiBQXG5cbiAgICByZWZzOiBSXG59XG5cbmZ1bmN0aW9uIGlzSW5oZXJpdEZyb20ob2JqOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gYmFzZUNsYXNzLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luaGVyaXRGcm9tKHByb3RvLCBiYXNlQ2xhc3MpO1xufVxuXG4vLyBUT0RPIDogbW92ZSA6IFxudHlwZSBtZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiBib29sZWFuO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiBleHRlbmRzIFJlZlR5cGVzID0gUmVmVHlwZXM+IGltcGxlbWVudHMgSU15b3BDb21wb25lbnQ8UD4ge1xuICAgIGlkOiBzdHJpbmcgPSAnJ1xuXG4gICAgbWVzc2FnZUhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBtZXNzYWdlSGFuZGxlcjxhbnk+W10+ID0ge307XG5cbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgfHwgSG9zdFNESy5JbnN0YW5jZSgpLmFzc2lnbklkKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/IG9wdGlvbnM/LnRpbWVvdXQgOiA1ICogMTAwMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQgJiYgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCAmJiAhdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGB0aW1lb3V0XyR7dGltZW91dH0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAvLyBUT0RPIDogYXV0byBpbnNwZWN0LCBjb250cm9sIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAod2luZG93Lm15b3AuaG9zdFNESy5pbnNwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2Ugc2RrLmxvZ2dlclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlzcG9zaW5nIGJlZm9yZSBpc0luaXRpYXRlZCcsIHRoaXMuaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICBjb25zdCBvbkRpc3Bvc2VIYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzWydvbkRpc3Bvc2UnXVxuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgcnVuRXhlY3V0b3JDbGVhbnVwfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL2Jhc2VNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSwgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgRW52ZWxvcGVkTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgSG9zdGVkQ29tcG9uZW50PFQgPSBhbnk+IHtcbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgIH1cblxuICAgIC8vb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IElNeW9wTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY29udGV4dD86IFQpIHtcblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcFNESyB7XG4gICAgaW5pdDogKCkgPT4gdm9pZDtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlczogKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50Pjtcbn1cblxuLy8gY29uc3QgbG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzID0gW1xuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCxcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlLFxuLy8gICAgIC8vTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UsXG4vLyBdXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcFNESyBpbXBsZW1lbnRzIElNeW9wU0RLIHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgbWVzc2FnZVRvSGFuZGxlQWZ0ZXJJbml0OiBCYXNlTXlvcE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PiA9IHt9O1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBtZXNzYWdlQ2xlYW51cENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+PiB8IFByb21pc2U8dm9pZD4gPSB7fTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZXZlbnQuZGF0YSA/IGV2ZW50LmRhdGEgOiBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAvLyBub3QgbXlvcCBtYXJrZWQgZXZlbnQgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGJhc2VTREssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiAobG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgICAgLy9UT0RPIDogZml4IGRpcmVjdGlvbiA/IG1lc3NhZ2Ugd2lsbCBub3QgcHJvY2Nlc3Mgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkRpc3Bvc2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNob3VsZCBub3QgYmUgb3B0aW9uYWwsIGZpeCBhbmQgcmVtb3ZlICdpZidcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uXVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgZ290IG91ciBpZCBmcm9tIG91ciBob3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogU0RLIG1heSBzZXJ2ZSBtb3JlIHRoYW4gMSBjb21wb25lbnQgLi4gdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJyZWNoaXZlZCBpbml0IG1lc3NhZ2UgZm9yIGFuIGV4c2lzaW5nIGNvbXBvbmVudC5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0gPSBuZXcgSG9zdGVkQ29tcG9uZW50KG5ld0NvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlc3BvbnNlKG5ld0NvbXBvbmVudElkKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb3Igc2FtZSBIb3N0U0RLIGNhc2VzXG4gICAgICAgICAgICAvLyB3aGVuIGJvdGggUmVmQ29tcG9uZW50IGFuZCByZWFsQ29tcG9uZW50IGhvc3RlZCBpbiB0aGUgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJNZXNzYWdlID0gZW52ZWxvcGVkTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbm5lck1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0IHx8IHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBpbm5lck1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZW52ZWxvcGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2Upe1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG4gICAgICAgICAgICAvLyAvLyAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNsZWFudXBNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ2xlYW51cE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBNZXNzYWdlID0gbmV3IENsZWFudXBSZXBsYXlNZXNzYWdlKCEhY2xlYW51cCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBNZXNzYWdlLmRlc3RpbmF0aW9uID0gbWVzc2FnZS5kZXN0aW5hdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkV4ZWN1dG9yQ2xlYW51cChjbGVhbnVwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGVsIGVycm9yP1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkhhbmRsZXJGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5tZXNzYWdlVHlwZSA9PT0gbWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uSGFuZGxlckZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSBoYW5kbGVyLmV4ZWN1dG9yKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUgJiYgY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVttZXNzYWdlLmlkXSA9IGNsZWFudXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwICYmICFtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3Igbm9uLWNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGVhbnVwICYmIG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBhIGNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbkhhbmRsZXJGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBwcmludCB3aXRoIGRlYnVnIGNvbmZpZyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIG1lc3NhZ2UgaGFuZGxlciB3YXMgZm91bmQgZm9yICcsIG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFic3RyYWN0IGluaXQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCAqIGZyb20gJy4vTXlvcEVsZW1lbnRSZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlTWVzc2FnZUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNlTXlvcFNESyc7XG5cbmV4cG9ydCB0eXBlIENsZWFudXBIYW5kbGVyID0gKCkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5PFQ+ID0geyBba2V5OiBzdHJpbmddOiBUOyB9O1xuXG4vL2V4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0gJ0lmcmFtZUxvYWRlcicgfCAnV2ViQ29tcG9uZW50TG9hZGVyJyB8ICdIVE1MTG9hZGVyJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNraW5Mb2FkZXJzID0ge1xuICAgIFwiSWZyYW1lTG9hZGVyXCI6IFwiSWZyYW1lTG9hZGVyXCIsXG4gICAgXCJXZWJDb21wb25lbnRMb2FkZXJcIjogXCJXZWJDb21wb25lbnRMb2FkZXJcIixcbiAgICBcIkhUTUxMb2FkZXJcIjogXCJIVE1MTG9hZGVyXCJcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBTa2luTG9hZGVyVHlwZSA9IGtleW9mIHR5cGVvZiBTa2luTG9hZGVycztcblxuZXhwb3J0IHR5cGUgUHJvcFR5cGUgPSAnYW55JyB8ICdzdHJpbmcnIHwgJ251bWJlcicgfCBzdHJpbmc7IC8vIFRPRE8gOiA8XG5leHBvcnQgdHlwZSBSZWZTZWxlY3RvclR5cGUgPSAnaWQtYXR0cmlidXRlJyB8ICdjc3Mtc2VsZWN0b3InIHwgJ3hwYXRoJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IExvYWRlckZyYW1ld29ya3MgPSB7XG4gICAgXCJyZWFjdFwiOiBcInJlYWN0XCIsXG4gICAgXCJ2dWVcIjogXCJ2dWVcIixcbiAgICBcImFuZ3VsYXJcIjogXCJhbmd1bGFyXCIsXG59IGFzIGNvbnN0XG5leHBvcnQgdHlwZSBMb2FkZXJGcmFtZXdvcmtUeXBlID0ga2V5b2YgdHlwZW9mIExvYWRlckZyYW1ld29ya3M7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIldlYkNvbXBvbmVudExvYWRlclwiO1xuICAgIHVybDogc3RyaW5nLFxuICAgIHRhZzogc3RyaW5nLFxuICAgIGZyYW1ld29yaz86IExvYWRlckZyYW1ld29ya1R5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSWZyYW1lTG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiSWZyYW1lTG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmdcbiAgICBhdXRvSGVpZ2h0OiBib29sZWFuXG4gICAgaGVpZ2h0Pzogc3RyaW5nXG4gICAgd2lkdGg/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNoYWRvd1Jvb3RNb2RlVHlwZSA9IHtcbiAgICBcIm9wZW5cIjogXCJvcGVuXCIsXG4gICAgXCJjbG9zZWRcIjogXCJjbG9zZWRcIixcbiAgICBcIm5vbmVcIjogXCJub25lXCIsXG4gICAgXCJsb2NhbEZyYW1lXCI6IFwibG9jYWxGcmFtZVwiXG59IGFzIGNvbnN0O1xuXG5cbmV4cG9ydCBpbnRlcmZhY2UgSUhUTUxMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJIVE1MTG9hZGVyXCI7XG4gICAgSFRNTDogc3RyaW5nO1xuICAgIC8vVE9ETzogcmVuYW1lKHJvb3RNb2RlL2N1c3RvbUVsZW1lbnRNb2RlKSArIGRiIG1pZ3JhdGlvblxuICAgIHNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZTtcbiAgICBhdXRvSGVpZ2h0PzogYm9vbGVhbjtcbiAgICBoZWlnaHQ/OiBzdHJpbmc7XG4gICAgd2lkdGg/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBEYXNoYm9hcmRPYmplY3Qge1xuICAgIF90ZW1wX2NsaWVudF9pZD86IHN0cmluZyxcbn1cblxudHlwZSBFeHRlbmQ8VCwgVT4gPSBUICYgVTtcblxudHlwZSBFeHRlbmRSZWN1cnNpdmVseTxULCBFPiA9IHtcbiAgICBbSyBpbiBrZXlvZiBFXTogRVtLXTtcbn0gJiB7XG4gICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBvYmplY3RcbiAgICAgICAgPyBFeHRlbmRSZWN1cnNpdmVseTxUW0tdLCBFPlxuICAgICAgICA6IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBJRGFzaGJvYXJkPFQ+ID0gRXh0ZW5kUmVjdXJzaXZlbHk8VCwgRGFzaGJvYXJkT2JqZWN0PjtcblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGVcblxuICAgIFtrZXk6IHN0cmluZ106IGFueTsgLy8gQWxsb3dzIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSU1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUJpbmRNZXNzYWdlUHJvcENvbmZpZyBleHRlbmRzIElQcm9wQ29uZmlnIHtcbiAgICB0eXBlOiBQcm9wVHlwZVxuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxufVxuXG5leHBvcnQgY29uc3QgUHJvcE1lc3NhZ2VNb2RlcyA9IHtcbiAgICBcImlucHV0XCI6IFwiaW5wdXRcIixcbiAgICBcIm91dHB1dFwiOiBcIm91dHB1dFwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMgPSB7XG4gICAgXCJtZXNzYWdlXCI6IFwibWVzc2FnZVwiLFxuICAgIFwiY29kZVwiOiBcImNvZGVcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtIHtcbiAgICB2YWx1ZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BCZWhhdmlvciB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFByb3BDb25maWdCZWhhdmlvclR5cGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb2RlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcImNvZGVcIlxuICAgIHJlbWFwPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BNZXNzYWdlQmVoYXZpb3IgZXh0ZW5kcyBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBcIm1lc3NhZ2VcIlxuICAgIG1lc3NhZ2U6IE15b3BNZXNzYWdlS2V5XG4gICAgcmVmOiBzdHJpbmcsIC8vVE9ETyBtYWtlIGl0IGlkXG4gICAgcGFyYW1zOiBJUHJvcE1lc3NhZ2VCZWhhdmlvclBhcmFtW11cbiAgICBtb2RlOiBrZXlvZiB0eXBlb2YgUHJvcE1lc3NhZ2VNb2Rlc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgYmVoYXZpb3I6IElQcm9wQmVoYXZpb3Jcbn1cblxuXG5leHBvcnQgY2xhc3MgUmVmQmVoYXZpb3JUeXBlIHtcbiAgICBzdGF0aWMgY29kZSA9ICdjb2RlJyBhcyBjb25zdFxuICAgIHN0YXRpYyBjb21wb25lbnQgPSAnY29tcG9uZW50JyBhcyBjb25zdFxufVxuXG5leHBvcnQgdHlwZSBJUmVmQmVoYXZpb3JUeXBlID0gJ2NvZGUnIHwgJ2NvbXBvbmVudCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiBJUmVmQmVoYXZpb3JUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudFJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29tcG9uZW50J1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICogUHJvcGVydHkgaW5zdGFuY2UgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKi9cbiAgICBpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvZGVSZWZCZWhhdmlvciBleHRlbmRzIElSZWZCZWhhdmlvciB7XG4gICAgdHlwZTogJ2NvZGUnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVJlZkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBzZWxlY3RvclR5cGU6IFJlZlNlbGVjdG9yVHlwZVxuICAgIHNlbGVjdG9yOiBzdHJpbmdcbiAgICBiZWhhdmlvcjogSVJlZkJlaGF2aW9yXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gICAgLy8gcHJvcHM6IFJlY29yZDxzdHJpbmcsIElQcm9wQ29uZmlnPiAvL2lkIC0gdHlwZVxuICAgIC8vIHJlZnM6IFJlY29yZDxzdHJpbmcsIElSZWZDb25maWc+LFxuICAgIC8vIHNraW5zOiBSZWNvcmQ8c3RyaW5nLCBJU2tpbkNvbmZpZz5cbiAgICBwcm9wczogSVByb3BDb25maWdbXSxcbiAgICByZWZzOiBJUmVmQ29uZmlnW10sXG4gICAgc2tpbnM6IElTa2luQ29uZmlnW10sXG4gICAgZGVmYXVsdFNraW46IG51bWJlcjtcblxuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICAvL3Jlc29sdmVkRGVmaW5pdGlvbnM/OiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1tdXG4gICAgLy9UT0RPIDogbW92ZSB0byBiYXNlIGNsYXNzICggSVN0b3JhYmxlSXRlbSBvciBzby4uLilcblxuICAgIGNyZWF0ZWRPbj86IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luSW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMsXG4gICAgLy9za2luczogSVNraW5JbnN0YW5jZUNvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBTZWdtZW50VHlwZSA9IHtcbiAgICBcIkZ1bmN0aW9uUmVzdWx0XCI6IFwiRnVuY3Rpb25SZXN1bHRcIixcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRJbnN0YW5jZSB7XG4gICAgc2VnbWVudElkOiBzdHJpbmc7XG4gICAgc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTZWdtZW50VHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElGdW5jdGlvblJlc3VsdHNTZWdtZW50IGV4dGVuZHMgSVNlZ21lbnREZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIHR5cGU6IHR5cGVvZiBTZWdtZW50VHlwZS5GdW5jdGlvblJlc3VsdFxuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICBmdW5jdGlvbjogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBTa2luU2VsZWN0b3JUeXBlcyA9IHtcbiAgICBcIlNlZ21lbnRlZFwiOiBcIlNlZ21lbnRlZFwiLFxuICAgIFwiRGVkaWNhdGVkXCI6IFwiRGVkaWNhdGVkXCIsXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIFNlbGVjdG9yIFR5cGUgaXMgbm90IHlldCBzdXBwb3J0ZWQgYnV0IHdpbGwgYmUgYWRkZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS5cbiAgICAgKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gICAgICpcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqL1xuICAgIFwiRGVmYXVsdFwiOiBcIkRlZmF1bHRcIlxufSBhcyBjb25zdDtcblxuXG4vKipcbiAqIFRoaXMgU2tpbiBDb25maWcgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICogUGxlYXNlIGNoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB1cGRhdGVzLlxuICpcbiAqIEB0eXBlIHtJRGVmYXVsdFNraW5Db25maWd9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSURlZmF1bHRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZmF1bHQsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRlZFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkLFxuICAgIHNlZ21lbnRzOiBJU2VnbWVudEluc3RhbmNlW11cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGVkaWNhdGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG5cbiAgICAvKipcbiAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIHNraW59IGluc3RlYWQuXG4gICAgICogUHJvcGVydHkgc2tpbnMgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucy5cbiAgICAgKiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSB0byB1c2Uge0BsaW5rIHNraW59IGZvciBiZXR0ZXIgY29tcGF0aWJpbGl0eS5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgc2tpbnM/OiBJU2tpbkluc3RhbmNlQ29uZmlnW10gLy8gZGVwcmVjYXRlZFxuICAgIHNraW46IElTa2luSW5zdGFuY2VDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZztcblxuICAgIC8vVE9ETyA6XG4gICAgLy8gUmVmSUQgPyB0byBzdXBwb3J0IG1vcmUgdGhhbiAxIGNvbXBvbmVudCBmcm9tIHRoZSBzYW1lIHR5cGUgaW4gY29tcG9zaXRlcyA/XG5cbiAgICAvL1RPRE8gOiByZW1vdmVcbiAgICBjb21wb25lbnROYW1lOiBzdHJpbmc7IC8vIDw8IGNoZWNrXG5cbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcblxuICAgIC8vIHN0b3JpbmcgdGhlIG5lc3RlZCBjb25maWcgZm9yIHJlZiBjb21wb25lbnRzXG4gICAgbmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdXG5cbiAgICAvL29ubHkgb24gR0VUP1xuICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IHRoYXRcbiAgICByZXNvbHZlZEV4cGVyaWVuY2VzPzogSUV4cGVyaWVuY2VbXVxuICAgIC8vIHdpbGwgaW5jbHVkZSBpbnN0YW5jZSBhbmQgZGVmIGNvbmZpZyBpbiBvcmRlciB0byByZW5kZXIgaW4gcHJvZHVjdGlvblxuICAgIHJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz86IElDb21wb25lbnRDb25maWdbXVxufVxuXG5leHBvcnQgY29uc3QgRXhwZXJpZW5jZVR5cGVzID0ge1xuICAgIFwiU2VnbWVudFwiOiBcIlNlZ21lbnRcIixcbiAgICBcIlByb21vXCI6IFwiUHJvbW9cIixcbiAgICBcIkFCXCI6IFwiQUJcIlxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJRXhwZXJpZW5jZSB7XG4gICAgaWQ6IHN0cmluZ1xuICAgIG5hbWU6IHN0cmluZ1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmdcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgRXhwZXJpZW5jZVR5cGVzXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICAvL3N0aWNraW5lc3NGYWN0b3JcbiAgICAvL0VuZERhdGVcbn1cblxuLy8gZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlR3JvdXAge1xuLy8gICAgIGlkOiBzdHJpbmdcbi8vICAgICBuYW1lOiBzdHJpbmdcbi8vICAgICBwZXJjZW50YWdlOiBudW1iZXJcbi8vIH1cblxuZXhwb3J0IGludGVyZmFjZSBJQUJFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IHR5cGVvZiBFeHBlcmllbmNlVHlwZXMuQUJcbiAgICAvLyBncm91cHM6IElBQkV4cGVyaWVuY2VHcm91cFtdXG4gICAgZXhwZXJpZW5jZXM6IElFeHBlcmllbmNlW11cbiAgICBwZXJjZW50YWdlOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRGF0ZVJhbmdlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgc3RhcnQ6IERhdGVcbiAgICBlbmQ6IERhdGVcbiAgICB0aW1lem9uZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNlZ21lbnRFeHBlcmllbmNlIGV4dGVuZHMgSUV4cGVyaWVuY2Uge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBzZWdtZW50OiBJU2VnbWVudERlZmluaXRpb25cbiAgICBkYXRlUmFuZ2U/OiBJRGF0ZVJhbmdlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93RGVmaW5pdGlvbiB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdbXTtcbiAgICBvcmlnaW5zOiBzdHJpbmdbXSxcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRDb25maWcge1xuICAgIGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdcbiAgICB0eXBlOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgLy8gVE9ETyA6IHZlcmlmeSB1bmlxdWVuZXNzIChkYXNoYm9hcmQgJiBzZXJ2ZXIpXG4gICAgbmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVVzZXJGbG93IGV4dGVuZHMgT21pdCA8SVVzZXJGbG93RGVmaW5pdGlvbiwgJ2NvbXBvbmVudHMnPiB7XG4gICAgY29tcG9uZW50czogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjbGFzcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q/OiBTaGFkb3dSb290KSB7XG5cbiAgICB9XG5cbiAgICBnZXRSb290RGl2ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcikucXVlcnlTZWxlY3RvcignZGl2JylcbiAgICB9XG5cbiAgICBnZXRSb290ID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gKHRoaXMuc2hhZG93Um9vdCB8fCB0aGlzLmNvbnRhaW5lcik7XG4gICAgfVxufVxuIiwgImV4cG9ydCB0eXBlIFNlcmlhbGl6YWJsZTxUPiA9XG4gICAgVCBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiAvLyBFeGNsdWRlIGZ1bmN0aW9uc1xuICAgICAgICBUIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gPyBTZXJpYWxpemFibGU8VT5bXSA6IC8vIEhhbmRsZSBhcnJheXNcbiAgICAgICAgICAgIFQgZXh0ZW5kcyBvYmplY3QgPyB7XG4gICAgICAgICAgICAgICAgW0sgaW4ga2V5b2YgVCBhcyBUW0tdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IEtdOiBTZXJpYWxpemFibGU8VFtLXT5cbiAgICAgICAgICAgIH0gOiBUOyAvLyBIYW5kbGUgb2JqZWN0c1xuXG5jb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB2YWx1ZSAhPT0gT2JqZWN0KHZhbHVlKTtcbn1cblxuY29uc3QgaXNGdW5jdGlvbiA9ICh2YWx1ZSkgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG5cbmV4cG9ydCBjb25zdCBjb250YWluc1ByaW1pdGl2ZXNPbmx5ID0gKG9iaikgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShvYmopKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc0Z1bmN0aW9uKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSB7XG4gICAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IG9ialtrZXldO1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2hlY2sgaWYgaXQncyBhIG5lc3RlZCBvYmplY3RcbiAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQcmltaXRpdmUodmFsdWUpKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gSXQncyBhIHByaW1pdGl2ZSwgc28gd2UgY2FuIHNraXAgaXRcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gRm91bmQgYSBub24tcHJpbWl0aXZlIHZhbHVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTsgLy8gQWxsIHZhbHVlcyBhcmUgcHJpbWl0aXZlcyBvciBuZXN0ZWQgb2JqZWN0cyB3aXRoIHByaW1pdGl2ZXNcbn1cblxuLy8gY3VycmVudGx5IHN1cHBvcnQgcm9vdCBsZXZlbCBvbmx5XG4vLyB7eDogMSwgeSA6ICdhJywgeiA6ICgpPT57Li4ufSwgaW5uZXIgOiB7IHg6IDEgLCB5IDogJ2EnfSB9XG4vLyB7eDogMSwgeSA6ICdhJ31cbi8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9GYWxzeVxuZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSBQYXJ0aWFsPFJlY29yZDxrZXlvZiBULCBib29sZWFuIHwgUGFydGlhbDxSZWNvcmQ8c3RyaW5nLCBib29sZWFuPj4+PiB8IGJvb2xlYW47XG5cbmV4cG9ydCBjb25zdCBtYWtlU2VyaWFsaXphYmxlID0gPFQ+KFxuICAgIG9iajogVCxcbiAgICBza2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248VD4gPSB7fSxcbiAgICBpbmNsdWRlRmFsc3lLZXlzOiBib29sZWFuID0gdHJ1ZSwgLy8gVE9ETyA6IHVzZSB0aGF0IGFyZ1xuICAgIHNlZW46IFdlYWtNYXA8b2JqZWN0LCBTZXJpYWxpemFibGU8YW55Pj4gPSBuZXcgV2Vha01hcCgpXG4pOiBTZXJpYWxpemFibGU8VD4gPT4ge1xuXG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIG9iaiBhcyBTZXJpYWxpemFibGU8VD47IC8vIERpcmVjdGx5IHJldHVybiBwcmltaXRpdmUgdmFsdWVzXG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIGFycmF5IHNlcmlhbGl6YXRpb25cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlQXJyYXk6IFNlcmlhbGl6YWJsZTxhbnk+W10gPSBbXTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVBcnJheSk7IC8vIFN0b3JlIHRoZSBhcnJheSBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IG9iai5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBvYmpbaW5kZXhdO1xuICAgICAgICAgICAgc2VyaWFsaXphYmxlQXJyYXlbaW5kZXhdID0gbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LCBza2VsZXRvbiwgaW5jbHVkZUZhbHN5S2V5cywgc2Vlbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZUFycmF5IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICBpZiAob2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBjeWNsaWMgcmVmZXJlbmNlc1xuICAgICAgICBpZiAoc2Vlbi5oYXMob2JqKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlZW4uZ2V0KG9iaikhOyAvLyBSZXR1cm4gdGhlIGFscmVhZHkgcHJvY2Vzc2VkIG9iamVjdFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6YWJsZU9iamVjdDogUGFydGlhbDxTZXJpYWxpemFibGU8VD4+ID0ge307XG4gICAgICAgIHNlZW4uc2V0KG9iaiwgc2VyaWFsaXphYmxlT2JqZWN0KTsgLy8gU3RvcmUgdGhlIG9iamVjdCBpbiBzZWVuXG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUga2V5IGlzIGluIHRoZSBza2VsZXRvbiBhbmQgaWYgaXQncyBhIHZhbGlkIGtleSB0byBzZXJpYWxpemVcblxuICAgICAgICAgICAgY29uc3Qga2V5SW5Ta2VsZXRvbiA9IHR5cGVvZiBza2VsZXRvbiA9PSBcImJvb2xlYW5cIiA/IHNrZWxldG9uIDogc2tlbGV0b25ba2V5XTtcblxuICAgICAgICAgICAgaWYgKGtleUluU2tlbGV0b24pIHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbiA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc2tlbGV0b24gaW5kaWNhdGVzIHRvIHNlcmlhbGl6ZSB0aGlzIGtleVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5jbHVkZUZhbHN5S2V5cyA/IG9ialtrZXldICE9PSB1bmRlZmluZWQgOiBvYmpba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCB0cnVlLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGtleUluU2tlbGV0b24gPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgbmVzdGVkIGtleXMgdG8gc2VyaWFsaXplXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphYmxlT2JqZWN0W2tleV0gPSBtYWtlU2VyaWFsaXphYmxlKG9ialtrZXldLCBrZXlJblNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZU9iamVjdCBhcyBTZXJpYWxpemFibGU8VD47XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9IGFzIGFueTsgLy8gUmV0dXJuIGFuIGVtcHR5IG9iamVjdCBmb3Igb3RoZXIgY2FzZXNcbn1cbiIsICJleHBvcnQgY29uc3QgRXJyb3JzID0ge1xuICAgIG5vdFNlcmlhbGl6YWJsZVJlZkNhbGw6IChwcm9wLCBhcmcpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBcblRoZSBpbnB1dCBwcm92aWRlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBpcyBub3Qgc2VyaWFsaXphYmxlLiBTZXJpYWxpemF0aW9uIGlzIHJlcXVpcmVkIHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhIGNhbiBiZSBzYWZlbHkgdHJhbnNmZXJyZWQgdG8gdGhlIHNraW4gaW1wbGVtZW50YXRpb24uIFxuVGhlIGZvbGxvd2luZyB0eXBlcyBvZiBkYXRhIGFyZSBjb25zaWRlcmVkIG5vbi1zZXJpYWxpemFibGUgYW5kIGNhbm5vdCBiZSBwcm9jZXNzZWQ6XG5cbi0gRnVuY3Rpb25zXG4tIERPTSBlbGVtZW50c1xuLSBDbGFzcyBpbnN0YW5jZXNcbi0gQ2lyY3VsYXIgcmVmZXJlbmNlc1xuLSBTeW1ib2xzXG4tIEJpZ0ludCB2YWx1ZXNcblxuSW4gdGhlIGZvbGxvd2luZyBleGVjdXRpb24gd2UgZGV0ZWN0ZWQgOlxufn5+fn5+fn5cbiR7YXJnfSBcbn5+fn5+fn5+XG5hcyBub3Qgc2VyaWFsaXphYmxlLlxuXG5UbyByZXNvbHZlIHRoaXMgaXNzdWUsIHBsZWFzZSBlbnN1cmUgdGhhdCBhbGwgaW5wdXRzIHBhc3NlZCB0byAnJHtwcm9wLnRvU3RyaW5nKCl9JyBhcmUgaW4gYSBzZXJpYWxpemFibGUgZm9ybWF0LlxuVGhpcyB0eXBpY2FsbHkgaW5jbHVkZXMgcHJpbWl0aXZlIHR5cGVzIChzdHJpbmdzLCBudW1iZXJzLCBib29sZWFucyksIGFycmF5cywgYW5kIHBsYWluIG9iamVjdHMuIFxuSWYgeW91IG5lZWQgdG8gaW5jbHVkZSBjb21wbGV4IGRhdGEgdHlwZXMsIGNvbnNpZGVyIGNvbnZlcnRpbmcgdGhlbSB0byBhIHNlcmlhbGl6YWJsZSBzdHJ1Y3R1cmUgYmVmb3JlIHBhc3NpbmcgdGhlbSB0byB0aGUgZnVuY3Rpb24uXG5PciB1c2UgTXlvcCBtZXNzYWdlIHRoYXQgc3VwcG9ydCBpdDogQ3VzdG9tUmVmTWVzc2FnZSwgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2Ugb3IgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UuXG5cblN1Z2dlc3RlZCBGaXg6XG4xLiBSZW1vdmUgb3IgcmVwbGFjZSBub24tc2VyaWFsaXphYmxlIHZhbHVlcyBmcm9tIHlvdXIgaW5wdXQuXG4yLiBJZiB1c2luZyBvYmplY3RzLCBlbnN1cmUgdGhleSBkbyBub3QgY29udGFpbiBhbnkgZnVuY3Rpb25zIG9yIGNpcmN1bGFyIHJlZmVyZW5jZXMuXG4zLiBDb252ZXJ0IGFueSBjbGFzcyBpbnN0YW5jZXMgdG8gcGxhaW4gb2JqZWN0cyBvciBKU09OLWNvbXBhdGlibGUgZm9ybWF0cy5cbjQuIFVzZSBkZWRpY2F0ZWQgTXlvcCBtZXNzYWdlLlxuXG5Gb3IgbW9yZSBkZXRhaWxzIG9uIHNlcmlhbGl6YXRpb24gYW5kIE15b3AgbWVzc2FnZSBleGFtcGxlcywgcmVmZXIgdG8gaHR0cHM6Ly9kb2NzLm15b3AuZGV2XFwuXG5cbmApO1xuICAgIH1cbn1cblxuIiwgImltcG9ydCB7QmFzZU15b3BDb21wb25lbnQsIElNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIEV4ZWN1dGVDb21wb25lbnRNZXRob2R9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbnZlbG9wZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZVwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcFJlZkNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgcHVibGljIHBhcmVudDogSU15b3BDb21wb25lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIHBhcmVudENvbXBvbmVudC5jb250YWluZXIuLi5cbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgcGFyZW50LmNvbnRhaW5lciwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgLy90aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoYXJndW1lbnRzLmNhbGxlZS5uYW1lKSk7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaGlkZScpKTtcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ3Nob3cnKSk7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgLy9UT0RPIDogc3VwcG9ydCByZWFsIGNsZWFudXBcbiAgICAgICAgLy9jb25zb2xlLmxvZygncmVmIGluc3BlY3QgY2FsbGVkLCBjcmVhdGluZyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kIGluc3BlY3QnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCB0aGlzLmlkKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnaW5zcGVjdCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCcpKTtcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCcpKTtcbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy8gaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09ICdNdXRhdGlvbk9ic2VydmVyTWVzc2FnZScpIHtcbiAgICAgICAgLy8gIGRlYnVnZ2VyO1xuICAgICAgICAvLyAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG5cbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgbWVzc2FnZSBzZW5kaW5nICcsIG1lc3NhZ2UpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIC8vIHRoaXMuaWQgd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlIG5lc3RlZCBjb21wb25lbnRcbiAgICAgICAgdGhpcy5wYXJlbnQuc2VuZChuZXcgRW52ZWxvcGVkTWVzc2FnZSh0aGlzLmlkLCBtZXNzYWdlKSk7XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBtZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNJbml0aWF0ZWQpXG4gICAgICAgICAgICB0aGlzLnNlbmQobmV3IEV4ZWN1dGVDb21wb25lbnRNZXRob2QoJ2Rpc3Bvc2UnKSk7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB9XG59XG4iLCAiLy90eXBlIEFDb25zdHJ1Y3RvclR5cGVPZjxUPiA9IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQ7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIEN1c3RvbVJlZk1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQgKiBhcyBtZXNzYWdlcyBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQ2xlYW51cEhhbmRsZXIsIElDb21wb25lbnRDb25maWcsXG4gICAgdHlwZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJQ29tcG9uZW50UmVmQmVoYXZpb3IsIElIVE1MTG9hZGVyQ29uZmlnLCBJUHJvcENvZGVCZWhhdmlvcixcbiAgICBJUHJvcENvbmZpZywgSVNraW5Db25maWcsIFByb3BDb25maWdCZWhhdmlvclR5cGVzLFxuICAgIFJlZkJlaGF2aW9yVHlwZSwgU2hhZG93Um9vdE1vZGVUeXBlLCBTa2luTG9hZGVycywgU2tpbkxvYWRlclR5cGVcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtjb250YWluc1ByaW1pdGl2ZXNPbmx5fSBmcm9tIFwiLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb25cIjtcbmltcG9ydCB7RXJyb3JzfSBmcm9tIFwiLi9sb2dNZXNzYWdlc1wiO1xuaW1wb3J0IHtNeW9wUmVmQ29tcG9uZW50fSBmcm9tIFwiLi9jb21wb25lbnRzL215b3BSZWZDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4vaG9zdFNES1wiO1xuXG50eXBlIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcyA9IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnWydwcm9wcyddXG5cbmNvbnN0IGNyZWF0ZURlYnVnVGl0bGUgPSAodGV4dDogc3RyaW5nLCB0b3A6IG51bWJlciwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICBjb25zdCB0aXRsZUVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgIHRpdGxlRWwudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHRpdGxlRWwuc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgIHRpdGxlRWwuc3R5bGUucGFkZGluZyA9ICcwIDVweCc7XG4gICAgdGl0bGVFbC5zdHlsZS5mb250U2l6ZSA9ICcxNHB4JztcbiAgICB0aXRsZUVsLnN0eWxlWyd0b3AnXSA9ICcwJztcbiAgICB0aXRsZUVsLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgLy90aXRsZUVsLnN0eWxlLmxlZnQgPSAnNTAlJztcbiAgICB0aXRsZUVsLnN0eWxlLnRyYW5zZm9ybSA9ICd0cmFuc2xhdGVYKC01MCUpJztcbiAgICB0aXRsZUVsLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgIHRpdGxlRWwuaHJlZiA9IGBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZH1gXG5cbiAgICByZXR1cm4gdGl0bGVFbDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXREZWJ1Z1N0eWxlID0gKGlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRFbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG4pOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgLy8jMDA3QkZGIChibHVlKSBvciAjRkY1NzIyIChvcmFuZ2UpXG4gICAgLy8jNENBRjUwIChncmVlbikgb3IgI0ZGQzEwNyAoYW1iZXIpXG4gICAgLy8gY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7aWR9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29uc3QgdG9wVGV4dCA9IGNyZWF0ZURlYnVnVGl0bGUoYCR7Y29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5uYW1lfSA6ICR7dHlwZX1gLCB0b3AsIGNvbXBvbmVudERlZmluaXRpb25Db25maWcpO1xuICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUodG9wVGV4dCwgY29tcG9uZW50RWxlbWVudCk7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICMwMDdCRkYnO1xuICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICd1bnNldCc7XG4gICAgICAgIGNvbnRhaW5lci5yZW1vdmVDaGlsZCh0b3BUZXh0KTtcbiAgICB9XG59XG5cbmNvbnN0IHJlcG9ydEVycm9yID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGlmICghcHJvcENvbmZpZykge1xuXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAvLyB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3I6IFVuZGVmaW5lZCBQcm9wXFxuXFxuYCArXG4gICAgICAgICAgICBgSXQgbG9va3MgbGlrZSB5b3UndmUgdHJpZWQgdG8gdXNlIGEgcHJvcCB0aGF0IGhhc24ndCBiZWVuIGRlZmluZWQuXFxuYCArXG4gICAgICAgICAgICBgUGxlYXNlIGNoZWNrIHRoZSBwcm9wIG5hbWUgZm9yIGFueSB0eXBvcyBvciBlbnN1cmUgdGhhdCBpdCBpcyBwcm9wZXJseSBkZWZpbmVkIGluIHRoZSBjb21wb25lbnQncyBwcm9wIGxpc3QuXFxuXFxuYCArXG4gICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICBgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHJlZmVyIHRvIHRoZSBjb21wb25lbnQgcGFnZSBodHRwczovL2Rhc2hib2FyZC5teW9wLmRldi9kYXNoYm9hcmQvY29tcG9uZW50LyR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9IG9yIGNvbnN1bHQgdGhlIGRldmVsb3BlciBndWlkZS5gXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxufVxuXG5jb25zdCByZXBvcnRVbnN1cHBvcnRlZCA9IChwcm9wQ29uZmlnOiBJUHJvcENvbmZpZywgcHJvcE5hbWU6IHN0cmluZywgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudDxhbnksIGFueT4pID0+IHtcbiAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRXJyb3I6IENvZGUgUHJvcCBOb3QgU3VwcG9ydGVkXFxuXFxuYCArXG4gICAgICAgIGBDdXJyZW50bHksIGNvZGUgcHJvcHMgYXJlIG9ubHkgc3VwcG9ydGVkIGluIGxvY2FsIGZyYW1lIGNvbXBvbmVudHMuXFxuYCArXG4gICAgICAgIGBcdTI2QTBcdUZFMEYgVGhpcyBpcyBhIHdvcmsgaW4gcHJvZ3Jlc3MgZmVhdHVyZSBcdTIwMTQgY29kZSBwcm9wcyB3aWxsIGJlIHN1cHBvcnRlZCBpbiB1cGNvbWluZyB2ZXJzaW9ucy5cXG5cXG5gICtcbiAgICAgICAgYEluIHRoZSBtZWFudGltZSwgeW91IGNhbiB1c2UgbWVzc2FnZSBwcm9wcy5cXG5cXG5gICtcbiAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wTmFtZX1cXG5gICtcbiAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICApO1xufVxuXG5leHBvcnQgY29uc3QgY29ubmVjdFByb3BzID0gPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIHByb3BzQ29uZmlnOiBJUHJvcENvbmZpZ1tdLCBzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiB7XG5cbiAgICBjb25zdCBwcm9wc01hcCA9IHByb3BzQ29uZmlnLnJlZHVjZSgocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5wcmV2aW91c1ZhbHVlLFxuICAgICAgICAgICAgW2N1cnJlbnRWYWx1ZS5uYW1lXTogey4uLmN1cnJlbnRWYWx1ZX1cbiAgICAgICAgfVxuICAgIH0sIHt9KTtcblxuICAgIGNvbnN0IHByb3BzSGFuZGxlciA9IHtcbiAgICAgICAgZ2V0OiAoXzogSU15b3BDb21wb25lbnQsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgcHJvcENvbmZpZyA9IHByb3BzTWFwW3Byb3BdO1xuXG4gICAgICAgICAgICBpZiAocmVwb3J0RXJyb3IocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMuY29kZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBsb2NhbCBmcmFtZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5lbGVtZW50LmNvbnRlbnRXaW5kb3dbdHlwZWRQcm9wQmVoYXZpb3IucmVtYXAgfHwgcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcG9ydFVuc3VwcG9ydGVkKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnb3V0cHV0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCgoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcblxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9LFxuICAgICAgICBzZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkU2tpbi5sb2FkZXIudHlwZSA9PT0gU2tpbkxvYWRlcnMuSFRNTExvYWRlcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZExvYWRlciA9IHNlbGVjdGVkU2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBsb2NhbCBmcmFtZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVkTG9hZGVyLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQcm9wQmVoYXZpb3IgPSBwcm9wQ29uZmlnLmJlaGF2aW9yIGFzIElQcm9wQ29kZUJlaGF2aW9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuY29udGVudFdpbmRvd1t0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wXSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vaWYocHJvcENvbmZpZy5iZWhhdmlvciA9PT0gUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMubWVzc2FnZSlcbiAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5tb2RlID09PSAnaW5wdXQnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgbXVsdGkgYmVoYXZpb3JzXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IudHlwZSA9PT0gJ21lc3NhZ2UnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlUGFyYW1zOiBhbnlbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogdHVybiBpdCBpbnRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKFJlZi5jcmVhdGUocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goLi4ucHJvcENvbmZpZy5iZWhhdmlvci5wYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlQ3RvciA9IG1lc3NhZ2VzW3Byb3BDb25maWcuYmVoYXZpb3IubWVzc2FnZV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgbWVzc2FnZUN0b3IoLi4ubWVzc2FnZVBhcmFtcykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3I6IFVuc3VwcG9ydGVkIEJlaGF2aW9yXFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSAnYmVoYXZpb3InIGZpZWxkIHByb3ZpZGVkIGlzIG5vdCBzdXBwb3J0ZWQuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENvbXBvbmVudDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lfSwgSUQ6ICR7Y29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24uaWR9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFByb3AgTmFtZTogJHtwcm9wfVxcbmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBCZWhhdmlvciBGaWVsZDogJHtwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGV9XFxuXFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYENoZWNrIHRoZSBkb2N1bWVudGF0aW9uIGZvciB2YWxpZCBiZWhhdmlvciBvcHRpb25zLmBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnQucHJvcHMgPSB7fTtcbiAgICBjb21wb25lbnQucHJvcHMgPSBuZXcgUHJveHkoY29tcG9uZW50LnByb3BzLCBwcm9wc0hhbmRsZXIpO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyAoT21pdDxJTXlvcENvbXBvbmVudCwgJ3Byb3BzJz4gJiB7XG4gICAgICAgIHByb3BzOiBwcm9wVHlwZXM8VD5cbiAgICB9KVxufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmUHJveHkgPSAodGFyZ2V0OiBSZWYsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQpID0+IHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHRhcmdldCwge1xuICAgICAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG5cbiAgICAgICAgICAgIC8vIGlmIChwcm9wID09PSAnX19ub25Qcm94aWVkJykge1xuICAgICAgICAgICAgLy8gICAgIHJldHVybiB0YXJnZXQ7XG4gICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGlmICh0YXJnZXRbcHJvcF0pIHtcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZ2V0dGVyRnVuY3Rpb24gPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBhcmdzLmZvckVhY2goYXJnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29udGFpbnNQcmltaXRpdmVzT25seShhcmcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLm5vdFNlcmlhbGl6YWJsZVJlZkNhbGwocHJvcCwgYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgZnVuY3Rpb25BcmdzLCBtYWtlU2VyaWFsaXphYmxlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHJlZltwcm9wTmFtZV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHJlZltwcm9wTmFtZV0oLi4uZnVuY3Rpb25BcmdzKSwgdHJ1ZSkgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIGl0cyByZXN1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYWtlU2VyaWFsaXphYmxlKHZhbHVlLCB0cnVlKTsgLy8gUmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IHRvIGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZDogdGFyZ2V0LnJlZkNvbmZpZy5zZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkFyZ3M6IGFyZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShtc2cuY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8vVE9ETzogd2UgY2FuIGltcGxlbWVudCB0aGluZ3MgbGlrZSBhdXRvIHNlcmlhbGl6YXRpb24gYW5kIGJpbmRpbmcgZnVuY3Rpb25zIGhlcmVcbiAgICAgICAgICAgIC8vZ2V0dGVyRnVuY3Rpb24udGVzdCA9ICcxMjMnO1xuXG4gICAgICAgICAgICByZXR1cm4gZ2V0dGVyRnVuY3Rpb247XG5cbiAgICAgICAgICAgIC8vcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7XG4gICAgICAgIH0sXG4gICAgICAgIHNldCh0YXJnZXQsIHByb3A6IHN0cmluZywgdmFsdWUpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBwcm9wTmFtZSwgcHJvcFZhbHVlfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmVmW3Byb3BOYW1lXSA9IHByb3BWYWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogZml4IHRoYXRcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICBwcm9wVmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBwcm9wTmFtZTogcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKG1zZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBsb2c/XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVJlZkNvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4ocmVmOiBSZWYsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOiBQcm9taXNlPFQ+ID0+IHtcbiAgICBjb25zdCBjb21wb25lbnQgPSByZWYuY29tcG9uZW50O1xuICAgIGlmICghY29tcG9uZW50KVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbnQgY3JlYXRlUmVmQ29tcG9uZW50IHdpdGggZGV0YWNoZWQgcmVmJyk7XG5cbiAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJywgcmVmLCBjb21wb25lbnRDb25maWcpO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gbmV3IE15b3BSZWZDb21wb25lbnQoY29tcG9uZW50Q29uZmlnLnR5cGUsIGNvbXBvbmVudCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaChyZWZDb21wb25lbnQpO1xuXG4gICAgICAgIC8vZm9yIGNhc2VzIHdoZXJlIHJlZiBjb21wb25lbnRzIGRlZmluZSBpbiB0aGUgY29tcG9uZW50IGNvbmZpZ1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSByb290IGNvbXBvbmVudCB0aGUgYmUgaW5pdGlhdGVkIGJlZm9yZSBpbnRlcmFjdGluZyB3aXRoIGl0XG4gICAgICAgIGF3YWl0IGNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuXG4gICAgICAgIC8vVE9ETyA6XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIC8vcmVqZWN0KCd0aW1lb3V0PycpO1xuICAgICAgICAgICAgcmVqZWN0KCd0aW1lb3V0Jyk7XG4gICAgICAgIH0sIDUwMDApO1xuXG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKHJlZi5yZWZDb25maWcsXG4gICAgICAgICAgICBjb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyA/IG9wdGlvbnMgOiB7fSxcbiAgICAgICAgICAgICAgICBpZDogcmVmQ29tcG9uZW50LmlkLFxuICAgICAgICAgICAgICAgIF9oYXNQYXJlbnQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhc3luYyAobWVzc2FnZSkgPT4ge1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgaWYgdGltZW91dCBhbHJlYWR5IHBhc3NlZFxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcblxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLmZhaWxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOlxuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgZmFpbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT0gcmVmQ29tcG9uZW50LmlkKTtcblxuICAgICAgICAgICAgICAgIC8vc2FtZSBtZW1vcnkgZW52LCBzYW1lIEhvc3RTREtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25Db21wb25lbnQgIT09IHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBjbGVhbiByZWZDb21wb25lbnQgP1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnNldEluaXRpYXRlZCgpXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogaGVyZSA+XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogd2hhdCBhYm91dCByZWFwdGVycyA/ISBkeW5hbWljID8hXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZXhzaXN0aW5nUmVmQ29tcG9uZW50ID0gY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSBhcyBNeW9wUmVmQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgIC8vIGlmIChleHNpc3RpbmdSZWZDb21wb25lbnQuaWQgJiYgZXhzaXN0aW5nUmVmQ29tcG9uZW50LnBhcmVudCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdID0gW2NvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0sIHJlZkNvbXBvbmVudF07XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0pKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0ucHVzaChyZWZDb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSByZWZDb21wb25lbnQ7IC8vaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSByZWZDb21wb25lbnQuaWQpITtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBpbiB3ZWJjb21wb25lbnQgY2FzZSB0aGUgc2FtZSBpZCB3aWxsIGFscmVkYXkgYmUgaGVyZSwgd2hpY2ggaXMgZ29vZCAhXG4gICAgICAgICAgICAgICAgLy8gbmFtZTpcbiAgICAgICAgICAgICAgICAvLyAgICAgaWRcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkXG5cbiAgICAgICAgICAgICAgICAvLyBmb3IgaW5uZXIgY29tcG9uZW50cyBpbnNpZGUgcmVmIGNvbXBvbmVudCA6XG4gICAgICAgICAgICAgICAgbWVzc2FnZS5uZXN0ZWRSZWZzLmZvckVhY2gobmVzdGVkUmVmQ29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHMhLmZpbmQoYyA9PiBjLnR5cGUuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpIS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IG5lc3RlZENvbXBvbmVudERlZmluaXRpb24gPSBjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZXNvbHZlZERlZmluaXRpb25zPy5maW5kKGRlZiA9PiBkZWYuaWQgPT09IG5lc3RlZFJlZkNvbmZpZy5jb21wb25lbnREZWZpbml0aW9uSWQpITtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3QgcmVmQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLnR5cGUucmVmcy5maW5kKHIgPT4gci5uYW1lID09PSBuZXN0ZWRSZWZDb25maWcucmVmTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmICghcmVmQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIHJlZkNvbmZpZyBmb3VuZCBmb3IgbmVzdGVkIHJlZicpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uLCByZWZDb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICBuZXN0ZWRDb21wb25lbnQuc2V0SW5pdGlhdGVkKCk7XG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5yZWZzW25lc3RlZFJlZkNvbmZpZy5yZWZOYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cy5wdXNoKG5lc3RlZENvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3RSZWZzKHJlZkNvbXBvbmVudCwgY29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOnVzZSBjb25maWcgY2hlY2sgZm9yIGF1dG8taGlnaHQgYW5kIGNvbnZlcnQgdHlwZSBwcm9wZXJseVxuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZWZDb21wb25lbnQgYXMgdW5rbm93biBhcyBUKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aHJvdyBlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UmVmcyA9IGFzeW5jIChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcsIGNvbXBvbmVudHM6IElNeW9wQ29tcG9uZW50W10sIHdpdGhvdXRSZWZDb21wb25lbnRzOiBib29sZWFuID0gZmFsc2UpID0+IHtcblxuICAgIGlmICghY29tcG9uZW50LnJlZnMpXG4gICAgICAgIGNvbXBvbmVudC5yZWZzID0ge307XG5cbiAgICBjb25zdCB3YWl0Rm9yID0gT2JqZWN0LnZhbHVlcyhjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5yZWZzKS5tYXAocmVmID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChyZWYuYmVoYXZpb3IudHlwZSA9PSBSZWZCZWhhdmlvclR5cGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID1cblxuICAgICAgICAgICAgICAgIGlmICh3aXRob3V0UmVmQ29tcG9uZW50cykge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogY2hhbmdlIHRvIGdldCBpdCBmcm9tIHRoZSBmbG93XG4gICAgICAgICAgICAgICAgbGV0IHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmNvbXBvbmVudElkO1xuICAgICAgICAgICAgICAgIGlmICghcmVmQ29tcG9uZW50SWQpXG4gICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudElkID0gKHJlZi5iZWhhdmlvciBhcyBJQ29tcG9uZW50UmVmQmVoYXZpb3IpLmluc3RhbmNlLmNvbXBvbmVudElkXG5cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy90aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnMhLmZpbmQoY29tcGRlZiA9PiBjb21wZGVmLmlkID09PSByZWZDb21wb25lbnRJZCkhO1xuICAgICAgICAgICAgICAgIC8vIC8vY29uc3QgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IGF3YWl0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcoY29tcG9uZW50SW5zdGFuY2VDb25maWcuY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gaWYgKCFjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJlamVjdChuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IHJlc29sdmVkRGVmaW5pdGlvbnMgY2hlY2sgdGhlIGNvbmZpZyBvYmplY3QnKSk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE86IGlmIHdlIGhhdmUgdGhlIHNhbWUgY29tcG9uZW50IG1vcmUgdGhhbiBvbmNlIHdlIHdpbGwgbmVlZCBpbnN0YW5jZSBpZCBoZXJlIC4uLlxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5yZXNvbHZlZE5lc3RlZENvbXBvbmVudHM/LmZpbmQobmVzdGVkQ29tcG9uZW50ID0+IG5lc3RlZENvbXBvbmVudC50eXBlLmlkID09PSByZWZDb21wb25lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIW5lc3RlZENvbXBvbmVudENvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbXBvbmVudENvbmZpZyBwcm92aWRlZCB3aXRob3V0IG5lc3RlZENvbXBvbmVudENvbmZpZyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy9jb25zdCBjb21wb25lbnRJbnN0YW5jZUNvbmZpZyA9IGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZS5uZXN0ZWRDb21wb25lbnRzPy5maW5kKGNvbXBvbmVudEluc3RhY2UgPT4gY29tcG9uZW50SW5zdGFjZS5jb21wb25lbnRJZCA9PT0gY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5pZCk7XG4gICAgICAgICAgICAgICAgLy8gaWYoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpe1xuICAgICAgICAgICAgICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RPRE8gVE9ETyBUT0RPICcpO1xuICAgICAgICAgICAgICAgIC8vICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDp0aGluayBhYm91dCB0aGF0IDpcbiAgICAgICAgICAgICAgICAvLyAgIGNvbXBvbmVudERlZmluaXRpb25Db25maWcucmVzb2x2ZWREZWZpbml0aW9ucyA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM7XG4gICAgICAgICAgICAgICAgLy8gICBjb25zdCBuZXN0ZWRDb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgaW5zdGFuY2U6IG5lc3RlZENvbXBvbmVudENvbmZpZy5pbnN0YW5jZSEsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgdHlwZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLnR5cGUsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgbmFtZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLm5hbWVcbiAgICAgICAgICAgICAgICAvLyAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IF9yZWYgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCduZXN0ZWQgISEgY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnQgPSBhd2FpdCBjcmVhdGVSZWZDb21wb25lbnQoX3JlZiwgbmVzdGVkQ29tcG9uZW50Q29uZmlnISwgY29tcG9uZW50cylcbiAgICAgICAgICAgICAgICAgICAgLy9URE9PIDogcHV0IHRoYXQgcmVmIGNvbXBvbmVudCBzb21ld2hlcmU/XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IG5lc3RlZENvbXBvbmVudDtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfX25vblByb3hpZWQgPSBSZWYuY3JlYXRlKCcnLCByZWYsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWZzW3JlZi5uYW1lXSA9IGNyZWF0ZVJlZlByb3h5KF9fbm9uUHJveGllZCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9hbGVydCgnPycpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIH0pXG4gICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwod2FpdEZvcik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgIHRocm93IGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCB0eXBlIHByb3BUeXBlczxUIGV4dGVuZHMgY29tcG9uZW50RGVmaW5pdGlvblByb3BzPiA9IHtcbiAgICBbUHJvcGVydHkgaW4ga2V5b2YgVF06XG4gICAgVFtQcm9wZXJ0eV0gZXh0ZW5kcyB7IG1vZGU6ICdpbnB1dCcgfSA/XG4gICAgICAgIFRbUHJvcGVydHldWyd0eXBlJ10gOlxuICAgICAgICBQcm9taXNlPFRbUHJvcGVydHldWyd0eXBlJ10+XG59XG5cbmV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG5cbmV4cG9ydCBjb25zdCBhY3RBcyA9IDxUPihyZWY6IFJlZikgPT4ge1xuICAgIHJldHVybiByZWYgYXMgdW5rbm93biBhcyBGdW5jdGlvbmlmeVJlZjxUPlxufVxuXG5leHBvcnQgdHlwZSBGdW5jdGlvbmlmeVJlZjxUID0gYW55PiA9IHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBBKSA9PiBpbmZlciBSIC8vIElmIGl0J3MgYSBmdW5jdGlvblxuICAgICAgICA/ICguLi5hcmdzOiBBKSA9PiBQcm9taXNlPFI+IC8vIENvbnZlcnQgaXQgdG8gYSBwcm9taXNlZCBmdW5jdGlvblxuICAgICAgICA6IFRbS11cbn07XG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudH0gZnJvbSBcIi4vSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEV4ZWN1dGVDb21wb25lbnRNZXRob2QsXG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE1lc3NhZ2VEaXJlY3Rpb25cbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlcy50c1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuXG5leHBvcnQgY2xhc3MgTXlvcElmcmFtZUNvbXBvbmVudCBleHRlbmRzIEJhc2VNeW9wQ29tcG9uZW50IHtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb21wb25lbnRDb25maWc6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgcHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHByaXZhdGUgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKGNvbXBvbmVudENvbmZpZywgY29udGFpbmVyLCBvcHRpb25zKVxuXG4gICAgICAgIGlmICgoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykuYXV0b0hlaWdodCkge1xuICAgICAgICAgICAgdGhpcy5pbml0aWF0ZWQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gdGhpcy5JZnJhbWVFbGVtZW50O1xuICAgICAgICAvLyB0aGlzLklmcmFtZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgIC8vICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdClcbiAgICAgICAgLy8gICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGBJZnJhbWVFbGVtZW50IGVycm9yYCk7XG4gICAgICAgIC8vIH0pO1xuICAgIH1cblxuICAgIGNsZWFudXBJbnNwZWN0PzogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvLyBUT0RPIDogdXNlIGJldHRlciBjaGVjayBmb3IgaW5zcGVjdCBtb2RlXG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KSB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdpbnNwZWN0IGNhbGwgbW9yZSB0aGFuIG9uY2UnKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsZWFudXBJbnNwZWN0XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BJZnJhbWVDb21wb25lbnQnLCAxMCwgdGhpcy5jb250YWluZXIsIHRoaXMuSWZyYW1lRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QhKCk7XG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGhpZGUoKSB7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgc2hvdygpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMSc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICd1bnNldCdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYWxsJ1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICBzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG9ic2VydmVTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7c2VuZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgICAgICBzZW5kKHtoZWlnaHQsIHdpZHRofSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgIH0pKTtcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2V0U2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7aGVpZ2h0LCB3aWR0aH0gPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICByZXR1cm4ge2hlaWdodCwgd2lkdGh9XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3JldC5jb250ZW50LndpZHRofXB4YDtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudC5oZWlnaHR9cHhgO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyByZXR1cm4gd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0ICsgJ3B4JztcblxuXG4gICAgICAgICAgICAvL1RPRE86IGZpeCB0aGF0IGhhY2ssIGtlZXAgdGhlIGZ1bmN0aW9uIGluIHJpZ2h0IGZvcm1hdCB3aGlsZSBtaW5pZmllZCA6KFxuICAgICAgICAgICAgY29uc3Qgbm9PcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBObyBvcGVyYXRpb24gcGVyZm9ybWVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUbyBlbnN1cmUgaXQncyBub3Qgb3B0aW1pemVkIGF3YXksIHlvdSBjYW4gY2FsbCBpdCBhdCBsZWFzdCBvbmNlXG4gICAgICAgICAgICBsZXQgeCA9IG5vT3AoKTtcbiAgICAgICAgICAgIHgrKztcbiAgICAgICAgICAgIHgtLTtcblxuICAgICAgICAgICAgLy9yZXR1cm4gYCR7d2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0fXB4YDtcblxuICAgICAgICAgICAgLy9UT0RPIDogY2hlY2sgdGhhdCArMSA/XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5tYXgoXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuc2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICwgd2luZG93LmRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0KSArIHggKyAncHgnXG5cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IHJldC5jb250ZW50O1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogQ2xlYW51cEhhbmRsZXIgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuICAgICAgICAvL1RPRE8gOiA/IT8hIHNob3VsZCBpdCBiZSBoZXJlID9cbiAgICAgICAgaWYgKG1lc3NhZ2VfLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgdHlwZWRNZXNzYWdlID0gKG1lc3NhZ2VfIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpXG4gICAgICAgICAgICB0aGlzW3R5cGVkTWVzc2FnZS5tZXRob2RdKCk7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjayA6KFxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuXG4gICAgICAgIG1lc3NhZ2VfLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSBzdXBlci5zZW5kKG1lc3NhZ2VfKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50Py5jb250ZW50V2luZG93Py5wb3N0TWVzc2FnZShtZXNzYWdlXywgJyonKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIC8vbWVzc2FnZS5oYW5kbGVyID0gaGFuZGxlclxuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9O1xuXG4gICAgb25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChpbmNvbWVNZXNzYWdlLm1lc3NhZ2VUeXBlID09PSBNeW9wTWVzc2FnZXMuSW4uTXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcbiAgICAgICAgICAgIHx8IGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5SZXNpemVPYnNlcnZlck1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgLy90aGlzLnNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHN1cGVyLm9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmNsZWFudXBJbnNwZWN0KVxuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCgpO1xuXG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnBhcmVudE5vZGUhLnJlbW92ZUNoaWxkKHRoaXMuSWZyYW1lRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJU2tpbkNvbmZpZywgU2tpbkxvYWRlclR5cGV9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcExvYWRlciB7XG4gICAgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BMb2FkZXIgaW1wbGVtZW50cyBJTXlvcExvYWRlciB7XG4gICAgYWJzdHJhY3QgdHlwZTogU2tpbkxvYWRlclR5cGU7XG4gICAgYWJzdHJhY3QgbG9hZDogKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IFByb21pc2U8SU15b3BDb21wb25lbnQ+O1xuXG4gICAgYXBwZW5kQ2hpbGQgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgZWxlbWVudDogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zLCkgPT4ge1xuICAgICAgICBpZiAob3B0aW9ucz8ucmVsYXRpdmUpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnJlbGF0aXZlLmRpcmVjdGlvbiA9PT0gJ2JlZm9yZScpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBvcHRpb25zLnJlbGF0aXZlLmNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYWZ0ZXInKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dFNpYmxpbmcgPSBvcHRpb25zLnJlbGF0aXZlLmNoaWxkPy5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmluc2VydEJlZm9yZShlbGVtZW50LCBuZXh0U2libGluZyA/IG5leHRTaWJsaW5nIDogbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcElmcmFtZUNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElJZnJhbWVMb2FkZXJDb25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBhZGRRdWVyeVBhcmFtID0gKHVybDogc3RyaW5nLCBwYXJhbTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgVVJMIG9iamVjdFxuICAgIGNvbnN0IHVybE9iaiA9IG5ldyBVUkwodXJsKTtcblxuICAgIC8vIEFkZCB0aGUgcXVlcnkgcGFyYW1ldGVyXG4gICAgdXJsT2JqLnNlYXJjaFBhcmFtcy5hcHBlbmQocGFyYW0sIHZhbHVlKTtcblxuICAgIC8vIFJldHVybiB0aGUgdXBkYXRlZCBVUkxcbiAgICByZXR1cm4gdXJsT2JqLnRvU3RyaW5nKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lTG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuICAgIHR5cGUgPSBTa2luTG9hZGVycy5JZnJhbWVMb2FkZXJcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcbiAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQ6IEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmIChjb250YWluZXI/Lm5vZGVOYW1lID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnbmVlZHMgdG8gbG9hZCBpbnRvIGFuIGV4c2lzdGluZyBJZnJhbWUuLi4nLCB0eXBlZExvYWRlckNvbmZpZy51cmwsIGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSAoY29udGFpbmVyIGFzIEhUTUxJRnJhbWVFbGVtZW50KVxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zcmMgPSB0eXBlZExvYWRlckNvbmZpZy51cmxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ25lZWRzIHRvIGNyZWF0ZSBuZXcgSWZyYW1lLi4uJywgZG9tSWQsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0IDpcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIGlzc3VlIHRvIGxvYWQgaWZyYW1lIGluc2lkZSBhbiBpZnJhbWUgd2l0aCB0aGUgc2FtZSB1cmxcbiAgICAgICAgICAgIGxldCB1cmwybG9hZCA9IChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS51cmw7XG4gICAgICAgICAgICAvL2NvbnN0IHVuaXFVcmwgPSB1cmwybG9hZCA9PT0gZG9jdW1lbnQubG9jYXRpb24uaHJlZiA/IGFkZFF1ZXJ5UGFyYW0odXJsMmxvYWQsIFwiX21cIiwgZG9tSWQpIDogdXJsMmxvYWRcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faGFzUGFyZW50KVxuICAgICAgICAgICAgICAgIHVybDJsb2FkID0gYWRkUXVlcnlQYXJhbSh1cmwybG9hZCwgXCJfbXlvcC1jb21wXCIsIHVuaXFJZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IGhhbmRsZSAnc3R5bGUnIGF0dHIgbWVyZ2UgaGVyZVxuICAgICAgICAgICAgbGV0IGVsZW1lbnRBdHRyaWJ1dGVzU3RyaW5nID0gJyc7XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uZWxlbWVudEF0dHJpYnV0ZXMpXG4gICAgICAgICAgICAgICAgZWxlbWVudEF0dHJpYnV0ZXNTdHJpbmcgPSBPYmplY3QuZW50cmllcyhvcHRpb25zPy5lbGVtZW50QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJycgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7a2V5fT1cIiR7U3RyaW5nKHZhbHVlKX1cImA7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcgJyk7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQub3V0ZXJIVE1MID0gYDxpZnJhbWUgXG4gICAgICAgICAgICAgICBpZD1cIiR7ZG9tSWR9XCJcbiAgICAgICAgICAgICAgIHN0eWxlPVwiXG4gICAgICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAke3R5cGVkTG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQgfHwgIXR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodCA/ICcnIDogdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0fTsgICAgXG4gICAgICAgICAgICAgICAgICAgd2lkdGggOiAxMDAlO1xuICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJHtvcHRpb25zPy5oaWRkZW4gPyAnYWJzb2x1dGUnIDogJ3N0YXRpYyd9O1xuICAgICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICBzcmM9XCIke3VybDJsb2FkfVwiXG4gICAgICAgICAgICAke2VsZW1lbnRBdHRyaWJ1dGVzU3RyaW5nfVxuICAgICAgICAgICAgPjwvaWZyYW1lPmA7XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihgIyR7ZG9tSWR9YCkgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGRvbUlkKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgICAgIC8vTk8gOiBJZnJhbWVFbGVtZW50ID0gY29udGFpbmVyLmxhc3RFbGVtZW50Q2hpbGQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IG15b3BXZWJjb21wb25lbnRDb25zdHMgPSB7XG4gICAgd2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5OiAnbXlvcF93ZWJjb21wb25lbnRfbWVzc2FnZSdcbn1cbiIsICJpbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuLi8uLi93ZWJjb21wb25lbnQvY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge3NldERlYnVnU3R5bGV9IGZyb20gXCIuLi9jb21wb25lbnRDb3JlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wV2ViQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBjdXN0b21FbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50RGVmaW5pdGlvbiwgY29udGFpbmVyICwgb3B0aW9ucyk7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IGN1c3RvbUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q6IENsZWFudXBIYW5kbGVyID0gKCkgPT4ge1xuICAgIH1cblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSBzZXREZWJ1Z1N0eWxlKHRoaXMuaWQsICdNeW9wV2ViQ29tcG9uZW50JywgMCwgdGhpcy5jb250YWluZXIsIHRoaXMuY3VzdG9tRWxlbWVudCwgdGhpcy5jb21wb25lbnREZWZpbml0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3Q7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJyc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcnO1xuICAgIH1cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlPGFueT4pID0+IHtcbiAgICAgICAgbGV0IG1lc3NhZ2VfID0gey4uLm1lc3NhZ2V9IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAvL1RPRE8gOiBjYW4gYmUgZG9uZSB3aXRob3V0IGNsb25pbmc/XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZV8uaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuXG4gICAgICAgIGNvbnN0IG1zZyA9IG5ldyBDdXN0b21FdmVudDxCYXNlTXlvcE1lc3NhZ2U+KG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBkZXRhaWw6IG1lc3NhZ2VfLFxuICAgICAgICAgICAgLy8gYnViYmxlczogdHJ1ZSxcbiAgICAgICAgICAgIC8vIGNhbmNlbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgLy8gY29tcG9zZWQ6IHRydWVcbiAgICAgICAgfSlcblxuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmRpc3BhdGNoRXZlbnQobXNnKVxuXG4gICAgICAgIC8vc2VuZGluZyBkYXRhIGZyb20gaG9zdCB0byB0aGUgY29tcG9uZW50XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyBpZiAodGhpcy5jdXN0b21FbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgdGhpcy5jdXN0b21FbGVtZW50LmNoaWxkcmVuWzBdLmRpc3BhdGNoRXZlbnQobXNnKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGRpc3BhdGNoRXZlbnQnLCBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH1cblxuICAgIGRpc3Bvc2UgPSAoKSA9PiB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnBhcmVudE5vZGU/LnJlbW92ZUNoaWxkKHRoaXMuY3VzdG9tRWxlbWVudCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0LCB3YWl0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnLCBTa2luTG9hZGVyc30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5jb25zdCBzZWVuOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PiA9IHt9O1xuXG5leHBvcnQgY2xhc3MgV2ViY29tcG9uZW50TG9hZGVyIGV4dGVuZHMgQmFzZU15b3BMb2FkZXIge1xuXG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLldlYkNvbXBvbmVudExvYWRlclxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcpO1xuXG4gICAgICAgIGlmICghc2Vlbltsb2FkZXJDb25maWcudXJsXSkge1xuICAgICAgICAgICAgLy8gYXdhaXQgaW1wb3J0KCAvKiBAdml0ZS1pZ25vcmUgKi8gd2ViQ29tcG9uZW50TG9hZFVybCk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbW9kdWxlIGxvYWRlZCcpO1xuICAgICAgICAgICAgc2Vlbltsb2FkZXJDb25maWcudXJsXSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB3ZWJDb21wb25lbnRMb2FkVXJsID0gbG9hZGVyQ29uZmlnLnVybFxuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAgICAgICAgIHNjcmlwdC50eXBlID0gJ21vZHVsZSc7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHdlYkNvbXBvbmVudExvYWRVcmw7XG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNb2R1bGUgYWxyZWRheSBsb2FkZWQgb3IgaW4gbG9hZGluZyBwcm9jZXNzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBhd2FpdCBzZWVuW2xvYWRlckNvbmZpZy51cmxdO1xuXG4gICAgICAgIC8vVE9ETyA6IGFkZCByZXRyeSBtZWNoYW5pc20gaW4gZmFpbCBjYXNlLlxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2ssIHNob3VsZCBmaXggdGhlIHJhY2UgY29uZGl0aW9uIGZvciBsb2FkZWQgbW9kdWxlc1xuICAgICAgICBhd2FpdCB3YWl0KDEpO1xuXG4gICAgICAgIGxldCBkb21JZCA9IGBteW9wLWNvbXAtJHt1dWlkdjQoKX1gXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGxvYWRlckNvbmZpZy50YWcpO1xuXG4gICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb250YWluZXIuaWQuc3RhcnRzV2l0aCgnbXlvcC1jb21wLScpKSB7XG4gICAgICAgIC8vICAgICAvLyBpbiBwbGFjZSByZXBsYWNlbWVudFxuICAgICAgICAvLyAgICAgY29udGFpbmVyLnJlcGxhY2VXaXRoKGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgLy9jb250YWluZXIgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYob3B0aW9ucz8uX2Vudmlyb25tZW50KXtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGVsZW1lbnQuX215b3BFbnZpcm9ubWVudCA9IG9wdGlvbnM/Ll9lbnZpcm9ubWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcbiAgICAgICAgLy9lbGVtZW50LmlubmVySFRNTCA9IGA8JHtsb2FkZXJDb25maWcudGFnfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cblxufVxuIiwgImltcG9ydCB7QmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlciwgSG9zdGVkQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IHR5cGUgTWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHZvaWRcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VDb250ZXh0TWVzc2FnZUhhbmRsZXI8VCwgUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pj4ge1xuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IHN0cmluZ1xuXG4gICAgY29uc3RydWN0b3IobWVzc2FnZVRvSG9zdDogYW55LCBwdWJsaWMgY29udGV4dDogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PFNoYWRvd1Jvb3RSZWY+Pikge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG5cbiAgICBhYnN0cmFjdCBpbm5lckV4ZWN1dG9yOiAoZXZlbnQ6IFQsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHZvaWQ7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogVCkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBpZiAoZXZlbnQuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gZXZlbnQuZGVzdGluYXRpb247XG4gICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0W2Rlc3RpbmF0aW9uXS5jb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBwYXRjaCB0aGUgc291cmNlIGlkLCB0aGluayBhYm91dCB0aGF0ID9cbiAgICAgICAgICAgICAgICBjb25zdCBfbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5tZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBldmVudC5kZXN0aW5hdGlvbiA/IGV2ZW50LmRlc3RpbmF0aW9uIDogZXZlbnQuc291cmNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb246IGV2ZW50LnNvdXJjZSA/IGV2ZW50LnNvdXJjZSA6IGV2ZW50LmRlc3RpbmF0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0gYXMgQmFzZU15b3BNZXNzYWdlLCByZXBsYXlUbylcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbm5lckV4ZWN1dG9yKGV2ZW50LCB0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQsIF9tZXNzYWdlVG9Ib3N0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcEF0dHJpYnV0ZXMgPSB7XG4gICAgaWQ6ICdteW9wLWlkJ1xufVxuIiwgImltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7UmVmfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRzQnlSZWYgPSAocmVmOiBSZWYsIGVsOiBQYXJlbnROb2RlKSA9PiB7XG4gICAgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtyZWYucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRGaXJzdEVsZW1lbnRCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICBjb25zdCBlbGVtZW50cyA9IGdldEVsZW1lbnRzQnlSZWYocmVmLCBlbCk7XG4gICAgaWYgKGVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZWxlbWVudHMuaXRlbSgwKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59IiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEJpbmRPbkNsaWNrSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxCaW5kQ2xpY2tNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5CaW5kQ2xpY2tNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQmluZENsaWNrTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpXG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBDbGlja1JlcGxheU1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VUZXh0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxNeW9wRWxlbWVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNoYW5nZVRleHRNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnRleHRDb250ZW50ID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSb290UmVmfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTaGFkb3dSb290UmVmIGV4dGVuZHMgUm9vdFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHB1YmxpYyBzaGFkb3dSb290OiBTaGFkb3dSb290KSB7XG4gICAgICAgIHN1cGVyKGNvbnRhaW5lciwgc2hhZG93Um9vdCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuZXhwb3J0IGNsYXNzIERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8RGV0ZWN0TXlvcFJlZnNNZXNzYWdlPiB7XG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG5cbiAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgY29uc3QgYWxsTXlvcEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcblxuICAgICAgICBsZXQgbXlvcFJlZnM6IE15b3BFbGVtZW50UmVmW10gPSBbXTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IHRha2UgdGhhdCBiYWNrIHRvIHRoZSBkYXNoYm9hcmQ/XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKGl0ZW0sIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuXG4gICAgICAgICAgICBjb25zdCBteW9wSWQgPSBpdGVtLmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG5cbiAgICAgICAgICAgIGlmIChteW9wSWQpIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCd3YyByZWN0JywgIGl0ZW0ucGFyZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSlcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgbXlvcFJlZnMucHVzaChuZXcgTXlvcEVsZW1lbnRSZWYobXlvcElkLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGl0ZW0ub2Zmc2V0VG9wLCBpdGVtLm9mZnNldExlZnQpKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBteW9wUmVmcykpXG4gICAgfTtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkRldGVjdE15b3BSZWZzTWVzc2FnZTtcblxuXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBzZXRBdHRyaWJ1dGVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldEF0dHJpYnV0ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldEF0dHJpYnV0ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBTZXRBdHRyaWJ1dGVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZShldmVudC5uYW1lLCBldmVudC52YWx1ZSlcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLFxuICAgIEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UsXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY2xhc3MgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8QWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGluIGZhY3Qgd2hlbiBydW5uaW5nIGluIFdlYkNvbXBvbmVudCB3ZSBjYW4gdHJhbnNmZXIgdGhlIG9yaWdpbmFsIGVcbiAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgdXNpbmcgbWFrZVNlcmlhbGl6YWJsZSBmb3IgbmVzdGVkIGNhc2VzLCB0aGluayBhYm91dCB0aGF0XG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsICBtYWtlU2VyaWFsaXphYmxlKGUsIGV2ZW50LnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LnR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4gdGFzaygpKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtIb3N0U0RLfSBmcm9tIFwiLi4vLi4vaG9zdC9ob3N0U0RLXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZVwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIsIE1lc3NhZ2VUb0hvc3R9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG5cbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9jb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZj8ucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG4gICAgICAgICAgICBjb25zdCBhbGxJdGVtcyA9IHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuXG4gICAgICAgICAgICBpZiAoYWxsSXRlbXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG9zdFNESyA9IEhvc3RTREsuSW5zdGFuY2UoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZXZlbnQub3B0aW9ucy5pZCkhO1xuICAgICAgICAgICAgICAgIGlmIChyZWZDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8vLz4+Pj5cbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LmRpc3Bvc2UoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgLy8gIGNvbnNvbGUubG9nKGBmYWlsZWQgdG8gZmluZCAke2V2ZW50Lm9wdGlvbnMuaWR9IGluIG1lbSBzY29wZWAsIGhvc3RTREspO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL3dlIGhhdmUgdGhlIHJlZiBjb21wb25lbnQgaW4gb3VyIEhvc3RTREsgKHNhbWUgbWVtb3J5IHdoZW4gdXNpbmcgd2ViY29tcG9uZW50KVxuICAgICAgICAgICAgICAgIC8vICByZWZDb21wb25lbnQucGFyZW50ID0gaW1wbGVtZW50YXRpb25Db21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy9kZWxldGUgdGhlIHJlZiBjb21wb25lbnRcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGhvc3RTREsuY29tcG9uZW50cy5pbmRleE9mKHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBob3N0U0RLLmNvbXBvbmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCByZW1vdmVkIHRlbXAgcmVmIGNvbXBvbmVudCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQgdXNpbmcgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW1wbGVtZW50YXRpb25Db21wb25lbnQgPSBhd2FpdCBob3N0U0RLLmxvYWRDb21wb25lbnQoZXZlbnQubmVzdGVkQ29tcG9uZW50Q29uZmlnLFxuICAgICAgICAgICAgICAgICAgICBhbGxJdGVtcy5pdGVtKDApLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5vcHRpb25zKVxuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm8gbmVlZCB0aGlzLCBwYXNzIG9wdGlvbnMgZnJvbSBwYXJlbnRcbiAgICAgICAgICAgICAgICAvL2ltcGxlbWVudGF0aW9uQ29tcG9uZW50LmlkID0gZXZlbnQucHJlZGVmaW5lZElkO1xuICAgICAgICAgICAgICAgIC8vcmVmQ29tcG9uZW50LmlkICs9ICcuJztcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IG5vdCByZWFsbHkgbmVlZGVkID9cbiAgICAgICAgICAgICAgICAvLyBhd2FpdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5pbml0aWF0ZWQoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFJlZkNvbmZpZzogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudC5yZWZzW3JlZk5hbWVdO1xuICAgICAgICAgICAgICAgICAgICByZWYgPSByZWYuX19ub25Qcm94aWVkIHx8IHJlZjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmVzdGVkUmVmQ29uZmlnLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbklkOiAocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBuZXN0ZWRSZWZDb25maWcpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgLSBET00gZWxlbWVudCBub3QgZm91bmQnKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UoZXZlbnQuaGFuZGxlclVuaXF1ZUlkLCBbXSwgdHJ1ZSkpO1xuXG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVSZWYoKS50aGVuKClcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCByZXBsaWVyOiAoZGF0YTogYW55KSA9PiB2b2lkLCByb290UmVmOiBSb290UmVmKSA9PiB7XG4gICAgY29uc3QgX19zY3JpcHRJbnB1dHMgPSBldmVudC5zY3JpcHRJbnB1dHMgPyBldmVudC5zY3JpcHRJbnB1dHMgOiB7fVxuICAgIF9fc2NyaXB0SW5wdXRzLm1ha2VTZXJpYWxpemFibGUgPSBtYWtlU2VyaWFsaXphYmxlO1xuXG4gICAgX19zY3JpcHRJbnB1dHMuc2VuZCA9IHJlcGxpZXI7XG4gICAgX19zY3JpcHRJbnB1dHMucm9vdFJlZiA9IHJvb3RSZWY7XG4gICAgX19zY3JpcHRJbnB1dHMuX19zY3JpcHRJbnB1dHMgPSBfX3NjcmlwdElucHV0cztcblxuICAgIGNvbnN0IGR5bmFtaWNGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbihgcmV0dXJuICgke2V2ZW50LnNjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICBjb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24oX19zY3JpcHRJbnB1dHMpO1xuXG4gICAgLy8gY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gRnVuY3Rpb24oJ3NlbmQnLCAncm9vdFJlZicsJ19fc2NyaXB0SW5wdXRzJywgLi4uT2JqZWN0LmtleXMoX19zY3JpcHRJbnB1dHMpLCBldmVudC5jb250ZW50ID8gZXZlbnQuY29udGVudCA6ICcnKVxuICAgIC8vY29uc3QgcmV0ID0gZHluYW1pY0Z1bmN0aW9uKHJlcGxpZXIsIHJvb3RSZWYsIF9fc2NyaXB0SW5wdXRzLCAuLi5PYmplY3QudmFsdWVzKF9fc2NyaXB0SW5wdXRzKSk7XG4gICAgcmVwbGllcihyZXQpO1xufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZSwgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3J9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0SGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVTY3JpcHRNZXNzYWdlXG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIGRhdGEpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yKGV2ZW50LCByZXBsaWVyLCBzaGFkb3dSb290UmVmKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UsIEZvcm1EYXRhRW50cnksIEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UsIElucHV0RWxlbWVudFZhbHVlLH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHMudHNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IGdldElucHV0VmFsdWUgPSAoZWxlbWVudCk6IElucHV0RWxlbWVudFZhbHVlID0+IHtcbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgLy8gQ2hlY2sgaWYgaXQncyBhIGZvcm1cbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IGRhdGFPYmplY3Q6IElucHV0RWxlbWVudFZhbHVlID0ge1xuICAgICAgICAgICAgZm9ybURhdGE6IHt9LFxuICAgICAgICAgICAgdW5tYXBwZWREYXRhOiBbXVxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIE1hbnVhbGx5IGFkZCBlbGVtZW50cyB3aXRob3V0IG5hbWVzXG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYScpO1xuICAgICAgICBsZXQgYXV0b05hbWVJbmRleGVyID0gLTE7XG5cbiAgICAgICAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWxlbWVudC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBteW9wSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShteW9wQXR0cmlidXRlcy5pZCk7XG4gICAgICAgICAgICAgICAgbGV0IGtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCduYW1lJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBgXyR7KCsrYXV0b05hbWVJbmRleGVyKX1gXG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlRGF0YTogRm9ybURhdGFFbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGdldElucHV0VmFsdWUoZWxlbWVudCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBlbGVtZW50LnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICB2YWxpZGl0eTogbWFrZVNlcmlhbGl6YWJsZShlbGVtZW50LnZhbGlkaXR5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgbXlvcElkLFxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgbWVzc2FnZVRvSG9zdChuZXcgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZShnZXRJbnB1dFZhbHVlKGl0ZW0pKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7TXlvcEVsZW1lbnRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IE15b3BFbGVtZW50TWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZikgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tICdAbXlvcC9zZGsvd2ViY29tcG9uZW50JztcbiAqIGBgYFxuICpcbiAqL1xuaW1wb3J0IHtCYXNlTXlvcFNES30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BXZWJjb21wb25lbnRDb25zdHN9IGZyb20gXCIuL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmluZE9uQ2xpY2tIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYmluZE9uQ2xpY2tIYW5kbGVyXCI7XG5pbXBvcnQge0NoYW5nZVRleHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvY2hhbmdlVGV4dEhhbmRsZXJcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvYWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIudHNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuICogVGhlIFdlYmNvbXBvbmVudCBTREsgaXMgdGFpbG9yZWQgZm9yIHVzaW5nIE15b3AgY29tcG9uZW50cyBwYWNrYWdlZCBhcyBzZXBhcmF0ZSBidW5kbGVzIGFuZCBleHBvc2VkIGFzIHdlYiBjb21wb25lbnRzLjxici8+XG4gKiBEZXZlbG9wZXJzIGltcG9ydGluZyB0aGlzIFNESyBjYW4gbGV2ZXJhZ2UgQVBJcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljYWxseSBjcmFmdGVkIHRvIHN1cHBvcnQgdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IGFuZCBjb21tdW5pY2F0aW9uIHBhdHRlcm5zIHJlcXVpcmVkIGZvciB3ZWIgY29tcG9uZW50cyB3aXRoaW4gdGhlIE15b3AgYXJjaGl0ZWN0dXJlLjxici8+XG4gKiBUaGlzIFNESyBwcm9tb3RlcyByZXVzYWJpbGl0eSBhbmQgZW5jYXBzdWxhdGlvbiwgZW5hYmxpbmcgZGV2ZWxvcGVycyB0byBidWlsZCBtb2R1bGFyLCBzZWxmLWNvbnRhaW5lZCBjb21wb25lbnRzIHRoYXQgY2FuIGJlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uJ3MgRE9NIHN0cnVjdHVyZS5cbiAqXG4gKlxuICogT25jZSBsb2FkZWQgdGhlIGBSb290IFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiAqIGBgYGpzXG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICogb3JcbiAqIGBgYHRzXG4gKiBpbXBvcnQge2dldFdlYmNvbXBvbmVudE1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpKTtcbiAqIGBgYFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkNvbXBvbmVudFNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIGFsd2F5c1Bhc3NFbnZlbG9wZXNUb0hvc3QgPSB0cnVlO1xuXG4gICAgLy93aGVuIG5ldyB3ZWIgY29tcG9uZW50IGNyZWF0ZWQuXG4gICAgY29ubmVjdGVkQ2FsbGJhY2sgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCwgc2hhZG93OiBTaGFkb3dSb290KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKG15b3BXZWJjb21wb25lbnRDb25zdHMud2ViY29tcG9uZW50X21lc3NhZ2Vfa2V5LCAoZTogYW55KSA9PiB7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZS5kYXRhID8gZS5kYXRhIDogZS5kZXRhaWw7XG4gICAgICAgICAgICBpZiAoIWV2ZW50Q29udGVudCB8fCAhZXZlbnRDb250ZW50Lm15b3ApIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlY3ZpZWQgd2ViY29tcG9uZW50X21lc3NhZ2Ugd2l0aCB3cm9uZyB0eXBlJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBzZW5kIGNvbnRhaW5lciAvIGNvbXBvZW5udCBpZGVudGlmaWVyIGZvciBtdWx0aWwgY29tcG9uZW50cyBzdXBwb3J0XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbmNvbWVNZXNzYWdlcyhlKVxuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbml0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0NvbXBvbmVudElkID0gKG1lc3NhZ2UgYXMgSW5pdE1lc3NhZ2UpLmNvbnRlbnQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0uY29udGV4dCA9IG5ldyBTaGFkb3dSb290UmVmKGNvbnRhaW5lciwgc2hhZG93KVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc3VwcG9ydGVkSGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGhhbmRsZXIuY29udGV4dCA9IHRoaXMuc2hhZG93Um9vdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrLiByYWNlIGNvbmRpdGlvbiB3aXRoIGhvc3QubG9hZCB3aGVuIG1vZHVsZSBsb2FkZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgICAgIH0sIDEpXG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cFxuICAgICAgICAvL21lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZDtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyICYmIHJlcGxheVRvPy5oYW5kbGVyVW5pcXVlSWQpXG4gICAgICAgICAgICBtZXNzYWdlLnJlcGxheVRvSGFuZGxlciA9IHJlcGxheVRvLmhhbmRsZXJVbmlxdWVJZFxuXG4gICAgICAgIHdpbmRvdy5teW9wLmhvc3RTREsuc2VuZChtZXNzYWdlKVxuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IFNldElubmVySHRtbEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgLy9cbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgLy90aGlzLm15Q29tcG9uZW50SWRcbiAgICAgICAgLy90aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzXG4gICAgfVxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdXZWJDb21wb25lbnRTREsnLCBXZWJDb21wb25lbnRTREspO1xuIiwgImV4cG9ydCAqIGZyb20gXCIuL1dlYkNvbXBvbmVudFNES1wiO1xuIiwgImltcG9ydCB7TXlvcFdlYkNvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtCYXNlTXlvcExvYWRlcn0gZnJvbSBcIi4vSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7XG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUhUTUxMb2FkZXJDb25maWcsXG4gICAgSVNraW5Db25maWcsIFNoYWRvd1Jvb3RNb2RlVHlwZSxcbiAgICBTa2luTG9hZGVyc1xufSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge1dlYkNvbXBvbmVudFNES30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudFwiO1xuaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50LnRzXCI7XG4vL2ltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tIFwiLi4vLi4vU0RLLnRzXCI7XG5cbmNvbnN0IHNlZW46IHN0cmluZ1tdID0gW107XG5sZXQgc2RrO1xuY29uc3QgZ2V0SW5pdGlhdGVkU2RrID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc2RrKSB7XG4gICAgICAgIC8vY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSBhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKVxuICAgICAgICBzZGsgPSBuZXcgV2ViQ29tcG9uZW50U0RLKCk7XG4gICAgICAgIHNkay5pbml0KCk7XG4gICAgfVxuICAgIHJldHVybiBzZGs7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbFN0cmluZzogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpOiBuZXcgKCkgPT4gSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiBjbGFzcyBleHRlbmRzIEhUTUxFbGVtZW50IHtcblxuICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHtcbiAgICAgICAgICAgIGNvbnN0IG1vZGUgPSBTaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLm9wZW4gPyAnb3BlbicgOiAnY2xvc2VkJztcbiAgICAgICAgICAgIGNvbnN0IHNoYWRvdyA9IHRoaXMuYXR0YWNoU2hhZG93KHttb2RlfSk7XG4gICAgICAgICAgICBnZXRJbml0aWF0ZWRTZGsoKS50aGVuKChzZGspID0+IHtcbiAgICAgICAgICAgICAgICBzZGsuY29ubmVjdGVkQ2FsbGJhY2sodGhpcywgc2hhZG93KTtcbiAgICAgICAgICAgICAgICBzaGFkb3cuaW5uZXJIVE1MID0gaHRtbFN0cmluZ1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH07XG59XG5cbmNvbnN0IGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudCA9IChjb21wb25lbnROYW1lOiBzdHJpbmcsIGh0bWw6IHN0cmluZywgU2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlKSA9PiB7XG4gICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGNvbXBvbmVudE5hbWUsIGNyZWF0ZUhUTUxFbGVtZW50Q29uc3RydWN0b3IoaHRtbCwgU2hhZG93Um9vdE1vZGUpKTtcbiAgICBjb25zb2xlLmxvZyhgZGVmaW5lKCcke2NvbXBvbmVudE5hbWV9Jykgd2FzIGNhbGxlZCwgd2ViIGNvbXBvbmVudCByZWFkeSB0byB1c2VgKTtcbn1cblxuY29uc3QgdG9XZWJDb21wb25lbnROYW1lID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBzdHJcbiAgICAgICAgLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIHVwcGVyY2FzZSBsZXR0ZXJzXG4gICAgICAgIC5yZXBsYWNlKC8oXFxkKykvZywgJy0kMScpIC8vIEFkZCBoeXBoZW4gYmVmb3JlIGRpZ2l0c1xuICAgICAgICAudG9Mb3dlckNhc2UoKTsgLy8gQ29udmVydCB0byBsb3dlcmNhc2Vcbn1cblxuY29uc3QgdG9DdXN0b21FbGVtZW50TmFtZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICBuYW1lID0gdG9XZWJDb21wb25lbnROYW1lKG5hbWUpO1xuICAgIHJldHVybiBuYW1lLnJlcGxhY2UoL18vZywgJy0nKTtcbn1cblxubGV0IHBhcnNlcjogRE9NUGFyc2VyOyAvLyA9IG5ldyBET01QYXJzZXIoKTtcblxuZXhwb3J0IGNsYXNzIEhUTUxDb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuSFRNTExvYWRlclxuXG4gICAgbG9hZCA9IGFzeW5jIChjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIG9wdGlvbnM/OiBsb2FkZXJPcHRpb25zKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbG9hZGVyQ29uZmlnID0gKHNraW4ubG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnKTtcbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgbGV0IGVsZW1lbnQ7XG5cbiAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLmxvY2FsRnJhbWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXFJZCA9IHV1aWR2NCgpO1xuICAgICAgICAgICAgY29uc3QgZG9tSWQgPSBgbXlvcC1jb21wLSR7dW5pcUlkfWBcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ25lZWRzIHRvIGNyZWF0ZSBuZXcgSWZyYW1lLi4uJywgZG9tSWQsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcbiAgICAgICAgICAgIGxldCBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5pZCA9IGRvbUlkO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYFxuICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgICAgICAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6ICR7b3B0aW9ucz8uaGlkZGVuID8gJzAnIDogJzEnfTtcbiAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICR7b3B0aW9ucz8uaGlkZGVuID8gJ2Fic29sdXRlJyA6ICdzdGF0aWMnfTtcbiAgICAgICAgICAgICAgICAgICBwb2ludGVyLWV2ZW50czogJHtvcHRpb25zPy5oaWRkZW4gPyAnbm9uZScgOiAnYWxsJ307XG4gICAgICAgICAgICAgICBgKTtcbiAgICAgICAgICAgIC8vICBoZWlnaHQ6ICR7dHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCB8fCAhdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0ID8gJycgOiB0eXBlZExvYWRlckNvbmZpZy5oZWlnaHR9O1xuXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoSWZyYW1lRWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIGNvbnRlbnQgaW50byB0aGUgaWZyYW1lXG4gICAgICAgICAgICAvL0B0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IElmcmFtZUVsZW1lbnQuY29udGVudERvY3VtZW50IHx8IElmcmFtZUVsZW1lbnQuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgICAgICAgICAgIGRvYy5vcGVuKCk7XG5cblxuICAgICAgICAgICAgbGV0IEhUTUwyUmVuZGVyID0gbG9hZGVyQ29uZmlnLkhUTUw7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5faW5zcGVjdGlvbikge1xuICAgICAgICAgICAgICAgIC8vaW5qZWN0IGluc3BlY3Rpb24gc2NyaXB0IGZvciBwcm9wcyBkZXRlY3Rpb25cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcblxuICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBpbmplY3RlZCBIVE1MIHN0cmluZyBpbnRvIGEgbm9kZVxuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXAgPSBfZG9jLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgpO1xuICAgICAgICAgICAgICAgIHRlbXAuYm9keS5pbm5lckhUTUwgPSBgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJlZm9yZUtleXNXaW5kb3cgPSBuZXcgU2V0KE9iamVjdC5rZXlzKHdpbmRvdykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3BTdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmVLZXlzV2luZG93LFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICA8L3NjcmlwdD5gO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHRlbXAuYm9keS5maXJzdENoaWxkO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUgJiYgX2RvYy5oZWFkKSB7XG4gICAgICAgICAgICAgICAgICAgIF9kb2MuaGVhZC5pbnNlcnRCZWZvcmUoX2RvYy5pbXBvcnROb2RlKG5vZGUsIHRydWUpLCBfZG9jLmhlYWQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgSFRNTDJSZW5kZXIgPSBfZG9jLmRvY3VtZW50RWxlbWVudC5vdXRlckhUTUw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRvYy53cml0ZWxuKEhUTUwyUmVuZGVyKTtcbiAgICAgICAgICAgIGRvYy53cml0ZWxuKGA8c2NyaXB0IHNyYz1cIiR7d2luZG93Lm15b3AuX19ST09UX1NES19QVUJMSUNfVVJMX199XCI+PC9zY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgIDxzY3JpcHQ+XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXyA9IFxuICAgICAgICAgICAgICAgICAgICB7IC4uLndpbmRvdy5fX2ZlZGVyYXRpb25fXyxcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogZ2V0IGZyb20gRU5WIGF0IGJ1aWxkIHRpbWUsIFxuICAgICAgICAgICAgICAgICAgICAvLyBpbmplY3QgdmFsdWUgdG8gbW9kdWxlIGF0IGJ1aWxkIHRpbWUgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRvZGF5IHdlIGRvaW5nIHNvIGp1c3QgZm9yIHRoZSBDSlMgdmVyc2lvbiBcbiAgICAgICAgICAgICAgICAgICAgX19wdWJsaWNfcGF0aF9fIDonaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQnLFxuICAgICAgICAgICAgICAgICAgICAgLi4uJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgd2luZG93Ll9fZmVkZXJhdGlvbl9fKX19O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX19teW9wX2luaXQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2RrID0gbmV3IElmcmFtZVNESygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2RrLmluaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIF9fbXlvcF9pbml0KCkudGhlbigpO1xuICAgICAgICAgICAgICA8L3NjcmlwdD5gKTtcblxuICAgICAgICAgICAgZG9jLmNsb3NlKCk7XG5cbiAgICAgICAgICAgIC8vIFRPRE8gOiBjb250cm9sIGZyb20gZGFzaGJvYXJkXG4gICAgICAgICAgICAvLyAgKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLmF1dG9IZWlnaHQgPSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjb21wID0gbmV3IE15b3BJZnJhbWVDb21wb25lbnQoY29tcG9uZW50RGVmaW5pdGlvbiwgc2tpbiwgY29udGFpbmVyLCBJZnJhbWVFbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXAub2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIGNvbXAucHJvcHMuX2dsb2JhbCA9IGNvbXAuZWxlbWVudC5jb250ZW50V2luZG93O1xuICAgICAgICAgICAgcmV0dXJuIGNvbXA7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZXJDb25maWcuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5ub25lKSB7XG4gICAgICAgICAgICAvLyBwYXJzZXIgPSBwYXJzZXIgPyBwYXJzZXIgOiBuZXcgRE9NUGFyc2VyKCk7XG4gICAgICAgICAgICAvLyBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGxvYWRlckNvbmZpZy5IVE1MLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgICAvLyBlbGVtZW50ID0gZG9jLmJvZHkuZmlyc3RDaGlsZDtcbiAgICAgICAgICAgIC8vZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgZG9tSWQpO1xuXG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7XG4gICAgICAgICAgICB0ZW1wbGF0ZS5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDsvLy50cmltKCk7XG4gICAgICAgICAgICBlbGVtZW50ID0gdGVtcGxhdGUuY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgLy8gICBjb25zdCBmaXJzdEVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgLy8gICBjb25zdCB6ID0gZmlyc3RFbGVtZW50ID8gZmlyc3RFbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA6IG51bGw7XG4gICAgICAgICAgICAvLyAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gICBjb25zb2xlLmxvZyh0ZW1wbGF0ZSwgZmlyc3RFbGVtZW50LCB6KVxuICAgICAgICAgICAgLy8gICBlbGVtZW50ID0gZmlyc3RFbGVtZW50XG5cbiAgICAgICAgICAgIC8vIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3Rib2R5Jyk7XG4gICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIGNvbnRhaW5lci5pbm5lckhUTUwgPSBsb2FkZXJDb25maWcuSFRNTDtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBjb250YWluZXIuZmlyc3RFbGVtZW50Q2hpbGQ7XG5cbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayhlbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjdXN0b21FbGVtZW50TmFtZSA9IHRvQ3VzdG9tRWxlbWVudE5hbWUoY29tcG9uZW50RGVmaW5pdGlvbi5uYW1lICsgc2tpbi5pZCk7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IHN1cHBvcnQgcmVkZWZpbmUgIVxuICAgICAgICAgICAgaWYgKCFzZWVuLmluY2x1ZGVzKGN1c3RvbUVsZW1lbnROYW1lKSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZUN1c3RvbVdlYkNvbXBvbmVudChjdXN0b21FbGVtZW50TmFtZSwgbG9hZGVyQ29uZmlnLkhUTUwsIGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSk7XG4gICAgICAgICAgICAgICAgc2Vlbi5wdXNoKGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGN1c3RvbUVsZW1lbnROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICBpZiAoIWNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKCdbaWRePVwibXlvcC1jb21wLVwiXScpKVxuICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgIC8vZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIGVsZW1lbnQuaWQgPSBkb21JZDtcblxuICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUud2lkdGggPSAnMCdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiAoY29udGFpbmVyLmlkLnN0YXJ0c1dpdGgoJ215b3AtY29tcC0nKSkge1xuICAgICAgICAvLyAgICAgLy8gaW4gcGxhY2UgcmVwbGFjZW1lbnRcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5yZXBsYWNlV2l0aChlbGVtZW50KTtcbiAgICAgICAgLy8gICAgIC8vY29udGFpbmVyID0gZWxlbWVudC5wYXJlbnRFbGVtZW50ITtcbiAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgLy8gICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCBlbGVtZW50LCBvcHRpb25zKTtcblxuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2N1c3RvbUVsZW1lbnROYW1lfSAvPmA7XG4gICAgICAgIHJldHVybiBuZXcgTXlvcFdlYkNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSAqIGFzIENTUyBmcm9tIFwiY3NzdHlwZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7dXVpZHY0fSBmcm9tIFwiLi4vdXRpbHMvdXRpbHMudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG4vLyBpZ25vcmluZyBkb2N1bWVudGF0aW9uXG4vKiogQGlnbm9yZSAqL1xuZXhwb3J0IGludGVyZmFjZSBDU1NQcm9wZXJ0aWVzIGV4dGVuZHMgQ1NTLlByb3BlcnRpZXM8c3RyaW5nIHwgbnVtYmVyPiB7XG59XG5cbmV4cG9ydCB0eXBlIFN0eWxlc2hlZXREZWZpbml0aW9uID0geyBba2V5OiBzdHJpbmddOiBDU1NQcm9wZXJ0aWVzIH07XG5cbmV4cG9ydCBjb25zdCBhcHBseVN0eWxlc2hlZXQgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgc3R5bGVzaGVldDogU3R5bGVzaGVldERlZmluaXRpb24sIGNzcz86IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHRhZ0lkID0gYG15b3AtY3NzLSR7dXVpZHY0KCl9YDtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfc3R5bGVzaGVldCwgX3RhZ0lkLCBfY3NzfSkgPT4ge1xuICAgICAgICBjb25zdCBzdHlsZVRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgICAgIHN0eWxlVGFnLnR5cGUgPSAndGV4dC9jc3MnO1xuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBDU1Mgc3RyaW5nIGZyb20gdGhlIHN0eWxlcyBvYmplY3RcbiAgICAgICAgbGV0IGNzc1N0cmluZyA9IF9jc3M7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWxlY3RvciBpbiBfc3R5bGVzaGVldCkge1xuICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3NlbGVjdG9yfSB7IGA7XG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gX3N0eWxlc2hlZXRbc2VsZWN0b3JdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBwcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgY3NzU3RyaW5nICs9IGAke3Byb3BlcnR5fTogJHtwcm9wZXJ0aWVzW3Byb3BlcnR5XX07IGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjc3NTdHJpbmcgKz0gJ30gJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB0aGUgQ1NTIHN0cmluZyBhcyB0aGUgY29udGVudCBvZiB0aGUgPHN0eWxlPiBlbGVtZW50XG4gICAgICAgIHN0eWxlVGFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc1N0cmluZykpO1xuICAgICAgICBzdHlsZVRhZy5pZCA9IF90YWdJZDtcbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQoc3R5bGVUYWcpO1xuXG4gICAgfSwgKCkgPT4ge1xuICAgIH0sIHtcbiAgICAgICAgX3N0eWxlc2hlZXQ6IHN0eWxlc2hlZXQsXG4gICAgICAgIF9jc3MgOiBjc3MgPyBjc3MgOiAnJyxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgYXBwbHlTdHlsZXNoZWV0TGluayA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBsaW5rOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCB0YWdJZCA9IGBteW9wLWNzcy0ke3V1aWR2NCgpfWA7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkLCBfbGlua30pID0+IHtcbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7XG4gICAgICAgIGxpbmtFbGVtZW50LmlkID0gX3RhZ0lkO1xuICAgICAgICBsaW5rRWxlbWVudC5yZWwgPSAnc3R5bGVzaGVldCc7XG4gICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBfbGluaztcbiAgICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgLy8gQXBwZW5kIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgKHJvb3RSZWYuc2hhZG93Um9vdCB8fCByb290UmVmLmNvbnRhaW5lcikuYXBwZW5kQ2hpbGQobGlua0VsZW1lbnQpO1xuICAgIH0sICgpID0+IHtcbiAgICB9LCB7XG4gICAgICAgIF9saW5rIDogbGluayxcbiAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgIH0pKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF90YWdJZH0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSAocm9vdFJlZi5zaGFkb3dSb290IHx8IGRvY3VtZW50KS5nZXRFbGVtZW50QnlJZChfdGFnSWQpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAoKSA9PiB7XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIF90YWdJZDogdGFnSWRcbiAgICAgICAgfSkpXG4gICAgfVxufVxuIiwgImltcG9ydCB7SUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IHR5cGUgVG9rZW5NYXAgPSBSZWNvcmQ8c3RyaW5nLCBzdHJpbmd8IG51bWJlcj5cblxuY29uc3QgcmVwbGFjZVRva2VucyA9IChpbnB1dDogc3RyaW5nLCB0b2tlbk1hcDogVG9rZW5NYXApOiBzdHJpbmcgPT4ge1xuICAgIC8vIENyZWF0ZSBhIHJlZ2V4IHBhdHRlcm4gZnJvbSB0aGUga2V5cyBvZiB0aGUgdG9rZW5NYXBcbiAgICBjb25zdCBwYXR0ZXJuID0gbmV3IFJlZ0V4cChPYmplY3Qua2V5cyh0b2tlbk1hcCkuam9pbignfCcpLCAnZycpO1xuXG4gICAgLy8gUmVwbGFjZSB0b2tlbnMgaW4gdGhlIGlucHV0IHN0cmluZyB1c2luZyB0aGUgcmVnZXhcbiAgICByZXR1cm4gaW5wdXQucmVwbGFjZShwYXR0ZXJuLCAobWF0Y2hlZCkgPT4ge1xuICAgICAgICAvLyBSZXR1cm4gdGhlIHJlcGxhY2VtZW50IHZhbHVlIGZyb20gdGhlIHRva2VuTWFwXG4gICAgICAgIHJldHVybiAodG9rZW5NYXBbbWF0Y2hlZF0gfHwgbWF0Y2hlZCkudG9TdHJpbmcoKTtcbiAgICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGNyZWF0ZUlmcmFtZVNraW5CeVRva2VuaXplciA9IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnLCB0b2tlbk1hcDogVG9rZW5NYXApID0+IHtcbiAgICBjb25zdCB0eXBlZFNraW5Db25maWcgPSAoc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKVxuICAgIGlmICh0eXBlZFNraW5Db25maWcudHlwZSAhPT0gJ0lmcmFtZUxvYWRlcicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpZnJhbWVTa2luVXJsVG9rZW5pemVyIHJlY2VpdmVkIHNraW4gd2l0aCBsb2FkZXIgdHlwZSBcIiR7dHlwZWRTa2luQ29uZmlnLnR5cGV9XCIsIGN1cnJlbnRseSBvbmx5IFwiSWZyYW1lTG9hZGVyXCIgaXMgc3VwcG9ydGVkYClcbiAgICB9XG5cbiAgICBzZWxlY3RlZFNraW4ubG9hZGVyID0ge1xuICAgICAgICAuLi5zZWxlY3RlZFNraW4ubG9hZGVyXG4gICAgfVxuXG4gICAgc2VsZWN0ZWRTa2luLmxvYWRlci51cmwgPSByZXBsYWNlVG9rZW5zKHNlbGVjdGVkU2tpbi5sb2FkZXIudXJsLCB0b2tlbk1hcCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRTa2luO1xufVxuXG5leHBvcnQgY29uc3QgY2hhbmdlU2tpblVybEJ5VG9rZW5pemVyID0gKHRva2VuTWFwOiBUb2tlbk1hcCkgPT4ge1xuICAgIHJldHVybiBhc3luYyAoc2VsZWN0ZWRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuICAgICAgICByZXR1cm4gY3JlYXRlSWZyYW1lU2tpbkJ5VG9rZW5pemVyKHNlbGVjdGVkU2tpbiwgdG9rZW5NYXApO1xuICAgIH1cbn0iLCAiaW1wb3J0IHtDdXN0b21SZWZNZXNzYWdlfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi9ob3N0XCI7XG5cbi8vIGNvbnN0IHNwYWNlID0gJyAnO1xuLy8gZXhwb3J0IGNvbnN0IGdldENsYXNzZXMgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYpOiBQcm9taXNlPHN0cmluZ1tdPiA9PiAoYXdhaXQgZXhlYyhhY3RBczxIVE1MRGl2RWxlbWVudD4oY29ubmVjdGVkUmVmKS5jbGFzc0xpc3QpKS52YWx1ZS5zcGxpdChzcGFjZSk7XG4vLyBleHBvcnQgY29uc3QgYWRkQ2xhc3MgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYsIGNsYXNzTmFtZTogc3RyaW5nKSA9PiB7XG4vLyAgICAgY29uc3QgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICBjbGFzc2VzLmluY2x1ZGVzKGNsYXNzTmFtZSkgfHwgY2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7XG4vLyAgICAgLy8gQHRzLWlnbm9yZVxuLy8gICAgIGNvbm5lY3RlZFJlZi5jbGFzc0xpc3QgPSBjbGFzc2VzLmpvaW4oc3BhY2UpO1xuLy8gfVxuLy8gZXhwb3J0IGNvbnN0IHJlbW92ZUNsYXNzID0gYXN5bmMgKGNvbm5lY3RlZFJlZjogUmVmLCBjbGFzc05hbWU6IHN0cmluZywpID0+IHtcbi8vICAgICBsZXQgY2xhc3NlcyA9IGF3YWl0IGdldENsYXNzZXMoY29ubmVjdGVkUmVmKTtcbi8vICAgICAvLyBAdHMtaWdub3JlXG4vLyAgICAgY29ubmVjdGVkUmVmLmNsYXNzTGlzdCA9IGNsYXNzZXMuZmlsdGVyKGMgPT4gYyAhPT0gY2xhc3NOYW1lKS5qb2luKHNwYWNlKTtcbi8vIH1cbi8vXG4vL1xuXG5leHBvcnQgY29uc3QgYWRkQ2xhc3MgPSAoY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgY2xhc3NOYW1lOiBzdHJpbmcsIG15b3BJZDogc3RyaW5nKSA9PiB7XG4gICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIF9jbGFzc05hbWV9KSA9PiB7XG4gICAgICAgIHJlZj8uY2xhc3NMaXN0LmFkZChfY2xhc3NOYW1lKTtcbiAgICB9LCB7XG4gICAgICAgIGVsZW1lbnRJZDogbXlvcElkLFxuICAgICAgICBfY2xhc3NOYW1lOiBjbGFzc05hbWVcbiAgICB9KSk7XG59XG5cbmV4cG9ydCBjb25zdCByZW1vdmVDbGFzcyA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjbGFzc05hbWU6IHN0cmluZywgbXlvcElkOiBzdHJpbmcpID0+IHtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgX2NsYXNzTmFtZX0pID0+IHtcbiAgICAgICAgcmVmPy5jbGFzc0xpc3QucmVtb3ZlKF9jbGFzc05hbWUpO1xuICAgIH0sIHtcbiAgICAgICAgZWxlbWVudElkOiBteW9wSWQsXG4gICAgICAgIF9jbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbn0iLCAiaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50Q29uZmlnLFxuICAgIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZywgSUhUTUxMb2FkZXJDb25maWcsIElSZWZDb25maWcsXG4gICAgSVNraW5Mb2FkZXJDb25maWcsXG4gICAgSVNraW5TZWxlY3RvckNvbmZpZyxcbiAgICBJRGVkaWNhdGVkU2tpbkNvbmZpZywgSVNraW5Db25maWdcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlscy50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2tpbkNvbmZpZyBpbXBsZW1lbnRzIElTa2luQ29uZmlnIHtcbiAgICBfcnVuVGltZUluc3RhbmNlSWQgPSAncnVudGltZS1pbnN0YW5jZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVJZCA9ICdydW50aW1lLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZU5hbWUgPSAncnVudGltZS1uYW1lLScgKyB1dWlkdjQoKTtcblxuICAgIHN0YXRpYyBjcmVhdGUgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgU2tpbkNvbmZpZygpO1xuICAgIH1cblxuICAgIGlkID0gdGhpcy5fcnVuVGltZUlkO1xuICAgIG5hbWUgPSB0aGlzLl9ydW5UaW1lTmFtZTtcbiAgICBkZXNjcmlwdGlvbiA9ICcnO1xuICAgIGxvYWRlciA9IG51bGwgYXMgdW5rbm93biBhcyBJU2tpbkxvYWRlckNvbmZpZztcblxuICAgIHdpdGhMb2FkZXIgPSAobG9hZGVyOiBJU2tpbkxvYWRlckNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlcjtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEhUTUxMb2FkZXIgPSAobG9hZGVyOiBPbWl0PElIVE1MTG9hZGVyQ29uZmlnLCAndHlwZSc+KSA9PiB7XG4gICAgICAgIGxvYWRlci50eXBlID0gJ0hUTUxMb2FkZXInO1xuICAgICAgICB0aGlzLmxvYWRlciA9IGxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENvbmZpZyBpbXBsZW1lbnRzIElDb21wb25lbnRDb25maWcge1xuICAgIF9ydW5UaW1lSW5zdGFuY2VJZCA9ICdydW50aW1lLWluc3RhbmNlLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZUlkID0gJ3J1bnRpbWUtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lTmFtZSA9ICdydW50aW1lLW5hbWUtJyArIHV1aWR2NCgpO1xuXG4gICAgc3RhdGljIGNyZWF0ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRDb25maWcoKTtcbiAgICB9XG5cbiAgICBpbnN0YW5jZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJbnN0YW5jZUlkLFxuICAgICAgICBjb21wb25lbnRJZDogdGhpcy5fcnVuVGltZUlkLFxuICAgICAgICBjb21wb25lbnROYW1lOiB0aGlzLl9ydW5UaW1lTmFtZSxcbiAgICAgICAgc2tpblNlbGVjdG9yOiBudWxsIGFzIHVua25vd24gYXMgSVNraW5TZWxlY3RvckNvbmZpZ1xuICAgIH0gYXMgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnO1xuXG4gICAgbmFtZSA9IHRoaXMuX3J1blRpbWVOYW1lXG4gICAgdHlwZSA9IHtcbiAgICAgICAgaWQ6IHRoaXMuX3J1blRpbWVJZCxcbiAgICAgICAgbmFtZTogdGhpcy5fcnVuVGltZU5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICByZWZzOiBbXSxcbiAgICAgICAgc2tpbnM6IFtdLFxuICAgICAgICBkZWZhdWx0U2tpbjogMFxuICAgIH0gYXMgSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcblxuICAgIHdpdGhJbnN0YW5jZSA9IChpbnN0YW5jZTogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aFR5cGUgPSAodHlwZTogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aE5hbWUgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhEZWZhdWx0U2tpbiA9IChkZWZhdWx0U2tpbjogSVNraW5Db25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlLnNraW5zLnB1c2goZGVmYXVsdFNraW4pO1xuICAgICAgICB0aGlzLnR5cGUuZGVmYXVsdFNraW4gPSB0aGlzLnR5cGUuc2tpbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5za2luU2VsZWN0b3IgPSB7XG4gICAgICAgICAgICB0eXBlOiAnRGVkaWNhdGVkJyxcbiAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICBpZDogZGVmYXVsdFNraW4uaWRcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHdpdGhSZWYgPSAocmVmOiBJUmVmQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMudHlwZS5yZWZzLnB1c2gocmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aEJhc2ljUmVmID0gKHJlZlNlbGVjdG9yOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgbmV3QmFzaWNSZWYgPSB7XG4gICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICBuYW1lOiByZWZTZWxlY3RvcixcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIHNlbGVjdG9yVHlwZTogJ2lkLWF0dHJpYnV0ZScsXG4gICAgICAgICAgICBzZWxlY3RvcjogcmVmU2VsZWN0b3IsXG4gICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjb2RlJ1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIElSZWZDb25maWdcblxuICAgICAgICB0aGlzLnR5cGUucmVmcy5wdXNoKG5ld0Jhc2ljUmVmKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgYnVpbGQgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMpKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0lVc2VyRmxvd30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG4vKipcbiAqXG4gKiAjIyBPdmVydmlld1xuICpcbiAqIFRoZSBgQ2xvdWRSZXBvc2l0b3J5YCBjbGFzcyBzZXJ2ZXMgYXMgYSBjZW50cmFsaXplZCBkYXRhIGFjY2VzcyBsYXllciBmb3IgcmV0cmlldmluZyB1c2VyIGZsb3dzIGFuZCBjb21wb25lbnRzIGZyb20gdGhlIE15b3AuZGV2IGNsb3VkIHNlcnZpY2UuIEl0IGltcGxlbWVudHMgYSBzaW5nbGV0b24gcGF0dGVybiBhbmQgcHJvdmlkZXMgY2FjaGluZyBtZWNoYW5pc21zIHRvIG9wdGltaXplIEFQSSBjYWxscyBhbmQgaW1wcm92ZSBwZXJmb3JtYW5jZS5cbiAqXG4gKiAjIyBDbGFzcyBTdHJ1Y3R1cmVcbiAqXG4gKiAjIyMgQ29uc3RydWN0b3JcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKVxuICogYGBgXG4gKlxuICogKipQYXJhbWV0ZXJzOioqXG4gKiAtIGBfYmFzZVVybGAgKG9wdGlvbmFsKTogVGhlIGJhc2UgVVJMIGZvciB0aGUgTXlvcC5kZXYgY2xvdWQgQVBJLiBEZWZhdWx0cyB0byBgJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnYFxuICpcbiAqICMjIyBTdGF0aWMgUHJvcGVydGllc1xuICpcbiAqICMjIyMgTWFpblxuICogYGBgdHlwZXNjcmlwdFxuICogc3RhdGljIE1haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG4gKiBgYGBcbiAqXG4gKiBBIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgYENsb3VkUmVwb3NpdG9yeWAgY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0aHJvdWdob3V0IHRoZSBhcHBsaWNhdGlvbiB3aXRob3V0IGNyZWF0aW5nIG11bHRpcGxlIGluc3RhbmNlcy5cbiAqXG4gKiAjIyMgUHJpdmF0ZSBQcm9wZXJ0aWVzXG4gKlxuICogIyMjIyB1c2VyRmxvd3NcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHByaXZhdGUgdXNlckZsb3dzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG4gKiBgYGBcbiAqXG4gKiBBIGNhY2hlIG9iamVjdCB0aGF0IHN0b3JlcyBwcm9taXNlcyBmb3IgdXNlciBmbG93cywgaW5kZXhlZCBieSBmbG93IElELiBUaGlzIHByZXZlbnRzIGR1cGxpY2F0ZSBBUEkgY2FsbHMgZm9yIHRoZSBzYW1lIGZsb3cgYW5kIGVuc3VyZXMgY29uc2lzdGVudCBkYXRhIHJldHJpZXZhbC5cbiAqXG4gKiAjIyMjIF9iYXNlVXJsXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBwcml2YXRlIF9iYXNlVXJsOiBzdHJpbmdcbiAqIGBgYFxuICpcbiAqIFRoZSBiYXNlIFVSTCBmb3IgdGhlIGNsb3VkIEFQSSBlbmRwb2ludHMsIHNldCBkdXJpbmcgY29uc3RydWN0aW9uLlxuICpcbiAqICMjIE1ldGhvZHNcbiAqXG4gKiAjIyMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKVxuICpcbiAqIFJldHJpZXZlcyBhIGNvbXBsZXRlIHVzZXIgZmxvdyBmcm9tIHRoZSBjbG91ZCByZXBvc2l0b3J5LCBpbmNsdWRpbmcgYWxsIHJlc29sdmVkIGNvbXBvbmVudHMuXG4gKlxuICogKipQYXJhbWV0ZXJzOioqXG4gKiAtIGBmbG93SWRgOiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyIGZsb3cgdG8gcmV0cmlldmVcbiAqXG4gKiAqKlJldHVybnM6KipcbiAqIC0gYFByb21pc2U8SVVzZXJGbG93PmA6IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIHRoZSBjb21wbGV0ZSB1c2VyIGZsb3cgb2JqZWN0XG4gKlxuICogKipCZWhhdmlvcjoqKlxuICogLSBJbXBsZW1lbnRzIHJlcXVlc3QgY2FjaGluZyB0byBhdm9pZCBkdXBsaWNhdGUgQVBJIGNhbGxzIGZvciB0aGUgc2FtZSBmbG93IElEXG4gKiAtIE1ha2VzIGEgR0VUIHJlcXVlc3QgdG8gYC9mbG93P2lkPXtmbG93SWR9JnJlc29sdmU9Y29tcG9uZW50c2BcbiAqIC0gQXV0b21hdGljYWxseSByZXNvbHZlcyBjb21wb25lbnQgcmVmZXJlbmNlcyB3aXRoaW4gdGhlIGZsb3dcbiAqIC0gU3RvcmVzIHRoZSBwcm9taXNlIGluIHRoZSBjYWNoZSBmb3IgZnV0dXJlIHVzZVxuICpcbiAqICoqRXhhbXBsZSBVc2FnZToqKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdygnbXktZmxvdy1pZCcpO1xuICogY29uc29sZS5sb2coZmxvdy5jb21wb25lbnRzKTtcbiAqIGBgYFxuICpcbiAqICMjIyBmZXRjaENvbXBvbmVudChjb21wb25lbnRJZDogc3RyaW5nLCBmbG93SWQ6IHN0cmluZylcbiAqXG4gKiBSZXRyaWV2ZXMgYSBzcGVjaWZpYyBjb21wb25lbnQgZnJvbSB3aXRoaW4gYSB1c2VyIGZsb3cuXG4gKlxuICogKipQYXJhbWV0ZXJzOioqXG4gKiAtIGBjb21wb25lbnRJZGA6IFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGNvbXBvbmVudCB0byByZXRyaWV2ZVxuICogLSBgZmxvd0lkYDogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdXNlciBmbG93IGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudFxuICpcbiAqICoqUmV0dXJuczoqKlxuICogLSBgUHJvbWlzZTxDb21wb25lbnQgfCB1bmRlZmluZWQ+YDogQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbXBvbmVudCBvYmplY3QgaWYgZm91bmQsIG9yIHVuZGVmaW5lZCBpZiBub3QgZm91bmRcbiAqXG4gKiAqKkJlaGF2aW9yOioqXG4gKiAtIEZpcnN0IGZldGNoZXMgdGhlIGNvbXBsZXRlIGZsb3cgdXNpbmcgYGZldGNoRmxvdygpYFxuICogLSBTZWFyY2hlcyB0aHJvdWdoIHRoZSBmbG93J3MgY29tcG9uZW50cyBhcnJheSB0byBmaW5kIHRoZSBtYXRjaGluZyBjb21wb25lbnRcbiAqIC0gVXNlcyB0aGUgY29tcG9uZW50J3MgYHR5cGUuaWRgIHByb3BlcnR5IGZvciBtYXRjaGluZ1xuICpcbiAqICoqRXhhbXBsZSBVc2FnZToqKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY29tcG9uZW50ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoJ2J1dHRvbi1jb21wb25lbnQnLCAnbXktZmxvdy1pZCcpO1xuICogaWYgKGNvbXBvbmVudCkge1xuICogICAgIGNvbnNvbGUubG9nKCdDb21wb25lbnQgZm91bmQ6JywgY29tcG9uZW50KTtcbiAqIH0gZWxzZSB7XG4gKiAgICAgY29uc29sZS5sb2coJ0NvbXBvbmVudCBub3QgZm91bmQgaW4gZmxvdycpO1xuICogfVxuICogYGBgXG4gKlxuICogIyMgQVBJIEludGVncmF0aW9uXG4gKlxuICogIyMjIEVuZHBvaW50IFN0cnVjdHVyZVxuICpcbiAqIFRoZSBjbGFzcyBpbnRlZ3JhdGVzIHdpdGggdGhlIGZvbGxvd2luZyBNeW9wLmRldiBjbG91ZCBBUEkgZW5kcG9pbnQ6XG4gKlxuICogYGBgXG4gKiBHRVQge2Jhc2VVcmx9L2Zsb3c/aWQ9e2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzXG4gKiBgYGBcbiAqXG4gKiAqKlF1ZXJ5IFBhcmFtZXRlcnM6KipcbiAqIC0gYGlkYDogVGhlIGZsb3cgaWRlbnRpZmllclxuICogLSBgcmVzb2x2ZT1jb21wb25lbnRzYDogSW5zdHJ1Y3RzIHRoZSBBUEkgdG8gaW5jbHVkZSByZXNvbHZlZCBjb21wb25lbnQgZGF0YSBpbiB0aGUgcmVzcG9uc2VcbiAqXG4gKiAjIyMgUmVzcG9uc2UgRm9ybWF0XG4gKlxuICogVGhlIEFQSSBpcyBleHBlY3RlZCB0byByZXR1cm4gYSBKU09OIHJlc3BvbnNlIHdpdGggdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6XG4gKlxuICogYGBganNvblxuICoge1xuICogICAgIFwiaXRlbVwiOiB7XG4gKiAgICAgICAgIC8vIElVc2VyRmxvdyBvYmplY3Qgd2l0aCByZXNvbHZlZCBjb21wb25lbnRzXG4gKiAgICAgICAgIFwiY29tcG9uZW50c1wiOiBbXG4gKiAgICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IHtcbiAqICAgICAgICAgICAgICAgICAgICAgXCJpZFwiOiBcImNvbXBvbmVudC1pZFwiXG4gKiAgICAgICAgICAgICAgICAgfVxuICogICAgICAgICAgICAgICAgIC8vIC4uLiBvdGhlciBjb21wb25lbnQgcHJvcGVydGllc1xuICogICAgICAgICAgICAgfVxuICogICAgICAgICBdXG4gKiAgICAgICAgIC8vIC4uLiBvdGhlciBmbG93IHByb3BlcnRpZXNcbiAqICAgICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBDYWNoaW5nIFN0cmF0ZWd5XG4gKlxuICogVGhlIGBDbG91ZFJlcG9zaXRvcnlgIGltcGxlbWVudHMgYSBwcm9taXNlLWJhc2VkIGNhY2hpbmcgbWVjaGFuaXNtOlxuICpcbiAqIDEuICoqQ2FjaGUgS2V5Kio6IEZsb3cgSUQgaXMgdXNlZCBhcyB0aGUgY2FjaGUga2V5XG4gKiAyLiAqKkNhY2hlIFZhbHVlKio6IFByb21pc2VzIGFyZSBjYWNoZWQgcmF0aGVyIHRoYW4gcmVzb2x2ZWQgdmFsdWVzIHRvIGhhbmRsZSBjb25jdXJyZW50IHJlcXVlc3RzXG4gKiAzLiAqKkNhY2hlIER1cmF0aW9uKio6IENhY2hlIHBlcnNpc3RzIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHJlcG9zaXRvcnkgaW5zdGFuY2VcbiAqIDQuICoqQ2FjaGUgSW52YWxpZGF0aW9uKio6IE5vIGF1dG9tYXRpYyBjYWNoZSBpbnZhbGlkYXRpb24gaXMgaW1wbGVtZW50ZWRcbiAqXG4gKiAjIyBFcnJvciBIYW5kbGluZ1xuICpcbiAqIC0gTmV0d29yayBlcnJvcnMgYW5kIEFQSSBmYWlsdXJlcyBhcmUgcHJvcGFnYXRlZCB0aHJvdWdoIHByb21pc2UgcmVqZWN0aW9uXG4gKiAtIE5vIHNwZWNpZmljIGVycm9yIGhhbmRsaW5nIG9yIHJldHJ5IGxvZ2ljIGlzIGltcGxlbWVudGVkIGF0IHRoZSByZXBvc2l0b3J5IGxldmVsXG4gKiAtIENvbnN1bWVycyBzaG91bGQgaW1wbGVtZW50IGFwcHJvcHJpYXRlIGVycm9yIGhhbmRsaW5nIHdoZW4gY2FsbGluZyByZXBvc2l0b3J5IG1ldGhvZHNcbiAqXG4gKiAjIyBVc2FnZSBQYXR0ZXJuc1xuICpcbiAqICMjIyBTaW5nbGV0b24gQWNjZXNzXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQgeyBDbG91ZFJlcG9zaXRvcnkgfSBmcm9tICcuL3BhdGgvdG8vQ2xvdWRSZXBvc2l0b3J5JztcbiAqXG4gKiAvLyBVc2UgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZVxuICogY29uc3QgZmxvdyA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoRmxvdygnZmxvdy1pZCcpO1xuICogYGBgXG4gKlxuICogIyMjIEN1c3RvbSBJbnN0YW5jZVxuICogYGBgdHlwZXNjcmlwdFxuICogLy8gQ3JlYXRlIGEgY3VzdG9tIGluc3RhbmNlIHdpdGggZGlmZmVyZW50IGJhc2UgVVJMXG4gKiBjb25zdCBjdXN0b21SZXBvID0gbmV3IENsb3VkUmVwb3NpdG9yeSgnaHR0cHM6Ly9jdXN0b20tYXBpLmV4YW1wbGUuY29tJyk7XG4gKiBjb25zdCBmbG93ID0gYXdhaXQgY3VzdG9tUmVwby5mZXRjaEZsb3coJ2Zsb3ctaWQnKTtcbiAqIGBgYFxuICpcbiAqICMjIyBDb21wb25lbnQgUmV0cmlldmFsXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBHZXQgYSBzcGVjaWZpYyBjb21wb25lbnQgZnJvbSBhIGZsb3dcbiAqIGNvbnN0IGNvbXBvbmVudCA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KCdjb21wb25lbnQtaWQnLCAnZmxvdy1pZCcpO1xuICogYGBgXG4gKlxuICogIyMgRGVwZW5kZW5jaWVzXG4gKlxuICogLSAqKklVc2VyRmxvdyoqOiBJbnRlcmZhY2UgaW1wb3J0ZWQgZnJvbSBgLi4vY29tbW9uYCB0aGF0IGRlZmluZXMgdGhlIHN0cnVjdHVyZSBvZiB1c2VyIGZsb3cgb2JqZWN0c1xuICogLSAqKkZldGNoIEFQSSoqOiBVc2VzIHRoZSBuYXRpdmUgYGZldGNoYCBmdW5jdGlvbiBmb3IgSFRUUCByZXF1ZXN0c1xuICpcbiAqICMjIFBlcmZvcm1hbmNlIENvbnNpZGVyYXRpb25zXG4gKlxuICogLSAqKkNhY2hpbmcqKjogUHJldmVudHMgZHVwbGljYXRlIEFQSSBjYWxscyBmb3IgdGhlIHNhbWUgZmxvdyBJRFxuICogLSAqKlByb21pc2UgQ2FjaGluZyoqOiBIYW5kbGVzIGNvbmN1cnJlbnQgcmVxdWVzdHMgZWZmaWNpZW50bHkgYnkgY2FjaGluZyBwcm9taXNlc1xuICogLSAqKkNvbXBvbmVudCBSZXNvbHV0aW9uKio6IFRoZSBgcmVzb2x2ZT1jb21wb25lbnRzYCBwYXJhbWV0ZXIgZW5zdXJlcyBjb21wb25lbnRzIGFyZSBmdWxseSByZXNvbHZlZCBpbiBhIHNpbmdsZSBBUEkgY2FsbFxuICpcbiAqICMjIEZ1dHVyZSBFbmhhbmNlbWVudHNcbiAqXG4gKiBUaGUgY2xhc3Mgc3RydWN0dXJlIHN1Z2dlc3RzIHBsYW5uZWQgZnVuY3Rpb25hbGl0eSB0aGF0IGNvdWxkIGJlIGltcGxlbWVudGVkOlxuICpcbiAqIC0gKipDb21wb25lbnQgQ2FjaGluZyoqOiBUaGUgY29tbWVudGVkIGBjb21wb25lbnRzYCBwcm9wZXJ0eSBpbmRpY2F0ZXMgcG90ZW50aWFsIGluZGl2aWR1YWwgY29tcG9uZW50IGNhY2hpbmdcbiAqIC0gKipDYWNoZSBJbnZhbGlkYXRpb24qKjogTWV0aG9kcyB0byBjbGVhciBvciByZWZyZXNoIGNhY2hlZCBkYXRhXG4gKiAtICoqRXJyb3IgUmV0cnkgTG9naWMqKjogQXV0b21hdGljIHJldHJ5IG1lY2hhbmlzbXMgZm9yIGZhaWxlZCByZXF1ZXN0c1xuICogLSAqKkJhdGNoIE9wZXJhdGlvbnMqKjogTWV0aG9kcyB0byBmZXRjaCBtdWx0aXBsZSBmbG93cyBvciBjb21wb25lbnRzIGluIGEgc2luZ2xlIHJlcXVlc3RcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBDbG91ZFJlcG9zaXRvcnkge1xuICAgIHN0YXRpYyBNYWluID0gbmV3IENsb3VkUmVwb3NpdG9yeSgpO1xuXG4gICAgcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcblxuICAgIC8vIHByaXZhdGUgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfYmFzZVVybCA9ICdodHRwczovL2Nsb3VkLm15b3AuZGV2Jykge1xuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZD86IHN0cmluZykge1xuICAgICAgICBpZiAoZmxvd0lkKSB7XG4gICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgdGhpcy5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgIHJldHVybiBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50SWQpO1xuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50c1swXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIGZldGNoQXV0b0Zsb3coY29tcG9uZW50SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgIGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3RoaXMuX2Jhc2VVcmx9L2Zsb3c/aWQ9JHtjb21wb25lbnRJZH0mYXV0bz10cnVlYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2NvbXBvbmVudElkXTtcbiAgICB9XG5cblxuICAgIGFzeW5jIGZldGNoRmxvdyhmbG93SWQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRoaXMudXNlckZsb3dzW2Zsb3dJZF0pIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hc3luYy1wcm9taXNlLWV4ZWN1dG9yXG4gICAgICAgICAgICB0aGlzLnVzZXJGbG93c1tmbG93SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzb24gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShqc29uLml0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMudXNlckZsb3dzW2Zsb3dJZF07XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBleGVjID0gYXN5bmMgKGdldHRlcjogYW55KSA9PiB7XG4gICAgcmV0dXJuIGF3YWl0IGdldHRlcigpXG59XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vYXBwbHlTdHlsZXNoZWV0XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9pZnJhbWVTa2luVXJsVG9rZW5pemVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jbGFzc0xpc3RcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvbmZpZ0J1aWxkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL0Nsb3VkUmVwb3NpdG9yeVwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhlY1wiO1xuIiwgImltcG9ydCB7ZGVjb21wcmVzc1VVSURzfSBmcm9tIFwiLi4vdXRpbHMvdXVpZC50c1wiO1xuaW1wb3J0IHtDbG91ZFJlcG9zaXRvcnl9IGZyb20gXCIuLi9oZWxwZXJzXCI7XG5pbXBvcnQge1xuICAgIEV4cGVyaWVuY2VUeXBlcyxcbiAgICBJQ29tcG9uZW50Q29uZmlnLCBJRGVkaWNhdGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudGVkU2tpbkNvbmZpZyxcbiAgICBJU2VnbWVudEV4cGVyaWVuY2UsIElTa2luSW5zdGFuY2VDb25maWcsXG4gICAgU2tpblNlbGVjdG9yVHlwZXNcbn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY29uc3QgY2hlY2tNeW9wT3ZlcnJpZGUgPSBhc3luYyAoY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnKTogUHJvbWlzZTxJQ29tcG9uZW50Q29uZmlnIHwgbnVsbD4gPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vVE9ETzogc3VwcG9ydCBkaXNhYmxpbmcgdGhlIG1lY2hhbmlzbVxuICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2VhcmNoKTtcbiAgICAgICAgY29uc3QgbXlvcE92ZXJyaWRlID0gcGFyYW1zLmdldCgnbXlvcE92ZXJyaWRlJyk7XG4gICAgICAgIGlmIChteW9wT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgIGNvbnN0IFtzb3VyY2UsIC4uLnV1aWRzXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2NvbXBvbmVudElkLCBza2luSWRdID0gdXVpZHM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudChjb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0b2RvOiBjaGVjayBmZXRjaEF1dG9GbG93LiBMb29rcyBsaWtlIG9ubHkgb25lIHNraW4gaXMgcmV0dXJuZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNraW4gPSBjb21wb25lbnRUb092ZXJyaWRlLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2tpbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGZvciBub3cganVzdCBzZXQgc2tpbiBpZC4gQ2hlY2sgdGhlIGNsb3VkIGltcGxlbWVudGF0aW9uXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2luOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogc2tpbklkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgSVNraW5JbnN0YW5jZUNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgLy8gICAgY2FzZSAnZmxvdyc6IHtcbiAgICAgICAgICAgICAgICBkZWZhdWx0IDoge1xuICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IFtmbG93SWQsIGV4cGVyaW1lbnRJZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IGRlY29tcHJlc3NVVUlEcyhteW9wT3ZlcnJpZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KGZsb3dJZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFRvT3ZlcnJpZGUgPSBmbG93LmNvbXBvbmVudHMuZmluZChjID0+IGMudHlwZS5pZCA9PT0gY29tcG9uZW50Q29uZmlnLnR5cGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGUgPT09IFNraW5TZWxlY3RvclR5cGVzLlNlZ21lbnRlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZEV4cGVyaWVuY2UgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnJlc29sdmVkRXhwZXJpZW5jZXMuZmluZChlID0+IGUuaWQgPT09IGV4cGVyaW1lbnRJZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkRXhwZXJpZW5jZT8udHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2UgPSByZXNvbHZlZEV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2tpblNlbGVjdG9yID0gY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlZ21lbnQgPSB0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cy5maW5kKHMgPT4gcy5zZWdtZW50SWQgPT09IHR5cGVkUmVzb2x2ZWRFeHBlcmllbmNlLnNlZ21lbnQuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHNlZ21lbnQ/LnNraW5TZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50VG9PdmVycmlkZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSG9zdCBTREsgaXMgZGVzaWduZWQgZm9yIGludGVncmF0aW9uIHdpdGhpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0aGF0IHNlcnZlcyBhcyB0aGUgY29udGFpbmVyIGZvciBNeW9wICBjb21wb25lbnRzLjxici8+PGJyLz5cbiAqIEl0IHByb3ZpZGVzIGVzc2VudGlhbCBmdW5jdGlvbmFsaXRpZXMgYW5kIEFQSXMgZm9yIHJlZ2lzdGVyaW5nLCBtYW5hZ2luZywgYW5kIGNvbW11bmljYXRpbmcgd2l0aCBNeW9wIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogVGhpcyBTREsgZW5hYmxlcyBzZWFtbGVzcyBlbWJlZGRpbmcgb2YgaW5kZXBlbmRlbnRseSBkZXZlbG9wZWQgY29tcG9uZW50cyBpbnRvIHRoZSBob3N0IGFwcGxpY2F0aW9uLCBlbnN1cmluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSBhbmQgY29uc2lzdGVudCB1c2VyIGV4cGVyaWVuY2UgYWNyb3NzIHZhcmlvdXMgTXlvcCBjb21wb25lbnQgaW1wbGVtZW50YXRpb25zLlxuICovXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7SU15b3BMb2FkZXJ9IGZyb20gXCIuL2xvYWRlcnMvSU15b3BMb2FkZXJcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRW52ZWxvcGVkTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsIE1lc3NhZ2VEaXJlY3Rpb24sIFJlZlxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcElmcmFtZUxvYWRlcn0gZnJvbSBcIi4vbG9hZGVycy9pZnJhbWVMb2FkZXJcIjtcbmltcG9ydCB7V2ViY29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlclwiO1xuaW1wb3J0IHR5cGUge0lmcmFtZVNES30gZnJvbSBcIi4uL0lmcmFtZVwiO1xuaW1wb3J0IHtjb25uZWN0UHJvcHMsIGNvbm5lY3RSZWZzLCBjcmVhdGVSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSURlZGljYXRlZFNraW5Db25maWcsIElFeHBlcmllbmNlLCBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudCwgSVNlZ21lbnRlZFNraW5Db25maWcsIElTZWdtZW50RXhwZXJpZW5jZSxcbiAgICBJU2tpbkNvbmZpZywgSVNraW5TZWxlY3RvckNvbmZpZywgU2tpblNlbGVjdG9yVHlwZXMsXG5cblxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtIVE1MQ29tcG9uZW50TG9hZGVyfSBmcm9tIFwiLi9sb2FkZXJzL0hUTUxDb21wb25lbnRMb2FkZXJcIjtcbmltcG9ydCB7Y2hlY2tNeW9wT3ZlcnJpZGV9IGZyb20gXCIuL215b3BPdmVycmlkZS50c1wiO1xuXG5pbnRlcmZhY2UgY29tcG9uZW50TG9hZGVyQ3JlYXRvciB7XG4gICAgbmV3KGxvYWRlcnM6IElNeW9wTG9hZGVyW10pOiBhbnk7XG59XG5cbi8vIGNvbnN0IGdldENvbXBvbmVudERlZmluaXRpb25Db25maWcgPSBhc3luYyAoaWQ6IHN0cmluZykgPT4ge1xuLy8gICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGBodHRwOi8vbG9jYWxob3N0OjMwMDAvY29tcG9uZW50P2lkPSR7aWR9YCk7XG4vLyAgICAgY29uc3QgY29tcG9uZW50RGVmOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyA9IChhd2FpdCByZXMuanNvbigpKS5pdGVtO1xuLy8gICAgIHJldHVybiBjb21wb25lbnREZWZcbi8vIH1cblxuLy9jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2RmZGxrMnAxbTE4N3YuY2xvdWRmcm9udC5uZXQvbXlvcF9zZGsubWluLmpzJ1xuY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9jZG4ubXlvcC5kZXYvc2RrL25leHQvbXlvcF9zZGsubWluLmpzJ1xuXG4vKipcbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+XG4gKiBUaGlzIFNESyBlbmFibGVzIHNlYW1sZXNzIGVtYmVkZGluZyBvZiBpbmRlcGVuZGVudGx5IGRldmVsb3BlZCBjb21wb25lbnRzIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24sIGVuc3VyaW5nIHNtb290aCBpbnRlcm9wZXJhYmlsaXR5IGFuZCBjb25zaXN0ZW50IHVzZXIgZXhwZXJpZW5jZSBhY3Jvc3MgdmFyaW91cyBNeW9wIGNvbXBvbmVudCBpbXBsZW1lbnRhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBIb3N0U0RLIHtcbiAgICBzdGF0aWMgSW5zdGFuY2UgPSAoKSA9PiB3aW5kb3cubXlvcC5ob3N0U0RLO1xuXG4gICAgY29tcG9uZW50czJpbml0OiBJTXlvcENvbXBvbmVudFtdID0gW107XG4gICAgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSA9IFtdO1xuICAgIGNvbXBvbmVudHNMb2FkZXJzOiBJTXlvcExvYWRlcltdID0gW107XG5cbiAgICBwdWJsaWMgaW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwdWJsaWMgdmVyc2lvbiA9IHZlcnNpb247XG5cbiAgICB0eXBlMkluc3RhbmNlQ291bnQ6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgICBwdWJsaWMgYXNzaWduSWQgPSAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnR5cGUySW5zdGFuY2VDb3VudFtjb21wb25lbnREZWZpbml0aW9uLmlkXSkge1xuICAgICAgICAgICAgdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtjb21wb25lbnREZWZpbml0aW9uLmlkfV8keysrdGhpcy50eXBlMkluc3RhbmNlQ291bnRbY29tcG9uZW50RGVmaW5pdGlvbi5pZF19YDtcbiAgICB9XG5cbiAgICAvL1RPRE8gOiBmaXggdGhlIGluc3BlY3QgaW1wbGVtZW50YXRpb24gaW5zaWRlIHJlZkNvbXBvbmVudFxuICAgIC8vdGhlbiBpbnNwZWN0ZWQgbWF5YmUgY2FuIGJlIGRyb3BwZWRcbiAgICBwcml2YXRlIGluc3BlY3RlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBpbnNwZWN0ID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pbnNwZWN0ZWQpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgdGhpcy5pbnNwZWN0ZWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKGNvbXBvbmVudCA9PiB7XG4gICAgICAgICAgICBpZiAoY29tcG9uZW50Lmluc3BlY3QpIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnQuaW5zcGVjdCgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbmNvbWluZ01lc3NhZ2VIYW5kbGVyID0gKGV2ZW50OiBNZXNzYWdlRXZlbnQ8QmFzZU15b3BNZXNzYWdlPikgPT4ge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdpbmNvbWluZ01lc3NhZ2VIYW5kbGVyIEdPVCAnLCBldmVudClcbiAgICAgICAgLy9UT0RPIDogIGlmIChldmVudC5vcmlnaW4gIT09IFwiaHR0cDovL2V4YW1wbGUub3JnOjgwODBcIikgcmV0dXJuO1xuICAgICAgICBpZiAoZXZlbnQub3JpZ2luID09PSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ0kgS25vdyB0aGF0ICEhIScpO1xuICAgICAgICAgICAgLy8gIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvL2NvbnNvbGUubG9nKFwiZXZlbnQgb24gaG9zdCBzaWRlIFwiLCBldmVudCk7XG5cbiAgICAgICAgaWYgKGV2ZW50LmRhdGEubXlvcCkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LmRhdGEuZGlyZWN0aW9uICE9PSBNZXNzYWdlRGlyZWN0aW9uLnVwICYmIGV2ZW50LmRhdGEubWVzc2FnZVR5cGUgIT09IE15b3BNZXNzYWdlcy5FbnZlbG9wZWRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGhvc3RzZGssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJldmVudCBvbiBob3N0IHNpZGUgXCIsIGV2ZW50KTtcblxuICAgICAgICAgICAgY29uc3QgbXlvcE1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSA9IGV2ZW50LmRhdGE7XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQuZm9yRWFjaChjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuc2VuZChuZXcgSW5pdE1lc3NhZ2UoY29tcG9uZW50LmlkKSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBmcm9tIGNvbXBvbmVudHMgMiBpbml0XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0ID0gdGhpcy5jb21wb25lbnRzMmluaXQuZmlsdGVyKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgIT09IChteW9wTWVzc2FnZSBhcyBJbml0UmVzcG9uc2UpLmNvbnRlbnQuaWQpXG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWF0ZWRDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSAobXlvcE1lc3NhZ2UgYXMgSW5pdFJlc3BvbnNlKS5jb250ZW50Py5pZCk7XG4gICAgICAgICAgICAgICAgaW5pdGlhdGVkQ29tcG9uZW50Py5zZXRJbml0aWF0ZWQoKVxuICAgICAgICAgICAgICAgIC8vaW5pdGlhdGVkQ29tcG9uZW50Py5wYXJlbnQ/LnNldEluaXRpYXRlZCgpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE8gOiBpcyBpdCB0cnVlIHRvIG5vdCBwYXNzIGZ1cnRoZXIgKCB0byB0aGUgY29tcG9uZW50IClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChteW9wTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG15b3BNZXNzYWdlIGFzIEVudmVsb3BlZE1lc3NhZ2VcbiAgICAgICAgICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSB0aGlzLmNvbXBvbmVudHMuZmluZChjb21wb25lbnQgPT4gY29tcG9uZW50LmlkID09PSB0eXBlZE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLmRpcmVjdGlvbiA9PT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRNZXNzYWdlLm1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IEV4ZWN1dGVDb21wb25lbnRNZXRob2QubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZkNvbXBvbmVudC5vbk1lc3NhZ2VSZWNlaXZlZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlZE1lc3NhZ2UubWVzc2FnZS5yb3V0ZSA9IHR5cGVkTWVzc2FnZS5yb3V0ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2VuZCh0eXBlZE1lc3NhZ2UubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbm5lckNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50cy5maW5kKGNvbXBvbmVudCA9PiBjb21wb25lbnQuaWQgPT09IHR5cGVkTWVzc2FnZS5tZXNzYWdlLmRlc3RpbmF0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbm5lckNvbXBvbmVudC5zZW5kKHR5cGVkTWVzc2FnZS5tZXNzYWdlKVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyA6IGxvZyA/XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgIC8vY29tcG9uZW50LnJlZnMuYm9keS5vbk1lc3NhZ2VSZWNlaXZlZChteW9wTWVzc2FnZS5tZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzLmZpbmQoY29tcG9uZW50ID0+IGNvbXBvbmVudC5pZCA9PT0gbXlvcE1lc3NhZ2UuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICBpZiAoIWNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIC8vbm8gaW4gbWVtIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubXlvcC5JZnJhbWVTREspIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Lm9uTWVzc2FnZVJlY2VpdmVkKG15b3BNZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9ub3QgcHJvY2Vzc2VkIGluIG9uTWVzc2FnZVJlY2VpdmVkXG4gICAgICAgICAgICAgICAgICAgIC8vcGFzcyB0byBwYXJlbnQgSG9zdFNESyB0byB0cnkgcHJvY2VzcyB0aGVyZVxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93Lm15b3AuSWZyYW1lU0RLKVxuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLLm1lc3NhZ2VUb0hvc3QobXlvcE1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGV2ZW50LnNvdXJjZS5wb3N0TWVzc2FnZShcbiAgICAgICAgLy8gICAgIFwiaGkgdGhlcmUgeW91cnNlbGYhICB0aGUgc2VjcmV0IHJlc3BvbnNlIFwiICsgXCJpczogcmhlZWVlZXQhXCIsXG4gICAgICAgIC8vICAgICBldmVudC5vcmlnaW4sXG4gICAgICAgIC8vICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3Qgc3ludGhldGljRXZlbnQgPSBuZXcgTWVzc2FnZUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4oJycsXG4gICAgICAgICAgICB7ZGF0YTogbWVzc2FnZX1cbiAgICAgICAgKVxuXG4gICAgICAgIHRoaXMuaW5jb21pbmdNZXNzYWdlSGFuZGxlcihzeW50aGV0aWNFdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQgPSAoY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvcnM/OiBjb21wb25lbnRMb2FkZXJDcmVhdG9yW10pID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhdGVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hvc3RTREsgYWxyZWFkeSBpbml0aWF0ZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJhc2ljTG9hZGVycyA9IFtcbiAgICAgICAgICAgIG5ldyBNeW9wSWZyYW1lTG9hZGVyKCksXG4gICAgICAgICAgICBuZXcgV2ViY29tcG9uZW50TG9hZGVyKCksXG4gICAgICAgICAgICBuZXcgSFRNTENvbXBvbmVudExvYWRlcigpXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzTG9hZGVycyA9IFtcbiAgICAgICAgICAgIC4uLmJhc2ljTG9hZGVyc1xuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChjdXN0b21Db21wb25lbnRMb2FkZXJDcmVhdG9ycykge1xuICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgIGNvbnN0IGxvYWRlckJ5VHlwZTogUmVjb3JkPHN0cmluZywgSU15b3BMb2FkZXI+ID0ge307XG5cbiAgICAgICAgICAgIGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3JzLmZvckVhY2goY3VzdG9tQ29tcG9uZW50TG9hZGVyQ3JlYXRvciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VzdG9tTG9hZGVyID0gbmV3IGN1c3RvbUNvbXBvbmVudExvYWRlckNyZWF0b3IodGhpcy5jb21wb25lbnRzTG9hZGVycyk7XG4gICAgICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2N1c3RvbUxvYWRlci50eXBlXSA9IGN1c3RvbUxvYWRlcjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMuZm9yRWFjaChsb2FkZXIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSlcbiAgICAgICAgICAgICAgICAgICAgbG9hZGVyQnlUeXBlW2xvYWRlci50eXBlXSA9IGxvYWRlcjtcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0xvYWRlcnMgPSBPYmplY3QudmFsdWVzKGxvYWRlckJ5VHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmNvbW1pbmcgbWVzc2FnZXMgZnJvbSBJRnJhbWVzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgICAgXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICB0aGlzLmluY29taW5nTWVzc2FnZUhhbmRsZXIsXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zb2xlLmxvZygnbXlvcCBob3N0U0RLIGluaXRpYXRlZCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICB0aGlzLmluaXRpYXRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBfZ2V0U2tpbklkQnlTa2luU2VsZWN0b3IgPSBhc3luYyAoc2tpblNlbGVjdG9yOiBJU2tpblNlbGVjdG9yQ29uZmlnLCBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXSA9IFtdLCBob29rcz86IGxvYWRlckhvb2tzKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gYXN5bmNGaW5kPFQ+KFxuICAgICAgICAgICAgYXJyYXk6IFRbXSxcbiAgICAgICAgICAgIHByZWRpY2F0ZTogKGl0ZW06IFQpID0+IFByb21pc2U8Ym9vbGVhbj5cbiAgICAgICAgKTogUHJvbWlzZTxUIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYXJyYXkpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXdhaXQgcHJlZGljYXRlKGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vIFJldHVybiB1bmRlZmluZWQgaWYgbm8gbWF0Y2ggaXMgZm91bmRcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAoc2tpblNlbGVjdG9yLnR5cGUpIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNhc2UgXCJEZWRpY2F0ZWRTa2luXCIgOiAvL2JhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgICAgICAgICAgIGNhc2UgU2tpblNlbGVjdG9yVHlwZXMuRGVkaWNhdGVkOiB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbklkID0gKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbj8uaWRcbiAgICAgICAgICAgICAgICAgICAgfHwgKHNraW5TZWxlY3RvciBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZykuc2tpbnMhWzBdLmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkU2tpbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFNraW5TZWxlY3RvciA9IChza2luU2VsZWN0b3IgYXMgSVNlZ21lbnRlZFNraW5Db25maWcpXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IGF3YWl0IGFzeW5jRmluZCh0eXBlZFNraW5TZWxlY3Rvci5zZWdtZW50cywgYXN5bmMgc2VnbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50LnNlZ21lbnRJZCA9PT0gJ0RlZmF1bHQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4cGVyaWVuY2UgPSBleHBlcmllbmNlcy5maW5kKGV4cGVyaWVuY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVyaWVuY2UudHlwZSA9PT0gRXhwZXJpZW5jZVR5cGVzLlNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGV4cGVyaWVuY2UgYXMgSVNlZ21lbnRFeHBlcmllbmNlKS5zZWdtZW50LmlkID09PSBzZWdtZW50LnNlZ21lbnRJZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWV4cGVyaWVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImV4cGVyaWVuY2Ugbm90IGZvdW5kXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRFeHBlcmllbmNlID0gZXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkU2VnbWVudCA9ICh0eXBlZEV4cGVyaWVuY2Uuc2VnbWVudCBhcyBJRnVuY3Rpb25SZXN1bHRzU2VnbWVudClcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWdtZW50RnVuY3Rpb24gPSAoaG9va3MgPyBob29rcyA6IHt9KVt0eXBlZFNlZ21lbnQuZnVuY3Rpb25dO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgc2VnbWVudEZ1bmN0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihgc2VnbWVudElkOiR7c2VnbWVudC5zZWdtZW50SWR9LCAke3R5cGVkU2VnbWVudC5mdW5jdGlvbn0gZnVuY3Rpb24gbm90IHByb3ZpZGVkICFgKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3RvcihzZWdtZW50LnNraW5TZWxlY3RvciwgZXhwZXJpZW5jZXMpO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnIC8vVE9ET1xuICAgIH1cblxuICAgIHByaXZhdGUgcnVuU2tpblNlbGVjdG9yID0gYXN5bmMgKGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgaG9va3M/OiBsb2FkZXJIb29rcykgPT4ge1xuICAgICAgICBjb25zdCBza2luSWQgPSBhd2FpdCB0aGlzLl9nZXRTa2luSWRCeVNraW5TZWxlY3Rvcihjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLCBjb21wb25lbnRDb25maWcuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcywgaG9va3MpO1xuICAgICAgICByZXR1cm4gY29tcG9uZW50Q29uZmlnLnR5cGUuc2tpbnMuZmluZChza2luID0+IHNraW4uaWQgPT09IHNraW5JZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGxvYWRlckhvb2tzPzogbG9hZGVySG9va3M7XG5cbiAgICBwdWJsaWMgbG9hZENvbXBvbmVudCA9IGFzeW5jIDxUIGV4dGVuZHMgSU15b3BDb21wb25lbnQgPSBJTXlvcENvbXBvbmVudD4oY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb250YWluZXI/OiBIVE1MRWxlbWVudCB8IFJlZiwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpOlxuICAgICAgICBQcm9taXNlPFQ+ID0+IHtcblxuICAgICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIGNvbnRhaW5lciB3YXMgZm91bmQgZm9yIHRoaXMgY29tcG9uZW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdmVycmlkZGVuQ29uZmlnID0gYXdhaXQgY2hlY2tNeW9wT3ZlcnJpZGUoY29tcG9uZW50Q29uZmlnKTtcbiAgICAgICAgaWYgKG92ZXJyaWRkZW5Db25maWcpIHtcbiAgICAgICAgICAgIC8vVE9ETyA6IGxvZ1xuICAgICAgICAgICAgY29tcG9uZW50Q29uZmlnID0gb3ZlcnJpZGRlbkNvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy8gaWYgKCFjb250YWluZXIuX19ub25Qcm94aWVkKSB7XG4gICAgICAgIC8vICAgICBjb25zdCByZWZDb21wb25lbnQgPSAoY29udGFpbmVyIGFzIHVua25vd24gYXMgTXlvcFJlZkNvbXBvbmVudCk7XG4gICAgICAgIC8vICAgICAvL2lmIHdlIGdvdCBsb2FkQ29tcG9uZW50IG92ZXIgTXlvcFJlZkNvbXBvbmVudFxuICAgICAgICAvLyAgICAgaWYgKHJlZkNvbXBvbmVudC5pZCAmJiByZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudChjb21wb25lbnRDb25maWcsIHJlZkNvbXBvbmVudC5yZWYsIG9wdGlvbnMpO1xuICAgICAgICAvL1xuICAgICAgICAvLyAgICAgICAgIC8vIGxldCByb290Q29tcG9uZW50OiBJTXlvcENvbXBvbmVudCA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgLy8gICAgICAgICAvLyB3aGlsZSghcm9vdENvbXBvbmVudC5lbGVtZW50ICYmIHJvb3RDb21wb25lbnQucGFyZW50KXtcbiAgICAgICAgLy8gICAgICAgICAvLyAgICAgcm9vdENvbXBvbmVudCA9IHJvb3RDb21wb25lbnQucGFyZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gfVxuICAgICAgICAvLyAgICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgLy8gcm9vdENvbXBvbmVudC5lbGVtZW50XG4gICAgICAgIC8vICAgICAgICAgLy8gLy93aGF0IG5vdyA/XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH1cblxuICAgICAgICBjb25zdCBob29rcyA9IHsuLi4odGhpcy5sb2FkZXJIb29rcyA/PyB7fSksIC4uLihvcHRpb25zPy5ob29rcyA/PyB7fSl9O1xuXG4gICAgICAgIGNvbnN0IHJlZiA9IGNvbnRhaW5lciBhcyBSZWY7XG4gICAgICAgIGlmIChyZWYubXlvcCkge1xuICAgICAgICAgICAgaWYgKHJlZi5jb21wb25lbnQpIHtcblxuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyA9IHsuLi5jb21wb25lbnRDb25maWd9O1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZy5pbnN0YW5jZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29tcG9uZW50Q29uZmlnLmluc3RhbmNlXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInJ1blNraW5TZWxlY3RvciBmYWlsZWQgdG8gY2hvb3NlIHNraW4sIGNoZWNrIHRoZSBwcm92aWRlZCBjb25maWdcIik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNraW4gPSBhd2FpdCBvcHRpb25zLmhvb2tzLmFmdGVyU2tpblNlbGVjdGVkKHsuLi5zZWxlY3RlZFNraW59KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNraW46IHNlbGVjdGVkU2tpblxuICAgICAgICAgICAgICAgICAgICAvLyAgc2tpbnM6IFtzZWxlY3RlZFNraW5dXG4gICAgICAgICAgICAgICAgfSBhcyBJRGVkaWNhdGVkU2tpbkNvbmZpZ1xuXG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IHsuLi5vcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9ucy5ob29rc1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudDxUPihyZWYsIGNvbXBvbmVudENvbmZpZywgdGhpcy5jb21wb25lbnRzLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNvbm5lY3QgcmVmcyBhbmQgcHJvcHMgaW5zb2RlIGNyZWF0ZVJlZkNvbXBvbmVudCwgZWxzZXdoZXJlIGl0cyBub3QgcmVhbGx5IDxUPlxuICAgICAgICAgICAgICAgIHJldHVybiByZWZDb21wb25lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbG9hZCBjb21wb25lbnQgZ290IGEgZGV0YWNoZWQgcmVmLicpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250YWluZXIgPSBjb250YWluZXIgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqXG4gICAgICAgICAqIGNob29zZSBza2luIG9uIHJ1bnRpbWUgLi4uXG4gICAgICAgICAqICAgICAgICBjb21wb25lbnRDb25maWcuaW5zdGFuY2Uuc2tpblNlbGVjdG9yLnR5cGVcbiAgICAgICAgICovXG5cbiAgICAgICAgbGV0IHNlbGVjdGVkU2tpbiA9IGF3YWl0IHRoaXMucnVuU2tpblNlbGVjdG9yKGNvbXBvbmVudENvbmZpZywgaG9va3MpIVxuXG4gICAgICAgIGlmICghc2VsZWN0ZWRTa2luKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJydW5Ta2luU2VsZWN0b3IgZmFpbGVkIHRvIGNob29zZSBza2luLCBjaGVjayB0aGUgcHJvdmlkZWQgY29uZmlnXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/Lmhvb2tzPy5hZnRlclNraW5TZWxlY3RlZCkge1xuICAgICAgICAgICAgc2VsZWN0ZWRTa2luID0gYXdhaXQgb3B0aW9ucy5ob29rcy5hZnRlclNraW5TZWxlY3RlZCh7Li4uc2VsZWN0ZWRTa2lufSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcG9uZW50TG9hZGVyID0gdGhpcy5jb21wb25lbnRzTG9hZGVycy5maW5kKGxvYWRlciA9PiBsb2FkZXIudHlwZSA9PT0gc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlKTtcblxuICAgICAgICBpZiAoIWNvbXBvbmVudExvYWRlcikge1xuICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGxvYWRlciBcIiR7c2VsZWN0ZWRTa2luLmxvYWRlci50eXBlfVwiIHdhcyBmb3VuZCBmb3IgY29tcG9uZW50YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2ZvciBsb2FkZWQgd2ViY29tcG9uZW50IG1vZHVsZXMgdG8gZm9sbG93aW5nIGxpbmUgY3JlYXRlcyBhIHJhY2UgY29uZGl0aW9uIHdpdGggdGhlIGluaXQgbWVzc2FnZSBmbG93XG4gICAgICAgIGxldCBjb21wb25lbnQgPSBhd2FpdCBjb21wb25lbnRMb2FkZXIubG9hZChjb21wb25lbnRDb25maWcudHlwZSwgc2VsZWN0ZWRTa2luLCBjb250YWluZXIsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vIFRPRE8gOiB3aGVuIHRoaXMgaXMgbm90IHRydWUgP1xuICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50czJpbml0LnB1c2goY29tcG9uZW50KVxuXG4gICAgICAgIGNvbXBvbmVudC5iaW5kKCdvbkRpc3Bvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjb21wb25lbnQgZGlzcG9zZScsIGNvbXBvbmVudCk7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMgPSB0aGlzLmNvbXBvbmVudHMuZmlsdGVyKGMgPT4gYyAhPT0gY29tcG9uZW50KVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzMmluaXQgPSB0aGlzLmNvbXBvbmVudHMyaW5pdC5maWx0ZXIoYyA9PiBjICE9PSBjb21wb25lbnQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xuXG4gICAgICAgIC8vIHRydWUgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy5jb25uZWN0UHJvcHMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiBtYWtlIHR5cGUgZmllbGQgY29uZGl0aW9uYWwgdHlwZSBpbmZlciBcInN0cmluZ1wiID4gc3RyaW5nLCBcIm51bWJlclwiID4gbnVtYmVyLCBldGMuLi5cbiAgICAgICAgICAgIGNvbXBvbmVudCA9IGNvbm5lY3RQcm9wcyhjb21wb25lbnQsIGNvbXBvbmVudENvbmZpZy50eXBlLnByb3BzLCBzZWxlY3RlZFNraW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IG1ha2Ugb3B0aW9uYWw/XG4gICAgICAgICAgICAvL1RPRE8gOiBmaXggaXNzdWVzIHdpdGggdGltZW91dCBhbmQgd3JvbmcgcmVmIG5hbWVzIGZyb20gY29uZmlnIHZzIGN1cnJlbnQgc2tpblxuICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMoY29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIHRoaXMuY29tcG9uZW50cyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gVE9PRCA6IHRocm93ID9cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW9wdGlvbnM/LnNraXBJbml0KVxuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgIHJldHVybiBjb21wb25lbnQgYXMgVDtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmF2aWdhdGUgPSBhc3luYyA8VCBleHRlbmRzIElNeW9wQ29tcG9uZW50ID0gSU15b3BDb21wb25lbnQ+KGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIG5ld0NvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgb3B0aW9ucz86IG5hdmlnYXRpb25PcHRpb25zKSA9PiB7XG4gICAgICAgIGlmIChjb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hdmlnYXRpbmcgb24gcmVtb3RlIHJlZiBjb21wb25lbnRzIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29tcG9uZW50Lm1hcmtlZEZvckRpc3Bvc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBpZiAob3B0aW9ucz8uaW5wbGFjZSkge1xuICAgICAgICAvLyAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIC8vICAgICAgICAgbGV0IG5ld0NvbXBvbmVudCA9IGF3YWl0IHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5lbGVtZW50KTtcbiAgICAgICAgLy8gICAgICAgICBhd2FpdCBuZXdDb21wb25lbnQuaW5pdGlhdGVkKCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgaWYgKG9wdGlvbnMuaW5pdClcbiAgICAgICAgLy8gICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgLy8gICAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCcuLi4nKVxuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LnN0YWdlZCkge1xuICAgICAgICAgICAgLy9jb25zdCBzZWxlY3RlZFNraW4gPSB0aGlzLnJ1blNraW5TZWxlY3RvcihuZXdDb21wb25lbnRDb25maWcpXG4gICAgICAgICAgICBsZXQgbmV3Q29tcG9uZW50ID0gYXdhaXQgdGhpcy5sb2FkQ29tcG9uZW50PFQ+KG5ld0NvbXBvbmVudENvbmZpZywgY29tcG9uZW50LmNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIGhpZGRlbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge2RpcmVjdGlvbjogJ2FmdGVyJywgY2hpbGQ6IGNvbXBvbmVudC5lbGVtZW50IX0sXG4gICAgICAgICAgICAgICAgLi4ub3B0aW9uc1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmluaXQpXG4gICAgICAgICAgICAgICAgYXdhaXQgb3B0aW9ucy5pbml0KG5ld0NvbXBvbmVudCk7XG5cbiAgICAgICAgICAgIG5ld0NvbXBvbmVudC5zaG93KCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIG5ld0NvbXBvbmVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5leHRTaWJsaW5nID0gY29tcG9uZW50LmVsZW1lbnQhLm5leHRTaWJsaW5nO1xuXG4gICAgICAgICAgICBjb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZENvbXBvbmVudDxUPihuZXdDb21wb25lbnRDb25maWcsIGNvbXBvbmVudC5jb250YWluZXIsIHtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZToge1xuICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb246IFwiYmVmb3JlXCIsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkOiBuZXh0U2libGluZyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBuYXZpZ2F0aW9uT3B0aW9ucyA9IHtcbiAgICBzdGFnZWQ/OiBib29sZWFuLFxuICAgIC8vaW5wbGFjZT86IGJvb2xlYW4sXG4gICAgaW5pdD86IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50KSA9PiBQcm9taXNlPHZvaWQ+XG4gICAgc2tpcEluaXQ/OiBib29sZWFuXG59ICYgbG9hZGVyT3B0aW9uc1xuXG50eXBlIHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvbiA9ICdiZWZvcmUnIHwgJ2FmdGVyJztcblxuXG5leHBvcnQgdHlwZSBsb2FkZXJIb29rcyA9IHtcbiAgICBhZnRlclNraW5TZWxlY3RlZD86IChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiBQcm9taXNlPElTa2luQ29uZmlnPlxufSAmXG4gICAgLy8gc2VnbWVudGF0aW9uIGhvb2tzXG4gICAgKHsgW2tleTogc3RyaW5nXTogKCkgPT4gUHJvbWlzZTxib29sZWFuPiB8IGJvb2xlYW4gfSB8IHt9KVxuXG4vL1RPRE86IHN1cHBvcnQgc2VyaWFsaXphYmxlIHZlcnNpb24gb2YgdGhhdCBvYmplY3RcbmV4cG9ydCBpbnRlcmZhY2UgcmVsYXRpdmVMb2FkQ29uZmlnIHtcbiAgICAvL0lmIHRoaXMgaXMgbnVsbCwgdGhlbiBuZXdOb2RlIGlzIGluc2VydGVkIGF0IHRoZSBlbmQgb2Ygbm9kZSdzIGNoaWxkIG5vZGVzLlxuICAgIC8vaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL05vZGUvaW5zZXJ0QmVmb3JlXG4gICAgY2hpbGQ6IENoaWxkTm9kZSB8IG51bGxcbiAgICBkaXJlY3Rpb246IHJlbGF0aXZlTG9hZENvbmZpZ0RpcmVjdGlvblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFbnZpcm9ubWVudCB7XG4gICAgW2tleTogc3RyaW5nXTogYW55XG59XG5cbnR5cGUgRWxlbWVudEF0dHJpYnV0ZXMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IHVuZGVmaW5lZCB8IG51bGw7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIGxvYWRlck9wdGlvbnMge1xuICAgIGlkPzogc3RyaW5nXG4gICAgaGlkZGVuPzogYm9vbGVhbixcbiAgICBjb25uZWN0UHJvcHM/OiBib29sZWFuXG4gICAgdGltZW91dD86IG51bWJlcixcbiAgICBza2lwSW5pdD86IGJvb2xlYW4sXG4gICAgcmVsYXRpdmU/OiByZWxhdGl2ZUxvYWRDb25maWcsXG4gICAgaG9va3M/OiBsb2FkZXJIb29rcyxcbiAgICBlbGVtZW50QXR0cmlidXRlcz86IEVsZW1lbnRBdHRyaWJ1dGVzLFxuICAgIF9lbnZpcm9ubWVudD86IElFbnZpcm9ubWVudCxcbiAgICBfaGFzUGFyZW50PzogYm9vbGVhblxuICAgIF9pbnNwZWN0aW9uPzogYm9vbGVhblxufVxuXG5pZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgIH07XG59XG5cbmlmICghd2luZG93Lm15b3AuaG9zdFNESykge1xuICAgIGNvbnN0IF9ob3N0U0RLID0gbmV3IEhvc3RTREsoKTtcbiAgICAvL1RPRE86IGVuYWJsZSBsYXp5IGluaXQ/XG4gICAgX2hvc3RTREsuaW5pdCgpO1xuXG4gICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wID0ge1xuICAgICAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICAgICAgfTtcbiAgICB9XG4gICAgd2luZG93Lm15b3AuaG9zdFNESyA9IF9ob3N0U0RLO1xufVxuXG4vLyBAdHMtaWdub3JlXG5leHBvcnQgY29uc3QgaG9zdFNESzogSG9zdFNESyA9IHdpbmRvdy5teW9wLmhvc3RTREs7XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ2hvc3RTREsnLCBob3N0U0RLKTtcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBteW9wOiB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXzogc3RyaW5nLFxuICAgICAgICAgICAgaG9zdFNESzogSG9zdFNESyxcbiAgICAgICAgICAgIElmcmFtZVNESzogSW5zdGFuY2VUeXBlPHR5cGVvZiBJZnJhbWVTREs+XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlciwgSUVsZW1lbnRSZWYsIE15b3BFbGVtZW50UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlLCBEZXRlY3RNeW9wUmVmc01lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxEZXRlY3RNeW9wUmVmc01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkRldGVjdE15b3BSZWZzTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKG1lc3NhZ2U6IERldGVjdE15b3BSZWZzTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbJHtteW9wQXR0cmlidXRlcy5pZH1dYCk7XG4gICAgICAgIC8vY29uc3QgYWxsTXlvcEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgKmApO1xuXG4gICAgICAgIGxldCBteW9wUmVmczogSUVsZW1lbnRSZWZbXSA9IFtdO1xuXG4gICAgICAgIC8vbGV0IGNvdW50ZXJzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG5cbiAgICAgICAgYWxsTXlvcEl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgIGlmIChteW9wSWQpIHtcbiAgICAgICAgICAgICAgICBteW9wUmVmcy5wdXNoKG5ldyBNeW9wRWxlbWVudFJlZihteW9wSWQsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkpXG4gICAgICAgICAgICB9IC8vZWxzZSB7XG4gICAgICAgICAgICAvLyAgICAgaWYgKCFjb3VudGVyc1tpdGVtLnRhZ05hbWVdKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSAwO1xuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICBjb3VudGVyc1tpdGVtLnRhZ05hbWVdID0gY291bnRlcnNbaXRlbS50YWdOYW1lXSArIDE7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gICAgIG15b3BSZWZzLnB1c2gobmV3IFhQYXRoRWxlbWVudFJlZihgJHtpdGVtLnRhZ05hbWV9KCR7Y291bnRlcnNbaXRlbS50YWdOYW1lXX0pYCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IERldGVjdGVkTXlvcFJlZnNNZXNzYWdlKG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkLCBteW9wUmVmcykpXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7QmluZENsaWNrTWVzc2FnZSwgQ2xpY2tSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQmluZE9uQ2xpY2tIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEJpbmRDbGlja01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkJpbmRDbGlja01lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogQmluZENsaWNrTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IENsaWNrUmVwbGF5TWVzc2FnZSgpLCBldmVudCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhhbmRsZXIpO1xuXG4gICAgICAgICAgICBjb25zdCBjbGVhblVwVGFzayA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKGNsZWFuVXBUYXNrKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy9jbGVhbiB1cFxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7IE15b3BNZXNzYWdlcyB9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0NoYW5nZVRleHRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPENoYW5nZVRleHRNZXNzYWdlPiB7XG4gIFxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkNoYW5nZVRleHRNZXNzYWdlO1xuICAgIFxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBDaGFuZ2VUZXh0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpdGVtLnRleHRDb250ZW50ID0gZXZlbnQuY29udGVudDtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBSb290UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3J9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBFeGVjdXRlU2NyaXB0SGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVTY3JpcHRNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVwbGllciA9IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIGRhdGEpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBFeGVjdXRlU2NyaXB0SGFuZGxlckV4ZWN1dG9yKGV2ZW50LCByZXBsaWVyLCBuZXcgUm9vdFJlZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVyTWVzc2FnZSwgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge21ha2VTZXJpYWxpemFibGV9IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxBZGRFdmVudExpc3RlbmVyTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChtZXNzYWdlOiBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihtZXNzYWdlLnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBjb25zdCBjbGVhbnVwVGFza3M6IGFueVtdID0gW107XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG5cbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdCByZXF1ZXN0QW5pbWF0aW9uRnJhbWVcbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEV2ZW50TGlzdGVuZXJDYWxsYmFja01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG1ha2VTZXJpYWxpemFibGUoZSwgbWVzc2FnZS5zZXJpYWxpemFibGVTa2VsZXRvbikpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIobWVzc2FnZS50eXBlLCBoYW5kbGVyKVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHtcbiAgICAgICAgICAgICAgICB0YXNrKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRBdHRyaWJ1dGVNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRBdHRyaWJ1dGVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0hvc3RTREt9IGZyb20gXCIuLi8uLi9ob3N0L2hvc3RTREtcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLnRzXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNyZWF0ZVJlZiA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIC8vVE9ETyA6IHVzZSByZWYgaGVscGVyIGhlcmVcbiAgICAgICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oYFske215b3BBdHRyaWJ1dGVzLmlkfT0nJHtldmVudC5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbiAgICAgICAgICAgIGlmIChhbGxJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U0RLID0gSG9zdFNESy5JbnN0YW5jZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlZkNvbXBvbmVudCA9IGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChldmVudC5uZXN0ZWRDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGFsbEl0ZW1zLml0ZW0oMCksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIGl0IHRvIHBhc3MgdGhlIGFzc2lnbmVkIGlkc1xuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFJlZkNvbmZpZzogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJlZkNvbXBvbmVudC5yZWZzKS5mb3JFYWNoKHJlZk5hbWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVmID0gcmVmQ29tcG9uZW50LnJlZnNbcmVmTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIHJlZiA9IHJlZi5fX25vblByb3hpZWQgfHwgcmVmO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWZDb25maWcucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG5lc3RlZFJlZkNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciAtIERPTSBlbGVtZW50IG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIFtdLCB0cnVlKSk7XG4gICAgICAgICAgICAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjcmVhdGVSZWYoKS50aGVuKCk7XG4gICAgICAgIC8vcmV0dXJuaW5nIHVuZGVmaW5lZCBzbyBpdCB3b24ndCBhY3QgYXMgYSBjbGVhbnVwXG4gICAgfVxufVxuIiwgIi8vIEB0cy1ub2NoZWNrXG5leHBvcnQgY29uc3Qgb2JzZXJ2ZURPTSA9IChvYmo6IEhUTUxFbGVtZW50IHwgbnVsbCwgY2FsbGJhY2s6IChtdXRhdGlvblJlY29yZHM/OiBNdXRhdGlvblJlY29yZFtdKSA9PiB2b2lkKSA9PiB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgY29uc29sZS5sb2coJ24nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgTXV0YXRpb25PYnNlcnZlciA9IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyIHx8IHdpbmRvdy5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXG4gICAgaWYgKCFvYmogfHwgb2JqLm5vZGVUeXBlICE9PSAxKSByZXR1cm47XG5cbiAgICBpZiAoTXV0YXRpb25PYnNlcnZlcikge1xuICAgICAgICAvLyBkZWZpbmUgYSBuZXcgb2JzZXJ2ZXJcbiAgICAgICAgY29uc3QgbXV0YXRpb25PYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKVxuICAgICAgICAvLyBoYXZlIHRoZSBvYnNlcnZlciBvYnNlcnZlIGZvciBjaGFuZ2VzIGluIGNoaWxkcmVuXG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IHthdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWV9O1xuICAgICAgICBtdXRhdGlvbk9ic2VydmVyLm9ic2VydmUob2JqLCBjb25maWcpXG4gICAgICAgIHJldHVybiBtdXRhdGlvbk9ic2VydmVyXG4gICAgfVxuXG4gICAgLy8gYnJvd3NlciBzdXBwb3J0IGZhbGxiYWNrXG4gICAgZWxzZSBpZiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIpIHtcbiAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVJbnNlcnRlZCcsIGNhbGxiYWNrLCBmYWxzZSlcbiAgICAgICAgb2JqLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTU5vZGVSZW1vdmVkJywgY2FsbGJhY2ssIGZhbHNlKVxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtvYnNlcnZlRE9NfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL2RvbU9ic2VydmVyXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxFeGVjdXRlU2NyaXB0TWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50LnNvdXJjZSkge1xuICAgICAgICAgICAgb2JzZXJ2ZURPTShkb2N1bWVudC5ib2R5LCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSgpXG4gICAgICAgICAgICAgICAgICAgIC8vICBuZXcgRW52ZWxvcGVkTWVzc2FnZShldmVudC5zb3VyY2UhLCBuZXcgTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UoKSlcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuXG4gICAgICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYoIWRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gfHwgIWRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUgfHwgbm9kZURhdGEudmFsdWUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWtleSkge1xuICAgICAgICAgICAgICAgIC8vICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmIChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldLnZhbHVlKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgZGF0YU9iamVjdC51bm1hcHBlZERhdGEhLnB1c2gobm9kZURhdGEpO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGF0YU9iamVjdDtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uXG4gICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JyB8fCBlbGVtZW50LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2hlY2tlZCA/IGVsZW1lbnQudmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBpbnB1dCBhbmQgdGV4dGFyZWEgZWxlbWVudHNcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsZW1lbnQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc2VsZWN0IGVsZW1lbnRzIChkcm9wZG93bnMpXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGVkaXRhYmxlIGRpdnMgKGNvbnRlbnRFZGl0YWJsZSlcbiAgICBpZiAoZWxlbWVudC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5pbm5lclRleHQgfHwgZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICB9XG5cbiAgICAvLyBJZiBpdCdzIGFuIHVuc3VwcG9ydGVkIGVsZW1lbnQgdHlwZVxuICAgIHJldHVybiBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgR2V0RWxlbWVudFZhbHVlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxHZXRFbGVtZW50VmFsdWVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRFbGVtZW50VmFsdWVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKFxuICAgICAgICAgICAgICAgIGdldElucHV0VmFsdWUoaXRlbSlcbiAgICAgICAgICAgICksIGV2ZW50KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtHZXRBdHRyaWJ1dGVNZXNzYWdlLCBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Z2V0Rmlyc3RFbGVtZW50QnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEdldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8R2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuR2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBHZXRBdHRyaWJ1dGVNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBnZXRGaXJzdEVsZW1lbnRCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KVxuICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlKGl0ZW0uZ2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUpKSwgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7UmVzaXplT2JzZXJ2ZXJNZXNzYWdlLCBTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2V9IGZyb20gJy4uLy4uL21lc3NhZ2VzJ1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZVxuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgLy9UT0RPIDogcGFzcyB0aGUgaGVpZ2h0XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlc2l6ZU9ic2VydmVyTWVzc2FnZSgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSk7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKVxuICAgICAgICB9XG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRJbm5lckh0bWw+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLlNldElubmVySHRtbDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBTZXRJbm5lckh0bWwpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaXRlbS5pbm5lckhUTUwgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICIvKipcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICogVGhlIElmcmFtZSBTREsgaXMgaW50ZW5kZWQgZm9yIHNjZW5hcmlvcyB3aGVyZSBkZXZlbG9wZXJzIHdpc2ggdG8gaW1wbGVtZW50IE15b3AgY29tcG9uZW50cyBhcyBzZXBhcmF0ZSB3ZWIgYXBwbGljYXRpb25zIGhvc3RlZCB3aXRoaW4gaWZyYW1lcy48YnIvPjxici8+XG4gKiBCeSBpbXBvcnRpbmcgdGhlIElmcmFtZSBTREssIGRldmVsb3BlcnMgZ2FpbiBhY2Nlc3MgdG8gdG9vbHMgYW5kIHV0aWxpdGllcyBuZWNlc3NhcnkgZm9yIGhhbmRsaW5nIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiBhbmQgdGhlIGVtYmVkZGVkIGlmcmFtZS1iYXNlZCBNeW9wIGNvbXBvbmVudHM8YnIvPjxici8+XG4gKiBUaGlzIFNESyBmYWNpbGl0YXRlcyBzZWN1cmUgaXNvbGF0aW9uLCBhbGxvd2luZyBjb21wb25lbnRzIHRvIGZ1bmN0aW9uIGluZGVwZW5kZW50bHkgd2hpbGUgc3RpbGwgYmVuZWZpdGluZyBmcm9tIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBhbmQgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24uPGJyLz48YnIvPlxuICpcbiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gYGBganNcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtnZXRJZnJhbWVNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge0lmcmFtZVNES30gZnJvbSAnQG15b3Avc2RrL2lmcmFtZSc7XG4gYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlclwiO1xuaW1wb3J0IHtzZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvc2V0QXR0cmlidXRlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBJbml0UmVxdWVzdCxcbiAgICBNZXNzYWdlRGlyZWN0aW9uLFxuICAgIE15b3BCaW5kTWVzc2FnZSxcbiAgICBNeW9wQmluZFJlcGxheU1lc3NhZ2Vcbn0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7U2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlclwiO1xuaW1wb3J0IHtHZXRFbGVtZW50VmFsdWVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50c1wiO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcbmltcG9ydCB7R2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2dldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvU2V0UmVzaXplT2JzZXJ2ZXJIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NldElubmVySHRtbEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzXCI7XG5cbi8qKlxuIFRoZSBJZnJhbWUgU0RLIGlzIGludGVuZGVkIGZvciBzY2VuYXJpb3Mgd2hlcmUgZGV2ZWxvcGVycyB3aXNoIHRvIGltcGxlbWVudCBNeW9wIGNvbXBvbmVudHMgYXMgc2VwYXJhdGUgd2ViIGFwcGxpY2F0aW9ucyBob3N0ZWQgd2l0aGluIGlmcmFtZXMuPGJyLz48YnIvPlxuIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiBUaGlzIFNESyBmYWNpbGl0YXRlcyBzZWN1cmUgaXNvbGF0aW9uLCBhbGxvd2luZyBjb21wb25lbnRzIHRvIGZ1bmN0aW9uIGluZGVwZW5kZW50bHkgd2hpbGUgc3RpbGwgYmVuZWZpdGluZyBmcm9tIHRoZSBvdmVyYWxsIHN0cnVjdHVyZSBhbmQgbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgcHJvdmlkZWQgYnkgdGhlIGhvc3QgYXBwbGljYXRpb24uPGJyLz48YnIvPlxuXG4gT25jZSBsb2FkZWQgdGhlIGBSb290U0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuIGBgYGpzXG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7Z2V0SWZyYW1lTW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IGdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIElmcmFtZVNESyBleHRlbmRzIEJhc2VNeW9wU0RLIHtcblxuICAgIHB1YmxpYyB2ZXJzaW9uID0gdmVyc2lvbjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGlmICghd2luZG93Lm15b3ApIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIHdpbmRvdy5teW9wID0ge31cbiAgICAgICAgfVxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIHdpbmRvdy5teW9wLklmcmFtZVNESyA9IHRoaXM7XG4gICAgfVxuXG4gICAgbWVzc2FnZVRvSG9zdCA9IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgY29uc3QgY29tcG9uZW50SWRzID0gT2JqZWN0LmtleXModGhpcy5jb21wb25lbnRzKTtcblxuICAgICAgICBpZiAoIW1lc3NhZ2UuZGVzdGluYXRpb24pIHtcbiAgICAgICAgICAgIGlmIChyZXBsYXlUbz8ucm91dGUpIHtcbiAgICAgICAgICAgICAgICAvLyB0YWtpbmcgdGhlIGZpcnN0IGNvbXBvbmVudCB0aGF0IGluaXRpYXRlZCB0aGF0IGN5Y2xlXG4gICAgICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHJlcGxheVRvLnJvdXRlW3JlcGxheVRvLnJvdXRlLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gY29tcG9uZW50SWRzWzBdXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFtZXNzYWdlLnNvdXJjZSlcbiAgICAgICAgICAgIG1lc3NhZ2Uuc291cmNlID0gY29tcG9uZW50SWRzWzBdO1xuXG4gICAgICAgIG1lc3NhZ2UuZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi51cFxuXG4gICAgICAgIHdpbmRvdy5wYXJlbnQ/LnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIC4uLm1lc3NhZ2VcbiAgICAgICAgfSwgJyonKTtcbiAgICB9XG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW10gPSBbXG4gICAgICAgIG5ldyBDaGFuZ2VUZXh0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgQmluZE9uQ2xpY2tIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBFeGVjdXRlU2NyaXB0SGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IHNldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRSZXNpemVPYnNlcnZlckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEdldEF0dHJpYnV0ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcblxuICAgICAgICAvL2NvbXBvc2l0ZSBzdXBwb3J0IG1lc3NhZ2VzIDpcbiAgICAgICAgbmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdClcbiAgICBdO1xuXG4gICAgcHVibGljIGluaXQgPSAoKSA9PiB7XG4gICAgICAgIHdpbmRvdy5vbm1lc3NhZ2UgPSB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzLmJpbmQodGhpcylcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBJbml0UmVxdWVzdCgpKVxuICAgIH1cblxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdJZnJhbWVTREsnLCBJZnJhbWVTREspO1xuIiwgImltcG9ydCAqIGFzIGFsbCBmcm9tICcuL2luZGV4J1xuaW1wb3J0IHtkZWZpbmVEeW5hbWljSW1wb3J0fSBmcm9tIFwiLi4vZHluYW1pY0ltcG9ydC9kZWZpbmVEeW5hbWljSW1wb3J0XCI7XG5cbmNvbnN0IE15b3BNZXNzYWdlcyA9IHtcbiAgICAuLi5hbGxcbn1cblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnTXlvcE1lc3NhZ2VzJywgTXlvcE1lc3NhZ2VzKTtcbiIsICJpbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnQudHNcIjtcbmltcG9ydCAqIGFzIE15b3BIZWxwZXJzIGZyb20gXCIuL2luZGV4LnRzXCI7XG5cbmV4cG9ydCAqIGZyb20gXCIuL2luZGV4LnRzXCI7XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ015b3BIZWxwZXJzJywgTXlvcEhlbHBlcnMpO1xuIiwgIi8vIEB0cy1ub2NoZWNrXG5pbXBvcnQge21vZHVsZUluc3RhbmNlS2V5LCBvbkxvYWRLZXl9IGZyb20gXCIuL2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcblxuaWYgKCF3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ10pIHtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBjb25zdCBzY3JpcHRTcmMgPSBkb2N1bWVudC5jdXJyZW50U2NyaXB0Py5zcmM7XG4gICAgY29uc3QgX19wdWJsaWNfYXV0b19wYXRoX18gPSBzY3JpcHRTcmMgPyBzY3JpcHRTcmMuc3BsaXQoJy8nKS5zbGljZSgwLCAtMSkuam9pbignLycpIDogJyc7XG5cbiAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ10gPSB7XG4gICAgICAgIF9fcHVibGljX2F1dG9fcGF0aF9fLFxuICAgICAgICBfX3VzZV9wdWJsaWNfYXV0b19wYXRoX186IHRydWUsXG4gICAgICAgIF9fcHVibGljX3BhdGhfXzogdW5kZWZpbmVkLFxuICAgICAgICBfX2xvYWRpbmdfdGltZW91dF9fIDogNSAqIDEwMDBcbiAgICB9O1xufSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVkIG1vcmUgdGhhbiBvbmNlLicpO1xufVxuXG53aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bJ2xvYWRfX2ZlZGVyYXRpb25fXyddID0gKHNjcmlwdEZpbGVQYXRoLCBtb2R1bGVOYW1lLCBvbkxvYWQpID0+IHtcblxuICAgIGlmICghd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdKSB7XG4gICAgICAgIGxldCBzY3JpcHRUYWc7XG5cbiAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdID0ge307XG4gICAgICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXVttb2R1bGVOYW1lXVtvbkxvYWRLZXldID0gKG1vZHVsZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNjcmlwdFRhZykge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0VGFnKTtcbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0OlxuICAgICAgICAgICAgICAgIHNjcmlwdFRhZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ3NjcmlwdCByZW1vdmVkLi4uICcpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKG1vZHVsZSk7XG5cbiAgICAgICAgICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXVttb2R1bGVOYW1lXVttb2R1bGVJbnN0YW5jZUtleV0gPSBtb2R1bGU7XG4gICAgICAgICAgICBvbkxvYWQobW9kdWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNjcmlwdFRhZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgICAgICAvL3NjcmlwdFRhZy50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7XG4gICAgICAgIHNjcmlwdFRhZy50eXBlID0gJ21vZHVsZSc7XG4gICAgICAgIHNjcmlwdFRhZy5zcmMgPSBzY3JpcHRGaWxlUGF0aDtcblxuICAgICAgICBzY3JpcHRUYWcuYXN5bmMgPSB0cnVlO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdFRhZyk7XG5cbiAgICAgICAgLy8gY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsaW5rXCIpO1xuICAgICAgICAvLyBsaW5rLnR5cGUgPSBcInRleHQvY3NzXCI7XG4gICAgICAgIC8vIGxpbmsucmVsID0gXCJzdHlsZXNoZWV0XCI7XG4gICAgICAgIC8vIGxpbmsuaHJlZiA9IGZpbGVOYW1lLnJlcGxhY2UoJy5qcycsICcuY3NzJyk7XG4gICAgICAgIC8vIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobGluayk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhgX19mZWRlcmF0aW9uX18gbW9kdWxlICR7bW9kdWxlTmFtZX0gYWxyZWFkeSBsb2FkZWQuYClcbiAgICAgICAgb25Mb2FkKHdpbmRvd1snX19mZWRlcmF0aW9uX18nXVttb2R1bGVOYW1lXVttb2R1bGVJbnN0YW5jZUtleV0pO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgJy4vZHluYW1pY0ltcG9ydC9sb2FkX19mZWRlcmF0aW9uX18nO1xuLy8gQHRzLWlnbm9yZSBoYW5kbGVkIGJ5IGN1c3RvbSBlc2J1aWxkIHBsdWdpblxuaW1wb3J0IHZlcnNpb24gZnJvbSBcIm15b3Atc2RrLXZlcnNpb25cIjtcblxuY29uc29sZS5sb2coJ215b3Agcm9vdCBzZGsgLSBsb2FkZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pO1xuXG4vLyBUT0RPIDogcmVhZCB2YWx1ZSBmcm9tIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXSA/XG4vL2NvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vZGZkbGsycDFtMTg3di5jbG91ZGZyb250Lm5ldC9teW9wX3Nkay5taW4uanMnXG5jb25zdCBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyA9ICdodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dC9teW9wX3Nkay5taW4uanMnXG5cbmNvbnN0IGdldEhvc3RNb2R1bGUgPSAoKSA9PiBpbXBvcnQoJy4vaG9zdC9ob3N0U0RLJylcbmNvbnN0IGdldElmcmFtZU1vZHVsZSA9ICgpID0+IGltcG9ydCgnLi9JZnJhbWUvSWZyYW1lU0RLJylcbmNvbnN0IGdldFdlYmNvbXBvbmVudE1vZHVsZSA9ICgpID0+IGltcG9ydCgnLi93ZWJjb21wb25lbnQvV2ViQ29tcG9uZW50U0RLJylcbmNvbnN0IGdldE15b3BNZXNzYWdlcyA9ICgpID0+IGltcG9ydCgnLi9tZXNzYWdlcy9NeW9wTWVzc2FnZXMnKVxuY29uc3QgZ2V0TXlvcEhlbHBlcnMgPSAoKSA9PiBpbXBvcnQoJy4vaGVscGVycy9NeW9wSGVscGVycycpXG5cbmNvbnN0IGV4cG9zZUdsb2JhbGx5ID0gKGltcG9ydEZ1bmN0aW9uOiAoKSA9PiBQcm9taXNlPGFueT4pID0+IHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIGFzeW5jICgpID0+IChhd2FpdCBpbXBvcnRGdW5jdGlvbigpKS5nZXQoKVxufVxuXG4vLyBGb3Igc2NyaXB0L2dsb2JhbCB1c2FnZSA6XG5jb25zdCByb290U0RLID0ge1xuICAgIHZlcnNpb24gOiB2ZXJzaW9uLFxuICAgIGdldEhvc3RNb2R1bGU6IGV4cG9zZUdsb2JhbGx5KGdldEhvc3RNb2R1bGUpLFxuICAgIGdldElmcmFtZU1vZHVsZTogZXhwb3NlR2xvYmFsbHkoZ2V0SWZyYW1lTW9kdWxlKSxcbiAgICBnZXRXZWJjb21wb25lbnRNb2R1bGU6IGV4cG9zZUdsb2JhbGx5KGdldFdlYmNvbXBvbmVudE1vZHVsZSksXG4gICAgZ2V0TXlvcE1lc3NhZ2VzOiBleHBvc2VHbG9iYWxseShnZXRNeW9wTWVzc2FnZXMpLFxuICAgIGdldE15b3BIZWxwZXJzOiBleHBvc2VHbG9iYWxseShnZXRNeW9wSGVscGVycylcbn07XG5cbi8vIEB0cy1pZ25vcmVcbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfVxufVxuXG4vLyBAdHMtaWdub3JlXG5pZiAoIXdpbmRvdy5teW9wLnJvb3RTREspIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcm9vdFNESyxcbiAgICAgICAgLi4ud2luZG93Lm15b3BcbiAgICB9O1xufSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhcIm15b3Agcm9vdCBob3N0IGxvYWRlZCBtb3JlIHRoYW4gb25jZS5cIik7XG59XG5cbi8vIEZvciBidW5kbGVycyB1c2FnZSA6XG5jb25zdCBzZGtNb2R1bGUgPSB7XG4gICAgZ2V0SG9zdE1vZHVsZSxcbiAgICBnZXRJZnJhbWVNb2R1bGUsXG4gICAgZ2V0V2ViY29tcG9uZW50TW9kdWxlXG59XG5leHBvcnQgdHlwZSByb290U0RLVHlwZSA9IHR5cGVvZiBzZGtNb2R1bGU7XG5cbmV4cG9ydCB7XG4gICAgZ2V0SG9zdE1vZHVsZSxcbiAgICBnZXRJZnJhbWVNb2R1bGUsXG4gICAgZ2V0V2ViY29tcG9uZW50TW9kdWxlXG59XG5cbi8vIGRlY2xhcmUgZ2xvYmFsIHtcbi8vICAgICBpbnRlcmZhY2UgV2luZG93IHtcbi8vICAgICAgICAgbXlvcDoge1xuLy8gICAgICAgICAgICAgcm9vdFNESzogdHlwZW9mIHJvb3RTREtcbi8vICAgICAgICAgfVxuLy8gICAgIH1cbi8vIH1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsSUFBYSxnQkFDQSxXQUNBLG1CQUVBO0FBSmI7QUFBQTtBQUFBO0FBQU8sSUFBTSxpQkFBaUI7QUFDdkIsSUFBTSxZQUFZO0FBQ2xCLElBQU0sb0JBQW9CO0FBRTFCLElBQU0sc0JBQXNCLENBQUMsWUFBb0IsV0FBZ0I7QUFFcEUsVUFBSSxPQUFPLGNBQWMsS0FBSyxPQUFPLGNBQWMsRUFBRSxVQUFVLEtBQUssT0FBTyxjQUFjLEVBQUUsVUFBVSxFQUFFLFNBQVMsR0FBRztBQUUvRyxlQUFPLGNBQWMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEVBQUMsQ0FBQyxVQUFVLEdBQUcsT0FBTSxDQUFDO0FBQUEsTUFDeEUsT0FBTztBQUFBLE1BRVA7QUFBQSxJQUNKO0FBQUE7QUFBQTs7O0FDWkEsSUFBTztBQUFQO0FBQUE7QUFBQSxJQUFPLDJCQUFRO0FBQUE7QUFBQTs7O0FDQWYsSUFJYTtBQUpiO0FBQUE7QUFBQTtBQUlPLElBQU0sZUFBZTtBQUFBO0FBQUEsTUFFeEIsZUFBZTtBQUFBLE1BQ2YsZ0JBQWdCO0FBQUEsTUFDaEIsZUFBZTtBQUFBLE1BQ2Ysa0JBQWtCO0FBQUEsTUFFbEIscUJBQXFCO0FBQUEsTUFDckIsb0JBQW9CO0FBQUEsTUFDcEIseUJBQXlCO0FBQUEsTUFFekIsd0JBQXdCO0FBQUEsTUFFeEIsMkJBQTJCO0FBQUEsTUFDM0IsdUJBQXVCO0FBQUEsTUFFdkIsNkJBQTZCO0FBQUEsTUFDN0Isb0JBQW9CO0FBQUEsTUFFcEIsMEJBQTBCO0FBQUEsTUFDMUIsdUJBQXVCO0FBQUEsTUFFdkIsZ0JBQWdCO0FBQUE7QUFBQSxNQUdoQiwwQkFBMEI7QUFBQSxNQUMxQiw4QkFBOEI7QUFBQSxNQUM5Qiw0QkFBNEI7QUFBQSxNQUU1QixrQkFBa0I7QUFB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SSxDQUFDLE9BQU8sTUFBTTtBQUVkLFNBQU8sT0FBTztBQUFBLElBQ1YseUJBQUFBO0FBQUEsRUFDSjtBQUNKO0FBR0EsSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTO0FBRXRCLFNBQU8sT0FBTztBQUFBO0FBQUEsSUFFVjtBQUFBLEtBQ0csT0FBTztBQUVsQixPQUFPO0FBQ0gsVUFBUSxJQUFJLHVDQUF1QztBQUN2RDsiLAogICJuYW1lcyI6IFsiUmVwbGF5TWVzc2FnZUtleSIsICJtYXRjaCIsICJzY3JpcHRJbnB1dHMiLCAic2NyaXB0SW5wdXRzIiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgInNlZW4iLCAidGFyZ2V0IiwgIm1ha2VTZXJpYWxpemFibGUiLCAiX2EiLCAiaGVpZ2h0IiwgIndpZHRoIiwgIl9hIiwgIl9hIiwgIl9hIiwgImluaXRfY29uc3RzIiwgImluaXRfY29uc3RzIiwgImluaXRfY29uc3RzIiwgImluaXRfY29uc3RzIiwgImhvc3RTREsiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJlbGVtZW50IiwgImluaXRfZXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAic2RrIiwgInNlZW4iLCAiZG9tSWQiLCAiaW5pdF9oZWxwZXJzIiwgImluaXRfaGVscGVycyIsICJza2luIiwgImNvbXBvbmVudCIsICJfYSIsICJzZWdtZW50IiwgImV4cGVyaWVuY2UiLCAic2VsZWN0ZWRTa2luIiwgIkRldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgImluaXRfY29uc3RzIiwgIkJpbmRPbkNsaWNrSGFuZGxlciIsICJpbml0X2JpbmRPbkNsaWNrSGFuZGxlciIsICJDaGFuZ2VUZXh0SGFuZGxlciIsICJpbml0X2NoYW5nZVRleHRIYW5kbGVyIiwgIkV4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImluaXRfZXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAiaW5pdF9hZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJzZXRBdHRyaWJ1dGVIYW5kbGVyIiwgImluaXRfc2V0QXR0cmlidXRlSGFuZGxlciIsICJDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJpbml0X0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgImluaXRfY29uc3RzIiwgImhvc3RTREsiLCAiZ2V0SW5wdXRWYWx1ZSIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgImluaXRfR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJpbml0X2NvbnN0cyIsICJlbGVtZW50IiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiaW5pdF9zZXRJbm5lckh0bWxIYW5kbGVyIiwgImluaXRfRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X2JpbmRPbkNsaWNrSGFuZGxlciIsICJpbml0X2NoYW5nZVRleHRIYW5kbGVyIiwgImluaXRfZXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9hZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJpbml0X3NldEF0dHJpYnV0ZUhhbmRsZXIiLCAiaW5pdF9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciIsICJpbml0X0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiaW5pdF9zZXRJbm5lckh0bWxIYW5kbGVyIiwgIl9hIiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgIlNldElubmVySHRtbEhhbmRsZXIiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgIkRldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiQWRkRXZlbnRMaXN0ZW5lckhhbmRsZXIiLCAic2V0QXR0cmlidXRlSGFuZGxlciIsICJHZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgIk15b3BNZXNzYWdlcyIsICJpbml0X015b3BNZXNzYWdlcyIsICJpbml0X2hlbHBlcnMiLCAiX19ST09UX1NES19QVUJMSUNfVVJMX18iXQp9Cg==
|
|
4020
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50cyIsICJ2ZXJzaW9uOm15b3Atc2RrLXZlcnNpb24iLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V1aWQudHMiLCAiLi4vLi4vc3JjL3V0aWxzL3V0aWxzLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9CYXNlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQmluZENsaWNrTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2hhbmdlVGV4dE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9DdXN0b21SZWZNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9BZGRFdmVudExpc3RlbmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0QXR0cmlidXRlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvR2V0RWxlbWVudFZhbHVlTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvU2V0SW5uZXJIdG1sLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9Jbml0TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRW52ZWxvcGVkTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9HZXRBdHRyaWJ1dGVNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9FeGVjdXRlQ29tcG9uZW50TWV0aG9kLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZS50cyIsICIuLi8uLi9zcmMvbWVzc2FnZXMvQ2xlYW51cE1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL0Rpc3Bvc2VNZXNzYWdlLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UudHMiLCAiLi4vLi4vc3JjL21lc3NhZ2VzL2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvSU15b3BDb21wb25lbnQudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi9NeW9wRWxlbWVudFJlZi50cyIsICIuLi8uLi9zcmMvY29tbW9uL2Jhc2VNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvY29tbW9uL0Jhc2VNeW9wU0RLLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vaW5kZXgudHMiLCAiLi4vLi4vc3JjL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvZ01lc3NhZ2VzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9jb21wb25lbnRDb3JlLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcElmcmFtZUNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL0lNeW9wTG9hZGVyLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvaWZyYW1lTG9hZGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvY29uc3RzLnRzIiwgIi4uLy4uL3NyYy9ob3N0L2NvbXBvbmVudHMvbXlvcFdlYmNvbXBvbmVudC50cyIsICIuLi8uLi9zcmMvaG9zdC9sb2FkZXJzL3dlYmNvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL2NvbnN0cy50cyIsICIuLi8uLi9zcmMvY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L3NoYWRvd1Jvb3RSZWYudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL2V4ZWN1dGVTY3JpcHRIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy93ZWJjb21wb25lbnQvbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL3dlYmNvbXBvbmVudC9tZXNzYWdlSGFuZGxlcnMvc2V0SW5uZXJIdG1sSGFuZGxlci50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L1dlYkNvbXBvbmVudFNESy50cyIsICIuLi8uLi9zcmMvd2ViY29tcG9uZW50L2luZGV4LnRzIiwgIi4uLy4uL3NyYy9ob3N0L2xvYWRlcnMvSFRNTENvbXBvbmVudExvYWRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9hcHBseVN0eWxlc2hlZXQudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvaWZyYW1lU2tpblVybFRva2VuaXplci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9jbGFzc0xpc3QudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvY29uZmlnQnVpbGRlci50cyIsICIuLi8uLi9zcmMvaGVscGVycy9DbG91ZFJlcG9zaXRvcnkudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvZXhlYy50cyIsICIuLi8uLi9zcmMvaGVscGVycy9pbmRleC50cyIsICIuLi8uLi9zcmMvaG9zdC9teW9wT3ZlcnJpZGUudHMiLCAiLi4vLi4vc3JjL2hvc3QvaG9zdFNESy50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9leGVjdXRlU2NyaXB0SGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIudHMiLCAiLi4vLi4vc3JjL0lmcmFtZS9tZXNzYWdlSGFuZGxlcnMvR2V0RWxlbWVudFZhbHVlSGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9nZXRBdHRyaWJ1dGVIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvbWVzc2FnZUhhbmRsZXJzL1NldFJlc2l6ZU9ic2VydmVySGFuZGxlci50cyIsICIuLi8uLi9zcmMvSWZyYW1lL21lc3NhZ2VIYW5kbGVycy9zZXRJbm5lckh0bWxIYW5kbGVyLnRzIiwgIi4uLy4uL3NyYy9JZnJhbWUvSWZyYW1lU0RLLnRzIiwgIi4uLy4uL3NyYy9tZXNzYWdlcy9NeW9wTWVzc2FnZXMudHMiLCAiLi4vLi4vc3JjL2hlbHBlcnMvTXlvcEhlbHBlcnMudHMiLCAiLi4vLi4vc3JjL2R5bmFtaWNJbXBvcnQvbG9hZF9fZmVkZXJhdGlvbl9fLnRzIiwgIi4uLy4uL3NyYy9TREsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBjb25zdCBfX2ZlZGVyYXRpb25fXyA9IFwiX19mZWRlcmF0aW9uX19cIlxuZXhwb3J0IGNvbnN0IG9uTG9hZEtleSA9IFwib25Mb2FkXCJcbmV4cG9ydCBjb25zdCBtb2R1bGVJbnN0YW5jZUtleSA9IFwibW9kdWxlSW5zdGFuY2VcIlxuXG5leHBvcnQgY29uc3QgZGVmaW5lRHluYW1pY0ltcG9ydCA9IChnbG9iYWxOYW1lOiBzdHJpbmcsIG1vZHVsZTogYW55KSA9PiB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGlmICh3aW5kb3dbX19mZWRlcmF0aW9uX19dICYmIHdpbmRvd1tfX2ZlZGVyYXRpb25fX11bZ2xvYmFsTmFtZV0gJiYgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93W19fZmVkZXJhdGlvbl9fXVtnbG9iYWxOYW1lXVtvbkxvYWRLZXldKHtbZ2xvYmFsTmFtZV06IG1vZHVsZX0pXG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnX19mZWRlcmF0aW9uX18gbG9hZGVyIG5vdCBkZWZpbmVkIGZvciBtb2R1bGUnLCBtb2R1bGUpO1xuICAgIH1cbn0iLCAiZXhwb3J0IGRlZmF1bHQgJzAuMS40Nic7IiwgInR5cGUgU3RyaW5nV2l0aEF1dG9jb21wbGV0ZTxUPiA9IFQgfCAoc3RyaW5nICYgUmVjb3JkPG5ldmVyLCBuZXZlcj4pO1xuXG5leHBvcnQgdHlwZSBNeW9wTWVzc2FnZUtleSA9IFN0cmluZ1dpdGhBdXRvY29tcGxldGU8a2V5b2YgdHlwZW9mIE15b3BNZXNzYWdlcyB8IGtleW9mIHR5cGVvZiBNeW9wTWVzc2FnZXMuSW4+O1xuXG5leHBvcnQgY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC8vaG9zdCB0byBjb21wb25lbnRcbiAgICAnSW5pdFJlcXVlc3QnOiAnSW5pdFJlcXVlc3QnLFxuICAgICdJbml0UmVzcG9uc2UnOiAnSW5pdFJlc3BvbnNlJyxcbiAgICAnSW5pdE1lc3NhZ2UnOiAnSW5pdE1lc3NhZ2UnLFxuICAgICdEaXNwb3NlTWVzc2FnZSc6ICdEaXNwb3NlTWVzc2FnZScsXG5cbiAgICAnQ2hhbmdlVGV4dE1lc3NhZ2UnOiAnQ2hhbmdlVGV4dE1lc3NhZ2UnLFxuICAgICdCaW5kQ2xpY2tNZXNzYWdlJzogJ0JpbmRDbGlja01lc3NhZ2UnLFxuICAgICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnOiAnRGV0ZWN0TXlvcFJlZnNNZXNzYWdlJyxcblxuICAgICdFeGVjdXRlU2NyaXB0TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0TWVzc2FnZScsXG5cbiAgICAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnOiAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnLFxuICAgICdTZXRBdHRyaWJ1dGVNZXNzYWdlJzogJ1NldEF0dHJpYnV0ZU1lc3NhZ2UnLFxuXG4gICAgJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UnOiAnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZScsXG4gICAgJ0VudmVsb3BlZE1lc3NhZ2UnOiAnRW52ZWxvcGVkTWVzc2FnZScsXG5cbiAgICAnR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc6ICdHZXRFbGVtZW50VmFsdWVNZXNzYWdlJyxcbiAgICAnR2V0QXR0cmlidXRlTWVzc2FnZSc6ICdHZXRBdHRyaWJ1dGVNZXNzYWdlJyxcblxuICAgICdTZXRJbm5lckh0bWwnOiAnU2V0SW5uZXJIdG1sJyxcblxuICAgIC8vY29tcG9uZW50IG1lc3NhZ2VzXG4gICAgJ0V4ZWN1dGVDb21wb25lbnRNZXRob2QnOiAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCcsXG4gICAgJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJyxcbiAgICAnU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1NldFJlc2l6ZU9ic2VydmVyTWVzc2FnZScsXG5cbiAgICAnQ2xlYW51cE1lc3NhZ2UnOiAnQ2xlYW51cE1lc3NhZ2UnLFxuXG4gICAgLy8gZXh0ZXJuYWwgdG8gaG9zdCA6XG4gICAgSW46IHtcbiAgICAgICAgJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJzogJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJyxcbiAgICAgICAgJ0NsaWNrUmVwbGF5TWVzc2FnZSc6ICdDbGlja1JlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSc6ICdFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlJyxcblxuICAgICAgICAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSc6ICdFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlJyxcbiAgICAgICAgJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnOiAnRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZScsXG5cbiAgICAgICAgXCJHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlXCI6IFwiR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZVwiLFxuICAgICAgICAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnOiAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnLFxuICAgICAgICAnRW52ZWxvcGVkTWVzc2FnZSc6ICdFbnZlbG9wZWRNZXNzYWdlJyxcblxuICAgICAgICAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnOiAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnLFxuICAgICAgICAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnOiAnQ2xlYW51cFJlcGxheU1lc3NhZ2UnLFxuICAgICAgICAnUmVzaXplT2JzZXJ2ZXJNZXNzYWdlJzogJ1Jlc2l6ZU9ic2VydmVyTWVzc2FnZSdcbiAgICB9XG59XG4iLCAiLy9UT0RPIDogcmV1c2UgZnJvbSBvbmUgcGxhY2UuXG4vLyBuZWVkcyB0byBiZSB1c2VkIGluIG15b3Atc2RrLCBteW9wLWRhc2hiYW9yZCwgbXlvcC1zZXJ2ZXIsIG15b3AtY2xpIC4uXG5cbmV4cG9ydCBjb25zdCB1dWlkdjQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIFwiMTAwMDAwMDAtMTAwMC00MDAwLTgwMDAtMTAwMDAwMDAwMDAwXCIucmVwbGFjZSgvWzAxOF0vZywgYyA9PlxuICAgICAgICAoK2MgXiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDEpKVswXSAmIDE1ID4+ICtjIC8gNCkudG9TdHJpbmcoMTYpXG4gICAgKTtcbn1cblxuLy8gQ29udmVydCBVVUlEIHN0cmluZyB0byBieXRlc1xuZXhwb3J0IGNvbnN0IHV1aWRUb0J5dGVzID0gKHV1aWQ6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oXG4gICAgICAgIHV1aWQucmVwbGFjZSgvLS9nLCAnJykubWF0Y2goLy57MSwyfS9nKSEubWFwKGJ5dGUgPT4gcGFyc2VJbnQoYnl0ZSwgMTYpKVxuICAgICk7XG59O1xuXG4vLyBDb252ZXJ0IGJ5dGVzIHRvIFVVSUQgc3RyaW5nXG5leHBvcnQgY29uc3QgYnl0ZXNUb1V1aWQgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGhleCA9IFsuLi5ieXRlc10ubWFwKGIgPT4gYi50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKSkuam9pbignJyk7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgaGV4LnNsaWNlKDAsIDgpLFxuICAgICAgICBoZXguc2xpY2UoOCwgMTIpLFxuICAgICAgICBoZXguc2xpY2UoMTIsIDE2KSxcbiAgICAgICAgaGV4LnNsaWNlKDE2LCAyMCksXG4gICAgICAgIGhleC5zbGljZSgyMClcbiAgICBdLmpvaW4oJy0nKTtcbn07XG5cbi8vIEJhc2U2NCBVUkwtc2FmZSBlbmNvZGVcbmV4cG9ydCBjb25zdCBiYXNlNjRVcmxFbmNvZGUgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGJhc2U2NCA9IGJ0b2EoU3RyaW5nLmZyb21DaGFyQ29kZSguLi5ieXRlcykpO1xuICAgIHJldHVybiBiYXNlNjQucmVwbGFjZSgvXFwrL2csICctJykucmVwbGFjZSgvXFwvL2csICdfJykucmVwbGFjZSgvPSskLywgJycpO1xufTtcblxuLy8gQmFzZTY0IFVSTC1zYWZlIGRlY29kZVxuZXhwb3J0IGNvbnN0IGJhc2U2NFVybERlY29kZSA9IChzdHI6IHN0cmluZyk6IFVpbnQ4QXJyYXkgPT4ge1xuICAgIGxldCBiYXNlNjQgPSBzdHIucmVwbGFjZSgvLS9nLCAnKycpLnJlcGxhY2UoL18vZywgJy8nKTtcbiAgICB3aGlsZSAoYmFzZTY0Lmxlbmd0aCAlIDQpIGJhc2U2NCArPSAnPSc7XG4gICAgY29uc3QgYmluYXJ5ID0gYXRvYihiYXNlNjQpO1xuICAgIHJldHVybiBVaW50OEFycmF5LmZyb20oYmluYXJ5LCBjaGFyID0+IGNoYXIuY2hhckNvZGVBdCgwKSk7XG59O1xuXG4vLyBDb21wcmVzcyBhbiBhcnJheSBvZiBVVUlEcyBpbnRvIGEgc2hvcnQgVVJMLXNhZmUgc3RyaW5nXG5leHBvcnQgY29uc3QgY29tcHJlc3NVVUlEcyA9ICh1dWlkczogc3RyaW5nW10pOiBzdHJpbmcgPT4ge1xuICAgIGNvbnN0IGFsbEJ5dGVzID0gdXVpZHMuZmxhdE1hcCh1dWlkID0+IEFycmF5LmZyb20odXVpZFRvQnl0ZXModXVpZCkpKTtcbiAgICByZXR1cm4gYmFzZTY0VXJsRW5jb2RlKG5ldyBVaW50OEFycmF5KGFsbEJ5dGVzKSk7XG59O1xuXG4vLyBEZWNvbXByZXNzIGZyb20gVVJMLXNhZmUgc3RyaW5nIGJhY2sgdG8gYW4gYXJyYXkgb2YgVVVJRHNcbmV4cG9ydCBjb25zdCBkZWNvbXByZXNzVVVJRHMgPSAoZW5jb2RlZDogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICAgIGNvbnN0IGJ5dGVzID0gYmFzZTY0VXJsRGVjb2RlKGVuY29kZWQpO1xuICAgIGlmIChieXRlcy5sZW5ndGggJSAxNiAhPT0gMCkgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGlucHV0IGxlbmd0aCcpO1xuXG4gICAgY29uc3QgdXVpZHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMTYpIHtcbiAgICAgICAgdXVpZHMucHVzaChieXRlc1RvVXVpZChieXRlcy5zbGljZShpLCBpICsgMTYpKSk7XG4gICAgfVxuICAgIHJldHVybiB1dWlkcztcbn07XG4iLCAiZXhwb3J0ICogZnJvbSAnLi91dWlkLnRzJ1xuXG5leHBvcnQgY29uc3Qgd2FpdCA9IChtczogbnVtYmVyKSA9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufSIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcbmltcG9ydCB7SVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZURpcmVjdGlvbiB7XG4gICAgc3RhdGljIGRvd24gPSAnZG93bicgYXMgY29uc3RcbiAgICBzdGF0aWMgdXAgPSAndXAnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIE1lc3NhZ2VEaXJlY3Rpb25PcHRpb24gPSAndXAnIHwgJ2Rvd24nO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BNZXNzYWdlPFQgPSBhbnk+IHtcbiAgICBpZCA9IHV1aWR2NCgpXG5cbiAgICBzdGF0aWMgY3JlYXRlPFQsIFUgZXh0ZW5kcyBuZXcgKC4uLmFyZ3M6IENvbnN0cnVjdG9yUGFyYW1ldGVyczxVPikgPT4gVCA9IHR5cGVvZiB0aGlzPihcbiAgICAgICAgdGhpczogVSxcbiAgICAgICAgLi4uYXJnczogQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFU+XG4gICAgKTogSW5zdGFuY2VUeXBlPHR5cGVvZiB0aGlzPiB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgcmV0dXJuIG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAvL2NvbnNvbGUubG9nKCdtZWVzYWdlIGlkIGNyZWF0ZWQnLCB0aGlzLmlkLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmKTtcbiAgICB9XG5cbiAgICBteW9wID0gdHJ1ZVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5IHwgc3RyaW5nO1xuXG4gICAgY29udGVudD86IFRcblxuICAgIC8vIFRPRE8gOiBjYW50IGJlIG9wdGlvbmFsIFxuICAgIHNvdXJjZT86IHN0cmluZ1xuICAgIGRlc3RpbmF0aW9uPzogc3RyaW5nXG5cbiAgICByb3V0ZT86IHN0cmluZ1tdXG5cbiAgICByZWY/OiBSZWZcblxuICAgIGRpcmVjdGlvbj86IE1lc3NhZ2VEaXJlY3Rpb25PcHRpb25cblxuICAgIGNsZWFuYWJsZTogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBpc1R5cGVvZihtc2c6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gbXNnLm1lc3NhZ2VUeXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlXG4gICAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTXlvcEVsZW1lbnRNZXNzYWdlPFQgPSBhbnk+IGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmOiBSZWYpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHJlcGxheVRvSGFuZGxlcj86IHN0cmluZykge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE15b3BCaW5kTWVzc2FnZTxUID0gYW55LCBSIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlID0gYW55PiBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZTxUPiB7XG5cbiAgICBwdWJsaWMgYWJzdHJhY3QgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleTtcblxuICAgIHB1YmxpYyBoYW5kbGVyVW5pcXVlSWQgPSB1dWlkdjQoKVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGhhbmRsZXI6IChtZXNzYWdlOiBSKSA9PiB2b2lkKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWYge1xuICAgIHB1YmxpYyBteW9wID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBfX25vblByb3hpZWQ/OiBSZWY7XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNlbGVjdG9yOiBzdHJpbmcsIHJlZkNvbmZpZz86IElSZWZDb25maWcsIGNvbXBvbmVudD86IElNeW9wQ29tcG9uZW50KSB7XG4gICAgICAgIGxldCBfcmVmQ29uZmlnID0gcmVmQ29uZmlnO1xuICAgICAgICBpZiAoIV9yZWZDb25maWcpIHtcbiAgICAgICAgICAgIF9yZWZDb25maWcgPSB7XG4gICAgICAgICAgICAgICAgaWQ6ICcnLFxuICAgICAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgICAgICBzZWxlY3RvclR5cGU6ICdpZC1hdHRyaWJ1dGUnLFxuICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvcixcbiAgICAgICAgICAgICAgICBiZWhhdmlvcjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnY29kZSdcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGFzIElSZWZDb25maWdcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IFJlZihfcmVmQ29uZmlnLCBjb21wb25lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsIHB1YmxpYyBjb21wb25lbnQ/OiBJTXlvcENvbXBvbmVudCkge1xuICAgICAgICB0aGlzLl9fbm9uUHJveGllZCA9IHtcbiAgICAgICAgICAgIC4uLnRoaXMsXG4gICAgICAgICAgICBjb21wb25lbnQ6IG51bGwgLy8gaW4gb3JkZXIgdG8gYmUgc2VyaWFsaXphYmxlXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGlja1JlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBCaW5kQ2xpY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsaWNrUmVwbGF5TWVzc2FnZT4ge1xuICAgIHJlcGx5TWVzc2FnZUtleTogTXlvcE1lc3NhZ2VLZXkgPSBSZXBsYXlNZXNzYWdlS2V5XG4gICAgbWVzc2FnZVR5cGUgPSAnQmluZENsaWNrTWVzc2FnZSc7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaGFuZGxlcjogKG1lc3NhZ2U6IENsaWNrUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGlja1JlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIFJlZn0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnQ2hhbmdlVGV4dE1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gdGV4dFxuICAgIH1cbn0iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZX0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VLZXl9IGZyb20gXCIuLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSdcblxuY29uc3QgZnVuY3Rpb25Cb2R5UmVnZXggPSAvKD86ZnVuY3Rpb25cXHMqXFx3KlxccypcXChbXildKlxcKVxccypcXHsoW1xcc1xcU10qPylcXH18KFxcKFteKV0qXFwpXFxzKj0+XFxzKlxceyhbXFxzXFxTXSo/KVxcfSkpXFxzKiQvO1xuY29uc3QgZXhwcmVzc2lvbkJvZHlSZWdleCA9IC9cXChcXHMqW14pXStcXHMqXFwpXFxzKj0+XFxzKiguKykvO1xuXG5leHBvcnQgY29uc3Qgc3RyaXBGdW5jdGlvbiA9IChjb250ZW50OiBzdHJpbmcpID0+IHtcbiAgICBsZXQgbWF0Y2ggPSBjb250ZW50Lm1hdGNoKGZ1bmN0aW9uQm9keVJlZ2V4KTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIG1hdGNoWzFdIHx8IG1hdGNoWzNdO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBtYXRjaCA9IGNvbnRlbnQubWF0Y2goZXhwcmVzc2lvbkJvZHlSZWdleCk7XG4gICAgICAgIGlmIChtYXRjaClcbiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXS50cmltKCk7XG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBzY3JpcHRJbnB1dHMgPSB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhblxufSB8IHt9O1xuXG5leHBvcnQgdHlwZSBzY3JpcHRWYXJzPFQ+ID0ge1xuICAgIHNlbmQ6IChkYXRhOiBUKSA9PiB2b2lkO1xuICAgIC8vIGNvbXBsZXRlU3RyZWFtOiAoKSA9PiB2b2lkO1xuICAgIHJvb3RSZWY6IFJvb3RSZWY7XG4gICAgbWFrZVNlcmlhbGl6YWJsZTogdHlwZW9mIG1ha2VTZXJpYWxpemFibGVcbn1cblxuZXhwb3J0IHR5cGUgZXh0ZW5kZWRTY3JpcHRWYXJzPFQsIEk+ID0ge1xuICAgIFtLIGluIGtleW9mIEldOiBJW0tdO1xufSAmIHNjcmlwdFZhcnM8VD5cblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQgPSBhbnksIEkgZXh0ZW5kcyBzY3JpcHRJbnB1dHMgPSBhbnk+IGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHN0cmluZywgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUPj4ge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuICAgIHNjcmlwdDogc3RyaW5nID0gJydcblxuICAgIHN0YXRpYyByZXBsaWVyS2V5ID0gJ3NlbmQnO1xuICAgIHN0YXRpYyBjb21wbGV0ZVN0cmVhbUtleSA9ICdjb21wbGV0ZVN0cmVhbSc7XG5cbiAgICBjb25zdHJ1Y3RvcihzY3JpcHQ6ICh2YXJzOiBleHRlbmRlZFNjcmlwdFZhcnM8VCwgST4pID0+IFQsIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgIH0sIHB1YmxpYyBzY3JpcHRJbnB1dHM/OiBJKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuICAgICAgICB0aGlzLnNjcmlwdCA9IHNjcmlwdC50b1N0cmluZygpO1xuXG4gICAgICAgIC8vVE9ETzogY2FuIGJlIHJlbW92ZVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzY3JpcHQudG9TdHJpbmcoKVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSBzdHJpcEZ1bmN0aW9uKHRoaXMuY29udGVudCk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZTxUID0gYW55PiBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZTxUPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBjb250ZW50OiBUKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgfVxufVxuIiwgImltcG9ydCB7XG4gICAgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsXG4gICAgRXhlY3V0ZVNjcmlwdFJlcGx5TWVzc2FnZSxcbiAgICBleHRlbmRlZFNjcmlwdFZhcnMsXG4gICAgc2NyaXB0SW5wdXRzLCBzdHJpcEZ1bmN0aW9uXG59IGZyb20gXCIuL0V4ZWN1dGVTY3JpcHRNZXNzYWdlLnRzXCI7XG5cbmV4cG9ydCB0eXBlIGN1c3RvbVJlZlNjcmlwdElucHV0cyA9IHtcbiAgICBlbGVtZW50SWQ6IHN0cmluZyxcbiAgICByZWY/OiBIVE1MRWxlbWVudCxcbiAgICBfc2NyaXB0Pzogc3RyaW5nLFxuICAgIF9fc2NyaXB0SW5wdXRzPzogT2JqZWN0XG59O1xuXG5leHBvcnQgY2xhc3MgQ3VzdG9tUmVmTWVzc2FnZTxUID0gYW55LCBJIGV4dGVuZHMgc2NyaXB0SW5wdXRzID0gY3VzdG9tUmVmU2NyaXB0SW5wdXRzPiBleHRlbmRzIEV4ZWN1dGVTY3JpcHRNZXNzYWdlPFQsIEkgJiBjdXN0b21SZWZTY3JpcHRJbnB1dHM+IHtcblxuICAgIGNvbnN0cnVjdG9yKHNjcmlwdDogKHZhcnM6IGV4dGVuZGVkU2NyaXB0VmFyczxULCBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzPikgPT4gVCxcbiAgICAgICAgICAgICAgICBwdWJsaWMgc2NyaXB0SW5wdXRzOiBJICYgY3VzdG9tUmVmU2NyaXB0SW5wdXRzLFxuICAgICAgICAgICAgICAgIGhhbmRsZXI6IChtZXNzYWdlOiBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlPFQ+KSA9PiB2b2lkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIH0pIHtcblxuICAgICAgICAvL21vY2sgdmFyc1xuICAgICAgICAvLyBsZXQgcm9vdFJlZiwgZWxlbWVudElkLCBfc2NyaXB0LCBfX3NjcmlwdElucHV0cztcbiAgICAgICAgc3VwZXIoKHtyb290UmVmLCBlbGVtZW50SWQsIF9zY3JpcHQsIF9fc2NyaXB0SW5wdXRzfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVmcyA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgcm9vdFJlZi5jb250YWluZXIpLnF1ZXJ5U2VsZWN0b3JBbGwoYFskeydteW9wLWlkJ309JyR7ZWxlbWVudElkfSddYCk7XG4gICAgICAgICAgICBpZiAocmVmcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAvLyAgY29uc3QgcmVmID0gcmVmc1swXTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHRoaW5rIGFib3V0IGV4cG9zaW5nIFwicmVmc1wiIGFuZCBub3Qgb25seSBcInJlZlwiXG4gICAgICAgICAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgdGhlIFJlZiBoYXMgbXVsdGlwbGF0ZSBpbXBsZW1lbnRhdGlvbnNcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBfX3NjcmlwdElucHV0cy5yZWYgPSByZWZzWzBdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7X3NjcmlwdH0pKC4uLmFyZ3VtZW50cylgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZHluYW1pY0Z1bmN0aW9uKF9fc2NyaXB0SW5wdXRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAvL3JldHVybiBGdW5jdGlvbigncmVmJywgJ3Jvb3RSZWYnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIF9zY3JpcHQhKShyZWYsIHJvb3RSZWYsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGwgYXMgVDtcbiAgICAgICAgfSwgaGFuZGxlcik7XG5cbiAgICAgICAgdGhpcy5zY3JpcHRJbnB1dHMgPSB7XG4gICAgICAgICAgICAuLi5zY3JpcHRJbnB1dHMsXG4gICAgICAgICAgICAvL19zY3JpcHQ6IHN0cmlwRnVuY3Rpb24oc2NyaXB0LnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgX3NjcmlwdDogc2NyaXB0LnRvU3RyaW5nKClcbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wQmluZE1lc3NhZ2UsIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2VyaWFsaXphYmxlLCBTZXJpYWxpemFibGVTa2VsZXRvbn0gZnJvbSBcIi4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPFQgZXh0ZW5kcyBrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwID0ga2V5b2YgSFRNTEVsZW1lbnRFdmVudE1hcD4gZXh0ZW5kcyBNeW9wQmluZE1lc3NhZ2Uge1xuXG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXk7XG4gICAgbWVzc2FnZVR5cGUgPSAnQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuICAgIGNsZWFuYWJsZSA9IHRydWU7XG4gICAgc2VyaWFsaXphYmxlU2tlbGV0b246IFNlcmlhbGl6YWJsZVNrZWxldG9uPEhUTUxFbGVtZW50RXZlbnRNYXBbVF0+ID0gZmFsc2UgLy8ge30gLy8gZW1wdHlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIHR5cGU6IFQsIHB1YmxpYyBoYW5kbGVyOiAobWVzc2FnZTogRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKVxuICAgIH1cblxuICAgIHdpdGhTZXJpYWxpemFibGVTa2VsZXRvbihzZXJpYWxpemFibGVTa2VsZXRvbjogU2VyaWFsaXphYmxlU2tlbGV0b248SFRNTEVsZW1lbnRFdmVudE1hcFtUXT4pIHtcbiAgICAgICAgdGhpcy5zZXJpYWxpemFibGVTa2VsZXRvbiA9IHNlcmlhbGl6YWJsZVNrZWxldG9uO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXk7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBlOiBTZXJpYWxpemFibGU8RXZlbnQ+KSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcik7XG4gICAgICAgIHRoaXMuY29udGVudCA9IHtcbiAgICAgICAgICAgIGVcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmLH0gZnJvbSBcIi4vQmFzZU1lc3NhZ2VcIjtcblxuXG5leHBvcnQgY2xhc3MgU2V0QXR0cmlidXRlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG5cbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRBdHRyaWJ1dGVNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXJpYWxpemFibGV9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0VsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEVsZW1lbnRWYWx1ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBoYW5kbGVyOiAobWVzc2FnZTogRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCB0eXBlIEZvcm1EYXRhRW50cnkgPSB7XG4gICAgaWQ/OiBzdHJpbmcsXG4gICAgbmFtZT86IHN0cmluZyxcbiAgICB2YWx1ZT86IElucHV0RWxlbWVudFZhbHVlLFxuICAgIHJlcXVpcmVkPzogYm9vbGVhbixcbiAgICB2YWxpZGl0eT86IFNlcmlhbGl6YWJsZTxWYWxpZGl0eVN0YXRlPixcbiAgICBteW9wSWQ/OiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgSW5wdXRFbGVtZW50Rm9ybVZhbHVlID0ge1xuICAgIGZvcm1EYXRhPzogeyBba2V5OiBzdHJpbmddOiBGb3JtRGF0YUVudHJ5IH1cbiAgICB1bm1hcHBlZERhdGE/OiBGb3JtRGF0YUVudHJ5W11cbn07XG5cbmV4cG9ydCB0eXBlIElucHV0RWxlbWVudFZhbHVlID0gc3RyaW5nIHwgSW5wdXRFbGVtZW50Rm9ybVZhbHVlIHwgbnVsbCB8IHVuZGVmaW5lZFxuXG5leHBvcnQgY2xhc3MgRWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGVudDogSW5wdXRFbGVtZW50VmFsdWUpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG5cbiIsICJpbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi9CYXNlTWVzc2FnZS50c1wiO1xuXG5leHBvcnQgY2xhc3MgU2V0SW5uZXJIdG1sIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlPHN0cmluZz4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSAnU2V0SW5uZXJIdG1sJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWY6IFJlZiwgaW5uZXJIdG1sOiBzdHJpbmcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jb250ZW50ID0gaW5uZXJIdG1sXG4gICAgfVxufSIsICJpbXBvcnQgeyBCYXNlTXlvcE1lc3NhZ2UgfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuXG4vLyBzZW50IGJ5IGhvc3QgdG8gY29tcG9uZW50cywgY29udGFpbnMgdGhpZXIgaWQgXG5leHBvcnQgY2xhc3MgSW5pdE1lc3NhZ2UgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U8eyBpZDogc3RyaW5nIH0+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdJbml0TWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihpZDogc3RyaW5nKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICAgICAgdGhpcy5jb250ZW50ID0geyBpZCB9XG4gICAgfVxuXG4gICAgaXNUeXBlb2YobXNnOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cblxuLy8gY29tcG9uZW50IG5vdGlmeSBob3N0IHRoZSBpdCB3YXMgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlc3BvbnNlIGV4dGVuZHMgSW5pdE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXNwb25zZSc7XG59XG5cbi8vIGNvbXBvbmVudCBhc2sgdG8gaG9zdCB0byBnZXQgaW5pdGF0ZWQgXG5leHBvcnQgY2xhc3MgSW5pdFJlcXVlc3QgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gJ0luaXRSZXF1ZXN0Jztcbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7SUNvbXBvbmVudENvbmZpZywgSVJlZkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdC9ob3N0U0RLLnRzXCI7XG5cbmNvbnN0IFJlcGxheU1lc3NhZ2VLZXkgPSAnUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZDb25maWc6IElSZWZDb25maWcsXG4gICAgICAgICAgICAgICAgcHVibGljIG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICBwdWJsaWMgb3B0aW9uczogbG9hZGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiAobWVzc2FnZTogUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2UpID0+IHZvaWQsXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGhhbmRsZXIpO1xuXG4gICAgfVxufVxuXG5leHBvcnQgdHlwZSBOZXN0ZWRSZWYgPSB7XG4gICAgcmVmTmFtZTogc3RyaW5nLFxuICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZSBleHRlbmRzIE15b3BCaW5kUmVwbGF5TWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSBSZXBsYXlNZXNzYWdlS2V5XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVwbGF5VG9IYW5kbGVyOiBzdHJpbmcsIHB1YmxpYyBuZXN0ZWRSZWZzOiBOZXN0ZWRSZWZbXSwgcHVibGljIGZhaWxlZD86IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIocmVwbGF5VG9IYW5kbGVyKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBFbnZlbG9wZWRNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdFbnZlbG9wZWRNZXNzYWdlJztcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkZXN0aW5hdGlvbjogc3RyaW5nLCBwdWJsaWMgbWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgY29uc3QgaW5uZXJFbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgIHRoaXMucm91dGUgPSBbZGVzdGluYXRpb24sIC4uLmlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA/IGlubmVyRW52ZWxvcGVkTWVzc2FnZS5yb3V0ZSA6IFtdXTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJRWxlbWVudFJlZn0gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0RldGVjdGVkTXlvcFJlZnNNZXNzYWdlJ1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPGFueSwgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBtZXNzYWdlVHlwZSA9ICdEZXRlY3RNeW9wUmVmc01lc3NhZ2UnXG4gICAgcmVwbHlNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleTtcbn1cblxuZXhwb3J0IGNsYXNzIERldGVjdGVkTXlvcFJlZnNNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlPElFbGVtZW50UmVmW10+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyByZXBsYXlUb0hhbmRsZXI6IHN0cmluZywgbXlvcEVsZW1lbnRSZWZzOiBJRWxlbWVudFJlZltdKSB7XG4gICAgICAgIHN1cGVyKHJlcGxheVRvSGFuZGxlcilcbiAgICAgICAgdGhpcy5jb250ZW50ID0gbXlvcEVsZW1lbnRSZWZzO1xuICAgIH1cblxuICAgIGlzVHlwZW9mKG1zZzogQmFzZU15b3BNZXNzYWdlPGFueT4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1zZy5tZXNzYWdlVHlwZSA9PT0gdGhpcy5tZXNzYWdlVHlwZVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCBSZWZ9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5pbXBvcnQge015b3BNZXNzYWdlS2V5fSBmcm9tIFwiLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5jb25zdCBSZXBsYXlNZXNzYWdlS2V5ID0gJ0dldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UnXG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2U+IHtcbiAgICByZXBseU1lc3NhZ2VLZXk6IE15b3BNZXNzYWdlS2V5ID0gUmVwbGF5TWVzc2FnZUtleVxuICAgIG1lc3NhZ2VUeXBlID0gJ0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIHJlZjogUmVmLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogR2V0QXR0cmlidXRlUmVwbGF5TWVzc2FnZSkgPT4gdm9pZCkge1xuICAgICAgICBzdXBlcihoYW5kbGVyKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRBdHRyaWJ1dGVSZXBsYXlNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRSZXBsYXlNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9IFJlcGxheU1lc3NhZ2VLZXlcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250ZW50OiBzdHJpbmcgfCBudWxsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uLy4uL2hvc3RcIjtcblxudHlwZSBNZXRob2ROYW1lczxUPiA9IHtcbiAgICAvLyBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gYW55ID8gSyA6IG5ldmVyO1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKCkgPT4gdm9pZCA/IEsgOiBuZXZlcjtcbn1ba2V5b2YgVF07XG5cbi8vIERlZmluZSBhIHR5cGUgdGhhdCBhbGxvd3Mgb25seSBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1ldGhvZCBuYW1lcyBvZiBUXG50eXBlIE1ldGhvZFN0cmluZzxUPiA9IE1ldGhvZE5hbWVzPFQ+IGV4dGVuZHMgaW5mZXIgTSA/IE0gZXh0ZW5kcyBzdHJpbmcgPyBNIDogbmV2ZXIgOiBuZXZlcjtcblxuXG5leHBvcnQgY2xhc3MgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWV0aG9kOiBNZXRob2RTdHJpbmc8SU15b3BDb21wb25lbnQ+KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG59XG5cbmV4cG9ydCBjbGFzcyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnTXV0YXRpb25PYnNlcnZlck1lc3NhZ2UnO1xufSIsICJpbXBvcnQge015b3BCaW5kTWVzc2FnZSwgTXlvcEJpbmRSZXBsYXlNZXNzYWdlfSBmcm9tIFwiLi9CYXNlTWVzc2FnZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcblxuY29uc3QgUmVwbGF5TWVzc2FnZUtleSA9ICdDbGVhbnVwUmVwbGF5TWVzc2FnZSdcblxuZXhwb3J0IGNsYXNzIENsZWFudXBNZXNzYWdlIGV4dGVuZHMgTXlvcEJpbmRNZXNzYWdlPHZvaWQsIENsZWFudXBSZXBsYXlNZXNzYWdlPiB7XG4gICAgcmVwbHlNZXNzYWdlS2V5OiBNeW9wTWVzc2FnZUtleSA9IFJlcGxheU1lc3NhZ2VLZXlcbiAgICBtZXNzYWdlVHlwZSA9ICdDbGVhbnVwTWVzc2FnZSc7XG5cbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY2xlYW51cEZvck1lc3NhZ2VJZDogc3RyaW5nLCBoYW5kbGVyOiAobWVzc2FnZTogQ2xlYW51cFJlcGxheU1lc3NhZ2UpID0+IHZvaWQpIHtcbiAgICAgICAgc3VwZXIoaGFuZGxlcik7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2xlYW51cFJlcGxheU1lc3NhZ2UgZXh0ZW5kcyBNeW9wQmluZFJlcGxheU1lc3NhZ2Uge1xuICAgIG1lc3NhZ2VUeXBlID0gUmVwbGF5TWVzc2FnZUtleVxuXG4gICAgY29uc3RydWN0b3IocHVibGljIGN1c3RvbUNsZWFudXA6IGJvb2xlYW4pIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtCYXNlTXlvcE1lc3NhZ2V9IGZyb20gXCIuL0Jhc2VNZXNzYWdlXCI7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NlTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgbWVzc2FnZVR5cGUgPSAnRGlzcG9zZU1lc3NhZ2UnO1xufVxuIiwgImltcG9ydCB7QmFzZU15b3BNZXNzYWdlfSBmcm9tIFwiLi4vQmFzZU1lc3NhZ2VcIjtcblxuZXhwb3J0IGNsYXNzIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZSBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZSB7XG4gICAgY2xlYW5hYmxlID0gdHJ1ZTtcbiAgICBtZXNzYWdlVHlwZSA9ICdTZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufVxuXG5leHBvcnQgY2xhc3MgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlIHtcbiAgICBtZXNzYWdlVHlwZSA9ICdSZXNpemVPYnNlcnZlck1lc3NhZ2UnO1xufSIsICJleHBvcnQgKiBmcm9tICcuL0Jhc2VNZXNzYWdlJztcblxuLy91c2VyJ3MgbWVzc2FnZXNcbmV4cG9ydCAqIGZyb20gJy4vQmluZENsaWNrTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZVRleHRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRXhlY3V0ZVNjcmlwdE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9DdXN0b21SZWZNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TZXRBdHRyaWJ1dGVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vR2V0RWxlbWVudFZhbHVlTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL1NldElubmVySHRtbCc7XG5cbi8vc3lzdGVtIG1lc3NhZ2VzXG5leHBvcnQgKiBmcm9tICcuL0luaXRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0VudmVsb3BlZE1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9EZXRlY3RNeW9wUmVmc01lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9HZXRFbGVtZW50VmFsdWVNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gICcuL0dldEF0dHJpYnV0ZU1lc3NhZ2UnO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbXBvbmVudE1lc3NhZ2VzL0V4ZWN1dGVDb21wb25lbnRNZXRob2QnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL0NsZWFudXBNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vRGlzcG9zZU1lc3NhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21wb25lbnRNZXNzYWdlcy9TZXRSZXNpemVPYnNlcnZlck1lc3NhZ2UnOyIsICJpbXBvcnQge015b3BNZXNzYWdlS2V5LCBNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1xuICAgIEJhc2VNeW9wTWVzc2FnZSxcbiAgICBEaXNwb3NlTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCwgTWVzc2FnZURpcmVjdGlvbixcbiAgICBDbGVhbnVwTWVzc2FnZSwgQ2xlYW51cFJlcGxheU1lc3NhZ2UsXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgUmVmXG59IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudERlZmluaXRpb25Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNESywgbG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREsudHNcIjtcblxuLy9UT0RPIDogY2hhbmdlIElNeW9wQ29tcG9uZW50IHRvIHJlZiBzcGVjaWZpYyBpbXBsXG50eXBlIFJlZlR5cGVzID0ge1xuICAgIFtrZXk6IHN0cmluZ106IElNeW9wQ29tcG9uZW50IHwgUmVmXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wQ29tcG9uZW50PFAgPSBhbnksIFIgPSBhbnk+IHtcblxuICAgIGlkOiBzdHJpbmc7XG5cbiAgICBpc0luaXRpYXRlZDogYm9vbGVhbjtcblxuICAgIG1hcmtlZEZvckRpc3Bvc2VkOiBib29sZWFuO1xuXG4gICAgc2V0SW5pdGlhdGVkOiAoKSA9PiB2b2lkXG5cbiAgICBjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgY29udGFpbmVyOiBIVE1MRWxlbWVudFxuXG4gICAgLy9yZWYgY29tcG9uZW50cyBjYW4gYmUgZWxlbWVudC1sZXNzXG4gICAgZWxlbWVudD86IEhUTUxFbGVtZW50XG5cbiAgICBzZW5kOiAobXNnOiBCYXNlTXlvcE1lc3NhZ2UpID0+IENsZWFudXBIYW5kbGVyXG5cbiAgICBiaW5kKG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKCkgPT4gYm9vbGVhbik6IHZvaWQ7XG5cbiAgICBiaW5kPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleSwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IGJvb2xlYW4pOiB2b2lkO1xuXG4gICAgLy8gYm9vbGVhbiByZXR1cm5lZCB2YWx1ZSA9IGhhbmRsZWQgb3Igbm90XG4gICAgb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IEJhc2VNeW9wTWVzc2FnZSkgPT4gYm9vbGVhblxuXG4gICAgaW5pdGlhdGVkOiAoKSA9PiBQcm9taXNlPGFueT47XG5cbiAgICBkaXNwb3NlOiAoKSA9PiB2b2lkXG5cbiAgICBoaWRlKCk6IHZvaWQ7XG5cbiAgICBzaG93KCk6IHZvaWQ7XG5cbiAgICBpbnNwZWN0KCk6IHZvaWQ7XG5cbiAgICBwYXJlbnQ/OiBJTXlvcENvbXBvbmVudDtcblxuICAgIHByb3BzOiBQXG5cbiAgICByZWZzOiBSXG59XG5cbmZ1bmN0aW9uIGlzSW5oZXJpdEZyb20ob2JqOiBhbnksIGJhc2VDbGFzczogYW55KSB7XG4gICAgaWYgKCFvYmopIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaik7XG5cbiAgICBpZiAoIXByb3RvKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8uY29uc3RydWN0b3IubmFtZSA9PT0gYmFzZUNsYXNzLm5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBpc0luaGVyaXRGcm9tKHByb3RvLCBiYXNlQ2xhc3MpO1xufVxuXG4vLyBUT0RPIDogbW92ZSA6IFxudHlwZSBtZXNzYWdlSGFuZGxlcjxUPiA9IChtZXNzYWdlOiBUKSA9PiBib29sZWFuO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU15b3BDb21wb25lbnQ8UCA9IGFueSwgUiBleHRlbmRzIFJlZlR5cGVzID0gUmVmVHlwZXM+IGltcGxlbWVudHMgSU15b3BDb21wb25lbnQ8UD4ge1xuICAgIGlkOiBzdHJpbmcgPSAnJ1xuXG4gICAgbWVzc2FnZUhhbmRsZXJzOiBSZWNvcmQ8c3RyaW5nLCBtZXNzYWdlSGFuZGxlcjxhbnk+W10+ID0ge307XG5cbiAgICBlbGVtZW50PzogSFRNTEVsZW1lbnRcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICB0aGlzLmlkID0gb3B0aW9ucz8uaWQgfHwgSG9zdFNESy5JbnN0YW5jZSgpLmFzc2lnbklkKGNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gb3B0aW9ucz8udGltZW91dCA/IG9wdGlvbnM/LnRpbWVvdXQgOiA1ICogMTAwMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNJbml0aWF0ZWQgJiYgdGhpcy5fd2hlbkluaXRpYXRlZFJlamVjdCAmJiAhdGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KGB0aW1lb3V0XyR7dGltZW91dH0gJHt0aGlzLmlkfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCB0aW1lb3V0KTtcblxuICAgICAgICAvLyBUT0RPIDogYXV0byBpbnNwZWN0LCBjb250cm9sIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuaW5pdGlhdGVkKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpZiAod2luZG93Lm15b3AuaG9zdFNESy5pbnNwZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluc3BlY3QoKVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfbWFya2VkRm9yRGlzcG9zZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIGdldCBtYXJrZWRGb3JEaXNwb3NlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21hcmtlZEZvckRpc3Bvc2VkO1xuICAgIH1cblxuICAgIHNldCBtYXJrZWRGb3JEaXNwb3NlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5fbWFya2VkRm9yRGlzcG9zZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbjogVGhlIGNvbXBvbmVudCBpcyBhbHJlYWR5IGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGRpc3Bvc2VkLiBEaXNwb3NlIG9wZXJhdGlvbiBjYW5ub3QgYmUgcGVyZm9ybWVkIGFnYWluIHVudGlsIHRoZSBjdXJyZW50IGRpc3Bvc2FsIHByb2Nlc3MgaXMgY29tcGxldGUuJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXJrZWRGb3JEaXNwb3NlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGhpZGUoKTogdm9pZDtcblxuICAgIGFic3RyYWN0IHNob3coKTogdm9pZDtcblxuICAgIGFic3RyYWN0IGluc3BlY3QoKTogQ2xlYW51cEhhbmRsZXI7XG5cbiAgICAvL1RPRE86IHVzZSBiaW5kV2hlbiB3aXRoIHJldHVybiB0cnVlIHByZWRpY2F0ZSAuLi5cbiAgICBiaW5kID0gPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2U+KG1lc3NhZ2VUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IChtZXNzYWdlOiBUKSA9PiBib29sZWFuKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0gPSBbXVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGFuZGxlIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25cbiAgICAgICAgaWYgKCF0aGlzLm1lc3NhZ2VIYW5kbGVyc1ttZXNzYWdlVHlwZV0uaW5jbHVkZXMoaGFuZGxlcikpIHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXS5wdXNoKGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYmluZFdoZW4gPSA8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4obWVzc2FnZVR5cGU6IHN0cmluZywgcHJlZGljYXRlOiAobWVzc2FnZTogVCkgPT4gYm9vbGVhbiwgaGFuZGxlcjogKG1lc3NhZ2U6IFQpID0+IHZvaWQpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGlmICghaGFuZGxlcikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5cXCd0IHVzZSBjb21wb25lbnQuYmluZFdoZW4gd2l0aG91dCBhbiBoYW5kbGVyJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMubWVzc2FnZUhhbmRsZXJzW21lc3NhZ2VUeXBlXSkge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdID0gW11cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbbWVzc2FnZVR5cGVdO1xuXG4gICAgICAgIGNvbnN0IHByZWRpY2F0ZVdyYXBwZWRIYW5kbGVyID0gKGU6IFQpID0+IHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8vVE9ETyA6IGhhbmRsZSBkdXBsaWNhdGUgcmVnaXN0cmF0aW9uID9cbiAgICAgICAgaGFuZGxlcnMucHVzaChwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGFuZGxlcnMuaW5kZXhPZihwcmVkaWNhdGVXcmFwcGVkSGFuZGxlcik7XG4gICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgIGhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZygnb25NZXNzYWdlUmVjZWl2ZWQnLCBkb2N1bWVudC5sb2NhdGlvbi5ocmVmLCBpbmNvbWVNZXNzYWdlLCB0aGlzKTtcbiAgICAgICAgLy9UT0RPIDogaGFuZGVsIHNwZWNpYWwgZXZldHMgPyBsaWtlIGluaXRSZXMgP1xuICAgICAgICBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkV4ZWN1dGVDb21wb25lbnRNZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IChpbmNvbWVNZXNzYWdlIGFzIEV4ZWN1dGVDb21wb25lbnRNZXRob2QpO1xuXG4gICAgICAgICAgICAvL2tlZXBpbmcgdGhpcy5tZXRob2QoKSBzbyB0aGF0IGNvbnRleHQgd2lsbCBzYXZlZFxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSlbdHlwZWRNZXNzYWdlLm1ldGhvZF0pIHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyBhbnkpW3R5cGVkTWVzc2FnZS5tZXRob2RdKHR5cGVkTWVzc2FnZS5jb250ZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYG1ldGhvZCBub3QgZm91bmQgJHt0eXBlZE1lc3NhZ2UubWV0aG9kfSBvbiBjb21wb25lbnRgLCB0aGlzKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5tZXNzYWdlSGFuZGxlcnNbaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZV07XG4gICAgICAgIGlmIChoYW5kbGVycyAmJiBoYW5kbGVycy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBoYW5kbGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGhhbmRsZXJzLmZvckVhY2goaGFuZGxlciA9PiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZWQgfHwgaGFuZGxlcihpbmNvbWVNZXNzYWdlKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy9UT0RPIDogY29uc29sZSBvbmx5IHdoZW4gZGVidWcgY29uZmlnXG4gICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdubyBoYW5kbGVycyBmb3VuZCBmb3IgJywgaW5jb21lTWVzc2FnZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgc2V0SW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmlzSW5pdGlhdGVkID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUpXG4gICAgICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIGlzSW5pdGlhdGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBfd2hlbkluaXRpYXRlZFJlc29sdmU/OiAodmFsdWU/OiBhbnkpID0+IGFueTtcbiAgICBfd2hlbkluaXRpYXRlZFJlamVjdD86ICh2YWx1ZT86IGFueSkgPT4gYW55O1xuXG4gICAgX3doZW5Jbml0aWF0ZWQ6IFByb21pc2U8YW55PiA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdGhpcy5fd2hlbkluaXRpYXRlZFJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICB0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuXG4gICAgaW5pdGlhdGVkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fd2hlbkluaXRpYXRlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNlbmRDbGVhbnVwTWVzc2FnZShtZXNzYWdlOiBDbGVhbnVwTWVzc2FnZSk6IHZvaWQge1xuICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG4gICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSB0aGlzLmlkO1xuICAgICAgICBtZXNzYWdlLmRpcmVjdGlvbiA9IE1lc3NhZ2VEaXJlY3Rpb24uZG93bjtcblxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuYmluZFdoZW4obWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG1zZy5yZXBsYXlUb0hhbmRsZXIgPT09IG1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgIH0sIChtOiBDbGVhbnVwUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZS5oYW5kbGVyKG0pO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlcjtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBkZWxldGUgbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgdGhpcy5zZW5kKG1lc3NhZ2UpO1xuXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXI7XG4gICAgfVxuXG4gICAgc2VuZChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciB7XG4gICAgICAgIC8vbWVzc2FnZXMgdGhhdCBleGV0cmFjdGVkIGZyb20gZW52ZWxvcGUgYWxyZWFkeSBoYXZlIHNvdXJjZSBpbiB0aGVtXG4gICAgICAgIGlmICghbWVzc2FnZS5zb3VyY2UpXG4gICAgICAgICAgICBtZXNzYWdlLnNvdXJjZSA9IHRoaXMuaWQ7XG5cbiAgICAgICAgaWYgKCFtZXNzYWdlLmRlc3RpbmF0aW9uKVxuICAgICAgICAgICAgbWVzc2FnZS5kZXN0aW5hdGlvbiA9IHRoaXMuaWQ7XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLmRvd247XG5cbiAgICAgICAgbGV0IGNsZWFudXBIYW5kbGVyO1xuICAgICAgICAvLyBUT0RPIDogZml4IGhlYXZ5IG9wLi5cbiAgICAgICAgLy8gIGlmIChpc0luaGVyaXRGcm9tKG1lc3NhZ2UsIE15b3BCaW5kTWVzc2FnZSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICBpZiAobWVzc2FnZS5oYW5kbGVyKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZSBhcyBNeW9wQmluZE1lc3NhZ2UpO1xuICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIgPSB0aGlzLmJpbmRXaGVuKHR5cGVkTWVzc2FnZS5yZXBseU1lc3NhZ2VLZXksIChtc2c6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2cucmVwbGF5VG9IYW5kbGVyID09PSB0eXBlZE1lc3NhZ2UuaGFuZGxlclVuaXF1ZUlkXG4gICAgICAgICAgICB9LCB0eXBlZE1lc3NhZ2UuaGFuZGxlcik7XG5cbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlLmhhbmRsZXJcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVE9ETzogdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICBpZiAobWVzc2FnZS5yZWYpIHtcbiAgICAgICAgICAgIC8vIHNlcmlhbGl6YWJsZVxuICAgICAgICAgICAgbWVzc2FnZS5yZWYgPSBtZXNzYWdlLnJlZi5fX25vblByb3hpZWQgfHwgbWVzc2FnZS5yZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2xlYW51cE1lc3NhZ2UobmV3IENsZWFudXBNZXNzYWdlKG1lc3NhZ2UuaWQsIChyZXBsYXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogbG9nIHJlcGxheT9cbiAgICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2xlYW51cEhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xlYW51cEhhbmRsZXIoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tYXJrZWRGb3JEaXNwb3NlZCA9IHRydWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzSW5pdGlhdGVkKSB7XG4gICAgICAgICAgICAvL1RPRE8gOiB1c2Ugc2RrLmxvZ2dlclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlzcG9zaW5nIGJlZm9yZSBpc0luaXRpYXRlZCcsIHRoaXMuaWQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCdkaXNwb3NpbmcgY29tcG9uZW50JywgdGhpcy5pZCk7XG5cbiAgICAgICAgLy8gLy9UT0RPIDogaW1wbGVtZW50IGRpc3Bvc2UgZmxvd1xuICAgICAgICAvLyBPYmplY3Qua2V5cyh0aGlzLnJlZnMpLmZvckVhY2gocmVmS2V5PT57XG4gICAgICAgIC8vICAgICB0aGlzLnJlZnNbcmVmS2V5XS5kaXNwb3NlKCk7XG4gICAgICAgIC8vIH0pO1xuXG4gICAgICAgIC8vVE9ETyA6IGNoZWNrIGlmIHRoZXJlIGlzIGFueSB0aW1lIGZvciB0aGUgb1xuICAgICAgICAvLyB0aGVyIHNpZGUgdG8gcHJvY2Nlc3MgdG8gbWVzc2FnZSBiZWZvcmUgZGllID9cbiAgICAgICAgLy9ub3RpZnkgdGhlIG90aGVyIHNpZGUgU0RLXG4gICAgICAgIHRoaXMuc2VuZChuZXcgRGlzcG9zZU1lc3NhZ2UoKSlcblxuICAgICAgICBjb25zdCBvbkRpc3Bvc2VIYW5kbGVycyA9IHRoaXMubWVzc2FnZUhhbmRsZXJzWydvbkRpc3Bvc2UnXVxuICAgICAgICBpZiAob25EaXNwb3NlSGFuZGxlcnMpIHtcbiAgICAgICAgICAgIG9uRGlzcG9zZUhhbmRsZXJzLmZvckVhY2goZGlzcG9zZUhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgbnVsbCBvciBmaXggdGhlIHR5cGUgP1xuICAgICAgICAgICAgICAgIGRpc3Bvc2VIYW5kbGVyKG51bGwpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY29uc29sZS5sb2codGhpcy5jb250YWluZXIpO1xuICAgICAgICAvL3RoaXMuY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VIYW5kbGVycyA9IHt9XG4gICAgICAgIHRoaXMuaWQgKz0gJ19kaXNwb3NlZCc7XG4gICAgICAgIHRoaXMuaXNJbml0aWF0ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm9wczogUCA9IHt9IGFzIHVua25vd24gYXMgUDtcbiAgICByZWZzOiBSID0ge30gYXMgdW5rbm93biBhcyBSO1xufVxuIiwgImV4cG9ydCBpbnRlcmZhY2UgSUVsZW1lbnRSZWYge1xuICAgIG15b3BJZD86IHN0cmluZ1xuICAgIGh0bWxUYWdOYW1lOiBzdHJpbmdcbiAgICBCb3VuZGluZ1JlY3Q/OiBET01SZWN0XG4gICAgb2Zmc2V0VG9wPzogbnVtYmVyXG4gICAgb2Zmc2V0TGVmdD86IG51bWJlclxuXG4gICAgdHlwZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjbGFzcyBYUGF0aEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIHhQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIGh0bWxUYWdOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcHVibGljIEJvdW5kaW5nUmVjdD86IERPTVJlY3QsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldFRvcD86IG51bWJlcixcbiAgICAgICAgICAgICAgICBwdWJsaWMgb2Zmc2V0TGVmdD86IG51bWJlcikge1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnWFBhdGhFbGVtZW50UmVmJ1xufVxuXG5leHBvcnQgY2xhc3MgTXlvcEVsZW1lbnRSZWYgaW1wbGVtZW50cyBJRWxlbWVudFJlZiB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG15b3BJZDogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBodG1sVGFnTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHB1YmxpYyBCb3VuZGluZ1JlY3Q/OiBET01SZWN0LFxuICAgICAgICAgICAgICAgIHB1YmxpYyBvZmZzZXRUb3A/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgcHVibGljIG9mZnNldExlZnQ/OiBudW1iZXIpIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSB0eXBlOiBzdHJpbmcgPSAnTXlvcEVsZW1lbnRSZWYnXG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlLCBNeW9wQmluZFJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlcn0gZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0IHR5cGUgSU1lc3NhZ2VFeGVjdXRvckNsZWFudXAgPSBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+IHwgUHJvbWlzZTx2b2lkPiB8IHZvaWQ7XG5cbmV4cG9ydCBjb25zdCBydW5FeGVjdXRvckNsZWFudXAgPSBhc3luYyAodGFzazogSU1lc3NhZ2VFeGVjdXRvckNsZWFudXApID0+IHtcbiAgICBpZiAodHlwZW9mIHRhc2sgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gSXQncyBhIGZ1bmN0aW9uLCBjYWxsIGl0XG4gICAgICAgIHRhc2soKTtcbiAgICB9IGVsc2UgaWYgKHRhc2sgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIC8vIEl0J3MgYSBQcm9taXNlLCBhd2FpdCBpdFxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0YXNrO1xuXG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVzdWx0IGlzIGEgZnVuY3Rpb24sIGNhbGwgaXRcbiAgICAgICAgICAgIHJlc3VsdCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIElmIHRhc2sgaXMgdm9pZCwgZG8gbm90aGluZ1xufVxuXG50eXBlIElNZXNzYWdlRXhlY3V0b3I8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4gPSAobWVzc2FnZTogVCkgPT4gSU1lc3NhZ2VFeGVjdXRvckNsZWFudXA7XG5cbmludGVyZmFjZSBJTWVzc2FnZUhhbmRsZXI8VCBleHRlbmRzIEJhc2VNeW9wTWVzc2FnZT4ge1xuICAgIG1lc3NhZ2VUeXBlOiBNeW9wTWVzc2FnZUtleVxuXG4gICAgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG5cbiAgICBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VNZXNzYWdlSGFuZGxlcjxUIGV4dGVuZHMgQmFzZU15b3BNZXNzYWdlID0gYW55PiBpbXBsZW1lbnRzIElNZXNzYWdlSGFuZGxlcjxUPiB7XG5cbiAgICAvL1RPRE8gOiBhZGQgZGlzcG9zZSBtZXRob2RcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBtZXNzYWdlVG9Ib3N0OiAobWVzc2FnZTogTXlvcEJpbmRSZXBsYXlNZXNzYWdlLCByZXBsYXlUbz86IE15b3BCaW5kTWVzc2FnZSkgPT4gdm9pZCkge1xuXG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG4gICAgYWJzdHJhY3QgZXhlY3V0b3I6IElNZXNzYWdlRXhlY3V0b3I8VD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnksIEUgPSBhbnk+IGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZVRvSG9zdDogKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHZvaWQsIHB1YmxpYyBjb250ZXh0PzogRSkge1xuICAgICAgICBzdXBlcihtZXNzYWdlVG9Ib3N0KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtDbGVhbnVwSGFuZGxlciwgcnVuRXhlY3V0b3JDbGVhbnVwfSBmcm9tIFwiLi9pbmRleC50c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL2Jhc2VNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsIENsZWFudXBNZXNzYWdlLCBDbGVhbnVwUmVwbGF5TWVzc2FnZSwgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgRW52ZWxvcGVkTWVzc2FnZSxcbiAgICBJbml0TWVzc2FnZSxcbiAgICBJbml0UmVzcG9uc2UsXG4gICAgTWVzc2FnZURpcmVjdGlvbixcbiAgICBNeW9wQmluZE1lc3NhZ2UsXG4gICAgTXlvcEJpbmRSZXBsYXlNZXNzYWdlXG59IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgSG9zdGVkQ29tcG9uZW50PFQgPSBhbnk+IHtcbiAgICBzZW5kID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4ge1xuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgIH1cblxuICAgIC8vb25NZXNzYWdlUmVjZWl2ZWQ6IChtc2c6IElNeW9wTWVzc2FnZSkgPT4gdm9pZDtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY29udGV4dD86IFQpIHtcblxuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTXlvcFNESyB7XG4gICAgaW5pdDogKCkgPT4gdm9pZDtcblxuICAgIG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkXG5cbiAgICBzdXBwb3J0ZWRIYW5kbGVyczogQmFzZU1lc3NhZ2VIYW5kbGVyW107XG5cbiAgICBoYW5kbGVJbmNvbWVNZXNzYWdlczogKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50Pjtcbn1cblxuLy8gY29uc3QgbG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzID0gW1xuLy8gICAgIE15b3BNZXNzYWdlcy5Jbml0UmVxdWVzdCxcbi8vICAgICBNeW9wTWVzc2FnZXMuSW5pdFJlc3BvbnNlLFxuLy8gICAgIC8vTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UsXG4vLyBdXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcFNESyBpbXBsZW1lbnRzIElNeW9wU0RLIHtcblxuICAgIGFic3RyYWN0IG1lc3NhZ2VUb0hvc3Q6IChtZXNzYWdlOiBNeW9wQmluZFJlcGxheU1lc3NhZ2UsIHJlcGxheVRvPzogTXlvcEJpbmRNZXNzYWdlKSA9PiB2b2lkO1xuXG4gICAgYWJzdHJhY3Qgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VNZXNzYWdlSGFuZGxlcltdO1xuXG4gICAgbWVzc2FnZVRvSGFuZGxlQWZ0ZXJJbml0OiBCYXNlTXlvcE1lc3NhZ2VbXSA9IFtdO1xuXG4gICAgY29tcG9uZW50czogUmVjb3JkPHN0cmluZywgSG9zdGVkQ29tcG9uZW50PiA9IHt9O1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdDogYm9vbGVhbiA9IGZhbHNlXG5cbiAgICBtZXNzYWdlQ2xlYW51cENhY2hlOiBSZWNvcmQ8c3RyaW5nLCBDbGVhbnVwSGFuZGxlciB8IFByb21pc2U8Q2xlYW51cEhhbmRsZXI+PiB8IFByb21pc2U8dm9pZD4gPSB7fTtcblxuICAgIGhhbmRsZUluY29tZU1lc3NhZ2VzKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgZXZlbnRDb250ZW50ID0gZXZlbnQuZGF0YSA/IGV2ZW50LmRhdGEgOiBldmVudC5kZXRhaWw7XG5cbiAgICAgICAgaWYgKCFldmVudENvbnRlbnQgfHwgIWV2ZW50Q29udGVudC5teW9wKSB7XG4gICAgICAgICAgICAvLyBub3QgbXlvcCBtYXJrZWQgZXZlbnQgXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGV2ZW50Q29udGVudCBhcyBCYXNlTXlvcE1lc3NhZ2U7XG5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLmRpcmVjdGlvbiAhPT0gTWVzc2FnZURpcmVjdGlvbi5kb3duKSB7XG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnbWVzc2FnZSBkcm9wcGVkIGluIGJhc2VTREssIGRpcmVjdGlvbiB3YXMgJywgZXZlbnQuZGF0YS5kaXJlY3Rpb24pXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiAobG9jYWxIb3N0SGFuZGxlZE1lc3NhZ2VzLmluY2x1ZGVzKG1lc3NhZ2UubWVzc2FnZVR5cGUpKSB7XG4gICAgICAgICAgICAvLyAgICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgICAgLy9UT0RPIDogZml4IGRpcmVjdGlvbiA/IG1lc3NhZ2Ugd2lsbCBub3QgcHJvY2Nlc3Mgb3RoZXJ3aXNlXG4gICAgICAgICAgICAvLyAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkRpc3Bvc2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNob3VsZCBub3QgYmUgb3B0aW9uYWwsIGZpeCBhbmQgcmVtb3ZlICdpZidcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5kZXN0aW5hdGlvbilcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uXVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2UgZ290IG91ciBpZCBmcm9tIG91ciBob3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgLy9UT0RPIDogU0RLIG1heSBzZXJ2ZSBtb3JlIHRoYW4gMSBjb21wb25lbnQgLi4gdGhpbmsgYWJvdXQgdGhhdFxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdDb21wb25lbnRJZCA9IChtZXNzYWdlIGFzIEluaXRNZXNzYWdlKS5jb250ZW50LmlkO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgLy90aHJvdyBuZXcgRXJyb3IoXCJyZWNoaXZlZCBpbml0IG1lc3NhZ2UgZm9yIGFuIGV4c2lzaW5nIGNvbXBvbmVudC5cIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tuZXdDb21wb25lbnRJZF0gPSBuZXcgSG9zdGVkQ29tcG9uZW50KG5ld0NvbXBvbmVudElkKVxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlc3BvbnNlKG5ld0NvbXBvbmVudElkKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBUT0RPIDogaXMgaXQgdHJ1ZSB0byBub3QgcGFzcyBmdXJ0aGVyICggdG8gdGhlIGNvbXBvbmVudCApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBmb3Igc2FtZSBIb3N0U0RLIGNhc2VzXG4gICAgICAgICAgICAvLyB3aGVuIGJvdGggUmVmQ29tcG9uZW50IGFuZCByZWFsQ29tcG9uZW50IGhvc3RlZCBpbiB0aGUgc2FtZSBIb3N0U0RLXG4gICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkVudmVsb3BlZE1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbnZlbG9wZWRNZXNzYWdlID0gKG1lc3NhZ2UgYXMgRW52ZWxvcGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5uZXJNZXNzYWdlID0gZW52ZWxvcGVkTWVzc2FnZS5tZXNzYWdlO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBpbm5lck1lc3NhZ2U7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbHdheXNQYXNzRW52ZWxvcGVzVG9Ib3N0IHx8IHRoaXMuY29tcG9uZW50c1ttZXNzYWdlLmRlc3RpbmF0aW9uIV0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkNvbXBvbmVudCA9IG15b3AuaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBpbm5lck1lc3NhZ2UuZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Db21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29tcG9uZW50LnNlbmQoaW5uZXJNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQgPSBteW9wLmhvc3RTREsuY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PT0gZW52ZWxvcGVkTWVzc2FnZS5kZXN0aW5hdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnZlbG9wZWREZXN0aW5hdGlvbkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW52ZWxvcGVkRGVzdGluYXRpb25Db21wb25lbnQuc2VuZChpbm5lck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2Upe1xuICAgICAgICAgICAgLy8gICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2U7XG4gICAgICAgICAgICAvLyAvLyAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIGlmIChtZXNzYWdlLm1lc3NhZ2VUeXBlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkNsZWFudXBNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTWVzc2FnZSA9IG1lc3NhZ2UgYXMgQ2xlYW51cE1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSB0aGlzLm1lc3NhZ2VDbGVhbnVwQ2FjaGVbdHlwZWRNZXNzYWdlLmNsZWFudXBGb3JNZXNzYWdlSWRdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBNZXNzYWdlID0gbmV3IENsZWFudXBSZXBsYXlNZXNzYWdlKCEhY2xlYW51cCk7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFudXBNZXNzYWdlLmRlc3RpbmF0aW9uID0gbWVzc2FnZS5kZXN0aW5hdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoISFjbGVhbnVwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5tZXNzYWdlQ2xlYW51cENhY2hlW3R5cGVkTWVzc2FnZS5jbGVhbnVwRm9yTWVzc2FnZUlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkV4ZWN1dG9yQ2xlYW51cChjbGVhbnVwKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QoY2xlYW51cE1lc3NhZ2UsIHR5cGVkTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogaGFuZGVsIGVycm9yP1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChjbGVhbnVwTWVzc2FnZSwgdHlwZWRNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFjdGlvbkhhbmRsZXJGb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlci5tZXNzYWdlVHlwZSA9PT0gbWVzc2FnZS5tZXNzYWdlVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uSGFuZGxlckZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXAgPSBoYW5kbGVyLmV4ZWN1dG9yKG1lc3NhZ2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5jbGVhbmFibGUgJiYgY2xlYW51cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUNsZWFudXBDYWNoZVttZXNzYWdlLmlkXSA9IGNsZWFudXA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhbnVwICYmICFtZXNzYWdlLmNsZWFuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2xlYW51cCBoYW5kbGVyIGdlbmVyYXRlZCBmb3Igbm9uLWNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjbGVhbnVwICYmIG1lc3NhZ2UuY2xlYW5hYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBjbGVhbnVwIGhhbmRsZXIgZ2VuZXJhdGVkIGZvciBhIGNsZWFuYWJsZSBtZXNzYWdlLiBcbm1lc3NhZ2VUeXBlIC0gJHttZXNzYWdlLm1lc3NhZ2VUeXBlfSwgaGFuZGxlciBleGVjdXRvciB3YXMgLSAke2hhbmRsZXIuZXhlY3V0b3J9XG5cblBsZWFzZSByZXZpZXcgdGhlIG1lc3NhZ2UgZGVmaW5pdGlvbiBvYmplY3QgJiBtZXNzYWdlIGhhbmRsZXIuXG5UbyBlbnN1cmUgY2xlYW51cCBwcm9wZXJseSBzZXQgJ2NsZWFuYWJsZScgdHJ1ZSBhdCBtZXNzYWdlIGRlZmluaXRpb24gYW5kIHJldHVybiBJTWVzc2FnZUV4ZWN1dG9yQ2xlYW51cCBmcm9tIHlvdXIgaGFuZGxlcnMuYClcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBpZiAoIWFjdGlvbkhhbmRsZXJGb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBwcmludCB3aXRoIGRlYnVnIGNvbmZpZyBvbmx5XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25vIG1lc3NhZ2UgaGFuZGxlciB3YXMgZm91bmQgZm9yICcsIG1lc3NhZ2UpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygndW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFic3RyYWN0IGluaXQ6ICgpID0+IHZvaWQ7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZUtleX0gZnJvbSBcIi4vTXlvcE1lc3NhZ2VzXCI7XG5cbmV4cG9ydCAqIGZyb20gJy4vTXlvcEVsZW1lbnRSZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9iYXNlTWVzc2FnZUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9CYXNlTXlvcFNESyc7XG5cbmV4cG9ydCB0eXBlIENsZWFudXBIYW5kbGVyID0gKCkgPT4gdm9pZFxuXG5leHBvcnQgdHlwZSBEaWN0aW9uYXJ5PFQ+ID0geyBba2V5OiBzdHJpbmddOiBUOyB9O1xuXG4vL2V4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0gJ0lmcmFtZUxvYWRlcicgfCAnV2ViQ29tcG9uZW50TG9hZGVyJyB8ICdIVE1MTG9hZGVyJyB8IHN0cmluZztcblxuZXhwb3J0IGNvbnN0IFNraW5Mb2FkZXJzID0ge1xuICAgIFwiSWZyYW1lTG9hZGVyXCI6IFwiSWZyYW1lTG9hZGVyXCIsXG4gICAgXCJXZWJDb21wb25lbnRMb2FkZXJcIjogXCJXZWJDb21wb25lbnRMb2FkZXJcIixcbiAgICBcIkhUTUxMb2FkZXJcIjogXCJIVE1MTG9hZGVyXCIsXG4gICAgXCJNaW5pbWl6ZWRMb2FkZXJcIjogXCJNaW5pbWl6ZWRMb2FkZXJcIlxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIFNraW5Mb2FkZXJUeXBlID0ga2V5b2YgdHlwZW9mIFNraW5Mb2FkZXJzO1xuXG5leHBvcnQgdHlwZSBQcm9wVHlwZSA9ICdhbnknIHwgJ3N0cmluZycgfCAnbnVtYmVyJyB8IHN0cmluZzsgLy8gVE9ETyA6IDxcbmV4cG9ydCB0eXBlIFJlZlNlbGVjdG9yVHlwZSA9ICdpZC1hdHRyaWJ1dGUnIHwgJ2Nzcy1zZWxlY3RvcicgfCAneHBhdGgnIHwgc3RyaW5nO1xuXG5leHBvcnQgY29uc3QgTG9hZGVyRnJhbWV3b3JrcyA9IHtcbiAgICBcInJlYWN0XCI6IFwicmVhY3RcIixcbiAgICBcInZ1ZVwiOiBcInZ1ZVwiLFxuICAgIFwiYW5ndWxhclwiOiBcImFuZ3VsYXJcIixcbn0gYXMgY29uc3RcbmV4cG9ydCB0eXBlIExvYWRlckZyYW1ld29ya1R5cGUgPSBrZXlvZiB0eXBlb2YgTG9hZGVyRnJhbWV3b3JrcztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViQ29tcG9uZW50TG9hZGVyQ29uZmlnIGV4dGVuZHMgSVNraW5Mb2FkZXJDb25maWcge1xuICAgIHR5cGU6IFwiV2ViQ29tcG9uZW50TG9hZGVyXCI7XG4gICAgdXJsOiBzdHJpbmcsXG4gICAgdGFnOiBzdHJpbmcsXG4gICAgZnJhbWV3b3JrPzogTG9hZGVyRnJhbWV3b3JrVHlwZVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElJZnJhbWVMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJJZnJhbWVMb2FkZXJcIjtcbiAgICB1cmw6IHN0cmluZ1xuICAgIGF1dG9IZWlnaHQ6IGJvb2xlYW5cbiAgICBoZWlnaHQ/OiBzdHJpbmdcbiAgICB3aWR0aD86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgU2hhZG93Um9vdE1vZGVUeXBlID0ge1xuICAgIFwib3BlblwiOiBcIm9wZW5cIixcbiAgICBcImNsb3NlZFwiOiBcImNsb3NlZFwiLFxuICAgIFwibm9uZVwiOiBcIm5vbmVcIixcbiAgICBcImxvY2FsRnJhbWVcIjogXCJsb2NhbEZyYW1lXCJcbn0gYXMgY29uc3Q7XG5cblxuZXhwb3J0IGludGVyZmFjZSBJSFRNTExvYWRlckNvbmZpZyBleHRlbmRzIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBcIkhUTUxMb2FkZXJcIjtcbiAgICBIVE1MOiBzdHJpbmc7XG4gICAgLy9UT0RPOiByZW5hbWUocm9vdE1vZGUvY3VzdG9tRWxlbWVudE1vZGUpICsgZGIgbWlncmF0aW9uXG4gICAgc2hhZG93Um9vdE1vZGU/OiBrZXlvZiB0eXBlb2YgU2hhZG93Um9vdE1vZGVUeXBlO1xuICAgIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xuICAgIGhlaWdodD86IHN0cmluZztcbiAgICB3aWR0aD86IHN0cmluZztcbn1cblxuLy9mb3IgaW50ZXJuYWwgZGFzaGJvYXJkIHVzYWdlXG5leHBvcnQgaW50ZXJmYWNlIElNaW5pbWl6ZWRMb2FkZXJDb25maWcgZXh0ZW5kcyBJU2tpbkxvYWRlckNvbmZpZyB7XG4gICAgdHlwZTogXCJNaW5pbWl6ZWRMb2FkZXJcIjtcbn1cblxuaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdCB7XG4gICAgX3RlbXBfY2xpZW50X2lkPzogc3RyaW5nLFxufVxuXG50eXBlIEV4dGVuZDxULCBVPiA9IFQgJiBVO1xuXG50eXBlIEV4dGVuZFJlY3Vyc2l2ZWx5PFQsIEU+ID0ge1xuICAgIFtLIGluIGtleW9mIEVdOiBFW0tdO1xufSAmIHtcbiAgICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIG9iamVjdFxuICAgICAgICA/IEV4dGVuZFJlY3Vyc2l2ZWx5PFRbS10sIEU+XG4gICAgICAgIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIElEYXNoYm9hcmQ8VD4gPSBFeHRlbmRSZWN1cnNpdmVseTxULCBEYXNoYm9hcmRPYmplY3Q+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luTG9hZGVyQ29uZmlnIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZVxuXG4gICAgW2tleTogc3RyaW5nXTogYW55OyAvLyBBbGxvd3MgYW55IGFkZGl0aW9uYWwgcHJvcGVydGllc1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGxvYWRlcjogSVNraW5Mb2FkZXJDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTWVzc2FnZVByb3BDb25maWcgZXh0ZW5kcyBJUHJvcENvbmZpZyB7XG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBtZXNzYWdlVHlwZTogTXlvcE1lc3NhZ2VLZXlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQmluZE1lc3NhZ2VQcm9wQ29uZmlnIGV4dGVuZHMgSVByb3BDb25maWcge1xuICAgIHR5cGU6IFByb3BUeXBlXG4gICAgbWVzc2FnZVR5cGU6IE15b3BNZXNzYWdlS2V5XG59XG5cbmV4cG9ydCBjb25zdCBQcm9wTWVzc2FnZU1vZGVzID0ge1xuICAgIFwiaW5wdXRcIjogXCJpbnB1dFwiLFxuICAgIFwib3V0cHV0XCI6IFwib3V0cHV0XCJcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCBjb25zdCBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcyA9IHtcbiAgICBcIm1lc3NhZ2VcIjogXCJtZXNzYWdlXCIsXG4gICAgXCJjb2RlXCI6IFwiY29kZVwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElQcm9wTWVzc2FnZUJlaGF2aW9yUGFyYW0ge1xuICAgIHZhbHVlOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcEJlaGF2aW9yIHtcbiAgICB0eXBlOiBrZXlvZiB0eXBlb2YgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXNcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcENvZGVCZWhhdmlvciBleHRlbmRzIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IFwiY29kZVwiXG4gICAgcmVtYXA/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUHJvcE1lc3NhZ2VCZWhhdmlvciBleHRlbmRzIElQcm9wQmVoYXZpb3Ige1xuICAgIHR5cGU6IFwibWVzc2FnZVwiXG4gICAgbWVzc2FnZTogTXlvcE1lc3NhZ2VLZXlcbiAgICByZWY6IHN0cmluZywgLy9UT0RPIG1ha2UgaXQgaWRcbiAgICBwYXJhbXM6IElQcm9wTWVzc2FnZUJlaGF2aW9yUGFyYW1bXVxuICAgIG1vZGU6IGtleW9mIHR5cGVvZiBQcm9wTWVzc2FnZU1vZGVzXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVByb3BDb25maWcge1xuICAgIGlkOiBzdHJpbmdcbiAgICBuYW1lOiBzdHJpbmdcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nXG4gICAgdHlwZTogUHJvcFR5cGVcbiAgICBiZWhhdmlvcjogSVByb3BCZWhhdmlvclxufVxuXG5cbmV4cG9ydCBjbGFzcyBSZWZCZWhhdmlvclR5cGUge1xuICAgIHN0YXRpYyBjb2RlID0gJ2NvZGUnIGFzIGNvbnN0XG4gICAgc3RhdGljIGNvbXBvbmVudCA9ICdjb21wb25lbnQnIGFzIGNvbnN0XG59XG5cbmV4cG9ydCB0eXBlIElSZWZCZWhhdmlvclR5cGUgPSAnY29kZScgfCAnY29tcG9uZW50JztcblxuZXhwb3J0IGludGVyZmFjZSBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6IElSZWZCZWhhdmlvclR5cGVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50UmVmQmVoYXZpb3IgZXh0ZW5kcyBJUmVmQmVoYXZpb3Ige1xuICAgIHR5cGU6ICdjb21wb25lbnQnXG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKiBQcm9wZXJ0eSBpbnN0YW5jZSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqL1xuICAgIGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29kZVJlZkJlaGF2aW9yIGV4dGVuZHMgSVJlZkJlaGF2aW9yIHtcbiAgICB0eXBlOiAnY29kZSdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJUmVmQ29uZmlnIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHNlbGVjdG9yVHlwZTogUmVmU2VsZWN0b3JUeXBlXG4gICAgc2VsZWN0b3I6IHN0cmluZ1xuICAgIGJlaGF2aW9yOiBJUmVmQmVoYXZpb3Jcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAvLyBwcm9wczogUmVjb3JkPHN0cmluZywgSVByb3BDb25maWc+IC8vaWQgLSB0eXBlXG4gICAgLy8gcmVmczogUmVjb3JkPHN0cmluZywgSVJlZkNvbmZpZz4sXG4gICAgLy8gc2tpbnM6IFJlY29yZDxzdHJpbmcsIElTa2luQ29uZmlnPlxuICAgIHByb3BzOiBJUHJvcENvbmZpZ1tdLFxuICAgIHJlZnM6IElSZWZDb25maWdbXSxcbiAgICBza2luczogSVNraW5Db25maWdbXSxcbiAgICBkZWZhdWx0U2tpbjogbnVtYmVyO1xuXG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIC8vcmVzb2x2ZWREZWZpbml0aW9ucz86IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnW11cbiAgICAvL1RPRE8gOiBtb3ZlIHRvIGJhc2UgY2xhc3MgKCBJU3RvcmFibGVJdGVtIG9yIHNvLi4uKVxuXG4gICAgY3JlYXRlZE9uPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVNraW5JbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcyxcbiAgICAvL3NraW5zOiBJU2tpbkluc3RhbmNlQ29uZmlnW11cbn1cblxuZXhwb3J0IGNvbnN0IFNlZ21lbnRUeXBlID0ge1xuICAgIFwiRnVuY3Rpb25SZXN1bHRcIjogXCJGdW5jdGlvblJlc3VsdFwiLFxufSBhcyBjb25zdDtcblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEluc3RhbmNlIHtcbiAgICBzZWdtZW50SWQ6IHN0cmluZztcbiAgICBza2luU2VsZWN0b3I6IElTa2luU2VsZWN0b3JDb25maWdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIFNlZ21lbnRUeXBlXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZ1bmN0aW9uUmVzdWx0c1NlZ21lbnQgZXh0ZW5kcyBJU2VnbWVudERlZmluaXRpb24ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgdHlwZTogdHlwZW9mIFNlZ21lbnRUeXBlLkZ1bmN0aW9uUmVzdWx0XG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIGZ1bmN0aW9uOiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IFNraW5TZWxlY3RvclR5cGVzID0ge1xuICAgIFwiU2VnbWVudGVkXCI6IFwiU2VnbWVudGVkXCIsXG4gICAgXCJEZWRpY2F0ZWRcIjogXCJEZWRpY2F0ZWRcIixcblxuICAgIC8qKlxuICAgICAqIFRoaXMgU2VsZWN0b3IgVHlwZSBpcyBub3QgeWV0IHN1cHBvcnRlZCBidXQgd2lsbCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLlxuICAgICAqIFBsZWFzZSBjaGVjayB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdXBkYXRlcy5cbiAgICAgKlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICovXG4gICAgXCJEZWZhdWx0XCI6IFwiRGVmYXVsdFwiXG59IGFzIGNvbnN0O1xuXG5cbi8qKlxuICogVGhpcyBTa2luIENvbmZpZyBUeXBlIGlzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ1dCB3aWxsIGJlIGFkZGVkIGluIGEgZnV0dXJlIHJlbGVhc2UuXG4gKiBQbGVhc2UgY2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHVwZGF0ZXMuXG4gKlxuICogQHR5cGUge0lEZWZhdWx0U2tpbkNvbmZpZ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJRGVmYXVsdFNraW5Db25maWcgZXh0ZW5kcyBJU2tpblNlbGVjdG9yQ29uZmlnIHtcbiAgICB0eXBlOiB0eXBlb2YgU2tpblNlbGVjdG9yVHlwZXMuRGVmYXVsdCxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudGVkU2tpbkNvbmZpZyBleHRlbmRzIElTa2luU2VsZWN0b3JDb25maWcge1xuICAgIHR5cGU6IHR5cGVvZiBTa2luU2VsZWN0b3JUeXBlcy5TZWdtZW50ZWQsXG4gICAgc2VnbWVudHM6IElTZWdtZW50SW5zdGFuY2VbXVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEZWRpY2F0ZWRTa2luQ29uZmlnIGV4dGVuZHMgSVNraW5TZWxlY3RvckNvbmZpZyB7XG4gICAgdHlwZTogdHlwZW9mIFNraW5TZWxlY3RvclR5cGVzLkRlZGljYXRlZCxcblxuICAgIC8qKlxuICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgc2tpbn0gaW5zdGVhZC5cbiAgICAgKiBQcm9wZXJ0eSBza2lucyBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLlxuICAgICAqIFBsZWFzZSB1cGRhdGUgeW91ciBjb2RlIHRvIHVzZSB7QGxpbmsgc2tpbn0gZm9yIGJldHRlciBjb21wYXRpYmlsaXR5LlxuICAgICAqXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKi9cbiAgICBza2lucz86IElTa2luSW5zdGFuY2VDb25maWdbXSAvLyBkZXByZWNhdGVkXG4gICAgc2tpbjogSVNraW5JbnN0YW5jZUNvbmZpZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb21wb25lbnRJbnN0YW5jZUNvbmZpZyB7XG4gICAgaWQ6IHN0cmluZztcbiAgICBjb21wb25lbnRJZDogc3RyaW5nO1xuXG4gICAgLy9UT0RPIDpcbiAgICAvLyBSZWZJRCA/IHRvIHN1cHBvcnQgbW9yZSB0aGFuIDEgY29tcG9uZW50IGZyb20gdGhlIHNhbWUgdHlwZSBpbiBjb21wb3NpdGVzID9cblxuICAgIC8vVE9ETyA6IHJlbW92ZVxuICAgIGNvbXBvbmVudE5hbWU6IHN0cmluZzsgLy8gPDwgY2hlY2tcblxuICAgIHNraW5TZWxlY3RvcjogSVNraW5TZWxlY3RvckNvbmZpZ1xuXG4gICAgLy8gc3RvcmluZyB0aGUgbmVzdGVkIGNvbmZpZyBmb3IgcmVmIGNvbXBvbmVudHNcbiAgICBuZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnW11cblxuICAgIC8vb25seSBvbiBHRVQ/XG4gICAgLy9UT0RPIDogdGhpbmsgYWJvdXQgdGhhdFxuICAgIHJlc29sdmVkRXhwZXJpZW5jZXM/OiBJRXhwZXJpZW5jZVtdXG4gICAgLy8gd2lsbCBpbmNsdWRlIGluc3RhbmNlIGFuZCBkZWYgY29uZmlnIGluIG9yZGVyIHRvIHJlbmRlciBpbiBwcm9kdWN0aW9uXG4gICAgcmVzb2x2ZWROZXN0ZWRDb21wb25lbnRzPzogSUNvbXBvbmVudENvbmZpZ1tdXG59XG5cbmV4cG9ydCBjb25zdCBFeHBlcmllbmNlVHlwZXMgPSB7XG4gICAgXCJTZWdtZW50XCI6IFwiU2VnbWVudFwiLFxuICAgIFwiUHJvbW9cIjogXCJQcm9tb1wiLFxuICAgIFwiQUJcIjogXCJBQlwiXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgaW50ZXJmYWNlIElFeHBlcmllbmNlIHtcbiAgICBpZDogc3RyaW5nXG4gICAgbmFtZTogc3RyaW5nXG4gICAgZGVzY3JpcHRpb246IHN0cmluZ1xuICAgIHR5cGU6IGtleW9mIHR5cGVvZiBFeHBlcmllbmNlVHlwZXNcbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIC8vc3RpY2tpbmVzc0ZhY3RvclxuICAgIC8vRW5kRGF0ZVxufVxuXG4vLyBleHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2VHcm91cCB7XG4vLyAgICAgaWQ6IHN0cmluZ1xuLy8gICAgIG5hbWU6IHN0cmluZ1xuLy8gICAgIHBlcmNlbnRhZ2U6IG51bWJlclxuLy8gfVxuXG5leHBvcnQgaW50ZXJmYWNlIElBQkV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZTogdHlwZW9mIEV4cGVyaWVuY2VUeXBlcy5BQlxuICAgIC8vIGdyb3VwczogSUFCRXhwZXJpZW5jZUdyb3VwW11cbiAgICBleHBlcmllbmNlczogSUV4cGVyaWVuY2VbXVxuICAgIHBlcmNlbnRhZ2U6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElEYXRlUmFuZ2Uge1xuICAgIGlkOiBzdHJpbmdcbiAgICBzdGFydDogRGF0ZVxuICAgIGVuZDogRGF0ZVxuICAgIHRpbWV6b25lOiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJU2VnbWVudEV4cGVyaWVuY2UgZXh0ZW5kcyBJRXhwZXJpZW5jZSB7XG4gICAgdHlwZToga2V5b2YgdHlwZW9mIEV4cGVyaWVuY2VUeXBlc1xuICAgIHNlZ21lbnQ6IElTZWdtZW50RGVmaW5pdGlvblxuICAgIGRhdGVSYW5nZT86IElEYXRlUmFuZ2Vcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3dEZWZpbml0aW9uIHtcbiAgICBpZDogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIGNvbXBvbmVudHM6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1tdO1xuICAgIG9yaWdpbnM6IHN0cmluZ1tdLFxuICAgIGV4cGVyaWVuY2VzOiBJRXhwZXJpZW5jZVtdXG4gICAgYnJhbmNoPzogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgaW5zdGFuY2U6IElDb21wb25lbnRJbnN0YW5jZUNvbmZpZ1xuICAgIHR5cGU6IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnXG5cbiAgICAvLyBUT0RPIDogdmVyaWZ5IHVuaXF1ZW5lc3MgKGRhc2hib2FyZCAmIHNlcnZlcilcbiAgICBuYW1lOiBzdHJpbmdcbn1cblxuaW50ZXJmYWNlIElCcmFuY2hhYmxlIHtcbiAgICBicmFuY2g/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVXNlckZsb3cgZXh0ZW5kcyBPbWl0PElVc2VyRmxvd0RlZmluaXRpb24sICdjb21wb25lbnRzJz4sIElCcmFuY2hhYmxlIHtcbiAgICBjb21wb25lbnRzOiBJQ29tcG9uZW50Q29uZmlnW11cbn1cblxuZXhwb3J0IGNsYXNzIFJvb3RSZWYge1xuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwdWJsaWMgc2hhZG93Um9vdD86IFNoYWRvd1Jvb3QpIHtcblxuICAgIH1cblxuICAgIGdldFJvb3REaXYgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKS5xdWVyeVNlbGVjdG9yKCdkaXYnKVxuICAgIH1cblxuICAgIGdldFJvb3QgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiAodGhpcy5zaGFkb3dSb290IHx8IHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IHR5cGUgU2VyaWFsaXphYmxlPFQ+ID1cbiAgICBUIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IC8vIEV4Y2x1ZGUgZnVuY3Rpb25zXG4gICAgICAgIFQgZXh0ZW5kcyBBcnJheTxpbmZlciBVPiA/IFNlcmlhbGl6YWJsZTxVPltdIDogLy8gSGFuZGxlIGFycmF5c1xuICAgICAgICAgICAgVCBleHRlbmRzIG9iamVjdCA/IHtcbiAgICAgICAgICAgICAgICBbSyBpbiBrZXlvZiBUIGFzIFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogS106IFNlcmlhbGl6YWJsZTxUW0tdPlxuICAgICAgICAgICAgfSA6IFQ7IC8vIEhhbmRsZSBvYmplY3RzXG5cbmNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlICE9PSBPYmplY3QodmFsdWUpO1xufVxuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlKSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnRhaW5zUHJpbWl0aXZlc09ubHkgPSAob2JqKSA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRnVuY3Rpb24ob2JqKSkge1xuICAgICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAoT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iaikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gb2JqW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjaGVjayBpZiBpdCdzIGEgbmVzdGVkIG9iamVjdFxuICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZSh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBJdCdzIGEgcHJpbWl0aXZlLCBzbyB3ZSBjYW4gc2tpcCBpdFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBGb3VuZCBhIG5vbi1wcmltaXRpdmUgdmFsdWVcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0cnVlOyAvLyBBbGwgdmFsdWVzIGFyZSBwcmltaXRpdmVzIG9yIG5lc3RlZCBvYmplY3RzIHdpdGggcHJpbWl0aXZlc1xufVxuXG4vLyBjdXJyZW50bHkgc3VwcG9ydCByb290IGxldmVsIG9ubHlcbi8vIHt4OiAxLCB5IDogJ2EnLCB6IDogKCk9PnsuLi59LCBpbm5lciA6IHsgeDogMSAsIHkgOiAnYSd9IH1cbi8vIHt4OiAxLCB5IDogJ2EnfVxuLy9odHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0dsb3NzYXJ5L0ZhbHN5XG5leHBvcnQgdHlwZSBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IFBhcnRpYWw8UmVjb3JkPGtleW9mIFQsIGJvb2xlYW4gfCBQYXJ0aWFsPFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+Pj4+IHwgYm9vbGVhbjtcblxuZXhwb3J0IGNvbnN0IG1ha2VTZXJpYWxpemFibGUgPSA8VD4oXG4gICAgb2JqOiBULFxuICAgIHNrZWxldG9uOiBTZXJpYWxpemFibGVTa2VsZXRvbjxUPiA9IHt9LFxuICAgIGluY2x1ZGVGYWxzeUtleXM6IGJvb2xlYW4gPSB0cnVlLCAvLyBUT0RPIDogdXNlIHRoYXQgYXJnXG4gICAgc2VlbjogV2Vha01hcDxvYmplY3QsIFNlcmlhbGl6YWJsZTxhbnk+PiA9IG5ldyBXZWFrTWFwKClcbik6IFNlcmlhbGl6YWJsZTxUPiA9PiB7XG5cbiAgICBpZiAoaXNQcmltaXRpdmUob2JqKSkge1xuICAgICAgICByZXR1cm4gb2JqIGFzIFNlcmlhbGl6YWJsZTxUPjsgLy8gRGlyZWN0bHkgcmV0dXJuIHByaW1pdGl2ZSB2YWx1ZXNcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgYXJyYXkgc2VyaWFsaXphdGlvblxuICAgICAgICBjb25zdCBzZXJpYWxpemFibGVBcnJheTogU2VyaWFsaXphYmxlPGFueT5bXSA9IFtdO1xuICAgICAgICBzZWVuLnNldChvYmosIHNlcmlhbGl6YWJsZUFycmF5KTsgLy8gU3RvcmUgdGhlIGFycmF5IGluIHNlZW5cblxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgb2JqLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IG9ialtpbmRleF07XG4gICAgICAgICAgICBzZXJpYWxpemFibGVBcnJheVtpbmRleF0gPSBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQsIHNrZWxldG9uLCBpbmNsdWRlRmFsc3lLZXlzLCBzZWVuKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlQXJyYXkgYXMgU2VyaWFsaXphYmxlPFQ+O1xuICAgIH1cblxuICAgIGlmIChvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGN5Y2xpYyByZWZlcmVuY2VzXG4gICAgICAgIGlmIChzZWVuLmhhcyhvYmopKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vlbi5nZXQob2JqKSE7IC8vIFJldHVybiB0aGUgYWxyZWFkeSBwcm9jZXNzZWQgb2JqZWN0XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWFsaXphYmxlT2JqZWN0OiBQYXJ0aWFsPFNlcmlhbGl6YWJsZTxUPj4gPSB7fTtcbiAgICAgICAgc2Vlbi5zZXQob2JqLCBzZXJpYWxpemFibGVPYmplY3QpOyAvLyBTdG9yZSB0aGUgb2JqZWN0IGluIHNlZW5cblxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBrZXkgaXMgaW4gdGhlIHNrZWxldG9uIGFuZCBpZiBpdCdzIGEgdmFsaWQga2V5IHRvIHNlcmlhbGl6ZVxuXG4gICAgICAgICAgICBjb25zdCBrZXlJblNrZWxldG9uID0gdHlwZW9mIHNrZWxldG9uID09IFwiYm9vbGVhblwiID8gc2tlbGV0b24gOiBza2VsZXRvbltrZXldO1xuXG4gICAgICAgICAgICBpZiAoa2V5SW5Ta2VsZXRvbikge1xuICAgICAgICAgICAgICAgIGlmIChrZXlJblNrZWxldG9uID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBza2VsZXRvbiBpbmRpY2F0ZXMgdG8gc2VyaWFsaXplIHRoaXMga2V5XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlRmFsc3lLZXlzID8gb2JqW2tleV0gIT09IHVuZGVmaW5lZCA6IG9ialtrZXldKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIHRydWUsIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Yga2V5SW5Ta2VsZXRvbiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNrZWxldG9uIGluZGljYXRlcyBuZXN0ZWQga2V5cyB0byBzZXJpYWxpemVcbiAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVPYmplY3Rba2V5XSA9IG1ha2VTZXJpYWxpemFibGUob2JqW2tleV0sIGtleUluU2tlbGV0b24sIGluY2x1ZGVGYWxzeUtleXMsIHNlZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2VyaWFsaXphYmxlT2JqZWN0IGFzIFNlcmlhbGl6YWJsZTxUPjtcbiAgICB9XG5cbiAgICByZXR1cm4ge30gYXMgYW55OyAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IGZvciBvdGhlciBjYXNlc1xufVxuIiwgImV4cG9ydCBjb25zdCBFcnJvcnMgPSB7XG4gICAgbm90U2VyaWFsaXphYmxlUmVmQ2FsbDogKHByb3AsIGFyZykgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFxuVGhlIGlucHV0IHByb3ZpZGVkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGlzIG5vdCBzZXJpYWxpemFibGUuIFNlcmlhbGl6YXRpb24gaXMgcmVxdWlyZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGRhdGEgY2FuIGJlIHNhZmVseSB0cmFuc2ZlcnJlZCB0byB0aGUgc2tpbiBpbXBsZW1lbnRhdGlvbi4gXG5UaGUgZm9sbG93aW5nIHR5cGVzIG9mIGRhdGEgYXJlIGNvbnNpZGVyZWQgbm9uLXNlcmlhbGl6YWJsZSBhbmQgY2Fubm90IGJlIHByb2Nlc3NlZDpcblxuLSBGdW5jdGlvbnNcbi0gRE9NIGVsZW1lbnRzXG4tIENsYXNzIGluc3RhbmNlc1xuLSBDaXJjdWxhciByZWZlcmVuY2VzXG4tIFN5bWJvbHNcbi0gQmlnSW50IHZhbHVlc1xuXG5JbiB0aGUgZm9sbG93aW5nIGV4ZWN1dGlvbiB3ZSBkZXRlY3RlZCA6XG5+fn5+fn5+flxuJHthcmd9IFxufn5+fn5+fn5cbmFzIG5vdCBzZXJpYWxpemFibGUuXG5cblRvIHJlc29sdmUgdGhpcyBpc3N1ZSwgcGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBpbnB1dHMgcGFzc2VkIHRvICcke3Byb3AudG9TdHJpbmcoKX0nIGFyZSBpbiBhIHNlcmlhbGl6YWJsZSBmb3JtYXQuXG5UaGlzIHR5cGljYWxseSBpbmNsdWRlcyBwcmltaXRpdmUgdHlwZXMgKHN0cmluZ3MsIG51bWJlcnMsIGJvb2xlYW5zKSwgYXJyYXlzLCBhbmQgcGxhaW4gb2JqZWN0cy4gXG5JZiB5b3UgbmVlZCB0byBpbmNsdWRlIGNvbXBsZXggZGF0YSB0eXBlcywgY29uc2lkZXIgY29udmVydGluZyB0aGVtIHRvIGEgc2VyaWFsaXphYmxlIHN0cnVjdHVyZSBiZWZvcmUgcGFzc2luZyB0aGVtIHRvIHRoZSBmdW5jdGlvbi5cbk9yIHVzZSBNeW9wIG1lc3NhZ2UgdGhhdCBzdXBwb3J0IGl0OiBDdXN0b21SZWZNZXNzYWdlLCBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSBvciBFeGVjdXRlU2NyaXB0TWVzc2FnZS5cblxuU3VnZ2VzdGVkIEZpeDpcbjEuIFJlbW92ZSBvciByZXBsYWNlIG5vbi1zZXJpYWxpemFibGUgdmFsdWVzIGZyb20geW91ciBpbnB1dC5cbjIuIElmIHVzaW5nIG9iamVjdHMsIGVuc3VyZSB0aGV5IGRvIG5vdCBjb250YWluIGFueSBmdW5jdGlvbnMgb3IgY2lyY3VsYXIgcmVmZXJlbmNlcy5cbjMuIENvbnZlcnQgYW55IGNsYXNzIGluc3RhbmNlcyB0byBwbGFpbiBvYmplY3RzIG9yIEpTT04tY29tcGF0aWJsZSBmb3JtYXRzLlxuNC4gVXNlIGRlZGljYXRlZCBNeW9wIG1lc3NhZ2UuXG5cbkZvciBtb3JlIGRldGFpbHMgb24gc2VyaWFsaXphdGlvbiBhbmQgTXlvcCBtZXNzYWdlIGV4YW1wbGVzLCByZWZlciB0byBodHRwczovL2RvY3MubXlvcC5kZXZcXC5cblxuYCk7XG4gICAgfVxufVxuXG4iLCAiaW1wb3J0IHtCYXNlTXlvcENvbXBvbmVudCwgSU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZSwgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0lDb21wb25lbnREZWZpbml0aW9uQ29uZmlnfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0VudmVsb3BlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9FbnZlbG9wZWRNZXNzYWdlXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wUmVmQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBwdWJsaWMgcGFyZW50OiBJTXlvcENvbXBvbmVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgLy9UT0RPIDogY2hlY2sgcGFyZW50Q29tcG9uZW50LmNvbnRhaW5lci4uLlxuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBwYXJlbnQuY29udGFpbmVyLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICAvL3RoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZChhcmd1bWVudHMuY2FsbGVlLm5hbWUpKTtcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdoaWRlJykpO1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnc2hvdycpKTtcbiAgICB9XG5cbiAgICBpbnNwZWN0KCkge1xuICAgICAgICAvL1RPRE8gOiBzdXBwb3J0IHJlYWwgY2xlYW51cFxuICAgICAgICAvL2NvbnNvbGUubG9nKCdyZWYgaW5zcGVjdCBjYWxsZWQsIGNyZWF0aW5nIEV4ZWN1dGVDb21wb25lbnRNZXRob2QgaW5zcGVjdCcsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYsIHRoaXMuaWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdpbnNwZWN0JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uRG9jdW1lbnRFbGVtZW50JykpO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgdGhpcy5zZW5kKG5ldyBFeGVjdXRlQ29tcG9uZW50TWV0aG9kKCdzZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0JykpO1xuICAgIH1cblxuICAgIG9uTWVzc2FnZVJlY2VpdmVkKGluY29tZU1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiAoaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gJ011dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlJykge1xuICAgICAgICAvLyAgZGVidWdnZXI7XG4gICAgICAgIC8vICAgICB0aGlzLnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiBzdXBlci5vbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlKTtcbiAgICB9XG5cblxuICAgIHNlbmQgPSAobWVzc2FnZTogQmFzZU15b3BNZXNzYWdlKSA9PiB7XG4gICAgICAgIC8vY29uc29sZS5sb2coJ3JlZiBtZXNzYWdlIHNlbmRpbmcgJywgbWVzc2FnZSk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IG1lc3NhZ2UuaGFuZGxlclxuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZSk7XG5cbiAgICAgICAgLy8gdGhpcy5pZCB3aWxsIGJlIGF2YWlsYWJsZSBvbiB0aGUgbmVzdGVkIGNvbXBvbmVudFxuICAgICAgICB0aGlzLnBhcmVudC5zZW5kKG5ldyBFbnZlbG9wZWRNZXNzYWdlKHRoaXMuaWQsIG1lc3NhZ2UpKTtcblxuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIG1lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBkaXNwb3NlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0luaXRpYXRlZClcbiAgICAgICAgICAgIHRoaXMuc2VuZChuZXcgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCgnZGlzcG9zZScpKTtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgIH1cbn1cbiIsICIvL3R5cGUgQUNvbnN0cnVjdG9yVHlwZU9mPFQ+ID0gbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVDtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgQ3VzdG9tUmVmTWVzc2FnZSwgUmVmfSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCAqIGFzIG1lc3NhZ2VzIGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtcbiAgICBDbGVhbnVwSGFuZGxlciwgSUNvbXBvbmVudENvbmZpZyxcbiAgICB0eXBlIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLFxuICAgIElDb21wb25lbnRSZWZCZWhhdmlvciwgSUhUTUxMb2FkZXJDb25maWcsIElQcm9wQ29kZUJlaGF2aW9yLFxuICAgIElQcm9wQ29uZmlnLCBJU2tpbkNvbmZpZywgUHJvcENvbmZpZ0JlaGF2aW9yVHlwZXMsXG4gICAgUmVmQmVoYXZpb3JUeXBlLCBTaGFkb3dSb290TW9kZVR5cGUsIFNraW5Mb2FkZXJzLCBTa2luTG9hZGVyVHlwZVxufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge2NvbnRhaW5zUHJpbWl0aXZlc09ubHl9IGZyb20gXCIuLi9jb21tb24vdXRpbHMvc2VyaWFsaXphdGlvblwiO1xuaW1wb3J0IHtFcnJvcnN9IGZyb20gXCIuL2xvZ01lc3NhZ2VzXCI7XG5pbXBvcnQge015b3BSZWZDb21wb25lbnR9IGZyb20gXCIuL2NvbXBvbmVudHMvbXlvcFJlZkNvbXBvbmVudFwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi9ob3N0U0RLXCI7XG5cbnR5cGUgY29tcG9uZW50RGVmaW5pdGlvblByb3BzID0gSUNvbXBvbmVudERlZmluaXRpb25Db25maWdbJ3Byb3BzJ11cblxuY29uc3QgY3JlYXRlRGVidWdUaXRsZSA9ICh0ZXh0OiBzdHJpbmcsIHRvcDogbnVtYmVyLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgIGNvbnN0IHRpdGxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgdGl0bGVFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgdGl0bGVFbC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgdGl0bGVFbC5zdHlsZS5wYWRkaW5nID0gJzAgNXB4JztcbiAgICB0aXRsZUVsLnN0eWxlLmZvbnRTaXplID0gJzE0cHgnO1xuICAgIHRpdGxlRWwuc3R5bGVbJ3RvcCddID0gJzAnO1xuICAgIHRpdGxlRWwuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAvL3RpdGxlRWwuc3R5bGUubGVmdCA9ICc1MCUnO1xuICAgIHRpdGxlRWwuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoLTUwJSknO1xuICAgIHRpdGxlRWwudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgdGl0bGVFbC5ocmVmID0gYGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLmlkfWBcblxuICAgIHJldHVybiB0aXRsZUVsO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldERlYnVnU3R5bGUgPSAoaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyOiBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWdcbik6IENsZWFudXBIYW5kbGVyID0+IHtcbiAgICAvLyMwMDdCRkYgKGJsdWUpIG9yICNGRjU3MjIgKG9yYW5nZSlcbiAgICAvLyM0Q0FGNTAgKGdyZWVuKSBvciAjRkZDMTA3IChhbWJlcilcbiAgICAvLyBjb25zdCB0b3BUZXh0ID0gY3JlYXRlRGVidWdUaXRsZShgJHtpZH0gOiAke3R5cGV9YCwgdG9wLCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnKTtcbiAgICBjb25zdCB0b3BUZXh0ID0gY3JlYXRlRGVidWdUaXRsZShgJHtjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLm5hbWV9IDogJHt0eXBlfWAsIHRvcCwgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyk7XG4gICAgY29udGFpbmVyLmluc2VydEJlZm9yZSh0b3BUZXh0LCBjb21wb25lbnRFbGVtZW50KTtcbiAgICBjb21wb25lbnRFbGVtZW50LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgIzAwN0JGRic7XG4gICAgY29tcG9uZW50RWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudEVsZW1lbnQuc3R5bGUuYm9yZGVyID0gJ3Vuc2V0JztcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNoaWxkKHRvcFRleHQpO1xuICAgIH1cbn1cblxuY29uc3QgcmVwb3J0RXJyb3IgPSAocHJvcENvbmZpZzogSVByb3BDb25maWcsIHByb3BOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogSU15b3BDb21wb25lbnQ8YW55LCBhbnk+KSA9PiB7XG4gICAgaWYgKCFwcm9wQ29uZmlnKSB7XG5cbiAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIC8vIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFcnJvcjogVW5kZWZpbmVkIFByb3BcXG5cXG5gICtcbiAgICAgICAgICAgIGBJdCBsb29rcyBsaWtlIHlvdSd2ZSB0cmllZCB0byB1c2UgYSBwcm9wIHRoYXQgaGFzbid0IGJlZW4gZGVmaW5lZC5cXG5gICtcbiAgICAgICAgICAgIGBQbGVhc2UgY2hlY2sgdGhlIHByb3AgbmFtZSBmb3IgYW55IHR5cG9zIG9yIGVuc3VyZSB0aGF0IGl0IGlzIHByb3Blcmx5IGRlZmluZWQgaW4gdGhlIGNvbXBvbmVudCdzIHByb3AgbGlzdC5cXG5cXG5gICtcbiAgICAgICAgICAgIGBQcm9wIE5hbWU6ICR7cHJvcE5hbWV9XFxuYCArXG4gICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgIGBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIGNvbXBvbmVudCBwYWdlIGh0dHBzOi8vZGFzaGJvYXJkLm15b3AuZGV2L2Rhc2hib2FyZC9jb21wb25lbnQvJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH0gb3IgY29uc3VsdCB0aGUgZGV2ZWxvcGVyIGd1aWRlLmBcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG59XG5cbmNvbnN0IHJlcG9ydFVuc3VwcG9ydGVkID0gKHByb3BDb25maWc6IElQcm9wQ29uZmlnLCBwcm9wTmFtZTogc3RyaW5nLCBjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50PGFueSwgYW55PikgPT4ge1xuICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBFcnJvcjogQ29kZSBQcm9wIE5vdCBTdXBwb3J0ZWRcXG5cXG5gICtcbiAgICAgICAgYEN1cnJlbnRseSwgY29kZSBwcm9wcyBhcmUgb25seSBzdXBwb3J0ZWQgaW4gbG9jYWwgZnJhbWUgY29tcG9uZW50cy5cXG5gICtcbiAgICAgICAgYFx1MjZBMFx1RkUwRiBUaGlzIGlzIGEgd29yayBpbiBwcm9ncmVzcyBmZWF0dXJlIFx1MjAxNCBjb2RlIHByb3BzIHdpbGwgYmUgc3VwcG9ydGVkIGluIHVwY29taW5nIHZlcnNpb25zLlxcblxcbmAgK1xuICAgICAgICBgSW4gdGhlIG1lYW50aW1lLCB5b3UgY2FuIHVzZSBtZXNzYWdlIHByb3BzLlxcblxcbmAgK1xuICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3BOYW1lfVxcbmAgK1xuICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgYEZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlciB0byB0aGUgY29tcG9uZW50IHBhZ2UgaHR0cHM6Ly9kYXNoYm9hcmQubXlvcC5kZXYvZGFzaGJvYXJkL2NvbXBvbmVudC8ke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLmlkfSBvciBjb25zdWx0IHRoZSBkZXZlbG9wZXIgZ3VpZGUuYFxuICAgICk7XG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0UHJvcHMgPSA8VCBleHRlbmRzIGNvbXBvbmVudERlZmluaXRpb25Qcm9wcz4oY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCwgcHJvcHNDb25maWc6IElQcm9wQ29uZmlnW10sIHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcpID0+IHtcblxuICAgIGNvbnN0IHByb3BzTWFwID0gcHJvcHNDb25maWcucmVkdWNlKChwcmV2aW91c1ZhbHVlLCBjdXJyZW50VmFsdWUpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIC4uLnByZXZpb3VzVmFsdWUsXG4gICAgICAgICAgICBbY3VycmVudFZhbHVlLm5hbWVdOiB7Li4uY3VycmVudFZhbHVlfVxuICAgICAgICB9XG4gICAgfSwge30pO1xuXG4gICAgY29uc3QgcHJvcHNIYW5kbGVyID0ge1xuICAgICAgICBnZXQ6IChfOiBJTXlvcENvbXBvbmVudCwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBwcm9wQ29uZmlnID0gcHJvcHNNYXBbcHJvcF07XG5cbiAgICAgICAgICAgIGlmIChyZXBvcnRFcnJvcihwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5jb2RlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGxvY2FsIGZyYW1lIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50LmVsZW1lbnQuY29udGVudFdpbmRvd1t0eXBlZFByb3BCZWhhdmlvci5yZW1hcCB8fCBwcm9wXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVwb3J0VW5zdXBwb3J0ZWQocHJvcENvbmZpZywgcHJvcCwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdvdXRwdXQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgaW50byBjb25maWdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BDb25maWcuYmVoYXZpb3IucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKC4uLnByb3BDb25maWcuYmVoYXZpb3IucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUN0b3IgPSBtZXNzYWdlc1twcm9wQ29uZmlnLmJlaGF2aW9yLm1lc3NhZ2VdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgIH0sXG4gICAgICAgIHNldDogKF86IElNeW9wQ29tcG9uZW50LCBwcm9wOiBzdHJpbmcsIHZhbHVlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGNvbnN0IHByb3BDb25maWcgPSBwcm9wc01hcFtwcm9wXTtcblxuICAgICAgICAgICAgaWYgKHJlcG9ydEVycm9yKHByb3BDb25maWcsIHByb3AsIGNvbXBvbmVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnR5cGUgPT09IFByb3BDb25maWdCZWhhdmlvclR5cGVzLmNvZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRTa2luLmxvYWRlci50eXBlID09PSBTa2luTG9hZGVycy5IVE1MTG9hZGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkTG9hZGVyID0gc2VsZWN0ZWRTa2luLmxvYWRlciBhcyBJSFRNTExvYWRlckNvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGxvY2FsIGZyYW1lIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZWRMb2FkZXIuc2hhZG93Um9vdE1vZGUgPT09IFNoYWRvd1Jvb3RNb2RlVHlwZS5sb2NhbEZyYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFByb3BCZWhhdmlvciA9IHByb3BDb25maWcuYmVoYXZpb3IgYXMgSVByb3BDb2RlQmVoYXZpb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5jb250ZW50V2luZG93W3R5cGVkUHJvcEJlaGF2aW9yLnJlbWFwIHx8IHByb3BdID0gdmFsdWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXBvcnRVbnN1cHBvcnRlZChwcm9wQ29uZmlnLCBwcm9wLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy9pZihwcm9wQ29uZmlnLmJlaGF2aW9yID09PSBQcm9wQ29uZmlnQmVoYXZpb3JUeXBlcy5tZXNzYWdlKVxuICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLm1vZGUgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCBtdWx0aSBiZWhhdmlvcnNcblxuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci50eXBlID09PSAnbWVzc2FnZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VQYXJhbXM6IGFueVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiB0dXJuIGl0IGludG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcENvbmZpZy5iZWhhdmlvci5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zLnB1c2goUmVmLmNyZWF0ZShwcm9wQ29uZmlnLmJlaGF2aW9yLnJlZikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMucHVzaCguLi5wcm9wQ29uZmlnLmJlaGF2aW9yLnBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VDdG9yID0gbWVzc2FnZXNbcHJvcENvbmZpZy5iZWhhdmlvci5tZXNzYWdlXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5zZW5kKG5ldyBtZXNzYWdlQ3RvciguLi5tZXNzYWdlUGFyYW1zKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvcjogVW5zdXBwb3J0ZWQgQmVoYXZpb3JcXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlICdiZWhhdmlvcicgZmllbGQgcHJvdmlkZWQgaXMgbm90IHN1cHBvcnRlZC5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ29tcG9uZW50OiAke2NvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLm5hbWV9LCBJRDogJHtjb21wb25lbnQuY29tcG9uZW50RGVmaW5pdGlvbi5pZH1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUHJvcCBOYW1lOiAke3Byb3B9XFxuYCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEJlaGF2aW9yIEZpZWxkOiAke3Byb3BDb25maWcuYmVoYXZpb3IudHlwZX1cXG5cXG5gICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgQ2hlY2sgdGhlIGRvY3VtZW50YXRpb24gZm9yIHZhbGlkIGJlaGF2aW9yIG9wdGlvbnMuYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbXBvbmVudC5wcm9wcyA9IHt9O1xuICAgIGNvbXBvbmVudC5wcm9wcyA9IG5ldyBQcm94eShjb21wb25lbnQucHJvcHMsIHByb3BzSGFuZGxlcik7XG5cbiAgICByZXR1cm4gY29tcG9uZW50IGFzIChPbWl0PElNeW9wQ29tcG9uZW50LCAncHJvcHMnPiAmIHtcbiAgICAgICAgcHJvcHM6IHByb3BUeXBlczxUPlxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVSZWZQcm94eSA9ICh0YXJnZXQ6IFJlZiwgY29tcG9uZW50OiBJTXlvcENvbXBvbmVudCkgPT4ge1xuICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCB7XG4gICAgICAgIGdldCh0YXJnZXQsIHByb3ApIHtcblxuICAgICAgICAgICAgLy8gaWYgKHByb3AgPT09ICdfX25vblByb3hpZWQnKSB7XG4gICAgICAgICAgICAvLyAgICAgcmV0dXJuIHRhcmdldDtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgaWYgKHRhcmdldFtwcm9wXSkge1xuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0W3Byb3BdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBjb25zdCBnZXR0ZXJGdW5jdGlvbiA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3MuZm9yRWFjaChhcmcgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWluc1ByaW1pdGl2ZXNPbmx5KGFyZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMubm90U2VyaWFsaXphYmxlUmVmQ2FsbChwcm9wLCBhcmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBmdW5jdGlvbkFyZ3MsIG1ha2VTZXJpYWxpemFibGV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcmVmW3Byb3BOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUocmVmW3Byb3BOYW1lXSguLi5mdW5jdGlvbkFyZ3MpLCB0cnVlKSAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIGFuZCByZXR1cm4gaXRzIHJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1ha2VTZXJpYWxpemFibGUodmFsdWUsIHRydWUpOyAvLyBSZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IHR1cm4gaXQgdG8gY29uZmlnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudElkOiB0YXJnZXQucmVmQ29uZmlnLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uQXJnczogYXJnc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIChtc2cpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG1zZy5jb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy9UT0RPOiB3ZSBjYW4gaW1wbGVtZW50IHRoaW5ncyBsaWtlIGF1dG8gc2VyaWFsaXphdGlvbiBhbmQgYmluZGluZyBmdW5jdGlvbnMgaGVyZVxuICAgICAgICAgICAgLy9nZXR0ZXJGdW5jdGlvbi50ZXN0ID0gJzEyMyc7XG5cbiAgICAgICAgICAgIHJldHVybiBnZXR0ZXJGdW5jdGlvbjtcblxuICAgICAgICAgICAgLy9yZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0KHRhcmdldCwgcHJvcDogc3RyaW5nLCB2YWx1ZSkge1xuICAgICAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEN1c3RvbVJlZk1lc3NhZ2UoKHtyZWYsIHByb3BOYW1lLCBwcm9wVmFsdWV9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAgICAgICAgICAgICByZWZbcHJvcE5hbWVdID0gcHJvcFZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAvL1RPRE8gOiBmaXggdGhhdFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50SWQ6IHRhcmdldC5yZWZDb25maWcuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIHByb3BWYWx1ZTogdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BOYW1lOiBwcm9wXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAobXNnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGxvZz9cbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlUmVmQ29tcG9uZW50ID0gYXN5bmMgPFQgZXh0ZW5kcyBJTXlvcENvbXBvbmVudCA9IElNeW9wQ29tcG9uZW50PihyZWY6IFJlZiwgY29tcG9uZW50Q29uZmlnOiBJQ29tcG9uZW50Q29uZmlnLCBjb21wb25lbnRzOiBJTXlvcENvbXBvbmVudFtdLCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucyk6IFByb21pc2U8VD4gPT4ge1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHJlZi5jb21wb25lbnQ7XG4gICAgaWYgKCFjb21wb25lbnQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignY2FudCBjcmVhdGVSZWZDb21wb25lbnQgd2l0aCBkZXRhY2hlZCByZWYnKTtcblxuICAgIC8vY29uc29sZS5sb2coJ2NyZWF0ZVJlZkNvbXBvbmVudCBjYWxsZWQnLCByZWYsIGNvbXBvbmVudENvbmZpZyk7XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCByZWZDb21wb25lbnQgPSBuZXcgTXlvcFJlZkNvbXBvbmVudChjb21wb25lbnRDb25maWcudHlwZSwgY29tcG9uZW50LCBvcHRpb25zKTtcbiAgICAgICAgY29tcG9uZW50cy5wdXNoKHJlZkNvbXBvbmVudCk7XG5cbiAgICAgICAgLy9mb3IgY2FzZXMgd2hlcmUgcmVmIGNvbXBvbmVudHMgZGVmaW5lIGluIHRoZSBjb21wb25lbnQgY29uZmlnXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIHJvb3QgY29tcG9uZW50IHRoZSBiZSBpbml0aWF0ZWQgYmVmb3JlIGludGVyYWN0aW5nIHdpdGggaXRcbiAgICAgICAgYXdhaXQgY29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG5cbiAgICAgICAgLy9UT0RPIDpcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgLy9yZWplY3QoJ3RpbWVvdXQ/Jyk7XG4gICAgICAgICAgICByZWplY3QoJ3RpbWVvdXQnKTtcbiAgICAgICAgfSwgNTAwMCk7XG5cbiAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UocmVmLnJlZkNvbmZpZyxcbiAgICAgICAgICAgIGNvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zID8gb3B0aW9ucyA6IHt9LFxuICAgICAgICAgICAgICAgIGlkOiByZWZDb21wb25lbnQuaWQsXG4gICAgICAgICAgICAgICAgX2hhc1BhcmVudDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFzeW5jIChtZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGVjayBpZiB0aW1lb3V0IGFscmVhZHkgcGFzc2VkXG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgnQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSBmYWlsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50ID0gY29tcG9uZW50cy5maW5kKGMgPT4gYy5pZCA9PSByZWZDb21wb25lbnQuaWQpO1xuXG4gICAgICAgICAgICAgICAgLy9zYW1lIG1lbW9yeSBlbnYsIHNhbWUgSG9zdFNES1xuICAgICAgICAgICAgICAgIGlmIChpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCAhPT0gcmVmQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNsZWFuIHJlZkNvbXBvbmVudCA/XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGltcGxlbWVudGF0aW9uQ29tcG9uZW50IGFzIHVua25vd24gYXMgVCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuc2V0SW5pdGlhdGVkKClcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBoZXJlID5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiB3aGF0IGFib3V0IHJlYXB0ZXJzID8hIGR5bmFtaWMgPyFcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBleHNpc3RpbmdSZWZDb21wb25lbnQgPSBjb21wb25lbnQucmVmc1tyZWYucmVmQ29uZmlnLm5hbWVdIGFzIE15b3BSZWZDb21wb25lbnQ7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGV4c2lzdGluZ1JlZkNvbXBvbmVudC5pZCAmJiBleHNpc3RpbmdSZWZDb21wb25lbnQucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudC5yZWZzW3JlZi5yZWZDb25maWcubmFtZV0gPSBbY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSwgcmVmQ29tcG9uZW50XTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSkpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXS5wdXNoKHJlZkNvbXBvbmVudClcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50LnJlZnNbcmVmLnJlZkNvbmZpZy5uYW1lXSA9IHJlZkNvbXBvbmVudDsgLy9ob3N0U0RLLmNvbXBvbmVudHMuZmluZChjID0+IGMuaWQgPT09IHJlZkNvbXBvbmVudC5pZCkhO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGluIHdlYmNvbXBvbmVudCBjYXNlIHRoZSBzYW1lIGlkIHdpbGwgYWxyZWRheSBiZSBoZXJlLCB3aGljaCBpcyBnb29kICFcbiAgICAgICAgICAgICAgICAvLyBuYW1lOlxuICAgICAgICAgICAgICAgIC8vICAgICBpZFxuICAgICAgICAgICAgICAgIC8vICAgICBjb21wb25lbnREZWZpbml0aW9uSWRcblxuICAgICAgICAgICAgICAgIC8vIGZvciBpbm5lciBjb21wb25lbnRzIGluc2lkZSByZWYgY29tcG9uZW50IDpcbiAgICAgICAgICAgICAgICBtZXNzYWdlLm5lc3RlZFJlZnMuZm9yRWFjaChuZXN0ZWRSZWZDb25maWcgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRDb21wb25lbnREZWZpbml0aW9uID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cyEuZmluZChjID0+IGMudHlwZS5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc3QgbmVzdGVkQ29tcG9uZW50RGVmaW5pdGlvbiA9IGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlc29sdmVkRGVmaW5pdGlvbnM/LmZpbmQoZGVmID0+IGRlZi5pZCA9PT0gbmVzdGVkUmVmQ29uZmlnLmNvbXBvbmVudERlZmluaXRpb25JZCkhO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCByZWZDb25maWcgPSBjb21wb25lbnRDb25maWcudHlwZS5yZWZzLmZpbmQociA9PiByLm5hbWUgPT09IG5lc3RlZFJlZkNvbmZpZy5yZWZOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFyZWZDb25maWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignbm8gcmVmQ29uZmlnIGZvdW5kIGZvciBuZXN0ZWQgcmVmJyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgICAgICAvL2RlYnVnZ2VyO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IG5ldyBNeW9wUmVmQ29tcG9uZW50KG5lc3RlZENvbXBvbmVudERlZmluaXRpb24sIHJlZkNvbXBvbmVudCk7XG4gICAgICAgICAgICAgICAgICAgIG5lc3RlZENvbXBvbmVudC5zZXRJbml0aWF0ZWQoKTtcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50LnJlZnNbbmVzdGVkUmVmQ29uZmlnLnJlZk5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLnB1c2gobmVzdGVkQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY29ubmVjdFJlZnMocmVmQ29tcG9uZW50LCBjb21wb25lbnRDb25maWcsIGNvbXBvbmVudHMsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vVE9ETyA6dXNlIGNvbmZpZyBjaGVjayBmb3IgYXV0by1oaWdodCBhbmQgY29udmVydCB0eXBlIHByb3Blcmx5XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnNldEhlaWdodEJhc2VkT25TY3JvbGxIZWlnaHQoKTtcblxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlZkNvbXBvbmVudCBhcyB1bmtub3duIGFzIFQpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlclxuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRocm93IGVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IGNvbm5lY3RSZWZzID0gYXN5bmMgKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZywgY29tcG9uZW50czogSU15b3BDb21wb25lbnRbXSwgd2l0aG91dFJlZkNvbXBvbmVudHM6IGJvb2xlYW4gPSBmYWxzZSkgPT4ge1xuXG4gICAgaWYgKCFjb21wb25lbnQucmVmcylcbiAgICAgICAgY29tcG9uZW50LnJlZnMgPSB7fTtcblxuICAgIGNvbnN0IHdhaXRGb3IgPSBPYmplY3QudmFsdWVzKGNvbXBvbmVudC5jb21wb25lbnREZWZpbml0aW9uLnJlZnMpLm1hcChyZWYgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlZi5iZWhhdmlvci50eXBlID09IFJlZkJlaGF2aW9yVHlwZS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQucmVmc1tyZWYubmFtZV0gPVxuXG4gICAgICAgICAgICAgICAgaWYgKHdpdGhvdXRSZWZDb21wb25lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudC5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBjaGFuZ2UgdG8gZ2V0IGl0IGZyb20gdGhlIGZsb3dcbiAgICAgICAgICAgICAgICBsZXQgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuY29tcG9uZW50SWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWZDb21wb25lbnRJZClcbiAgICAgICAgICAgICAgICAgICAgcmVmQ29tcG9uZW50SWQgPSAocmVmLmJlaGF2aW9yIGFzIElDb21wb25lbnRSZWZCZWhhdmlvcikuaW5zdGFuY2UuY29tcG9uZW50SWRcblxuICAgICAgICAgICAgICAgIC8vIGlmICghY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucykge1xuICAgICAgICAgICAgICAgIC8vICAgICByZWplY3QobmV3IEVycm9yKCdjb21wb25lbnRDb25maWcgcHJvdmlkZWQgd2l0aG91dCByZXNvbHZlZERlZmluaXRpb25zIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0JykpO1xuICAgICAgICAgICAgICAgIC8vICAgICAvL3Rocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAvLyBjb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucyEuZmluZChjb21wZGVmID0+IGNvbXBkZWYuaWQgPT09IHJlZkNvbXBvbmVudElkKSE7XG4gICAgICAgICAgICAgICAgLy8gLy9jb25zdCBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnID0gYXdhaXQgZ2V0Q29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyhjb21wb25lbnRJbnN0YW5jZUNvbmZpZy5jb21wb25lbnRJZCk7XG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyBpZiAoIWNvbXBvbmVudERlZmluaXRpb25Db25maWcpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmVqZWN0KG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgcmVzb2x2ZWREZWZpbml0aW9ucyBjaGVjayB0aGUgY29uZmlnIG9iamVjdCcpKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgICAgIC8vVE9ETzogaWYgd2UgaGF2ZSB0aGUgc2FtZSBjb21wb25lbnQgbW9yZSB0aGFuIG9uY2Ugd2Ugd2lsbCBuZWVkIGluc3RhbmNlIGlkIGhlcmUgLi4uXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkQ29tcG9uZW50Q29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLnJlc29sdmVkTmVzdGVkQ29tcG9uZW50cz8uZmluZChuZXN0ZWRDb21wb25lbnQgPT4gbmVzdGVkQ29tcG9uZW50LnR5cGUuaWQgPT09IHJlZkNvbXBvbmVudElkKTtcblxuICAgICAgICAgICAgICAgIGlmICghbmVzdGVkQ29tcG9uZW50Q29uZmlnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignY29tcG9uZW50Q29uZmlnIHByb3ZpZGVkIHdpdGhvdXQgbmVzdGVkQ29tcG9uZW50Q29uZmlnIGNoZWNrIHRoZSBjb25maWcgb2JqZWN0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL2NvbnN0IGNvbXBvbmVudEluc3RhbmNlQ29uZmlnID0gY29tcG9uZW50Q29uZmlnLmluc3RhbmNlLm5lc3RlZENvbXBvbmVudHM/LmZpbmQoY29tcG9uZW50SW5zdGFjZSA9PiBjb21wb25lbnRJbnN0YWNlLmNvbXBvbmVudElkID09PSBjb21wb25lbnREZWZpbml0aW9uQ29uZmlnLmlkKTtcbiAgICAgICAgICAgICAgICAvLyBpZighY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyl7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcignVE9ETyBUT0RPIFRPRE8gJyk7XG4gICAgICAgICAgICAgICAgLy8gICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOnRoaW5rIGFib3V0IHRoYXQgOlxuICAgICAgICAgICAgICAgIC8vICAgY29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZy5yZXNvbHZlZERlZmluaXRpb25zID0gY29tcG9uZW50LmNvbXBvbmVudERlZmluaXRpb24ucmVzb2x2ZWREZWZpbml0aW9ucztcbiAgICAgICAgICAgICAgICAvLyAgIGNvbnN0IG5lc3RlZENvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudENvbmZpZyA9IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICBpbnN0YW5jZTogbmVzdGVkQ29tcG9uZW50Q29uZmlnLmluc3RhbmNlISxcbiAgICAgICAgICAgICAgICAvLyAgICAgICB0eXBlOiBuZXN0ZWRDb21wb25lbnRDb25maWcudHlwZSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBuYW1lOiBuZXN0ZWRDb21wb25lbnRDb25maWcubmFtZVxuICAgICAgICAgICAgICAgIC8vICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgX3JlZiA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ25lc3RlZCAhISBjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbXBvbmVudCA9IGF3YWl0IGNyZWF0ZVJlZkNvbXBvbmVudChfcmVmLCBuZXN0ZWRDb21wb25lbnRDb25maWchLCBjb21wb25lbnRzKVxuICAgICAgICAgICAgICAgICAgICAvL1RET08gOiBwdXQgdGhhdCByZWYgY29tcG9uZW50IHNvbWV3aGVyZT9cblxuICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gbmVzdGVkQ29tcG9uZW50O1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbm9uUHJveGllZCA9IFJlZi5jcmVhdGUoJycsIHJlZiwgY29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnJlZnNbcmVmLm5hbWVdID0gY3JlYXRlUmVmUHJveHkoX19ub25Qcm94aWVkLCBjb21wb25lbnQpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2FsZXJ0KCc/JylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSlcbiAgICB0cnkge1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh3YWl0Rm9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vZGVidWdnZXJcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IHR5cGUgcHJvcFR5cGVzPFQgZXh0ZW5kcyBjb21wb25lbnREZWZpbml0aW9uUHJvcHM+ID0ge1xuICAgIFtQcm9wZXJ0eSBpbiBrZXlvZiBUXTpcbiAgICBUW1Byb3BlcnR5XSBleHRlbmRzIHsgbW9kZTogJ2lucHV0JyB9ID9cbiAgICAgICAgVFtQcm9wZXJ0eV1bJ3R5cGUnXSA6XG4gICAgICAgIFByb21pc2U8VFtQcm9wZXJ0eV1bJ3R5cGUnXT5cbn1cblxuZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cblxuZXhwb3J0IGNvbnN0IGFjdEFzID0gPFQ+KHJlZjogUmVmKSA9PiB7XG4gICAgcmV0dXJuIHJlZiBhcyB1bmtub3duIGFzIEZ1bmN0aW9uaWZ5UmVmPFQ+XG59XG5cbmV4cG9ydCB0eXBlIEZ1bmN0aW9uaWZ5UmVmPFQgPSBhbnk+ID0ge1xuICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgLy8gSWYgaXQncyBhIGZ1bmN0aW9uXG4gICAgICAgID8gKC4uLmFyZ3M6IEEpID0+IFByb21pc2U8Uj4gLy8gQ29udmVydCBpdCB0byBhIHByb21pc2VkIGZ1bmN0aW9uXG4gICAgICAgIDogVFtLXVxufTtcbiIsICJpbXBvcnQge0Jhc2VNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi9JTXlvcENvbXBvbmVudFwiO1xuaW1wb3J0IHtcbiAgICBCYXNlTXlvcE1lc3NhZ2UsXG4gICAgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZCxcbiAgICBFeGVjdXRlU2NyaXB0TWVzc2FnZSwgTWVzc2FnZURpcmVjdGlvblxufSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q2xlYW51cEhhbmRsZXIsIElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtzZXREZWJ1Z1N0eWxlfSBmcm9tIFwiLi4vY29tcG9uZW50Q29yZVwiO1xuaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzLnRzXCI7XG5pbXBvcnQge2xvYWRlck9wdGlvbnN9IGZyb20gXCIuLi9ob3N0U0RLLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBNeW9wSWZyYW1lQ29tcG9uZW50IGV4dGVuZHMgQmFzZU15b3BDb21wb25lbnQge1xuXG4gICAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudENvbmZpZzogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHJpdmF0ZSBJZnJhbWVFbGVtZW50OiBIVE1MSUZyYW1lRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29tcG9uZW50Q29uZmlnLCBjb250YWluZXIsIG9wdGlvbnMpXG5cbiAgICAgICAgaWYgKChza2luLmxvYWRlciBhcyBJSWZyYW1lTG9hZGVyQ29uZmlnKS5hdXRvSGVpZ2h0KSB7XG4gICAgICAgICAgICB0aGlzLmluaXRpYXRlZCgpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsZW1lbnQgPSB0aGlzLklmcmFtZUVsZW1lbnQ7XG4gICAgICAgIC8vIHRoaXMuSWZyYW1lRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgLy8gICAgIGlmICh0aGlzLl93aGVuSW5pdGlhdGVkUmVqZWN0KVxuICAgICAgICAvLyAgICAgICAgIHRoaXMuX3doZW5Jbml0aWF0ZWRSZWplY3QoYElmcmFtZUVsZW1lbnQgZXJyb3JgKTtcbiAgICAgICAgLy8gfSk7XG4gICAgfVxuXG4gICAgY2xlYW51cEluc3BlY3Q/OiBDbGVhbnVwSGFuZGxlcjtcblxuICAgIGluc3BlY3QoKSB7XG4gICAgICAgIC8vIFRPRE8gOiB1c2UgYmV0dGVyIGNoZWNrIGZvciBpbnNwZWN0IG1vZGVcbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpIHtcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2luc3BlY3QgY2FsbCBtb3JlIHRoYW4gb25jZScpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xlYW51cEluc3BlY3RcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0ID0gc2V0RGVidWdTdHlsZSh0aGlzLmlkLCAnTXlvcElmcmFtZUNvbXBvbmVudCcsIDEwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5JZnJhbWVFbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCEoKTtcbiAgICAgICAgICAgIHRoaXMuY2xlYW51cEluc3BlY3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcxJztcbiAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3Vuc2V0J1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhbGwnXG4gICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgIH1cblxuICAgIHNldEhlaWdodEJhc2VkT25Eb2N1bWVudEVsZW1lbnQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gdGhpcy5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQ7XG4gICAgICAgIH0sIChyZXQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuSWZyYW1lRWxlbWVudC5zdHlsZS5oZWlnaHQgPSBgJHtyZXQuY29udGVudH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgb2JzZXJ2ZVNpemVCYXNlZE9uRG9jdW1lbnRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHRoaXMuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtzZW5kfSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qge2hlaWdodCwgd2lkdGh9ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgIHNlbmQoe2hlaWdodCwgd2lkdGh9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpO1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICAgICAgcmV0dXJuIHtoZWlnaHQsIHdpZHRofVxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXQuY29udGVudC53aWR0aH1weGA7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gYCR7cmV0LmNvbnRlbnQuaGVpZ2h0fXB4YDtcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHJldHVybiBjbGVhbnVwSGFuZGxlcjtcbiAgICB9XG5cbiAgICBzZXRTaXplQmFzZWRPbkRvY3VtZW50RWxlbWVudCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHtoZWlnaHQsIHdpZHRofSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIHJldHVybiB7aGVpZ2h0LCB3aWR0aH1cbiAgICAgICAgfSwgKHJldCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmV0LmNvbnRlbnQud2lkdGh9cHhgO1xuICAgICAgICAgICAgdGhpcy5JZnJhbWVFbGVtZW50LnN0eWxlLmhlaWdodCA9IGAke3JldC5jb250ZW50LmhlaWdodH1weGA7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2V0SGVpZ2h0QmFzZWRPblNjcm9sbEhlaWdodCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgY2xlYW51cEhhbmRsZXIgPSB0aGlzLnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIC8vIHJldHVybiB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQgKyAncHgnO1xuXG5cbiAgICAgICAgICAgIC8vVE9ETzogZml4IHRoYXQgaGFjaywga2VlcCB0aGUgZnVuY3Rpb24gaW4gcmlnaHQgZm9ybWF0IHdoaWxlIG1pbmlmaWVkIDooXG4gICAgICAgICAgICBjb25zdCBub09wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRvIGVuc3VyZSBpdCdzIG5vdCBvcHRpbWl6ZWQgYXdheSwgeW91IGNhbiBjYWxsIGl0IGF0IGxlYXN0IG9uY2VcbiAgICAgICAgICAgIGxldCB4ID0gbm9PcCgpO1xuICAgICAgICAgICAgeCsrO1xuICAgICAgICAgICAgeC0tO1xuXG4gICAgICAgICAgICAvL3JldHVybiBgJHt3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHR9cHhgO1xuXG4gICAgICAgICAgICAvL1RPRE8gOiBjaGVjayB0aGF0ICsxID9cbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1heChcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQpXG4gICAgICAgICAgICAgICAgLCB3aW5kb3cuZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQpICsgeCArICdweCdcblxuICAgICAgICB9LCAocmV0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gcmV0LmNvbnRlbnQ7XG4gICAgICAgICAgICBjbGVhbnVwSGFuZGxlcigpO1xuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBDbGVhbnVwSGFuZGxlciA9PiB7XG4gICAgICAgIGxldCBtZXNzYWdlXyA9IHsuLi5tZXNzYWdlfSBhcyBCYXNlTXlvcE1lc3NhZ2U7XG4gICAgICAgIC8vVE9ETyA6ID8hPyEgc2hvdWxkIGl0IGJlIGhlcmUgP1xuICAgICAgICBpZiAobWVzc2FnZV8ubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5FeGVjdXRlQ29tcG9uZW50TWV0aG9kKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlZE1lc3NhZ2UgPSAobWVzc2FnZV8gYXMgRXhlY3V0ZUNvbXBvbmVudE1ldGhvZClcbiAgICAgICAgICAgIHRoaXNbdHlwZWRNZXNzYWdlLm1ldGhvZF0oKTtcbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL1RPRE8gOiBmaXggdGhhdCBoYWNrIDooXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9jb25zdCBoYW5kbGVyID0gbWVzc2FnZS5oYW5kbGVyXG5cbiAgICAgICAgbWVzc2FnZV8uZGlyZWN0aW9uID0gTWVzc2FnZURpcmVjdGlvbi5kb3duO1xuICAgICAgICBjb25zdCBjbGVhbnVwSGFuZGxlciA9IHN1cGVyLnNlbmQobWVzc2FnZV8pO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQ/LmNvbnRlbnRXaW5kb3c/LnBvc3RNZXNzYWdlKG1lc3NhZ2VfLCAnKicpO1xuXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgLy9tZXNzYWdlLmhhbmRsZXIgPSBoYW5kbGVyXG5cbiAgICAgICAgcmV0dXJuIGNsZWFudXBIYW5kbGVyO1xuICAgIH07XG5cbiAgICBvbk1lc3NhZ2VSZWNlaXZlZChpbmNvbWVNZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGluY29tZU1lc3NhZ2UubWVzc2FnZVR5cGUgPT09IE15b3BNZXNzYWdlcy5Jbi5NdXRhdGlvbk9ic2VydmVyTWVzc2FnZVxuICAgICAgICAgICAgfHwgaW5jb21lTWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluLlJlc2l6ZU9ic2VydmVyTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRIZWlnaHRCYXNlZE9uU2Nyb2xsSGVpZ2h0KCk7XG4gICAgICAgICAgICAvL2RlYnVnZ2VyXG4gICAgICAgICAgICAvL3RoaXMuc2V0SGVpZ2h0QmFzZWRPbkRvY3VtZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3VwZXIub25NZXNzYWdlUmVjZWl2ZWQoaW5jb21lTWVzc2FnZSk7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2xlYW51cEluc3BlY3QpXG4gICAgICAgICAgICB0aGlzLmNsZWFudXBJbnNwZWN0KCk7XG5cbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLklmcmFtZUVsZW1lbnQucGFyZW50Tm9kZSEucmVtb3ZlQ2hpbGQodGhpcy5JZnJhbWVFbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2NvbXBvbmVudHMvSU15b3BDb21wb25lbnRcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcbmltcG9ydCB7SUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIElTa2luQ29uZmlnLCBTa2luTG9hZGVyVHlwZX0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElNeW9wTG9hZGVyIHtcbiAgICB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlTXlvcExvYWRlciBpbXBsZW1lbnRzIElNeW9wTG9hZGVyIHtcbiAgICBhYnN0cmFjdCB0eXBlOiBTa2luTG9hZGVyVHlwZTtcbiAgICBhYnN0cmFjdCBsb2FkOiAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4gUHJvbWlzZTxJTXlvcENvbXBvbmVudD47XG5cbiAgICBhcHBlbmRDaGlsZCA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMsKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5yZWxhdGl2ZSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucmVsYXRpdmUuZGlyZWN0aW9uID09PSAnYmVmb3JlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG9wdGlvbnMucmVsYXRpdmUuY2hpbGQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5yZWxhdGl2ZS5kaXJlY3Rpb24gPT09ICdhZnRlcicpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXh0U2libGluZyA9IG9wdGlvbnMucmVsYXRpdmUuY2hpbGQ/Lm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuaW5zZXJ0QmVmb3JlKGVsZW1lbnQsIG5leHRTaWJsaW5nID8gbmV4dFNpYmxpbmcgOiBudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wSWZyYW1lQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wSWZyYW1lQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNES1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSUlmcmFtZUxvYWRlckNvbmZpZywgSVNraW5Db25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IGFkZFF1ZXJ5UGFyYW0gPSAodXJsOiBzdHJpbmcsIHBhcmFtOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgICAvLyBDcmVhdGUgYSBVUkwgb2JqZWN0XG4gICAgY29uc3QgdXJsT2JqID0gbmV3IFVSTCh1cmwpO1xuXG4gICAgLy8gQWRkIHRoZSBxdWVyeSBwYXJhbWV0ZXJcbiAgICB1cmxPYmouc2VhcmNoUGFyYW1zLmFwcGVuZChwYXJhbSwgdmFsdWUpO1xuXG4gICAgLy8gUmV0dXJuIHRoZSB1cGRhdGVkIFVSTFxuICAgIHJldHVybiB1cmxPYmoudG9TdHJpbmcoKTtcbn1cblxuZXhwb3J0IGNsYXNzIE15b3BJZnJhbWVMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG4gICAgdHlwZSA9IFNraW5Mb2FkZXJzLklmcmFtZUxvYWRlclxuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGxvYWQgPSBhc3luYyAoY29tcG9uZW50RGVmaW5pdGlvbjogSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsIHNraW46IElTa2luQ29uZmlnLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykgPT4ge1xuICAgICAgICBsZXQgSWZyYW1lRWxlbWVudDogSFRNTElGcmFtZUVsZW1lbnQ7XG5cbiAgICAgICAgY29uc3QgdHlwZWRMb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKGNvbnRhaW5lcj8ubm9kZU5hbWUgPT09IFwiSUZSQU1FXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCduZWVkcyB0byBsb2FkIGludG8gYW4gZXhzaXN0aW5nIElmcmFtZS4uLicsIHR5cGVkTG9hZGVyQ29uZmlnLnVybCwgY29udGFpbmVyKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IChjb250YWluZXIgYXMgSFRNTElGcmFtZUVsZW1lbnQpXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNyYyA9IHR5cGVkTG9hZGVyQ29uZmlnLnVybFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbmVlZHMgdG8gY3JlYXRlIG5ldyBJZnJhbWUuLi4nLCBkb21JZCwgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogZG8gaXQgb25seSB3aXRoIGZsYWcgP1xuICAgICAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQgOlxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgICAgIElmcmFtZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuXG4gICAgICAgICAgICAvLyBpbiBvcmRlciB0byBoYW5kbGUgaXNzdWUgdG8gbG9hZCBpZnJhbWUgaW5zaWRlIGFuIGlmcmFtZSB3aXRoIHRoZSBzYW1lIHVybFxuICAgICAgICAgICAgbGV0IHVybDJsb2FkID0gKHNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpLnVybDtcbiAgICAgICAgICAgIC8vY29uc3QgdW5pcVVybCA9IHVybDJsb2FkID09PSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmID8gYWRkUXVlcnlQYXJhbSh1cmwybG9hZCwgXCJfbVwiLCBkb21JZCkgOiB1cmwybG9hZFxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9oYXNQYXJlbnQpXG4gICAgICAgICAgICAgICAgdXJsMmxvYWQgPSBhZGRRdWVyeVBhcmFtKHVybDJsb2FkLCBcIl9teW9wLWNvbXBcIiwgdW5pcUlkKTtcblxuICAgICAgICAgICAgLy9UT0RPIDogaGFuZGxlICdzdHlsZScgYXR0ciBtZXJnZSBoZXJlXG4gICAgICAgICAgICBsZXQgZWxlbWVudEF0dHJpYnV0ZXNTdHJpbmcgPSAnJztcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5lbGVtZW50QXR0cmlidXRlcylcbiAgICAgICAgICAgICAgICBlbGVtZW50QXR0cmlidXRlc1N0cmluZyA9IE9iamVjdC5lbnRyaWVzKG9wdGlvbnM/LmVsZW1lbnRBdHRyaWJ1dGVzKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnJyB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtrZXl9PVwiJHtTdHJpbmcodmFsdWUpfVwiYDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmpvaW4oJyAnKTtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5vdXRlckhUTUwgPSBgPGlmcmFtZSBcbiAgICAgICAgICAgICAgIGlkPVwiJHtkb21JZH1cIlxuICAgICAgICAgICAgICAgc3R5bGU9XCJcbiAgICAgICAgICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICR7dHlwZWRMb2FkZXJDb25maWcuYXV0b0hlaWdodCB8fCAhdHlwZWRMb2FkZXJDb25maWcuaGVpZ2h0ID8gJycgOiB0eXBlZExvYWRlckNvbmZpZy5oZWlnaHR9OyAgICBcbiAgICAgICAgICAgICAgICAgICB3aWR0aCA6IDEwMCU7XG4gICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAke29wdGlvbnM/LmhpZGRlbiA/ICdhYnNvbHV0ZScgOiAnc3RhdGljJ307XG4gICAgICAgICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6ICR7b3B0aW9ucz8uaGlkZGVuID8gJ25vbmUnIDogJ2FsbCd9O1xuICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIHNyYz1cIiR7dXJsMmxvYWR9XCJcbiAgICAgICAgICAgICR7ZWxlbWVudEF0dHJpYnV0ZXNTdHJpbmd9XG4gICAgICAgICAgICA+PC9pZnJhbWU+YDtcblxuICAgICAgICAgICAgSWZyYW1lRWxlbWVudCA9IGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKGAjJHtkb21JZH1gKSBhcyBIVE1MSUZyYW1lRWxlbWVudDtcblxuICAgICAgICAgICAgLy8gICBJZnJhbWVFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZG9tSWQpIGFzIEhUTUxJRnJhbWVFbGVtZW50O1xuICAgICAgICAgICAgLy9OTyA6IElmcmFtZUVsZW1lbnQgPSBjb250YWluZXIubGFzdEVsZW1lbnRDaGlsZCBhcyBIVE1MSUZyYW1lRWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuICAgIH1cbn1cbiIsICJleHBvcnQgY29uc3QgbXlvcFdlYmNvbXBvbmVudENvbnN0cyA9IHtcbiAgICB3ZWJjb21wb25lbnRfbWVzc2FnZV9rZXk6ICdteW9wX3dlYmNvbXBvbmVudF9tZXNzYWdlJ1xufVxuIiwgImltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4uLy4uL3dlYmNvbXBvbmVudC9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU15b3BDb21wb25lbnR9IGZyb20gXCIuL0lNeW9wQ29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0NsZWFudXBIYW5kbGVyLCBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWd9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7c2V0RGVidWdTdHlsZX0gZnJvbSBcIi4uL2NvbXBvbmVudENvcmVcIjtcbmltcG9ydCB7bG9hZGVyT3B0aW9uc30gZnJvbSBcIi4uL2hvc3RTREtcIjtcblxuZXhwb3J0IGNsYXNzIE15b3BXZWJDb21wb25lbnQgZXh0ZW5kcyBCYXNlTXlvcENvbXBvbmVudCB7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnREZWZpbml0aW9uOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgc2tpbjogSVNraW5Db25maWcsIHB1YmxpYyBjb250YWluZXI6IEhUTUxFbGVtZW50LCBwcml2YXRlIGN1c3RvbUVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpb25zPzogbG9hZGVyT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb21wb25lbnREZWZpbml0aW9uLCBjb250YWluZXIgLCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lbGVtZW50ID0gY3VzdG9tRWxlbWVudDtcbiAgICB9XG5cbiAgICBjbGVhbnVwSW5zcGVjdDogQ2xlYW51cEhhbmRsZXIgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgaW5zcGVjdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbnVwSW5zcGVjdCA9IHNldERlYnVnU3R5bGUodGhpcy5pZCwgJ015b3BXZWJDb21wb25lbnQnLCAwLCB0aGlzLmNvbnRhaW5lciwgdGhpcy5jdXN0b21FbGVtZW50LCB0aGlzLmNvbXBvbmVudERlZmluaXRpb24pO1xuICAgICAgICByZXR1cm4gdGhpcy5jbGVhbnVwSW5zcGVjdDtcbiAgICB9XG5cbiAgICBoaWRlKCkge1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJ1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgIH1cblxuICAgIHNob3coKSB7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzEnO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAndW5zZXQnXG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2FsbCdcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAndmlzaWJsZSc7XG4gICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5zdHlsZS5oZWlnaHQgPSAnJztcbiAgICAgICAgdGhpcy5jdXN0b21FbGVtZW50LnN0eWxlLndpZHRoID0gJyc7XG4gICAgfVxuXG4gICAgc2VuZCA9IChtZXNzYWdlOiBCYXNlTXlvcE1lc3NhZ2U8YW55PikgPT4ge1xuICAgICAgICBsZXQgbWVzc2FnZV8gPSB7Li4ubWVzc2FnZX0gYXMgQmFzZU15b3BNZXNzYWdlO1xuXG4gICAgICAgIC8vVE9ETyA6IGNhbiBiZSBkb25lIHdpdGhvdXQgY2xvbmluZz9cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL2NvbnN0IGhhbmRsZXIgPSBtZXNzYWdlXy5oYW5kbGVyXG4gICAgICAgIGNvbnN0IGNsZWFudXBIYW5kbGVyID0gc3VwZXIuc2VuZChtZXNzYWdlXyk7XG5cbiAgICAgICAgY29uc3QgbXNnID0gbmV3IEN1c3RvbUV2ZW50PEJhc2VNeW9wTWVzc2FnZT4obXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGRldGFpbDogbWVzc2FnZV8sXG4gICAgICAgICAgICAvLyBidWJibGVzOiB0cnVlLFxuICAgICAgICAgICAgLy8gY2FuY2VsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAvLyBjb21wb3NlZDogdHJ1ZVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vdGhpcy5jb250YWluZXIuZGlzcGF0Y2hFdmVudChtc2cpXG5cbiAgICAgICAgLy9zZW5kaW5nIGRhdGEgZnJvbSBob3N0IHRvIHRoZSBjb21wb25lbnRcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tRWxlbWVudC5kaXNwYXRjaEV2ZW50KG1zZylcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmN1c3RvbUVsZW1lbnQuY2hpbGRyZW5bMF0uZGlzcGF0Y2hFdmVudChtc2cpXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciB3aGlsZSB0cnlpbmcgdG8gZGlzcGF0Y2hFdmVudCcsIGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAvL21lc3NhZ2UuaGFuZGxlciA9IGhhbmRsZXJcblxuICAgICAgICByZXR1cm4gY2xlYW51cEhhbmRsZXI7XG4gICAgfVxuXG4gICAgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmN1c3RvbUVsZW1lbnQucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5jdXN0b21FbGVtZW50KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjQsIHdhaXR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZywgSVNraW5Db25maWcsIElXZWJDb21wb25lbnRMb2FkZXJDb25maWcsIFNraW5Mb2FkZXJzfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmNvbnN0IHNlZW46IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dm9pZD4+ID0ge307XG5cbmV4cG9ydCBjbGFzcyBXZWJjb21wb25lbnRMb2FkZXIgZXh0ZW5kcyBCYXNlTXlvcExvYWRlciB7XG5cbiAgICB0eXBlID0gU2tpbkxvYWRlcnMuV2ViQ29tcG9uZW50TG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSVdlYkNvbXBvbmVudExvYWRlckNvbmZpZyk7XG5cbiAgICAgICAgaWYgKCFzZWVuW2xvYWRlckNvbmZpZy51cmxdKSB7XG4gICAgICAgICAgICAvLyBhd2FpdCBpbXBvcnQoIC8qIEB2aXRlLWlnbm9yZSAqLyB3ZWJDb21wb25lbnRMb2FkVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdtb2R1bGUgbG9hZGVkJyk7XG4gICAgICAgICAgICBzZWVuW2xvYWRlckNvbmZpZy51cmxdID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlYkNvbXBvbmVudExvYWRVcmwgPSBsb2FkZXJDb25maWcudXJsXG4gICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgICAgICAgICAgc2NyaXB0LnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICBzY3JpcHQuc3JjID0gd2ViQ29tcG9uZW50TG9hZFVybDtcbiAgICAgICAgICAgICAgICBzY3JpcHQub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ01vZHVsZSBhbHJlZGF5IGxvYWRlZCBvciBpbiBsb2FkaW5nIHByb2Nlc3MnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGF3YWl0IHNlZW5bbG9hZGVyQ29uZmlnLnVybF07XG5cbiAgICAgICAgLy9UT0RPIDogYWRkIHJldHJ5IG1lY2hhbmlzbSBpbiBmYWlsIGNhc2UuXG5cbiAgICAgICAgLy9UT0RPIDogZml4IHRoYXQgaGFjaywgc2hvdWxkIGZpeCB0aGUgcmFjZSBjb25kaXRpb24gZm9yIGxvYWRlZCBtb2R1bGVzXG4gICAgICAgIGF3YWl0IHdhaXQoMSk7XG5cbiAgICAgICAgbGV0IGRvbUlkID0gYG15b3AtY29tcC0ke3V1aWR2NCgpfWBcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobG9hZGVyQ29uZmlnLnRhZyk7XG5cbiAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgaWYgKCFjb250YWluZXIucXVlcnlTZWxlY3RvcignW2lkXj1cIm15b3AtY29tcC1cIl0nKSlcbiAgICAgICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJztcblxuICAgICAgICAvL2VsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICBlbGVtZW50LmlkID0gZG9tSWQ7XG5cbiAgICAgICAgaWYgKG9wdGlvbnM/LmhpZGRlbikge1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLndpZHRoID0gJzAnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSdcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgKGNvbnRhaW5lci5pZC5zdGFydHNXaXRoKCdteW9wLWNvbXAtJykpIHtcbiAgICAgICAgLy8gICAgIC8vIGluIHBsYWNlIHJlcGxhY2VtZW50XG4gICAgICAgIC8vICAgICBjb250YWluZXIucmVwbGFjZVdpdGgoZWxlbWVudCk7XG4gICAgICAgIC8vICAgICAvL2NvbnRhaW5lciA9IGVsZW1lbnQucGFyZW50RWxlbWVudCE7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBpZihvcHRpb25zPy5fZW52aXJvbm1lbnQpe1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgZWxlbWVudC5fbXlvcEVudmlyb25tZW50ID0gb3B0aW9ucz8uX2Vudmlyb25tZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICAvL2VsZW1lbnQuaW5uZXJIVE1MID0gYDwke2xvYWRlckNvbmZpZy50YWd9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG59XG4iLCAiaW1wb3J0IHtCYXNlQ29udGV4dE1lc3NhZ2VIYW5kbGVyLCBIb3N0ZWRDb21wb25lbnR9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZU15b3BNZXNzYWdlLCBNeW9wQmluZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgdHlwZSBNZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSkgPT4gdm9pZFxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFQgZXh0ZW5kcyBCYXNlTXlvcE1lc3NhZ2UgPSBhbnk+IGV4dGVuZHMgQmFzZUNvbnRleHRNZXNzYWdlSGFuZGxlcjxULCBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+PiB7XG5cbiAgICBhYnN0cmFjdCBtZXNzYWdlVHlwZTogc3RyaW5nXG5cbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlVG9Ib3N0OiBhbnksIHB1YmxpYyBjb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCBIb3N0ZWRDb21wb25lbnQ8U2hhZG93Um9vdFJlZj4+KSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2VUb0hvc3QpO1xuICAgIH1cblxuICAgIGFic3RyYWN0IGlubmVyRXhlY3V0b3I6IChldmVudDogVCwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4gdm9pZDtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBUKSA9PiB7XG4gICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgIGlmIChldmVudC5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSBldmVudC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHRbZGVzdGluYXRpb25dLmNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIHBhdGNoIHRoZSBzb3VyY2UgaWQsIHRoaW5rIGFib3V0IHRoYXQgP1xuICAgICAgICAgICAgICAgIGNvbnN0IF9tZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IEJhc2VNeW9wTWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGV2ZW50LmRlc3RpbmF0aW9uID8gZXZlbnQuZGVzdGluYXRpb24gOiBldmVudC5zb3VyY2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbjogZXZlbnQuc291cmNlID8gZXZlbnQuc291cmNlIDogZXZlbnQuZGVzdGluYXRpb25cbiAgICAgICAgICAgICAgICAgICAgfSBhcyBCYXNlTXlvcE1lc3NhZ2UsIHJlcGxheVRvKVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlubmVyRXhlY3V0b3IoZXZlbnQsIHRoaXMuY29udGV4dFtkZXN0aW5hdGlvbl0uY29udGV4dCwgX21lc3NhZ2VUb0hvc3QpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgImV4cG9ydCBjb25zdCBteW9wQXR0cmlidXRlcyA9IHtcbiAgICBpZDogJ215b3AtaWQnXG59XG4iLCAiaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHtSZWZ9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudHNCeVJlZiA9IChyZWY6IFJlZiwgZWw6IFBhcmVudE5vZGUpID0+IHtcbiAgICByZXR1cm4gZWwucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke3JlZi5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdldEZpcnN0RWxlbWVudEJ5UmVmID0gKHJlZjogUmVmLCBlbDogUGFyZW50Tm9kZSkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnRzID0gZ2V0RWxlbWVudHNCeVJlZihyZWYsIGVsKTtcbiAgICBpZiAoZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50cy5pdGVtKDApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn0iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0JpbmRDbGlja01lc3NhZ2UsIENsaWNrUmVwbGF5TWVzc2FnZSwgTXlvcEJpbmRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWZcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQmluZE9uQ2xpY2tIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEJpbmRDbGlja01lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkJpbmRDbGlja01lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdClcbiAgICAgICAgY29uc3QgY2xlYW51cFRhc2tzOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VUb0hvc3QobmV3IENsaWNrUmVwbGF5TWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQpKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KVxuXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge015b3BFbGVtZW50TWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIENoYW5nZVRleHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPE15b3BFbGVtZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBNeW9wRWxlbWVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge1Jvb3RSZWZ9IGZyb20gXCIuLi9jb21tb25cIjtcblxuZXhwb3J0IGNsYXNzIFNoYWRvd1Jvb3RSZWYgZXh0ZW5kcyBSb290UmVmIHtcbiAgICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgcHVibGljIHNoYWRvd1Jvb3Q6IFNoYWRvd1Jvb3QpIHtcbiAgICAgICAgc3VwZXIoY29udGFpbmVyLCBzaGFkb3dSb290KTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wRWxlbWVudFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtEZXRlY3RlZE15b3BSZWZzTWVzc2FnZSwgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuXG5leHBvcnQgY2xhc3MgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxEZXRlY3RNeW9wUmVmc01lc3NhZ2U+IHtcbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBEZXRlY3RNeW9wUmVmc01lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcblxuICAgICAgICAvL2RlYnVnZ2VyO1xuICAgICAgICBjb25zdCBhbGxNeW9wSXRlbXMgPSBzaGFkb3dSb290UmVmLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbChgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9XWApO1xuXG4gICAgICAgIGxldCBteW9wUmVmczogTXlvcEVsZW1lbnRSZWZbXSA9IFtdO1xuXG4gICAgICAgIGFsbE15b3BJdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuXG4gICAgICAgICAgICAvLyBUT0RPIDogdGFrZSB0aGF0IGJhY2sgdG8gdGhlIGRhc2hib2FyZD9cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coaXRlbSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGl0ZW0uZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcblxuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ3djIHJlY3QnLCAgaXRlbS5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKVxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICBteW9wUmVmcy5wdXNoKG5ldyBNeW9wRWxlbWVudFJlZihteW9wSWQsIGl0ZW0udGFnTmFtZSwgaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgaXRlbS5vZmZzZXRUb3AsIGl0ZW0ub2Zmc2V0TGVmdCkpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBEZXRlY3RlZE15b3BSZWZzTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9O1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG5cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7U2V0QXR0cmlidXRlTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIHNldEF0dHJpYnV0ZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8U2V0QXR0cmlidXRlTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0QXR0cmlidXRlTWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgc2hhZG93Um9vdFJlZi5zaGFkb3dSb290KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKGV2ZW50Lm5hbWUsIGV2ZW50LnZhbHVlKVxuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7XG4gICAgQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2UsXG4gICAgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZSxcbn0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBBZGRFdmVudExpc3RlbmVySGFuZGxlciBleHRlbmRzIEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcjxBZGRFdmVudExpc3RlbmVyTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQWRkRXZlbnRMaXN0ZW5lck1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBBZGRFdmVudExpc3RlbmVyTWVzc2FnZSwgc2hhZG93Um9vdFJlZjogU2hhZG93Um9vdFJlZiwgbWVzc2FnZVRvSG9zdDogTWVzc2FnZVRvSG9zdCkgPT4ge1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gaW4gZmFjdCB3aGVuIHJ1bm5pbmcgaW4gV2ViQ29tcG9uZW50IHdlIGNhbiB0cmFuc2ZlciB0aGUgb3JpZ2luYWwgZVxuICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSB1c2luZyBtYWtlU2VyaWFsaXphYmxlIGZvciBuZXN0ZWQgY2FzZXMsIHRoaW5rIGFib3V0IHRoYXRcbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgIG1ha2VTZXJpYWxpemFibGUoZSwgZXZlbnQuc2VyaWFsaXphYmxlU2tlbGV0b24pKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQudHlwZSwgaGFuZGxlcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYW51cFRhc2tzLmZvckVhY2godGFzayA9PiB0YXNrKCkpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0hvc3RTREt9IGZyb20gXCIuLi8uLi9ob3N0L2hvc3RTREtcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZSwgUmVmQ29tcG9uZW50Q3JlYXRlZE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlcy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlciwgTWVzc2FnZVRvSG9zdH0gZnJvbSBcIi4vQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge1NoYWRvd1Jvb3RSZWZ9IGZyb20gXCIuLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vaG9zdFwiO1xuXG5leHBvcnQgY2xhc3MgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIgZXh0ZW5kcyBCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXI8Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZTtcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UsIHNoYWRvd1Jvb3RSZWY6IFNoYWRvd1Jvb3RSZWYsIG1lc3NhZ2VUb0hvc3Q6IE1lc3NhZ2VUb0hvc3QpID0+IHtcblxuICAgICAgICBjb25zdCBjcmVhdGVSZWYgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAvL2NvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmPy5yZWZDb25maWcuc2VsZWN0b3J9J11gKTtcbiAgICAgICAgICAgIGNvbnN0IGFsbEl0ZW1zID0gc2hhZG93Um9vdFJlZi5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KGBbJHtteW9wQXR0cmlidXRlcy5pZH09JyR7ZXZlbnQucmVmQ29uZmlnLnNlbGVjdG9yfSddYCk7XG5cbiAgICAgICAgICAgIGlmIChhbGxJdGVtcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBob3N0U0RLID0gSG9zdFNESy5JbnN0YW5jZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gaG9zdFNESy5jb21wb25lbnRzLmZpbmQoYyA9PiBjLmlkID09PSBldmVudC5vcHRpb25zLmlkKSE7XG4gICAgICAgICAgICAgICAgaWYgKHJlZkNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAvLy8vPj4+PlxuICAgICAgICAgICAgICAgICAgICByZWZDb21wb25lbnQuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAvLyAgY29uc29sZS5sb2coYGZhaWxlZCB0byBmaW5kICR7ZXZlbnQub3B0aW9ucy5pZH0gaW4gbWVtIHNjb3BlYCwgaG9zdFNESyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vd2UgaGF2ZSB0aGUgcmVmIGNvbXBvbmVudCBpbiBvdXIgSG9zdFNESyAoc2FtZSBtZW1vcnkgd2hlbiB1c2luZyB3ZWJjb21wb25lbnQpXG4gICAgICAgICAgICAgICAgLy8gIHJlZkNvbXBvbmVudC5wYXJlbnQgPSBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAvL2RlbGV0ZSB0aGUgcmVmIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaG9zdFNESy5jb21wb25lbnRzLmluZGV4T2YocmVmQ29tcG9uZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RTREsuY29tcG9uZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdjcmVhdGVSZWZDb21wb25lbnQgY2FsbGVkIHJlbW92ZWQgdGVtcCByZWYgY29tcG9uZW50Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnY3JlYXRlUmVmQ29tcG9uZW50IGNhbGxlZCB1c2luZyB0ZW1wIHJlZiBjb21wb25lbnQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsZW1lbnRhdGlvbkNvbXBvbmVudCA9IGF3YWl0IGhvc3RTREsubG9hZENvbXBvbmVudChldmVudC5uZXN0ZWRDb21wb25lbnRDb25maWcsXG4gICAgICAgICAgICAgICAgICAgIGFsbEl0ZW1zLml0ZW0oMCksXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Lm9wdGlvbnMpXG5cbiAgICAgICAgICAgICAgICAvL1RPRE8gOiBubyBuZWVkIHRoaXMsIHBhc3Mgb3B0aW9ucyBmcm9tIHBhcmVudFxuICAgICAgICAgICAgICAgIC8vaW1wbGVtZW50YXRpb25Db21wb25lbnQuaWQgPSBldmVudC5wcmVkZWZpbmVkSWQ7XG4gICAgICAgICAgICAgICAgLy9yZWZDb21wb25lbnQuaWQgKz0gJy4nO1xuXG4gICAgICAgICAgICAgICAgLy9UT0RPIDogbm90IHJlYWxseSBuZWVkZWQgP1xuICAgICAgICAgICAgICAgIC8vIGF3YWl0IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LmluaXRpYXRlZCgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaW1wbGVtZW50YXRpb25Db21wb25lbnQucmVmcykuZm9yRWFjaChyZWZOYW1lID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZiA9IGltcGxlbWVudGF0aW9uQ29tcG9uZW50LnJlZnNbcmVmTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIHJlZiA9IHJlZi5fX25vblByb3hpZWQgfHwgcmVmO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgocmVmIGFzIElNeW9wQ29tcG9uZW50KS5jb21wb25lbnREZWZpbml0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRSZWZDb25maWcucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREZWZpbml0aW9uSWQ6IChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIG5lc3RlZFJlZkNvbmZpZykpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciAtIERPTSBlbGVtZW50IG5vdCBmb3VuZCcpXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZShldmVudC5oYW5kbGVyVW5pcXVlSWQsIFtdLCB0cnVlKSk7XG5cbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKVxuICAgICAgICAvL3JldHVybmluZyB1bmRlZmluZWQgc28gaXQgd29uJ3QgYWN0IGFzIGEgY2xlYW51cFxuICAgIH1cbn1cbiIsICJpbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Um9vdFJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vdXRpbHMvc2VyaWFsaXphdGlvbi50c1wiO1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvciA9IChldmVudDogRXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIHJlcGxpZXI6IChkYXRhOiBhbnkpID0+IHZvaWQsIHJvb3RSZWY6IFJvb3RSZWYpID0+IHtcbiAgICBjb25zdCBfX3NjcmlwdElucHV0cyA9IGV2ZW50LnNjcmlwdElucHV0cyA/IGV2ZW50LnNjcmlwdElucHV0cyA6IHt9XG4gICAgX19zY3JpcHRJbnB1dHMubWFrZVNlcmlhbGl6YWJsZSA9IG1ha2VTZXJpYWxpemFibGU7XG5cbiAgICBfX3NjcmlwdElucHV0cy5zZW5kID0gcmVwbGllcjtcbiAgICBfX3NjcmlwdElucHV0cy5yb290UmVmID0gcm9vdFJlZjtcbiAgICBfX3NjcmlwdElucHV0cy5fX3NjcmlwdElucHV0cyA9IF9fc2NyaXB0SW5wdXRzO1xuXG4gICAgY29uc3QgZHluYW1pY0Z1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gKCR7ZXZlbnQuc2NyaXB0fSkoLi4uYXJndW1lbnRzKWApO1xuICAgIGNvbnN0IHJldCA9IGR5bmFtaWNGdW5jdGlvbihfX3NjcmlwdElucHV0cyk7XG5cbiAgICAvLyBjb25zdCBkeW5hbWljRnVuY3Rpb24gPSBGdW5jdGlvbignc2VuZCcsICdyb290UmVmJywnX19zY3JpcHRJbnB1dHMnLCAuLi5PYmplY3Qua2V5cyhfX3NjcmlwdElucHV0cyksIGV2ZW50LmNvbnRlbnQgPyBldmVudC5jb250ZW50IDogJycpXG4gICAgLy9jb25zdCByZXQgPSBkeW5hbWljRnVuY3Rpb24ocmVwbGllciwgcm9vdFJlZiwgX19zY3JpcHRJbnB1dHMsIC4uLk9iamVjdC52YWx1ZXMoX19zY3JpcHRJbnB1dHMpKTtcbiAgICByZXBsaWVyKHJldCk7XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRNZXNzYWdlLCBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGlubmVyRXhlY3V0b3IgPSAoZXZlbnQ6IEV4ZWN1dGVTY3JpcHRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IHJlcGxpZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIHNoYWRvd1Jvb3RSZWYpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RWxlbWVudFZhbHVlUmVwbGF5TWVzc2FnZSwgRm9ybURhdGFFbnRyeSwgR2V0RWxlbWVudFZhbHVlTWVzc2FnZSwgSW5wdXRFbGVtZW50VmFsdWUsfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLCBNZXNzYWdlVG9Ib3N0fSBmcm9tIFwiLi9CYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2hhZG93Um9vdFJlZn0gZnJvbSBcIi4uL3NoYWRvd1Jvb3RSZWYudHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0cy50c1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcblxuY29uc3QgZ2V0SW5wdXRWYWx1ZSA9IChlbGVtZW50KTogSW5wdXRFbGVtZW50VmFsdWUgPT4ge1xuICAgIGlmICghZWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAvLyBDaGVjayBpZiBpdCdzIGEgZm9ybVxuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdGT1JNJykge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YShlbGVtZW50KTtcbiAgICAgICAgY29uc3QgZGF0YU9iamVjdDogSW5wdXRFbGVtZW50VmFsdWUgPSB7XG4gICAgICAgICAgICBmb3JtRGF0YToge30sXG4gICAgICAgICAgICB1bm1hcHBlZERhdGE6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gTWFudWFsbHkgYWRkIGVsZW1lbnRzIHdpdGhvdXQgbmFtZXNcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0LCBzZWxlY3QsIHRleHRhcmVhJyk7XG4gICAgICAgIGxldCBhdXRvTmFtZUluZGV4ZXIgPSAtMTtcblxuICAgICAgICBlbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LnZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IG15b3BJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKG15b3BBdHRyaWJ1dGVzLmlkKTtcbiAgICAgICAgICAgICAgICBsZXQga2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ25hbWUnKTtcblxuICAgICAgICAgICAgICAgIC8vIGBfJHsoKythdXRvTmFtZUluZGV4ZXIpfWBcblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVEYXRhOiBGb3JtRGF0YUVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgbmFtZToga2V5LFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZ2V0SW5wdXRWYWx1ZShlbGVtZW50KSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGVsZW1lbnQucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkaXR5OiBtYWtlU2VyaWFsaXphYmxlKGVsZW1lbnQudmFsaWRpdHksIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICBteW9wSWQsXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBpbm5lckV4ZWN1dG9yID0gKGV2ZW50OiBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmLCBtZXNzYWdlVG9Ib3N0OiBNZXNzYWdlVG9Ib3N0KSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBtZXNzYWdlVG9Ib3N0KG5ldyBFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlKGdldElucHV0VmFsdWUoaXRlbSkpLCBldmVudCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtTZXRJbm5lckh0bWx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi4vc2hhZG93Um9vdFJlZlwiO1xuaW1wb3J0IHtCYXNlV2ViQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtNeW9wRWxlbWVudE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZVdlYkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgaW5uZXJFeGVjdXRvciA9IChldmVudDogTXlvcEVsZW1lbnRNZXNzYWdlLCBzaGFkb3dSb290UmVmOiBTaGFkb3dSb290UmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIHNoYWRvd1Jvb3RSZWYuc2hhZG93Um9vdCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gKiBgYGBqc1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gKiBjb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IChhd2FpdCBnZXRXZWJjb21wb25lbnRNb2R1bGUoKSk7XG4gKiBgYGBcbiAqIG9yXG4gKiBgYGB0c1xuICogaW1wb3J0IHtXZWJDb21wb25lbnRTREt9IGZyb20gJ0BteW9wL3Nkay93ZWJjb21wb25lbnQnO1xuICogYGBgXG4gKlxuICovXG5pbXBvcnQge0Jhc2VNeW9wU0RLfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcFdlYmNvbXBvbmVudENvbnN0c30gZnJvbSBcIi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0Jhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtCaW5kT25DbGlja0hhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9iaW5kT25DbGlja0hhbmRsZXJcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dEhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9jaGFuZ2VUZXh0SGFuZGxlclwiO1xuaW1wb3J0IHtTaGFkb3dSb290UmVmfSBmcm9tIFwiLi9zaGFkb3dSb290UmVmXCI7XG5pbXBvcnQge0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyXCI7XG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcbmltcG9ydCB7XG4gICAgQmFzZU15b3BNZXNzYWdlLFxuICAgIEluaXRNZXNzYWdlLFxuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7c2V0QXR0cmlidXRlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldEF0dHJpYnV0ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7QWRkRXZlbnRMaXN0ZW5lckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9hZGRFdmVudExpc3RlbmVySGFuZGxlci50c1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyLnRzXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcbmltcG9ydCB7R2V0RWxlbWVudFZhbHVlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0dldEVsZW1lbnRWYWx1ZUhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gKiBUaGUgV2ViY29tcG9uZW50IFNESyBpcyB0YWlsb3JlZCBmb3IgdXNpbmcgTXlvcCBjb21wb25lbnRzIHBhY2thZ2VkIGFzIHNlcGFyYXRlIGJ1bmRsZXMgYW5kIGV4cG9zZWQgYXMgd2ViIGNvbXBvbmVudHMuPGJyLz5cbiAqIERldmVsb3BlcnMgaW1wb3J0aW5nIHRoaXMgU0RLIGNhbiBsZXZlcmFnZSBBUElzIGFuZCB1dGlsaXRpZXMgc3BlY2lmaWNhbGx5IGNyYWZ0ZWQgdG8gc3VwcG9ydCB0aGUgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGNvbW11bmljYXRpb24gcGF0dGVybnMgcmVxdWlyZWQgZm9yIHdlYiBjb21wb25lbnRzIHdpdGhpbiB0aGUgTXlvcCBhcmNoaXRlY3R1cmUuPGJyLz5cbiAqIFRoaXMgU0RLIHByb21vdGVzIHJldXNhYmlsaXR5IGFuZCBlbmNhcHN1bGF0aW9uLCBlbmFibGluZyBkZXZlbG9wZXJzIHRvIGJ1aWxkIG1vZHVsYXIsIHNlbGYtY29udGFpbmVkIGNvbXBvbmVudHMgdGhhdCBjYW4gYmUgc2VhbWxlc3NseSBpbnRlZ3JhdGVkIGludG8gdGhlIGhvc3QgYXBwbGljYXRpb24ncyBET00gc3RydWN0dXJlLlxuICpcbiAqXG4gKiBPbmNlIGxvYWRlZCB0aGUgYFJvb3QgU0RLYCwgeW91IGNhbiBsb2FkIHRoZSBgSWZyYW1lU0RLYFxuICogYGBganNcbiAqIGNvbnN0IHtXZWJDb21wb25lbnRTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKiBvclxuICogYGBgdHNcbiAqIGltcG9ydCB7Z2V0V2ViY29tcG9uZW50TW9kdWxlfSBmcm9tICdAbXlvcC9zZGsnO1xuICogY29uc3Qge1dlYkNvbXBvbmVudFNES30gPSAoYXdhaXQgZ2V0V2ViY29tcG9uZW50TW9kdWxlKCkpO1xuICogYGBgXG4gKlxuICovXG5leHBvcnQgY2xhc3MgV2ViQ29tcG9uZW50U0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgYWx3YXlzUGFzc0VudmVsb3Blc1RvSG9zdCA9IHRydWU7XG5cbiAgICAvL3doZW4gbmV3IHdlYiBjb21wb25lbnQgY3JlYXRlZC5cbiAgICBjb25uZWN0ZWRDYWxsYmFjayA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBzaGFkb3c6IFNoYWRvd1Jvb3QpID0+IHtcbiAgICAgICAgY29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIobXlvcFdlYmNvbXBvbmVudENvbnN0cy53ZWJjb21wb25lbnRfbWVzc2FnZV9rZXksIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vZGVidWdnZXI7XG4gICAgICAgICAgICBjb25zdCBldmVudENvbnRlbnQgPSBlLmRhdGEgPyBlLmRhdGEgOiBlLmRldGFpbDtcbiAgICAgICAgICAgIGlmICghZXZlbnRDb250ZW50IHx8ICFldmVudENvbnRlbnQubXlvcCkge1xuICAgICAgICAgICAgICAgIGRlYnVnZ2VyO1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncmVjdmllZCB3ZWJjb21wb25lbnRfbWVzc2FnZSB3aXRoIHdyb25nIHR5cGUnKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXZlbnRDb250ZW50IGFzIEJhc2VNeW9wTWVzc2FnZTtcblxuICAgICAgICAgICAgICAgIC8vVE9ETyA6IHNlbmQgY29udGFpbmVyIC8gY29tcG9lbm50IGlkZW50aWZpZXIgZm9yIG11bHRpbCBjb21wb25lbnRzIHN1cHBvcnRcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUluY29tZU1lc3NhZ2VzKGUpXG5cbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5tZXNzYWdlVHlwZSA9PT0gTXlvcE1lc3NhZ2VzLkluaXRNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q29tcG9uZW50SWQgPSAobWVzc2FnZSBhcyBJbml0TWVzc2FnZSkuY29udGVudC5pZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzW25ld0NvbXBvbmVudElkXS5jb250ZXh0ID0gbmV3IFNoYWRvd1Jvb3RSZWYoY29udGFpbmVyLCBzaGFkb3cpXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5zdXBwb3J0ZWRIYW5kbGVycy5mb3JFYWNoKGhhbmRsZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgaGFuZGxlci5jb250ZXh0ID0gdGhpcy5zaGFkb3dSb290cztcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIC8vVE9ETyA6IGZpeCB0aGF0IGhhY2suIHJhY2UgY29uZGl0aW9uIHdpdGggaG9zdC5sb2FkIHdoZW4gbW9kdWxlIGxvYWRlZFxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgSW5pdFJlcXVlc3QoKSlcbiAgICAgICAgfSwgMSlcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG4gICAgICAgIC8vbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgJiYgcmVwbGF5VG8/LmhhbmRsZXJVbmlxdWVJZClcbiAgICAgICAgICAgIG1lc3NhZ2UucmVwbGF5VG9IYW5kbGVyID0gcmVwbGF5VG8uaGFuZGxlclVuaXF1ZUlkXG5cbiAgICAgICAgd2luZG93Lm15b3AuaG9zdFNESy5zZW5kKG1lc3NhZ2UpXG4gICAgfVxuXG4gICAgc3VwcG9ydGVkSGFuZGxlcnM6IEJhc2VXZWJDb21wb25lbnRNZXNzYWdlSGFuZGxlcltdID0gW1xuICAgICAgICBuZXcgQ2hhbmdlVGV4dEhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgU2V0SW5uZXJIdG1sSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICBuZXcgRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QsIHRoaXMuY29tcG9uZW50cyksXG4gICAgICAgIG5ldyBzZXRBdHRyaWJ1dGVIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCwgdGhpcy5jb21wb25lbnRzKSxcbiAgICAgICAgbmV3IEdldEVsZW1lbnRWYWx1ZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICAvL1xuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0LCB0aGlzLmNvbXBvbmVudHMpXG4gICAgXTtcblxuICAgIHB1YmxpYyBpbml0ID0gKCkgPT4ge1xuICAgICAgICAvL3RoaXMubXlDb21wb25lbnRJZFxuICAgICAgICAvL3RoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXNcbiAgICB9XG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ1dlYkNvbXBvbmVudFNESycsIFdlYkNvbXBvbmVudFNESyk7XG4iLCAiZXhwb3J0ICogZnJvbSBcIi4vV2ViQ29tcG9uZW50U0RLXCI7XG4iLCAiaW1wb3J0IHtNeW9wV2ViQ29tcG9uZW50fSBmcm9tIFwiLi4vY29tcG9uZW50cy9teW9wV2ViY29tcG9uZW50XCI7XG5pbXBvcnQge0Jhc2VNeW9wTG9hZGVyfSBmcm9tIFwiLi9JTXlvcExvYWRlclwiO1xuaW1wb3J0IHtsb2FkZXJPcHRpb25zfSBmcm9tIFwiLi4vaG9zdFNESy50c1wiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi8uLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtcbiAgICBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZyxcbiAgICBJSFRNTExvYWRlckNvbmZpZyxcbiAgICBJU2tpbkNvbmZpZywgU2hhZG93Um9vdE1vZGVUeXBlLFxuICAgIFNraW5Mb2FkZXJzXG59IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7V2ViQ29tcG9uZW50U0RLfSBmcm9tIFwiLi4vLi4vd2ViY29tcG9uZW50XCI7XG5pbXBvcnQge015b3BJZnJhbWVDb21wb25lbnR9IGZyb20gXCIuLi9jb21wb25lbnRzL215b3BJZnJhbWVDb21wb25lbnQudHNcIjtcbi8vaW1wb3J0IHtnZXRXZWJjb21wb25lbnRNb2R1bGV9IGZyb20gXCIuLi8uLi9TREsudHNcIjtcblxuY29uc3Qgc2Vlbjogc3RyaW5nW10gPSBbXTtcbmxldCBzZGs7XG5jb25zdCBnZXRJbml0aWF0ZWRTZGsgPSBhc3luYyAoKSA9PiB7XG4gICAgaWYgKCFzZGspIHtcbiAgICAgICAgLy9jb25zdCB7V2ViQ29tcG9uZW50U0RLfSA9IGF3YWl0IGdldFdlYmNvbXBvbmVudE1vZHVsZSgpXG4gICAgICAgIHNkayA9IG5ldyBXZWJDb21wb25lbnRTREsoKTtcbiAgICAgICAgc2RrLmluaXQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHNkaztcbn1cblxuZnVuY3Rpb24gY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sU3RyaW5nOiBzdHJpbmcsIFNoYWRvd1Jvb3RNb2RlPzoga2V5b2YgdHlwZW9mIFNoYWRvd1Jvb3RNb2RlVHlwZSk6IG5ldyAoKSA9PiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgSFRNTEVsZW1lbnQge1xuXG4gICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgY29uc3QgbW9kZSA9IFNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUub3BlbiA/ICdvcGVuJyA6ICdjbG9zZWQnO1xuICAgICAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5hdHRhY2hTaGFkb3coe21vZGV9KTtcbiAgICAgICAgICAgIGdldEluaXRpYXRlZFNkaygpLnRoZW4oKHNkaykgPT4ge1xuICAgICAgICAgICAgICAgIHNkay5jb25uZWN0ZWRDYWxsYmFjayh0aGlzLCBzaGFkb3cpO1xuICAgICAgICAgICAgICAgIHNoYWRvdy5pbm5lckhUTUwgPSBodG1sU3RyaW5nXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgfTtcbn1cblxuY29uc3QgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50ID0gKGNvbXBvbmVudE5hbWU6IHN0cmluZywgaHRtbDogc3RyaW5nLCBTaGFkb3dSb290TW9kZT86IGtleW9mIHR5cGVvZiBTaGFkb3dSb290TW9kZVR5cGUpID0+IHtcbiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoY29tcG9uZW50TmFtZSwgY3JlYXRlSFRNTEVsZW1lbnRDb25zdHJ1Y3RvcihodG1sLCBTaGFkb3dSb290TW9kZSkpO1xuICAgIGNvbnNvbGUubG9nKGBkZWZpbmUoJyR7Y29tcG9uZW50TmFtZX0nKSB3YXMgY2FsbGVkLCB3ZWIgY29tcG9uZW50IHJlYWR5IHRvIHVzZWApO1xufVxuXG5jb25zdCB0b1dlYkNvbXBvbmVudE5hbWUgPSAoc3RyKSA9PiB7XG4gICAgcmV0dXJuIHN0clxuICAgICAgICAucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgdXBwZXJjYXNlIGxldHRlcnNcbiAgICAgICAgLnJlcGxhY2UoLyhcXGQrKS9nLCAnLSQxJykgLy8gQWRkIGh5cGhlbiBiZWZvcmUgZGlnaXRzXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpOyAvLyBDb252ZXJ0IHRvIGxvd2VyY2FzZVxufVxuXG5jb25zdCB0b0N1c3RvbUVsZW1lbnROYW1lID0gKG5hbWU6IHN0cmluZykgPT4ge1xuICAgIG5hbWUgPSB0b1dlYkNvbXBvbmVudE5hbWUobmFtZSk7XG4gICAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXy9nLCAnLScpO1xufVxuXG5sZXQgcGFyc2VyOiBET01QYXJzZXI7IC8vID0gbmV3IERPTVBhcnNlcigpO1xuXG5leHBvcnQgY2xhc3MgSFRNTENvbXBvbmVudExvYWRlciBleHRlbmRzIEJhc2VNeW9wTG9hZGVyIHtcblxuICAgIHR5cGUgPSBTa2luTG9hZGVycy5IVE1MTG9hZGVyXG5cbiAgICBsb2FkID0gYXN5bmMgKGNvbXBvbmVudERlZmluaXRpb246IElDb21wb25lbnREZWZpbml0aW9uQ29uZmlnLCBza2luOiBJU2tpbkNvbmZpZywgY29udGFpbmVyOiBIVE1MRWxlbWVudCwgb3B0aW9ucz86IGxvYWRlck9wdGlvbnMpID0+IHtcblxuICAgICAgICBjb25zdCBsb2FkZXJDb25maWcgPSAoc2tpbi5sb2FkZXIgYXMgSUhUTUxMb2FkZXJDb25maWcpO1xuICAgICAgICBsZXQgZG9tSWQgPSBgbXlvcC1jb21wLSR7dXVpZHY0KCl9YFxuICAgICAgICBsZXQgZWxlbWVudDtcblxuICAgICAgICBpZiAobG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlID09PSBTaGFkb3dSb290TW9kZVR5cGUubG9jYWxGcmFtZSkge1xuICAgICAgICAgICAgY29uc3QgdW5pcUlkID0gdXVpZHY0KCk7XG4gICAgICAgICAgICBjb25zdCBkb21JZCA9IGBteW9wLWNvbXAtJHt1bmlxSWR9YFxuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnbmVlZHMgdG8gY3JlYXRlIG5ldyBJZnJhbWUuLi4nLCBkb21JZCwgdHlwZWRMb2FkZXJDb25maWcudXJsLCBjb250YWluZXIpO1xuICAgICAgICAgICAgbGV0IElmcmFtZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGRvIGl0IG9ubHkgd2l0aCBmbGFnID9cbiAgICAgICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uaGlkZGVuKSB7XG4gICAgICAgICAgICAgICAgSWZyYW1lRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIElmcmFtZUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGNvbnRhaW5lciwgSWZyYW1lRWxlbWVudCwgb3B0aW9ucykgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LmlkID0gZG9tSWQ7XG4gICAgICAgICAgICBJZnJhbWVFbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBgXG4gICAgICAgICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgICAgICAgICAgb3BhY2l0eTogJHtvcHRpb25zPy5oaWRkZW4gPyAnMCcgOiAnMSd9O1xuICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogJHtvcHRpb25zPy5oaWRkZW4gPyAnYWJzb2x1dGUnIDogJ3N0YXRpYyd9O1xuICAgICAgICAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiAke29wdGlvbnM/LmhpZGRlbiA/ICdub25lJyA6ICdhbGwnfTtcbiAgICAgICAgICAgICAgIGApO1xuICAgICAgICAgICAgLy8gIGhlaWdodDogJHt0eXBlZExvYWRlckNvbmZpZy5hdXRvSGVpZ2h0IHx8ICF0eXBlZExvYWRlckNvbmZpZy5oZWlnaHQgPyAnJyA6IHR5cGVkTG9hZGVyQ29uZmlnLmhlaWdodH07XG5cbiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChJZnJhbWVFbGVtZW50KTtcblxuICAgICAgICAgICAgLy8gV3JpdGUgY29udGVudCBpbnRvIHRoZSBpZnJhbWVcbiAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgY29uc3QgZG9jID0gSWZyYW1lRWxlbWVudC5jb250ZW50RG9jdW1lbnQgfHwgSWZyYW1lRWxlbWVudC5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICAgICAgZG9jLm9wZW4oKTtcblxuXG4gICAgICAgICAgICBsZXQgSFRNTDJSZW5kZXIgPSBsb2FkZXJDb25maWcuSFRNTDtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/Ll9pbnNwZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgLy9pbmplY3QgaW5zcGVjdGlvbiBzY3JpcHQgZm9yIHByb3BzIGRldGVjdGlvblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBfZG9jID0gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhsb2FkZXJDb25maWcuSFRNTCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgICAgICAgICAgICAgLy8gUGFyc2UgdGhlIGluamVjdGVkIEhUTUwgc3RyaW5nIGludG8gYSBub2RlXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcCA9IF9kb2MuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCk7XG4gICAgICAgICAgICAgICAgdGVtcC5ib2R5LmlubmVySFRNTCA9IGA8c2NyaXB0PlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVmb3JlS2V5c1dpbmRvdyA9IG5ldyBTZXQoT2JqZWN0LmtleXMod2luZG93KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubXlvcFN0YXRlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZUtleXNXaW5kb3csXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIDwvc2NyaXB0PmA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gdGVtcC5ib2R5LmZpcnN0Q2hpbGQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobm9kZSAmJiBfZG9jLmhlYWQpIHtcbiAgICAgICAgICAgICAgICAgICAgX2RvYy5oZWFkLmluc2VydEJlZm9yZShfZG9jLmltcG9ydE5vZGUobm9kZSwgdHJ1ZSksIF9kb2MuaGVhZC5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBIVE1MMlJlbmRlciA9IF9kb2MuZG9jdW1lbnRFbGVtZW50Lm91dGVySFRNTDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9jLndyaXRlbG4oSFRNTDJSZW5kZXIpO1xuXG4gICAgICAgICAgICAvLyB3aW5kb3cuX19mZWRlcmF0aW9uX18gPVxuICAgICAgICAgICAgLy8gICAgIHsgLi4ud2luZG93Ll9fZmVkZXJhdGlvbl9fLFxuICAgICAgICAgICAgLy8gICAgICAgICAvL1RPRE8gOiBnZXQgZnJvbSBFTlYgYXQgYnVpbGQgdGltZSxcbiAgICAgICAgICAgIC8vICAgICAgICAgLy8gaW5qZWN0IHZhbHVlIHRvIG1vZHVsZSBhdCBidWlsZCB0aW1lXG4gICAgICAgICAgICAvLyAgICAgICAgIC8vIHRvZGF5IHdlIGRvaW5nIHNvIGp1c3QgZm9yIHRoZSBDSlMgdmVyc2lvblxuICAgICAgICAgICAgLy8gICAgICAgICBfX3B1YmxpY19wYXRoX18gOidodHRwczovL2Nkbi5teW9wLmRldi9zZGsvbmV4dCdcbiAgICAgICAgICAgIC8vICAgICAgICAgLC4uLiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXylcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgfTtcblxuICAgICAgICAgICAgZG9jLndyaXRlbG4oYDxzY3JpcHQgc3JjPVwiJHt3aW5kb3cubXlvcC5fX1JPT1RfU0RLX1BVQkxJQ19VUkxfX31cIj48L3NjcmlwdD5cbiAgICAgICAgICAgICAgICAgICAgPHNjcmlwdD5cbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIHdpbmRvdy5fX2ZlZGVyYXRpb25fXy5fX3B1YmxpY19wYXRoX18gPSAgd2luZG93Ll9fZmVkZXJhdGlvbl9fLl9fcHVibGljX3BhdGhfXztcbiAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgIGNvbnN0IF9fbXlvcF9pbml0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgd2luZG93Lm15b3Aucm9vdFNESy5nZXRJZnJhbWVNb2R1bGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZGsgPSBuZXcgSWZyYW1lU0RLKClcbiAgICAgICAgICAgICAgICAgICAgICAgIHNkay5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICBfX215b3BfaW5pdCgpLnRoZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgIDwvc2NyaXB0PmApO1xuXG4gICAgICAgICAgICBkb2MuY2xvc2UoKTtcblxuICAgICAgICAgICAgLy8gVE9ETyA6IGNvbnRyb2wgZnJvbSBkYXNoYm9hcmRcbiAgICAgICAgICAgIC8vICAoc2tpbi5sb2FkZXIgYXMgSUlmcmFtZUxvYWRlckNvbmZpZykuYXV0b0hlaWdodCA9IHRydWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBuZXcgTXlvcElmcmFtZUNvbXBvbmVudChjb21wb25lbnREZWZpbml0aW9uLCBza2luLCBjb250YWluZXIsIElmcmFtZUVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAobG9hZGVyQ29uZmlnLmF1dG9IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBJZnJhbWVFbGVtZW50Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcC5vYnNlcnZlU2l6ZUJhc2VkT25Eb2N1bWVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgLy8gY29tcC5wcm9wcy5fZ2xvYmFsID0gY29tcC5lbGVtZW50LmNvbnRlbnRXaW5kb3c7XG4gICAgICAgICAgICByZXR1cm4gY29tcDtcblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGxvYWRlckNvbmZpZy5zaGFkb3dSb290TW9kZSA9PT0gU2hhZG93Um9vdE1vZGVUeXBlLm5vbmUpIHtcbiAgICAgICAgICAgIC8vIHBhcnNlciA9IHBhcnNlciA/IHBhcnNlciA6IG5ldyBET01QYXJzZXIoKTtcbiAgICAgICAgICAgIC8vIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcobG9hZGVyQ29uZmlnLkhUTUwsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgIC8vIGVsZW1lbnQgPSBkb2MuYm9keS5maXJzdENoaWxkO1xuICAgICAgICAgICAgLy9lbGVtZW50LnNldEF0dHJpYnV0ZSgnaWQnLCBkb21JZCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICAgICAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IGxvYWRlckNvbmZpZy5IVE1MOy8vLnRyaW0oKTtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkO1xuXG4gICAgICAgICAgICAvLyAgIGNvbnN0IGZpcnN0RWxlbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICAvLyAgIGNvbnN0IHogPSBmaXJzdEVsZW1lbnQgPyBmaXJzdEVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbiAgICAgICAgICAgIC8vICAgZGVidWdnZXI7XG4gICAgICAgICAgICAvLyAgIGNvbnNvbGUubG9nKHRlbXBsYXRlLCBmaXJzdEVsZW1lbnQsIHopXG4gICAgICAgICAgICAvLyAgIGVsZW1lbnQgPSBmaXJzdEVsZW1lbnRcblxuICAgICAgICAgICAgLy8gY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGJvZHknKTtcbiAgICAgICAgICAgIC8vIGRlYnVnZ2VyO1xuICAgICAgICAgICAgLy8gY29udGFpbmVyLmlubmVySFRNTCA9IGxvYWRlckNvbmZpZy5IVE1MO1xuICAgICAgICAgICAgLy8gZWxlbWVudCA9IGNvbnRhaW5lci5maXJzdEVsZW1lbnRDaGlsZDtcblxuICAgICAgICAgICAgZ2V0SW5pdGlhdGVkU2RrKCkudGhlbigoc2RrKSA9PiB7XG4gICAgICAgICAgICAgICAgc2RrLmNvbm5lY3RlZENhbGxiYWNrKGVsZW1lbnQsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnROYW1lID0gdG9DdXN0b21FbGVtZW50TmFtZShjb21wb25lbnREZWZpbml0aW9uLm5hbWUgKyBza2luLmlkKTtcblxuICAgICAgICAgICAgLy9UT0RPIDogc3VwcG9ydCByZWRlZmluZSAhXG4gICAgICAgICAgICBpZiAoIXNlZW4uaW5jbHVkZXMoY3VzdG9tRWxlbWVudE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgY3JlYXRlQ3VzdG9tV2ViQ29tcG9uZW50KGN1c3RvbUVsZW1lbnROYW1lLCBsb2FkZXJDb25maWcuSFRNTCwgbG9hZGVyQ29uZmlnLnNoYWRvd1Jvb3RNb2RlKTtcbiAgICAgICAgICAgICAgICBzZWVuLnB1c2goY3VzdG9tRWxlbWVudE5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoY3VzdG9tRWxlbWVudE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8gOiBkbyBpdCBvbmx5IHdpdGggZmxhZyA/XG4gICAgICAgIGlmICghY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ1tpZF49XCJteW9wLWNvbXAtXCJdJykpXG4gICAgICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgLy9lbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgZWxlbWVudC5pZCA9IGRvbUlkO1xuXG4gICAgICAgIGlmIChvcHRpb25zPy5oaWRkZW4pIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUub3BhY2l0eSA9ICcwJztcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLmhlaWdodCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS53aWR0aCA9ICcwJ1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSAnaGlkZGVuJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIChjb250YWluZXIuaWQuc3RhcnRzV2l0aCgnbXlvcC1jb21wLScpKSB7XG4gICAgICAgIC8vICAgICAvLyBpbiBwbGFjZSByZXBsYWNlbWVudFxuICAgICAgICAvLyAgICAgY29udGFpbmVyLnJlcGxhY2VXaXRoKGVsZW1lbnQpO1xuICAgICAgICAvLyAgICAgLy9jb250YWluZXIgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQhO1xuICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAvLyAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgdGhpcy5hcHBlbmRDaGlsZChjb250YWluZXIsIGVsZW1lbnQsIG9wdGlvbnMpO1xuXG4gICAgICAgIC8vZWxlbWVudC5pbm5lckhUTUwgPSBgPCR7Y3VzdG9tRWxlbWVudE5hbWV9IC8+YDtcbiAgICAgICAgcmV0dXJuIG5ldyBNeW9wV2ViQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24sIHNraW4sIGNvbnRhaW5lciwgZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlICogYXMgQ1NTIGZyb20gXCJjc3N0eXBlXCI7XG5pbXBvcnQge0lNeW9wQ29tcG9uZW50fSBmcm9tIFwiLi4vaG9zdFwiO1xuaW1wb3J0IHt1dWlkdjR9IGZyb20gXCIuLi91dGlscy91dGlscy50c1wiO1xuaW1wb3J0IHtFeGVjdXRlU2NyaXB0TWVzc2FnZX0gZnJvbSBcIi4uL21lc3NhZ2VzXCI7XG5cbi8vIGlnbm9yaW5nIGRvY3VtZW50YXRpb25cbi8qKiBAaWdub3JlICovXG5leHBvcnQgaW50ZXJmYWNlIENTU1Byb3BlcnRpZXMgZXh0ZW5kcyBDU1MuUHJvcGVydGllczxzdHJpbmcgfCBudW1iZXI+IHtcbn1cblxuZXhwb3J0IHR5cGUgU3R5bGVzaGVldERlZmluaXRpb24gPSB7IFtrZXk6IHN0cmluZ106IENTU1Byb3BlcnRpZXMgfTtcblxuZXhwb3J0IGNvbnN0IGFwcGx5U3R5bGVzaGVldCA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBzdHlsZXNoZWV0OiBTdHlsZXNoZWV0RGVmaW5pdGlvbiwgY3NzPzogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgdGFnSWQgPSBgbXlvcC1jc3MtJHt1dWlkdjQoKX1gO1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBFeGVjdXRlU2NyaXB0TWVzc2FnZSgoe3Jvb3RSZWYsIF9zdHlsZXNoZWV0LCBfdGFnSWQsIF9jc3N9KSA9PiB7XG4gICAgICAgIGNvbnN0IHN0eWxlVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgICAgc3R5bGVUYWcudHlwZSA9ICd0ZXh0L2Nzcyc7XG5cbiAgICAgICAgLy8gQnVpbGQgdGhlIENTUyBzdHJpbmcgZnJvbSB0aGUgc3R5bGVzIG9iamVjdFxuICAgICAgICBsZXQgY3NzU3RyaW5nID0gX2NzcztcblxuICAgICAgICBmb3IgKGNvbnN0IHNlbGVjdG9yIGluIF9zdHlsZXNoZWV0KSB7XG4gICAgICAgICAgICBjc3NTdHJpbmcgKz0gYCR7c2VsZWN0b3J9IHsgYDtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBfc3R5bGVzaGVldFtzZWxlY3Rvcl07XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIHByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBjc3NTdHJpbmcgKz0gYCR7cHJvcGVydHl9OiAke3Byb3BlcnRpZXNbcHJvcGVydHldfTsgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNzc1N0cmluZyArPSAnfSAnO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBDU1Mgc3RyaW5nIGFzIHRoZSBjb250ZW50IG9mIHRoZSA8c3R5bGU+IGVsZW1lbnRcbiAgICAgICAgc3R5bGVUYWcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzU3RyaW5nKSk7XG4gICAgICAgIHN0eWxlVGFnLmlkID0gX3RhZ0lkO1xuICAgICAgICAvLyBBcHBlbmQgdGhlIDxzdHlsZT4gZWxlbWVudFxuICAgICAgICAocm9vdFJlZi5zaGFkb3dSb290IHx8IHJvb3RSZWYuY29udGFpbmVyKS5hcHBlbmRDaGlsZChzdHlsZVRhZyk7XG5cbiAgICB9LCAoKSA9PiB7XG4gICAgfSwge1xuICAgICAgICBfc3R5bGVzaGVldDogc3R5bGVzaGVldCxcbiAgICAgICAgX2NzcyA6IGNzcyA/IGNzcyA6ICcnLFxuICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgZG9jdW1lbnQpLmdldEVsZW1lbnRCeUlkKF90YWdJZCk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgICAgICB9KSlcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBhcHBseVN0eWxlc2hlZXRMaW5rID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGxpbms6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IHRhZ0lkID0gYG15b3AtY3NzLSR7dXVpZHY0KCl9YDtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgRXhlY3V0ZVNjcmlwdE1lc3NhZ2UoKHtyb290UmVmLCBfdGFnSWQsIF9saW5rfSkgPT4ge1xuICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICAgICAgbGlua0VsZW1lbnQuaWQgPSBfdGFnSWQ7XG4gICAgICAgIGxpbmtFbGVtZW50LnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IF9saW5rO1xuICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmtFbGVtZW50KTtcblxuICAgICAgICAvLyBBcHBlbmQgdGhlIDxzdHlsZT4gZWxlbWVudFxuICAgICAgICAocm9vdFJlZi5zaGFkb3dSb290IHx8IHJvb3RSZWYuY29udGFpbmVyKS5hcHBlbmRDaGlsZChsaW5rRWxlbWVudCk7XG4gICAgfSwgKCkgPT4ge1xuICAgIH0sIHtcbiAgICAgICAgX2xpbmsgOiBsaW5rLFxuICAgICAgICBfdGFnSWQ6IHRhZ0lkXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY29tcG9uZW50LnNlbmQobmV3IEV4ZWN1dGVTY3JpcHRNZXNzYWdlKCh7cm9vdFJlZiwgX3RhZ0lkfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IChyb290UmVmLnNoYWRvd1Jvb3QgfHwgZG9jdW1lbnQpLmdldEVsZW1lbnRCeUlkKF90YWdJZCk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgX3RhZ0lkOiB0YWdJZFxuICAgICAgICB9KSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtJSWZyYW1lTG9hZGVyQ29uZmlnLCBJU2tpbkNvbmZpZ30gZnJvbSBcIi4uL2NvbW1vblwiO1xuXG5leHBvcnQgdHlwZSBUb2tlbk1hcCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZ3wgbnVtYmVyPlxuXG5jb25zdCByZXBsYWNlVG9rZW5zID0gKGlucHV0OiBzdHJpbmcsIHRva2VuTWFwOiBUb2tlbk1hcCk6IHN0cmluZyA9PiB7XG4gICAgLy8gQ3JlYXRlIGEgcmVnZXggcGF0dGVybiBmcm9tIHRoZSBrZXlzIG9mIHRoZSB0b2tlbk1hcFxuICAgIGNvbnN0IHBhdHRlcm4gPSBuZXcgUmVnRXhwKE9iamVjdC5rZXlzKHRva2VuTWFwKS5qb2luKCd8JyksICdnJyk7XG5cbiAgICAvLyBSZXBsYWNlIHRva2VucyBpbiB0aGUgaW5wdXQgc3RyaW5nIHVzaW5nIHRoZSByZWdleFxuICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKHBhdHRlcm4sIChtYXRjaGVkKSA9PiB7XG4gICAgICAgIC8vIFJldHVybiB0aGUgcmVwbGFjZW1lbnQgdmFsdWUgZnJvbSB0aGUgdG9rZW5NYXBcbiAgICAgICAgcmV0dXJuICh0b2tlbk1hcFttYXRjaGVkXSB8fCBtYXRjaGVkKS50b1N0cmluZygpO1xuICAgIH0pO1xufVxuXG5leHBvcnQgY29uc3QgY3JlYXRlSWZyYW1lU2tpbkJ5VG9rZW5pemVyID0gKHNlbGVjdGVkU2tpbjogSVNraW5Db25maWcsIHRva2VuTWFwOiBUb2tlbk1hcCkgPT4ge1xuICAgIGNvbnN0IHR5cGVkU2tpbkNvbmZpZyA9IChzZWxlY3RlZFNraW4ubG9hZGVyIGFzIElJZnJhbWVMb2FkZXJDb25maWcpXG4gICAgaWYgKHR5cGVkU2tpbkNvbmZpZy50eXBlICE9PSAnSWZyYW1lTG9hZGVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGlmcmFtZVNraW5VcmxUb2tlbml6ZXIgcmVjZWl2ZWQgc2tpbiB3aXRoIGxvYWRlciB0eXBlIFwiJHt0eXBlZFNraW5Db25maWcudHlwZX1cIiwgY3VycmVudGx5IG9ubHkgXCJJZnJhbWVMb2FkZXJcIiBpcyBzdXBwb3J0ZWRgKVxuICAgIH1cblxuICAgIHNlbGVjdGVkU2tpbi5sb2FkZXIgPSB7XG4gICAgICAgIC4uLnNlbGVjdGVkU2tpbi5sb2FkZXJcbiAgICB9XG5cbiAgICBzZWxlY3RlZFNraW4ubG9hZGVyLnVybCA9IHJlcGxhY2VUb2tlbnMoc2VsZWN0ZWRTa2luLmxvYWRlci51cmwsIHRva2VuTWFwKTtcblxuICAgIHJldHVybiBzZWxlY3RlZFNraW47XG59XG5cbmV4cG9ydCBjb25zdCBjaGFuZ2VTa2luVXJsQnlUb2tlbml6ZXIgPSAodG9rZW5NYXA6IFRva2VuTWFwKSA9PiB7XG4gICAgcmV0dXJuIGFzeW5jIChzZWxlY3RlZFNraW46IElTa2luQ29uZmlnKSA9PiB7XG4gICAgICAgIHJldHVybiBjcmVhdGVJZnJhbWVTa2luQnlUb2tlbml6ZXIoc2VsZWN0ZWRTa2luLCB0b2tlbk1hcCk7XG4gICAgfVxufSIsICJpbXBvcnQge0N1c3RvbVJlZk1lc3NhZ2V9IGZyb20gXCIuLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtJTXlvcENvbXBvbmVudH0gZnJvbSBcIi4uL2hvc3RcIjtcblxuLy8gY29uc3Qgc3BhY2UgPSAnICc7XG4vLyBleHBvcnQgY29uc3QgZ2V0Q2xhc3NlcyA9IGFzeW5jIChjb25uZWN0ZWRSZWY6IFJlZik6IFByb21pc2U8c3RyaW5nW10+ID0+IChhd2FpdCBleGVjKGFjdEFzPEhUTUxEaXZFbGVtZW50Pihjb25uZWN0ZWRSZWYpLmNsYXNzTGlzdCkpLnZhbHVlLnNwbGl0KHNwYWNlKTtcbi8vIGV4cG9ydCBjb25zdCBhZGRDbGFzcyA9IGFzeW5jIChjb25uZWN0ZWRSZWY6IFJlZiwgY2xhc3NOYW1lOiBzdHJpbmcpID0+IHtcbi8vICAgICBjb25zdCBjbGFzc2VzID0gYXdhaXQgZ2V0Q2xhc3Nlcyhjb25uZWN0ZWRSZWYpO1xuLy8gICAgIGNsYXNzZXMuaW5jbHVkZXMoY2xhc3NOYW1lKSB8fCBjbGFzc2VzLnB1c2goY2xhc3NOYW1lKTtcbi8vICAgICAvLyBAdHMtaWdub3JlXG4vLyAgICAgY29ubmVjdGVkUmVmLmNsYXNzTGlzdCA9IGNsYXNzZXMuam9pbihzcGFjZSk7XG4vLyB9XG4vLyBleHBvcnQgY29uc3QgcmVtb3ZlQ2xhc3MgPSBhc3luYyAoY29ubmVjdGVkUmVmOiBSZWYsIGNsYXNzTmFtZTogc3RyaW5nLCkgPT4ge1xuLy8gICAgIGxldCBjbGFzc2VzID0gYXdhaXQgZ2V0Q2xhc3Nlcyhjb25uZWN0ZWRSZWYpO1xuLy8gICAgIC8vIEB0cy1pZ25vcmVcbi8vICAgICBjb25uZWN0ZWRSZWYuY2xhc3NMaXN0ID0gY2xhc3Nlcy5maWx0ZXIoYyA9PiBjICE9PSBjbGFzc05hbWUpLmpvaW4oc3BhY2UpO1xuLy8gfVxuLy9cbi8vXG5cbmV4cG9ydCBjb25zdCBhZGRDbGFzcyA9IChjb21wb25lbnQ6IElNeW9wQ29tcG9uZW50LCBjbGFzc05hbWU6IHN0cmluZywgbXlvcElkOiBzdHJpbmcpID0+IHtcbiAgICBjb21wb25lbnQuc2VuZChuZXcgQ3VzdG9tUmVmTWVzc2FnZSgoe3JlZiwgX2NsYXNzTmFtZX0pID0+IHtcbiAgICAgICAgcmVmPy5jbGFzc0xpc3QuYWRkKF9jbGFzc05hbWUpO1xuICAgIH0sIHtcbiAgICAgICAgZWxlbWVudElkOiBteW9wSWQsXG4gICAgICAgIF9jbGFzc05hbWU6IGNsYXNzTmFtZVxuICAgIH0pKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlbW92ZUNsYXNzID0gKGNvbXBvbmVudDogSU15b3BDb21wb25lbnQsIGNsYXNzTmFtZTogc3RyaW5nLCBteW9wSWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbXBvbmVudC5zZW5kKG5ldyBDdXN0b21SZWZNZXNzYWdlKCh7cmVmLCBfY2xhc3NOYW1lfSkgPT4ge1xuICAgICAgICByZWY/LmNsYXNzTGlzdC5yZW1vdmUoX2NsYXNzTmFtZSk7XG4gICAgfSwge1xuICAgICAgICBlbGVtZW50SWQ6IG15b3BJZCxcbiAgICAgICAgX2NsYXNzTmFtZTogY2xhc3NOYW1lXG4gICAgfSkpO1xufSIsICJpbXBvcnQge1xuICAgIElDb21wb25lbnRDb25maWcsXG4gICAgSUNvbXBvbmVudERlZmluaXRpb25Db25maWcsXG4gICAgSUNvbXBvbmVudEluc3RhbmNlQ29uZmlnLCBJSFRNTExvYWRlckNvbmZpZywgSVJlZkNvbmZpZyxcbiAgICBJU2tpbkxvYWRlckNvbmZpZyxcbiAgICBJU2tpblNlbGVjdG9yQ29uZmlnLFxuICAgIElEZWRpY2F0ZWRTa2luQ29uZmlnLCBJU2tpbkNvbmZpZ1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge3V1aWR2NH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLnRzXCI7XG5cbmV4cG9ydCBjbGFzcyBTa2luQ29uZmlnIGltcGxlbWVudHMgSVNraW5Db25maWcge1xuICAgIF9ydW5UaW1lSW5zdGFuY2VJZCA9ICdydW50aW1lLWluc3RhbmNlLWlkLScgKyB1dWlkdjQoKTtcbiAgICBfcnVuVGltZUlkID0gJ3J1bnRpbWUtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lTmFtZSA9ICdydW50aW1lLW5hbWUtJyArIHV1aWR2NCgpO1xuXG4gICAgc3RhdGljIGNyZWF0ZSA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBTa2luQ29uZmlnKCk7XG4gICAgfVxuXG4gICAgaWQgPSB0aGlzLl9ydW5UaW1lSWQ7XG4gICAgbmFtZSA9IHRoaXMuX3J1blRpbWVOYW1lO1xuICAgIGRlc2NyaXB0aW9uID0gJyc7XG4gICAgbG9hZGVyID0gbnVsbCBhcyB1bmtub3duIGFzIElTa2luTG9hZGVyQ29uZmlnO1xuXG4gICAgd2l0aExvYWRlciA9IChsb2FkZXI6IElTa2luTG9hZGVyQ29uZmlnKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoSFRNTExvYWRlciA9IChsb2FkZXI6IE9taXQ8SUhUTUxMb2FkZXJDb25maWcsICd0eXBlJz4pID0+IHtcbiAgICAgICAgbG9hZGVyLnR5cGUgPSAnSFRNTExvYWRlcic7XG4gICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyIGFzIElIVE1MTG9hZGVyQ29uZmlnO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBidWlsZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29tcG9uZW50Q29uZmlnIGltcGxlbWVudHMgSUNvbXBvbmVudENvbmZpZyB7XG4gICAgX3J1blRpbWVJbnN0YW5jZUlkID0gJ3J1bnRpbWUtaW5zdGFuY2UtaWQtJyArIHV1aWR2NCgpO1xuICAgIF9ydW5UaW1lSWQgPSAncnVudGltZS1pZC0nICsgdXVpZHY0KCk7XG4gICAgX3J1blRpbWVOYW1lID0gJ3J1bnRpbWUtbmFtZS0nICsgdXVpZHY0KCk7XG5cbiAgICBzdGF0aWMgY3JlYXRlID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudENvbmZpZygpO1xuICAgIH1cblxuICAgIGluc3RhbmNlID0ge1xuICAgICAgICBpZDogdGhpcy5fcnVuVGltZUluc3RhbmNlSWQsXG4gICAgICAgIGNvbXBvbmVudElkOiB0aGlzLl9ydW5UaW1lSWQsXG4gICAgICAgIGNvbXBvbmVudE5hbWU6IHRoaXMuX3J1blRpbWVOYW1lLFxuICAgICAgICBza2luU2VsZWN0b3I6IG51bGwgYXMgdW5rbm93biBhcyBJU2tpblNlbGVjdG9yQ29uZmlnXG4gICAgfSBhcyBJQ29tcG9uZW50SW5zdGFuY2VDb25maWc7XG5cbiAgICBuYW1lID0gdGhpcy5fcnVuVGltZU5hbWVcbiAgICB0eXBlID0ge1xuICAgICAgICBpZDogdGhpcy5fcnVuVGltZUlkLFxuICAgICAgICBuYW1lOiB0aGlzLl9ydW5UaW1lTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICBwcm9wczogW10sXG4gICAgICAgIHJlZnM6IFtdLFxuICAgICAgICBza2luczogW10sXG4gICAgICAgIGRlZmF1bHRTa2luOiAwXG4gICAgfSBhcyBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZ1xuXG4gICAgd2l0aEluc3RhbmNlID0gKGluc3RhbmNlOiBJQ29tcG9uZW50SW5zdGFuY2VDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoVHlwZSA9ICh0eXBlOiBJQ29tcG9uZW50RGVmaW5pdGlvbkNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoTmFtZSA9IChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aERlZmF1bHRTa2luID0gKGRlZmF1bHRTa2luOiBJU2tpbkNvbmZpZykgPT4ge1xuICAgICAgICB0aGlzLnR5cGUuc2tpbnMucHVzaChkZWZhdWx0U2tpbik7XG4gICAgICAgIHRoaXMudHlwZS5kZWZhdWx0U2tpbiA9IHRoaXMudHlwZS5za2lucy5sZW5ndGggLSAxO1xuICAgICAgICB0aGlzLmluc3RhbmNlLnNraW5TZWxlY3RvciA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdEZWRpY2F0ZWQnLFxuICAgICAgICAgICAgc2tpbjoge1xuICAgICAgICAgICAgICAgIGlkOiBkZWZhdWx0U2tpbi5pZFxuICAgICAgICAgICAgfVxuICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnXG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2l0aFJlZiA9IChyZWY6IElSZWZDb25maWcpID0+IHtcbiAgICAgICAgdGhpcy50eXBlLnJlZnMucHVzaChyZWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB3aXRoQmFzaWNSZWYgPSAocmVmU2VsZWN0b3I6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBuZXdCYXNpY1JlZiA9IHtcbiAgICAgICAgICAgIGlkOiAnJyxcbiAgICAgICAgICAgIG5hbWU6IHJlZlNlbGVjdG9yLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAgICAgc2VsZWN0b3JUeXBlOiAnaWQtYXR0cmlidXRlJyxcbiAgICAgICAgICAgIHNlbGVjdG9yOiByZWZTZWxlY3RvcixcbiAgICAgICAgICAgIGJlaGF2aW9yOiB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NvZGUnXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gYXMgSVJlZkNvbmZpZ1xuXG4gICAgICAgIHRoaXMudHlwZS5yZWZzLnB1c2gobmV3QmFzaWNSZWYpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBidWlsZCA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcykpXG4gICAgfVxufVxuIiwgImltcG9ydCB7SVVzZXJGbG93fSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbi8qKlxuICpcbiAqICMjIE92ZXJ2aWV3XG4gKlxuICogVGhlIGBDbG91ZFJlcG9zaXRvcnlgIGNsYXNzIHNlcnZlcyBhcyBhIGNlbnRyYWxpemVkIGRhdGEgYWNjZXNzIGxheWVyIGZvciByZXRyaWV2aW5nIHVzZXIgZmxvd3MgYW5kIGNvbXBvbmVudHMgZnJvbSB0aGUgTXlvcC5kZXYgY2xvdWQgc2VydmljZS4gSXQgaW1wbGVtZW50cyBhIHNpbmdsZXRvbiBwYXR0ZXJuIGFuZCBwcm92aWRlcyBjYWNoaW5nIG1lY2hhbmlzbXMgdG8gb3B0aW1pemUgQVBJIGNhbGxzIGFuZCBpbXByb3ZlIHBlcmZvcm1hbmNlLlxuICpcbiAqICMjIENsYXNzIFN0cnVjdHVyZVxuICpcbiAqICMjIyBDb25zdHJ1Y3RvclxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jhc2VVcmwgPSAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldicpXG4gKiBgYGBcbiAqXG4gKiAqKlBhcmFtZXRlcnM6KipcbiAqIC0gYF9iYXNlVXJsYCAob3B0aW9uYWwpOiBUaGUgYmFzZSBVUkwgZm9yIHRoZSBNeW9wLmRldiBjbG91ZCBBUEkuIERlZmF1bHRzIHRvIGAnaHR0cHM6Ly9jbG91ZC5teW9wLmRldidgXG4gKlxuICogIyMjIFN0YXRpYyBQcm9wZXJ0aWVzXG4gKlxuICogIyMjIyBNYWluXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBzdGF0aWMgTWFpbiA9IG5ldyBDbG91ZFJlcG9zaXRvcnkoKTtcbiAqIGBgYFxuICpcbiAqIEEgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBgQ2xvdWRSZXBvc2l0b3J5YCBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRocm91Z2hvdXQgdGhlIGFwcGxpY2F0aW9uIHdpdGhvdXQgY3JlYXRpbmcgbXVsdGlwbGUgaW5zdGFuY2VzLlxuICpcbiAqICMjIyBQcml2YXRlIFByb3BlcnRpZXNcbiAqXG4gKiAjIyMjIHVzZXJGbG93c1xuICogYGBgdHlwZXNjcmlwdFxuICogcHJpdmF0ZSB1c2VyRmxvd3M6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8SVVzZXJGbG93Pj4gPSB7fTtcbiAqIGBgYFxuICpcbiAqIEEgY2FjaGUgb2JqZWN0IHRoYXQgc3RvcmVzIHByb21pc2VzIGZvciB1c2VyIGZsb3dzLCBpbmRleGVkIGJ5IGZsb3cgSUQuIFRoaXMgcHJldmVudHMgZHVwbGljYXRlIEFQSSBjYWxscyBmb3IgdGhlIHNhbWUgZmxvdyBhbmQgZW5zdXJlcyBjb25zaXN0ZW50IGRhdGEgcmV0cmlldmFsLlxuICpcbiAqICMjIyMgX2Jhc2VVcmxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHByaXZhdGUgX2Jhc2VVcmw6IHN0cmluZ1xuICogYGBgXG4gKlxuICogVGhlIGJhc2UgVVJMIGZvciB0aGUgY2xvdWQgQVBJIGVuZHBvaW50cywgc2V0IGR1cmluZyBjb25zdHJ1Y3Rpb24uXG4gKlxuICogIyMgTWV0aG9kc1xuICpcbiAqICMjIyBmZXRjaEZsb3coZmxvd0lkOiBzdHJpbmcpXG4gKlxuICogUmV0cmlldmVzIGEgY29tcGxldGUgdXNlciBmbG93IGZyb20gdGhlIGNsb3VkIHJlcG9zaXRvcnksIGluY2x1ZGluZyBhbGwgcmVzb2x2ZWQgY29tcG9uZW50cy5cbiAqXG4gKiAqKlBhcmFtZXRlcnM6KipcbiAqIC0gYGZsb3dJZGA6IFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVzZXIgZmxvdyB0byByZXRyaWV2ZVxuICpcbiAqICoqUmV0dXJuczoqKlxuICogLSBgUHJvbWlzZTxJVXNlckZsb3c+YDogQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGNvbXBsZXRlIHVzZXIgZmxvdyBvYmplY3RcbiAqXG4gKiAqKkJlaGF2aW9yOioqXG4gKiAtIEltcGxlbWVudHMgcmVxdWVzdCBjYWNoaW5nIHRvIGF2b2lkIGR1cGxpY2F0ZSBBUEkgY2FsbHMgZm9yIHRoZSBzYW1lIGZsb3cgSURcbiAqIC0gTWFrZXMgYSBHRVQgcmVxdWVzdCB0byBgL2Zsb3c/aWQ9e2Zsb3dJZH0mcmVzb2x2ZT1jb21wb25lbnRzYFxuICogLSBBdXRvbWF0aWNhbGx5IHJlc29sdmVzIGNvbXBvbmVudCByZWZlcmVuY2VzIHdpdGhpbiB0aGUgZmxvd1xuICogLSBTdG9yZXMgdGhlIHByb21pc2UgaW4gdGhlIGNhY2hlIGZvciBmdXR1cmUgdXNlXG4gKlxuICogKipFeGFtcGxlIFVzYWdlOioqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KCdteS1mbG93LWlkJyk7XG4gKiBjb25zb2xlLmxvZyhmbG93LmNvbXBvbmVudHMpO1xuICogYGBgXG4gKlxuICogIyMjIGZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkOiBzdHJpbmcsIGZsb3dJZDogc3RyaW5nKVxuICpcbiAqIFJldHJpZXZlcyBhIHNwZWNpZmljIGNvbXBvbmVudCBmcm9tIHdpdGhpbiBhIHVzZXIgZmxvdy5cbiAqXG4gKiAqKlBhcmFtZXRlcnM6KipcbiAqIC0gYGNvbXBvbmVudElkYDogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY29tcG9uZW50IHRvIHJldHJpZXZlXG4gKiAtIGBmbG93SWRgOiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB1c2VyIGZsb3cgY29udGFpbmluZyB0aGUgY29tcG9uZW50XG4gKlxuICogKipSZXR1cm5zOioqXG4gKiAtIGBQcm9taXNlPENvbXBvbmVudCB8IHVuZGVmaW5lZD5gOiBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgY29tcG9uZW50IG9iamVjdCBpZiBmb3VuZCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICpcbiAqICoqQmVoYXZpb3I6KipcbiAqIC0gRmlyc3QgZmV0Y2hlcyB0aGUgY29tcGxldGUgZmxvdyB1c2luZyBgZmV0Y2hGbG93KClgXG4gKiAtIFNlYXJjaGVzIHRocm91Z2ggdGhlIGZsb3cncyBjb21wb25lbnRzIGFycmF5IHRvIGZpbmQgdGhlIG1hdGNoaW5nIGNvbXBvbmVudFxuICogLSBVc2VzIHRoZSBjb21wb25lbnQncyBgdHlwZS5pZGAgcHJvcGVydHkgZm9yIG1hdGNoaW5nXG4gKlxuICogKipFeGFtcGxlIFVzYWdlOioqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBjb21wb25lbnQgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaENvbXBvbmVudCgnYnV0dG9uLWNvbXBvbmVudCcsICdteS1mbG93LWlkJyk7XG4gKiBpZiAoY29tcG9uZW50KSB7XG4gKiAgICAgY29uc29sZS5sb2coJ0NvbXBvbmVudCBmb3VuZDonLCBjb21wb25lbnQpO1xuICogfSBlbHNlIHtcbiAqICAgICBjb25zb2xlLmxvZygnQ29tcG9uZW50IG5vdCBmb3VuZCBpbiBmbG93Jyk7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiAjIyBBUEkgSW50ZWdyYXRpb25cbiAqXG4gKiAjIyMgRW5kcG9pbnQgU3RydWN0dXJlXG4gKlxuICogVGhlIGNsYXNzIGludGVncmF0ZXMgd2l0aCB0aGUgZm9sbG93aW5nIE15b3AuZGV2IGNsb3VkIEFQSSBlbmRwb2ludDpcbiAqXG4gKiBgYGBcbiAqIEdFVCB7YmFzZVVybH0vZmxvdz9pZD17Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNcbiAqIGBgYFxuICpcbiAqICoqUXVlcnkgUGFyYW1ldGVyczoqKlxuICogLSBgaWRgOiBUaGUgZmxvdyBpZGVudGlmaWVyXG4gKiAtIGByZXNvbHZlPWNvbXBvbmVudHNgOiBJbnN0cnVjdHMgdGhlIEFQSSB0byBpbmNsdWRlIHJlc29sdmVkIGNvbXBvbmVudCBkYXRhIGluIHRoZSByZXNwb25zZVxuICpcbiAqICMjIyBSZXNwb25zZSBGb3JtYXRcbiAqXG4gKiBUaGUgQVBJIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhIEpTT04gcmVzcG9uc2Ugd2l0aCB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZTpcbiAqXG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgICAgXCJpdGVtXCI6IHtcbiAqICAgICAgICAgLy8gSVVzZXJGbG93IG9iamVjdCB3aXRoIHJlc29sdmVkIGNvbXBvbmVudHNcbiAqICAgICAgICAgXCJjb21wb25lbnRzXCI6IFtcbiAqICAgICAgICAgICAgIHtcbiAqICAgICAgICAgICAgICAgICBcInR5cGVcIjoge1xuICogICAgICAgICAgICAgICAgICAgICBcImlkXCI6IFwiY29tcG9uZW50LWlkXCJcbiAqICAgICAgICAgICAgICAgICB9XG4gKiAgICAgICAgICAgICAgICAgLy8gLi4uIG90aGVyIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gKiAgICAgICAgICAgICB9XG4gKiAgICAgICAgIF1cbiAqICAgICAgICAgLy8gLi4uIG90aGVyIGZsb3cgcHJvcGVydGllc1xuICogICAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIENhY2hpbmcgU3RyYXRlZ3lcbiAqXG4gKiBUaGUgYENsb3VkUmVwb3NpdG9yeWAgaW1wbGVtZW50cyBhIHByb21pc2UtYmFzZWQgY2FjaGluZyBtZWNoYW5pc206XG4gKlxuICogMS4gKipDYWNoZSBLZXkqKjogRmxvdyBJRCBpcyB1c2VkIGFzIHRoZSBjYWNoZSBrZXlcbiAqIDIuICoqQ2FjaGUgVmFsdWUqKjogUHJvbWlzZXMgYXJlIGNhY2hlZCByYXRoZXIgdGhhbiByZXNvbHZlZCB2YWx1ZXMgdG8gaGFuZGxlIGNvbmN1cnJlbnQgcmVxdWVzdHNcbiAqIDMuICoqQ2FjaGUgRHVyYXRpb24qKjogQ2FjaGUgcGVyc2lzdHMgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgcmVwb3NpdG9yeSBpbnN0YW5jZVxuICogNC4gKipDYWNoZSBJbnZhbGlkYXRpb24qKjogTm8gYXV0b21hdGljIGNhY2hlIGludmFsaWRhdGlvbiBpcyBpbXBsZW1lbnRlZFxuICpcbiAqICMjIEVycm9yIEhhbmRsaW5nXG4gKlxuICogLSBOZXR3b3JrIGVycm9ycyBhbmQgQVBJIGZhaWx1cmVzIGFyZSBwcm9wYWdhdGVkIHRocm91Z2ggcHJvbWlzZSByZWplY3Rpb25cbiAqIC0gTm8gc3BlY2lmaWMgZXJyb3IgaGFuZGxpbmcgb3IgcmV0cnkgbG9naWMgaXMgaW1wbGVtZW50ZWQgYXQgdGhlIHJlcG9zaXRvcnkgbGV2ZWxcbiAqIC0gQ29uc3VtZXJzIHNob3VsZCBpbXBsZW1lbnQgYXBwcm9wcmlhdGUgZXJyb3IgaGFuZGxpbmcgd2hlbiBjYWxsaW5nIHJlcG9zaXRvcnkgbWV0aG9kc1xuICpcbiAqICMjIFVzYWdlIFBhdHRlcm5zXG4gKlxuICogIyMjIFNpbmdsZXRvbiBBY2Nlc3NcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IENsb3VkUmVwb3NpdG9yeSB9IGZyb20gJy4vcGF0aC90by9DbG91ZFJlcG9zaXRvcnknO1xuICpcbiAqIC8vIFVzZSB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gKiBjb25zdCBmbG93ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hGbG93KCdmbG93LWlkJyk7XG4gKiBgYGBcbiAqXG4gKiAjIyMgQ3VzdG9tIEluc3RhbmNlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBjdXN0b20gaW5zdGFuY2Ugd2l0aCBkaWZmZXJlbnQgYmFzZSBVUkxcbiAqIGNvbnN0IGN1c3RvbVJlcG8gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCdodHRwczovL2N1c3RvbS1hcGkuZXhhbXBsZS5jb20nKTtcbiAqIGNvbnN0IGZsb3cgPSBhd2FpdCBjdXN0b21SZXBvLmZldGNoRmxvdygnZmxvdy1pZCcpO1xuICogYGBgXG4gKlxuICogIyMjIENvbXBvbmVudCBSZXRyaWV2YWxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIEdldCBhIHNwZWNpZmljIGNvbXBvbmVudCBmcm9tIGEgZmxvd1xuICogY29uc3QgY29tcG9uZW50ID0gYXdhaXQgQ2xvdWRSZXBvc2l0b3J5Lk1haW4uZmV0Y2hDb21wb25lbnQoJ2NvbXBvbmVudC1pZCcsICdmbG93LWlkJyk7XG4gKiBgYGBcbiAqXG4gKiAjIyBEZXBlbmRlbmNpZXNcbiAqXG4gKiAtICoqSVVzZXJGbG93Kio6IEludGVyZmFjZSBpbXBvcnRlZCBmcm9tIGAuLi9jb21tb25gIHRoYXQgZGVmaW5lcyB0aGUgc3RydWN0dXJlIG9mIHVzZXIgZmxvdyBvYmplY3RzXG4gKiAtICoqRmV0Y2ggQVBJKio6IFVzZXMgdGhlIG5hdGl2ZSBgZmV0Y2hgIGZ1bmN0aW9uIGZvciBIVFRQIHJlcXVlc3RzXG4gKlxuICogIyMgUGVyZm9ybWFuY2UgQ29uc2lkZXJhdGlvbnNcbiAqXG4gKiAtICoqQ2FjaGluZyoqOiBQcmV2ZW50cyBkdXBsaWNhdGUgQVBJIGNhbGxzIGZvciB0aGUgc2FtZSBmbG93IElEXG4gKiAtICoqUHJvbWlzZSBDYWNoaW5nKio6IEhhbmRsZXMgY29uY3VycmVudCByZXF1ZXN0cyBlZmZpY2llbnRseSBieSBjYWNoaW5nIHByb21pc2VzXG4gKiAtICoqQ29tcG9uZW50IFJlc29sdXRpb24qKjogVGhlIGByZXNvbHZlPWNvbXBvbmVudHNgIHBhcmFtZXRlciBlbnN1cmVzIGNvbXBvbmVudHMgYXJlIGZ1bGx5IHJlc29sdmVkIGluIGEgc2luZ2xlIEFQSSBjYWxsXG4gKlxuICogIyMgRnV0dXJlIEVuaGFuY2VtZW50c1xuICpcbiAqIFRoZSBjbGFzcyBzdHJ1Y3R1cmUgc3VnZ2VzdHMgcGxhbm5lZCBmdW5jdGlvbmFsaXR5IHRoYXQgY291bGQgYmUgaW1wbGVtZW50ZWQ6XG4gKlxuICogLSAqKkNvbXBvbmVudCBDYWNoaW5nKio6IFRoZSBjb21tZW50ZWQgYGNvbXBvbmVudHNgIHByb3BlcnR5IGluZGljYXRlcyBwb3RlbnRpYWwgaW5kaXZpZHVhbCBjb21wb25lbnQgY2FjaGluZ1xuICogLSAqKkNhY2hlIEludmFsaWRhdGlvbioqOiBNZXRob2RzIHRvIGNsZWFyIG9yIHJlZnJlc2ggY2FjaGVkIGRhdGFcbiAqIC0gKipFcnJvciBSZXRyeSBMb2dpYyoqOiBBdXRvbWF0aWMgcmV0cnkgbWVjaGFuaXNtcyBmb3IgZmFpbGVkIHJlcXVlc3RzXG4gKiAtICoqQmF0Y2ggT3BlcmF0aW9ucyoqOiBNZXRob2RzIHRvIGZldGNoIG11bHRpcGxlIGZsb3dzIG9yIGNvbXBvbmVudHMgaW4gYSBzaW5nbGUgcmVxdWVzdFxuICpcbiAqL1xuZXhwb3J0IGNsYXNzIENsb3VkUmVwb3NpdG9yeSB7XG4gICAgc3RhdGljIE1haW4gPSBuZXcgQ2xvdWRSZXBvc2l0b3J5KCk7XG5cbiAgICBwcml2YXRlIHVzZXJGbG93czogUmVjb3JkPHN0cmluZywgUHJvbWlzZTxJVXNlckZsb3c+PiA9IHt9O1xuXG4gICAgLy8gcHJpdmF0ZSBjb21wb25lbnRzOiBSZWNvcmQ8c3RyaW5nLCBQcm9taXNlPElVc2VyRmxvdz4+ID0ge307XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9iYXNlVXJsID0gJ2h0dHBzOi8vY2xvdWQubXlvcC5kZXYnKSB7XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hDb21wb25lbnQoY29tcG9uZW50SWQ6IHN0cmluZywgZmxvd0lkPzogc3RyaW5nKSB7XG4gICAgICAgIGlmIChmbG93SWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCB0aGlzLmZldGNoRmxvdyhmbG93SWQpO1xuICAgICAgICAgICAgcmV0dXJuIGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRJZCk7XG4gICAgICAgIH1lbHNle1xuICAgICAgICAgICAgY29uc3QgZmxvdyA9IGF3YWl0IHRoaXMuZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZCk7XG4gICAgICAgICAgICByZXR1cm4gZmxvdy5jb21wb25lbnRzWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZmV0Y2hBdXRvRmxvdyhjb21wb25lbnRJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXN5bmMtcHJvbWlzZS1leGVjdXRvclxuICAgICAgICAgICAgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5fYmFzZVVybH0vZmxvdz9pZD0ke2NvbXBvbmVudElkfSZhdXRvPXRydWVgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbY29tcG9uZW50SWRdO1xuICAgIH1cblxuXG4gICAgYXN5bmMgZmV0Y2hGbG93KGZsb3dJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGhpcy51c2VyRmxvd3NbZmxvd0lkXSkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFzeW5jLXByb21pc2UtZXhlY3V0b3JcbiAgICAgICAgICAgIHRoaXMudXNlckZsb3dzW2Zsb3dJZF0gPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICBhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLl9iYXNlVXJsfS9mbG93P2lkPSR7Zmxvd0lkfSZyZXNvbHZlPWNvbXBvbmVudHNgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGpzb24uaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy51c2VyRmxvd3NbZmxvd0lkXTtcbiAgICB9XG59XG4iLCAiZXhwb3J0IGNvbnN0IGV4ZWMgPSBhc3luYyAoZ2V0dGVyOiBhbnkpID0+IHtcbiAgICByZXR1cm4gYXdhaXQgZ2V0dGVyKClcbn1cbiIsICJleHBvcnQgKiBmcm9tIFwiLi9hcHBseVN0eWxlc2hlZXRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2lmcmFtZVNraW5VcmxUb2tlbml6ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NsYXNzTGlzdFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vY29uZmlnQnVpbGRlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vQ2xvdWRSZXBvc2l0b3J5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leGVjXCI7XG4iLCAiaW1wb3J0IHtkZWNvbXByZXNzVVVJRHN9IGZyb20gXCIuLi91dGlscy91dWlkLnRzXCI7XG5pbXBvcnQge0Nsb3VkUmVwb3NpdG9yeX0gZnJvbSBcIi4uL2hlbHBlcnNcIjtcbmltcG9ydCB7XG4gICAgRXhwZXJpZW5jZVR5cGVzLFxuICAgIElDb21wb25lbnRDb25maWcsIElEZWRpY2F0ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50ZWRTa2luQ29uZmlnLFxuICAgIElTZWdtZW50RXhwZXJpZW5jZSwgSVNraW5JbnN0YW5jZUNvbmZpZyxcbiAgICBTa2luU2VsZWN0b3JUeXBlc1xufSBmcm9tIFwiLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjb25zdCBjaGVja015b3BPdmVycmlkZSA9IGFzeW5jIChjb21wb25lbnRDb25maWc6IElDb21wb25lbnRDb25maWcpOiBQcm9taXNlPElDb21wb25lbnRDb25maWcgfCBudWxsPiA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy9UT0RPOiBzdXBwb3J0IGRpc2FibGluZyB0aGUgbWVjaGFuaXNtXG4gICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHVybC5zZWFyY2gpO1xuICAgICAgICBjb25zdCBteW9wT3ZlcnJpZGUgPSBwYXJhbXMuZ2V0KCdteW9wT3ZlcnJpZGUnKTtcbiAgICAgICAgaWYgKG15b3BPdmVycmlkZSkge1xuICAgICAgICAgICAgY29uc3QgW3NvdXJjZSwgLi4udXVpZHNdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAoc291cmNlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29tcG9uZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbY29tcG9uZW50SWQsIHNraW5JZF0gPSB1dWlkcztcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGF3YWl0IENsb3VkUmVwb3NpdG9yeS5NYWluLmZldGNoQ29tcG9uZW50KGNvbXBvbmVudElkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudFRvT3ZlcnJpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZG86IGNoZWNrIGZldGNoQXV0b0Zsb3cuIExvb2tzIGxpa2Ugb25seSBvbmUgc2tpbiBpcyByZXR1cm5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2tpbiA9IGNvbXBvbmVudFRvT3ZlcnJpZGUudHlwZS5za2lucy5maW5kKHNraW4gPT4gc2tpbi5pZCA9PT0gc2tpbklkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChza2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9kbzogZm9yIG5vdyBqdXN0IHNldCBza2luIGlkLiBDaGVjayB0aGUgY2xvdWQgaW1wbGVtZW50YXRpb25cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBTa2luU2VsZWN0b3JUeXBlcy5EZWRpY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNraW46IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBza2luSWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBhcyBJU2tpbkluc3RhbmNlQ29uZmlnXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGFzIElEZWRpY2F0ZWRTa2luQ29uZmlnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFRvT3ZlcnJpZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAvLyAgICBjYXNlICdmbG93Jzoge1xuICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7XG4gICAgICAgICAgICAgICAgICAgLy8gY29uc3QgW2Zsb3dJZCwgZXhwZXJpbWVudElkXSA9IHV1aWRzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBbZmxvd0lkLCBleHBlcmltZW50SWRdID0gZGVjb21wcmVzc1VVSURzKG15b3BPdmVycmlkZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb3cgPSBhd2FpdCBDbG91ZFJlcG9zaXRvcnkuTWFpbi5mZXRjaEZsb3coZmxvd0lkKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VG9PdmVycmlkZSA9IGZsb3cuY29tcG9uZW50cy5maW5kKGMgPT4gYy50eXBlLmlkID09PSBjb21wb25lbnRDb25maWcudHlwZS5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRUb092ZXJyaWRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5za2luU2VsZWN0b3IudHlwZSA9PT0gU2tpblNlbGVjdG9yVHlwZXMuU2VnbWVudGVkKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50VG9PdmVycmlkZS5pbnN0YW5jZS5yZXNvbHZlZEV4cGVyaWVuY2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkRXhwZXJpZW5jZSA9IGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2UucmVzb2x2ZWRFeHBlcmllbmNlcy5maW5kKGUgPT4gZS5pZCA9PT0gZXhwZXJpbWVudElkKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRFeHBlcmllbmNlPy50eXBlID09PSBFeHBlcmllbmNlVHlwZXMuU2VnbWVudCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlZFJlc29sdmVkRXhwZXJpZW5jZSA9IHJlc29sdmVkRXhwZXJpZW5jZSBhcyBJU2VnbWVudEV4cGVyaWVuY2VcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZWRTa2luU2VsZWN0b3IgPSBjb21wb25lbnRUb092ZXJyaWRlLmluc3RhbmNlLnNraW5TZWxlY3RvciBhcyBJU2VnbWVudGVkU2tpbkNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHR5cGVkU2tpblNlbGVjdG9yLnNlZ21lbnRzLmZpbmQocyA9PiBzLnNlZ21lbnRJZCA9PT0gdHlwZWRSZXNvbHZlZEV4cGVyaWVuY2Uuc2VnbWVudC5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRvT3ZlcnJpZGUuaW5zdGFuY2Uuc2tpblNlbGVjdG9yID0gc2VnbWVudD8uc2tpblNlbGVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRUb092ZXJyaWRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCAiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqIFRoZSBIb3N0IFNESyBpcyBkZXNpZ25lZCBmb3IgaW50ZWdyYXRpb24gd2l0aGluIHRoZSBob3N0IGFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIGFzIHRoZSBjb250YWluZXIgZm9yIE15b3AgIGNvbXBvbmVudHMuPGJyLz48YnIvPlxuICogSXQgcHJvdmlkZXMgZXNzZW50aWFsIGZ1bmN0aW9uYWxpdGllcyBhbmQgQVBJcyBmb3IgcmVnaXN0ZXJpbmcsIG1hbmFnaW5nLCBhbmQgY29tbXVuaWNhdGluZyB3aXRoIE15b3AgY29tcG9uZW50cy48YnIvPjxici8+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/OiBib29sZWFuLFxuICAgIGNvbm5lY3RQcm9wcz86IGJvb2xlYW5cbiAgICB0aW1lb3V0PzogbnVtYmVyLFxuICAgIHNraXBJbml0PzogYm9vbGVhbixcbiAgICByZWxhdGl2ZT86IHJlbGF0aXZlTG9hZENvbmZpZyxcbiAgICBob29rcz86IGxvYWRlckhvb2tzLFxuICAgIGVsZW1lbnRBdHRyaWJ1dGVzPzogRWxlbWVudEF0dHJpYnV0ZXMsXG4gICAgX2Vudmlyb25tZW50PzogSUVudmlyb25tZW50LFxuICAgIF9oYXNQYXJlbnQ/OiBib29sZWFuXG4gICAgX2luc3BlY3Rpb24/OiBib29sZWFuXG59XG5cbmlmICghd2luZG93Lm15b3ApIHtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fXG4gICAgfTtcbn1cblxuaWYgKCF3aW5kb3cubXlvcC5ob3N0U0RLKSB7XG4gICAgY29uc3QgX2hvc3RTREsgPSBuZXcgSG9zdFNESygpO1xuICAgIC8vVE9ETzogZW5hYmxlIGxhenkgaW5pdD9cbiAgICBfaG9zdFNESy5pbml0KCk7XG5cbiAgICBpZiAoIXdpbmRvdy5teW9wKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AgPSB7XG4gICAgICAgICAgICBfX1JPT1RfU0RLX1BVQkxJQ19VUkxfX1xuICAgICAgICB9O1xuICAgIH1cbiAgICB3aW5kb3cubXlvcC5ob3N0U0RLID0gX2hvc3RTREs7XG59XG5cbi8vIEB0cy1pZ25vcmVcbmV4cG9ydCBjb25zdCBob3N0U0RLOiBIb3N0U0RLID0gd2luZG93Lm15b3AuaG9zdFNESztcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnaG9zdFNESycsIGhvc3RTREspO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIG15b3A6IHtcbiAgICAgICAgICAgIF9fUk9PVF9TREtfUFVCTElDX1VSTF9fOiBzdHJpbmcsXG4gICAgICAgICAgICBob3N0U0RLOiBIb3N0U0RLLFxuICAgICAgICAgICAgSWZyYW1lU0RLOiBJbnN0YW5jZVR5cGU8dHlwZW9mIElmcmFtZVNESz5cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7bXlvcEF0dHJpYnV0ZXN9IGZyb20gXCIuLi8uLi9jb25zdHNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyLCBJRWxlbWVudFJlZiwgTXlvcEVsZW1lbnRSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UsIERldGVjdE15b3BSZWZzTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBEZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPERldGVjdE15b3BSZWZzTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRGV0ZWN0TXlvcFJlZnNNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAobWVzc2FnZTogRGV0ZWN0TXlvcFJlZnNNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsbE15b3BJdGVtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYFske215b3BBdHRyaWJ1dGVzLmlkfV1gKTtcbiAgICAgICAgLy9jb25zdCBhbGxNeW9wSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGAqYCk7XG5cbiAgICAgICAgbGV0IG15b3BSZWZzOiBJRWxlbWVudFJlZltdID0gW107XG5cbiAgICAgICAgLy9sZXQgY291bnRlcnM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcblxuICAgICAgICBhbGxNeW9wSXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgbXlvcElkID0gaXRlbS5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgaWYgKG15b3BJZCkge1xuICAgICAgICAgICAgICAgIG15b3BSZWZzLnB1c2gobmV3IE15b3BFbGVtZW50UmVmKG15b3BJZCwgaXRlbS50YWdOYW1lLCBpdGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKSlcbiAgICAgICAgICAgIH0gLy9lbHNlIHtcbiAgICAgICAgICAgIC8vICAgICBpZiAoIWNvdW50ZXJzW2l0ZW0udGFnTmFtZV0pIHtcbiAgICAgICAgICAgIC8vICAgICAgICAgY291bnRlcnNbaXRlbS50YWdOYW1lXSA9IDA7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gICAgIGNvdW50ZXJzW2l0ZW0udGFnTmFtZV0gPSBjb3VudGVyc1tpdGVtLnRhZ05hbWVdICsgMTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvLyAgICAgbXlvcFJlZnMucHVzaChuZXcgWFBhdGhFbGVtZW50UmVmKGAke2l0ZW0udGFnTmFtZX0oJHtjb3VudGVyc1tpdGVtLnRhZ05hbWVdfSlgLCBpdGVtLnRhZ05hbWUsIGl0ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpKVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRGV0ZWN0ZWRNeW9wUmVmc01lc3NhZ2UobWVzc2FnZS5oYW5kbGVyVW5pcXVlSWQsIG15b3BSZWZzKSlcbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtCaW5kQ2xpY2tNZXNzYWdlLCBDbGlja1JlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBCaW5kT25DbGlja0hhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8QmluZENsaWNrTWVzc2FnZT4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQmluZENsaWNrTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBCaW5kQ2xpY2tNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCBoYW5kbGVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgQ2xpY2tSZXBsYXlNZXNzYWdlKCksIGV2ZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgaGFuZGxlcik7XG5cbiAgICAgICAgICAgIGNvbnN0IGNsZWFuVXBUYXNrID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVyKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2xlYW51cFRhc2tzLnB1c2goY2xlYW5VcFRhc2spO1xuICAgICAgICB9KTtcblxuICAgICAgICAvL2NsZWFuIHVwXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBjbGVhbnVwVGFza3MuZm9yRWFjaCh0YXNrID0+IHRhc2soKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHsgTXlvcE1lc3NhZ2VzIH0gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7Q2hhbmdlVGV4dE1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlVGV4dEhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8Q2hhbmdlVGV4dE1lc3NhZ2U+IHtcbiAgXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuQ2hhbmdlVGV4dE1lc3NhZ2U7XG4gICAgXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENoYW5nZVRleHRNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gZ2V0RWxlbWVudHNCeVJlZihldmVudC5yZWYsIGRvY3VtZW50KTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIGl0ZW0udGV4dENvbnRlbnQgPSBldmVudC5jb250ZW50O1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIEV4ZWN1dGVTY3JpcHRSZXBseU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXIsIFJvb3RSZWZ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdEhhbmRsZXJFeGVjdXRvcn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXIudHNcIjtcblxuZXhwb3J0IGNsYXNzIEV4ZWN1dGVTY3JpcHRIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuRXhlY3V0ZVNjcmlwdE1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCByZXBsaWVyID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5tZXNzYWdlVG9Ib3N0KG5ldyBFeGVjdXRlU2NyaXB0UmVwbHlNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgZGF0YSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIEV4ZWN1dGVTY3JpcHRIYW5kbGVyRXhlY3V0b3IoZXZlbnQsIHJlcGxpZXIsIG5ldyBSb290UmVmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0FkZEV2ZW50TGlzdGVuZXJNZXNzYWdlLCBFdmVudExpc3RlbmVyQ2FsbGJhY2tNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7bWFrZVNlcmlhbGl6YWJsZX0gZnJvbSBcIi4uLy4uL2NvbW1vbi91dGlscy9zZXJpYWxpemF0aW9uLnRzXCI7XG5pbXBvcnQge2dldEVsZW1lbnRzQnlSZWZ9IGZyb20gXCIuLi8uLi9jb21tb24vbWVzc2FnZUhhbmRsZXJzL2hlbHBlcnNcIjtcblxuZXhwb3J0IGNsYXNzIEFkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5BZGRFdmVudExpc3RlbmVyTWVzc2FnZTtcblxuICAgIGV4ZWN1dG9yID0gKG1lc3NhZ2U6IEFkZEV2ZW50TGlzdGVuZXJNZXNzYWdlKSA9PiB7XG5cbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKG1lc3NhZ2UucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGNvbnN0IGNsZWFudXBUYXNrczogYW55W10gPSBbXTtcbiAgICAgICAgaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgLy9UT0RPOiB0aGluayBhYm91dCB0aGF0IHJlcXVlc3RBbmltYXRpb25GcmFtZVxuICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgRXZlbnRMaXN0ZW5lckNhbGxiYWNrTWVzc2FnZShtZXNzYWdlLmhhbmRsZXJVbmlxdWVJZCwgbWFrZVNlcmlhbGl6YWJsZShlLCBtZXNzYWdlLnNlcmlhbGl6YWJsZVNrZWxldG9uKSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGl0ZW0uYWRkRXZlbnRMaXN0ZW5lcihtZXNzYWdlLnR5cGUsIGhhbmRsZXIpXG4gICAgICAgICAgICBjbGVhbnVwVGFza3MucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXRlbS5yZW1vdmVFdmVudExpc3RlbmVyKG1lc3NhZ2UudHlwZSwgaGFuZGxlcilcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXBUYXNrcy5mb3JFYWNoKHRhc2sgPT4ge1xuICAgICAgICAgICAgICAgIHRhc2soKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldEF0dHJpYnV0ZU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3Mgc2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxTZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5TZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBnZXRFbGVtZW50c0J5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpO1xuICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgaXRlbS5zZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSwgZXZlbnQudmFsdWUpXG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgImltcG9ydCB7TXlvcE1lc3NhZ2VzfSBmcm9tIFwiLi4vLi4vY29tbW9uL015b3BNZXNzYWdlc1wiO1xuaW1wb3J0IHtteW9wQXR0cmlidXRlc30gZnJvbSBcIi4uLy4uL2NvbnN0c1wiO1xuaW1wb3J0IHtCYXNlTWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuLi8uLi9jb21tb25cIjtcbmltcG9ydCB7SG9zdFNES30gZnJvbSBcIi4uLy4uL2hvc3QvaG9zdFNES1wiO1xuaW1wb3J0IHtDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlLCBSZWZDb21wb25lbnRDcmVhdGVkTWVzc2FnZX0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzL0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UudHNcIjtcbmltcG9ydCB7SU15b3BDb21wb25lbnR9IGZyb20gXCIuLi8uLi9ob3N0XCI7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxDcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IENyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgY3JlYXRlUmVmID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy9UT0RPIDogdXNlIHJlZiBoZWxwZXIgaGVyZVxuICAgICAgICAgICAgY29uc3QgYWxsSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihgWyR7bXlvcEF0dHJpYnV0ZXMuaWR9PScke2V2ZW50LnJlZkNvbmZpZy5zZWxlY3Rvcn0nXWApO1xuICAgICAgICAgICAgaWYgKGFsbEl0ZW1zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RTREsgPSBIb3N0U0RLLkluc3RhbmNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmQ29tcG9uZW50ID0gYXdhaXQgaG9zdFNESy5sb2FkQ29tcG9uZW50KGV2ZW50Lm5lc3RlZENvbXBvbmVudENvbmZpZyxcbiAgICAgICAgICAgICAgICAgICAgYWxsSXRlbXMuaXRlbSgwKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQub3B0aW9ucylcblxuICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgaXQgdG8gcGFzcyB0aGUgYXNzaWduZWQgaWRzXG4gICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUmVmQ29uZmlnOiBhbnlbXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocmVmQ29tcG9uZW50LnJlZnMpLmZvckVhY2gocmVmTmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZWYgPSByZWZDb21wb25lbnQucmVmc1tyZWZOYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgcmVmID0gcmVmLl9fbm9uUHJveGllZCB8fCByZWY7XG5cbiAgICAgICAgICAgICAgICAgICAgLy9kZWJ1Z2dlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChyZWYgYXMgSU15b3BDb21wb25lbnQpLmNvbXBvbmVudERlZmluaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFJlZkNvbmZpZy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudERlZmluaXRpb25JZDogKHJlZiBhcyBJTXlvcENvbXBvbmVudCkuY29tcG9uZW50RGVmaW5pdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgICAgIC8vZGVidWdnZXI7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgbmVzdGVkUmVmQ29uZmlnKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIC0gRE9NIGVsZW1lbnQgbm90IGZvdW5kJylcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IFJlZkNvbXBvbmVudENyZWF0ZWRNZXNzYWdlKGV2ZW50LmhhbmRsZXJVbmlxdWVJZCwgW10sIHRydWUpKTtcbiAgICAgICAgICAgICAgICBkZWJ1Z2dlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNyZWF0ZVJlZigpLnRoZW4oKTtcbiAgICAgICAgLy9yZXR1cm5pbmcgdW5kZWZpbmVkIHNvIGl0IHdvbid0IGFjdCBhcyBhIGNsZWFudXBcbiAgICB9XG59XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmV4cG9ydCBjb25zdCBvYnNlcnZlRE9NID0gKG9iajogSFRNTEVsZW1lbnQgfCBudWxsLCBjYWxsYmFjazogKG11dGF0aW9uUmVjb3Jkcz86IE11dGF0aW9uUmVjb3JkW10pID0+IHZvaWQpID0+IHtcbiAgICBpZiAoIW9iaikge1xuICAgICAgICBjb25zb2xlLmxvZygnbicpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBNdXRhdGlvbk9ic2VydmVyID0gd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG5cbiAgICBpZiAoIW9iaiB8fCBvYmoubm9kZVR5cGUgIT09IDEpIHJldHVybjtcblxuICAgIGlmIChNdXRhdGlvbk9ic2VydmVyKSB7XG4gICAgICAgIC8vIGRlZmluZSBhIG5ldyBvYnNlcnZlclxuICAgICAgICBjb25zdCBtdXRhdGlvbk9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spXG4gICAgICAgIC8vIGhhdmUgdGhlIG9ic2VydmVyIG9ic2VydmUgZm9yIGNoYW5nZXMgaW4gY2hpbGRyZW5cbiAgICAgICAgY29uc3QgY29uZmlnID0ge2F0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX07XG4gICAgICAgIG11dGF0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShvYmosIGNvbmZpZylcbiAgICAgICAgcmV0dXJuIG11dGF0aW9uT2JzZXJ2ZXJcbiAgICB9XG5cbiAgICAvLyBicm93c2VyIHN1cHBvcnQgZmFsbGJhY2tcbiAgICBlbHNlIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZUluc2VydGVkJywgY2FsbGJhY2ssIGZhbHNlKVxuICAgICAgICBvYmouYWRkRXZlbnRMaXN0ZW5lcignRE9NTm9kZVJlbW92ZWQnLCBjYWxsYmFjaywgZmFsc2UpXG4gICAgfVxufSIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7RXhlY3V0ZVNjcmlwdE1lc3NhZ2UsIE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlfSBmcm9tIFwiLi4vLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge29ic2VydmVET019IGZyb20gXCIuLi8uLi9jb21tb24vdXRpbHMvZG9tT2JzZXJ2ZXJcIjtcblxuZXhwb3J0IGNsYXNzIFNldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEV4ZWN1dGVTY3JpcHRNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0TXV0YXRpb25PYnNlcnZlck1lc3NhZ2VcblxuICAgIGV4ZWN1dG9yID0gKGV2ZW50OiBFeGVjdXRlU2NyaXB0TWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoZXZlbnQuc291cmNlKSB7XG4gICAgICAgICAgICBvYnNlcnZlRE9NKGRvY3VtZW50LmJvZHksICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IE11dGF0aW9uT2JzZXJ2ZXJNZXNzYWdlKClcbiAgICAgICAgICAgICAgICAgICAgLy8gIG5ldyBFbnZlbG9wZWRNZXNzYWdlKGV2ZW50LnNvdXJjZSEsIG5ldyBNdXRhdGlvbk9ic2VydmVyTWVzc2FnZSgpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge215b3BBdHRyaWJ1dGVzfSBmcm9tIFwiLi4vLi4vY29uc3RzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtFbGVtZW50VmFsdWVSZXBsYXlNZXNzYWdlLCBGb3JtRGF0YUVudHJ5LCBHZXRFbGVtZW50VmFsdWVNZXNzYWdlLCBJbnB1dEVsZW1lbnRWYWx1ZSx9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHttYWtlU2VyaWFsaXphYmxlfSBmcm9tIFwiLi4vLi4vY29tbW9uL3V0aWxzL3NlcmlhbGl6YXRpb24udHNcIjtcbmltcG9ydCB7Z2V0RWxlbWVudHNCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5jb25zdCBnZXRJbnB1dFZhbHVlID0gKGVsZW1lbnQpOiBJbnB1dEVsZW1lbnRWYWx1ZSA9PiB7XG4gICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBmb3JtXG4gICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gJ0ZPUk0nKSB7XG4gICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKGVsZW1lbnQpO1xuICAgICAgICBjb25zdCBkYXRhT2JqZWN0OiBJbnB1dEVsZW1lbnRWYWx1ZSA9IHtcbiAgICAgICAgICAgIGZvcm1EYXRhOiB7fSxcbiAgICAgICAgICAgIHVubWFwcGVkRGF0YTogW11cbiAgICAgICAgfTtcblxuICAgICAgICAvLyBNYW51YWxseSBhZGQgZWxlbWVudHMgd2l0aG91dCBuYW1lc1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEnKTtcbiAgICAgICAgbGV0IGF1dG9OYW1lSW5kZXhlciA9IC0xO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnQudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbXlvcElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUobXlvcEF0dHJpYnV0ZXMuaWQpO1xuICAgICAgICAgICAgICAgIGxldCBrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpO1xuXG4gICAgICAgICAgICAgICAgLy8gYF8keygrK2F1dG9OYW1lSW5kZXhlcil9YFxuXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZURhdGE6IEZvcm1EYXRhRW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiBrZXksXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBnZXRJbnB1dFZhbHVlKGVsZW1lbnQpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogZWxlbWVudC5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHk6IG1ha2VTZXJpYWxpemFibGUoZWxlbWVudC52YWxpZGl0eSwgdHJ1ZSksXG4gICAgICAgICAgICAgICAgICAgIG15b3BJZCxcbiAgICAgICAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgICAgICBpZighZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSB8fCAhZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XS52YWx1ZSB8fCBub2RlRGF0YS52YWx1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2JqZWN0LmZvcm1EYXRhIVtrZXldID0gbm9kZURhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIC8vIGlmICgha2V5KSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKG5vZGVEYXRhKTtcbiAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICBpZiAoZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0udmFsdWUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBkYXRhT2JqZWN0LnVubWFwcGVkRGF0YSEucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QudW5tYXBwZWREYXRhIS5wdXNoKGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0pO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGRhdGFPYmplY3QuZm9ybURhdGEhW2tleV0gPSBub2RlRGF0YVxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgZGF0YU9iamVjdC5mb3JtRGF0YSFba2V5XSA9IG5vZGVEYXRhXG4gICAgICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkYXRhT2JqZWN0O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYSBjaGVja2JveCBvciByYWRpbyBidXR0b25cbiAgICBpZiAoZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnIHx8IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5jaGVja2VkID8gZWxlbWVudC52YWx1ZSA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGlucHV0IGFuZCB0ZXh0YXJlYSBlbGVtZW50c1xuICAgIGlmIChlbGVtZW50LnRhZ05hbWUgPT09ICdJTlBVVCcgfHwgZWxlbWVudC50YWdOYW1lID09PSAnVEVYVEFSRUEnKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LnZhbHVlO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBzZWxlY3QgZWxlbWVudHMgKGRyb3Bkb3ducylcbiAgICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0VMRUNUJykge1xuICAgICAgICByZXR1cm4gZWxlbWVudC52YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgZWRpdGFibGUgZGl2cyAoY29udGVudEVkaXRhYmxlKVxuICAgIGlmIChlbGVtZW50LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICAgIHJldHVybiBlbGVtZW50LmlubmVyVGV4dCB8fCBlbGVtZW50LnRleHRDb250ZW50O1xuICAgIH1cblxuICAgIC8vIElmIGl0J3MgYW4gdW5zdXBwb3J0ZWQgZWxlbWVudCB0eXBlXG4gICAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBjbGFzcyBHZXRFbGVtZW50VmFsdWVIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPEdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U+IHtcblxuICAgIG1lc3NhZ2VUeXBlID0gTXlvcE1lc3NhZ2VzLkdldEVsZW1lbnRWYWx1ZU1lc3NhZ2U7XG5cbiAgICBleGVjdXRvciA9IChldmVudDogR2V0RWxlbWVudFZhbHVlTWVzc2FnZSkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEVsZW1lbnRWYWx1ZVJlcGxheU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgZ2V0SW5wdXRWYWx1ZShpdGVtKVxuICAgICAgICAgICAgKSwgZXZlbnQpO1xuICAgICAgICB9KVxuICAgIH1cbn1cbiIsICJpbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5pbXBvcnQge0dldEF0dHJpYnV0ZU1lc3NhZ2UsIEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2V9IGZyb20gXCIuLi8uLi9tZXNzYWdlc1wiO1xuaW1wb3J0IHtnZXRGaXJzdEVsZW1lbnRCeVJlZn0gZnJvbSBcIi4uLy4uL2NvbW1vbi9tZXNzYWdlSGFuZGxlcnMvaGVscGVyc1wiO1xuXG5leHBvcnQgY2xhc3MgR2V0QXR0cmlidXRlSGFuZGxlciBleHRlbmRzIEJhc2VNZXNzYWdlSGFuZGxlcjxHZXRBdHRyaWJ1dGVNZXNzYWdlPiB7XG5cbiAgICBtZXNzYWdlVHlwZSA9IE15b3BNZXNzYWdlcy5HZXRBdHRyaWJ1dGVNZXNzYWdlO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IEdldEF0dHJpYnV0ZU1lc3NhZ2UpID0+IHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGdldEZpcnN0RWxlbWVudEJ5UmVmKGV2ZW50LnJlZiwgZG9jdW1lbnQpXG4gICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEdldEF0dHJpYnV0ZVJlcGxheU1lc3NhZ2UoaXRlbS5nZXRBdHRyaWJ1dGUoZXZlbnQubmFtZSkpLCBldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtSZXNpemVPYnNlcnZlck1lc3NhZ2UsIFNldFJlc2l6ZU9ic2VydmVyTWVzc2FnZX0gZnJvbSAnLi4vLi4vbWVzc2FnZXMnXG5pbXBvcnQge015b3BNZXNzYWdlc30gZnJvbSBcIi4uLy4uL2NvbW1vbi9NeW9wTWVzc2FnZXNcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vLi4vY29tbW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRSZXNpemVPYnNlcnZlckhhbmRsZXIgZXh0ZW5kcyBCYXNlTWVzc2FnZUhhbmRsZXI8U2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlPiB7XG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlXG5cbiAgICBleGVjdXRvciA9IChldmVudDogU2V0UmVzaXplT2JzZXJ2ZXJNZXNzYWdlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKChlbnRyaWVzKSA9PiB7XG4gICAgICAgICAgICAvL1RPRE8gOiBwYXNzIHRoZSBoZWlnaHRcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVRvSG9zdChuZXcgUmVzaXplT2JzZXJ2ZXJNZXNzYWdlKCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5KTtcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiaW1wb3J0IHtNeW9wTWVzc2FnZXN9IGZyb20gXCIuLi8uLi9jb21tb24vTXlvcE1lc3NhZ2VzXCI7XG5pbXBvcnQge1NldElubmVySHRtbH0gZnJvbSBcIi4uLy4uL21lc3NhZ2VzXCI7XG5pbXBvcnQge0Jhc2VNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4uLy4uL2NvbW1vblwiO1xuaW1wb3J0IHtnZXRFbGVtZW50c0J5UmVmfSBmcm9tIFwiLi4vLi4vY29tbW9uL21lc3NhZ2VIYW5kbGVycy9oZWxwZXJzXCI7XG5cbmV4cG9ydCBjbGFzcyBTZXRJbm5lckh0bWxIYW5kbGVyIGV4dGVuZHMgQmFzZU1lc3NhZ2VIYW5kbGVyPFNldElubmVySHRtbD4ge1xuXG4gICAgbWVzc2FnZVR5cGUgPSBNeW9wTWVzc2FnZXMuU2V0SW5uZXJIdG1sO1xuXG4gICAgZXhlY3V0b3IgPSAoZXZlbnQ6IFNldElubmVySHRtbCkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IGdldEVsZW1lbnRzQnlSZWYoZXZlbnQucmVmLCBkb2N1bWVudCk7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBpdGVtLmlubmVySFRNTCA9IGV2ZW50LmNvbnRlbnQ7XG4gICAgICAgIH0pXG4gICAgfVxufVxuIiwgIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKiBUaGUgSWZyYW1lIFNESyBpcyBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZXJlIGRldmVsb3BlcnMgd2lzaCB0byBpbXBsZW1lbnQgTXlvcCBjb21wb25lbnRzIGFzIHNlcGFyYXRlIHdlYiBhcHBsaWNhdGlvbnMgaG9zdGVkIHdpdGhpbiBpZnJhbWVzLjxici8+PGJyLz5cbiAqIEJ5IGltcG9ydGluZyB0aGUgSWZyYW1lIFNESywgZGV2ZWxvcGVycyBnYWluIGFjY2VzcyB0byB0b29scyBhbmQgdXRpbGl0aWVzIG5lY2Vzc2FyeSBmb3IgaGFuZGxpbmcgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBob3N0IGFwcGxpY2F0aW9uIGFuZCB0aGUgZW1iZWRkZWQgaWZyYW1lLWJhc2VkIE15b3AgY29tcG9uZW50czxici8+PGJyLz5cbiAqIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG4gKlxuIE9uY2UgbG9hZGVkIHRoZSBgUm9vdFNES2AsIHlvdSBjYW4gbG9hZCB0aGUgYElmcmFtZVNES2BcbiBgYGBqc1xuIGNvbnN0IHtJZnJhbWVTREt9ID0gKGF3YWl0IHdpbmRvdy5teW9wLnJvb3RTREsuZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuIG9yXG4gYGBgdHNcbiBpbXBvcnQge2dldElmcmFtZU1vZHVsZX0gZnJvbSAnQG15b3Avc2RrJztcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCBnZXRJZnJhbWVNb2R1bGUoKSk7XG4gYGBgXG4gb3JcbiBgYGB0c1xuIGltcG9ydCB7SWZyYW1lU0RLfSBmcm9tICdAbXlvcC9zZGsvaWZyYW1lJztcbiBgYGBcbiAqXG4gKi9cbmltcG9ydCB7QmFzZU15b3BTREt9IGZyb20gXCIuLi9jb21tb25cIjtcbmltcG9ydCB7RGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXJcIjtcbmltcG9ydCB7QmFzZU1lc3NhZ2VIYW5kbGVyfSBmcm9tIFwiLi4vY29tbW9uXCI7XG5pbXBvcnQge0JpbmRPbkNsaWNrSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2JpbmRPbkNsaWNrSGFuZGxlclwiO1xuaW1wb3J0IHtDaGFuZ2VUZXh0SGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2NoYW5nZVRleHRIYW5kbGVyXCI7XG5pbXBvcnQge0V4ZWN1dGVTY3JpcHRIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZXhlY3V0ZVNjcmlwdEhhbmRsZXJcIjtcbmltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuaW1wb3J0IHtBZGRFdmVudExpc3RlbmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyXCI7XG5pbXBvcnQge3NldEF0dHJpYnV0ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9zZXRBdHRyaWJ1dGVIYW5kbGVyXCI7XG5pbXBvcnQge1xuICAgIEluaXRSZXF1ZXN0LFxuICAgIE1lc3NhZ2VEaXJlY3Rpb24sXG4gICAgTXlvcEJpbmRNZXNzYWdlLFxuICAgIE15b3BCaW5kUmVwbGF5TWVzc2FnZVxufSBmcm9tIFwiLi4vbWVzc2FnZXNcIjtcbmltcG9ydCB7Q3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9DcmVhdGVSZWZDb21wb25lbnRNZXNzYWdlSGFuZGxlclwiO1xuaW1wb3J0IHtTZXRNdXRhdGlvbk9ic2VydmVySGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL1NldE11dGF0aW9uT2JzZXJ2ZXJIYW5kbGVyXCI7XG5pbXBvcnQge0dldEVsZW1lbnRWYWx1ZUhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9HZXRFbGVtZW50VmFsdWVIYW5kbGVyLnRzXCI7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuaW1wb3J0IHtHZXRBdHRyaWJ1dGVIYW5kbGVyfSBmcm9tIFwiLi9tZXNzYWdlSGFuZGxlcnMvZ2V0QXR0cmlidXRlSGFuZGxlci50c1wiO1xuaW1wb3J0IHtTZXRSZXNpemVPYnNlcnZlckhhbmRsZXJ9IGZyb20gXCIuL21lc3NhZ2VIYW5kbGVycy9TZXRSZXNpemVPYnNlcnZlckhhbmRsZXIudHNcIjtcbmltcG9ydCB7U2V0SW5uZXJIdG1sSGFuZGxlcn0gZnJvbSBcIi4vbWVzc2FnZUhhbmRsZXJzL3NldElubmVySHRtbEhhbmRsZXIudHNcIjtcblxuLyoqXG4gVGhlIElmcmFtZSBTREsgaXMgaW50ZW5kZWQgZm9yIHNjZW5hcmlvcyB3aGVyZSBkZXZlbG9wZXJzIHdpc2ggdG8gaW1wbGVtZW50IE15b3AgY29tcG9uZW50cyBhcyBzZXBhcmF0ZSB3ZWIgYXBwbGljYXRpb25zIGhvc3RlZCB3aXRoaW4gaWZyYW1lcy48YnIvPjxici8+XG4gQnkgaW1wb3J0aW5nIHRoZSBJZnJhbWUgU0RLLCBkZXZlbG9wZXJzIGdhaW4gYWNjZXNzIHRvIHRvb2xzIGFuZCB1dGlsaXRpZXMgbmVjZXNzYXJ5IGZvciBoYW5kbGluZyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGhvc3QgYXBwbGljYXRpb24gYW5kIHRoZSBlbWJlZGRlZCBpZnJhbWUtYmFzZWQgTXlvcCBjb21wb25lbnRzPGJyLz48YnIvPlxuIFRoaXMgU0RLIGZhY2lsaXRhdGVzIHNlY3VyZSBpc29sYXRpb24sIGFsbG93aW5nIGNvbXBvbmVudHMgdG8gZnVuY3Rpb24gaW5kZXBlbmRlbnRseSB3aGlsZSBzdGlsbCBiZW5lZml0aW5nIGZyb20gdGhlIG92ZXJhbGwgc3RydWN0dXJlIGFuZCBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyBwcm92aWRlZCBieSB0aGUgaG9zdCBhcHBsaWNhdGlvbi48YnIvPjxici8+XG5cbiBPbmNlIGxvYWRlZCB0aGUgYFJvb3RTREtgLCB5b3UgY2FuIGxvYWQgdGhlIGBJZnJhbWVTREtgXG4gYGBganNcbiBjb25zdCB7SWZyYW1lU0RLfSA9IChhd2FpdCB3aW5kb3cubXlvcC5yb290U0RLLmdldElmcmFtZU1vZHVsZSgpKTtcbiBgYGBcbiBvclxuIGBgYHRzXG4gaW1wb3J0IHtnZXRJZnJhbWVNb2R1bGV9IGZyb20gJ0BteW9wL3Nkayc7XG4gY29uc3Qge0lmcmFtZVNES30gPSAoYXdhaXQgZ2V0SWZyYW1lTW9kdWxlKCkpO1xuIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSWZyYW1lU0RLIGV4dGVuZHMgQmFzZU15b3BTREsge1xuXG4gICAgcHVibGljIHZlcnNpb24gPSB2ZXJzaW9uO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKCF3aW5kb3cubXlvcCkge1xuICAgICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgICAgd2luZG93Lm15b3AgPSB7fVxuICAgICAgICB9XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgd2luZG93Lm15b3AuSWZyYW1lU0RLID0gdGhpcztcbiAgICB9XG5cbiAgICBtZXNzYWdlVG9Ib3N0ID0gKG1lc3NhZ2U6IE15b3BCaW5kUmVwbGF5TWVzc2FnZSwgcmVwbGF5VG8/OiBNeW9wQmluZE1lc3NhZ2UpID0+IHtcbiAgICAgICAgaWYgKCFtZXNzYWdlLnJlcGxheVRvSGFuZGxlciAmJiByZXBsYXlUbz8uaGFuZGxlclVuaXF1ZUlkKVxuICAgICAgICAgICAgbWVzc2FnZS5yZXBsYXlUb0hhbmRsZXIgPSByZXBsYXlUby5oYW5kbGVyVW5pcXVlSWRcblxuICAgICAgICBjb25zdCBjb21wb25lbnRJZHMgPSBPYmplY3Qua2V5cyh0aGlzLmNvbXBvbmVudHMpO1xuXG4gICAgICAgIGlmICghbWVzc2FnZS5kZXN0aW5hdGlvbikge1xuICAgICAgICAgICAgaWYgKHJlcGxheVRvPy5yb3V0ZSkge1xuICAgICAgICAgICAgICAgIC8vIHRha2luZyB0aGUgZmlyc3QgY29tcG9uZW50IHRoYXQgaW5pdGlhdGVkIHRoYXQgY3ljbGVcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmRlc3RpbmF0aW9uID0gcmVwbGF5VG8ucm91dGVbcmVwbGF5VG8ucm91dGUubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVzdGluYXRpb24gPSBjb21wb25lbnRJZHNbMF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1lc3NhZ2Uuc291cmNlKVxuICAgICAgICAgICAgbWVzc2FnZS5zb3VyY2UgPSBjb21wb25lbnRJZHNbMF07XG5cbiAgICAgICAgbWVzc2FnZS5kaXJlY3Rpb24gPSBNZXNzYWdlRGlyZWN0aW9uLnVwXG5cbiAgICAgICAgd2luZG93LnBhcmVudD8ucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgLi4ubWVzc2FnZVxuICAgICAgICB9LCAnKicpO1xuICAgIH1cblxuICAgIHN1cHBvcnRlZEhhbmRsZXJzOiBCYXNlTWVzc2FnZUhhbmRsZXJbXSA9IFtcbiAgICAgICAgbmV3IENoYW5nZVRleHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBTZXRJbm5lckh0bWxIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBCaW5kT25DbGlja0hhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IERldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IEV4ZWN1dGVTY3JpcHRIYW5kbGVyKHRoaXMubWVzc2FnZVRvSG9zdCksXG4gICAgICAgIG5ldyBBZGRFdmVudExpc3RlbmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgc2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0RWxlbWVudFZhbHVlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgU2V0TXV0YXRpb25PYnNlcnZlckhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KSxcbiAgICAgICAgbmV3IFNldFJlc2l6ZU9ic2VydmVySGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuICAgICAgICBuZXcgR2V0QXR0cmlidXRlSGFuZGxlcih0aGlzLm1lc3NhZ2VUb0hvc3QpLFxuXG4gICAgICAgIC8vY29tcG9zaXRlIHN1cHBvcnQgbWVzc2FnZXMgOlxuICAgICAgICBuZXcgQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIodGhpcy5tZXNzYWdlVG9Ib3N0KVxuICAgIF07XG5cbiAgICBwdWJsaWMgaW5pdCA9ICgpID0+IHtcbiAgICAgICAgd2luZG93Lm9ubWVzc2FnZSA9IHRoaXMuaGFuZGxlSW5jb21lTWVzc2FnZXMuYmluZCh0aGlzKVxuICAgICAgICB0aGlzLm1lc3NhZ2VUb0hvc3QobmV3IEluaXRSZXF1ZXN0KCkpXG4gICAgfVxuXG59XG5cbmRlZmluZUR5bmFtaWNJbXBvcnQoJ0lmcmFtZVNESycsIElmcmFtZVNESyk7XG4iLCAiaW1wb3J0ICogYXMgYWxsIGZyb20gJy4vaW5kZXgnXG5pbXBvcnQge2RlZmluZUR5bmFtaWNJbXBvcnR9IGZyb20gXCIuLi9keW5hbWljSW1wb3J0L2RlZmluZUR5bmFtaWNJbXBvcnRcIjtcblxuY29uc3QgTXlvcE1lc3NhZ2VzID0ge1xuICAgIC4uLmFsbFxufVxuXG5kZWZpbmVEeW5hbWljSW1wb3J0KCdNeW9wTWVzc2FnZXMnLCBNeW9wTWVzc2FnZXMpO1xuIiwgImltcG9ydCB7ZGVmaW5lRHluYW1pY0ltcG9ydH0gZnJvbSBcIi4uL2R5bmFtaWNJbXBvcnQvZGVmaW5lRHluYW1pY0ltcG9ydC50c1wiO1xuaW1wb3J0ICogYXMgTXlvcEhlbHBlcnMgZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZXhwb3J0ICogZnJvbSBcIi4vaW5kZXgudHNcIjtcblxuZGVmaW5lRHluYW1pY0ltcG9ydCgnTXlvcEhlbHBlcnMnLCBNeW9wSGVscGVycyk7XG4iLCAiLy8gQHRzLW5vY2hlY2tcbmltcG9ydCB7bW9kdWxlSW5zdGFuY2VLZXksIG9uTG9hZEtleX0gZnJvbSBcIi4vZGVmaW5lRHluYW1pY0ltcG9ydFwiO1xuXG5pZiAoIXdpbmRvd1snX19mZWRlcmF0aW9uX18nXSkge1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IHNjcmlwdFNyYyA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQ/LnNyYztcbiAgICBjb25zdCBfX3B1YmxpY19hdXRvX3BhdGhfXyA9IHNjcmlwdFNyYyA/IHNjcmlwdFNyYy5zcGxpdCgnLycpLnNsaWNlKDAsIC0xKS5qb2luKCcvJykgOiAnJztcblxuICAgIHdpbmRvd1snX19mZWRlcmF0aW9uX18nXSA9IHtcbiAgICAgICAgX19wdWJsaWNfYXV0b19wYXRoX18sXG4gICAgICAgIF9fdXNlX3B1YmxpY19hdXRvX3BhdGhfXzogdHJ1ZSxcbiAgICAgICAgX19wdWJsaWNfcGF0aF9fOiB1bmRlZmluZWQsXG4gICAgICAgIF9fbG9hZGluZ190aW1lb3V0X18gOiA1ICogMTAwMFxuICAgIH07XG59IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKCdfX2ZlZGVyYXRpb25fXyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuJyk7XG59XG5cbndpbmRvd1snX19mZWRlcmF0aW9uX18nXVsnbG9hZF9fZmVkZXJhdGlvbl9fJ10gPSAoc2NyaXB0RmlsZVBhdGgsIG1vZHVsZU5hbWUsIG9uTG9hZCkgPT4ge1xuXG4gICAgaWYgKCF3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0pIHtcbiAgICAgICAgbGV0IHNjcmlwdFRhZztcblxuICAgICAgICB3aW5kb3dbJ19fZmVkZXJhdGlvbl9fJ11bbW9kdWxlTmFtZV0gPSB7fTtcbiAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW29uTG9hZEtleV0gPSAobW9kdWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NyaXB0VGFnKSB7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRUYWcpO1xuICAgICAgICAgICAgICAgIC8vVE9ETyA6IGNoZWNrIHRoYXQ6XG4gICAgICAgICAgICAgICAgc2NyaXB0VGFnID0gbnVsbDtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnc2NyaXB0IHJlbW92ZWQuLi4gJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cobW9kdWxlKTtcblxuICAgICAgICAgICAgd2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW21vZHVsZUluc3RhbmNlS2V5XSA9IG1vZHVsZTtcbiAgICAgICAgICAgIG9uTG9hZChtb2R1bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2NyaXB0VGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgICAgIC8vc2NyaXB0VGFnLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JztcbiAgICAgICAgc2NyaXB0VGFnLnR5cGUgPSAnbW9kdWxlJztcbiAgICAgICAgc2NyaXB0VGFnLnNyYyA9IHNjcmlwdEZpbGVQYXRoO1xuXG4gICAgICAgIHNjcmlwdFRhZy5hc3luYyA9IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0VGFnKTtcblxuICAgICAgICAvLyBjb25zdCBsaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XG4gICAgICAgIC8vIGxpbmsudHlwZSA9IFwidGV4dC9jc3NcIjtcbiAgICAgICAgLy8gbGluay5yZWwgPSBcInN0eWxlc2hlZXRcIjtcbiAgICAgICAgLy8gbGluay5ocmVmID0gZmlsZU5hbWUucmVwbGFjZSgnLmpzJywgJy5jc3MnKTtcbiAgICAgICAgLy8gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaW5rKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBfX2ZlZGVyYXRpb25fXyBtb2R1bGUgJHttb2R1bGVOYW1lfSBhbHJlYWR5IGxvYWRlZC5gKVxuICAgICAgICBvbkxvYWQod2luZG93WydfX2ZlZGVyYXRpb25fXyddW21vZHVsZU5hbWVdW21vZHVsZUluc3RhbmNlS2V5XSk7XG4gICAgfVxufVxuIiwgImltcG9ydCAnLi9keW5hbWljSW1wb3J0L2xvYWRfX2ZlZGVyYXRpb25fXyc7XG4vLyBAdHMtaWdub3JlIGhhbmRsZWQgYnkgY3VzdG9tIGVzYnVpbGQgcGx1Z2luXG5pbXBvcnQgdmVyc2lvbiBmcm9tIFwibXlvcC1zZGstdmVyc2lvblwiO1xuXG5jb25zb2xlLmxvZygnbXlvcCByb290IHNkayAtIGxvYWRlZCcsIGRvY3VtZW50LmxvY2F0aW9uLm9yaWdpbik7XG5cbi8vIFRPRE8gOiByZWFkIHZhbHVlIGZyb20gd2luZG93WydfX2ZlZGVyYXRpb25fXyddID9cbi8vY29uc3QgX19ST09UX1NES19QVUJMSUNfVVJMX18gPSAnaHR0cHM6Ly9kZmRsazJwMW0xODd2LmNsb3VkZnJvbnQubmV0L215b3Bfc2RrLm1pbi5qcydcbmNvbnN0IF9fUk9PVF9TREtfUFVCTElDX1VSTF9fID0gJ2h0dHBzOi8vY2RuLm15b3AuZGV2L3Nkay9uZXh0L215b3Bfc2RrLm1pbi5qcydcblxuY29uc3QgZ2V0SG9zdE1vZHVsZSA9ICgpID0+IGltcG9ydCgnLi9ob3N0L2hvc3RTREsnKVxuY29uc3QgZ2V0SWZyYW1lTW9kdWxlID0gKCkgPT4gaW1wb3J0KCcuL0lmcmFtZS9JZnJhbWVTREsnKVxuY29uc3QgZ2V0V2ViY29tcG9uZW50TW9kdWxlID0gKCkgPT4gaW1wb3J0KCcuL3dlYmNvbXBvbmVudC9XZWJDb21wb25lbnRTREsnKVxuY29uc3QgZ2V0TXlvcE1lc3NhZ2VzID0gKCkgPT4gaW1wb3J0KCcuL21lc3NhZ2VzL015b3BNZXNzYWdlcycpXG5jb25zdCBnZXRNeW9wSGVscGVycyA9ICgpID0+IGltcG9ydCgnLi9oZWxwZXJzL015b3BIZWxwZXJzJylcblxuY29uc3QgZXhwb3NlR2xvYmFsbHkgPSAoaW1wb3J0RnVuY3Rpb246ICgpID0+IFByb21pc2U8YW55PikgPT4ge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4gKGF3YWl0IGltcG9ydEZ1bmN0aW9uKCkpLmdldCgpXG59XG5cbi8vIEZvciBzY3JpcHQvZ2xvYmFsIHVzYWdlIDpcbmNvbnN0IHJvb3RTREsgPSB7XG4gICAgdmVyc2lvbiA6IHZlcnNpb24sXG4gICAgZ2V0SG9zdE1vZHVsZTogZXhwb3NlR2xvYmFsbHkoZ2V0SG9zdE1vZHVsZSksXG4gICAgZ2V0SWZyYW1lTW9kdWxlOiBleHBvc2VHbG9iYWxseShnZXRJZnJhbWVNb2R1bGUpLFxuICAgIGdldFdlYmNvbXBvbmVudE1vZHVsZTogZXhwb3NlR2xvYmFsbHkoZ2V0V2ViY29tcG9uZW50TW9kdWxlKSxcbiAgICBnZXRNeW9wTWVzc2FnZXM6IGV4cG9zZUdsb2JhbGx5KGdldE15b3BNZXNzYWdlcyksXG4gICAgZ2V0TXlvcEhlbHBlcnM6IGV4cG9zZUdsb2JhbGx5KGdldE15b3BIZWxwZXJzKVxufTtcblxuLy8gQHRzLWlnbm9yZVxuaWYgKCF3aW5kb3cubXlvcCkge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgX19ST09UX1NES19QVUJMSUNfVVJMX19cbiAgICB9XG59XG5cbi8vIEB0cy1pZ25vcmVcbmlmICghd2luZG93Lm15b3Aucm9vdFNESykge1xuICAgIC8vIEB0cy1pZ25vcmVcbiAgICB3aW5kb3cubXlvcCA9IHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICByb290U0RLLFxuICAgICAgICAuLi53aW5kb3cubXlvcFxuICAgIH07XG59IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKFwibXlvcCByb290IGhvc3QgbG9hZGVkIG1vcmUgdGhhbiBvbmNlLlwiKTtcbn1cblxuLy8gRm9yIGJ1bmRsZXJzIHVzYWdlIDpcbmNvbnN0IHNka01vZHVsZSA9IHtcbiAgICBnZXRIb3N0TW9kdWxlLFxuICAgIGdldElmcmFtZU1vZHVsZSxcbiAgICBnZXRXZWJjb21wb25lbnRNb2R1bGVcbn1cbmV4cG9ydCB0eXBlIHJvb3RTREtUeXBlID0gdHlwZW9mIHNka01vZHVsZTtcblxuZXhwb3J0IHtcbiAgICBnZXRIb3N0TW9kdWxlLFxuICAgIGdldElmcmFtZU1vZHVsZSxcbiAgICBnZXRXZWJjb21wb25lbnRNb2R1bGVcbn1cblxuLy8gZGVjbGFyZSBnbG9iYWwge1xuLy8gICAgIGludGVyZmFjZSBXaW5kb3cge1xuLy8gICAgICAgICBteW9wOiB7XG4vLyAgICAgICAgICAgICByb290U0RLOiB0eXBlb2Ygcm9vdFNES1xuLy8gICAgICAgICB9XG4vLyAgICAgfVxuLy8gfVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxJQUFhLGdCQUNBLFdBQ0EsbUJBRUE7QUFKYjtBQUFBO0FBQUE7QUFBTyxJQUFNLGlCQUFpQjtBQUN2QixJQUFNLFlBQVk7QUFDbEIsSUFBTSxvQkFBb0I7QUFFMUIsSUFBTSxzQkFBc0IsQ0FBQyxZQUFvQixXQUFnQjtBQUVwRSxVQUFJLE9BQU8sY0FBYyxLQUFLLE9BQU8sY0FBYyxFQUFFLFVBQVUsS0FBSyxPQUFPLGNBQWMsRUFBRSxVQUFVLEVBQUUsU0FBUyxHQUFHO0FBRS9HLGVBQU8sY0FBYyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUs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QUUsaUJBQWlCLENBQUM7QUFBQSxFQUNsRTtBQUNKOzs7QUN0REE7QUFFQSxRQUFRLElBQUksMEJBQTBCLFNBQVMsU0FBUyxNQUFNO0FBSTlELElBQU1DLDJCQUEwQjtBQUVoQyxJQUFNLGdCQUFnQixNQUFNO0FBQzVCLElBQU0sa0JBQWtCLE1BQU07QUFDOUIsSUFBTSx3QkFBd0IsTUFBTTtBQUNwQyxJQUFNLGtCQUFrQixNQUFNO0FBQzlCLElBQU0saUJBQWlCLE1BQU07QUFFN0IsSUFBTSxpQkFBaUIsQ0FBQyxtQkFBdUM7QUFFM0QsU0FBTyxNQUFTO0FBQUksa0JBQU0sZUFBZSxHQUFHLElBQUk7QUFBQTtBQUNwRDtBQUdBLElBQU0sVUFBVTtBQUFBLEVBQ1osU0FBVTtBQUFBLEVBQ1YsZUFBZSxlQUFlLGFBQWE7QUFBQSxFQUMzQyxpQkFBaUIsZUFBZSxlQUFlO0FBQUEsRUFDL0MsdUJBQXVCLGVBQWUscUJBQXFCO0FBQUEsRUFDM0QsaUJBQWlCLGVBQWUsZUFBZTtBQUFBLEVBQy9DLGdCQUFnQixlQUFlLGNBQWM7QUFDakQ7QUFHQSxJQUFJLENBQUMsT0FBTyxNQUFNO0FBRWQsU0FBTyxPQUFPO0FBQUEsSUFDVix5QkFBQUE7QUFBQSxFQUNKO0FBQ0o7QUFHQSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVM7QUFFdEIsU0FBTyxPQUFPO0FBQUE7QUFBQSxJQUVWO0FBQUEsS0FDRyxPQUFPO0FBRWxCLE9BQU87QUFDSCxVQUFRLElBQUksdUNBQXVDO0FBQ3ZEOyIsCiAgIm5hbWVzIjogWyJSZXBsYXlNZXNzYWdlS2V5IiwgIm1hdGNoIiwgInNjcmlwdElucHV0cyIsICJzY3JpcHRJbnB1dHMiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAiUmVwbGF5TWVzc2FnZUtleSIsICJSZXBsYXlNZXNzYWdlS2V5IiwgIlJlcGxheU1lc3NhZ2VLZXkiLCAic2VlbiIsICJ0YXJnZXQiLCAibWFrZVNlcmlhbGl6YWJsZSIsICJfYSIsICJoZWlnaHQiLCAid2lkdGgiLCAiX2EiLCAiX2EiLCAiX2EiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaW5pdF9jb25zdHMiLCAiaG9zdFNESyIsICJpbml0X2V4ZWN1dGVTY3JpcHRIYW5kbGVyIiwgImluaXRfY29uc3RzIiwgImVsZW1lbnQiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJzZGsiLCAic2VlbiIsICJkb21JZCIsICJpbml0X2hlbHBlcnMiLCAiaW5pdF9oZWxwZXJzIiwgInNraW4iLCAiY29tcG9uZW50IiwgIl9hIiwgInNlZ21lbnQiLCAiZXhwZXJpZW5jZSIsICJzZWxlY3RlZFNraW4iLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJpbml0X0RldGVjdE15b3BSZWZzTWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiQmluZE9uQ2xpY2tIYW5kbGVyIiwgImluaXRfYmluZE9uQ2xpY2tIYW5kbGVyIiwgIkNoYW5nZVRleHRIYW5kbGVyIiwgImluaXRfY2hhbmdlVGV4dEhhbmRsZXIiLCAiRXhlY3V0ZVNjcmlwdEhhbmRsZXIiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJpbml0X2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgInNldEF0dHJpYnV0ZUhhbmRsZXIiLCAiaW5pdF9zZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkNyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgImluaXRfQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiaW5pdF9jb25zdHMiLCAiaG9zdFNESyIsICJnZXRJbnB1dFZhbHVlIiwgIkdldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiaW5pdF9HZXRFbGVtZW50VmFsdWVIYW5kbGVyIiwgImluaXRfY29uc3RzIiwgImVsZW1lbnQiLCAiU2V0SW5uZXJIdG1sSGFuZGxlciIsICJpbml0X3NldElubmVySHRtbEhhbmRsZXIiLCAiaW5pdF9EZXRlY3RNeW9wUmVmc01lc3NhZ2VIYW5kbGVyIiwgImluaXRfYmluZE9uQ2xpY2tIYW5kbGVyIiwgImluaXRfY2hhbmdlVGV4dEhhbmRsZXIiLCAiaW5pdF9leGVjdXRlU2NyaXB0SGFuZGxlciIsICJpbml0X2FkZEV2ZW50TGlzdGVuZXJIYW5kbGVyIiwgImluaXRfc2V0QXR0cmlidXRlSGFuZGxlciIsICJpbml0X0NyZWF0ZVJlZkNvbXBvbmVudE1lc3NhZ2VIYW5kbGVyIiwgImluaXRfR2V0RWxlbWVudFZhbHVlSGFuZGxlciIsICJpbml0X3NldElubmVySHRtbEhhbmRsZXIiLCAiX2EiLCAiQ2hhbmdlVGV4dEhhbmRsZXIiLCAiU2V0SW5uZXJIdG1sSGFuZGxlciIsICJCaW5kT25DbGlja0hhbmRsZXIiLCAiRGV0ZWN0TXlvcFJlZnNNZXNzYWdlSGFuZGxlciIsICJFeGVjdXRlU2NyaXB0SGFuZGxlciIsICJBZGRFdmVudExpc3RlbmVySGFuZGxlciIsICJzZXRBdHRyaWJ1dGVIYW5kbGVyIiwgIkdldEVsZW1lbnRWYWx1ZUhhbmRsZXIiLCAiQ3JlYXRlUmVmQ29tcG9uZW50TWVzc2FnZUhhbmRsZXIiLCAiTXlvcE1lc3NhZ2VzIiwgImluaXRfTXlvcE1lc3NhZ2VzIiwgImluaXRfaGVscGVycyIsICJfX1JPT1RfU0RLX1BVQkxJQ19VUkxfXyJdCn0K
|