diff --git a/.prettierignore b/.prettierignore deleted file mode 100755 index 2853ec67f..000000000 --- a/.prettierignore +++ /dev/null @@ -1,5 +0,0 @@ -*.md -**/public -**/dist -**/vendor -composer.lock diff --git a/packages/admin/.editorconfig b/packages/admin/.editorconfig new file mode 100644 index 000000000..8c50141bf --- /dev/null +++ b/packages/admin/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*{.yml,.yaml,.css,.js,.json}] +indent_size = 2 diff --git a/packages/admin/.prettierignore b/packages/admin/.prettierignore new file mode 100644 index 000000000..de9df43a5 --- /dev/null +++ b/packages/admin/.prettierignore @@ -0,0 +1,8 @@ +node_modules +dist +/vendor +/public +.git +**/.git +package-lock.json +composer.lock diff --git a/packages/admin/.prettierrc b/packages/admin/.prettierrc index 6781fe2c0..7d06dfcd0 100755 --- a/packages/admin/.prettierrc +++ b/packages/admin/.prettierrc @@ -1,6 +1,22 @@ { + "printWidth": 120, "semi": false, "singleQuote": true, - "tailwindConfig": "./packages/admin/tailwind.config.js", - "trailingComma": "all" + "tabWidth": 4, + "tailwindConfig": "./tailwind.config.js", + "trailingComma": "all", + "plugins": [ + "prettier-plugin-blade", + "prettier-plugin-tailwindcss" + ], + "overrides": [ + { + "files": [ + "*.blade.php" + ], + "options": { + "parser": "blade" + } + } + ] } diff --git a/packages/admin/config/components/setting.php b/packages/admin/config/components/setting.php index c5ae44193..6e49f31e1 100644 --- a/packages/admin/config/components/setting.php +++ b/packages/admin/config/components/setting.php @@ -21,7 +21,7 @@ 'inventory-create' => Pages\Settings\Inventories\Create::class, 'inventory-edit' => Pages\Settings\Inventories\Edit::class, 'legal' => Pages\Settings\LegalPage::class, - 'analytics' => Pages\Settings\Analytics::class, + // 'analytics' => Pages\Settings\Analytics::class, 'payment' => Pages\Settings\Payment::class, 'team-index' => Pages\Settings\Team\Index::class, 'team-roles' => Pages\Settings\Team\RolePermission::class, @@ -37,8 +37,6 @@ 'modals.create-permission' => Livewire\Modals\CreatePermission::class, 'modals.create-role' => Livewire\Modals\CreateRole::class, 'modals.confirm-password' => Livewire\Modals\ConfirmPassword::class, - 'modals.delete-inventory' => Livewire\Modals\DeleteInventory::class, - 'modals.delete-role' => Livewire\Modals\DeleteRole::class, 'modals.logout-others-browser' => Livewire\Modals\LogoutOthersBrowser::class, 'modals.payment-method-form' => Livewire\Modals\PaymentMethodForm::class, diff --git a/packages/admin/config/settings.php b/packages/admin/config/settings.php index aef181267..7c9654657 100755 --- a/packages/admin/config/settings.php +++ b/packages/admin/config/settings.php @@ -36,13 +36,13 @@ 'route' => 'shopper.settings.inventories', 'permission' => null, ], - [ - 'name' => 'Analytics', - 'description' => 'Get a better understanding of where your traffic is coming from.', - 'icon' => svg('untitledui-pie-chart', 'h-6 w-6'), - 'route' => 'shopper.settings.analytics', - 'permission' => null, - ], + // [ + // 'name' => 'Analytics', + // 'description' => 'Get a better understanding of where your traffic is coming from.', + // 'icon' => svg('untitledui-pie-chart', 'h-6 w-6'), + // 'route' => 'shopper.settings.analytics', + // 'permission' => null, + // ], [ 'name' => 'Payment methods', 'description' => 'Add different payment methods for your customers.', diff --git a/packages/admin/package.json b/packages/admin/package.json index c07cb11a7..dde02dadc 100755 --- a/packages/admin/package.json +++ b/packages/admin/package.json @@ -9,7 +9,7 @@ "build:css": "npx tailwindcss -i resources/css/shopper.css -o public/shopper.css --postcss --minify", "build:js": "node scripts/build.js", "build": "npm-run-all build:*", - "prettier": "npx prettier --write ." + "prettier": "npx prettier --write ./resources" }, "devDependencies": { "@alpinejs/focus": "^3.12.0", @@ -27,7 +27,7 @@ "postcss": "^8.4.4", "postcss-import": "^15.1.0", "prettier": "^3.1.1", - "prettier-plugin-blade": "^2.0.0", + "prettier-plugin-blade": "^2", "prettier-plugin-tailwindcss": "^0.5.10", "resolve-url-loader": "^2.3.1", "sortablejs": "^1.15.0", diff --git a/packages/admin/public/shopper.css b/packages/admin/public/shopper.css index b5b70610c..285b56d1d 100755 --- a/packages/admin/public/shopper.css +++ b/packages/admin/public/shopper.css @@ -3553,10 +3553,6 @@ html { bottom: 0px; } -.-bottom-1 { - bottom: -0.25rem; -} - .-top-1 { top: -0.25rem; } @@ -3605,10 +3601,6 @@ html { right: 0px; } -.right-12 { - right: 3rem; -} - .right-2 { right: 0.5rem; } @@ -3902,10 +3894,6 @@ html { margin-bottom: 0.5rem; } -.mb-3 { - margin-bottom: 0.75rem; -} - .mb-4 { margin-bottom: 1rem; } @@ -4065,10 +4053,6 @@ html { display: table-cell; } -.table-row { - display: table-row; -} - .grid { display: grid; } @@ -4533,10 +4517,6 @@ html { flex: none; } -.flex-shrink-0 { - flex-shrink: 0; -} - .shrink-0 { flex-shrink: 0; } @@ -5246,11 +5226,6 @@ html { border-bottom-left-radius: 0.5rem; } -.rounded-l-md { - border-top-left-radius: 0.375rem; - border-bottom-left-radius: 0.375rem; -} - .rounded-l-none { border-top-left-radius: 0px; border-bottom-left-radius: 0px; @@ -5261,11 +5236,6 @@ html { border-bottom-right-radius: 0.5rem; } -.rounded-r-md { - border-top-right-radius: 0.375rem; - border-bottom-right-radius: 0.375rem; -} - .rounded-r-none { border-top-right-radius: 0px; border-bottom-right-radius: 0px; @@ -5352,10 +5322,6 @@ html { border-left-width: 1px; } -.border-l-0 { - border-left-width: 0px; -} - .border-l-2 { border-left-width: 2px; } @@ -5437,11 +5403,6 @@ html { border-color: transparent; } -.border-white { - --tw-border-opacity: 1; - border-color: rgb(255 255 255 / var(--tw-border-opacity)); -} - .border-yellow-400 { --tw-border-opacity: 1; border-color: rgb(250 204 21 / var(--tw-border-opacity)); @@ -5491,9 +5452,9 @@ html { background-color: rgb(254 242 242 / var(--tw-bg-opacity)); } -.bg-danger-500 { +.bg-danger-600 { --tw-bg-opacity: 1; - background-color: rgb(239 68 68 / var(--tw-bg-opacity)); + background-color: rgb(220 38 38 / var(--tw-bg-opacity)); } .bg-gray-100 { @@ -5520,10 +5481,6 @@ html { background-color: rgba(var(--gray-50), var(--tw-bg-opacity)); } -.bg-gray-50\/50 { - background-color: rgba(var(--gray-50), 0.5); -} - .bg-gray-500 { --tw-bg-opacity: 1; background-color: rgba(var(--gray-500), var(--tw-bg-opacity)); @@ -5593,16 +5550,6 @@ html { background-color: rgb(37 99 235 / var(--tw-bg-opacity)); } -.bg-primary-900 { - --tw-bg-opacity: 1; - background-color: rgb(30 58 138 / var(--tw-bg-opacity)); -} - -.bg-purple-100 { - --tw-bg-opacity: 1; - background-color: rgb(243 232 255 / var(--tw-bg-opacity)); -} - .bg-red-100 { --tw-bg-opacity: 1; background-color: rgb(254 226 226 / var(--tw-bg-opacity)); @@ -5662,11 +5609,6 @@ html { background-color: rgb(255 255 255 / 0.9); } -.bg-yellow-100 { - --tw-bg-opacity: 1; - background-color: rgb(254 249 195 / var(--tw-bg-opacity)); -} - .bg-yellow-50 { --tw-bg-opacity: 1; background-color: rgb(254 252 232 / var(--tw-bg-opacity)); @@ -5823,11 +5765,6 @@ html { padding-right: 0.375rem; } -.px-10 { - padding-left: 2.5rem; - padding-right: 2.5rem; -} - .px-2 { padding-left: 0.5rem; padding-right: 0.5rem; @@ -6029,10 +5966,6 @@ html { padding-right: 1rem; } -.pr-6 { - padding-right: 1.5rem; -} - .ps-0 { padding-inline-start: 0px; } @@ -6439,16 +6372,6 @@ html { color: rgb(30 64 175 / var(--tw-text-opacity)); } -.text-purple-400 { - --tw-text-opacity: 1; - color: rgb(192 132 252 / var(--tw-text-opacity)); -} - -.text-purple-800 { - --tw-text-opacity: 1; - color: rgb(107 33 168 / var(--tw-text-opacity)); -} - .text-red-500 { --tw-text-opacity: 1; color: rgb(239 68 68 / var(--tw-text-opacity)); @@ -6742,12 +6665,6 @@ html { transition-duration: 150ms; } -.transition-transform { - transition-property: transform; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-duration: 150ms; -} - .duration-100 { transition-duration: 100ms; } @@ -6897,10 +6814,10 @@ input[type='number'] { display: flex; align-items: center; border-radius: 0.5rem; - padding-top: 0.5rem; - padding-bottom: 0.5rem; padding-left: 0.75rem; padding-right: 0.75rem; + padding-top: 0.5rem; + padding-bottom: 0.5rem; font-size: 0.875rem; line-height: 1.25rem; font-weight: 500; @@ -7013,29 +6930,29 @@ input[type='number'] { @keyframes shaking { 0% { - transform: translateX(0) + transform: translateX(0); } 25% { - transform: translateX(5px) + transform: translateX(5px); } 50% { - transform: translateX(-5px) + transform: translateX(-5px); } 75% { - transform: translateX(5px) + transform: translateX(5px); } 100% { - transform: translateX(0) + transform: translateX(0); } } .horizontal-shake { animation: shaking 0.35s normal; - animation-iteration-count: 1 + animation-iteration-count: 1; } .filament-icon-picker .choices > .choices__list .choices__list .choices__item.has-no-choices, @@ -7062,7 +6979,9 @@ input[type='number'] { visibility: hidden; } -.iti input, .iti input[type=text], .iti input[type=tel] { +.iti input, +.iti input[type='text'], +.iti input[type='tel'] { position: relative; z-index: 0; margin-top: 0 !important; @@ -7111,7 +7030,7 @@ input[type='number'] { margin: 0 0 0 -1px; box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.2); background-color: white; - border: 1px solid #CCC; + border: 1px solid #ccc; white-space: nowrap; max-height: 200px; overflow-y: scroll; @@ -7137,7 +7056,7 @@ input[type='number'] { .iti__divider { padding-bottom: 5px; margin-bottom: 5px; - border-bottom: 1px solid #CCC; + border-bottom: 1px solid #ccc; } .iti__country { @@ -7153,21 +7072,30 @@ input[type='number'] { background-color: rgba(0, 0, 0, 0.05); } -.iti__flag-box, .iti__country-name, .iti__dial-code { +.iti__flag-box, +.iti__country-name, +.iti__dial-code { vertical-align: middle; } -.iti__flag-box, .iti__country-name { +.iti__flag-box, +.iti__country-name { margin-right: 6px; } -.iti--allow-dropdown input, .iti--allow-dropdown input[type=text], .iti--allow-dropdown input[type=tel], .iti--separate-dial-code input, .iti--separate-dial-code input[type=text], .iti--separate-dial-code input[type=tel] { +.iti--allow-dropdown input, +.iti--allow-dropdown input[type='text'], +.iti--allow-dropdown input[type='tel'], +.iti--separate-dial-code input, +.iti--separate-dial-code input[type='text'], +.iti--separate-dial-code input[type='tel'] { padding-right: 6px; padding-left: 52px; margin-left: 0; } -.iti--allow-dropdown .iti__flag-container, .iti--separate-dial-code .iti__flag-container { +.iti--allow-dropdown .iti__flag-container, +.iti--separate-dial-code .iti__flag-container { right: auto; left: 0; } @@ -8555,15 +8483,15 @@ input[type='number'] { .iti__flag { height: 15px; box-shadow: 0px 0px 1px 0px #888; - background-image: url("/shopper/img/flags.png"); + background-image: url('/shopper/img/flags.png'); background-repeat: no-repeat; - background-color: #DBDBDB; + background-color: #dbdbdb; background-position: 20px 0; } @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { .iti__flag { - background-image: url("/shopper/img/flags@2x.png"); + background-image: url('/shopper/img/flags@2x.png'); } } @@ -9033,11 +8961,6 @@ input[type='number'] { } .treeselect-input { - /*font-size: 0.875rem; - color: rgba(var(--gray-950), var(--tw-text-opacity)); - transition-duration: 75ms; - border-style: none; - line-height: 1.5rem;*/ outline: 2px solid transparent; outline-offset: 2px; padding-left: 8px; @@ -9087,20 +9010,14 @@ input[type='number'] { border-radius: 0.5rem; padding: 0.25rem; --tw-bg-opacity: 1; - --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), - 0 4px 6px -4px rgba(0, 0, 0, 0.1); - --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), - 0 4px 6px -4px var(--tw-shadow-color); - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 - var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 - calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); --tw-ring-color: rgba(var(--gray-950), 0.05); background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), - var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), - var(--tw-shadow, 0 0 #0000); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); border: none; } @@ -9153,17 +9070,14 @@ dark .treeselect-list__item--checked, .treeselect-input__tags-element { --tw-bg-opacity: 1; --tw-text-opacity: 1; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 - var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 - calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); --tw-ring-inset: inset; --tw-ring-color: rgba(var(--primary-600), 0.1); align-items: center; background-color: rgba(var(--primary-50), var(--tw-bg-opacity)); border-radius: 0.375rem; - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), - var(--tw-shadow, 0 0 #0000); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); color: rgba(var(--primary-600), var(--tw-text-opacity)); display: inline-flex; font-size: 0.75rem; @@ -9224,10 +9138,7 @@ dark .treeselect-list__item--checked, stroke: rgba(var(--gray-950), var(--tw-text-opacity)); } -.dark -.treeselect-input__tags-element:hover -.treeselect-input__tags-cross -svg { +.dark .treeselect-input__tags-element:hover .treeselect-input__tags-cross svg { stroke: rgb(255 255 255 / var(--tw-text-opacity)); } @@ -9407,14 +9318,9 @@ svg { background-color: rgba(var(--c-500), var(--tw-bg-opacity)); } -.hover\:bg-danger-100:hover { +.hover\:bg-danger-500:hover { --tw-bg-opacity: 1; - background-color: rgb(254 226 226 / var(--tw-bg-opacity)); -} - -.hover\:bg-danger-600:hover { - --tw-bg-opacity: 1; - background-color: rgb(220 38 38 / var(--tw-bg-opacity)); + background-color: rgb(239 68 68 / var(--tw-bg-opacity)); } .hover\:bg-gray-100:hover { @@ -9532,11 +9438,6 @@ svg { border-color: rgb(185 28 28 / var(--tw-border-opacity)); } -.focus\:border-gray-300:focus { - --tw-border-opacity: 1; - border-color: rgba(var(--gray-300), var(--tw-border-opacity)); -} - .focus\:border-primary-300:focus { --tw-border-opacity: 1; border-color: rgb(147 197 253 / var(--tw-border-opacity)); @@ -9562,16 +9463,6 @@ svg { background-color: rgba(var(--gray-500), var(--tw-bg-opacity)); } -.focus\:bg-primary-900:focus { - --tw-bg-opacity: 1; - background-color: rgb(30 58 138 / var(--tw-bg-opacity)); -} - -.focus\:text-gray-500:focus { - --tw-text-opacity: 1; - color: rgba(var(--gray-500), var(--tw-text-opacity)); -} - .focus\:text-gray-600:focus { --tw-text-opacity: 1; color: rgba(var(--gray-600), var(--tw-text-opacity)); @@ -9582,11 +9473,6 @@ svg { color: rgb(185 28 28 / var(--tw-text-opacity)); } -.focus\:text-white:focus { - --tw-text-opacity: 1; - color: rgb(255 255 255 / var(--tw-text-opacity)); -} - .focus\:underline:focus { text-decoration-line: underline; } @@ -9602,12 +9488,6 @@ svg { outline-offset: 2px; } -.focus\:ring:focus { - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); -} - .focus\:ring-0:focus { --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); @@ -9625,11 +9505,6 @@ svg { --tw-ring-color: rgb(220 38 38 / var(--tw-ring-opacity)); } -.focus\:ring-primary-200:focus { - --tw-ring-opacity: 1; - --tw-ring-color: rgb(191 219 254 / var(--tw-ring-opacity)); -} - .focus\:ring-primary-500:focus { --tw-ring-opacity: 1; --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity)); @@ -9640,10 +9515,6 @@ svg { --tw-ring-color: rgb(37 99 235 / var(--tw-ring-opacity)); } -.focus\:ring-opacity-50:focus { - --tw-ring-opacity: 0.5; -} - .focus\:ring-offset-0:focus { --tw-ring-offset-width: 0px; } @@ -9853,11 +9724,6 @@ svg { text-decoration-line: underline; } -.group:focus .group-focus\:border-primary-300 { - --tw-border-opacity: 1; - border-color: rgb(147 197 253 / var(--tw-border-opacity)); -} - .group:focus-visible .group-focus-visible\:text-gray-500 { --tw-text-opacity: 1; color: rgba(var(--gray-500), var(--tw-text-opacity)); @@ -9908,11 +9774,6 @@ svg { border-color: rgba(var(--gray-700), 0.5); } -:is(.dark .dark\:border-gray-800) { - --tw-border-opacity: 1; - border-color: rgba(var(--gray-800), var(--tw-border-opacity)); -} - :is(.dark .dark\:border-primary-500) { --tw-border-opacity: 1; border-color: rgb(59 130 246 / var(--tw-border-opacity)); @@ -9952,10 +9813,6 @@ svg { background-color: rgba(var(--c-500), 0.2); } -:is(.dark .dark\:bg-danger-400\/10) { - background-color: rgb(248 113 113 / 0.1); -} - :is(.dark .dark\:bg-gray-400\/10) { background-color: rgba(var(--gray-400), 0.1); } @@ -10001,10 +9858,6 @@ svg { background-color: rgba(var(--gray-900), 0.3); } -:is(.dark .dark\:bg-gray-900\/50) { - background-color: rgba(var(--gray-900), 0.5); -} - :is(.dark .dark\:bg-gray-900\/80) { background-color: rgba(var(--gray-900), 0.8); } @@ -10153,10 +10006,6 @@ svg { color: rgb(59 130 246 / var(--tw-text-opacity)); } -:is(.dark .dark\:text-primary-500\/50) { - color: rgb(59 130 246 / 0.5); -} - :is(.dark .dark\:text-red-400) { --tw-text-opacity: 1; color: rgb(248 113 113 / var(--tw-text-opacity)); @@ -10293,10 +10142,6 @@ svg { background-color: rgba(var(--c-400), 0.1); } -:is(.dark .dark\:hover\:bg-danger-400\/20:hover) { - background-color: rgb(248 113 113 / 0.2); -} - :is(.dark .dark\:hover\:bg-gray-600:hover) { --tw-bg-opacity: 1; background-color: rgba(var(--gray-600), var(--tw-bg-opacity)); @@ -10316,6 +10161,10 @@ svg { background-color: rgba(var(--gray-800), 0.75); } +:is(.dark .dark\:hover\:bg-gray-900\/20:hover) { + background-color: rgba(var(--gray-900), 0.2); +} + :is(.dark .dark\:hover\:bg-white\/10:hover) { background-color: rgb(255 255 255 / 0.1); } @@ -10357,11 +10206,6 @@ svg { color: rgba(var(--gray-500), var(--tw-text-opacity)); } -:is(.dark .dark\:hover\:text-primary-500:hover) { - --tw-text-opacity: 1; - color: rgb(59 130 246 / var(--tw-text-opacity)); -} - :is(.dark .dark\:hover\:text-red-500:hover) { --tw-text-opacity: 1; color: rgb(239 68 68 / var(--tw-text-opacity)); @@ -10697,10 +10541,6 @@ svg { max-width: 20rem; } - .sm\:flex-1 { - flex: 1 1 0%; - } - .sm\:translate-y-0 { --tw-translate-y: 0px; transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); @@ -11268,10 +11108,6 @@ svg { max-width: 80rem; } - .lg\:max-w-lg { - max-width: 32rem; - } - .lg\:max-w-sm { max-width: 24rem; } @@ -11404,6 +11240,10 @@ svg { border-bottom-width: 1px; } + .lg\:border-t { + border-top-width: 1px; + } + .lg\:border-t-0 { border-top-width: 0px; } @@ -11460,10 +11300,6 @@ svg { padding-bottom: 0.375rem; } - .lg\:pl-2 { - padding-left: 0.5rem; - } - .lg\:pt-10 { padding-top: 2.5rem; } diff --git a/packages/admin/public/shopper.js b/packages/admin/public/shopper.js index fa505a804..4517ca5ce 100755 --- a/packages/admin/public/shopper.js +++ b/packages/admin/public/shopper.js @@ -3699,7 +3699,10 @@ } succeed(() => { queueMicrotask(() => { - el.livewire_sortable.option("handle", el.querySelector("[wire\\:sortable\\.handle]") ? "[wire\\:sortable\\.handle]" : null); + el.livewire_sortable.option( + "handle", + el.querySelector("[wire\\:sortable\\.handle]") ? "[wire\\:sortable\\.handle]" : null + ); hasSetHandleCorrectly = el.querySelector("[wire\\:sortable\\.item]") !== null; }); }); @@ -3730,19 +3733,21 @@ return; } let masterEl = el.closest("[wire\\:sortable-group]"); - let groups = Array.from(masterEl.querySelectorAll("[wire\\:sortable-group\\.item-group]")).map((el2, index2) => { - moveEndMorphMarker(el2); - return { - order: index2 + 1, - value: el2.getAttribute("wire:sortable-group.item-group"), - items: el2.livewire_sortable.toArray().map((value, index3) => { - return { - order: index3 + 1, - value - }; - }) - }; - }); + let groups = Array.from(masterEl.querySelectorAll("[wire\\:sortable-group\\.item-group]")).map( + (el2, index2) => { + moveEndMorphMarker(el2); + return { + order: index2 + 1, + value: el2.getAttribute("wire:sortable-group.item-group"), + items: el2.livewire_sortable.toArray().map((value, index3) => { + return { + order: index3 + 1, + value + }; + }) + }; + } + ); masterEl.closest("[wire\\:id]").__livewire.$wire.call(masterEl.getAttribute("wire:sortable-group"), groups); } }); @@ -3786,4 +3791,4 @@ sortablejs/modular/sortable.esm.js: * @license MIT *) */ -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvcGFuZWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3RyZWVzZWxlY3Rqcy9kaXN0L3RyZWVzZWxlY3Rqcy5tanMiLCAiLi4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvc2VsZWN0LXRyZWUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3NvcnRhYmxlanMvbW9kdWxhci9zb3J0YWJsZS5lc20uanMiLCAiLi4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvc29ydGFibGUuanMiLCAiLi4vcmVzb3VyY2VzL2pzL2luZGV4LmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBTbGlkZU92ZXJQYW5lbCA9ICgpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBvcGVuOiBmYWxzZSxcbiAgICBzaG93QWN0aXZlQ29tcG9uZW50OiB0cnVlLFxuICAgIGFjdGl2ZUNvbXBvbmVudDogZmFsc2UsXG4gICAgY29tcG9uZW50SGlzdG9yeTogW10sXG4gICAgcGFuZWxXaWR0aDogbnVsbCxcbiAgICBsaXN0ZW5lcnM6IFtdLFxuICAgIGdldEFjdGl2ZUNvbXBvbmVudFBhbmVsQXR0cmlidXRlKGtleSkge1xuICAgICAgaWYgKHRoaXMuJHdpcmUuZ2V0KCdjb21wb25lbnRzJylbdGhpcy5hY3RpdmVDb21wb25lbnRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJHdpcmUuZ2V0KCdjb21wb25lbnRzJylbdGhpcy5hY3RpdmVDb21wb25lbnRdWydwYW5lbEF0dHJpYnV0ZXMnXVtrZXldO1xuICAgICAgfVxuICAgIH0sXG4gICAgY2xvc2VQYW5lbE9uRXNjYXBlKHRyaWdnZXIpIHtcbiAgICAgIGlmICh0aGlzLmdldEFjdGl2ZUNvbXBvbmVudFBhbmVsQXR0cmlidXRlKCdjbG9zZU9uRXNjYXBlJykgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGZvcmNlID0gdGhpcy5nZXRBY3RpdmVDb21wb25lbnRQYW5lbEF0dHJpYnV0ZSgnY2xvc2VPbkVzY2FwZUlzRm9yY2VmdWwnKSA9PT0gdHJ1ZTtcbiAgICAgIHRoaXMuY2xvc2VQYW5lbChmb3JjZSk7XG4gICAgfSxcbiAgICBjbG9zZVBhbmVsT25DbGlja0F3YXkodHJpZ2dlcikge1xuICAgICAgaWYgKHRoaXMuZ2V0QWN0aXZlQ29tcG9uZW50UGFuZWxBdHRyaWJ1dGUoJ2Nsb3NlT25DbGlja0F3YXknKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNsb3NlUGFuZWwodHJ1ZSk7XG4gICAgfSxcbiAgICBjbG9zZVBhbmVsKGZvcmNlID0gZmFsc2UsIHNraXBQcmV2aW91c1BhbmVscyA9IDAsIGRlc3Ryb3lTa2lwcGVkID0gZmFsc2UpIHtcbiAgICAgIGlmKHRoaXMuc2hvdyA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5nZXRBY3RpdmVDb21wb25lbnRQYW5lbEF0dHJpYnV0ZSgnZGlzcGF0Y2hDbG9zZUV2ZW50JykgPT09IHRydWUpIHtcbiAgICAgICAgY29uc3QgY29tcG9uZW50TmFtZSA9IHRoaXMuJHdpcmUuZ2V0KCdjb21wb25lbnRzJylbdGhpcy5hY3RpdmVDb21wb25lbnRdLm5hbWU7XG4gICAgICAgIExpdmV3aXJlLmRpc3BhdGNoKCdwYW5lbENsb3NlZCcsIHsgbmFtZTogY29tcG9uZW50TmFtZSB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuZ2V0QWN0aXZlQ29tcG9uZW50UGFuZWxBdHRyaWJ1dGUoJ2Rlc3Ryb3lPbkNsb3NlJykgPT09IHRydWUpIHtcbiAgICAgICAgTGl2ZXdpcmUuZGlzcGF0Y2goJ2Rlc3Ryb3lDb21wb25lbnQnLCB7IGlkOiB0aGlzLmFjdGl2ZUNvbXBvbmVudCB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNraXBQcmV2aW91c1BhbmVscyA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBza2lwUHJldmlvdXNQYW5lbHM7IGkrKykge1xuICAgICAgICAgIGlmIChkZXN0cm95U2tpcHBlZCkge1xuICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLmNvbXBvbmVudEhpc3RvcnlbdGhpcy5jb21wb25lbnRIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgTGl2ZXdpcmUuZGlzcGF0Y2goJ2Rlc3Ryb3lDb21wb25lbnQnLCB7IGlkOiBpZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jb21wb25lbnRIaXN0b3J5LnBvcCgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlkID0gdGhpcy5jb21wb25lbnRIaXN0b3J5LnBvcCgpO1xuXG4gICAgICBpZiAoaWQgJiYgIWZvcmNlKSB7XG4gICAgICAgIGlmIChpZCkge1xuICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUGFuZWxDb21wb25lbnQoaWQsIHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc2V0U2hvd1Byb3BlcnR5VG8oZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldFNob3dQcm9wZXJ0eVRvKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHNldEFjdGl2ZVBhbmVsQ29tcG9uZW50KGlkLCBza2lwID0gZmFsc2UpIHtcbiAgICAgIHRoaXMuc2V0U2hvd1Byb3BlcnR5VG8odHJ1ZSk7XG5cbiAgICAgIGlmICh0aGlzLmFjdGl2ZUNvbXBvbmVudCA9PT0gaWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5hY3RpdmVDb21wb25lbnQgIT09IGZhbHNlICYmIHNraXAgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50SGlzdG9yeS5wdXNoKHRoaXMuYWN0aXZlQ29tcG9uZW50KTtcbiAgICAgIH1cblxuICAgICAgbGV0IGZvY3VzYWJsZVRpbWVvdXQgPSA1MDtcblxuICAgICAgaWYgKHRoaXMuYWN0aXZlQ29tcG9uZW50ID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLmFjdGl2ZUNvbXBvbmVudCA9IGlkXG4gICAgICAgIHRoaXMuc2hvd0FjdGl2ZUNvbXBvbmVudCA9IHRydWU7XG4gICAgICAgIHRoaXMucGFuZWxXaWR0aCA9IHRoaXMuZ2V0QWN0aXZlQ29tcG9uZW50UGFuZWxBdHRyaWJ1dGUoJ21heFdpZHRoQ2xhc3MnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0FjdGl2ZUNvbXBvbmVudCA9IGZhbHNlO1xuXG4gICAgICAgIGZvY3VzYWJsZVRpbWVvdXQgPSA0MDA7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDb21wb25lbnQgPSBpZDtcbiAgICAgICAgICB0aGlzLnNob3dBY3RpdmVDb21wb25lbnQgPSB0cnVlO1xuICAgICAgICAgIHRoaXMucGFuZWxXaWR0aCA9IHRoaXMuZ2V0QWN0aXZlQ29tcG9uZW50UGFuZWxBdHRyaWJ1dGUoJ21heFdpZHRoQ2xhc3MnKTtcbiAgICAgICAgfSwgMzAwKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBsZXQgZm9jdXNhYmxlID0gdGhpcy4kcmVmc1tpZF0/LnF1ZXJ5U2VsZWN0b3IoJ1thdXRvZm9jdXNdJyk7XG4gICAgICAgIGlmIChmb2N1c2FibGUpIHtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGZvY3VzYWJsZS5mb2N1cygpO1xuICAgICAgICAgIH0sIGZvY3VzYWJsZVRpbWVvdXQpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGZvY3VzYWJsZXMoKSB7XG4gICAgICBsZXQgc2VsZWN0b3IgPSAnYSwgYnV0dG9uLCBpbnB1dDpub3QoW3R5cGU9XFwnaGlkZGVuXFwnXSwgdGV4dGFyZWEsIHNlbGVjdCwgZGV0YWlscywgW3RhYmluZGV4XTpub3QoW3RhYmluZGV4PVxcJy0xXFwnXSknXG5cbiAgICAgIHJldHVybiBbLi4udGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcildXG4gICAgICAgIC5maWx0ZXIoZWwgPT4gIWVsLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSlcbiAgICB9LFxuICAgIGZpcnN0Rm9jdXNhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9jdXNhYmxlcygpWzBdXG4gICAgfSxcbiAgICBsYXN0Rm9jdXNhYmxlKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9jdXNhYmxlcygpLnNsaWNlKC0xKVswXVxuICAgIH0sXG4gICAgbmV4dEZvY3VzYWJsZSgpIHtcbiAgICAgIHJldHVybiB0aGlzLmZvY3VzYWJsZXMoKVt0aGlzLm5leHRGb2N1c2FibGVJbmRleCgpXSB8fCB0aGlzLmZpcnN0Rm9jdXNhYmxlKClcbiAgICB9LFxuICAgIHByZXZGb2N1c2FibGUoKSB7XG4gICAgICByZXR1cm4gdGhpcy5mb2N1c2FibGVzKClbdGhpcy5wcmV2Rm9jdXNhYmxlSW5kZXgoKV0gfHwgdGhpcy5sYXN0Rm9jdXNhYmxlKClcbiAgICB9LFxuICAgIG5leHRGb2N1c2FibGVJbmRleCgpIHtcbiAgICAgIHJldHVybiAodGhpcy5mb2N1c2FibGVzKCkuaW5kZXhPZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KSArIDEpICUgKHRoaXMuZm9jdXNhYmxlcygpLmxlbmd0aCArIDEpXG4gICAgfSxcbiAgICBwcmV2Rm9jdXNhYmxlSW5kZXgoKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoMCwgdGhpcy5mb2N1c2FibGVzKCkuaW5kZXhPZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkgLSAxXG4gICAgfSxcbiAgICBzZXRTaG93UHJvcGVydHlUbyhvcGVuKSB7XG4gICAgICB0aGlzLm9wZW4gPSBvcGVuO1xuXG4gICAgICBpZiAob3Blbikge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ292ZXJmbG93LXktaGlkZGVuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ292ZXJmbG93LXktaGlkZGVuJyk7XG5cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDb21wb25lbnQgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLiR3aXJlLnJlc2V0U3RhdGUoKTtcbiAgICAgICAgfSwgMzAwKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGluaXQoKSB7XG4gICAgICB0aGlzLnBhbmVsV2lkdGggPSB0aGlzLmdldEFjdGl2ZUNvbXBvbmVudFBhbmVsQXR0cmlidXRlKCdtYXhXaWR0aENsYXNzJyk7XG5cbiAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goXG4gICAgICAgIExpdmV3aXJlLm9uKCdjbG9zZVBhbmVsJywgKGRhdGEpID0+IHtcbiAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoZGF0YT8uZm9yY2UgPz8gZmFsc2UsIGRhdGE/LnNraXBQcmV2aW91c1BhbmVscyA/PyAwLCBkYXRhPy5kZXN0cm95U2tpcHBlZCA/PyBmYWxzZSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICB0aGlzLmxpc3RlbmVycy5wdXNoKFxuICAgICAgICBMaXZld2lyZS5vbignYWN0aXZlUGFuZWxDb21wb25lbnRDaGFuZ2VkJywgKHsgaWQgfSkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0QWN0aXZlUGFuZWxDb21wb25lbnQoaWQpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9LFxuICAgIGRlc3Ryb3koKSB7XG4gICAgICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4ge1xuICAgICAgICBsaXN0ZW5lcigpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNsaWRlT3ZlclBhbmVsXG4iLCAidmFyIHJpID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xudmFyIGNpID0gKGwsIGUsIHQpID0+IGUgaW4gbCA/IHJpKGwsIGUsIHsgZW51bWVyYWJsZTogITAsIGNvbmZpZ3VyYWJsZTogITAsIHdyaXRhYmxlOiAhMCwgdmFsdWU6IHQgfSkgOiBsW2VdID0gdDtcbnZhciBjID0gKGwsIGUsIHQpID0+IChjaShsLCB0eXBlb2YgZSAhPSBcInN5bWJvbFwiID8gZSArIFwiXCIgOiBlLCB0KSwgdCksIGt0ID0gKGwsIGUsIHQpID0+IHtcbiAgaWYgKCFlLmhhcyhsKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJDYW5ub3QgXCIgKyB0KTtcbn07XG52YXIgbiA9IChsLCBlLCB0KSA9PiAoa3QobCwgZSwgXCJyZWFkIGZyb20gcHJpdmF0ZSBmaWVsZFwiKSwgdCA/IHQuY2FsbChsKSA6IGUuZ2V0KGwpKSwgciA9IChsLCBlLCB0KSA9PiB7XG4gIGlmIChlLmhhcyhsKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoXCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlXCIpO1xuICBlIGluc3RhbmNlb2YgV2Vha1NldCA/IGUuYWRkKGwpIDogZS5zZXQobCwgdCk7XG59LCBtID0gKGwsIGUsIHQsIHMpID0+IChrdChsLCBlLCBcIndyaXRlIHRvIHByaXZhdGUgZmllbGRcIiksIHMgPyBzLmNhbGwobCwgdCkgOiBlLnNldChsLCB0KSwgdCk7XG52YXIgbyA9IChsLCBlLCB0KSA9PiAoa3QobCwgZSwgXCJhY2Nlc3MgcHJpdmF0ZSBtZXRob2RcIiksIHQpO1xuY29uc3QgUHQgPSB7XG4gIGFycm93VXA6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTggMTVsLTYtNi02IDZcIi8+PC9zdmc+JyxcbiAgYXJyb3dEb3duOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNSAyNVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTYgOWw2IDYgNi02XCIvPjwvc3ZnPicsXG4gIGFycm93UmlnaHQ6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNOSAxOGw2LTYtNi02XCIvPjwvc3ZnPicsXG4gIGF0dGVudGlvbjogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjUgMjVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0xMC4yOSAzLjg2TDEuODIgMThhMiAyIDAgMCAwIDEuNzEgM2gxNi45NGEyIDIgMCAwIDAgMS43MS0zTDEzLjcxIDMuODZhMiAyIDAgMCAwLTMuNDIgMHpcIj48L3BhdGg+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOVwiIHgyPVwiMTJcIiB5Mj1cIjEzXCI+PC9saW5lPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE3XCIgeDI9XCIxMi4wMVwiIHkyPVwiMTdcIj48L2xpbmU+PC9zdmc+JyxcbiAgY2xlYXI6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIj48L2NpcmNsZT48bGluZSB4MT1cIjE1XCIgeTE9XCI5XCIgeDI9XCI5XCIgeTI9XCIxNVwiPjwvbGluZT48bGluZSB4MT1cIjlcIiB5MT1cIjlcIiB4Mj1cIjE1XCIgeTI9XCIxNVwiPjwvbGluZT48L3N2Zz4nLFxuICBjcm9zczogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjUgMjVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGxpbmUgeDE9XCIxOFwiIHkxPVwiNlwiIHgyPVwiNlwiIHkyPVwiMThcIj48L2xpbmU+PGxpbmUgeDE9XCI2XCIgeTE9XCI2XCIgeDI9XCIxOFwiIHkyPVwiMThcIj48L2xpbmU+PC9zdmc+JyxcbiAgY2hlY2s6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwb2x5bGluZSBwb2ludHM9XCIyMCA2IDkgMTcgNCAxMlwiPjwvcG9seWxpbmU+PC9zdmc+JyxcbiAgcGFydGlhbENoZWNrOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNSAyNVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48bGluZSB4MT1cIjVcIiB5MT1cIjEyXCIgeDI9XCIxOVwiIHkyPVwiMTJcIj48L2xpbmU+PC9zdmc+J1xufSwgSSA9IChsLCBlKSA9PiB7XG4gIGlmIChlLmlubmVySFRNTCA9IFwiXCIsIHR5cGVvZiBsID09IFwic3RyaW5nXCIpXG4gICAgZS5pbm5lckhUTUwgPSBsO1xuICBlbHNlIHtcbiAgICBjb25zdCB0ID0gbC5jbG9uZU5vZGUoITApO1xuICAgIGUuYXBwZW5kQ2hpbGQodCk7XG4gIH1cbn0sIEJ0ID0gKGwpID0+IHtcbiAgY29uc3QgZSA9IGwgPyB7IC4uLmwgfSA6IHt9O1xuICByZXR1cm4gT2JqZWN0LmtleXMoUHQpLmZvckVhY2goKHQpID0+IHtcbiAgICBlW3RdIHx8IChlW3RdID0gUHRbdF0pO1xuICB9KSwgZTtcbn0sIGhpID0gKGwpID0+IGwucmVkdWNlKChlLCB7IG5hbWU6IHQgfSwgcykgPT4gKGUgKz0gdCwgcyA8IGwubGVuZ3RoIC0gMSAmJiAoZSArPSBcIiwgXCIpLCBlKSwgXCJcIik7XG52YXIgTiwgRSwgRCwgdiwgdWUsIEh0LCBILCBXLCBwZSwgR3QsIG1lLCBNdCwgRywgVSwgTywgViwgZmUsIEZ0LCBiZSwgcXQsIENlLCBqdCwgZ2UsIFJ0LCBrZSwgJHQsIHdlLCBXdCwgRWUsIFV0LCB2ZSwgenQsIExlLCBZdCwgeWUsIEt0LCB4ZSwgWHQsIFNlLCBKdCwgX2UsIFp0LCBBZSwgUXQsIFRlLCBlcywgTmUsIHRzLCB6LCB3dDtcbmNsYXNzIGRpIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHZhbHVlOiBlLFxuICAgIHNob3dUYWdzOiB0LFxuICAgIHRhZ3NDb3VudFRleHQ6IHMsXG4gICAgY2xlYXJhYmxlOiBpLFxuICAgIGlzQWx3YXlzT3BlbmVkOiBhLFxuICAgIHNlYXJjaGFibGU6IGgsXG4gICAgcGxhY2Vob2xkZXI6IGQsXG4gICAgZGlzYWJsZWQ6IEMsXG4gICAgaXNTaW5nbGVTZWxlY3Q6IGYsXG4gICAgaWQ6IGIsXG4gICAgYXJpYUxhYmVsOiBnLFxuICAgIGljb25FbGVtZW50czogayxcbiAgICBpbnB1dENhbGxiYWNrOiB3LFxuICAgIHNlYXJjaENhbGxiYWNrOiB5LFxuICAgIG9wZW5DYWxsYmFjazogeCxcbiAgICBjbG9zZUNhbGxiYWNrOiAkLFxuICAgIGtleWRvd25DYWxsYmFjazogYWUsXG4gICAgZm9jdXNDYWxsYmFjazogQ3QsXG4gICAgYmx1ckNhbGxiYWNrOiBndCxcbiAgICBuYW1lQ2hhbmdlQ2FsbGJhY2s6IG9lXG4gIH0pIHtcbiAgICAvLyBQcml2YXRlIG1ldGhvZHNcbiAgICByKHRoaXMsIHVlKTtcbiAgICByKHRoaXMsIEgpO1xuICAgIHIodGhpcywgcGUpO1xuICAgIHIodGhpcywgbWUpO1xuICAgIHIodGhpcywgRyk7XG4gICAgcih0aGlzLCBPKTtcbiAgICByKHRoaXMsIGZlKTtcbiAgICByKHRoaXMsIGJlKTtcbiAgICByKHRoaXMsIENlKTtcbiAgICByKHRoaXMsIGdlKTtcbiAgICByKHRoaXMsIGtlKTtcbiAgICByKHRoaXMsIHdlKTtcbiAgICByKHRoaXMsIEVlKTtcbiAgICByKHRoaXMsIHZlKTtcbiAgICByKHRoaXMsIExlKTtcbiAgICByKHRoaXMsIHllKTtcbiAgICByKHRoaXMsIHhlKTtcbiAgICByKHRoaXMsIFNlKTtcbiAgICByKHRoaXMsIF9lKTtcbiAgICByKHRoaXMsIEFlKTtcbiAgICByKHRoaXMsIFRlKTtcbiAgICByKHRoaXMsIE5lKTtcbiAgICAvLyBFbWl0c1xuICAgIHIodGhpcywgeik7XG4gICAgLy8gUHJvcHNcbiAgICBjKHRoaXMsIFwidmFsdWVcIik7XG4gICAgYyh0aGlzLCBcInNob3dUYWdzXCIpO1xuICAgIGModGhpcywgXCJ0YWdzQ291bnRUZXh0XCIpO1xuICAgIGModGhpcywgXCJjbGVhcmFibGVcIik7XG4gICAgYyh0aGlzLCBcImlzQWx3YXlzT3BlbmVkXCIpO1xuICAgIGModGhpcywgXCJzZWFyY2hhYmxlXCIpO1xuICAgIGModGhpcywgXCJwbGFjZWhvbGRlclwiKTtcbiAgICBjKHRoaXMsIFwiZGlzYWJsZWRcIik7XG4gICAgYyh0aGlzLCBcImlzU2luZ2xlU2VsZWN0XCIpO1xuICAgIGModGhpcywgXCJpZFwiKTtcbiAgICBjKHRoaXMsIFwiYXJpYUxhYmVsXCIpO1xuICAgIGModGhpcywgXCJpY29uRWxlbWVudHNcIik7XG4gICAgLy8gSW5uZXJTdGF0ZVxuICAgIGModGhpcywgXCJpc09wZW5lZFwiKTtcbiAgICBjKHRoaXMsIFwic2VhcmNoVGV4dFwiKTtcbiAgICBjKHRoaXMsIFwic3JjRWxlbWVudFwiKTtcbiAgICAvLyBQcml2YXRlSW5uZXJTdGF0ZVxuICAgIHIodGhpcywgTiwgdm9pZCAwKTtcbiAgICByKHRoaXMsIEUsIHZvaWQgMCk7XG4gICAgcih0aGlzLCBELCB2b2lkIDApO1xuICAgIHIodGhpcywgdiwgdm9pZCAwKTtcbiAgICAvLyBDYWxsYmFja3NcbiAgICBjKHRoaXMsIFwiaW5wdXRDYWxsYmFja1wiKTtcbiAgICBjKHRoaXMsIFwic2VhcmNoQ2FsbGJhY2tcIik7XG4gICAgYyh0aGlzLCBcIm9wZW5DYWxsYmFja1wiKTtcbiAgICBjKHRoaXMsIFwiY2xvc2VDYWxsYmFja1wiKTtcbiAgICBjKHRoaXMsIFwia2V5ZG93bkNhbGxiYWNrXCIpO1xuICAgIGModGhpcywgXCJmb2N1c0NhbGxiYWNrXCIpO1xuICAgIGModGhpcywgXCJibHVyQ2FsbGJhY2tcIik7XG4gICAgYyh0aGlzLCBcIm5hbWVDaGFuZ2VDYWxsYmFja1wiKTtcbiAgICB0aGlzLnZhbHVlID0gZSwgdGhpcy5zaG93VGFncyA9IHQsIHRoaXMudGFnc0NvdW50VGV4dCA9IHMsIHRoaXMuc2VhcmNoYWJsZSA9IGgsIHRoaXMucGxhY2Vob2xkZXIgPSBkLCB0aGlzLmNsZWFyYWJsZSA9IGksIHRoaXMuaXNBbHdheXNPcGVuZWQgPSBhLCB0aGlzLmRpc2FibGVkID0gQywgdGhpcy5pc1NpbmdsZVNlbGVjdCA9IGYsIHRoaXMuaWQgPSBiLCB0aGlzLmFyaWFMYWJlbCA9IGcsIHRoaXMuaWNvbkVsZW1lbnRzID0gaywgdGhpcy5pc09wZW5lZCA9ICExLCB0aGlzLnNlYXJjaFRleHQgPSBcIlwiLCBtKHRoaXMsIE4sIG8odGhpcywgQ2UsIGp0KS5jYWxsKHRoaXMpKSwgbSh0aGlzLCBFLCBvKHRoaXMsIExlLCBZdCkuY2FsbCh0aGlzKSksIG0odGhpcywgRCwgbyh0aGlzLCBTZSwgSnQpLmNhbGwodGhpcykpLCBtKHRoaXMsIHYsIG51bGwpLCB0aGlzLmlucHV0Q2FsbGJhY2sgPSB3LCB0aGlzLnNlYXJjaENhbGxiYWNrID0geSwgdGhpcy5vcGVuQ2FsbGJhY2sgPSB4LCB0aGlzLmNsb3NlQ2FsbGJhY2sgPSAkLCB0aGlzLmtleWRvd25DYWxsYmFjayA9IGFlLCB0aGlzLmZvY3VzQ2FsbGJhY2sgPSBDdCwgdGhpcy5ibHVyQ2FsbGJhY2sgPSBndCwgdGhpcy5uYW1lQ2hhbmdlQ2FsbGJhY2sgPSBvZSwgdGhpcy5zcmNFbGVtZW50ID0gbyh0aGlzLCBmZSwgRnQpLmNhbGwodGhpcywgbih0aGlzLCBOKSwgbih0aGlzLCBFKSwgbih0aGlzLCBEKSksIG8odGhpcywgdWUsIEh0KS5jYWxsKHRoaXMpO1xuICB9XG4gIC8vIFB1YmxpYyBtZXRob2RzXG4gIGZvY3VzKCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4gbih0aGlzLCBFKS5mb2N1cygpLCAwKTtcbiAgfVxuICBibHVyKCkge1xuICAgIHRoaXMuaXNPcGVuZWQgJiYgbyh0aGlzLCBPLCBWKS5jYWxsKHRoaXMpLCB0aGlzLmNsZWFyU2VhcmNoKCksIG4odGhpcywgRSkuYmx1cigpO1xuICB9XG4gIHVwZGF0ZVZhbHVlKGUpIHtcbiAgICB0aGlzLnZhbHVlID0gZSwgbyh0aGlzLCBILCBXKS5jYWxsKHRoaXMpLCBvKHRoaXMsIEcsIFUpLmNhbGwodGhpcyk7XG4gIH1cbiAgcmVtb3ZlSXRlbShlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMudmFsdWUuZmlsdGVyKCh0KSA9PiB0LmlkICE9PSBlKSwgbyh0aGlzLCB6LCB3dCkuY2FsbCh0aGlzKSwgbyh0aGlzLCBILCBXKS5jYWxsKHRoaXMpLCBvKHRoaXMsIEcsIFUpLmNhbGwodGhpcyk7XG4gIH1cbiAgY2xlYXIoKSB7XG4gICAgdGhpcy52YWx1ZSA9IFtdLCBvKHRoaXMsIHosIHd0KS5jYWxsKHRoaXMpLCBvKHRoaXMsIEgsIFcpLmNhbGwodGhpcyksIHRoaXMuY2xlYXJTZWFyY2goKTtcbiAgfVxuICBvcGVuQ2xvc2UoKSB7XG4gICAgbyh0aGlzLCBPLCBWKS5jYWxsKHRoaXMpO1xuICB9XG4gIGNsZWFyU2VhcmNoKCkge1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9IFwiXCIsIHRoaXMuc2VhcmNoQ2FsbGJhY2soXCJcIiksIG8odGhpcywgRywgVSkuY2FsbCh0aGlzKTtcbiAgfVxufVxuTiA9IG5ldyBXZWFrTWFwKCksIEUgPSBuZXcgV2Vha01hcCgpLCBEID0gbmV3IFdlYWtNYXAoKSwgdiA9IG5ldyBXZWFrTWFwKCksIHVlID0gbmV3IFdlYWtTZXQoKSwgSHQgPSBmdW5jdGlvbigpIHtcbiAgbyh0aGlzLCBILCBXKS5jYWxsKHRoaXMpLCBvKHRoaXMsIEcsIFUpLmNhbGwodGhpcyksIG8odGhpcywgcGUsIEd0KS5jYWxsKHRoaXMpO1xufSwgSCA9IG5ldyBXZWFrU2V0KCksIFcgPSBmdW5jdGlvbigpIHtcbiAgaWYgKG4odGhpcywgTikuaW5uZXJIVE1MID0gXCJcIiwgdGhpcy5zaG93VGFncykge1xuICAgIG4odGhpcywgTikuYXBwZW5kKC4uLm8odGhpcywgZ2UsIFJ0KS5jYWxsKHRoaXMpKTtcbiAgICBjb25zdCBlID0gaGkodGhpcy52YWx1ZSk7XG4gICAgdGhpcy5uYW1lQ2hhbmdlQ2FsbGJhY2soZSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZSA9IG8odGhpcywgdmUsIHp0KS5jYWxsKHRoaXMpO1xuICAgIG4odGhpcywgTikuYXBwZW5kQ2hpbGQoZSksIHRoaXMubmFtZUNoYW5nZUNhbGxiYWNrKGUuaW5uZXJUZXh0KTtcbiAgfVxuICBuKHRoaXMsIE4pLmFwcGVuZENoaWxkKG4odGhpcywgRSkpO1xufSwgcGUgPSBuZXcgV2Vha1NldCgpLCBHdCA9IGZ1bmN0aW9uKCkge1xuICBjb25zdCBlID0gW107XG4gIG4odGhpcywgRCkuaW5uZXJIVE1MID0gXCJcIiwgdGhpcy5jbGVhcmFibGUgJiYgZS5wdXNoKG8odGhpcywgX2UsIFp0KS5jYWxsKHRoaXMpKSwgdGhpcy5pc0Fsd2F5c09wZW5lZCB8fCBlLnB1c2gobyh0aGlzLCBUZSwgZXMpLmNhbGwodGhpcywgdGhpcy5pc09wZW5lZCkpLCBlLmxlbmd0aCAmJiBuKHRoaXMsIEQpLmFwcGVuZCguLi5lKTtcbn0sIG1lID0gbmV3IFdlYWtTZXQoKSwgTXQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLmlzQWx3YXlzT3BlbmVkICYmIG4odGhpcywgdikpIHtcbiAgICBjb25zdCBlID0gdGhpcy5pc09wZW5lZCA/IHRoaXMuaWNvbkVsZW1lbnRzLmFycm93VXAgOiB0aGlzLmljb25FbGVtZW50cy5hcnJvd0Rvd247XG4gICAgSShlLCBuKHRoaXMsIHYpKTtcbiAgfVxufSwgRyA9IG5ldyBXZWFrU2V0KCksIFUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGU7XG4gIChlID0gdGhpcy52YWx1ZSkgIT0gbnVsbCAmJiBlLmxlbmd0aCA/IChuKHRoaXMsIEUpLnJlbW92ZUF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpLCB0aGlzLnNyY0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtaW5wdXQtLXZhbHVlLW5vdC1zZWxlY3RlZFwiKSkgOiAobih0aGlzLCBFKS5zZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiLCB0aGlzLnBsYWNlaG9sZGVyKSwgdGhpcy5zcmNFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0LS12YWx1ZS1ub3Qtc2VsZWN0ZWRcIikpLCB0aGlzLnNlYXJjaGFibGUgPyB0aGlzLnNyY0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtaW5wdXQtLXVuc2VhcmNoYWJsZVwiKSA6IHRoaXMuc3JjRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1pbnB1dC0tdW5zZWFyY2hhYmxlXCIpLCB0aGlzLmlzU2luZ2xlU2VsZWN0ID8gdGhpcy5zcmNFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0LS1pcy1zaW5nbGUtc2VsZWN0XCIpIDogdGhpcy5zcmNFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LWlucHV0LS1pcy1zaW5nbGUtc2VsZWN0XCIpLCBuKHRoaXMsIEUpLnZhbHVlID0gdGhpcy5zZWFyY2hUZXh0O1xufSwgTyA9IG5ldyBXZWFrU2V0KCksIFYgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5pc09wZW5lZCA9ICF0aGlzLmlzT3BlbmVkLCBvKHRoaXMsIG1lLCBNdCkuY2FsbCh0aGlzKSwgdGhpcy5pc09wZW5lZCA/IHRoaXMub3BlbkNhbGxiYWNrKCkgOiB0aGlzLmNsb3NlQ2FsbGJhY2soKTtcbn0sIGZlID0gbmV3IFdlYWtTZXQoKSwgRnQgPSBmdW5jdGlvbihlLCB0LCBzKSB7XG4gIGNvbnN0IGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICByZXR1cm4gaS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1pbnB1dFwiKSwgaS5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpLCBpLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgKGEpID0+IG8odGhpcywgYmUsIHF0KS5jYWxsKHRoaXMsIGEpKSwgaS5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgKCkgPT4gdGhpcy5mb2N1c0NhbGxiYWNrKCksICEwKSwgaS5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCAoKSA9PiB0aGlzLmJsdXJDYWxsYmFjaygpLCAhMCksIGUuYXBwZW5kQ2hpbGQodCksIGkuYXBwZW5kKGUsIHMpLCBpO1xufSwgYmUgPSBuZXcgV2Vha1NldCgpLCBxdCA9IGZ1bmN0aW9uKGUpIHtcbiAgZS5zdG9wUHJvcGFnYXRpb24oKSwgdGhpcy5pc09wZW5lZCB8fCBvKHRoaXMsIE8sIFYpLmNhbGwodGhpcyksIHRoaXMuZm9jdXMoKTtcbn0sIENlID0gbmV3IFdlYWtTZXQoKSwganQgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHJldHVybiBlLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0X190YWdzXCIpLCBlO1xufSwgZ2UgPSBuZXcgV2Vha1NldCgpLCBSdCA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy52YWx1ZS5tYXAoKGUpID0+IHtcbiAgICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0LmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0X190YWdzLWVsZW1lbnRcIiksIHQuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCItMVwiKSwgdC5zZXRBdHRyaWJ1dGUoXCJ0YWctaWRcIiwgZS5pZC50b1N0cmluZygpKSwgdC5zZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiLCBlLm5hbWUpO1xuICAgIGNvbnN0IHMgPSBvKHRoaXMsIHdlLCBXdCkuY2FsbCh0aGlzLCBlLm5hbWUpLCBpID0gbyh0aGlzLCBFZSwgVXQpLmNhbGwodGhpcyk7XG4gICAgcmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoYSkgPT4gbyh0aGlzLCBrZSwgJHQpLmNhbGwodGhpcywgYSwgZS5pZCkpLCB0LmFwcGVuZChzLCBpKSwgdDtcbiAgfSk7XG59LCBrZSA9IG5ldyBXZWFrU2V0KCksICR0ID0gZnVuY3Rpb24oZSwgdCkge1xuICBlLnByZXZlbnREZWZhdWx0KCksIGUuc3RvcFByb3BhZ2F0aW9uKCksIHRoaXMucmVtb3ZlSXRlbSh0KSwgdGhpcy5mb2N1cygpO1xufSwgd2UgPSBuZXcgV2Vha1NldCgpLCBXdCA9IGZ1bmN0aW9uKGUpIHtcbiAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICByZXR1cm4gdC5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1pbnB1dF9fdGFncy1uYW1lXCIpLCB0LnRleHRDb250ZW50ID0gZSwgdDtcbn0sIEVlID0gbmV3IFdlYWtTZXQoKSwgVXQgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICByZXR1cm4gZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1pbnB1dF9fdGFncy1jcm9zc1wiKSwgSSh0aGlzLmljb25FbGVtZW50cy5jcm9zcywgZSksIGU7XG59LCB2ZSA9IG5ldyBXZWFrU2V0KCksIHp0ID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgaWYgKGUuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtaW5wdXRfX3RhZ3MtY291bnRcIiksICF0aGlzLnZhbHVlLmxlbmd0aClcbiAgICByZXR1cm4gZS50ZXh0Q29udGVudCA9IFwiXCIsIGUuc2V0QXR0cmlidXRlKFwidGl0bGVcIiwgXCJcIiksIGU7XG4gIGNvbnN0IHQgPSB0aGlzLnZhbHVlLmxlbmd0aCA9PT0gMSA/IHRoaXMudmFsdWVbMF0ubmFtZSA6IGAke3RoaXMudmFsdWUubGVuZ3RofSAke3RoaXMudGFnc0NvdW50VGV4dH1gO1xuICByZXR1cm4gZS50ZXh0Q29udGVudCA9IHQsIGUuc2V0QXR0cmlidXRlKFwidGl0bGVcIiwgdCksIGU7XG59LCBMZSA9IG5ldyBXZWFrU2V0KCksIFl0ID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gIHJldHVybiBlLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0X19lZGl0XCIpLCB0aGlzLmlkICYmIGUuc2V0QXR0cmlidXRlKFwiaWRcIiwgdGhpcy5pZCksICghdGhpcy5zZWFyY2hhYmxlIHx8IHRoaXMuZGlzYWJsZWQpICYmIGUuc2V0QXR0cmlidXRlKFwicmVhZG9ubHlcIiwgXCJyZWFkb25seVwiKSwgdGhpcy5kaXNhYmxlZCAmJiBlLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIiksIHRoaXMuYXJpYUxhYmVsLmxlbmd0aCAmJiBlLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgdGhpcy5hcmlhTGFiZWwpLCBlLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsICh0KSA9PiBvKHRoaXMsIHllLCBLdCkuY2FsbCh0aGlzLCB0KSksIGUuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsICh0KSA9PiBvKHRoaXMsIHhlLCBYdCkuY2FsbCh0aGlzLCB0LCBlKSksIGU7XG59LCB5ZSA9IG5ldyBXZWFrU2V0KCksIEt0ID0gZnVuY3Rpb24oZSkge1xuICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICBjb25zdCB0ID0gZS5rZXk7XG4gIHQgPT09IFwiQmFja3NwYWNlXCIgJiYgIXRoaXMuc2VhcmNoVGV4dC5sZW5ndGggJiYgdGhpcy52YWx1ZS5sZW5ndGggJiYgIXRoaXMuc2hvd1RhZ3MgJiYgdGhpcy5jbGVhcigpLCB0ID09PSBcIkJhY2tzcGFjZVwiICYmICF0aGlzLnNlYXJjaFRleHQubGVuZ3RoICYmIHRoaXMudmFsdWUubGVuZ3RoICYmIHRoaXMucmVtb3ZlSXRlbSh0aGlzLnZhbHVlW3RoaXMudmFsdWUubGVuZ3RoIC0gMV0uaWQpLCBlLmNvZGUgPT09IFwiU3BhY2VcIiAmJiAoIXRoaXMuc2VhcmNoVGV4dCB8fCAhdGhpcy5zZWFyY2hhYmxlKSAmJiBvKHRoaXMsIE8sIFYpLmNhbGwodGhpcyksICh0ID09PSBcIkVudGVyXCIgfHwgdCA9PT0gXCJBcnJvd0Rvd25cIiB8fCB0ID09PSBcIkFycm93VXBcIikgJiYgZS5wcmV2ZW50RGVmYXVsdCgpLCB0aGlzLmtleWRvd25DYWxsYmFjayhlKSwgdCAhPT0gXCJUYWJcIiAmJiB0aGlzLmZvY3VzKCk7XG59LCB4ZSA9IG5ldyBXZWFrU2V0KCksIFh0ID0gZnVuY3Rpb24oZSwgdCkge1xuICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICBjb25zdCBzID0gdGhpcy5zZWFyY2hUZXh0LCBpID0gdC52YWx1ZS50cmltKCk7XG4gIGlmIChzLmxlbmd0aCA9PT0gMCAmJiBpLmxlbmd0aCA9PT0gMCkge1xuICAgIHQudmFsdWUgPSBcIlwiO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAodGhpcy5zZWFyY2hhYmxlKSB7XG4gICAgY29uc3QgYSA9IGUudGFyZ2V0LnZhbHVlO1xuICAgIHRoaXMuc2VhcmNoQ2FsbGJhY2soYSksIHRoaXMuaXNPcGVuZWQgfHwgbyh0aGlzLCBPLCBWKS5jYWxsKHRoaXMpO1xuICB9IGVsc2VcbiAgICB0LnZhbHVlID0gXCJcIjtcbiAgdGhpcy5zZWFyY2hUZXh0ID0gdC52YWx1ZTtcbn0sIFNlID0gbmV3IFdlYWtTZXQoKSwgSnQgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHJldHVybiBlLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0X19vcGVyYXRvcnNcIiksIGU7XG59LCBfZSA9IG5ldyBXZWFrU2V0KCksIFp0ID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgcmV0dXJuIGUuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtaW5wdXRfX2NsZWFyXCIpLCBlLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIiksIEkodGhpcy5pY29uRWxlbWVudHMuY2xlYXIsIGUpLCBlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgKHQpID0+IG8odGhpcywgQWUsIFF0KS5jYWxsKHRoaXMsIHQpKSwgZTtcbn0sIEFlID0gbmV3IFdlYWtTZXQoKSwgUXQgPSBmdW5jdGlvbihlKSB7XG4gIGUucHJldmVudERlZmF1bHQoKSwgZS5zdG9wUHJvcGFnYXRpb24oKSwgKHRoaXMuc2VhcmNoVGV4dC5sZW5ndGggfHwgdGhpcy52YWx1ZS5sZW5ndGgpICYmIHRoaXMuY2xlYXIoKSwgdGhpcy5mb2N1cygpO1xufSwgVGUgPSBuZXcgV2Vha1NldCgpLCBlcyA9IGZ1bmN0aW9uKGUpIHtcbiAgbSh0aGlzLCB2LCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSksIG4odGhpcywgdikuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtaW5wdXRfX2Fycm93XCIpO1xuICBjb25zdCB0ID0gZSA/IHRoaXMuaWNvbkVsZW1lbnRzLmFycm93VXAgOiB0aGlzLmljb25FbGVtZW50cy5hcnJvd0Rvd247XG4gIHJldHVybiBJKHQsIG4odGhpcywgdikpLCBuKHRoaXMsIHYpLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgKHMpID0+IG8odGhpcywgTmUsIHRzKS5jYWxsKHRoaXMsIHMpKSwgbih0aGlzLCB2KTtcbn0sIE5lID0gbmV3IFdlYWtTZXQoKSwgdHMgPSBmdW5jdGlvbihlKSB7XG4gIGUuc3RvcFByb3BhZ2F0aW9uKCksIGUucHJldmVudERlZmF1bHQoKSwgdGhpcy5mb2N1cygpLCBvKHRoaXMsIE8sIFYpLmNhbGwodGhpcyk7XG59LCB6ID0gbmV3IFdlYWtTZXQoKSwgd3QgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5pbnB1dENhbGxiYWNrKHRoaXMudmFsdWUpO1xufTtcbmNvbnN0IHNzID0gKGwsIGUsIHQsIHMpID0+IHtcbiAgZmkoZSk7XG4gIGNvbnN0IGkgPSBlLmZpbHRlcigoYSkgPT4gIWEuZGlzYWJsZWQgJiYgbC5zb21lKChoKSA9PiBoID09PSBhLmlkKSk7XG4gIGlmICh0ICYmIGkubGVuZ3RoKSB7XG4gICAgaVswXS5jaGVja2VkID0gITA7XG4gICAgcmV0dXJuO1xuICB9XG4gIGkuZm9yRWFjaCgoYSkgPT4ge1xuICAgIGEuY2hlY2tlZCA9ICEwO1xuICAgIGNvbnN0IGggPSBJdChhLCBlLCBzKTtcbiAgICBhLmNoZWNrZWQgPSBoO1xuICB9KTtcbn0sIEl0ID0gKHsgaWQ6IGwsIGNoZWNrZWQ6IGUgfSwgdCwgcykgPT4ge1xuICBjb25zdCBpID0gdC5maW5kKChoKSA9PiBoLmlkID09PSBsKTtcbiAgaWYgKCFpKVxuICAgIHJldHVybiAhMTtcbiAgaWYgKHMpXG4gICAgcmV0dXJuIGkuY2hlY2tlZCA9IGkuZGlzYWJsZWQgPyAhMSA6ICEhZSwgaS5jaGVja2VkO1xuICBjb25zdCBhID0gaXMoISFlLCBpLCB0KTtcbiAgcmV0dXJuIGxzKGksIHQpLCBhO1xufSwgaXMgPSAobCwgZSwgdCkgPT4ge1xuICBpZiAoIWUuaXNHcm91cClcbiAgICByZXR1cm4gZS5jaGVja2VkID0gZS5kaXNhYmxlZCA/ICExIDogISFsLCBlLmlzUGFydGlhbENoZWNrZWQgPSAhMSwgZS5jaGVja2VkO1xuICBjb25zdCBzID0gdC5maWx0ZXIoKGQpID0+IGQuY2hpbGRPZiA9PT0gZS5pZCk7XG4gIHJldHVybiAhbCB8fCBlLmRpc2FibGVkIHx8IGUuaXNQYXJ0aWFsQ2hlY2tlZCA/IChlLmNoZWNrZWQgPSAhMSwgZS5pc1BhcnRpYWxDaGVja2VkID0gITEsIEV0KGUsIHMsIHQpLCBlLmNoZWNrZWQpIDogbnMocywgdCkgPyBhcyhzKSA/IChlLmNoZWNrZWQgPSAhMSwgZS5pc1BhcnRpYWxDaGVja2VkID0gITEsIGUuZGlzYWJsZWQgPSAhMCwgZS5jaGVja2VkKSA6IChlLmNoZWNrZWQgPSAhMSwgZS5pc1BhcnRpYWxDaGVja2VkID0gITAsIHMuZm9yRWFjaCgoZCkgPT4ge1xuICAgIGlzKGwsIGQsIHQpO1xuICB9KSwgZS5jaGVja2VkKSA6IChlLmNoZWNrZWQgPSAhMCwgZS5pc1BhcnRpYWxDaGVja2VkID0gITEsIEV0KGUsIHMsIHQpLCBlLmNoZWNrZWQpO1xufSwgbHMgPSAobCwgZSkgPT4ge1xuICBjb25zdCB0ID0gZS5maW5kKChzKSA9PiBzLmlkID09PSBsLmNoaWxkT2YpO1xuICB0ICYmICh1aSh0LCBlKSwgbHModCwgZSkpO1xufSwgdWkgPSAobCwgZSkgPT4ge1xuICBjb25zdCB0ID0gZnQobCwgZSk7XG4gIGlmIChhcyh0KSkge1xuICAgIGwuY2hlY2tlZCA9ICExLCBsLmlzUGFydGlhbENoZWNrZWQgPSAhMSwgbC5kaXNhYmxlZCA9ICEwO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAocGkodCkpIHtcbiAgICBsLmNoZWNrZWQgPSAhMCwgbC5pc1BhcnRpYWxDaGVja2VkID0gITE7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChtaSh0KSkge1xuICAgIGwuY2hlY2tlZCA9ICExLCBsLmlzUGFydGlhbENoZWNrZWQgPSAhMDtcbiAgICByZXR1cm47XG4gIH1cbiAgbC5jaGVja2VkID0gITEsIGwuaXNQYXJ0aWFsQ2hlY2tlZCA9ICExO1xufSwgRXQgPSAoeyBjaGVja2VkOiBsLCBkaXNhYmxlZDogZSB9LCB0LCBzKSA9PiB7XG4gIHQuZm9yRWFjaCgoaSkgPT4ge1xuICAgIGkuZGlzYWJsZWQgPSAhIWUgfHwgISFpLmRpc2FibGVkLCBpLmNoZWNrZWQgPSAhIWwgJiYgIWkuZGlzYWJsZWQsIGkuaXNQYXJ0aWFsQ2hlY2tlZCA9ICExO1xuICAgIGNvbnN0IGEgPSBmdChpLCBzKTtcbiAgICBFdCh7IGNoZWNrZWQ6IGwsIGRpc2FibGVkOiBlIH0sIGEsIHMpO1xuICB9KTtcbn0sIG5zID0gKGwsIGUpID0+IGwuc29tZSgoaSkgPT4gaS5kaXNhYmxlZCkgPyAhMCA6IGwuc29tZSgoaSkgPT4ge1xuICBpZiAoaS5pc0dyb3VwKSB7XG4gICAgY29uc3QgYSA9IGZ0KGksIGUpO1xuICAgIHJldHVybiBucyhhLCBlKTtcbiAgfVxuICByZXR1cm4gITE7XG59KSwgYXMgPSAobCkgPT4gbC5ldmVyeSgoZSkgPT4gISFlLmRpc2FibGVkKSwgcGkgPSAobCkgPT4gbC5ldmVyeSgoZSkgPT4gISFlLmNoZWNrZWQpLCBtaSA9IChsKSA9PiBsLnNvbWUoKGUpID0+ICEhZS5jaGVja2VkIHx8ICEhZS5pc1BhcnRpYWxDaGVja2VkKSwgZmkgPSAobCkgPT4ge1xuICBsLmZvckVhY2goKGUpID0+IHtcbiAgICBlLmNoZWNrZWQgPSAhMSwgZS5pc1BhcnRpYWxDaGVja2VkID0gITE7XG4gIH0pO1xufSwgYmkgPSAobCwgZSwgdCkgPT4ge1xuICBjb25zdCBzID0geyBsZXZlbDogMCwgZ3JvdXBJZDogXCJcIiB9LCBpID0gb3MobCwgZSwgcy5ncm91cElkLCBzLmxldmVsKTtcbiAgcmV0dXJuIGdpKGksIHQpO1xufSwgb3MgPSAobCwgZSwgdCwgcykgPT4gbC5yZWR1Y2UoKGksIGEpID0+IHtcbiAgdmFyIGY7XG4gIGNvbnN0IGggPSAhISgoZiA9IGEuY2hpbGRyZW4pICE9IG51bGwgJiYgZi5sZW5ndGgpLCBkID0gcyA+PSBlICYmIGgsIEMgPSBzID4gZTtcbiAgaWYgKGkucHVzaCh7XG4gICAgaWQ6IGEudmFsdWUsXG4gICAgbmFtZTogYS5uYW1lLFxuICAgIGNoaWxkT2Y6IHQsXG4gICAgaXNHcm91cDogaCxcbiAgICBjaGVja2VkOiAhMSxcbiAgICBpc1BhcnRpYWxDaGVja2VkOiAhMSxcbiAgICBsZXZlbDogcyxcbiAgICBpc0Nsb3NlZDogZCxcbiAgICBoaWRkZW46IEMsXG4gICAgZGlzYWJsZWQ6IGEuZGlzYWJsZWQgPz8gITFcbiAgfSksIGgpIHtcbiAgICBjb25zdCBiID0gb3MoYS5jaGlsZHJlbiwgZSwgYS52YWx1ZSwgcyArIDEpO1xuICAgIGkucHVzaCguLi5iKTtcbiAgfVxuICByZXR1cm4gaTtcbn0sIFtdKSwgZnQgPSAoeyBpZDogbCB9LCBlKSA9PiBlLmZpbHRlcigodCkgPT4gdC5jaGlsZE9mID09PSBsKSwgQ2kgPSAobCkgPT4ge1xuICBjb25zdCB7IHVuZ3JvdXBlZE5vZGVzOiBlLCBhbGxHcm91cGVkTm9kZXM6IHQsIGFsbE5vZGVzOiBzIH0gPSBsLnJlZHVjZShcbiAgICAoYSwgaCkgPT4gKGguY2hlY2tlZCAmJiAoYS5hbGxOb2Rlcy5wdXNoKGgpLCBoLmlzR3JvdXAgPyBhLmFsbEdyb3VwZWROb2Rlcy5wdXNoKGgpIDogYS51bmdyb3VwZWROb2Rlcy5wdXNoKGgpKSwgYSksXG4gICAge1xuICAgICAgdW5ncm91cGVkTm9kZXM6IFtdLFxuICAgICAgYWxsR3JvdXBlZE5vZGVzOiBbXSxcbiAgICAgIGFsbE5vZGVzOiBbXVxuICAgIH1cbiAgKSwgaSA9IHMuZmlsdGVyKChhKSA9PiAhdC5zb21lKCh7IGlkOiBoIH0pID0+IGggPT09IGEuY2hpbGRPZikpO1xuICByZXR1cm4geyB1bmdyb3VwZWROb2RlczogZSwgZ3JvdXBlZE5vZGVzOiBpLCBhbGxOb2RlczogcyB9O1xufSwgZ2kgPSAobCwgZSkgPT4gKGwuZmlsdGVyKChzKSA9PiAhIXMuZGlzYWJsZWQpLmZvckVhY2goXG4gICh7IGlkOiBzIH0pID0+IEl0KHsgaWQ6IHMsIGNoZWNrZWQ6ICExIH0sIGwsIGUpXG4pLCBsKSwgYnQgPSAobCwgeyBpZDogZSwgaXNDbG9zZWQ6IHQgfSkgPT4ge1xuICBmdCh7IGlkOiBlIH0sIGwpLmZvckVhY2goKGkpID0+IHtcbiAgICBpLmhpZGRlbiA9IHQgPz8gITEsIGkuaXNHcm91cCAmJiAhaS5pc0Nsb3NlZCAmJiBidChsLCB7IGlkOiBpLmlkLCBpc0Nsb3NlZDogdCB9KTtcbiAgfSk7XG59LCBraSA9IChsKSA9PiB7XG4gIGwuZmlsdGVyKChlKSA9PiBlLmlzR3JvdXAgJiYgIWUuZGlzYWJsZWQgJiYgKGUuY2hlY2tlZCB8fCBlLmlzUGFydGlhbENoZWNrZWQpKS5mb3JFYWNoKChlKSA9PiB7XG4gICAgZS5pc0Nsb3NlZCA9ICExLCBidChsLCBlKTtcbiAgfSk7XG59LCB3aSA9IChsLCBlKSA9PiB7XG4gIGNvbnN0IHQgPSBFaShsLCBlKTtcbiAgbC5mb3JFYWNoKChzKSA9PiB7XG4gICAgdC5zb21lKCh7IGlkOiBhIH0pID0+IGEgPT09IHMuaWQpID8gKHMuaXNHcm91cCAmJiAocy5pc0Nsb3NlZCA9ICExLCBidChsLCBzKSksIHMuaGlkZGVuID0gITEpIDogcy5oaWRkZW4gPSAhMDtcbiAgfSk7XG59LCBFaSA9IChsLCBlKSA9PiBsLnJlZHVjZSgodCwgcykgPT4ge1xuICBpZiAocy5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZS50b0xvd2VyQ2FzZSgpKSkge1xuICAgIGlmICh0LnB1c2gocyksIHMuaXNHcm91cCkge1xuICAgICAgY29uc3QgYSA9IHJzKHMuaWQsIGwpO1xuICAgICAgdC5wdXNoKC4uLmEpO1xuICAgIH1cbiAgICBpZiAocy5jaGlsZE9mKSB7XG4gICAgICBjb25zdCBhID0gY3Mocy5jaGlsZE9mLCBsKTtcbiAgICAgIHQucHVzaCguLi5hKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHQ7XG59LCBbXSksIHJzID0gKGwsIGUpID0+IGUucmVkdWNlKCh0LCBzKSA9PiAocy5jaGlsZE9mID09PSBsICYmICh0LnB1c2gocyksIHMuaXNHcm91cCAmJiB0LnB1c2goLi4ucnMocy5pZCwgZSkpKSwgdCksIFtdKSwgY3MgPSAobCwgZSkgPT4gZS5yZWR1Y2UoKHQsIHMpID0+IChzLmlkID09PSBsICYmICh0LnB1c2gocyksIHMuY2hpbGRPZiAmJiB0LnB1c2goLi4uY3Mocy5jaGlsZE9mLCBlKSkpLCB0KSwgW10pLCB2aSA9IChsKSA9PiB7XG4gIGNvbnN0IHsgZHVwbGljYXRpb25zOiBlIH0gPSBsLnJlZHVjZShcbiAgICAodCwgcykgPT4gKHQuYWxsSXRlbXMuc29tZSgoaSkgPT4gaS50b1N0cmluZygpID09PSBzLmlkLnRvU3RyaW5nKCkpICYmIHQuZHVwbGljYXRpb25zLnB1c2gocy5pZCksIHQuYWxsSXRlbXMucHVzaChzLmlkKSwgdCksXG4gICAge1xuICAgICAgZHVwbGljYXRpb25zOiBbXSxcbiAgICAgIGFsbEl0ZW1zOiBbXVxuICAgIH1cbiAgKTtcbiAgZS5sZW5ndGggJiYgY29uc29sZS5lcnJvcihgVmFsaWRhdGlvbjogWW91IGhhdmUgZHVwbGljYXRlZCB2YWx1ZXM6ICR7ZS5qb2luKFwiLCBcIil9ISBZb3Ugc2hvdWxkIHVzZSB1bmlxdWUgdmFsdWVzLmApO1xufSwgTGkgPSAobCwgZSwgdCwgcywgaSwgYSwgaCwgZCwgQywgZikgPT4ge1xuICBzcyhsLCBlLCBpLCBDKSwgZCAmJiBoICYmIGtpKGUpLCBjZShlLCB0LCBzLCBhLCBmKTtcbn0sIGNlID0gKGwsIGUsIHQsIHMsIGkpID0+IHtcbiAgbC5mb3JFYWNoKChhKSA9PiB7XG4gICAgY29uc3QgaCA9IGUucXVlcnlTZWxlY3RvcihgW2lucHV0LWlkPVwiJHthLmlkfVwiXWApLCBkID0gVChoKTtcbiAgICBoLmNoZWNrZWQgPSBhLmNoZWNrZWQsIHlpKGEsIGQsIHMpLCB4aShhLCBkKSwgU2koYSwgZCksIF9pKGEsIGQsIHQpLCBBaShhLCBkKSwgTmkoYSwgZCwgbCwgaSksIFRpKGEsIGgsIHQpO1xuICB9KSwgT2kobCwgZSk7XG59LCB5aSA9IChsLCBlLCB0KSA9PiB7XG4gIGwuY2hlY2tlZCA/IGUuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tY2hlY2tlZFwiKSA6IGUuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tY2hlY2tlZFwiKSwgQXJyYXkuaXNBcnJheSh0KSAmJiB0WzBdID09PSBsLmlkICYmICFsLmRpc2FibGVkID8gZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1zaW5nbGUtc2VsZWN0ZWRcIikgOiBlLmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLXNpbmdsZS1zZWxlY3RlZFwiKTtcbn0sIHhpID0gKGwsIGUpID0+IHtcbiAgbC5pc1BhcnRpYWxDaGVja2VkID8gZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1wYXJ0aWFsLWNoZWNrZWRcIikgOiBlLmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLXBhcnRpYWwtY2hlY2tlZFwiKTtcbn0sIFNpID0gKGwsIGUpID0+IHtcbiAgbC5kaXNhYmxlZCA/IGUuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tZGlzYWJsZWRcIikgOiBlLmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLWRpc2FibGVkXCIpO1xufSwgX2kgPSAobCwgZSwgdCkgPT4ge1xuICBpZiAobC5pc0dyb3VwKSB7XG4gICAgY29uc3QgcyA9IGUucXVlcnlTZWxlY3RvcihcIi50cmVlc2VsZWN0LWxpc3RfX2l0ZW0taWNvblwiKSwgaSA9IGwuaXNDbG9zZWQgPyB0LmFycm93UmlnaHQgOiB0LmFycm93RG93bjtcbiAgICBJKGksIHMpLCBsLmlzQ2xvc2VkID8gZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1jbG9zZWRcIikgOiBlLmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLWNsb3NlZFwiKTtcbiAgfVxufSwgQWkgPSAobCwgZSkgPT4ge1xuICBsLmhpZGRlbiA/IGUuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0taGlkZGVuXCIpIDogZS5jbGFzc0xpc3QucmVtb3ZlKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1oaWRkZW5cIik7XG59LCBUaSA9IChsLCBlLCB0KSA9PiB7XG4gIGNvbnN0IGkgPSBlLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvcihcIi50cmVlc2VsZWN0LWxpc3RfX2l0ZW0tY2hlY2tib3gtaWNvblwiKTtcbiAgbC5jaGVja2VkID8gSSh0LmNoZWNrLCBpKSA6IGwuaXNQYXJ0aWFsQ2hlY2tlZCA/IEkodC5wYXJ0aWFsQ2hlY2ssIGkpIDogaS5pbm5lckhUTUwgPSBcIlwiO1xufSwgTmkgPSAobCwgZSwgdCwgcykgPT4ge1xuICBjb25zdCBpID0gbC5sZXZlbCA9PT0gMCwgYSA9IDIwLCBoID0gNTtcbiAgaWYgKGkpIHtcbiAgICBjb25zdCBkID0gdC5zb21lKChiKSA9PiBiLmlzR3JvdXAgJiYgYi5sZXZlbCA9PT0gbC5sZXZlbCksIEMgPSAhbC5pc0dyb3VwICYmIGQgPyBgJHthfXB4YCA6IGAke2h9cHhgLCBmID0gbC5pc0dyb3VwID8gXCIwXCIgOiBDO1xuICAgIHMgPyBlLnN0eWxlLnBhZGRpbmdSaWdodCA9IGYgOiBlLnN0eWxlLnBhZGRpbmdMZWZ0ID0gZjtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkID0gbC5pc0dyb3VwID8gYCR7bC5sZXZlbCAqIGF9cHhgIDogYCR7bC5sZXZlbCAqIGEgKyBhfXB4YDtcbiAgICBzID8gZS5zdHlsZS5wYWRkaW5nUmlnaHQgPSBkIDogZS5zdHlsZS5wYWRkaW5nTGVmdCA9IGQ7XG4gIH1cbiAgZS5zZXRBdHRyaWJ1dGUoXCJsZXZlbFwiLCBsLmxldmVsLnRvU3RyaW5nKCkpLCBlLnNldEF0dHJpYnV0ZShcImdyb3VwXCIsIGwuaXNHcm91cC50b1N0cmluZygpKTtcbn0sIE9pID0gKGwsIGUpID0+IHtcbiAgY29uc3QgdCA9IGwuc29tZSgoaSkgPT4gIWkuaGlkZGVuKSwgcyA9IGUucXVlcnlTZWxlY3RvcihcIi50cmVlc2VsZWN0LWxpc3RfX2VtcHR5XCIpO1xuICB0ID8gcy5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19lbXB0eS0taGlkZGVuXCIpIDogcy5jbGFzc0xpc3QucmVtb3ZlKFwidHJlZXNlbGVjdC1saXN0X19lbXB0eS0taGlkZGVuXCIpO1xufSwgVCA9IChsKSA9PiBsLnBhcmVudE5vZGUucGFyZW50Tm9kZSwgVnQgPSAobCwgZSkgPT4gZS5maW5kKCh0KSA9PiB0LmlkLnRvU3RyaW5nKCkgPT09IGwpLCBJaSA9IChsKSA9PiBUKGwpLnF1ZXJ5U2VsZWN0b3IoXCIudHJlZXNlbGVjdC1saXN0X19pdGVtLWljb25cIiksIFBpID0gKGwsIGUpID0+IHtcbiAgZSAmJiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKCh0KSA9PiB7XG4gICAgY29uc3QgcyA9IGVbdF07XG4gICAgdHlwZW9mIHMgPT0gXCJzdHJpbmdcIiAmJiBsLnNldEF0dHJpYnV0ZSh0LCBzKTtcbiAgfSk7XG59O1xudmFyIE0sIFAsIFMsIFksIE9lLCBocywgSWUsIGRzLCBQZSwgdXMsIEJlLCBwcywgVmUsIG1zLCBEZSwgZnMsIEssIHZ0LCBIZSwgYnMsIEdlLCBDcywgTWUsIGdzLCBYLCBMdCwgRmUsIGtzLCBxZSwgd3MsIGplLCBFcywgUmUsIHZzLCAkZSwgTHMsIFdlLCB5cywgVWUsIHhzLCB6ZSwgU3MsIFllLCBfcywgS2UsIEFzLCBYZSwgVHMsIEosIHl0LCBaLCB4dCwgSmUsIE5zO1xuY2xhc3MgQmkge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgb3B0aW9uczogZSxcbiAgICB2YWx1ZTogdCxcbiAgICBvcGVuTGV2ZWw6IHMsXG4gICAgbGlzdFNsb3RIdG1sQ29tcG9uZW50OiBpLFxuICAgIGVtcHR5VGV4dDogYSxcbiAgICBpc1NpbmdsZVNlbGVjdDogaCxcbiAgICBpY29uRWxlbWVudHM6IGQsXG4gICAgc2hvd0NvdW50OiBDLFxuICAgIGRpc2FibGVkQnJhbmNoTm9kZTogZixcbiAgICBleHBhbmRTZWxlY3RlZDogYixcbiAgICBpc0luZGVwZW5kZW50Tm9kZXM6IGcsXG4gICAgcnRsOiBrLFxuICAgIGlucHV0Q2FsbGJhY2s6IHcsXG4gICAgYXJyb3dDbGlja0NhbGxiYWNrOiB5LFxuICAgIG1vdXNldXBDYWxsYmFjazogeFxuICB9KSB7XG4gICAgLy8gUHJpdmF0ZSBtZXRob2RzXG4gICAgcih0aGlzLCBPZSk7XG4gICAgcih0aGlzLCBJZSk7XG4gICAgcih0aGlzLCBQZSk7XG4gICAgcih0aGlzLCBCZSk7XG4gICAgcih0aGlzLCBWZSk7XG4gICAgcih0aGlzLCBEZSk7XG4gICAgcih0aGlzLCBLKTtcbiAgICByKHRoaXMsIEhlKTtcbiAgICByKHRoaXMsIEdlKTtcbiAgICByKHRoaXMsIE1lKTtcbiAgICByKHRoaXMsIFgpO1xuICAgIHIodGhpcywgRmUpO1xuICAgIHIodGhpcywgcWUpO1xuICAgIHIodGhpcywgamUpO1xuICAgIHIodGhpcywgUmUpO1xuICAgIHIodGhpcywgJGUpO1xuICAgIHIodGhpcywgV2UpO1xuICAgIHIodGhpcywgVWUpO1xuICAgIHIodGhpcywgemUpO1xuICAgIHIodGhpcywgWWUpO1xuICAgIC8vIEFjdGlvbnNcbiAgICByKHRoaXMsIEtlKTtcbiAgICByKHRoaXMsIFhlKTtcbiAgICByKHRoaXMsIEopO1xuICAgIHIodGhpcywgWik7XG4gICAgLy8gRW1pdHNcbiAgICByKHRoaXMsIEplKTtcbiAgICAvLyBQcm9wc1xuICAgIGModGhpcywgXCJvcHRpb25zXCIpO1xuICAgIGModGhpcywgXCJ2YWx1ZVwiKTtcbiAgICBjKHRoaXMsIFwib3BlbkxldmVsXCIpO1xuICAgIGModGhpcywgXCJsaXN0U2xvdEh0bWxDb21wb25lbnRcIik7XG4gICAgYyh0aGlzLCBcImVtcHR5VGV4dFwiKTtcbiAgICBjKHRoaXMsIFwiaXNTaW5nbGVTZWxlY3RcIik7XG4gICAgYyh0aGlzLCBcInNob3dDb3VudFwiKTtcbiAgICBjKHRoaXMsIFwiZGlzYWJsZWRCcmFuY2hOb2RlXCIpO1xuICAgIGModGhpcywgXCJleHBhbmRTZWxlY3RlZFwiKTtcbiAgICBjKHRoaXMsIFwiaXNJbmRlcGVuZGVudE5vZGVzXCIpO1xuICAgIGModGhpcywgXCJydGxcIik7XG4gICAgYyh0aGlzLCBcImljb25FbGVtZW50c1wiKTtcbiAgICAvLyBJbm5lclN0YXRlXG4gICAgYyh0aGlzLCBcInNlYXJjaFRleHRcIik7XG4gICAgYyh0aGlzLCBcImZsYXR0ZWRPcHRpb25zXCIpO1xuICAgIGModGhpcywgXCJmbGF0dGVkT3B0aW9uc0JlZm9yZVNlYXJjaFwiKTtcbiAgICBjKHRoaXMsIFwic2VsZWN0ZWROb2Rlc1wiKTtcbiAgICBjKHRoaXMsIFwic3JjRWxlbWVudFwiKTtcbiAgICAvLyBDYWxsYmFja3NcbiAgICBjKHRoaXMsIFwiaW5wdXRDYWxsYmFja1wiKTtcbiAgICBjKHRoaXMsIFwiYXJyb3dDbGlja0NhbGxiYWNrXCIpO1xuICAgIGModGhpcywgXCJtb3VzZXVwQ2FsbGJhY2tcIik7XG4gICAgLy8gUHJpdmF0ZUlubmVyU3RhdGVcbiAgICByKHRoaXMsIE0sIG51bGwpO1xuICAgIHIodGhpcywgUCwgITApO1xuICAgIHIodGhpcywgUywgW10pO1xuICAgIHIodGhpcywgWSwgITApO1xuICAgIHRoaXMub3B0aW9ucyA9IGUsIHRoaXMudmFsdWUgPSB0LCB0aGlzLm9wZW5MZXZlbCA9IHMgPz8gMCwgdGhpcy5saXN0U2xvdEh0bWxDb21wb25lbnQgPSBpID8/IG51bGwsIHRoaXMuZW1wdHlUZXh0ID0gYSA/PyBcIk5vIHJlc3VsdHMgZm91bmQuLi5cIiwgdGhpcy5pc1NpbmdsZVNlbGVjdCA9IGggPz8gITEsIHRoaXMuc2hvd0NvdW50ID0gQyA/PyAhMSwgdGhpcy5kaXNhYmxlZEJyYW5jaE5vZGUgPSBmID8/ICExLCB0aGlzLmV4cGFuZFNlbGVjdGVkID0gYiA/PyAhMSwgdGhpcy5pc0luZGVwZW5kZW50Tm9kZXMgPSBnID8/ICExLCB0aGlzLnJ0bCA9IGsgPz8gITEsIHRoaXMuaWNvbkVsZW1lbnRzID0gZCwgdGhpcy5zZWFyY2hUZXh0ID0gXCJcIiwgdGhpcy5mbGF0dGVkT3B0aW9ucyA9IGJpKHRoaXMub3B0aW9ucywgdGhpcy5vcGVuTGV2ZWwsIHRoaXMuaXNJbmRlcGVuZGVudE5vZGVzKSwgdGhpcy5mbGF0dGVkT3B0aW9uc0JlZm9yZVNlYXJjaCA9IHRoaXMuZmxhdHRlZE9wdGlvbnMsIHRoaXMuc2VsZWN0ZWROb2RlcyA9IHsgbm9kZXM6IFtdLCBncm91cGVkTm9kZXM6IFtdLCBhbGxOb2RlczogW10gfSwgdGhpcy5zcmNFbGVtZW50ID0gbyh0aGlzLCBQZSwgdXMpLmNhbGwodGhpcyksIHRoaXMuaW5wdXRDYWxsYmFjayA9IHcsIHRoaXMuYXJyb3dDbGlja0NhbGxiYWNrID0geSwgdGhpcy5tb3VzZXVwQ2FsbGJhY2sgPSB4LCB2aSh0aGlzLmZsYXR0ZWRPcHRpb25zKTtcbiAgfVxuICAvLyBQdWJsaWMgbWV0aG9kc1xuICB1cGRhdGVWYWx1ZShlKSB7XG4gICAgdGhpcy52YWx1ZSA9IGUsIG0odGhpcywgUywgdGhpcy5pc1NpbmdsZVNlbGVjdCA/IHRoaXMudmFsdWUgOiBbXSksIExpKFxuICAgICAgZSxcbiAgICAgIHRoaXMuZmxhdHRlZE9wdGlvbnMsXG4gICAgICB0aGlzLnNyY0VsZW1lbnQsXG4gICAgICB0aGlzLmljb25FbGVtZW50cyxcbiAgICAgIHRoaXMuaXNTaW5nbGVTZWxlY3QsXG4gICAgICBuKHRoaXMsIFMpLFxuICAgICAgdGhpcy5leHBhbmRTZWxlY3RlZCxcbiAgICAgIG4odGhpcywgWSksXG4gICAgICB0aGlzLmlzSW5kZXBlbmRlbnROb2RlcyxcbiAgICAgIHRoaXMucnRsXG4gICAgKSwgbSh0aGlzLCBZLCAhMSksIG8odGhpcywgWiwgeHQpLmNhbGwodGhpcyk7XG4gIH1cbiAgdXBkYXRlU2VhcmNoVmFsdWUoZSkge1xuICAgIGlmIChlID09PSB0aGlzLnNlYXJjaFRleHQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdCA9IHRoaXMuc2VhcmNoVGV4dCA9PT0gXCJcIiAmJiBlICE9PSBcIlwiO1xuICAgIHRoaXMuc2VhcmNoVGV4dCA9IGUsIHQgJiYgKHRoaXMuZmxhdHRlZE9wdGlvbnNCZWZvcmVTZWFyY2ggPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZmxhdHRlZE9wdGlvbnMpKSksIHRoaXMuc2VhcmNoVGV4dCA9PT0gXCJcIiAmJiAodGhpcy5mbGF0dGVkT3B0aW9ucyA9IHRoaXMuZmxhdHRlZE9wdGlvbnNCZWZvcmVTZWFyY2gubWFwKChzKSA9PiB7XG4gICAgICBjb25zdCBpID0gdGhpcy5mbGF0dGVkT3B0aW9ucy5maW5kKChhKSA9PiBhLmlkID09PSBzLmlkKTtcbiAgICAgIHJldHVybiBpLmlzQ2xvc2VkID0gcy5pc0Nsb3NlZCwgaS5oaWRkZW4gPSBzLmhpZGRlbiwgaTtcbiAgICB9KSwgdGhpcy5mbGF0dGVkT3B0aW9uc0JlZm9yZVNlYXJjaCA9IFtdKSwgdGhpcy5zZWFyY2hUZXh0ICYmIHdpKHRoaXMuZmxhdHRlZE9wdGlvbnMsIGUpLCBjZSh0aGlzLmZsYXR0ZWRPcHRpb25zLCB0aGlzLnNyY0VsZW1lbnQsIHRoaXMuaWNvbkVsZW1lbnRzLCBuKHRoaXMsIFMpLCB0aGlzLnJ0bCksIHRoaXMuZm9jdXNGaXJzdExpc3RFbGVtZW50KCk7XG4gIH1cbiAgY2FsbEtleUFjdGlvbihlKSB7XG4gICAgbSh0aGlzLCBQLCAhMSk7XG4gICAgY29uc3QgdCA9IHRoaXMuc3JjRWxlbWVudC5xdWVyeVNlbGVjdG9yKFwiLnRyZWVzZWxlY3QtbGlzdF9faXRlbS0tZm9jdXNlZFwiKTtcbiAgICBpZiAodCA9PSBudWxsID8gdm9pZCAwIDogdC5jbGFzc0xpc3QuY29udGFpbnMoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLWhpZGRlblwiKSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBpID0gZS5rZXk7XG4gICAgaSA9PT0gXCJFbnRlclwiICYmIHQgJiYgdC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcIm1vdXNlZG93blwiKSksIChpID09PSBcIkFycm93TGVmdFwiIHx8IGkgPT09IFwiQXJyb3dSaWdodFwiKSAmJiBvKHRoaXMsIE9lLCBocykuY2FsbCh0aGlzLCB0LCBlKSwgKGkgPT09IFwiQXJyb3dEb3duXCIgfHwgaSA9PT0gXCJBcnJvd1VwXCIpICYmIG8odGhpcywgSWUsIGRzKS5jYWxsKHRoaXMsIHQsIGkpO1xuICB9XG4gIGZvY3VzRmlyc3RMaXN0RWxlbWVudCgpIHtcbiAgICBjb25zdCBlID0gXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLWZvY3VzZWRcIiwgdCA9IHRoaXMuc3JjRWxlbWVudC5xdWVyeVNlbGVjdG9yKGAuJHtlfWApLCBzID0gQXJyYXkuZnJvbSh0aGlzLnNyY0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi50cmVlc2VsZWN0LWxpc3RfX2l0ZW0tY2hlY2tib3hcIikpLmZpbHRlcihcbiAgICAgIChhKSA9PiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShUKGEpKS5kaXNwbGF5ICE9PSBcIm5vbmVcIlxuICAgICk7XG4gICAgaWYgKCFzLmxlbmd0aClcbiAgICAgIHJldHVybjtcbiAgICB0ICYmIHQuY2xhc3NMaXN0LnJlbW92ZShlKSwgVChzWzBdKS5jbGFzc0xpc3QuYWRkKGUpO1xuICB9XG4gIGlzTGFzdEZvY3VzZWRFbGVtZW50RXhpc3QoKSB7XG4gICAgcmV0dXJuICEhbih0aGlzLCBNKTtcbiAgfVxufVxuTSA9IG5ldyBXZWFrTWFwKCksIFAgPSBuZXcgV2Vha01hcCgpLCBTID0gbmV3IFdlYWtNYXAoKSwgWSA9IG5ldyBXZWFrTWFwKCksIE9lID0gbmV3IFdlYWtTZXQoKSwgaHMgPSBmdW5jdGlvbihlLCB0KSB7XG4gIGlmICghZSlcbiAgICByZXR1cm47XG4gIGNvbnN0IHMgPSB0LmtleSwgYSA9IGUucXVlcnlTZWxlY3RvcihcIi50cmVlc2VsZWN0LWxpc3RfX2l0ZW0tY2hlY2tib3hcIikuZ2V0QXR0cmlidXRlKFwiaW5wdXQtaWRcIiksIGggPSBWdChhLCB0aGlzLmZsYXR0ZWRPcHRpb25zKSwgZCA9IGUucXVlcnlTZWxlY3RvcihcIi50cmVlc2VsZWN0LWxpc3RfX2l0ZW0taWNvblwiKTtcbiAgcyA9PT0gXCJBcnJvd0xlZnRcIiAmJiAhaC5pc0Nsb3NlZCAmJiBoLmlzR3JvdXAgJiYgKGQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJtb3VzZWRvd25cIikpLCB0LnByZXZlbnREZWZhdWx0KCkpLCBzID09PSBcIkFycm93UmlnaHRcIiAmJiBoLmlzQ2xvc2VkICYmIGguaXNHcm91cCAmJiAoZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcIm1vdXNlZG93blwiKSksIHQucHJldmVudERlZmF1bHQoKSk7XG59LCBJZSA9IG5ldyBXZWFrU2V0KCksIGRzID0gZnVuY3Rpb24oZSwgdCkge1xuICB2YXIgaTtcbiAgY29uc3QgcyA9IEFycmF5LmZyb20odGhpcy5zcmNFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIudHJlZXNlbGVjdC1saXN0X19pdGVtLWNoZWNrYm94XCIpKS5maWx0ZXIoXG4gICAgKGEpID0+IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKFQoYSkpLmRpc3BsYXkgIT09IFwibm9uZVwiXG4gICk7XG4gIGlmIChzLmxlbmd0aClcbiAgICBpZiAoIWUpXG4gICAgICBUKHNbMF0pLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLWZvY3VzZWRcIik7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCBhID0gcy5maW5kSW5kZXgoXG4gICAgICAgICh4KSA9PiBUKHgpLmNsYXNzTGlzdC5jb250YWlucyhcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tZm9jdXNlZFwiKVxuICAgICAgKTtcbiAgICAgIFQoc1thXSkuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tZm9jdXNlZFwiKTtcbiAgICAgIGNvbnN0IGQgPSB0ID09PSBcIkFycm93RG93blwiID8gYSArIDEgOiBhIC0gMSwgQyA9IHQgPT09IFwiQXJyb3dEb3duXCIgPyAwIDogcy5sZW5ndGggLSAxLCBmID0gc1tkXSA/PyBzW0NdLCBiID0gIXNbZF0sIGcgPSBUKGYpO1xuICAgICAgZy5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1mb2N1c2VkXCIpO1xuICAgICAgY29uc3QgayA9IHRoaXMuc3JjRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgdyA9IGcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAoYiAmJiB0ID09PSBcIkFycm93RG93blwiKSB7XG4gICAgICAgIHRoaXMuc3JjRWxlbWVudC5zY3JvbGwoMCwgMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChiICYmIHQgPT09IFwiQXJyb3dVcFwiKSB7XG4gICAgICAgIHRoaXMuc3JjRWxlbWVudC5zY3JvbGwoMCwgdGhpcy5zcmNFbGVtZW50LnNjcm9sbEhlaWdodCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHkgPSAoKGkgPSB0aGlzLmxpc3RTbG90SHRtbENvbXBvbmVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IGkuY2xpZW50SGVpZ2h0KSA/PyAwO1xuICAgICAgaWYgKGsueSArIGsuaGVpZ2h0IDwgdy55ICsgdy5oZWlnaHQgKyB5KSB7XG4gICAgICAgIHRoaXMuc3JjRWxlbWVudC5zY3JvbGwoMCwgdGhpcy5zcmNFbGVtZW50LnNjcm9sbFRvcCArIHcuaGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGsueSA+IHcueSkge1xuICAgICAgICB0aGlzLnNyY0VsZW1lbnQuc2Nyb2xsKDAsIHRoaXMuc3JjRWxlbWVudC5zY3JvbGxUb3AgLSB3LmhlaWdodCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG59LCBQZSA9IG5ldyBXZWFrU2V0KCksIHVzID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGUgPSBvKHRoaXMsIEJlLCBwcykuY2FsbCh0aGlzKSwgdCA9IG8odGhpcywgSywgdnQpLmNhbGwodGhpcywgdGhpcy5vcHRpb25zKTtcbiAgZS5hcHBlbmQoLi4udCk7XG4gIGNvbnN0IHMgPSBvKHRoaXMsIEdlLCBDcykuY2FsbCh0aGlzKTtcbiAgZS5hcHBlbmQocyk7XG4gIGNvbnN0IGkgPSBvKHRoaXMsIEhlLCBicykuY2FsbCh0aGlzKTtcbiAgcmV0dXJuIGkgJiYgZS5hcHBlbmQoaSksIGU7XG59LCBCZSA9IG5ldyBXZWFrU2V0KCksIHBzID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICByZXR1cm4gZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0XCIpLCB0aGlzLmlzU2luZ2xlU2VsZWN0ICYmIGUuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdC0tc2luZ2xlLXNlbGVjdFwiKSwgdGhpcy5kaXNhYmxlZEJyYW5jaE5vZGUgJiYgZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0LS1kaXNhYmxlZC1icmFuY2gtbm9kZVwiKSwgZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdXRcIiwgKHQpID0+IG8odGhpcywgVmUsIG1zKS5jYWxsKHRoaXMsIHQpKSwgZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsICgpID0+IG8odGhpcywgRGUsIGZzKS5jYWxsKHRoaXMpKSwgZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCAoKSA9PiB0aGlzLm1vdXNldXBDYWxsYmFjaygpLCAhMCksIGU7XG59LCBWZSA9IG5ldyBXZWFrU2V0KCksIG1zID0gZnVuY3Rpb24oZSkge1xuICBlLnN0b3BQcm9wYWdhdGlvbigpLCBuKHRoaXMsIE0pICYmIG4odGhpcywgUCkgJiYgbih0aGlzLCBNKS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1mb2N1c2VkXCIpO1xufSwgRGUgPSBuZXcgV2Vha1NldCgpLCBmcyA9IGZ1bmN0aW9uKCkge1xuICBtKHRoaXMsIFAsICEwKTtcbn0sIEsgPSBuZXcgV2Vha1NldCgpLCB2dCA9IGZ1bmN0aW9uKGUpIHtcbiAgcmV0dXJuIGUucmVkdWNlKCh0LCBzKSA9PiB7XG4gICAgdmFyIGE7XG4gICAgaWYgKChhID0gcy5jaGlsZHJlbikgIT0gbnVsbCAmJiBhLmxlbmd0aCkge1xuICAgICAgY29uc3QgaCA9IG8odGhpcywgTWUsIGdzKS5jYWxsKHRoaXMsIHMpLCBkID0gbyh0aGlzLCBLLCB2dCkuY2FsbCh0aGlzLCBzLmNoaWxkcmVuKTtcbiAgICAgIHJldHVybiBoLmFwcGVuZCguLi5kKSwgdC5wdXNoKGgpLCB0O1xuICAgIH1cbiAgICBjb25zdCBpID0gbyh0aGlzLCBYLCBMdCkuY2FsbCh0aGlzLCBzLCAhMSk7XG4gICAgcmV0dXJuIHQucHVzaChpKSwgdDtcbiAgfSwgW10pO1xufSwgSGUgPSBuZXcgV2Vha1NldCgpLCBicyA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMubGlzdFNsb3RIdG1sQ29tcG9uZW50KVxuICAgIHJldHVybiBudWxsO1xuICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgcmV0dXJuIGUuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdF9fc2xvdFwiKSwgZS5hcHBlbmRDaGlsZCh0aGlzLmxpc3RTbG90SHRtbENvbXBvbmVudCksIGU7XG59LCBHZSA9IG5ldyBXZWFrU2V0KCksIENzID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBlLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2VtcHR5XCIpLCBlLnNldEF0dHJpYnV0ZShcInRpdGxlXCIsIHRoaXMuZW1wdHlUZXh0KTtcbiAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICB0LmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2VtcHR5LWljb25cIiksIEkodGhpcy5pY29uRWxlbWVudHMuYXR0ZW50aW9uLCB0KTtcbiAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICByZXR1cm4gcy5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19lbXB0eS10ZXh0XCIpLCBzLnRleHRDb250ZW50ID0gdGhpcy5lbXB0eVRleHQsIGUuYXBwZW5kKHQsIHMpLCBlO1xufSwgTWUgPSBuZXcgV2Vha1NldCgpLCBncyA9IGZ1bmN0aW9uKGUpIHtcbiAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHQuc2V0QXR0cmlidXRlKFwiZ3JvdXAtY29udGFpbmVyLWlkXCIsIGUudmFsdWUudG9TdHJpbmcoKSksIHQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdF9fZ3JvdXAtY29udGFpbmVyXCIpO1xuICBjb25zdCBzID0gbyh0aGlzLCBYLCBMdCkuY2FsbCh0aGlzLCBlLCAhMCk7XG4gIHJldHVybiB0LmFwcGVuZENoaWxkKHMpLCB0O1xufSwgWCA9IG5ldyBXZWFrU2V0KCksIEx0ID0gZnVuY3Rpb24oZSwgdCkge1xuICBjb25zdCBzID0gbyh0aGlzLCBGZSwga3MpLmNhbGwodGhpcywgZSk7XG4gIGlmICh0KSB7XG4gICAgY29uc3QgaCA9IG8odGhpcywgJGUsIExzKS5jYWxsKHRoaXMpO1xuICAgIHMuYXBwZW5kQ2hpbGQoaCksIHMuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tZ3JvdXBcIik7XG4gIH1cbiAgY29uc3QgaSA9IG8odGhpcywgVWUsIHhzKS5jYWxsKHRoaXMsIGUpLCBhID0gbyh0aGlzLCB6ZSwgU3MpLmNhbGwodGhpcywgZSwgdCk7XG4gIHJldHVybiBzLmFwcGVuZChpLCBhKSwgcztcbn0sIEZlID0gbmV3IFdlYWtTZXQoKSwga3MgPSBmdW5jdGlvbihlKSB7XG4gIGNvbnN0IHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICByZXR1cm4gUGkodCwgZS5odG1sQXR0ciksIHQuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCItMVwiKSwgdC5zZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiLCBlLm5hbWUpLCB0LmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW1cIiksIHQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLCAoKSA9PiBvKHRoaXMsIHFlLCB3cykuY2FsbCh0aGlzLCB0KSwgITApLCB0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCAoKSA9PiBvKHRoaXMsIGplLCBFcykuY2FsbCh0aGlzLCB0KSwgITApLCB0LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgKHMpID0+IG8odGhpcywgUmUsIHZzKS5jYWxsKHRoaXMsIHMsIGUpKSwgdDtcbn0sIHFlID0gbmV3IFdlYWtTZXQoKSwgd3MgPSBmdW5jdGlvbihlKSB7XG4gIG4odGhpcywgUCkgJiYgbyh0aGlzLCBKLCB5dCkuY2FsbCh0aGlzLCAhMCwgZSk7XG59LCBqZSA9IG5ldyBXZWFrU2V0KCksIEVzID0gZnVuY3Rpb24oZSkge1xuICBuKHRoaXMsIFApICYmIChvKHRoaXMsIEosIHl0KS5jYWxsKHRoaXMsICExLCBlKSwgbSh0aGlzLCBNLCBlKSk7XG59LCBSZSA9IG5ldyBXZWFrU2V0KCksIHZzID0gZnVuY3Rpb24oZSwgdCkge1xuICB2YXIgYTtcbiAgaWYgKGUucHJldmVudERlZmF1bHQoKSwgZS5zdG9wUHJvcGFnYXRpb24oKSwgKGEgPSB0aGlzLmZsYXR0ZWRPcHRpb25zLmZpbmQoKGgpID0+IGguaWQgPT09IHQudmFsdWUpKSA9PSBudWxsID8gdm9pZCAwIDogYS5kaXNhYmxlZClcbiAgICByZXR1cm47XG4gIGNvbnN0IGkgPSBlLnRhcmdldC5xdWVyeVNlbGVjdG9yKFwiLnRyZWVzZWxlY3QtbGlzdF9faXRlbS1jaGVja2JveFwiKTtcbiAgaS5jaGVja2VkID0gIWkuY2hlY2tlZCwgbyh0aGlzLCBLZSwgQXMpLmNhbGwodGhpcywgaSwgdCk7XG59LCAkZSA9IG5ldyBXZWFrU2V0KCksIExzID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgcmV0dXJuIGUuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCItMVwiKSwgZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLWljb25cIiksIEkodGhpcy5pY29uRWxlbWVudHMuYXJyb3dEb3duLCBlKSwgZS5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsICh0KSA9PiBvKHRoaXMsIFdlLCB5cykuY2FsbCh0aGlzLCB0KSksIGU7XG59LCBXZSA9IG5ldyBXZWFrU2V0KCksIHlzID0gZnVuY3Rpb24oZSkge1xuICBlLnByZXZlbnREZWZhdWx0KCksIGUuc3RvcFByb3BhZ2F0aW9uKCksIG8odGhpcywgWGUsIFRzKS5jYWxsKHRoaXMsIGUpO1xufSwgVWUgPSBuZXcgV2Vha1NldCgpLCB4cyA9IGZ1bmN0aW9uKGUpIHtcbiAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdF9faXRlbS1jaGVja2JveC1jb250YWluZXJcIik7XG4gIGNvbnN0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgcy5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLWNoZWNrYm94LWljb25cIiksIHMuaW5uZXJIVE1MID0gXCJcIjtcbiAgY29uc3QgaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgcmV0dXJuIGkuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCItMVwiKSwgaS5zZXRBdHRyaWJ1dGUoXCJ0eXBlXCIsIFwiY2hlY2tib3hcIiksIGkuc2V0QXR0cmlidXRlKFwiaW5wdXQtaWRcIiwgZS52YWx1ZS50b1N0cmluZygpKSwgaS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLWNoZWNrYm94XCIpLCB0LmFwcGVuZChzLCBpKSwgdDtcbn0sIHplID0gbmV3IFdlYWtTZXQoKSwgU3MgPSBmdW5jdGlvbihlLCB0KSB7XG4gIGNvbnN0IHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwibGFiZWxcIik7XG4gIGlmIChzLnRleHRDb250ZW50ID0gZS5uYW1lLCBzLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tbGFiZWxcIiksIHQgJiYgdGhpcy5zaG93Q291bnQpIHtcbiAgICBjb25zdCBpID0gbyh0aGlzLCBZZSwgX3MpLmNhbGwodGhpcywgZSk7XG4gICAgcy5hcHBlbmRDaGlsZChpKTtcbiAgfVxuICByZXR1cm4gcztcbn0sIFllID0gbmV3IFdlYWtTZXQoKSwgX3MgPSBmdW5jdGlvbihlKSB7XG4gIGNvbnN0IHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSwgcyA9IHRoaXMuZmxhdHRlZE9wdGlvbnMuZmlsdGVyKChpKSA9PiBpLmNoaWxkT2YgPT09IGUudmFsdWUpO1xuICByZXR1cm4gdC50ZXh0Q29udGVudCA9IGAoJHtzLmxlbmd0aH0pYCwgdC5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLWxhYmVsLWNvdW50ZXJcIiksIHQ7XG59LCBLZSA9IG5ldyBXZWFrU2V0KCksIEFzID0gZnVuY3Rpb24oZSwgdCkge1xuICBjb25zdCBzID0gdGhpcy5mbGF0dGVkT3B0aW9ucy5maW5kKChpKSA9PiBpLmlkID09PSB0LnZhbHVlKTtcbiAgaWYgKHMpIHtcbiAgICBpZiAocyAhPSBudWxsICYmIHMuaXNHcm91cCAmJiB0aGlzLmRpc2FibGVkQnJhbmNoTm9kZSkge1xuICAgICAgY29uc3QgaSA9IElpKGUpO1xuICAgICAgaSA9PSBudWxsIHx8IGkuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJtb3VzZWRvd25cIikpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1NpbmdsZVNlbGVjdCkge1xuICAgICAgY29uc3QgW2ldID0gbih0aGlzLCBTKTtcbiAgICAgIGlmIChzLmlkID09PSBpKVxuICAgICAgICByZXR1cm47XG4gICAgICBtKHRoaXMsIFMsIFtzLmlkXSksIHNzKFtzLmlkXSwgdGhpcy5mbGF0dGVkT3B0aW9ucywgdGhpcy5pc1NpbmdsZVNlbGVjdCwgdGhpcy5pc0luZGVwZW5kZW50Tm9kZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzLmNoZWNrZWQgPSBlLmNoZWNrZWQ7XG4gICAgICBjb25zdCBpID0gSXQocywgdGhpcy5mbGF0dGVkT3B0aW9ucywgdGhpcy5pc0luZGVwZW5kZW50Tm9kZXMpO1xuICAgICAgZS5jaGVja2VkID0gaTtcbiAgICB9XG4gICAgY2UodGhpcy5mbGF0dGVkT3B0aW9ucywgdGhpcy5zcmNFbGVtZW50LCB0aGlzLmljb25FbGVtZW50cywgbih0aGlzLCBTKSwgdGhpcy5ydGwpLCBvKHRoaXMsIEplLCBOcykuY2FsbCh0aGlzKTtcbiAgfVxufSwgWGUgPSBuZXcgV2Vha1NldCgpLCBUcyA9IGZ1bmN0aW9uKGUpIHtcbiAgdmFyIGEsIGg7XG4gIGNvbnN0IHQgPSAoaCA9IChhID0gZS50YXJnZXQpID09IG51bGwgPyB2b2lkIDAgOiBhLnBhcmVudE5vZGUpID09IG51bGwgPyB2b2lkIDAgOiBoLnF1ZXJ5U2VsZWN0b3IoXCJbaW5wdXQtaWRdXCIpLCBzID0gKHQgPT0gbnVsbCA/IHZvaWQgMCA6IHQuZ2V0QXR0cmlidXRlKFwiaW5wdXQtaWRcIikpID8/IG51bGwsIGkgPSBWdChzLCB0aGlzLmZsYXR0ZWRPcHRpb25zKTtcbiAgaSAmJiAoaS5pc0Nsb3NlZCA9ICFpLmlzQ2xvc2VkLCBidCh0aGlzLmZsYXR0ZWRPcHRpb25zLCBpKSwgY2UodGhpcy5mbGF0dGVkT3B0aW9ucywgdGhpcy5zcmNFbGVtZW50LCB0aGlzLmljb25FbGVtZW50cywgbih0aGlzLCBTKSwgdGhpcy5ydGwpLCB0aGlzLmFycm93Q2xpY2tDYWxsYmFjayhpLmlkLCBpLmlzQ2xvc2VkKSk7XG59LCBKID0gbmV3IFdlYWtTZXQoKSwgeXQgPSBmdW5jdGlvbihlLCB0KSB7XG4gIGNvbnN0IHMgPSBcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tZm9jdXNlZFwiO1xuICBpZiAoZSkge1xuICAgIGNvbnN0IGkgPSBBcnJheS5mcm9tKHRoaXMuc3JjRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGAuJHtzfWApKTtcbiAgICBpLmxlbmd0aCAmJiBpLmZvckVhY2goKGEpID0+IGEuY2xhc3NMaXN0LnJlbW92ZShzKSksIHQuY2xhc3NMaXN0LmFkZChzKTtcbiAgfSBlbHNlXG4gICAgdC5jbGFzc0xpc3QucmVtb3ZlKHMpO1xufSwgWiA9IG5ldyBXZWFrU2V0KCksIHh0ID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IHsgdW5ncm91cGVkTm9kZXM6IGUsIGdyb3VwZWROb2RlczogdCwgYWxsTm9kZXM6IHMgfSA9IENpKHRoaXMuZmxhdHRlZE9wdGlvbnMpO1xuICB0aGlzLnNlbGVjdGVkTm9kZXMgPSB7IG5vZGVzOiBlLCBncm91cGVkTm9kZXM6IHQsIGFsbE5vZGVzOiBzIH07XG59LCBKZSA9IG5ldyBXZWFrU2V0KCksIE5zID0gZnVuY3Rpb24oKSB7XG4gIG8odGhpcywgWiwgeHQpLmNhbGwodGhpcyksIHRoaXMuaW5wdXRDYWxsYmFjayh0aGlzLnNlbGVjdGVkTm9kZXMpLCB0aGlzLnZhbHVlID0gdGhpcy5zZWxlY3RlZE5vZGVzLm5vZGVzLm1hcCgoZSkgPT4gZS5pZCk7XG59O1xuY29uc3QgRHQgPSAoe1xuICBwYXJlbnRIdG1sQ29udGFpbmVyOiBsLFxuICBzdGF0aWNMaXN0OiBlLFxuICBhcHBlbmRUb0JvZHk6IHQsXG4gIGlzU2luZ2xlU2VsZWN0OiBzLFxuICB2YWx1ZTogaSxcbiAgZGlyZWN0aW9uOiBhXG59KSA9PiB7XG4gIGwgfHwgY29uc29sZS5lcnJvcihcIlZhbGlkYXRpb246IHBhcmVudEh0bWxDb250YWluZXIgcHJvcCBpcyByZXF1aXJlZCFcIiksIGUgJiYgdCAmJiBjb25zb2xlLmVycm9yKFwiVmFsaWRhdGlvbjogWW91IHNob3VsZCBzZXQgc3RhdGljTGlzdCB0byBmYWxzZSBpZiB5b3UgdXNlIGFwcGVuZFRvQm9keSFcIiksIHMgJiYgQXJyYXkuaXNBcnJheShpKSAmJiBjb25zb2xlLmVycm9yKFwiVmFsaWRhdGlvbjogaWYgeW91IHVzZSBpc1NpbmdsZVNlbGVjdCBwcm9wLCB5b3Ugc2hvdWxkIHBhc3MgYSBzaW5nbGUgdmFsdWUhXCIpLCAhcyAmJiAhQXJyYXkuaXNBcnJheShpKSAmJiBjb25zb2xlLmVycm9yKFwiVmFsaWRhdGlvbjogeW91IHNob3VsZCBwYXNzIGFuIGFycmF5IGFzIGEgdmFsdWUhXCIpLCBhICYmIGEgIT09IFwiYXV0b1wiICYmIGEgIT09IFwiYm90dG9tXCIgJiYgYSAhPT0gXCJ0b3BcIiAmJiBjb25zb2xlLmVycm9yKFwiVmFsaWRhdGlvbjogeW91IHNob3VsZCBwYXNzIChhdXRvIHwgdG9wIHwgYm90dG9tIHwgdW5kZWZpbmVkKSBhcyBhIHZhbHVlIGZvciB0aGUgZGlyZWN0aW9uIHByb3AhXCIpO1xufSwgcmUgPSAobCkgPT4gbC5tYXAoKGUpID0+IGUuaWQpLCBWaSA9IChsKSA9PiBsID8gQXJyYXkuaXNBcnJheShsKSA/IGwgOiBbbF0gOiBbXSwgRGkgPSAobCwgZSkgPT4ge1xuICBpZiAoZSkge1xuICAgIGNvbnN0IFt0XSA9IGw7XG4gICAgcmV0dXJuIHQgPz8gbnVsbDtcbiAgfVxuICByZXR1cm4gbDtcbn07XG52YXIgdSwgcCwgRiwgUSwgcSwgXywgQSwgTCwgQiwgZWUsIFN0LCB0ZSwgX3QsIFplLCBPcywgUWUsIElzLCBldCwgUHMsIHR0LCBCcywgc3QsIFZzLCBpdCwgRHMsIHNlLCBBdCwgbHQsIEhzLCBudCwgR3MsIGF0LCBNcywgb3QsIEZzLCBpZSwgVHQsIHJ0LCBxcywgaiwgaGUsIGxlLCBOdCwgUiwgZGUsIGN0LCBqcywgbmUsIE90LCBodCwgUnMsIGR0LCAkcywgdXQsIFdzLCBwdCwgVXMsIG10LCB6cztcbmNsYXNzIEdpIHtcbiAgY29uc3RydWN0b3Ioe1xuICAgIHBhcmVudEh0bWxDb250YWluZXI6IGUsXG4gICAgdmFsdWU6IHQsXG4gICAgb3B0aW9uczogcyxcbiAgICBvcGVuTGV2ZWw6IGksXG4gICAgYXBwZW5kVG9Cb2R5OiBhLFxuICAgIGFsd2F5c09wZW46IGgsXG4gICAgc2hvd1RhZ3M6IGQsXG4gICAgdGFnc0NvdW50VGV4dDogQyxcbiAgICBjbGVhcmFibGU6IGYsXG4gICAgc2VhcmNoYWJsZTogYixcbiAgICBwbGFjZWhvbGRlcjogZyxcbiAgICBncm91cGVkOiBrLFxuICAgIGlzR3JvdXBlZFZhbHVlOiB3LFxuICAgIGxpc3RTbG90SHRtbENvbXBvbmVudDogeSxcbiAgICBkaXNhYmxlZDogeCxcbiAgICBlbXB0eVRleHQ6ICQsXG4gICAgc3RhdGljTGlzdDogYWUsXG4gICAgaWQ6IEN0LFxuICAgIGFyaWFMYWJlbDogZ3QsXG4gICAgaXNTaW5nbGVTZWxlY3Q6IG9lLFxuICAgIHNob3dDb3VudDogWXMsXG4gICAgZGlzYWJsZWRCcmFuY2hOb2RlOiBLcyxcbiAgICBkaXJlY3Rpb246IFhzLFxuICAgIGV4cGFuZFNlbGVjdGVkOiBKcyxcbiAgICBzYXZlU2Nyb2xsUG9zaXRpb246IFpzLFxuICAgIGlzSW5kZXBlbmRlbnROb2RlczogUXMsXG4gICAgcnRsOiBlaSxcbiAgICBpY29uRWxlbWVudHM6IHRpLFxuICAgIGlucHV0Q2FsbGJhY2s6IHNpLFxuICAgIG9wZW5DYWxsYmFjazogaWksXG4gICAgY2xvc2VDYWxsYmFjazogbGksXG4gICAgbmFtZUNoYW5nZUNhbGxiYWNrOiBuaSxcbiAgICBzZWFyY2hDYWxsYmFjazogYWksXG4gICAgb3BlbkNsb3NlR3JvdXBDYWxsYmFjazogb2lcbiAgfSkge1xuICAgIHIodGhpcywgZWUpO1xuICAgIHIodGhpcywgdGUpO1xuICAgIHIodGhpcywgWmUpO1xuICAgIHIodGhpcywgUWUpO1xuICAgIHIodGhpcywgZXQpO1xuICAgIHIodGhpcywgdHQpO1xuICAgIHIodGhpcywgc3QpO1xuICAgIHIodGhpcywgaXQpO1xuICAgIHIodGhpcywgc2UpO1xuICAgIHIodGhpcywgbHQpO1xuICAgIHIodGhpcywgbnQpO1xuICAgIHIodGhpcywgYXQpO1xuICAgIHIodGhpcywgb3QpO1xuICAgIHIodGhpcywgaWUpO1xuICAgIHIodGhpcywgcnQpO1xuICAgIHIodGhpcywgaik7XG4gICAgcih0aGlzLCBsZSk7XG4gICAgcih0aGlzLCBSKTtcbiAgICByKHRoaXMsIGN0KTtcbiAgICAvLyBFbWl0c1xuICAgIHIodGhpcywgbmUpO1xuICAgIHIodGhpcywgaHQpO1xuICAgIHIodGhpcywgZHQpO1xuICAgIHIodGhpcywgdXQpO1xuICAgIHIodGhpcywgcHQpO1xuICAgIHIodGhpcywgbXQpO1xuICAgIC8vIFByb3BzXG4gICAgYyh0aGlzLCBcInBhcmVudEh0bWxDb250YWluZXJcIik7XG4gICAgYyh0aGlzLCBcInZhbHVlXCIpO1xuICAgIGModGhpcywgXCJvcHRpb25zXCIpO1xuICAgIGModGhpcywgXCJvcGVuTGV2ZWxcIik7XG4gICAgYyh0aGlzLCBcImFwcGVuZFRvQm9keVwiKTtcbiAgICBjKHRoaXMsIFwiYWx3YXlzT3BlblwiKTtcbiAgICBjKHRoaXMsIFwic2hvd1RhZ3NcIik7XG4gICAgYyh0aGlzLCBcInRhZ3NDb3VudFRleHRcIik7XG4gICAgYyh0aGlzLCBcImNsZWFyYWJsZVwiKTtcbiAgICBjKHRoaXMsIFwic2VhcmNoYWJsZVwiKTtcbiAgICBjKHRoaXMsIFwicGxhY2Vob2xkZXJcIik7XG4gICAgYyh0aGlzLCBcImdyb3VwZWRcIik7XG4gICAgYyh0aGlzLCBcImlzR3JvdXBlZFZhbHVlXCIpO1xuICAgIGModGhpcywgXCJsaXN0U2xvdEh0bWxDb21wb25lbnRcIik7XG4gICAgYyh0aGlzLCBcImRpc2FibGVkXCIpO1xuICAgIGModGhpcywgXCJlbXB0eVRleHRcIik7XG4gICAgYyh0aGlzLCBcInN0YXRpY0xpc3RcIik7XG4gICAgYyh0aGlzLCBcImlkXCIpO1xuICAgIGModGhpcywgXCJhcmlhTGFiZWxcIik7XG4gICAgYyh0aGlzLCBcImlzU2luZ2xlU2VsZWN0XCIpO1xuICAgIGModGhpcywgXCJzaG93Q291bnRcIik7XG4gICAgYyh0aGlzLCBcImRpc2FibGVkQnJhbmNoTm9kZVwiKTtcbiAgICBjKHRoaXMsIFwiZGlyZWN0aW9uXCIpO1xuICAgIGModGhpcywgXCJleHBhbmRTZWxlY3RlZFwiKTtcbiAgICBjKHRoaXMsIFwic2F2ZVNjcm9sbFBvc2l0aW9uXCIpO1xuICAgIGModGhpcywgXCJpc0luZGVwZW5kZW50Tm9kZXNcIik7XG4gICAgYyh0aGlzLCBcInJ0bFwiKTtcbiAgICBjKHRoaXMsIFwiaWNvbkVsZW1lbnRzXCIpO1xuICAgIGModGhpcywgXCJpbnB1dENhbGxiYWNrXCIpO1xuICAgIGModGhpcywgXCJvcGVuQ2FsbGJhY2tcIik7XG4gICAgYyh0aGlzLCBcImNsb3NlQ2FsbGJhY2tcIik7XG4gICAgYyh0aGlzLCBcIm5hbWVDaGFuZ2VDYWxsYmFja1wiKTtcbiAgICBjKHRoaXMsIFwic2VhcmNoQ2FsbGJhY2tcIik7XG4gICAgYyh0aGlzLCBcIm9wZW5DbG9zZUdyb3VwQ2FsbGJhY2tcIik7XG4gICAgLy8gSW5uZXJTdGF0ZVxuICAgIGModGhpcywgXCJ1bmdyb3VwZWRWYWx1ZVwiKTtcbiAgICBjKHRoaXMsIFwiZ3JvdXBlZFZhbHVlXCIpO1xuICAgIGModGhpcywgXCJhbGxWYWx1ZVwiKTtcbiAgICBjKHRoaXMsIFwiaXNMaXN0T3BlbmVkXCIpO1xuICAgIGModGhpcywgXCJzZWxlY3RlZE5hbWVcIik7XG4gICAgYyh0aGlzLCBcInNyY0VsZW1lbnRcIik7XG4gICAgLy8gQ29tcG9uZW50c1xuICAgIHIodGhpcywgdSwgbnVsbCk7XG4gICAgcih0aGlzLCBwLCBudWxsKTtcbiAgICAvLyBSZXNpemUgcHJvcHNcbiAgICByKHRoaXMsIEYsIG51bGwpO1xuICAgIC8vIExpc3QgcG9zaXRpb24gc2Nyb2xsXG4gICAgcih0aGlzLCBRLCAwKTtcbiAgICAvLyBUaW1lciBmb3Igc2VhcmNoIHRleHRcbiAgICByKHRoaXMsIHEsIDApO1xuICAgIC8vIE91dHNpZGUgbGlzdGVuZXJzXG4gICAgcih0aGlzLCBfLCBudWxsKTtcbiAgICByKHRoaXMsIEEsIG51bGwpO1xuICAgIHIodGhpcywgTCwgbnVsbCk7XG4gICAgcih0aGlzLCBCLCBudWxsKTtcbiAgICBEdCh7XG4gICAgICBwYXJlbnRIdG1sQ29udGFpbmVyOiBlLFxuICAgICAgdmFsdWU6IHQsXG4gICAgICBzdGF0aWNMaXN0OiBhZSxcbiAgICAgIGFwcGVuZFRvQm9keTogYSxcbiAgICAgIGlzU2luZ2xlU2VsZWN0OiBvZVxuICAgIH0pLCB0aGlzLnBhcmVudEh0bWxDb250YWluZXIgPSBlLCB0aGlzLnZhbHVlID0gW10sIHRoaXMub3B0aW9ucyA9IHMgPz8gW10sIHRoaXMub3BlbkxldmVsID0gaSA/PyAwLCB0aGlzLmFwcGVuZFRvQm9keSA9IGEgPz8gITEsIHRoaXMuYWx3YXlzT3BlbiA9ICEhKGggJiYgIXgpLCB0aGlzLnNob3dUYWdzID0gZCA/PyAhMCwgdGhpcy50YWdzQ291bnRUZXh0ID0gQyA/PyBcImVsZW1lbnRzIHNlbGVjdGVkXCIsIHRoaXMuY2xlYXJhYmxlID0gZiA/PyAhMCwgdGhpcy5zZWFyY2hhYmxlID0gYiA/PyAhMCwgdGhpcy5wbGFjZWhvbGRlciA9IGcgPz8gXCJTZWFyY2guLi5cIiwgdGhpcy5ncm91cGVkID0gayA/PyAhMCwgdGhpcy5pc0dyb3VwZWRWYWx1ZSA9IHcgPz8gITEsIHRoaXMubGlzdFNsb3RIdG1sQ29tcG9uZW50ID0geSA/PyBudWxsLCB0aGlzLmRpc2FibGVkID0geCA/PyAhMSwgdGhpcy5lbXB0eVRleHQgPSAkID8/IFwiTm8gcmVzdWx0cyBmb3VuZC4uLlwiLCB0aGlzLnN0YXRpY0xpc3QgPSAhIShhZSAmJiAhdGhpcy5hcHBlbmRUb0JvZHkpLCB0aGlzLmlkID0gQ3QgPz8gXCJcIiwgdGhpcy5hcmlhTGFiZWwgPSBndCA/PyBcIlwiLCB0aGlzLmlzU2luZ2xlU2VsZWN0ID0gb2UgPz8gITEsIHRoaXMuc2hvd0NvdW50ID0gWXMgPz8gITEsIHRoaXMuZGlzYWJsZWRCcmFuY2hOb2RlID0gS3MgPz8gITEsIHRoaXMuZGlyZWN0aW9uID0gWHMgPz8gXCJhdXRvXCIsIHRoaXMuZXhwYW5kU2VsZWN0ZWQgPSBKcyA/PyAhMSwgdGhpcy5zYXZlU2Nyb2xsUG9zaXRpb24gPSBacyA/PyAhMCwgdGhpcy5pc0luZGVwZW5kZW50Tm9kZXMgPSBRcyA/PyAhMSwgdGhpcy5ydGwgPSBlaSA/PyAhMSwgdGhpcy5pY29uRWxlbWVudHMgPSBCdCh0aSksIHRoaXMuaW5wdXRDYWxsYmFjayA9IHNpLCB0aGlzLm9wZW5DYWxsYmFjayA9IGlpLCB0aGlzLmNsb3NlQ2FsbGJhY2sgPSBsaSwgdGhpcy5uYW1lQ2hhbmdlQ2FsbGJhY2sgPSBuaSwgdGhpcy5zZWFyY2hDYWxsYmFjayA9IGFpLCB0aGlzLm9wZW5DbG9zZUdyb3VwQ2FsbGJhY2sgPSBvaSwgdGhpcy51bmdyb3VwZWRWYWx1ZSA9IFtdLCB0aGlzLmdyb3VwZWRWYWx1ZSA9IFtdLCB0aGlzLmFsbFZhbHVlID0gW10sIHRoaXMuaXNMaXN0T3BlbmVkID0gITEsIHRoaXMuc2VsZWN0ZWROYW1lID0gXCJcIiwgdGhpcy5zcmNFbGVtZW50ID0gbnVsbCwgbyh0aGlzLCBlZSwgU3QpLmNhbGwodGhpcywgdCk7XG4gIH1cbiAgbW91bnQoKSB7XG4gICAgRHQoe1xuICAgICAgcGFyZW50SHRtbENvbnRhaW5lcjogdGhpcy5wYXJlbnRIdG1sQ29udGFpbmVyLFxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgICBzdGF0aWNMaXN0OiB0aGlzLnN0YXRpY0xpc3QsXG4gICAgICBhcHBlbmRUb0JvZHk6IHRoaXMuYXBwZW5kVG9Cb2R5LFxuICAgICAgaXNTaW5nbGVTZWxlY3Q6IHRoaXMuaXNTaW5nbGVTZWxlY3RcbiAgICB9KSwgdGhpcy5pY29uRWxlbWVudHMgPSBCdCh0aGlzLmljb25FbGVtZW50cyksIG8odGhpcywgZWUsIFN0KS5jYWxsKHRoaXMsIHRoaXMudmFsdWUpO1xuICB9XG4gIHVwZGF0ZVZhbHVlKGUpIHtcbiAgICBjb25zdCB0ID0gVmkoZSksIHMgPSBuKHRoaXMsIHUpO1xuICAgIHMgJiYgKHMudXBkYXRlVmFsdWUodCksIG8odGhpcywgc2UsIEF0KS5jYWxsKHRoaXMsIHMgPT0gbnVsbCA/IHZvaWQgMCA6IHMuc2VsZWN0ZWROb2RlcykpO1xuICB9XG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5zcmNFbGVtZW50ICYmIChvKHRoaXMsIGllLCBUdCkuY2FsbCh0aGlzKSwgdGhpcy5zcmNFbGVtZW50LmlubmVySFRNTCA9IFwiXCIsIHRoaXMuc3JjRWxlbWVudCA9IG51bGwsIG8odGhpcywgUiwgZGUpLmNhbGwodGhpcywgITApKTtcbiAgfVxuICBmb2N1cygpIHtcbiAgICBuKHRoaXMsIHApICYmIG4odGhpcywgcCkuZm9jdXMoKTtcbiAgfVxuICB0b2dnbGVPcGVuQ2xvc2UoKSB7XG4gICAgbih0aGlzLCBwKSAmJiAobih0aGlzLCBwKS5vcGVuQ2xvc2UoKSwgbih0aGlzLCBwKS5mb2N1cygpKTtcbiAgfVxuICAvLyBPdXRzaWRlIExpc3RlbmVyc1xuICBzY3JvbGxXaW5kb3dIYW5kbGVyKCkge1xuICAgIHRoaXMudXBkYXRlTGlzdFBvc2l0aW9uKCk7XG4gIH1cbiAgZm9jdXNXaW5kb3dIYW5kbGVyKGUpIHtcbiAgICB2YXIgcywgaSwgYTtcbiAgICAoKHMgPSB0aGlzLnNyY0VsZW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBzLmNvbnRhaW5zKGUudGFyZ2V0KSkgfHwgKChpID0gbih0aGlzLCB1KSkgPT0gbnVsbCA/IHZvaWQgMCA6IGkuc3JjRWxlbWVudC5jb250YWlucyhlLnRhcmdldCkpIHx8ICgoYSA9IG4odGhpcywgcCkpID09IG51bGwgfHwgYS5ibHVyKCksIG8odGhpcywgUiwgZGUpLmNhbGwodGhpcywgITEpLCBvKHRoaXMsIGosIGhlKS5jYWxsKHRoaXMsICExKSk7XG4gIH1cbiAgYmx1cldpbmRvd0hhbmRsZXIoKSB7XG4gICAgdmFyIGU7XG4gICAgKGUgPSBuKHRoaXMsIHApKSA9PSBudWxsIHx8IGUuYmx1cigpLCBvKHRoaXMsIFIsIGRlKS5jYWxsKHRoaXMsICExKSwgbyh0aGlzLCBqLCBoZSkuY2FsbCh0aGlzLCAhMSk7XG4gIH1cbiAgLy8gVXBkYXRlIGRpcmVjdGlvbiBvZiB0aGUgbGlzdC4gU3VwcG9ydCBhcHBlbmRUb0JvZHkgYW5kIHN0YW5kYXJkIG1vZGUgd2l0aCBhYnNvbHV0ZVxuICB1cGRhdGVMaXN0UG9zaXRpb24oKSB7XG4gICAgdmFyIHk7XG4gICAgY29uc3QgZSA9IHRoaXMuc3JjRWxlbWVudCwgdCA9ICh5ID0gbih0aGlzLCB1KSkgPT0gbnVsbCA/IHZvaWQgMCA6IHkuc3JjRWxlbWVudDtcbiAgICBpZiAoIWUgfHwgIXQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgeyBoZWlnaHQ6IHMgfSA9IHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHtcbiAgICAgIHg6IGksXG4gICAgICB5OiBhLFxuICAgICAgaGVpZ2h0OiBoLFxuICAgICAgd2lkdGg6IGRcbiAgICB9ID0gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgQyA9IHdpbmRvdy5pbm5lckhlaWdodCwgZiA9IGEsIGIgPSBDIC0gYSAtIGg7XG4gICAgbGV0IGcgPSBmID4gYiAmJiBmID49IHMgJiYgYiA8IHM7XG4gICAgaWYgKHRoaXMuZGlyZWN0aW9uICE9PSBcImF1dG9cIiAmJiAoZyA9IHRoaXMuZGlyZWN0aW9uID09PSBcInRvcFwiKSwgdGhpcy5hcHBlbmRUb0JvZHkpIHtcbiAgICAgICh0LnN0eWxlLnRvcCAhPT0gXCIwcHhcIiB8fCB0LnN0eWxlLmxlZnQgIT09IFwiMHB4XCIpICYmICh0LnN0eWxlLnRvcCA9IFwiMHB4XCIsIHQuc3R5bGUubGVmdCA9IFwiMHB4XCIpO1xuICAgICAgY29uc3QgeCA9IGkgKyB3aW5kb3cuc2Nyb2xsWCwgJCA9IGcgPyBhICsgd2luZG93LnNjcm9sbFkgLSBzIDogYSArIHdpbmRvdy5zY3JvbGxZICsgaDtcbiAgICAgIHQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3h9cHgsJHskfXB4KWAsIHQuc3R5bGUud2lkdGggPSBgJHtkfXB4YDtcbiAgICB9XG4gICAgY29uc3QgayA9IGcgPyBcInRvcFwiIDogXCJib3R0b21cIjtcbiAgICB0LmdldEF0dHJpYnV0ZShcImRpcmVjdGlvblwiKSAhPT0gayAmJiAodC5zZXRBdHRyaWJ1dGUoXCJkaXJlY3Rpb25cIiwgayksIG8odGhpcywgcnQsIHFzKS5jYWxsKHRoaXMsIGcsIHRoaXMuYXBwZW5kVG9Cb2R5KSk7XG4gIH1cbn1cbnUgPSBuZXcgV2Vha01hcCgpLCBwID0gbmV3IFdlYWtNYXAoKSwgRiA9IG5ldyBXZWFrTWFwKCksIFEgPSBuZXcgV2Vha01hcCgpLCBxID0gbmV3IFdlYWtNYXAoKSwgXyA9IG5ldyBXZWFrTWFwKCksIEEgPSBuZXcgV2Vha01hcCgpLCBMID0gbmV3IFdlYWtNYXAoKSwgQiA9IG5ldyBXZWFrTWFwKCksIGVlID0gbmV3IFdlYWtTZXQoKSwgU3QgPSBmdW5jdGlvbihlKSB7XG4gIHZhciBhO1xuICB0aGlzLmRlc3Ryb3koKTtcbiAgY29uc3QgeyBjb250YWluZXI6IHQsIGxpc3Q6IHMsIGlucHV0OiBpIH0gPSBvKHRoaXMsIFplLCBPcykuY2FsbCh0aGlzKTtcbiAgdGhpcy5zcmNFbGVtZW50ID0gdCwgbSh0aGlzLCB1LCBzKSwgbSh0aGlzLCBwLCBpKSwgbSh0aGlzLCBfLCB0aGlzLnNjcm9sbFdpbmRvd0hhbmRsZXIuYmluZCh0aGlzKSksIG0odGhpcywgQSwgdGhpcy5zY3JvbGxXaW5kb3dIYW5kbGVyLmJpbmQodGhpcykpLCBtKHRoaXMsIEwsIHRoaXMuZm9jdXNXaW5kb3dIYW5kbGVyLmJpbmQodGhpcykpLCBtKHRoaXMsIEIsIHRoaXMuYmx1cldpbmRvd0hhbmRsZXIuYmluZCh0aGlzKSksIHRoaXMuYWx3YXlzT3BlbiAmJiAoKGEgPSBuKHRoaXMsIHApKSA9PSBudWxsIHx8IGEub3BlbkNsb3NlKCkpLCB0aGlzLmRpc2FibGVkID8gdGhpcy5zcmNFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LS1kaXNhYmxlZFwiKSA6IHRoaXMuc3JjRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwidHJlZXNlbGVjdC0tZGlzYWJsZWRcIiksIHRoaXMudXBkYXRlVmFsdWUoZSA/PyB0aGlzLnZhbHVlKTtcbn0sIHRlID0gbmV3IFdlYWtTZXQoKSwgX3QgPSBmdW5jdGlvbih7XG4gIGdyb3VwZWROb2RlczogZSxcbiAgbm9kZXM6IHQsXG4gIGFsbE5vZGVzOiBzXG59KSB7XG4gIHRoaXMudW5ncm91cGVkVmFsdWUgPSB0ID8gcmUodCkgOiBbXSwgdGhpcy5ncm91cGVkVmFsdWUgPSBlID8gcmUoZSkgOiBbXSwgdGhpcy5hbGxWYWx1ZSA9IHMgPyByZShzKSA6IFtdO1xuICBsZXQgaSA9IFtdO1xuICB0aGlzLmlzSW5kZXBlbmRlbnROb2RlcyB8fCB0aGlzLmlzU2luZ2xlU2VsZWN0ID8gaSA9IHRoaXMuYWxsVmFsdWUgOiB0aGlzLmlzR3JvdXBlZFZhbHVlID8gaSA9IHRoaXMuZ3JvdXBlZFZhbHVlIDogaSA9IHRoaXMudW5ncm91cGVkVmFsdWUsIHRoaXMudmFsdWUgPSBEaShpLCB0aGlzLmlzU2luZ2xlU2VsZWN0KTtcbn0sIFplID0gbmV3IFdlYWtTZXQoKSwgT3MgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgZSA9IHRoaXMucGFyZW50SHRtbENvbnRhaW5lcjtcbiAgZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdFwiKSwgdGhpcy5ydGwgJiYgZS5zZXRBdHRyaWJ1dGUoXCJkaXJcIiwgXCJydGxcIik7XG4gIGNvbnN0IHQgPSBuZXcgQmkoe1xuICAgIHZhbHVlOiBbXSxcbiAgICAvLyB1cGRhdGVWYWx1ZSBtZXRob2QgY2FsbHMgaW4gaW5pdE1vdW50IG1ldGhvZCB0byBzZXQgYWN0dWFsIHZhbHVlXG4gICAgb3B0aW9uczogdGhpcy5vcHRpb25zLFxuICAgIG9wZW5MZXZlbDogdGhpcy5vcGVuTGV2ZWwsXG4gICAgbGlzdFNsb3RIdG1sQ29tcG9uZW50OiB0aGlzLmxpc3RTbG90SHRtbENvbXBvbmVudCxcbiAgICBlbXB0eVRleHQ6IHRoaXMuZW1wdHlUZXh0LFxuICAgIGlzU2luZ2xlU2VsZWN0OiB0aGlzLmlzU2luZ2xlU2VsZWN0LFxuICAgIHNob3dDb3VudDogdGhpcy5zaG93Q291bnQsXG4gICAgZGlzYWJsZWRCcmFuY2hOb2RlOiB0aGlzLmRpc2FibGVkQnJhbmNoTm9kZSxcbiAgICBleHBhbmRTZWxlY3RlZDogdGhpcy5leHBhbmRTZWxlY3RlZCxcbiAgICBpc0luZGVwZW5kZW50Tm9kZXM6IHRoaXMuaXNJbmRlcGVuZGVudE5vZGVzLFxuICAgIHJ0bDogdGhpcy5ydGwsXG4gICAgaWNvbkVsZW1lbnRzOiB0aGlzLmljb25FbGVtZW50cyxcbiAgICBpbnB1dENhbGxiYWNrOiAoaSkgPT4gbyh0aGlzLCBsdCwgSHMpLmNhbGwodGhpcywgaSksXG4gICAgYXJyb3dDbGlja0NhbGxiYWNrOiAoaSwgYSkgPT4gbyh0aGlzLCBudCwgR3MpLmNhbGwodGhpcywgaSwgYSksXG4gICAgbW91c2V1cENhbGxiYWNrOiAoKSA9PiB7XG4gICAgICB2YXIgaTtcbiAgICAgIHJldHVybiAoaSA9IG4odGhpcywgcCkpID09IG51bGwgPyB2b2lkIDAgOiBpLmZvY3VzKCk7XG4gICAgfVxuICB9KSwgcyA9IG5ldyBkaSh7XG4gICAgdmFsdWU6IFtdLFxuICAgIC8vIHVwZGF0ZVZhbHVlIG1ldGhvZCBjYWxscyBpbiBpbml0TW91bnQgbWV0aG9kIHRvIHNldCBhY3R1YWwgdmFsdWVcbiAgICBzaG93VGFnczogdGhpcy5zaG93VGFncyxcbiAgICB0YWdzQ291bnRUZXh0OiB0aGlzLnRhZ3NDb3VudFRleHQsXG4gICAgY2xlYXJhYmxlOiB0aGlzLmNsZWFyYWJsZSxcbiAgICBpc0Fsd2F5c09wZW5lZDogdGhpcy5hbHdheXNPcGVuLFxuICAgIHNlYXJjaGFibGU6IHRoaXMuc2VhcmNoYWJsZSxcbiAgICBwbGFjZWhvbGRlcjogdGhpcy5wbGFjZWhvbGRlcixcbiAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCxcbiAgICBpc1NpbmdsZVNlbGVjdDogdGhpcy5pc1NpbmdsZVNlbGVjdCxcbiAgICBpZDogdGhpcy5pZCxcbiAgICBhcmlhTGFiZWw6IHRoaXMuYXJpYUxhYmVsLFxuICAgIGljb25FbGVtZW50czogdGhpcy5pY29uRWxlbWVudHMsXG4gICAgaW5wdXRDYWxsYmFjazogKGkpID0+IG8odGhpcywgUWUsIElzKS5jYWxsKHRoaXMsIGkpLFxuICAgIHNlYXJjaENhbGxiYWNrOiAoaSkgPT4gbyh0aGlzLCB0dCwgQnMpLmNhbGwodGhpcywgaSksXG4gICAgb3BlbkNhbGxiYWNrOiAoKSA9PiBvKHRoaXMsIG90LCBGcykuY2FsbCh0aGlzKSxcbiAgICBjbG9zZUNhbGxiYWNrOiAoKSA9PiBvKHRoaXMsIGllLCBUdCkuY2FsbCh0aGlzKSxcbiAgICBrZXlkb3duQ2FsbGJhY2s6IChpKSA9PiBvKHRoaXMsIGV0LCBQcykuY2FsbCh0aGlzLCBpKSxcbiAgICBmb2N1c0NhbGxiYWNrOiAoKSA9PiBvKHRoaXMsIHN0LCBWcykuY2FsbCh0aGlzKSxcbiAgICBibHVyQ2FsbGJhY2s6ICgpID0+IG8odGhpcywgaXQsIERzKS5jYWxsKHRoaXMpLFxuICAgIG5hbWVDaGFuZ2VDYWxsYmFjazogKGkpID0+IG8odGhpcywgYXQsIE1zKS5jYWxsKHRoaXMsIGkpXG4gIH0pO1xuICByZXR1cm4gdGhpcy5hcHBlbmRUb0JvZHkgJiYgbSh0aGlzLCBGLCBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy51cGRhdGVMaXN0UG9zaXRpb24oKSkpLCBlLmFwcGVuZChzLnNyY0VsZW1lbnQpLCB7IGNvbnRhaW5lcjogZSwgbGlzdDogdCwgaW5wdXQ6IHMgfTtcbn0sIFFlID0gbmV3IFdlYWtTZXQoKSwgSXMgPSBmdW5jdGlvbihlKSB7XG4gIHZhciBpLCBhO1xuICBjb25zdCB0ID0gcmUoZSk7XG4gIChpID0gbih0aGlzLCB1KSkgPT0gbnVsbCB8fCBpLnVwZGF0ZVZhbHVlKHQpO1xuICBjb25zdCBzID0gKChhID0gbih0aGlzLCB1KSkgPT0gbnVsbCA/IHZvaWQgMCA6IGEuc2VsZWN0ZWROb2RlcykgPz8ge307XG4gIG8odGhpcywgdGUsIF90KS5jYWxsKHRoaXMsIHMpLCBvKHRoaXMsIG5lLCBPdCkuY2FsbCh0aGlzKTtcbn0sIGV0ID0gbmV3IFdlYWtTZXQoKSwgUHMgPSBmdW5jdGlvbihlKSB7XG4gIHZhciB0O1xuICB0aGlzLmlzTGlzdE9wZW5lZCAmJiAoKHQgPSBuKHRoaXMsIHUpKSA9PSBudWxsIHx8IHQuY2FsbEtleUFjdGlvbihlKSk7XG59LCB0dCA9IG5ldyBXZWFrU2V0KCksIEJzID0gZnVuY3Rpb24oZSkge1xuICBuKHRoaXMsIHEpICYmIGNsZWFyVGltZW91dChuKHRoaXMsIHEpKSwgbSh0aGlzLCBxLCB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgdmFyIHQ7XG4gICAgKHQgPSBuKHRoaXMsIHUpKSA9PSBudWxsIHx8IHQudXBkYXRlU2VhcmNoVmFsdWUoZSksIHRoaXMudXBkYXRlTGlzdFBvc2l0aW9uKCk7XG4gIH0sIDM1MCkpLCBvKHRoaXMsIHB0LCBVcykuY2FsbCh0aGlzLCBlKTtcbn0sIHN0ID0gbmV3IFdlYWtTZXQoKSwgVnMgPSBmdW5jdGlvbigpIHtcbiAgbyh0aGlzLCBqLCBoZSkuY2FsbCh0aGlzLCAhMCksIG4odGhpcywgTCkgJiYgbih0aGlzLCBMKSAmJiBuKHRoaXMsIEIpICYmIChkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIG4odGhpcywgTCksICEwKSwgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIG4odGhpcywgTCksICEwKSwgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIG4odGhpcywgQikpKTtcbn0sIGl0ID0gbmV3IFdlYWtTZXQoKSwgRHMgPSBmdW5jdGlvbigpIHtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgdmFyIHMsIGk7XG4gICAgY29uc3QgZSA9IChzID0gbih0aGlzLCBwKSkgPT0gbnVsbCA/IHZvaWQgMCA6IHMuc3JjRWxlbWVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KSwgdCA9IChpID0gbih0aGlzLCB1KSkgPT0gbnVsbCA/IHZvaWQgMCA6IGkuc3JjRWxlbWVudC5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICAhZSAmJiAhdCAmJiB0aGlzLmJsdXJXaW5kb3dIYW5kbGVyKCk7XG4gIH0sIDEpO1xufSwgc2UgPSBuZXcgV2Vha1NldCgpLCBBdCA9IGZ1bmN0aW9uKGUpIHtcbiAgdmFyIHM7XG4gIGlmICghZSlcbiAgICByZXR1cm47XG4gIGxldCB0ID0gW107XG4gIHRoaXMuaXNJbmRlcGVuZGVudE5vZGVzIHx8IHRoaXMuaXNTaW5nbGVTZWxlY3QgPyB0ID0gZS5hbGxOb2RlcyA6IHRoaXMuZ3JvdXBlZCA/IHQgPSBlLmdyb3VwZWROb2RlcyA6IHQgPSBlLm5vZGVzLCAocyA9IG4odGhpcywgcCkpID09IG51bGwgfHwgcy51cGRhdGVWYWx1ZSh0KSwgbyh0aGlzLCB0ZSwgX3QpLmNhbGwodGhpcywgZSk7XG59LCBsdCA9IG5ldyBXZWFrU2V0KCksIEhzID0gZnVuY3Rpb24oZSkge1xuICB2YXIgdCwgcywgaTtcbiAgbyh0aGlzLCBzZSwgQXQpLmNhbGwodGhpcywgZSksIHRoaXMuaXNTaW5nbGVTZWxlY3QgJiYgIXRoaXMuYWx3YXlzT3BlbiAmJiAoKHQgPSBuKHRoaXMsIHApKSA9PSBudWxsIHx8IHQub3BlbkNsb3NlKCksIChzID0gbih0aGlzLCBwKSkgPT0gbnVsbCB8fCBzLmNsZWFyU2VhcmNoKCkpLCAoaSA9IG4odGhpcywgcCkpID09IG51bGwgfHwgaS5mb2N1cygpLCBvKHRoaXMsIG5lLCBPdCkuY2FsbCh0aGlzKTtcbn0sIG50ID0gbmV3IFdlYWtTZXQoKSwgR3MgPSBmdW5jdGlvbihlLCB0KSB7XG4gIHZhciBzO1xuICAocyA9IG4odGhpcywgcCkpID09IG51bGwgfHwgcy5mb2N1cygpLCB0aGlzLnVwZGF0ZUxpc3RQb3NpdGlvbigpLCBvKHRoaXMsIG10LCB6cykuY2FsbCh0aGlzLCBlLCB0KTtcbn0sIGF0ID0gbmV3IFdlYWtTZXQoKSwgTXMgPSBmdW5jdGlvbihlKSB7XG4gIHRoaXMuc2VsZWN0ZWROYW1lICE9PSBlICYmICh0aGlzLnNlbGVjdGVkTmFtZSA9IGUsIG8odGhpcywgaHQsIFJzKS5jYWxsKHRoaXMpKTtcbn0sIG90ID0gbmV3IFdlYWtTZXQoKSwgRnMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGU7XG4gIHRoaXMuaXNMaXN0T3BlbmVkID0gITAsIG4odGhpcywgXykgJiYgbih0aGlzLCBBKSAmJiAod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgbih0aGlzLCBfKSwgITApLCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBuKHRoaXMsIEEpKSksICEoIW4odGhpcywgdSkgfHwgIXRoaXMuc3JjRWxlbWVudCkgJiYgKHRoaXMuYXBwZW5kVG9Cb2R5ID8gKGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobih0aGlzLCB1KS5zcmNFbGVtZW50KSwgKGUgPSBuKHRoaXMsIEYpKSA9PSBudWxsIHx8IGUub2JzZXJ2ZSh0aGlzLnNyY0VsZW1lbnQpKSA6IHRoaXMuc3JjRWxlbWVudC5hcHBlbmRDaGlsZChuKHRoaXMsIHUpLnNyY0VsZW1lbnQpLCB0aGlzLnVwZGF0ZUxpc3RQb3NpdGlvbigpLCBvKHRoaXMsIGxlLCBOdCkuY2FsbCh0aGlzLCAhMCksIG8odGhpcywgY3QsIGpzKS5jYWxsKHRoaXMpLCBvKHRoaXMsIGR0LCAkcykuY2FsbCh0aGlzKSk7XG59LCBpZSA9IG5ldyBXZWFrU2V0KCksIFR0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciB0O1xuICB0aGlzLmFsd2F5c09wZW4gfHwgKHRoaXMuaXNMaXN0T3BlbmVkID0gITEsIG4odGhpcywgXykgJiYgbih0aGlzLCBBKSAmJiAod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgbih0aGlzLCBfKSwgITApLCB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBuKHRoaXMsIEEpKSksICFuKHRoaXMsIHUpIHx8ICF0aGlzLnNyY0VsZW1lbnQpIHx8ICEodGhpcy5hcHBlbmRUb0JvZHkgPyBkb2N1bWVudC5ib2R5LmNvbnRhaW5zKG4odGhpcywgdSkuc3JjRWxlbWVudCkgOiB0aGlzLnNyY0VsZW1lbnQuY29udGFpbnMobih0aGlzLCB1KS5zcmNFbGVtZW50KSkgfHwgKG0odGhpcywgUSwgbih0aGlzLCB1KS5zcmNFbGVtZW50LnNjcm9sbFRvcCksIHRoaXMuYXBwZW5kVG9Cb2R5ID8gKGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQobih0aGlzLCB1KS5zcmNFbGVtZW50KSwgKHQgPSBuKHRoaXMsIEYpKSA9PSBudWxsIHx8IHQuZGlzY29ubmVjdCgpKSA6IHRoaXMuc3JjRWxlbWVudC5yZW1vdmVDaGlsZChuKHRoaXMsIHUpLnNyY0VsZW1lbnQpLCBvKHRoaXMsIGxlLCBOdCkuY2FsbCh0aGlzLCAhMSksIG8odGhpcywgdXQsIFdzKS5jYWxsKHRoaXMpKTtcbn0sIHJ0ID0gbmV3IFdlYWtTZXQoKSwgcXMgPSBmdW5jdGlvbihlLCB0KSB7XG4gIGlmICghbih0aGlzLCB1KSB8fCAhbih0aGlzLCBwKSlcbiAgICByZXR1cm47XG4gIGNvbnN0IHMgPSB0ID8gXCJ0cmVlc2VsZWN0LWxpc3QtLXRvcC10by1ib2R5XCIgOiBcInRyZWVzZWxlY3QtbGlzdC0tdG9wXCIsIGkgPSB0ID8gXCJ0cmVlc2VsZWN0LWxpc3QtLWJvdHRvbS10by1ib2R5XCIgOiBcInRyZWVzZWxlY3QtbGlzdC0tYm90dG9tXCI7XG4gIGUgPyAobih0aGlzLCB1KS5zcmNFbGVtZW50LmNsYXNzTGlzdC5hZGQocyksIG4odGhpcywgdSkuc3JjRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGkpLCBuKHRoaXMsIHApLnNyY0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtaW5wdXQtLXRvcFwiKSwgbih0aGlzLCBwKS5zcmNFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LWlucHV0LS1ib3R0b21cIikpIDogKG4odGhpcywgdSkuc3JjRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHMpLCBuKHRoaXMsIHUpLnNyY0VsZW1lbnQuY2xhc3NMaXN0LmFkZChpKSwgbih0aGlzLCBwKS5zcmNFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LWlucHV0LS10b3BcIiksIG4odGhpcywgcCkuc3JjRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1pbnB1dC0tYm90dG9tXCIpKTtcbn0sIGogPSBuZXcgV2Vha1NldCgpLCBoZSA9IGZ1bmN0aW9uKGUpIHtcbiAgIW4odGhpcywgcCkgfHwgIW4odGhpcywgdSkgfHwgKGUgPyAobih0aGlzLCBwKS5zcmNFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0LS1mb2N1c2VkXCIpLCBuKHRoaXMsIHUpLnNyY0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdC0tZm9jdXNlZFwiKSkgOiAobih0aGlzLCBwKS5zcmNFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LWlucHV0LS1mb2N1c2VkXCIpLCBuKHRoaXMsIHUpLnNyY0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtbGlzdC0tZm9jdXNlZFwiKSkpO1xufSwgbGUgPSBuZXcgV2Vha1NldCgpLCBOdCA9IGZ1bmN0aW9uKGUpIHtcbiAgdmFyIHQsIHMsIGksIGE7XG4gIGUgPyAodCA9IG4odGhpcywgcCkpID09IG51bGwgfHwgdC5zcmNFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0LS1vcGVuZWRcIikgOiAocyA9IG4odGhpcywgcCkpID09IG51bGwgfHwgcy5zcmNFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LWlucHV0LS1vcGVuZWRcIiksIHRoaXMuc3RhdGljTGlzdCA/IChpID0gbih0aGlzLCB1KSkgPT0gbnVsbCB8fCBpLnNyY0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdC0tc3RhdGljXCIpIDogKGEgPSBuKHRoaXMsIHUpKSA9PSBudWxsIHx8IGEuc3JjRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwidHJlZXNlbGVjdC1saXN0LS1zdGF0aWNcIik7XG59LCBSID0gbmV3IFdlYWtTZXQoKSwgZGUgPSBmdW5jdGlvbihlKSB7XG4gICFuKHRoaXMsIF8pIHx8ICFuKHRoaXMsIEEpIHx8ICFuKHRoaXMsIEwpIHx8ICFuKHRoaXMsIEIpIHx8ICgoIXRoaXMuYWx3YXlzT3BlbiB8fCBlKSAmJiAod2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgbih0aGlzLCBfKSwgITApLCB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBuKHRoaXMsIEEpKSksIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgbih0aGlzLCBMKSwgITApLCBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgbih0aGlzLCBMKSwgITApLCB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgbih0aGlzLCBCKSkpO1xufSwgY3QgPSBuZXcgV2Vha1NldCgpLCBqcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgdCwgcywgaTtcbiAgY29uc3QgZSA9ICh0ID0gbih0aGlzLCB1KSkgPT0gbnVsbCA/IHZvaWQgMCA6IHQuaXNMYXN0Rm9jdXNlZEVsZW1lbnRFeGlzdCgpO1xuICB0aGlzLnNhdmVTY3JvbGxQb3NpdGlvbiAmJiBlID8gKHMgPSBuKHRoaXMsIHUpKSA9PSBudWxsIHx8IHMuc3JjRWxlbWVudC5zY3JvbGwoMCwgbih0aGlzLCBRKSkgOiAoaSA9IG4odGhpcywgdSkpID09IG51bGwgfHwgaS5mb2N1c0ZpcnN0TGlzdEVsZW1lbnQoKTtcbn0sIG5lID0gbmV3IFdlYWtTZXQoKSwgT3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGU7XG4gIChlID0gdGhpcy5zcmNFbGVtZW50KSA9PSBudWxsIHx8IGUuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJpbnB1dFwiLCB7IGRldGFpbDogdGhpcy52YWx1ZSB9KSksIHRoaXMuaW5wdXRDYWxsYmFjayAmJiB0aGlzLmlucHV0Q2FsbGJhY2sodGhpcy52YWx1ZSk7XG59LCBodCA9IG5ldyBXZWFrU2V0KCksIFJzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBlO1xuICAoZSA9IHRoaXMuc3JjRWxlbWVudCkgPT0gbnVsbCB8fCBlLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwibmFtZS1jaGFuZ2VcIiwgeyBkZXRhaWw6IHRoaXMuc2VsZWN0ZWROYW1lIH0pKSwgdGhpcy5uYW1lQ2hhbmdlQ2FsbGJhY2sgJiYgdGhpcy5uYW1lQ2hhbmdlQ2FsbGJhY2sodGhpcy5zZWxlY3RlZE5hbWUpO1xufSwgZHQgPSBuZXcgV2Vha1NldCgpLCAkcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZTtcbiAgdGhpcy5hbHdheXNPcGVuIHx8ICgoZSA9IHRoaXMuc3JjRWxlbWVudCkgPT0gbnVsbCB8fCBlLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwib3BlblwiLCB7IGRldGFpbDogdGhpcy52YWx1ZSB9KSksIHRoaXMub3BlbkNhbGxiYWNrICYmIHRoaXMub3BlbkNhbGxiYWNrKHRoaXMudmFsdWUpKTtcbn0sIHV0ID0gbmV3IFdlYWtTZXQoKSwgV3MgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGU7XG4gIHRoaXMuYWx3YXlzT3BlbiB8fCAoKGUgPSB0aGlzLnNyY0VsZW1lbnQpID09IG51bGwgfHwgZS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImNsb3NlXCIsIHsgZGV0YWlsOiB0aGlzLnZhbHVlIH0pKSwgdGhpcy5jbG9zZUNhbGxiYWNrICYmIHRoaXMuY2xvc2VDYWxsYmFjayh0aGlzLnZhbHVlKSk7XG59LCBwdCA9IG5ldyBXZWFrU2V0KCksIFVzID0gZnVuY3Rpb24oZSkge1xuICB2YXIgcztcbiAgY29uc3QgdCA9IChlID09IG51bGwgPyB2b2lkIDAgOiBlLnRyaW0oKSkgPz8gXCJcIjtcbiAgKHMgPSB0aGlzLnNyY0VsZW1lbnQpID09IG51bGwgfHwgcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcInNlYXJjaFwiLCB7IGRldGFpbDogdCB9KSksIHRoaXMuc2VhcmNoQ2FsbGJhY2sgJiYgdGhpcy5zZWFyY2hDYWxsYmFjayh0KTtcbn0sIG10ID0gbmV3IFdlYWtTZXQoKSwgenMgPSBmdW5jdGlvbihlLCB0KSB7XG4gIHZhciBzO1xuICAocyA9IHRoaXMuc3JjRWxlbWVudCkgPT0gbnVsbCB8fCBzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwib3Blbi1jbG9zZS1ncm91cFwiLCB7IGRldGFpbDogeyBncm91cElkOiBlLCBpc0Nsb3NlZDogdCB9IH0pKSwgdGhpcy5vcGVuQ2xvc2VHcm91cENhbGxiYWNrICYmIHRoaXMub3BlbkNsb3NlR3JvdXBDYWxsYmFjayhlLCB0KTtcbn07XG5leHBvcnQge1xuICBHaSBhcyBkZWZhdWx0XG59O1xuIiwgImltcG9ydCBUcmVlc2VsZWN0IGZyb20gJ3RyZWVzZWxlY3RqcydcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gc2VsZWN0VHJlZSh7XG4gICBzdGF0ZSxcbiAgIG5hbWUsXG4gICBvcHRpb25zLFxuICAgc2VhcmNoYWJsZSxcbiAgIHNob3dDb3VudCxcbiAgIHBsYWNlaG9sZGVyLFxuICAgcnRsLFxuICAgZGlzYWJsZWRCcmFuY2hOb2RlID0gdHJ1ZSxcbiAgIGRpc2FibGVkID0gZmFsc2UsXG4gICBpc1NpbmdsZVNlbGVjdCA9IHRydWUsXG4gICBzaG93VGFncyA9IHRydWUsXG4gICBjbGVhcmFibGUgPSB0cnVlLFxuICAgaXNJbmRlcGVuZGVudE5vZGVzID0gdHJ1ZSxcbiAgIGFsd2F5c09wZW4gPSBmYWxzZSxcbiAgIGVtcHR5VGV4dCxcbiAgIGV4cGFuZFNlbGVjdGVkID0gdHJ1ZSxcbiAgIGdyb3VwZWQgPSB0cnVlLFxuICAgb3BlbkxldmVsID0gMCxcbiAgIGRpcmVjdGlvbiA9ICdhdXRvJ1xuIH0pIHtcbiAgcmV0dXJuIHtcbiAgICBzdGF0ZSxcblxuICAgIC8qKiBAdHlwZSBUcmVlc2VsZWN0ICovXG4gICAgdHJlZTogbnVsbCxcblxuICAgIGluaXQoKSB7XG4gICAgICB0aGlzLnRyZWUgPSBuZXcgVHJlZXNlbGVjdCh7XG4gICAgICAgIGlkOiBgdHJlZS0ke25hbWV9LWlkYCxcbiAgICAgICAgYXJpYUxhYmVsOiBgdHJlZS0ke25hbWV9LWxhYmVsYCxcbiAgICAgICAgcGFyZW50SHRtbENvbnRhaW5lcjogdGhpcy4kcmVmcy50cmVlLFxuICAgICAgICB2YWx1ZTogdGhpcy5zdGF0ZSA/PyBbXSxcbiAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgc2VhcmNoYWJsZSxcbiAgICAgICAgc2hvd0NvdW50LFxuICAgICAgICBwbGFjZWhvbGRlcixcbiAgICAgICAgZGlzYWJsZWRCcmFuY2hOb2RlLFxuICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgaXNTaW5nbGVTZWxlY3QsXG4gICAgICAgIHNob3dUYWdzLFxuICAgICAgICBjbGVhcmFibGUsXG4gICAgICAgIGlzSW5kZXBlbmRlbnROb2RlcyxcbiAgICAgICAgYWx3YXlzT3BlbixcbiAgICAgICAgZW1wdHlUZXh0LFxuICAgICAgICBleHBhbmRTZWxlY3RlZCxcbiAgICAgICAgZ3JvdXBlZCxcbiAgICAgICAgb3BlbkxldmVsLFxuICAgICAgICBkaXJlY3Rpb24sXG4gICAgICAgIHJ0bFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMudHJlZS5zcmNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZSA9IGUuZGV0YWlsO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iLCAiLyoqIVxuICogU29ydGFibGUgMS4xNS4yXG4gKiBAYXV0aG9yXHRSdWJhWGEgICA8dHJhc2hAcnViYXhhLm9yZz5cbiAqIEBhdXRob3JcdG93ZW5tICAgIDxvd2VuMjMzNTVAZ21haWwuY29tPlxuICogQGxpY2Vuc2UgTUlUXG4gKi9cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkge1xuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7XG4gICAgaWYgKGVudW1lcmFibGVPbmx5KSB7XG4gICAgICBzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkge1xuICAgICAgICByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7XG4gIH1cbiAgcmV0dXJuIGtleXM7XG59XG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkMih0YXJnZXQpIHtcbiAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldICE9IG51bGwgPyBhcmd1bWVudHNbaV0gOiB7fTtcbiAgICBpZiAoaSAlIDIpIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSksIHRydWUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gX3R5cGVvZihvYmopIHtcbiAgXCJAYmFiZWwvaGVscGVycyAtIHR5cGVvZlwiO1xuXG4gIGlmICh0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIikge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIG9iajtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIF90eXBlb2YgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvYmouY29uc3RydWN0b3IgPT09IFN5bWJvbCAmJiBvYmogIT09IFN5bWJvbC5wcm90b3R5cGUgPyBcInN5bWJvbFwiIDogdHlwZW9mIG9iajtcbiAgICB9O1xuICB9XG4gIHJldHVybiBfdHlwZW9mKG9iaik7XG59XG5mdW5jdGlvbiBfZGVmaW5lUHJvcGVydHkob2JqLCBrZXksIHZhbHVlKSB7XG4gIGlmIChrZXkgaW4gb2JqKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgd3JpdGFibGU6IHRydWVcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBvYmpba2V5XSA9IHZhbHVlO1xuICB9XG4gIHJldHVybiBvYmo7XG59XG5mdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHtcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHtcbiAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuZnVuY3Rpb24gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IHt9O1xuICB2YXIgc291cmNlS2V5cyA9IE9iamVjdC5rZXlzKHNvdXJjZSk7XG4gIHZhciBrZXksIGk7XG4gIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAga2V5ID0gc291cmNlS2V5c1tpXTtcbiAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhzb3VyY2UsIGV4Y2x1ZGVkKSB7XG4gIGlmIChzb3VyY2UgPT0gbnVsbCkgcmV0dXJuIHt9O1xuICB2YXIgdGFyZ2V0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzTG9vc2Uoc291cmNlLCBleGNsdWRlZCk7XG4gIHZhciBrZXksIGk7XG4gIGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG4gICAgdmFyIHNvdXJjZVN5bWJvbEtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHNvdXJjZSk7XG4gICAgZm9yIChpID0gMDsgaSA8IHNvdXJjZVN5bWJvbEtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IHNvdXJjZVN5bWJvbEtleXNbaV07XG4gICAgICBpZiAoZXhjbHVkZWQuaW5kZXhPZihrZXkpID49IDApIGNvbnRpbnVlO1xuICAgICAgaWYgKCFPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoc291cmNlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgIHRhcmdldFtrZXldID0gc291cmNlW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7XG4gIHJldHVybiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB8fCBfaXRlcmFibGVUb0FycmF5KGFycikgfHwgX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KGFycikgfHwgX25vbkl0ZXJhYmxlU3ByZWFkKCk7XG59XG5mdW5jdGlvbiBfYXJyYXlXaXRob3V0SG9sZXMoYXJyKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGFycikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShhcnIpO1xufVxuZnVuY3Rpb24gX2l0ZXJhYmxlVG9BcnJheShpdGVyKSB7XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSBcInVuZGVmaW5lZFwiICYmIGl0ZXJbU3ltYm9sLml0ZXJhdG9yXSAhPSBudWxsIHx8IGl0ZXJbXCJAQGl0ZXJhdG9yXCJdICE9IG51bGwpIHJldHVybiBBcnJheS5mcm9tKGl0ZXIpO1xufVxuZnVuY3Rpb24gX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5KG8sIG1pbkxlbikge1xuICBpZiAoIW8pIHJldHVybjtcbiAgaWYgKHR5cGVvZiBvID09PSBcInN0cmluZ1wiKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbiAgdmFyIG4gPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobykuc2xpY2UoOCwgLTEpO1xuICBpZiAobiA9PT0gXCJPYmplY3RcIiAmJiBvLmNvbnN0cnVjdG9yKSBuID0gby5jb25zdHJ1Y3Rvci5uYW1lO1xuICBpZiAobiA9PT0gXCJNYXBcIiB8fCBuID09PSBcIlNldFwiKSByZXR1cm4gQXJyYXkuZnJvbShvKTtcbiAgaWYgKG4gPT09IFwiQXJndW1lbnRzXCIgfHwgL14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpIHJldHVybiBfYXJyYXlMaWtlVG9BcnJheShvLCBtaW5MZW4pO1xufVxuZnVuY3Rpb24gX2FycmF5TGlrZVRvQXJyYXkoYXJyLCBsZW4pIHtcbiAgaWYgKGxlbiA9PSBudWxsIHx8IGxlbiA+IGFyci5sZW5ndGgpIGxlbiA9IGFyci5sZW5ndGg7XG4gIGZvciAodmFyIGkgPSAwLCBhcnIyID0gbmV3IEFycmF5KGxlbik7IGkgPCBsZW47IGkrKykgYXJyMltpXSA9IGFycltpXTtcbiAgcmV0dXJuIGFycjI7XG59XG5mdW5jdGlvbiBfbm9uSXRlcmFibGVTcHJlYWQoKSB7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZS5cXG5JbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuXCIpO1xufVxuXG52YXIgdmVyc2lvbiA9IFwiMS4xNS4yXCI7XG5cbmZ1bmN0aW9uIHVzZXJBZ2VudChwYXR0ZXJuKSB7XG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubmF2aWdhdG9yKSB7XG4gICAgcmV0dXJuICEhIC8qQF9fUFVSRV9fKi9uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKHBhdHRlcm4pO1xuICB9XG59XG52YXIgSUUxMU9yTGVzcyA9IHVzZXJBZ2VudCgvKD86VHJpZGVudC4qcnZbIDpdPzExXFwufG1zaWV8aWVtb2JpbGV8V2luZG93cyBQaG9uZSkvaSk7XG52YXIgRWRnZSA9IHVzZXJBZ2VudCgvRWRnZS9pKTtcbnZhciBGaXJlRm94ID0gdXNlckFnZW50KC9maXJlZm94L2kpO1xudmFyIFNhZmFyaSA9IHVzZXJBZ2VudCgvc2FmYXJpL2kpICYmICF1c2VyQWdlbnQoL2Nocm9tZS9pKSAmJiAhdXNlckFnZW50KC9hbmRyb2lkL2kpO1xudmFyIElPUyA9IHVzZXJBZ2VudCgvaVAoYWR8b2R8aG9uZSkvaSk7XG52YXIgQ2hyb21lRm9yQW5kcm9pZCA9IHVzZXJBZ2VudCgvY2hyb21lL2kpICYmIHVzZXJBZ2VudCgvYW5kcm9pZC9pKTtcblxudmFyIGNhcHR1cmVNb2RlID0ge1xuICBjYXB0dXJlOiBmYWxzZSxcbiAgcGFzc2l2ZTogZmFsc2Vcbn07XG5mdW5jdGlvbiBvbihlbCwgZXZlbnQsIGZuKSB7XG4gIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCAhSUUxMU9yTGVzcyAmJiBjYXB0dXJlTW9kZSk7XG59XG5mdW5jdGlvbiBvZmYoZWwsIGV2ZW50LCBmbikge1xuICBlbC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgIUlFMTFPckxlc3MgJiYgY2FwdHVyZU1vZGUpO1xufVxuZnVuY3Rpb24gbWF0Y2hlcyggLyoqSFRNTEVsZW1lbnQqL2VsLCAvKipTdHJpbmcqL3NlbGVjdG9yKSB7XG4gIGlmICghc2VsZWN0b3IpIHJldHVybjtcbiAgc2VsZWN0b3JbMF0gPT09ICc+JyAmJiAoc2VsZWN0b3IgPSBzZWxlY3Rvci5zdWJzdHJpbmcoMSkpO1xuICBpZiAoZWwpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKGVsLm1hdGNoZXMpIHtcbiAgICAgICAgcmV0dXJuIGVsLm1hdGNoZXMoc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmIChlbC5tc01hdGNoZXNTZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gZWwubXNNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfSBlbHNlIGlmIChlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVsLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5mdW5jdGlvbiBnZXRQYXJlbnRPckhvc3QoZWwpIHtcbiAgcmV0dXJuIGVsLmhvc3QgJiYgZWwgIT09IGRvY3VtZW50ICYmIGVsLmhvc3Qubm9kZVR5cGUgPyBlbC5ob3N0IDogZWwucGFyZW50Tm9kZTtcbn1cbmZ1bmN0aW9uIGNsb3Nlc3QoIC8qKkhUTUxFbGVtZW50Ki9lbCwgLyoqU3RyaW5nKi9zZWxlY3RvciwgLyoqSFRNTEVsZW1lbnQqL2N0eCwgaW5jbHVkZUNUWCkge1xuICBpZiAoZWwpIHtcbiAgICBjdHggPSBjdHggfHwgZG9jdW1lbnQ7XG4gICAgZG8ge1xuICAgICAgaWYgKHNlbGVjdG9yICE9IG51bGwgJiYgKHNlbGVjdG9yWzBdID09PSAnPicgPyBlbC5wYXJlbnROb2RlID09PSBjdHggJiYgbWF0Y2hlcyhlbCwgc2VsZWN0b3IpIDogbWF0Y2hlcyhlbCwgc2VsZWN0b3IpKSB8fCBpbmNsdWRlQ1RYICYmIGVsID09PSBjdHgpIHtcbiAgICAgICAgcmV0dXJuIGVsO1xuICAgICAgfVxuICAgICAgaWYgKGVsID09PSBjdHgpIGJyZWFrO1xuICAgICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuICAgIH0gd2hpbGUgKGVsID0gZ2V0UGFyZW50T3JIb3N0KGVsKSk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG52YXIgUl9TUEFDRSA9IC9cXHMrL2c7XG5mdW5jdGlvbiB0b2dnbGVDbGFzcyhlbCwgbmFtZSwgc3RhdGUpIHtcbiAgaWYgKGVsICYmIG5hbWUpIHtcbiAgICBpZiAoZWwuY2xhc3NMaXN0KSB7XG4gICAgICBlbC5jbGFzc0xpc3Rbc3RhdGUgPyAnYWRkJyA6ICdyZW1vdmUnXShuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGNsYXNzTmFtZSA9ICgnICcgKyBlbC5jbGFzc05hbWUgKyAnICcpLnJlcGxhY2UoUl9TUEFDRSwgJyAnKS5yZXBsYWNlKCcgJyArIG5hbWUgKyAnICcsICcgJyk7XG4gICAgICBlbC5jbGFzc05hbWUgPSAoY2xhc3NOYW1lICsgKHN0YXRlID8gJyAnICsgbmFtZSA6ICcnKSkucmVwbGFjZShSX1NQQUNFLCAnICcpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gY3NzKGVsLCBwcm9wLCB2YWwpIHtcbiAgdmFyIHN0eWxlID0gZWwgJiYgZWwuc3R5bGU7XG4gIGlmIChzdHlsZSkge1xuICAgIGlmICh2YWwgPT09IHZvaWQgMCkge1xuICAgICAgaWYgKGRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUpIHtcbiAgICAgICAgdmFsID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbCwgJycpO1xuICAgICAgfSBlbHNlIGlmIChlbC5jdXJyZW50U3R5bGUpIHtcbiAgICAgICAgdmFsID0gZWwuY3VycmVudFN0eWxlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb3AgPT09IHZvaWQgMCA/IHZhbCA6IHZhbFtwcm9wXTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEocHJvcCBpbiBzdHlsZSkgJiYgcHJvcC5pbmRleE9mKCd3ZWJraXQnKSA9PT0gLTEpIHtcbiAgICAgICAgcHJvcCA9ICctd2Via2l0LScgKyBwcm9wO1xuICAgICAgfVxuICAgICAgc3R5bGVbcHJvcF0gPSB2YWwgKyAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgPyAnJyA6ICdweCcpO1xuICAgIH1cbiAgfVxufVxuZnVuY3Rpb24gbWF0cml4KGVsLCBzZWxmT25seSkge1xuICB2YXIgYXBwbGllZFRyYW5zZm9ybXMgPSAnJztcbiAgaWYgKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycpIHtcbiAgICBhcHBsaWVkVHJhbnNmb3JtcyA9IGVsO1xuICB9IGVsc2Uge1xuICAgIGRvIHtcbiAgICAgIHZhciB0cmFuc2Zvcm0gPSBjc3MoZWwsICd0cmFuc2Zvcm0nKTtcbiAgICAgIGlmICh0cmFuc2Zvcm0gJiYgdHJhbnNmb3JtICE9PSAnbm9uZScpIHtcbiAgICAgICAgYXBwbGllZFRyYW5zZm9ybXMgPSB0cmFuc2Zvcm0gKyAnICcgKyBhcHBsaWVkVHJhbnNmb3JtcztcbiAgICAgIH1cbiAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgICB9IHdoaWxlICghc2VsZk9ubHkgJiYgKGVsID0gZWwucGFyZW50Tm9kZSkpO1xuICB9XG4gIHZhciBtYXRyaXhGbiA9IHdpbmRvdy5ET01NYXRyaXggfHwgd2luZG93LldlYktpdENTU01hdHJpeCB8fCB3aW5kb3cuQ1NTTWF0cml4IHx8IHdpbmRvdy5NU0NTU01hdHJpeDtcbiAgLypqc2hpbnQgLVcwNTYgKi9cbiAgcmV0dXJuIG1hdHJpeEZuICYmIG5ldyBtYXRyaXhGbihhcHBsaWVkVHJhbnNmb3Jtcyk7XG59XG5mdW5jdGlvbiBmaW5kKGN0eCwgdGFnTmFtZSwgaXRlcmF0b3IpIHtcbiAgaWYgKGN0eCkge1xuICAgIHZhciBsaXN0ID0gY3R4LmdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpLFxuICAgICAgaSA9IDAsXG4gICAgICBuID0gbGlzdC5sZW5ndGg7XG4gICAgaWYgKGl0ZXJhdG9yKSB7XG4gICAgICBmb3IgKDsgaSA8IG47IGkrKykge1xuICAgICAgICBpdGVyYXRvcihsaXN0W2ldLCBpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpIHtcbiAgdmFyIHNjcm9sbGluZ0VsZW1lbnQgPSBkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50O1xuICBpZiAoc2Nyb2xsaW5nRWxlbWVudCkge1xuICAgIHJldHVybiBzY3JvbGxpbmdFbGVtZW50O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIH1cbn1cblxuLyoqXHJcbiAqIFJldHVybnMgdGhlIFwiYm91bmRpbmcgY2xpZW50IHJlY3RcIiBvZiBnaXZlbiBlbGVtZW50XHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVsZW1lbnQgd2hvc2UgYm91bmRpbmdDbGllbnRSZWN0IGlzIHdhbnRlZFxyXG4gKiBAcGFyYW0gIHtbQm9vbGVhbl19IHJlbGF0aXZlVG9Db250YWluaW5nQmxvY2sgIFdoZXRoZXIgdGhlIHJlY3Qgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBjb250YWluaW5nIGJsb2NrIG9mIChpbmNsdWRpbmcpIHRoZSBjb250YWluZXJcclxuICogQHBhcmFtICB7W0Jvb2xlYW5dfSByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50ICBXaGV0aGVyIHRoZSByZWN0IHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcmVsYXRpdmUgcGFyZW50IG9mIChpbmNsdWRpbmcpIHRoZSBjb250YWllbnJcclxuICogQHBhcmFtICB7W0Jvb2xlYW5dfSB1bmRvU2NhbGUgICAgICAgICAgICAgICAgICBXaGV0aGVyIHRoZSBjb250YWluZXIncyBzY2FsZSgpIHNob3VsZCBiZSB1bmRvbmVcclxuICogQHBhcmFtICB7W0hUTUxFbGVtZW50XX0gY29udGFpbmVyICAgICAgICAgICAgICBUaGUgcGFyZW50IHRoZSBlbGVtZW50IHdpbGwgYmUgcGxhY2VkIGluXHJcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGJvdW5kaW5nQ2xpZW50UmVjdCBvZiBlbCwgd2l0aCBzcGVjaWZpZWQgYWRqdXN0bWVudHNcclxuICovXG5mdW5jdGlvbiBnZXRSZWN0KGVsLCByZWxhdGl2ZVRvQ29udGFpbmluZ0Jsb2NrLCByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50LCB1bmRvU2NhbGUsIGNvbnRhaW5lcikge1xuICBpZiAoIWVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiBlbCAhPT0gd2luZG93KSByZXR1cm47XG4gIHZhciBlbFJlY3QsIHRvcCwgbGVmdCwgYm90dG9tLCByaWdodCwgaGVpZ2h0LCB3aWR0aDtcbiAgaWYgKGVsICE9PSB3aW5kb3cgJiYgZWwucGFyZW50Tm9kZSAmJiBlbCAhPT0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpKSB7XG4gICAgZWxSZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgdG9wID0gZWxSZWN0LnRvcDtcbiAgICBsZWZ0ID0gZWxSZWN0LmxlZnQ7XG4gICAgYm90dG9tID0gZWxSZWN0LmJvdHRvbTtcbiAgICByaWdodCA9IGVsUmVjdC5yaWdodDtcbiAgICBoZWlnaHQgPSBlbFJlY3QuaGVpZ2h0O1xuICAgIHdpZHRoID0gZWxSZWN0LndpZHRoO1xuICB9IGVsc2Uge1xuICAgIHRvcCA9IDA7XG4gICAgbGVmdCA9IDA7XG4gICAgYm90dG9tID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgIHJpZ2h0ID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgaGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgIHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gIH1cbiAgaWYgKChyZWxhdGl2ZVRvQ29udGFpbmluZ0Jsb2NrIHx8IHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQpICYmIGVsICE9PSB3aW5kb3cpIHtcbiAgICAvLyBBZGp1c3QgZm9yIHRyYW5zbGF0ZSgpXG4gICAgY29udGFpbmVyID0gY29udGFpbmVyIHx8IGVsLnBhcmVudE5vZGU7XG5cbiAgICAvLyBzb2x2ZXMgIzExMjMgKHNlZTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM3OTUzODA2LzYwODgzMTIpXG4gICAgLy8gTm90IG5lZWRlZCBvbiA8PSBJRTExXG4gICAgaWYgKCFJRTExT3JMZXNzKSB7XG4gICAgICBkbyB7XG4gICAgICAgIGlmIChjb250YWluZXIgJiYgY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCAmJiAoY3NzKGNvbnRhaW5lciwgJ3RyYW5zZm9ybScpICE9PSAnbm9uZScgfHwgcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCAmJiBjc3MoY29udGFpbmVyLCAncG9zaXRpb24nKSAhPT0gJ3N0YXRpYycpKSB7XG4gICAgICAgICAgdmFyIGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICAvLyBTZXQgcmVsYXRpdmUgdG8gZWRnZXMgb2YgcGFkZGluZyBib3ggb2YgY29udGFpbmVyXG4gICAgICAgICAgdG9wIC09IGNvbnRhaW5lclJlY3QudG9wICsgcGFyc2VJbnQoY3NzKGNvbnRhaW5lciwgJ2JvcmRlci10b3Atd2lkdGgnKSk7XG4gICAgICAgICAgbGVmdCAtPSBjb250YWluZXJSZWN0LmxlZnQgKyBwYXJzZUludChjc3MoY29udGFpbmVyLCAnYm9yZGVyLWxlZnQtd2lkdGgnKSk7XG4gICAgICAgICAgYm90dG9tID0gdG9wICsgZWxSZWN0LmhlaWdodDtcbiAgICAgICAgICByaWdodCA9IGxlZnQgKyBlbFJlY3Qud2lkdGg7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuICAgICAgfSB3aGlsZSAoY29udGFpbmVyID0gY29udGFpbmVyLnBhcmVudE5vZGUpO1xuICAgIH1cbiAgfVxuICBpZiAodW5kb1NjYWxlICYmIGVsICE9PSB3aW5kb3cpIHtcbiAgICAvLyBBZGp1c3QgZm9yIHNjYWxlKClcbiAgICB2YXIgZWxNYXRyaXggPSBtYXRyaXgoY29udGFpbmVyIHx8IGVsKSxcbiAgICAgIHNjYWxlWCA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmEsXG4gICAgICBzY2FsZVkgPSBlbE1hdHJpeCAmJiBlbE1hdHJpeC5kO1xuICAgIGlmIChlbE1hdHJpeCkge1xuICAgICAgdG9wIC89IHNjYWxlWTtcbiAgICAgIGxlZnQgLz0gc2NhbGVYO1xuICAgICAgd2lkdGggLz0gc2NhbGVYO1xuICAgICAgaGVpZ2h0IC89IHNjYWxlWTtcbiAgICAgIGJvdHRvbSA9IHRvcCArIGhlaWdodDtcbiAgICAgIHJpZ2h0ID0gbGVmdCArIHdpZHRoO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHRvcDogdG9wLFxuICAgIGxlZnQ6IGxlZnQsXG4gICAgYm90dG9tOiBib3R0b20sXG4gICAgcmlnaHQ6IHJpZ2h0LFxuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodFxuICB9O1xufVxuXG4vKipcclxuICogQ2hlY2tzIGlmIGEgc2lkZSBvZiBhbiBlbGVtZW50IGlzIHNjcm9sbGVkIHBhc3QgYSBzaWRlIG9mIGl0cyBwYXJlbnRzXHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgZWwgICAgICAgICAgIFRoZSBlbGVtZW50IHdobydzIHNpZGUgYmVpbmcgc2Nyb2xsZWQgb3V0IG9mIHZpZXcgaXMgaW4gcXVlc3Rpb25cclxuICogQHBhcmFtICB7U3RyaW5nfSAgICAgICBlbFNpZGUgICAgICAgU2lkZSBvZiB0aGUgZWxlbWVudCBpbiBxdWVzdGlvbiAoJ3RvcCcsICdsZWZ0JywgJ3JpZ2h0JywgJ2JvdHRvbScpXHJcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgcGFyZW50U2lkZSAgIFNpZGUgb2YgdGhlIHBhcmVudCBpbiBxdWVzdGlvbiAoJ3RvcCcsICdsZWZ0JywgJ3JpZ2h0JywgJ2JvdHRvbScpXHJcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICAgICAgIFRoZSBwYXJlbnQgc2Nyb2xsIGVsZW1lbnQgdGhhdCB0aGUgZWwncyBzaWRlIGlzIHNjcm9sbGVkIHBhc3QsIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCBlbGVtZW50XHJcbiAqL1xuZnVuY3Rpb24gaXNTY3JvbGxlZFBhc3QoZWwsIGVsU2lkZSwgcGFyZW50U2lkZSkge1xuICB2YXIgcGFyZW50ID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWwsIHRydWUpLFxuICAgIGVsU2lkZVZhbCA9IGdldFJlY3QoZWwpW2VsU2lkZV07XG5cbiAgLyoganNoaW50IGJvc3M6dHJ1ZSAqL1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgdmFyIHBhcmVudFNpZGVWYWwgPSBnZXRSZWN0KHBhcmVudClbcGFyZW50U2lkZV0sXG4gICAgICB2aXNpYmxlID0gdm9pZCAwO1xuICAgIGlmIChwYXJlbnRTaWRlID09PSAndG9wJyB8fCBwYXJlbnRTaWRlID09PSAnbGVmdCcpIHtcbiAgICAgIHZpc2libGUgPSBlbFNpZGVWYWwgPj0gcGFyZW50U2lkZVZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlzaWJsZSA9IGVsU2lkZVZhbCA8PSBwYXJlbnRTaWRlVmFsO1xuICAgIH1cbiAgICBpZiAoIXZpc2libGUpIHJldHVybiBwYXJlbnQ7XG4gICAgaWYgKHBhcmVudCA9PT0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpKSBicmVhaztcbiAgICBwYXJlbnQgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChwYXJlbnQsIGZhbHNlKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxyXG4gKiBHZXRzIG50aCBjaGlsZCBvZiBlbCwgaWdub3JpbmcgaGlkZGVuIGNoaWxkcmVuLCBzb3J0YWJsZSdzIGVsZW1lbnRzIChkb2VzIG5vdCBpZ25vcmUgY2xvbmUgaWYgaXQncyB2aXNpYmxlKVxyXG4gKiBhbmQgbm9uLWRyYWdnYWJsZSBlbGVtZW50c1xyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgVGhlIHBhcmVudCBlbGVtZW50XHJcbiAqIEBwYXJhbSAge051bWJlcn0gY2hpbGROdW0gICAgICBUaGUgaW5kZXggb2YgdGhlIGNoaWxkXHJcbiAqIEBwYXJhbSAge09iamVjdH0gb3B0aW9ucyAgICAgICBQYXJlbnQgU29ydGFibGUncyBvcHRpb25zXHJcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICBUaGUgY2hpbGQgYXQgaW5kZXggY2hpbGROdW0sIG9yIG51bGwgaWYgbm90IGZvdW5kXHJcbiAqL1xuZnVuY3Rpb24gZ2V0Q2hpbGQoZWwsIGNoaWxkTnVtLCBvcHRpb25zLCBpbmNsdWRlRHJhZ0VsKSB7XG4gIHZhciBjdXJyZW50Q2hpbGQgPSAwLFxuICAgIGkgPSAwLFxuICAgIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47XG4gIHdoaWxlIChpIDwgY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgaWYgKGNoaWxkcmVuW2ldLnN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJiBjaGlsZHJlbltpXSAhPT0gU29ydGFibGUuZ2hvc3QgJiYgKGluY2x1ZGVEcmFnRWwgfHwgY2hpbGRyZW5baV0gIT09IFNvcnRhYmxlLmRyYWdnZWQpICYmIGNsb3Nlc3QoY2hpbGRyZW5baV0sIG9wdGlvbnMuZHJhZ2dhYmxlLCBlbCwgZmFsc2UpKSB7XG4gICAgICBpZiAoY3VycmVudENoaWxkID09PSBjaGlsZE51bSkge1xuICAgICAgICByZXR1cm4gY2hpbGRyZW5baV07XG4gICAgICB9XG4gICAgICBjdXJyZW50Q2hpbGQrKztcbiAgICB9XG4gICAgaSsrO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcclxuICogR2V0cyB0aGUgbGFzdCBjaGlsZCBpbiB0aGUgZWwsIGlnbm9yaW5nIGdob3N0RWwgb3IgaW52aXNpYmxlIGVsZW1lbnRzIChjbG9uZXMpXHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAgICAgICBQYXJlbnQgZWxlbWVudFxyXG4gKiBAcGFyYW0gIHtzZWxlY3Rvcn0gc2VsZWN0b3IgICAgQW55IG90aGVyIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWRcclxuICogQHJldHVybiB7SFRNTEVsZW1lbnR9ICAgICAgICAgIFRoZSBsYXN0IGNoaWxkLCBpZ25vcmluZyBnaG9zdEVsXHJcbiAqL1xuZnVuY3Rpb24gbGFzdENoaWxkKGVsLCBzZWxlY3Rvcikge1xuICB2YXIgbGFzdCA9IGVsLmxhc3RFbGVtZW50Q2hpbGQ7XG4gIHdoaWxlIChsYXN0ICYmIChsYXN0ID09PSBTb3J0YWJsZS5naG9zdCB8fCBjc3MobGFzdCwgJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8IHNlbGVjdG9yICYmICFtYXRjaGVzKGxhc3QsIHNlbGVjdG9yKSkpIHtcbiAgICBsYXN0ID0gbGFzdC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICB9XG4gIHJldHVybiBsYXN0IHx8IG51bGw7XG59XG5cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiBhbiBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50IGZvciBhIHNlbGVjdGVkIHNldCBvZlxyXG4gKiBlbGVtZW50c1xyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWxcclxuICogQHBhcmFtICB7c2VsZWN0b3J9IHNlbGVjdG9yXHJcbiAqIEByZXR1cm4ge251bWJlcn1cclxuICovXG5mdW5jdGlvbiBpbmRleChlbCwgc2VsZWN0b3IpIHtcbiAgdmFyIGluZGV4ID0gMDtcbiAgaWYgKCFlbCB8fCAhZWwucGFyZW50Tm9kZSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuXG4gIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgd2hpbGUgKGVsID0gZWwucHJldmlvdXNFbGVtZW50U2libGluZykge1xuICAgIGlmIChlbC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpICE9PSAnVEVNUExBVEUnICYmIGVsICE9PSBTb3J0YWJsZS5jbG9uZSAmJiAoIXNlbGVjdG9yIHx8IG1hdGNoZXMoZWwsIHNlbGVjdG9yKSkpIHtcbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqXHJcbiAqIFJldHVybnMgdGhlIHNjcm9sbCBvZmZzZXQgb2YgdGhlIGdpdmVuIGVsZW1lbnQsIGFkZGVkIHdpdGggYWxsIHRoZSBzY3JvbGwgb2Zmc2V0cyBvZiBwYXJlbnQgZWxlbWVudHMuXHJcbiAqIFRoZSB2YWx1ZSBpcyByZXR1cm5lZCBpbiByZWFsIHBpeGVscy5cclxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsXHJcbiAqIEByZXR1cm4ge0FycmF5fSAgICAgICAgICAgICBPZmZzZXRzIGluIHRoZSBmb3JtYXQgb2YgW2xlZnQsIHRvcF1cclxuICovXG5mdW5jdGlvbiBnZXRSZWxhdGl2ZVNjcm9sbE9mZnNldChlbCkge1xuICB2YXIgb2Zmc2V0TGVmdCA9IDAsXG4gICAgb2Zmc2V0VG9wID0gMCxcbiAgICB3aW5TY3JvbGxlciA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgaWYgKGVsKSB7XG4gICAgZG8ge1xuICAgICAgdmFyIGVsTWF0cml4ID0gbWF0cml4KGVsKSxcbiAgICAgICAgc2NhbGVYID0gZWxNYXRyaXguYSxcbiAgICAgICAgc2NhbGVZID0gZWxNYXRyaXguZDtcbiAgICAgIG9mZnNldExlZnQgKz0gZWwuc2Nyb2xsTGVmdCAqIHNjYWxlWDtcbiAgICAgIG9mZnNldFRvcCArPSBlbC5zY3JvbGxUb3AgKiBzY2FsZVk7XG4gICAgfSB3aGlsZSAoZWwgIT09IHdpblNjcm9sbGVyICYmIChlbCA9IGVsLnBhcmVudE5vZGUpKTtcbiAgfVxuICByZXR1cm4gW29mZnNldExlZnQsIG9mZnNldFRvcF07XG59XG5cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IHdpdGhpbiB0aGUgZ2l2ZW4gYXJyYXlcclxuICogQHBhcmFtICB7QXJyYXl9IGFyciAgIEFycmF5IHRoYXQgbWF5IG9yIG1heSBub3QgaG9sZCB0aGUgb2JqZWN0XHJcbiAqIEBwYXJhbSAge09iamVjdH0gb2JqICBBbiBvYmplY3QgdGhhdCBoYXMgYSBrZXktdmFsdWUgcGFpciB1bmlxdWUgdG8gYW5kIGlkZW50aWNhbCB0byBhIGtleS12YWx1ZSBwYWlyIGluIHRoZSBvYmplY3QgeW91IHdhbnQgdG8gZmluZFxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgVGhlIGluZGV4IG9mIHRoZSBvYmplY3QgaW4gdGhlIGFycmF5LCBvciAtMVxyXG4gKi9cbmZ1bmN0aW9uIGluZGV4T2ZPYmplY3QoYXJyLCBvYmopIHtcbiAgZm9yICh2YXIgaSBpbiBhcnIpIHtcbiAgICBpZiAoIWFyci5oYXNPd25Qcm9wZXJ0eShpKSkgY29udGludWU7XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIG9ialtrZXldID09PSBhcnJbaV1ba2V5XSkgcmV0dXJuIE51bWJlcihpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuZnVuY3Rpb24gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWwsIGluY2x1ZGVTZWxmKSB7XG4gIC8vIHNraXAgdG8gd2luZG93XG4gIGlmICghZWwgfHwgIWVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkgcmV0dXJuIGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgdmFyIGVsZW0gPSBlbDtcbiAgdmFyIGdvdFNlbGYgPSBmYWxzZTtcbiAgZG8ge1xuICAgIC8vIHdlIGRvbid0IG5lZWQgdG8gZ2V0IGVsZW0gY3NzIGlmIGl0IGlzbid0IGV2ZW4gb3ZlcmZsb3dpbmcgaW4gdGhlIGZpcnN0IHBsYWNlIChwZXJmb3JtYW5jZSlcbiAgICBpZiAoZWxlbS5jbGllbnRXaWR0aCA8IGVsZW0uc2Nyb2xsV2lkdGggfHwgZWxlbS5jbGllbnRIZWlnaHQgPCBlbGVtLnNjcm9sbEhlaWdodCkge1xuICAgICAgdmFyIGVsZW1DU1MgPSBjc3MoZWxlbSk7XG4gICAgICBpZiAoZWxlbS5jbGllbnRXaWR0aCA8IGVsZW0uc2Nyb2xsV2lkdGggJiYgKGVsZW1DU1Mub3ZlcmZsb3dYID09ICdhdXRvJyB8fCBlbGVtQ1NTLm92ZXJmbG93WCA9PSAnc2Nyb2xsJykgfHwgZWxlbS5jbGllbnRIZWlnaHQgPCBlbGVtLnNjcm9sbEhlaWdodCAmJiAoZWxlbUNTUy5vdmVyZmxvd1kgPT0gJ2F1dG8nIHx8IGVsZW1DU1Mub3ZlcmZsb3dZID09ICdzY3JvbGwnKSkge1xuICAgICAgICBpZiAoIWVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0IHx8IGVsZW0gPT09IGRvY3VtZW50LmJvZHkpIHJldHVybiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgICAgIGlmIChnb3RTZWxmIHx8IGluY2x1ZGVTZWxmKSByZXR1cm4gZWxlbTtcbiAgICAgICAgZ290U2VsZiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgfSB3aGlsZSAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSk7XG4gIHJldHVybiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG59XG5mdW5jdGlvbiBleHRlbmQoZHN0LCBzcmMpIHtcbiAgaWYgKGRzdCAmJiBzcmMpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gc3JjKSB7XG4gICAgICBpZiAoc3JjLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgZHN0W2tleV0gPSBzcmNba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRzdDtcbn1cbmZ1bmN0aW9uIGlzUmVjdEVxdWFsKHJlY3QxLCByZWN0Mikge1xuICByZXR1cm4gTWF0aC5yb3VuZChyZWN0MS50b3ApID09PSBNYXRoLnJvdW5kKHJlY3QyLnRvcCkgJiYgTWF0aC5yb3VuZChyZWN0MS5sZWZ0KSA9PT0gTWF0aC5yb3VuZChyZWN0Mi5sZWZ0KSAmJiBNYXRoLnJvdW5kKHJlY3QxLmhlaWdodCkgPT09IE1hdGgucm91bmQocmVjdDIuaGVpZ2h0KSAmJiBNYXRoLnJvdW5kKHJlY3QxLndpZHRoKSA9PT0gTWF0aC5yb3VuZChyZWN0Mi53aWR0aCk7XG59XG52YXIgX3Rocm90dGxlVGltZW91dDtcbmZ1bmN0aW9uIHRocm90dGxlKGNhbGxiYWNrLCBtcykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghX3Rocm90dGxlVGltZW91dCkge1xuICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsXG4gICAgICAgIF90aGlzID0gdGhpcztcbiAgICAgIGlmIChhcmdzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjYWxsYmFjay5jYWxsKF90aGlzLCBhcmdzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KF90aGlzLCBhcmdzKTtcbiAgICAgIH1cbiAgICAgIF90aHJvdHRsZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3Rocm90dGxlVGltZW91dCA9IHZvaWQgMDtcbiAgICAgIH0sIG1zKTtcbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiBjYW5jZWxUaHJvdHRsZSgpIHtcbiAgY2xlYXJUaW1lb3V0KF90aHJvdHRsZVRpbWVvdXQpO1xuICBfdGhyb3R0bGVUaW1lb3V0ID0gdm9pZCAwO1xufVxuZnVuY3Rpb24gc2Nyb2xsQnkoZWwsIHgsIHkpIHtcbiAgZWwuc2Nyb2xsTGVmdCArPSB4O1xuICBlbC5zY3JvbGxUb3AgKz0geTtcbn1cbmZ1bmN0aW9uIGNsb25lKGVsKSB7XG4gIHZhciBQb2x5bWVyID0gd2luZG93LlBvbHltZXI7XG4gIHZhciAkID0gd2luZG93LmpRdWVyeSB8fCB3aW5kb3cuWmVwdG87XG4gIGlmIChQb2x5bWVyICYmIFBvbHltZXIuZG9tKSB7XG4gICAgcmV0dXJuIFBvbHltZXIuZG9tKGVsKS5jbG9uZU5vZGUodHJ1ZSk7XG4gIH0gZWxzZSBpZiAoJCkge1xuICAgIHJldHVybiAkKGVsKS5jbG9uZSh0cnVlKVswXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZWwuY2xvbmVOb2RlKHRydWUpO1xuICB9XG59XG5mdW5jdGlvbiBzZXRSZWN0KGVsLCByZWN0KSB7XG4gIGNzcyhlbCwgJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJyk7XG4gIGNzcyhlbCwgJ3RvcCcsIHJlY3QudG9wKTtcbiAgY3NzKGVsLCAnbGVmdCcsIHJlY3QubGVmdCk7XG4gIGNzcyhlbCwgJ3dpZHRoJywgcmVjdC53aWR0aCk7XG4gIGNzcyhlbCwgJ2hlaWdodCcsIHJlY3QuaGVpZ2h0KTtcbn1cbmZ1bmN0aW9uIHVuc2V0UmVjdChlbCkge1xuICBjc3MoZWwsICdwb3NpdGlvbicsICcnKTtcbiAgY3NzKGVsLCAndG9wJywgJycpO1xuICBjc3MoZWwsICdsZWZ0JywgJycpO1xuICBjc3MoZWwsICd3aWR0aCcsICcnKTtcbiAgY3NzKGVsLCAnaGVpZ2h0JywgJycpO1xufVxuZnVuY3Rpb24gZ2V0Q2hpbGRDb250YWluaW5nUmVjdEZyb21FbGVtZW50KGNvbnRhaW5lciwgb3B0aW9ucywgZ2hvc3RFbCkge1xuICB2YXIgcmVjdCA9IHt9O1xuICBBcnJheS5mcm9tKGNvbnRhaW5lci5jaGlsZHJlbikuZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICB2YXIgX3JlY3QkbGVmdCwgX3JlY3QkdG9wLCBfcmVjdCRyaWdodCwgX3JlY3QkYm90dG9tO1xuICAgIGlmICghY2xvc2VzdChjaGlsZCwgb3B0aW9ucy5kcmFnZ2FibGUsIGNvbnRhaW5lciwgZmFsc2UpIHx8IGNoaWxkLmFuaW1hdGVkIHx8IGNoaWxkID09PSBnaG9zdEVsKSByZXR1cm47XG4gICAgdmFyIGNoaWxkUmVjdCA9IGdldFJlY3QoY2hpbGQpO1xuICAgIHJlY3QubGVmdCA9IE1hdGgubWluKChfcmVjdCRsZWZ0ID0gcmVjdC5sZWZ0KSAhPT0gbnVsbCAmJiBfcmVjdCRsZWZ0ICE9PSB2b2lkIDAgPyBfcmVjdCRsZWZ0IDogSW5maW5pdHksIGNoaWxkUmVjdC5sZWZ0KTtcbiAgICByZWN0LnRvcCA9IE1hdGgubWluKChfcmVjdCR0b3AgPSByZWN0LnRvcCkgIT09IG51bGwgJiYgX3JlY3QkdG9wICE9PSB2b2lkIDAgPyBfcmVjdCR0b3AgOiBJbmZpbml0eSwgY2hpbGRSZWN0LnRvcCk7XG4gICAgcmVjdC5yaWdodCA9IE1hdGgubWF4KChfcmVjdCRyaWdodCA9IHJlY3QucmlnaHQpICE9PSBudWxsICYmIF9yZWN0JHJpZ2h0ICE9PSB2b2lkIDAgPyBfcmVjdCRyaWdodCA6IC1JbmZpbml0eSwgY2hpbGRSZWN0LnJpZ2h0KTtcbiAgICByZWN0LmJvdHRvbSA9IE1hdGgubWF4KChfcmVjdCRib3R0b20gPSByZWN0LmJvdHRvbSkgIT09IG51bGwgJiYgX3JlY3QkYm90dG9tICE9PSB2b2lkIDAgPyBfcmVjdCRib3R0b20gOiAtSW5maW5pdHksIGNoaWxkUmVjdC5ib3R0b20pO1xuICB9KTtcbiAgcmVjdC53aWR0aCA9IHJlY3QucmlnaHQgLSByZWN0LmxlZnQ7XG4gIHJlY3QuaGVpZ2h0ID0gcmVjdC5ib3R0b20gLSByZWN0LnRvcDtcbiAgcmVjdC54ID0gcmVjdC5sZWZ0O1xuICByZWN0LnkgPSByZWN0LnRvcDtcbiAgcmV0dXJuIHJlY3Q7XG59XG52YXIgZXhwYW5kbyA9ICdTb3J0YWJsZScgKyBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcblxuZnVuY3Rpb24gQW5pbWF0aW9uU3RhdGVNYW5hZ2VyKCkge1xuICB2YXIgYW5pbWF0aW9uU3RhdGVzID0gW10sXG4gICAgYW5pbWF0aW9uQ2FsbGJhY2tJZDtcbiAgcmV0dXJuIHtcbiAgICBjYXB0dXJlQW5pbWF0aW9uU3RhdGU6IGZ1bmN0aW9uIGNhcHR1cmVBbmltYXRpb25TdGF0ZSgpIHtcbiAgICAgIGFuaW1hdGlvblN0YXRlcyA9IFtdO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSByZXR1cm47XG4gICAgICB2YXIgY2hpbGRyZW4gPSBbXS5zbGljZS5jYWxsKHRoaXMuZWwuY2hpbGRyZW4pO1xuICAgICAgY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgaWYgKGNzcyhjaGlsZCwgJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8IGNoaWxkID09PSBTb3J0YWJsZS5naG9zdCkgcmV0dXJuO1xuICAgICAgICBhbmltYXRpb25TdGF0ZXMucHVzaCh7XG4gICAgICAgICAgdGFyZ2V0OiBjaGlsZCxcbiAgICAgICAgICByZWN0OiBnZXRSZWN0KGNoaWxkKVxuICAgICAgICB9KTtcbiAgICAgICAgdmFyIGZyb21SZWN0ID0gX29iamVjdFNwcmVhZDIoe30sIGFuaW1hdGlvblN0YXRlc1thbmltYXRpb25TdGF0ZXMubGVuZ3RoIC0gMV0ucmVjdCk7XG5cbiAgICAgICAgLy8gSWYgYW5pbWF0aW5nOiBjb21wZW5zYXRlIGZvciBjdXJyZW50IGFuaW1hdGlvblxuICAgICAgICBpZiAoY2hpbGQudGhpc0FuaW1hdGlvbkR1cmF0aW9uKSB7XG4gICAgICAgICAgdmFyIGNoaWxkTWF0cml4ID0gbWF0cml4KGNoaWxkLCB0cnVlKTtcbiAgICAgICAgICBpZiAoY2hpbGRNYXRyaXgpIHtcbiAgICAgICAgICAgIGZyb21SZWN0LnRvcCAtPSBjaGlsZE1hdHJpeC5mO1xuICAgICAgICAgICAgZnJvbVJlY3QubGVmdCAtPSBjaGlsZE1hdHJpeC5lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjaGlsZC5mcm9tUmVjdCA9IGZyb21SZWN0O1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBhZGRBbmltYXRpb25TdGF0ZTogZnVuY3Rpb24gYWRkQW5pbWF0aW9uU3RhdGUoc3RhdGUpIHtcbiAgICAgIGFuaW1hdGlvblN0YXRlcy5wdXNoKHN0YXRlKTtcbiAgICB9LFxuICAgIHJlbW92ZUFuaW1hdGlvblN0YXRlOiBmdW5jdGlvbiByZW1vdmVBbmltYXRpb25TdGF0ZSh0YXJnZXQpIHtcbiAgICAgIGFuaW1hdGlvblN0YXRlcy5zcGxpY2UoaW5kZXhPZk9iamVjdChhbmltYXRpb25TdGF0ZXMsIHtcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXRcbiAgICAgIH0pLCAxKTtcbiAgICB9LFxuICAgIGFuaW1hdGVBbGw6IGZ1bmN0aW9uIGFuaW1hdGVBbGwoY2FsbGJhY2spIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGFuaW1hdGlvbkNhbGxiYWNrSWQpO1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgYW5pbWF0aW5nID0gZmFsc2UsXG4gICAgICAgIGFuaW1hdGlvblRpbWUgPSAwO1xuICAgICAgYW5pbWF0aW9uU3RhdGVzLmZvckVhY2goZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIHZhciB0aW1lID0gMCxcbiAgICAgICAgICB0YXJnZXQgPSBzdGF0ZS50YXJnZXQsXG4gICAgICAgICAgZnJvbVJlY3QgPSB0YXJnZXQuZnJvbVJlY3QsXG4gICAgICAgICAgdG9SZWN0ID0gZ2V0UmVjdCh0YXJnZXQpLFxuICAgICAgICAgIHByZXZGcm9tUmVjdCA9IHRhcmdldC5wcmV2RnJvbVJlY3QsXG4gICAgICAgICAgcHJldlRvUmVjdCA9IHRhcmdldC5wcmV2VG9SZWN0LFxuICAgICAgICAgIGFuaW1hdGluZ1JlY3QgPSBzdGF0ZS5yZWN0LFxuICAgICAgICAgIHRhcmdldE1hdHJpeCA9IG1hdHJpeCh0YXJnZXQsIHRydWUpO1xuICAgICAgICBpZiAodGFyZ2V0TWF0cml4KSB7XG4gICAgICAgICAgLy8gQ29tcGVuc2F0ZSBmb3IgY3VycmVudCBhbmltYXRpb25cbiAgICAgICAgICB0b1JlY3QudG9wIC09IHRhcmdldE1hdHJpeC5mO1xuICAgICAgICAgIHRvUmVjdC5sZWZ0IC09IHRhcmdldE1hdHJpeC5lO1xuICAgICAgICB9XG4gICAgICAgIHRhcmdldC50b1JlY3QgPSB0b1JlY3Q7XG4gICAgICAgIGlmICh0YXJnZXQudGhpc0FuaW1hdGlvbkR1cmF0aW9uKSB7XG4gICAgICAgICAgLy8gQ291bGQgYWxzbyBjaGVjayBpZiBhbmltYXRpbmdSZWN0IGlzIGJldHdlZW4gZnJvbVJlY3QgYW5kIHRvUmVjdFxuICAgICAgICAgIGlmIChpc1JlY3RFcXVhbChwcmV2RnJvbVJlY3QsIHRvUmVjdCkgJiYgIWlzUmVjdEVxdWFsKGZyb21SZWN0LCB0b1JlY3QpICYmXG4gICAgICAgICAgLy8gTWFrZSBzdXJlIGFuaW1hdGluZ1JlY3QgaXMgb24gbGluZSBiZXR3ZWVuIHRvUmVjdCAmIGZyb21SZWN0XG4gICAgICAgICAgKGFuaW1hdGluZ1JlY3QudG9wIC0gdG9SZWN0LnRvcCkgLyAoYW5pbWF0aW5nUmVjdC5sZWZ0IC0gdG9SZWN0LmxlZnQpID09PSAoZnJvbVJlY3QudG9wIC0gdG9SZWN0LnRvcCkgLyAoZnJvbVJlY3QubGVmdCAtIHRvUmVjdC5sZWZ0KSkge1xuICAgICAgICAgICAgLy8gSWYgcmV0dXJuaW5nIHRvIHNhbWUgcGxhY2UgYXMgc3RhcnRlZCBmcm9tIGFuaW1hdGlvbiBhbmQgb24gc2FtZSBheGlzXG4gICAgICAgICAgICB0aW1lID0gY2FsY3VsYXRlUmVhbFRpbWUoYW5pbWF0aW5nUmVjdCwgcHJldkZyb21SZWN0LCBwcmV2VG9SZWN0LCBfdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBmcm9tUmVjdCAhPSB0b1JlY3Q6IGFuaW1hdGVcbiAgICAgICAgaWYgKCFpc1JlY3RFcXVhbCh0b1JlY3QsIGZyb21SZWN0KSkge1xuICAgICAgICAgIHRhcmdldC5wcmV2RnJvbVJlY3QgPSBmcm9tUmVjdDtcbiAgICAgICAgICB0YXJnZXQucHJldlRvUmVjdCA9IHRvUmVjdDtcbiAgICAgICAgICBpZiAoIXRpbWUpIHtcbiAgICAgICAgICAgIHRpbWUgPSBfdGhpcy5vcHRpb25zLmFuaW1hdGlvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgX3RoaXMuYW5pbWF0ZSh0YXJnZXQsIGFuaW1hdGluZ1JlY3QsIHRvUmVjdCwgdGltZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbWUpIHtcbiAgICAgICAgICBhbmltYXRpbmcgPSB0cnVlO1xuICAgICAgICAgIGFuaW1hdGlvblRpbWUgPSBNYXRoLm1heChhbmltYXRpb25UaW1lLCB0aW1lKTtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGFyZ2V0LmFuaW1hdGlvblJlc2V0VGltZXIpO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRpb25SZXNldFRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0YXJnZXQuYW5pbWF0aW9uVGltZSA9IDA7XG4gICAgICAgICAgICB0YXJnZXQucHJldkZyb21SZWN0ID0gbnVsbDtcbiAgICAgICAgICAgIHRhcmdldC5mcm9tUmVjdCA9IG51bGw7XG4gICAgICAgICAgICB0YXJnZXQucHJldlRvUmVjdCA9IG51bGw7XG4gICAgICAgICAgICB0YXJnZXQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgICB9LCB0aW1lKTtcbiAgICAgICAgICB0YXJnZXQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gdGltZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjbGVhclRpbWVvdXQoYW5pbWF0aW9uQ2FsbGJhY2tJZCk7XG4gICAgICBpZiAoIWFuaW1hdGluZykge1xuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYW5pbWF0aW9uQ2FsbGJhY2tJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgPT09ICdmdW5jdGlvbicpIGNhbGxiYWNrKCk7XG4gICAgICAgIH0sIGFuaW1hdGlvblRpbWUpO1xuICAgICAgfVxuICAgICAgYW5pbWF0aW9uU3RhdGVzID0gW107XG4gICAgfSxcbiAgICBhbmltYXRlOiBmdW5jdGlvbiBhbmltYXRlKHRhcmdldCwgY3VycmVudFJlY3QsIHRvUmVjdCwgZHVyYXRpb24pIHtcbiAgICAgIGlmIChkdXJhdGlvbikge1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNpdGlvbicsICcnKTtcbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zZm9ybScsICcnKTtcbiAgICAgICAgdmFyIGVsTWF0cml4ID0gbWF0cml4KHRoaXMuZWwpLFxuICAgICAgICAgIHNjYWxlWCA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmEsXG4gICAgICAgICAgc2NhbGVZID0gZWxNYXRyaXggJiYgZWxNYXRyaXguZCxcbiAgICAgICAgICB0cmFuc2xhdGVYID0gKGN1cnJlbnRSZWN0LmxlZnQgLSB0b1JlY3QubGVmdCkgLyAoc2NhbGVYIHx8IDEpLFxuICAgICAgICAgIHRyYW5zbGF0ZVkgPSAoY3VycmVudFJlY3QudG9wIC0gdG9SZWN0LnRvcCkgLyAoc2NhbGVZIHx8IDEpO1xuICAgICAgICB0YXJnZXQuYW5pbWF0aW5nWCA9ICEhdHJhbnNsYXRlWDtcbiAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1kgPSAhIXRyYW5zbGF0ZVk7XG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlM2QoJyArIHRyYW5zbGF0ZVggKyAncHgsJyArIHRyYW5zbGF0ZVkgKyAncHgsMCknKTtcbiAgICAgICAgdGhpcy5mb3JSZXBhaW50RHVtbXkgPSByZXBhaW50KHRhcmdldCk7IC8vIHJlcGFpbnRcblxuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNpdGlvbicsICd0cmFuc2Zvcm0gJyArIGR1cmF0aW9uICsgJ21zJyArICh0aGlzLm9wdGlvbnMuZWFzaW5nID8gJyAnICsgdGhpcy5vcHRpb25zLmVhc2luZyA6ICcnKSk7XG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlM2QoMCwwLDApJyk7XG4gICAgICAgIHR5cGVvZiB0YXJnZXQuYW5pbWF0ZWQgPT09ICdudW1iZXInICYmIGNsZWFyVGltZW91dCh0YXJnZXQuYW5pbWF0ZWQpO1xuICAgICAgICB0YXJnZXQuYW5pbWF0ZWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNpdGlvbicsICcnKTtcbiAgICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJycpO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRlZCA9IGZhbHNlO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRpbmdYID0gZmFsc2U7XG4gICAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1kgPSBmYWxzZTtcbiAgICAgICAgfSwgZHVyYXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIHJlcGFpbnQodGFyZ2V0KSB7XG4gIHJldHVybiB0YXJnZXQub2Zmc2V0V2lkdGg7XG59XG5mdW5jdGlvbiBjYWxjdWxhdGVSZWFsVGltZShhbmltYXRpbmdSZWN0LCBmcm9tUmVjdCwgdG9SZWN0LCBvcHRpb25zKSB7XG4gIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coZnJvbVJlY3QudG9wIC0gYW5pbWF0aW5nUmVjdC50b3AsIDIpICsgTWF0aC5wb3coZnJvbVJlY3QubGVmdCAtIGFuaW1hdGluZ1JlY3QubGVmdCwgMikpIC8gTWF0aC5zcXJ0KE1hdGgucG93KGZyb21SZWN0LnRvcCAtIHRvUmVjdC50b3AsIDIpICsgTWF0aC5wb3coZnJvbVJlY3QubGVmdCAtIHRvUmVjdC5sZWZ0LCAyKSkgKiBvcHRpb25zLmFuaW1hdGlvbjtcbn1cblxudmFyIHBsdWdpbnMgPSBbXTtcbnZhciBkZWZhdWx0cyA9IHtcbiAgaW5pdGlhbGl6ZUJ5RGVmYXVsdDogdHJ1ZVxufTtcbnZhciBQbHVnaW5NYW5hZ2VyID0ge1xuICBtb3VudDogZnVuY3Rpb24gbW91bnQocGx1Z2luKSB7XG4gICAgLy8gU2V0IGRlZmF1bHQgc3RhdGljIHByb3BlcnRpZXNcbiAgICBmb3IgKHZhciBvcHRpb24gaW4gZGVmYXVsdHMpIHtcbiAgICAgIGlmIChkZWZhdWx0cy5oYXNPd25Qcm9wZXJ0eShvcHRpb24pICYmICEob3B0aW9uIGluIHBsdWdpbikpIHtcbiAgICAgICAgcGx1Z2luW29wdGlvbl0gPSBkZWZhdWx0c1tvcHRpb25dO1xuICAgICAgfVxuICAgIH1cbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGlmIChwLnBsdWdpbk5hbWUgPT09IHBsdWdpbi5wbHVnaW5OYW1lKSB7XG4gICAgICAgIHRocm93IFwiU29ydGFibGU6IENhbm5vdCBtb3VudCBwbHVnaW4gXCIuY29uY2F0KHBsdWdpbi5wbHVnaW5OYW1lLCBcIiBtb3JlIHRoYW4gb25jZVwiKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBwbHVnaW5zLnB1c2gocGx1Z2luKTtcbiAgfSxcbiAgcGx1Z2luRXZlbnQ6IGZ1bmN0aW9uIHBsdWdpbkV2ZW50KGV2ZW50TmFtZSwgc29ydGFibGUsIGV2dCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgdGhpcy5ldmVudENhbmNlbGVkID0gZmFsc2U7XG4gICAgZXZ0LmNhbmNlbCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIF90aGlzLmV2ZW50Q2FuY2VsZWQgPSB0cnVlO1xuICAgIH07XG4gICAgdmFyIGV2ZW50TmFtZUdsb2JhbCA9IGV2ZW50TmFtZSArICdHbG9iYWwnO1xuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICBpZiAoIXNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSkgcmV0dXJuO1xuICAgICAgLy8gRmlyZSBnbG9iYWwgZXZlbnRzIGlmIGl0IGV4aXN0cyBpbiB0aGlzIHNvcnRhYmxlXG4gICAgICBpZiAoc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdW2V2ZW50TmFtZUdsb2JhbF0pIHtcbiAgICAgICAgc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdW2V2ZW50TmFtZUdsb2JhbF0oX29iamVjdFNwcmVhZDIoe1xuICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZVxuICAgICAgICB9LCBldnQpKTtcbiAgICAgIH1cblxuICAgICAgLy8gT25seSBmaXJlIHBsdWdpbiBldmVudCBpZiBwbHVnaW4gaXMgZW5hYmxlZCBpbiB0aGlzIHNvcnRhYmxlLFxuICAgICAgLy8gYW5kIHBsdWdpbiBoYXMgZXZlbnQgZGVmaW5lZFxuICAgICAgaWYgKHNvcnRhYmxlLm9wdGlvbnNbcGx1Z2luLnBsdWdpbk5hbWVdICYmIHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVdKSB7XG4gICAgICAgIHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVdKF9vYmplY3RTcHJlYWQyKHtcbiAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGVcbiAgICAgICAgfSwgZXZ0KSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG4gIGluaXRpYWxpemVQbHVnaW5zOiBmdW5jdGlvbiBpbml0aWFsaXplUGx1Z2lucyhzb3J0YWJsZSwgZWwsIGRlZmF1bHRzLCBvcHRpb25zKSB7XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIHZhciBwbHVnaW5OYW1lID0gcGx1Z2luLnBsdWdpbk5hbWU7XG4gICAgICBpZiAoIXNvcnRhYmxlLm9wdGlvbnNbcGx1Z2luTmFtZV0gJiYgIXBsdWdpbi5pbml0aWFsaXplQnlEZWZhdWx0KSByZXR1cm47XG4gICAgICB2YXIgaW5pdGlhbGl6ZWQgPSBuZXcgcGx1Z2luKHNvcnRhYmxlLCBlbCwgc29ydGFibGUub3B0aW9ucyk7XG4gICAgICBpbml0aWFsaXplZC5zb3J0YWJsZSA9IHNvcnRhYmxlO1xuICAgICAgaW5pdGlhbGl6ZWQub3B0aW9ucyA9IHNvcnRhYmxlLm9wdGlvbnM7XG4gICAgICBzb3J0YWJsZVtwbHVnaW5OYW1lXSA9IGluaXRpYWxpemVkO1xuXG4gICAgICAvLyBBZGQgZGVmYXVsdCBvcHRpb25zIGZyb20gcGx1Z2luXG4gICAgICBfZXh0ZW5kcyhkZWZhdWx0cywgaW5pdGlhbGl6ZWQuZGVmYXVsdHMpO1xuICAgIH0pO1xuICAgIGZvciAodmFyIG9wdGlvbiBpbiBzb3J0YWJsZS5vcHRpb25zKSB7XG4gICAgICBpZiAoIXNvcnRhYmxlLm9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0aW9uKSkgY29udGludWU7XG4gICAgICB2YXIgbW9kaWZpZWQgPSB0aGlzLm1vZGlmeU9wdGlvbihzb3J0YWJsZSwgb3B0aW9uLCBzb3J0YWJsZS5vcHRpb25zW29wdGlvbl0pO1xuICAgICAgaWYgKHR5cGVvZiBtb2RpZmllZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgc29ydGFibGUub3B0aW9uc1tvcHRpb25dID0gbW9kaWZpZWQ7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBnZXRFdmVudFByb3BlcnRpZXM6IGZ1bmN0aW9uIGdldEV2ZW50UHJvcGVydGllcyhuYW1lLCBzb3J0YWJsZSkge1xuICAgIHZhciBldmVudFByb3BlcnRpZXMgPSB7fTtcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgaWYgKHR5cGVvZiBwbHVnaW4uZXZlbnRQcm9wZXJ0aWVzICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XG4gICAgICBfZXh0ZW5kcyhldmVudFByb3BlcnRpZXMsIHBsdWdpbi5ldmVudFByb3BlcnRpZXMuY2FsbChzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0sIG5hbWUpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gZXZlbnRQcm9wZXJ0aWVzO1xuICB9LFxuICBtb2RpZnlPcHRpb246IGZ1bmN0aW9uIG1vZGlmeU9wdGlvbihzb3J0YWJsZSwgbmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgbW9kaWZpZWRWYWx1ZTtcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgLy8gUGx1Z2luIG11c3QgZXhpc3Qgb24gdGhlIFNvcnRhYmxlXG4gICAgICBpZiAoIXNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSkgcmV0dXJuO1xuXG4gICAgICAvLyBJZiBzdGF0aWMgb3B0aW9uIGxpc3RlbmVyIGV4aXN0cyBmb3IgdGhpcyBvcHRpb24sIGNhbGwgaW4gdGhlIGNvbnRleHQgb2YgdGhlIFNvcnRhYmxlJ3MgaW5zdGFuY2Ugb2YgdGhpcyBwbHVnaW5cbiAgICAgIGlmIChwbHVnaW4ub3B0aW9uTGlzdGVuZXJzICYmIHR5cGVvZiBwbHVnaW4ub3B0aW9uTGlzdGVuZXJzW25hbWVdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG1vZGlmaWVkVmFsdWUgPSBwbHVnaW4ub3B0aW9uTGlzdGVuZXJzW25hbWVdLmNhbGwoc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG1vZGlmaWVkVmFsdWU7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQoX3JlZikge1xuICB2YXIgc29ydGFibGUgPSBfcmVmLnNvcnRhYmxlLFxuICAgIHJvb3RFbCA9IF9yZWYucm9vdEVsLFxuICAgIG5hbWUgPSBfcmVmLm5hbWUsXG4gICAgdGFyZ2V0RWwgPSBfcmVmLnRhcmdldEVsLFxuICAgIGNsb25lRWwgPSBfcmVmLmNsb25lRWwsXG4gICAgdG9FbCA9IF9yZWYudG9FbCxcbiAgICBmcm9tRWwgPSBfcmVmLmZyb21FbCxcbiAgICBvbGRJbmRleCA9IF9yZWYub2xkSW5kZXgsXG4gICAgbmV3SW5kZXggPSBfcmVmLm5ld0luZGV4LFxuICAgIG9sZERyYWdnYWJsZUluZGV4ID0gX3JlZi5vbGREcmFnZ2FibGVJbmRleCxcbiAgICBuZXdEcmFnZ2FibGVJbmRleCA9IF9yZWYubmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgb3JpZ2luYWxFdmVudCA9IF9yZWYub3JpZ2luYWxFdmVudCxcbiAgICBwdXRTb3J0YWJsZSA9IF9yZWYucHV0U29ydGFibGUsXG4gICAgZXh0cmFFdmVudFByb3BlcnRpZXMgPSBfcmVmLmV4dHJhRXZlbnRQcm9wZXJ0aWVzO1xuICBzb3J0YWJsZSA9IHNvcnRhYmxlIHx8IHJvb3RFbCAmJiByb290RWxbZXhwYW5kb107XG4gIGlmICghc29ydGFibGUpIHJldHVybjtcbiAgdmFyIGV2dCxcbiAgICBvcHRpb25zID0gc29ydGFibGUub3B0aW9ucyxcbiAgICBvbk5hbWUgPSAnb24nICsgbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyKDEpO1xuICAvLyBTdXBwb3J0IGZvciBuZXcgQ3VzdG9tRXZlbnQgZmVhdHVyZVxuICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmICFJRTExT3JMZXNzICYmICFFZGdlKSB7XG4gICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KG5hbWUsIHtcbiAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZ0LmluaXRFdmVudChuYW1lLCB0cnVlLCB0cnVlKTtcbiAgfVxuICBldnQudG8gPSB0b0VsIHx8IHJvb3RFbDtcbiAgZXZ0LmZyb20gPSBmcm9tRWwgfHwgcm9vdEVsO1xuICBldnQuaXRlbSA9IHRhcmdldEVsIHx8IHJvb3RFbDtcbiAgZXZ0LmNsb25lID0gY2xvbmVFbDtcbiAgZXZ0Lm9sZEluZGV4ID0gb2xkSW5kZXg7XG4gIGV2dC5uZXdJbmRleCA9IG5ld0luZGV4O1xuICBldnQub2xkRHJhZ2dhYmxlSW5kZXggPSBvbGREcmFnZ2FibGVJbmRleDtcbiAgZXZ0Lm5ld0RyYWdnYWJsZUluZGV4ID0gbmV3RHJhZ2dhYmxlSW5kZXg7XG4gIGV2dC5vcmlnaW5hbEV2ZW50ID0gb3JpZ2luYWxFdmVudDtcbiAgZXZ0LnB1bGxNb2RlID0gcHV0U29ydGFibGUgPyBwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSA6IHVuZGVmaW5lZDtcbiAgdmFyIGFsbEV2ZW50UHJvcGVydGllcyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBleHRyYUV2ZW50UHJvcGVydGllcyksIFBsdWdpbk1hbmFnZXIuZ2V0RXZlbnRQcm9wZXJ0aWVzKG5hbWUsIHNvcnRhYmxlKSk7XG4gIGZvciAodmFyIG9wdGlvbiBpbiBhbGxFdmVudFByb3BlcnRpZXMpIHtcbiAgICBldnRbb3B0aW9uXSA9IGFsbEV2ZW50UHJvcGVydGllc1tvcHRpb25dO1xuICB9XG4gIGlmIChyb290RWwpIHtcbiAgICByb290RWwuZGlzcGF0Y2hFdmVudChldnQpO1xuICB9XG4gIGlmIChvcHRpb25zW29uTmFtZV0pIHtcbiAgICBvcHRpb25zW29uTmFtZV0uY2FsbChzb3J0YWJsZSwgZXZ0KTtcbiAgfVxufVxuXG52YXIgX2V4Y2x1ZGVkID0gW1wiZXZ0XCJdO1xudmFyIHBsdWdpbkV2ZW50ID0gZnVuY3Rpb24gcGx1Z2luRXZlbnQoZXZlbnROYW1lLCBzb3J0YWJsZSkge1xuICB2YXIgX3JlZiA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDoge30sXG4gICAgb3JpZ2luYWxFdmVudCA9IF9yZWYuZXZ0LFxuICAgIGRhdGEgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcbiAgUGx1Z2luTWFuYWdlci5wbHVnaW5FdmVudC5iaW5kKFNvcnRhYmxlKShldmVudE5hbWUsIHNvcnRhYmxlLCBfb2JqZWN0U3ByZWFkMih7XG4gICAgZHJhZ0VsOiBkcmFnRWwsXG4gICAgcGFyZW50RWw6IHBhcmVudEVsLFxuICAgIGdob3N0RWw6IGdob3N0RWwsXG4gICAgcm9vdEVsOiByb290RWwsXG4gICAgbmV4dEVsOiBuZXh0RWwsXG4gICAgbGFzdERvd25FbDogbGFzdERvd25FbCxcbiAgICBjbG9uZUVsOiBjbG9uZUVsLFxuICAgIGNsb25lSGlkZGVuOiBjbG9uZUhpZGRlbixcbiAgICBkcmFnU3RhcnRlZDogbW92ZWQsXG4gICAgcHV0U29ydGFibGU6IHB1dFNvcnRhYmxlLFxuICAgIGFjdGl2ZVNvcnRhYmxlOiBTb3J0YWJsZS5hY3RpdmUsXG4gICAgb3JpZ2luYWxFdmVudDogb3JpZ2luYWxFdmVudCxcbiAgICBvbGRJbmRleDogb2xkSW5kZXgsXG4gICAgb2xkRHJhZ2dhYmxlSW5kZXg6IG9sZERyYWdnYWJsZUluZGV4LFxuICAgIG5ld0luZGV4OiBuZXdJbmRleCxcbiAgICBuZXdEcmFnZ2FibGVJbmRleDogbmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgaGlkZUdob3N0Rm9yVGFyZ2V0OiBfaGlkZUdob3N0Rm9yVGFyZ2V0LFxuICAgIHVuaGlkZUdob3N0Rm9yVGFyZ2V0OiBfdW5oaWRlR2hvc3RGb3JUYXJnZXQsXG4gICAgY2xvbmVOb3dIaWRkZW46IGZ1bmN0aW9uIGNsb25lTm93SGlkZGVuKCkge1xuICAgICAgY2xvbmVIaWRkZW4gPSB0cnVlO1xuICAgIH0sXG4gICAgY2xvbmVOb3dTaG93bjogZnVuY3Rpb24gY2xvbmVOb3dTaG93bigpIHtcbiAgICAgIGNsb25lSGlkZGVuID0gZmFsc2U7XG4gICAgfSxcbiAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQ6IGZ1bmN0aW9uIGRpc3BhdGNoU29ydGFibGVFdmVudChuYW1lKSB7XG4gICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgb3JpZ2luYWxFdmVudDogb3JpZ2luYWxFdmVudFxuICAgICAgfSk7XG4gICAgfVxuICB9LCBkYXRhKSk7XG59O1xuZnVuY3Rpb24gX2Rpc3BhdGNoRXZlbnQoaW5mbykge1xuICBkaXNwYXRjaEV2ZW50KF9vYmplY3RTcHJlYWQyKHtcbiAgICBwdXRTb3J0YWJsZTogcHV0U29ydGFibGUsXG4gICAgY2xvbmVFbDogY2xvbmVFbCxcbiAgICB0YXJnZXRFbDogZHJhZ0VsLFxuICAgIHJvb3RFbDogcm9vdEVsLFxuICAgIG9sZEluZGV4OiBvbGRJbmRleCxcbiAgICBvbGREcmFnZ2FibGVJbmRleDogb2xkRHJhZ2dhYmxlSW5kZXgsXG4gICAgbmV3SW5kZXg6IG5ld0luZGV4LFxuICAgIG5ld0RyYWdnYWJsZUluZGV4OiBuZXdEcmFnZ2FibGVJbmRleFxuICB9LCBpbmZvKSk7XG59XG52YXIgZHJhZ0VsLFxuICBwYXJlbnRFbCxcbiAgZ2hvc3RFbCxcbiAgcm9vdEVsLFxuICBuZXh0RWwsXG4gIGxhc3REb3duRWwsXG4gIGNsb25lRWwsXG4gIGNsb25lSGlkZGVuLFxuICBvbGRJbmRleCxcbiAgbmV3SW5kZXgsXG4gIG9sZERyYWdnYWJsZUluZGV4LFxuICBuZXdEcmFnZ2FibGVJbmRleCxcbiAgYWN0aXZlR3JvdXAsXG4gIHB1dFNvcnRhYmxlLFxuICBhd2FpdGluZ0RyYWdTdGFydGVkID0gZmFsc2UsXG4gIGlnbm9yZU5leHRDbGljayA9IGZhbHNlLFxuICBzb3J0YWJsZXMgPSBbXSxcbiAgdGFwRXZ0LFxuICB0b3VjaEV2dCxcbiAgbGFzdER4LFxuICBsYXN0RHksXG4gIHRhcERpc3RhbmNlTGVmdCxcbiAgdGFwRGlzdGFuY2VUb3AsXG4gIG1vdmVkLFxuICBsYXN0VGFyZ2V0LFxuICBsYXN0RGlyZWN0aW9uLFxuICBwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggPSBmYWxzZSxcbiAgaXNDaXJjdW1zdGFudGlhbEludmVydCA9IGZhbHNlLFxuICB0YXJnZXRNb3ZlRGlzdGFuY2UsXG4gIC8vIEZvciBwb3NpdGlvbmluZyBnaG9zdCBhYnNvbHV0ZWx5XG4gIGdob3N0UmVsYXRpdmVQYXJlbnQsXG4gIGdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsID0gW10sXG4gIC8vIChsZWZ0LCB0b3ApXG5cbiAgX3NpbGVudCA9IGZhbHNlLFxuICBzYXZlZElucHV0Q2hlY2tlZCA9IFtdO1xuXG4vKiogQGNvbnN0ICovXG52YXIgZG9jdW1lbnRFeGlzdHMgPSB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnLFxuICBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSA9IElPUyxcbiAgQ1NTRmxvYXRQcm9wZXJ0eSA9IEVkZ2UgfHwgSUUxMU9yTGVzcyA/ICdjc3NGbG9hdCcgOiAnZmxvYXQnLFxuICAvLyBUaGlzIHdpbGwgbm90IHBhc3MgZm9yIElFOSwgYmVjYXVzZSBJRTkgRG5EIG9ubHkgd29ya3Mgb24gYW5jaG9yc1xuICBzdXBwb3J0RHJhZ2dhYmxlID0gZG9jdW1lbnRFeGlzdHMgJiYgIUNocm9tZUZvckFuZHJvaWQgJiYgIUlPUyAmJiAnZHJhZ2dhYmxlJyBpbiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxcbiAgc3VwcG9ydENzc1BvaW50ZXJFdmVudHMgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCFkb2N1bWVudEV4aXN0cykgcmV0dXJuO1xuICAgIC8vIGZhbHNlIHdoZW4gPD0gSUUxMVxuICAgIGlmIChJRTExT3JMZXNzKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3gnKTtcbiAgICBlbC5zdHlsZS5jc3NUZXh0ID0gJ3BvaW50ZXItZXZlbnRzOmF1dG8nO1xuICAgIHJldHVybiBlbC5zdHlsZS5wb2ludGVyRXZlbnRzID09PSAnYXV0byc7XG4gIH0oKSxcbiAgX2RldGVjdERpcmVjdGlvbiA9IGZ1bmN0aW9uIF9kZXRlY3REaXJlY3Rpb24oZWwsIG9wdGlvbnMpIHtcbiAgICB2YXIgZWxDU1MgPSBjc3MoZWwpLFxuICAgICAgZWxXaWR0aCA9IHBhcnNlSW50KGVsQ1NTLndpZHRoKSAtIHBhcnNlSW50KGVsQ1NTLnBhZGRpbmdMZWZ0KSAtIHBhcnNlSW50KGVsQ1NTLnBhZGRpbmdSaWdodCkgLSBwYXJzZUludChlbENTUy5ib3JkZXJMZWZ0V2lkdGgpIC0gcGFyc2VJbnQoZWxDU1MuYm9yZGVyUmlnaHRXaWR0aCksXG4gICAgICBjaGlsZDEgPSBnZXRDaGlsZChlbCwgMCwgb3B0aW9ucyksXG4gICAgICBjaGlsZDIgPSBnZXRDaGlsZChlbCwgMSwgb3B0aW9ucyksXG4gICAgICBmaXJzdENoaWxkQ1NTID0gY2hpbGQxICYmIGNzcyhjaGlsZDEpLFxuICAgICAgc2Vjb25kQ2hpbGRDU1MgPSBjaGlsZDIgJiYgY3NzKGNoaWxkMiksXG4gICAgICBmaXJzdENoaWxkV2lkdGggPSBmaXJzdENoaWxkQ1NTICYmIHBhcnNlSW50KGZpcnN0Q2hpbGRDU1MubWFyZ2luTGVmdCkgKyBwYXJzZUludChmaXJzdENoaWxkQ1NTLm1hcmdpblJpZ2h0KSArIGdldFJlY3QoY2hpbGQxKS53aWR0aCxcbiAgICAgIHNlY29uZENoaWxkV2lkdGggPSBzZWNvbmRDaGlsZENTUyAmJiBwYXJzZUludChzZWNvbmRDaGlsZENTUy5tYXJnaW5MZWZ0KSArIHBhcnNlSW50KHNlY29uZENoaWxkQ1NTLm1hcmdpblJpZ2h0KSArIGdldFJlY3QoY2hpbGQyKS53aWR0aDtcbiAgICBpZiAoZWxDU1MuZGlzcGxheSA9PT0gJ2ZsZXgnKSB7XG4gICAgICByZXR1cm4gZWxDU1MuZmxleERpcmVjdGlvbiA9PT0gJ2NvbHVtbicgfHwgZWxDU1MuZmxleERpcmVjdGlvbiA9PT0gJ2NvbHVtbi1yZXZlcnNlJyA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gICAgfVxuICAgIGlmIChlbENTUy5kaXNwbGF5ID09PSAnZ3JpZCcpIHtcbiAgICAgIHJldHVybiBlbENTUy5ncmlkVGVtcGxhdGVDb2x1bW5zLnNwbGl0KCcgJykubGVuZ3RoIDw9IDEgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgIH1cbiAgICBpZiAoY2hpbGQxICYmIGZpcnN0Q2hpbGRDU1NbXCJmbG9hdFwiXSAmJiBmaXJzdENoaWxkQ1NTW1wiZmxvYXRcIl0gIT09ICdub25lJykge1xuICAgICAgdmFyIHRvdWNoaW5nU2lkZUNoaWxkMiA9IGZpcnN0Q2hpbGRDU1NbXCJmbG9hdFwiXSA9PT0gJ2xlZnQnID8gJ2xlZnQnIDogJ3JpZ2h0JztcbiAgICAgIHJldHVybiBjaGlsZDIgJiYgKHNlY29uZENoaWxkQ1NTLmNsZWFyID09PSAnYm90aCcgfHwgc2Vjb25kQ2hpbGRDU1MuY2xlYXIgPT09IHRvdWNoaW5nU2lkZUNoaWxkMikgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgIH1cbiAgICByZXR1cm4gY2hpbGQxICYmIChmaXJzdENoaWxkQ1NTLmRpc3BsYXkgPT09ICdibG9jaycgfHwgZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSAnZmxleCcgfHwgZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSAndGFibGUnIHx8IGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ2dyaWQnIHx8IGZpcnN0Q2hpbGRXaWR0aCA+PSBlbFdpZHRoICYmIGVsQ1NTW0NTU0Zsb2F0UHJvcGVydHldID09PSAnbm9uZScgfHwgY2hpbGQyICYmIGVsQ1NTW0NTU0Zsb2F0UHJvcGVydHldID09PSAnbm9uZScgJiYgZmlyc3RDaGlsZFdpZHRoICsgc2Vjb25kQ2hpbGRXaWR0aCA+IGVsV2lkdGgpID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgfSxcbiAgX2RyYWdFbEluUm93Q29sdW1uID0gZnVuY3Rpb24gX2RyYWdFbEluUm93Q29sdW1uKGRyYWdSZWN0LCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCkge1xuICAgIHZhciBkcmFnRWxTMU9wcCA9IHZlcnRpY2FsID8gZHJhZ1JlY3QubGVmdCA6IGRyYWdSZWN0LnRvcCxcbiAgICAgIGRyYWdFbFMyT3BwID0gdmVydGljYWwgPyBkcmFnUmVjdC5yaWdodCA6IGRyYWdSZWN0LmJvdHRvbSxcbiAgICAgIGRyYWdFbE9wcExlbmd0aCA9IHZlcnRpY2FsID8gZHJhZ1JlY3Qud2lkdGggOiBkcmFnUmVjdC5oZWlnaHQsXG4gICAgICB0YXJnZXRTMU9wcCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5sZWZ0IDogdGFyZ2V0UmVjdC50b3AsXG4gICAgICB0YXJnZXRTMk9wcCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5yaWdodCA6IHRhcmdldFJlY3QuYm90dG9tLFxuICAgICAgdGFyZ2V0T3BwTGVuZ3RoID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LndpZHRoIDogdGFyZ2V0UmVjdC5oZWlnaHQ7XG4gICAgcmV0dXJuIGRyYWdFbFMxT3BwID09PSB0YXJnZXRTMU9wcCB8fCBkcmFnRWxTMk9wcCA9PT0gdGFyZ2V0UzJPcHAgfHwgZHJhZ0VsUzFPcHAgKyBkcmFnRWxPcHBMZW5ndGggLyAyID09PSB0YXJnZXRTMU9wcCArIHRhcmdldE9wcExlbmd0aCAvIDI7XG4gIH0sXG4gIC8qKlxyXG4gICAqIERldGVjdHMgZmlyc3QgbmVhcmVzdCBlbXB0eSBzb3J0YWJsZSB0byBYIGFuZCBZIHBvc2l0aW9uIHVzaW5nIGVtcHR5SW5zZXJ0VGhyZXNob2xkLlxyXG4gICAqIEBwYXJhbSAge051bWJlcn0geCAgICAgIFggcG9zaXRpb25cclxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHkgICAgICBZIHBvc2l0aW9uXHJcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR9ICAgRWxlbWVudCBvZiB0aGUgZmlyc3QgZm91bmQgbmVhcmVzdCBTb3J0YWJsZVxyXG4gICAqL1xuICBfZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUgPSBmdW5jdGlvbiBfZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUoeCwgeSkge1xuICAgIHZhciByZXQ7XG4gICAgc29ydGFibGVzLnNvbWUoZnVuY3Rpb24gKHNvcnRhYmxlKSB7XG4gICAgICB2YXIgdGhyZXNob2xkID0gc29ydGFibGVbZXhwYW5kb10ub3B0aW9ucy5lbXB0eUluc2VydFRocmVzaG9sZDtcbiAgICAgIGlmICghdGhyZXNob2xkIHx8IGxhc3RDaGlsZChzb3J0YWJsZSkpIHJldHVybjtcbiAgICAgIHZhciByZWN0ID0gZ2V0UmVjdChzb3J0YWJsZSksXG4gICAgICAgIGluc2lkZUhvcml6b250YWxseSA9IHggPj0gcmVjdC5sZWZ0IC0gdGhyZXNob2xkICYmIHggPD0gcmVjdC5yaWdodCArIHRocmVzaG9sZCxcbiAgICAgICAgaW5zaWRlVmVydGljYWxseSA9IHkgPj0gcmVjdC50b3AgLSB0aHJlc2hvbGQgJiYgeSA8PSByZWN0LmJvdHRvbSArIHRocmVzaG9sZDtcbiAgICAgIGlmIChpbnNpZGVIb3Jpem9udGFsbHkgJiYgaW5zaWRlVmVydGljYWxseSkge1xuICAgICAgICByZXR1cm4gcmV0ID0gc29ydGFibGU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfSxcbiAgX3ByZXBhcmVHcm91cCA9IGZ1bmN0aW9uIF9wcmVwYXJlR3JvdXAob3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIHRvRm4odmFsdWUsIHB1bGwpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAodG8sIGZyb20sIGRyYWdFbCwgZXZ0KSB7XG4gICAgICAgIHZhciBzYW1lR3JvdXAgPSB0by5vcHRpb25zLmdyb3VwLm5hbWUgJiYgZnJvbS5vcHRpb25zLmdyb3VwLm5hbWUgJiYgdG8ub3B0aW9ucy5ncm91cC5uYW1lID09PSBmcm9tLm9wdGlvbnMuZ3JvdXAubmFtZTtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgKHB1bGwgfHwgc2FtZUdyb3VwKSkge1xuICAgICAgICAgIC8vIERlZmF1bHQgcHVsbCB2YWx1ZVxuICAgICAgICAgIC8vIERlZmF1bHQgcHVsbCBhbmQgcHV0IHZhbHVlIGlmIHNhbWUgZ3JvdXBcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIGlmIChwdWxsICYmIHZhbHVlID09PSAnY2xvbmUnKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiB0b0ZuKHZhbHVlKHRvLCBmcm9tLCBkcmFnRWwsIGV2dCksIHB1bGwpKHRvLCBmcm9tLCBkcmFnRWwsIGV2dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIG90aGVyR3JvdXAgPSAocHVsbCA/IHRvIDogZnJvbSkub3B0aW9ucy5ncm91cC5uYW1lO1xuICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlID09PSBvdGhlckdyb3VwIHx8IHZhbHVlLmpvaW4gJiYgdmFsdWUuaW5kZXhPZihvdGhlckdyb3VwKSA+IC0xO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICB2YXIgZ3JvdXAgPSB7fTtcbiAgICB2YXIgb3JpZ2luYWxHcm91cCA9IG9wdGlvbnMuZ3JvdXA7XG4gICAgaWYgKCFvcmlnaW5hbEdyb3VwIHx8IF90eXBlb2Yob3JpZ2luYWxHcm91cCkgIT0gJ29iamVjdCcpIHtcbiAgICAgIG9yaWdpbmFsR3JvdXAgPSB7XG4gICAgICAgIG5hbWU6IG9yaWdpbmFsR3JvdXBcbiAgICAgIH07XG4gICAgfVxuICAgIGdyb3VwLm5hbWUgPSBvcmlnaW5hbEdyb3VwLm5hbWU7XG4gICAgZ3JvdXAuY2hlY2tQdWxsID0gdG9GbihvcmlnaW5hbEdyb3VwLnB1bGwsIHRydWUpO1xuICAgIGdyb3VwLmNoZWNrUHV0ID0gdG9GbihvcmlnaW5hbEdyb3VwLnB1dCk7XG4gICAgZ3JvdXAucmV2ZXJ0Q2xvbmUgPSBvcmlnaW5hbEdyb3VwLnJldmVydENsb25lO1xuICAgIG9wdGlvbnMuZ3JvdXAgPSBncm91cDtcbiAgfSxcbiAgX2hpZGVHaG9zdEZvclRhcmdldCA9IGZ1bmN0aW9uIF9oaWRlR2hvc3RGb3JUYXJnZXQoKSB7XG4gICAgaWYgKCFzdXBwb3J0Q3NzUG9pbnRlckV2ZW50cyAmJiBnaG9zdEVsKSB7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgIH1cbiAgfSxcbiAgX3VuaGlkZUdob3N0Rm9yVGFyZ2V0ID0gZnVuY3Rpb24gX3VuaGlkZUdob3N0Rm9yVGFyZ2V0KCkge1xuICAgIGlmICghc3VwcG9ydENzc1BvaW50ZXJFdmVudHMgJiYgZ2hvc3RFbCkge1xuICAgICAgY3NzKGdob3N0RWwsICdkaXNwbGF5JywgJycpO1xuICAgIH1cbiAgfTtcblxuLy8gIzExODQgZml4IC0gUHJldmVudCBjbGljayBldmVudCBvbiBmYWxsYmFjayBpZiBkcmFnZ2VkIGJ1dCBpdGVtIG5vdCBjaGFuZ2VkIHBvc2l0aW9uXG5pZiAoZG9jdW1lbnRFeGlzdHMgJiYgIUNocm9tZUZvckFuZHJvaWQpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgaWYgKGlnbm9yZU5leHRDbGljaykge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldnQuc3RvcFByb3BhZ2F0aW9uICYmIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24gJiYgZXZ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgaWdub3JlTmV4dENsaWNrID0gZmFsc2U7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9LCB0cnVlKTtcbn1cbnZhciBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCA9IGZ1bmN0aW9uIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KGV2dCkge1xuICBpZiAoZHJhZ0VsKSB7XG4gICAgZXZ0ID0gZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dDtcbiAgICB2YXIgbmVhcmVzdCA9IF9kZXRlY3ROZWFyZXN0RW1wdHlTb3J0YWJsZShldnQuY2xpZW50WCwgZXZ0LmNsaWVudFkpO1xuICAgIGlmIChuZWFyZXN0KSB7XG4gICAgICAvLyBDcmVhdGUgaW1pdGF0aW9uIGV2ZW50XG4gICAgICB2YXIgZXZlbnQgPSB7fTtcbiAgICAgIGZvciAodmFyIGkgaW4gZXZ0KSB7XG4gICAgICAgIGlmIChldnQuaGFzT3duUHJvcGVydHkoaSkpIHtcbiAgICAgICAgICBldmVudFtpXSA9IGV2dFtpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZXZlbnQudGFyZ2V0ID0gZXZlbnQucm9vdEVsID0gbmVhcmVzdDtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0ID0gdm9pZCAwO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uID0gdm9pZCAwO1xuICAgICAgbmVhcmVzdFtleHBhbmRvXS5fb25EcmFnT3ZlcihldmVudCk7XG4gICAgfVxuICB9XG59O1xudmFyIF9jaGVja091dHNpZGVUYXJnZXRFbCA9IGZ1bmN0aW9uIF9jaGVja091dHNpZGVUYXJnZXRFbChldnQpIHtcbiAgaWYgKGRyYWdFbCkge1xuICAgIGRyYWdFbC5wYXJlbnROb2RlW2V4cGFuZG9dLl9pc091dHNpZGVUaGlzRWwoZXZ0LnRhcmdldCk7XG4gIH1cbn07XG5cbi8qKlxyXG4gKiBAY2xhc3MgIFNvcnRhYmxlXHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSAgZWxcclxuICogQHBhcmFtICB7T2JqZWN0fSAgICAgICBbb3B0aW9uc11cclxuICovXG5mdW5jdGlvbiBTb3J0YWJsZShlbCwgb3B0aW9ucykge1xuICBpZiAoIShlbCAmJiBlbC5ub2RlVHlwZSAmJiBlbC5ub2RlVHlwZSA9PT0gMSkpIHtcbiAgICB0aHJvdyBcIlNvcnRhYmxlOiBgZWxgIG11c3QgYmUgYW4gSFRNTEVsZW1lbnQsIG5vdCBcIi5jb25jYXQoe30udG9TdHJpbmcuY2FsbChlbCkpO1xuICB9XG4gIHRoaXMuZWwgPSBlbDsgLy8gcm9vdCBlbGVtZW50XG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgb3B0aW9ucyk7XG5cbiAgLy8gRXhwb3J0IGluc3RhbmNlXG4gIGVsW2V4cGFuZG9dID0gdGhpcztcbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgIGdyb3VwOiBudWxsLFxuICAgIHNvcnQ6IHRydWUsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIHN0b3JlOiBudWxsLFxuICAgIGhhbmRsZTogbnVsbCxcbiAgICBkcmFnZ2FibGU6IC9eW3VvXWwkL2kudGVzdChlbC5ub2RlTmFtZSkgPyAnPmxpJyA6ICc+KicsXG4gICAgc3dhcFRocmVzaG9sZDogMSxcbiAgICAvLyBwZXJjZW50YWdlOyAwIDw9IHggPD0gMVxuICAgIGludmVydFN3YXA6IGZhbHNlLFxuICAgIC8vIGludmVydCBhbHdheXNcbiAgICBpbnZlcnRlZFN3YXBUaHJlc2hvbGQ6IG51bGwsXG4gICAgLy8gd2lsbCBiZSBzZXQgdG8gc2FtZSBhcyBzd2FwVGhyZXNob2xkIGlmIGRlZmF1bHRcbiAgICByZW1vdmVDbG9uZU9uSGlkZTogdHJ1ZSxcbiAgICBkaXJlY3Rpb246IGZ1bmN0aW9uIGRpcmVjdGlvbigpIHtcbiAgICAgIHJldHVybiBfZGV0ZWN0RGlyZWN0aW9uKGVsLCB0aGlzLm9wdGlvbnMpO1xuICAgIH0sXG4gICAgZ2hvc3RDbGFzczogJ3NvcnRhYmxlLWdob3N0JyxcbiAgICBjaG9zZW5DbGFzczogJ3NvcnRhYmxlLWNob3NlbicsXG4gICAgZHJhZ0NsYXNzOiAnc29ydGFibGUtZHJhZycsXG4gICAgaWdub3JlOiAnYSwgaW1nJyxcbiAgICBmaWx0ZXI6IG51bGwsXG4gICAgcHJldmVudE9uRmlsdGVyOiB0cnVlLFxuICAgIGFuaW1hdGlvbjogMCxcbiAgICBlYXNpbmc6IG51bGwsXG4gICAgc2V0RGF0YTogZnVuY3Rpb24gc2V0RGF0YShkYXRhVHJhbnNmZXIsIGRyYWdFbCkge1xuICAgICAgZGF0YVRyYW5zZmVyLnNldERhdGEoJ1RleHQnLCBkcmFnRWwudGV4dENvbnRlbnQpO1xuICAgIH0sXG4gICAgZHJvcEJ1YmJsZTogZmFsc2UsXG4gICAgZHJhZ292ZXJCdWJibGU6IGZhbHNlLFxuICAgIGRhdGFJZEF0dHI6ICdkYXRhLWlkJyxcbiAgICBkZWxheTogMCxcbiAgICBkZWxheU9uVG91Y2hPbmx5OiBmYWxzZSxcbiAgICB0b3VjaFN0YXJ0VGhyZXNob2xkOiAoTnVtYmVyLnBhcnNlSW50ID8gTnVtYmVyIDogd2luZG93KS5wYXJzZUludCh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgMTApIHx8IDEsXG4gICAgZm9yY2VGYWxsYmFjazogZmFsc2UsXG4gICAgZmFsbGJhY2tDbGFzczogJ3NvcnRhYmxlLWZhbGxiYWNrJyxcbiAgICBmYWxsYmFja09uQm9keTogZmFsc2UsXG4gICAgZmFsbGJhY2tUb2xlcmFuY2U6IDAsXG4gICAgZmFsbGJhY2tPZmZzZXQ6IHtcbiAgICAgIHg6IDAsXG4gICAgICB5OiAwXG4gICAgfSxcbiAgICBzdXBwb3J0UG9pbnRlcjogU29ydGFibGUuc3VwcG9ydFBvaW50ZXIgIT09IGZhbHNlICYmICdQb2ludGVyRXZlbnQnIGluIHdpbmRvdyAmJiAhU2FmYXJpLFxuICAgIGVtcHR5SW5zZXJ0VGhyZXNob2xkOiA1XG4gIH07XG4gIFBsdWdpbk1hbmFnZXIuaW5pdGlhbGl6ZVBsdWdpbnModGhpcywgZWwsIGRlZmF1bHRzKTtcblxuICAvLyBTZXQgZGVmYXVsdCBvcHRpb25zXG4gIGZvciAodmFyIG5hbWUgaW4gZGVmYXVsdHMpIHtcbiAgICAhKG5hbWUgaW4gb3B0aW9ucykgJiYgKG9wdGlvbnNbbmFtZV0gPSBkZWZhdWx0c1tuYW1lXSk7XG4gIH1cbiAgX3ByZXBhcmVHcm91cChvcHRpb25zKTtcblxuICAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcbiAgZm9yICh2YXIgZm4gaW4gdGhpcykge1xuICAgIGlmIChmbi5jaGFyQXQoMCkgPT09ICdfJyAmJiB0eXBlb2YgdGhpc1tmbl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXNbZm5dID0gdGhpc1tmbl0uYmluZCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvLyBTZXR1cCBkcmFnIG1vZGVcbiAgdGhpcy5uYXRpdmVEcmFnZ2FibGUgPSBvcHRpb25zLmZvcmNlRmFsbGJhY2sgPyBmYWxzZSA6IHN1cHBvcnREcmFnZ2FibGU7XG4gIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgIC8vIFRvdWNoIHN0YXJ0IHRocmVzaG9sZCBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBuYXRpdmUgZHJhZ3N0YXJ0IHRocmVzaG9sZFxuICAgIHRoaXMub3B0aW9ucy50b3VjaFN0YXJ0VGhyZXNob2xkID0gMTtcbiAgfVxuXG4gIC8vIEJpbmQgZXZlbnRzXG4gIGlmIChvcHRpb25zLnN1cHBvcnRQb2ludGVyKSB7XG4gICAgb24oZWwsICdwb2ludGVyZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuICB9IGVsc2Uge1xuICAgIG9uKGVsLCAnbW91c2Vkb3duJywgdGhpcy5fb25UYXBTdGFydCk7XG4gICAgb24oZWwsICd0b3VjaHN0YXJ0JywgdGhpcy5fb25UYXBTdGFydCk7XG4gIH1cbiAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgb24oZWwsICdkcmFnb3ZlcicsIHRoaXMpO1xuICAgIG9uKGVsLCAnZHJhZ2VudGVyJywgdGhpcyk7XG4gIH1cbiAgc29ydGFibGVzLnB1c2godGhpcy5lbCk7XG5cbiAgLy8gUmVzdG9yZSBzb3J0aW5nXG4gIG9wdGlvbnMuc3RvcmUgJiYgb3B0aW9ucy5zdG9yZS5nZXQgJiYgdGhpcy5zb3J0KG9wdGlvbnMuc3RvcmUuZ2V0KHRoaXMpIHx8IFtdKTtcblxuICAvLyBBZGQgYW5pbWF0aW9uIHN0YXRlIG1hbmFnZXJcbiAgX2V4dGVuZHModGhpcywgQW5pbWF0aW9uU3RhdGVNYW5hZ2VyKCkpO1xufVxuU29ydGFibGUucHJvdG90eXBlID0gLyoqIEBsZW5kcyBTb3J0YWJsZS5wcm90b3R5cGUgKi97XG4gIGNvbnN0cnVjdG9yOiBTb3J0YWJsZSxcbiAgX2lzT3V0c2lkZVRoaXNFbDogZnVuY3Rpb24gX2lzT3V0c2lkZVRoaXNFbCh0YXJnZXQpIHtcbiAgICBpZiAoIXRoaXMuZWwuY29udGFpbnModGFyZ2V0KSAmJiB0YXJnZXQgIT09IHRoaXMuZWwpIHtcbiAgICAgIGxhc3RUYXJnZXQgPSBudWxsO1xuICAgIH1cbiAgfSxcbiAgX2dldERpcmVjdGlvbjogZnVuY3Rpb24gX2dldERpcmVjdGlvbihldnQsIHRhcmdldCkge1xuICAgIHJldHVybiB0eXBlb2YgdGhpcy5vcHRpb25zLmRpcmVjdGlvbiA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMub3B0aW9ucy5kaXJlY3Rpb24uY2FsbCh0aGlzLCBldnQsIHRhcmdldCwgZHJhZ0VsKSA6IHRoaXMub3B0aW9ucy5kaXJlY3Rpb247XG4gIH0sXG4gIF9vblRhcFN0YXJ0OiBmdW5jdGlvbiBfb25UYXBTdGFydCggLyoqIEV2ZW50fFRvdWNoRXZlbnQgKi9ldnQpIHtcbiAgICBpZiAoIWV2dC5jYW5jZWxhYmxlKSByZXR1cm47XG4gICAgdmFyIF90aGlzID0gdGhpcyxcbiAgICAgIGVsID0gdGhpcy5lbCxcbiAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICBwcmV2ZW50T25GaWx0ZXIgPSBvcHRpb25zLnByZXZlbnRPbkZpbHRlcixcbiAgICAgIHR5cGUgPSBldnQudHlwZSxcbiAgICAgIHRvdWNoID0gZXZ0LnRvdWNoZXMgJiYgZXZ0LnRvdWNoZXNbMF0gfHwgZXZ0LnBvaW50ZXJUeXBlICYmIGV2dC5wb2ludGVyVHlwZSA9PT0gJ3RvdWNoJyAmJiBldnQsXG4gICAgICB0YXJnZXQgPSAodG91Y2ggfHwgZXZ0KS50YXJnZXQsXG4gICAgICBvcmlnaW5hbFRhcmdldCA9IGV2dC50YXJnZXQuc2hhZG93Um9vdCAmJiAoZXZ0LnBhdGggJiYgZXZ0LnBhdGhbMF0gfHwgZXZ0LmNvbXBvc2VkUGF0aCAmJiBldnQuY29tcG9zZWRQYXRoKClbMF0pIHx8IHRhcmdldCxcbiAgICAgIGZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgIF9zYXZlSW5wdXRDaGVja2VkU3RhdGUoZWwpO1xuXG4gICAgLy8gRG9uJ3QgdHJpZ2dlciBzdGFydCBldmVudCB3aGVuIGFuIGVsZW1lbnQgaXMgYmVlbiBkcmFnZ2VkLCBvdGhlcndpc2UgdGhlIGV2dC5vbGRpbmRleCBhbHdheXMgd3Jvbmcgd2hlbiBzZXQgb3B0aW9uLmdyb3VwLlxuICAgIGlmIChkcmFnRWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKC9tb3VzZWRvd258cG9pbnRlcmRvd24vLnRlc3QodHlwZSkgJiYgZXZ0LmJ1dHRvbiAhPT0gMCB8fCBvcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47IC8vIG9ubHkgbGVmdCBidXR0b24gYW5kIGVuYWJsZWRcbiAgICB9XG5cbiAgICAvLyBjYW5jZWwgZG5kIGlmIG9yaWdpbmFsIHRhcmdldCBpcyBjb250ZW50IGVkaXRhYmxlXG4gICAgaWYgKG9yaWdpbmFsVGFyZ2V0LmlzQ29udGVudEVkaXRhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2FmYXJpIGlnbm9yZXMgZnVydGhlciBldmVudCBoYW5kbGluZyBhZnRlciBtb3VzZWRvd25cbiAgICBpZiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlICYmIFNhZmFyaSAmJiB0YXJnZXQgJiYgdGFyZ2V0LnRhZ05hbWUudG9VcHBlckNhc2UoKSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGFyZ2V0ID0gY2xvc2VzdCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlLCBlbCwgZmFsc2UpO1xuICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0LmFuaW1hdGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChsYXN0RG93bkVsID09PSB0YXJnZXQpIHtcbiAgICAgIC8vIElnbm9yaW5nIGR1cGxpY2F0ZSBgZG93bmBcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBkcmFnZ2VkIGVsZW1lbnQgd2l0aGluIGl0cyBwYXJlbnRcbiAgICBvbGRJbmRleCA9IGluZGV4KHRhcmdldCk7XG4gICAgb2xkRHJhZ2dhYmxlSW5kZXggPSBpbmRleCh0YXJnZXQsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcblxuICAgIC8vIENoZWNrIGZpbHRlclxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZmlsdGVyLmNhbGwodGhpcywgZXZ0LCB0YXJnZXQsIHRoaXMpKSB7XG4gICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgICAgcm9vdEVsOiBvcmlnaW5hbFRhcmdldCxcbiAgICAgICAgICBuYW1lOiAnZmlsdGVyJyxcbiAgICAgICAgICB0YXJnZXRFbDogdGFyZ2V0LFxuICAgICAgICAgIHRvRWw6IGVsLFxuICAgICAgICAgIGZyb21FbDogZWxcbiAgICAgICAgfSk7XG4gICAgICAgIHBsdWdpbkV2ZW50KCdmaWx0ZXInLCBfdGhpcywge1xuICAgICAgICAgIGV2dDogZXZ0XG4gICAgICAgIH0pO1xuICAgICAgICBwcmV2ZW50T25GaWx0ZXIgJiYgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjsgLy8gY2FuY2VsIGRuZFxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmlsdGVyKSB7XG4gICAgICBmaWx0ZXIgPSBmaWx0ZXIuc3BsaXQoJywnKS5zb21lKGZ1bmN0aW9uIChjcml0ZXJpYSkge1xuICAgICAgICBjcml0ZXJpYSA9IGNsb3Nlc3Qob3JpZ2luYWxUYXJnZXQsIGNyaXRlcmlhLnRyaW0oKSwgZWwsIGZhbHNlKTtcbiAgICAgICAgaWYgKGNyaXRlcmlhKSB7XG4gICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgICAgcm9vdEVsOiBjcml0ZXJpYSxcbiAgICAgICAgICAgIG5hbWU6ICdmaWx0ZXInLFxuICAgICAgICAgICAgdGFyZ2V0RWw6IHRhcmdldCxcbiAgICAgICAgICAgIGZyb21FbDogZWwsXG4gICAgICAgICAgICB0b0VsOiBlbFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHBsdWdpbkV2ZW50KCdmaWx0ZXInLCBfdGhpcywge1xuICAgICAgICAgICAgZXZ0OiBldnRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgIHByZXZlbnRPbkZpbHRlciAmJiBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuOyAvLyBjYW5jZWwgZG5kXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmhhbmRsZSAmJiAhY2xvc2VzdChvcmlnaW5hbFRhcmdldCwgb3B0aW9ucy5oYW5kbGUsIGVsLCBmYWxzZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIGBkcmFnc3RhcnRgXG4gICAgdGhpcy5fcHJlcGFyZURyYWdTdGFydChldnQsIHRvdWNoLCB0YXJnZXQpO1xuICB9LFxuICBfcHJlcGFyZURyYWdTdGFydDogZnVuY3Rpb24gX3ByZXBhcmVEcmFnU3RhcnQoIC8qKiBFdmVudCAqL2V2dCwgLyoqIFRvdWNoICovdG91Y2gsIC8qKiBIVE1MRWxlbWVudCAqL3RhcmdldCkge1xuICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICBlbCA9IF90aGlzLmVsLFxuICAgICAgb3B0aW9ucyA9IF90aGlzLm9wdGlvbnMsXG4gICAgICBvd25lckRvY3VtZW50ID0gZWwub3duZXJEb2N1bWVudCxcbiAgICAgIGRyYWdTdGFydEZuO1xuICAgIGlmICh0YXJnZXQgJiYgIWRyYWdFbCAmJiB0YXJnZXQucGFyZW50Tm9kZSA9PT0gZWwpIHtcbiAgICAgIHZhciBkcmFnUmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgICAgIHJvb3RFbCA9IGVsO1xuICAgICAgZHJhZ0VsID0gdGFyZ2V0O1xuICAgICAgcGFyZW50RWwgPSBkcmFnRWwucGFyZW50Tm9kZTtcbiAgICAgIG5leHRFbCA9IGRyYWdFbC5uZXh0U2libGluZztcbiAgICAgIGxhc3REb3duRWwgPSB0YXJnZXQ7XG4gICAgICBhY3RpdmVHcm91cCA9IG9wdGlvbnMuZ3JvdXA7XG4gICAgICBTb3J0YWJsZS5kcmFnZ2VkID0gZHJhZ0VsO1xuICAgICAgdGFwRXZ0ID0ge1xuICAgICAgICB0YXJnZXQ6IGRyYWdFbCxcbiAgICAgICAgY2xpZW50WDogKHRvdWNoIHx8IGV2dCkuY2xpZW50WCxcbiAgICAgICAgY2xpZW50WTogKHRvdWNoIHx8IGV2dCkuY2xpZW50WVxuICAgICAgfTtcbiAgICAgIHRhcERpc3RhbmNlTGVmdCA9IHRhcEV2dC5jbGllbnRYIC0gZHJhZ1JlY3QubGVmdDtcbiAgICAgIHRhcERpc3RhbmNlVG9wID0gdGFwRXZ0LmNsaWVudFkgLSBkcmFnUmVjdC50b3A7XG4gICAgICB0aGlzLl9sYXN0WCA9ICh0b3VjaCB8fCBldnQpLmNsaWVudFg7XG4gICAgICB0aGlzLl9sYXN0WSA9ICh0b3VjaCB8fCBldnQpLmNsaWVudFk7XG4gICAgICBkcmFnRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnYWxsJztcbiAgICAgIGRyYWdTdGFydEZuID0gZnVuY3Rpb24gZHJhZ1N0YXJ0Rm4oKSB7XG4gICAgICAgIHBsdWdpbkV2ZW50KCdkZWxheUVuZGVkJywgX3RoaXMsIHtcbiAgICAgICAgICBldnQ6IGV2dFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgICBfdGhpcy5fb25Ecm9wKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlbGF5ZWQgZHJhZyBoYXMgYmVlbiB0cmlnZ2VyZWRcbiAgICAgICAgLy8gd2UgY2FuIHJlLWVuYWJsZSB0aGUgZXZlbnRzOiB0b3VjaG1vdmUvbW91c2Vtb3ZlXG4gICAgICAgIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWdFdmVudHMoKTtcbiAgICAgICAgaWYgKCFGaXJlRm94ICYmIF90aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICAgIGRyYWdFbC5kcmFnZ2FibGUgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQmluZCB0aGUgZXZlbnRzOiBkcmFnc3RhcnQvZHJhZ2VuZFxuICAgICAgICBfdGhpcy5fdHJpZ2dlckRyYWdTdGFydChldnQsIHRvdWNoKTtcblxuICAgICAgICAvLyBEcmFnIHN0YXJ0IGV2ZW50XG4gICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgICAgbmFtZTogJ2Nob29zZScsXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENob3NlbiBpdGVtXG4gICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5jaG9zZW5DbGFzcywgdHJ1ZSk7XG4gICAgICB9O1xuXG4gICAgICAvLyBEaXNhYmxlIFwiZHJhZ2dhYmxlXCJcbiAgICAgIG9wdGlvbnMuaWdub3JlLnNwbGl0KCcsJykuZm9yRWFjaChmdW5jdGlvbiAoY3JpdGVyaWEpIHtcbiAgICAgICAgZmluZChkcmFnRWwsIGNyaXRlcmlhLnRyaW0oKSwgX2Rpc2FibGVEcmFnZ2FibGUpO1xuICAgICAgfSk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAnZHJhZ292ZXInLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2Vtb3ZlJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNobW92ZScsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdtb3VzZXVwJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIF90aGlzLl9vbkRyb3ApO1xuXG4gICAgICAvLyBNYWtlIGRyYWdFbCBkcmFnZ2FibGUgKG11c3QgYmUgYmVmb3JlIGRlbGF5IGZvciBGaXJlRm94KVxuICAgICAgaWYgKEZpcmVGb3ggJiYgdGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgPSA0O1xuICAgICAgICBkcmFnRWwuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHBsdWdpbkV2ZW50KCdkZWxheVN0YXJ0JywgdGhpcywge1xuICAgICAgICBldnQ6IGV2dFxuICAgICAgfSk7XG5cbiAgICAgIC8vIERlbGF5IGlzIGltcG9zc2libGUgZm9yIG5hdGl2ZSBEbkQgaW4gRWRnZSBvciBJRVxuICAgICAgaWYgKG9wdGlvbnMuZGVsYXkgJiYgKCFvcHRpb25zLmRlbGF5T25Ub3VjaE9ubHkgfHwgdG91Y2gpICYmICghdGhpcy5uYXRpdmVEcmFnZ2FibGUgfHwgIShFZGdlIHx8IElFMTFPckxlc3MpKSkge1xuICAgICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgICAgIHRoaXMuX29uRHJvcCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdXNlciBtb3ZlcyB0aGUgcG9pbnRlciBvciBsZXQgZ28gdGhlIGNsaWNrIG9yIHRvdWNoXG4gICAgICAgIC8vIGJlZm9yZSB0aGUgZGVsYXkgaGFzIGJlZW4gcmVhY2hlZDpcbiAgICAgICAgLy8gZGlzYWJsZSB0aGUgZGVsYXllZCBkcmFnXG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdtb3VzZXVwJywgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ21vdXNlbW92ZScsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2htb3ZlJywgX3RoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgICAgIG9wdGlvbnMuc3VwcG9ydFBvaW50ZXIgJiYgb24ob3duZXJEb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgX3RoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgICAgIF90aGlzLl9kcmFnU3RhcnRUaW1lciA9IHNldFRpbWVvdXQoZHJhZ1N0YXJ0Rm4sIG9wdGlvbnMuZGVsYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZHJhZ1N0YXJ0Rm4oKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG4gIF9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXI6IGZ1bmN0aW9uIF9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIoIC8qKiBUb3VjaEV2ZW50fFBvaW50ZXJFdmVudCAqKi9lKSB7XG4gICAgdmFyIHRvdWNoID0gZS50b3VjaGVzID8gZS50b3VjaGVzWzBdIDogZTtcbiAgICBpZiAoTWF0aC5tYXgoTWF0aC5hYnModG91Y2guY2xpZW50WCAtIHRoaXMuX2xhc3RYKSwgTWF0aC5hYnModG91Y2guY2xpZW50WSAtIHRoaXMuX2xhc3RZKSkgPj0gTWF0aC5mbG9vcih0aGlzLm9wdGlvbnMudG91Y2hTdGFydFRocmVzaG9sZCAvICh0aGlzLm5hdGl2ZURyYWdnYWJsZSAmJiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSkpIHtcbiAgICAgIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZygpO1xuICAgIH1cbiAgfSxcbiAgX2Rpc2FibGVEZWxheWVkRHJhZzogZnVuY3Rpb24gX2Rpc2FibGVEZWxheWVkRHJhZygpIHtcbiAgICBkcmFnRWwgJiYgX2Rpc2FibGVEcmFnZ2FibGUoZHJhZ0VsKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fZHJhZ1N0YXJ0VGltZXIpO1xuICAgIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpO1xuICB9LFxuICBfZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzOiBmdW5jdGlvbiBfZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCkge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gdGhpcy5lbC5vd25lckRvY3VtZW50O1xuICAgIG9mZihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgfSxcbiAgX3RyaWdnZXJEcmFnU3RhcnQ6IGZ1bmN0aW9uIF90cmlnZ2VyRHJhZ1N0YXJ0KCAvKiogRXZlbnQgKi9ldnQsIC8qKiBUb3VjaCAqL3RvdWNoKSB7XG4gICAgdG91Y2ggPSB0b3VjaCB8fCBldnQucG9pbnRlclR5cGUgPT0gJ3RvdWNoJyAmJiBldnQ7XG4gICAgaWYgKCF0aGlzLm5hdGl2ZURyYWdnYWJsZSB8fCB0b3VjaCkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgICAgICBvbihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgICAgfSBlbHNlIGlmICh0b3VjaCkge1xuICAgICAgICBvbihkb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBvbihkcmFnRWwsICdkcmFnZW5kJywgdGhpcyk7XG4gICAgICBvbihyb290RWwsICdkcmFnc3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBpZiAoZG9jdW1lbnQuc2VsZWN0aW9uKSB7XG4gICAgICAgIC8vIFRpbWVvdXQgbmVjY2Vzc2FyeSBmb3IgSUU5XG4gICAgICAgIF9uZXh0VGljayhmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZG9jdW1lbnQuc2VsZWN0aW9uLmVtcHR5KCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2luZG93LmdldFNlbGVjdGlvbigpLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge31cbiAgfSxcbiAgX2RyYWdTdGFydGVkOiBmdW5jdGlvbiBfZHJhZ1N0YXJ0ZWQoZmFsbGJhY2ssIGV2dCkge1xuICAgIGF3YWl0aW5nRHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICBpZiAocm9vdEVsICYmIGRyYWdFbCkge1xuICAgICAgcGx1Z2luRXZlbnQoJ2RyYWdTdGFydGVkJywgdGhpcywge1xuICAgICAgICBldnQ6IGV2dFxuICAgICAgfSk7XG4gICAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdkcmFnb3ZlcicsIF9jaGVja091dHNpZGVUYXJnZXRFbCk7XG4gICAgICB9XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgICAgLy8gQXBwbHkgZWZmZWN0XG4gICAgICAhZmFsbGJhY2sgJiYgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBvcHRpb25zLmRyYWdDbGFzcywgZmFsc2UpO1xuICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBvcHRpb25zLmdob3N0Q2xhc3MsIHRydWUpO1xuICAgICAgU29ydGFibGUuYWN0aXZlID0gdGhpcztcbiAgICAgIGZhbGxiYWNrICYmIHRoaXMuX2FwcGVuZEdob3N0KCk7XG5cbiAgICAgIC8vIERyYWcgc3RhcnQgZXZlbnRcbiAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgIG5hbWU6ICdzdGFydCcsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX251bGxpbmcoKTtcbiAgICB9XG4gIH0sXG4gIF9lbXVsYXRlRHJhZ092ZXI6IGZ1bmN0aW9uIF9lbXVsYXRlRHJhZ092ZXIoKSB7XG4gICAgaWYgKHRvdWNoRXZ0KSB7XG4gICAgICB0aGlzLl9sYXN0WCA9IHRvdWNoRXZ0LmNsaWVudFg7XG4gICAgICB0aGlzLl9sYXN0WSA9IHRvdWNoRXZ0LmNsaWVudFk7XG4gICAgICBfaGlkZUdob3N0Rm9yVGFyZ2V0KCk7XG4gICAgICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh0b3VjaEV2dC5jbGllbnRYLCB0b3VjaEV2dC5jbGllbnRZKTtcbiAgICAgIHZhciBwYXJlbnQgPSB0YXJnZXQ7XG4gICAgICB3aGlsZSAodGFyZ2V0ICYmIHRhcmdldC5zaGFkb3dSb290KSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldC5zaGFkb3dSb290LmVsZW1lbnRGcm9tUG9pbnQodG91Y2hFdnQuY2xpZW50WCwgdG91Y2hFdnQuY2xpZW50WSk7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IHBhcmVudCkgYnJlYWs7XG4gICAgICAgIHBhcmVudCA9IHRhcmdldDtcbiAgICAgIH1cbiAgICAgIGRyYWdFbC5wYXJlbnROb2RlW2V4cGFuZG9dLl9pc091dHNpZGVUaGlzRWwodGFyZ2V0KTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgZG8ge1xuICAgICAgICAgIGlmIChwYXJlbnRbZXhwYW5kb10pIHtcbiAgICAgICAgICAgIHZhciBpbnNlcnRlZCA9IHZvaWQgMDtcbiAgICAgICAgICAgIGluc2VydGVkID0gcGFyZW50W2V4cGFuZG9dLl9vbkRyYWdPdmVyKHtcbiAgICAgICAgICAgICAgY2xpZW50WDogdG91Y2hFdnQuY2xpZW50WCxcbiAgICAgICAgICAgICAgY2xpZW50WTogdG91Y2hFdnQuY2xpZW50WSxcbiAgICAgICAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgICAgICAgIHJvb3RFbDogcGFyZW50XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpbnNlcnRlZCAmJiAhdGhpcy5vcHRpb25zLmRyYWdvdmVyQnViYmxlKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0YXJnZXQgPSBwYXJlbnQ7IC8vIHN0b3JlIGxhc3QgZWxlbWVudFxuICAgICAgICB9XG4gICAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi8gd2hpbGUgKHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKTtcbiAgICAgIH1cbiAgICAgIF91bmhpZGVHaG9zdEZvclRhcmdldCgpO1xuICAgIH1cbiAgfSxcbiAgX29uVG91Y2hNb3ZlOiBmdW5jdGlvbiBfb25Ub3VjaE1vdmUoIC8qKlRvdWNoRXZlbnQqL2V2dCkge1xuICAgIGlmICh0YXBFdnQpIHtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBmYWxsYmFja1RvbGVyYW5jZSA9IG9wdGlvbnMuZmFsbGJhY2tUb2xlcmFuY2UsXG4gICAgICAgIGZhbGxiYWNrT2Zmc2V0ID0gb3B0aW9ucy5mYWxsYmFja09mZnNldCxcbiAgICAgICAgdG91Y2ggPSBldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0LFxuICAgICAgICBnaG9zdE1hdHJpeCA9IGdob3N0RWwgJiYgbWF0cml4KGdob3N0RWwsIHRydWUpLFxuICAgICAgICBzY2FsZVggPSBnaG9zdEVsICYmIGdob3N0TWF0cml4ICYmIGdob3N0TWF0cml4LmEsXG4gICAgICAgIHNjYWxlWSA9IGdob3N0RWwgJiYgZ2hvc3RNYXRyaXggJiYgZ2hvc3RNYXRyaXguZCxcbiAgICAgICAgcmVsYXRpdmVTY3JvbGxPZmZzZXQgPSBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSAmJiBnaG9zdFJlbGF0aXZlUGFyZW50ICYmIGdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0KGdob3N0UmVsYXRpdmVQYXJlbnQpLFxuICAgICAgICBkeCA9ICh0b3VjaC5jbGllbnRYIC0gdGFwRXZ0LmNsaWVudFggKyBmYWxsYmFja09mZnNldC54KSAvIChzY2FsZVggfHwgMSkgKyAocmVsYXRpdmVTY3JvbGxPZmZzZXQgPyByZWxhdGl2ZVNjcm9sbE9mZnNldFswXSAtIGdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsWzBdIDogMCkgLyAoc2NhbGVYIHx8IDEpLFxuICAgICAgICBkeSA9ICh0b3VjaC5jbGllbnRZIC0gdGFwRXZ0LmNsaWVudFkgKyBmYWxsYmFja09mZnNldC55KSAvIChzY2FsZVkgfHwgMSkgKyAocmVsYXRpdmVTY3JvbGxPZmZzZXQgPyByZWxhdGl2ZVNjcm9sbE9mZnNldFsxXSAtIGdob3N0UmVsYXRpdmVQYXJlbnRJbml0aWFsU2Nyb2xsWzFdIDogMCkgLyAoc2NhbGVZIHx8IDEpO1xuXG4gICAgICAvLyBvbmx5IHNldCB0aGUgc3RhdHVzIHRvIGRyYWdnaW5nLCB3aGVuIHdlIGFyZSBhY3R1YWxseSBkcmFnZ2luZ1xuICAgICAgaWYgKCFTb3J0YWJsZS5hY3RpdmUgJiYgIWF3YWl0aW5nRHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgaWYgKGZhbGxiYWNrVG9sZXJhbmNlICYmIE1hdGgubWF4KE1hdGguYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLl9sYXN0WCksIE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSB0aGlzLl9sYXN0WSkpIDwgZmFsbGJhY2tUb2xlcmFuY2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fb25EcmFnU3RhcnQoZXZ0LCB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChnaG9zdEVsKSB7XG4gICAgICAgIGlmIChnaG9zdE1hdHJpeCkge1xuICAgICAgICAgIGdob3N0TWF0cml4LmUgKz0gZHggLSAobGFzdER4IHx8IDApO1xuICAgICAgICAgIGdob3N0TWF0cml4LmYgKz0gZHkgLSAobGFzdER5IHx8IDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdob3N0TWF0cml4ID0ge1xuICAgICAgICAgICAgYTogMSxcbiAgICAgICAgICAgIGI6IDAsXG4gICAgICAgICAgICBjOiAwLFxuICAgICAgICAgICAgZDogMSxcbiAgICAgICAgICAgIGU6IGR4LFxuICAgICAgICAgICAgZjogZHlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHZhciBjc3NNYXRyaXggPSBcIm1hdHJpeChcIi5jb25jYXQoZ2hvc3RNYXRyaXguYSwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5iLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmMsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguZCwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5lLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmYsIFwiKVwiKTtcbiAgICAgICAgY3NzKGdob3N0RWwsICd3ZWJraXRUcmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgJ21velRyYW5zZm9ybScsIGNzc01hdHJpeCk7XG4gICAgICAgIGNzcyhnaG9zdEVsLCAnbXNUcmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgJ3RyYW5zZm9ybScsIGNzc01hdHJpeCk7XG4gICAgICAgIGxhc3REeCA9IGR4O1xuICAgICAgICBsYXN0RHkgPSBkeTtcbiAgICAgICAgdG91Y2hFdnQgPSB0b3VjaDtcbiAgICAgIH1cbiAgICAgIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSxcbiAgX2FwcGVuZEdob3N0OiBmdW5jdGlvbiBfYXBwZW5kR2hvc3QoKSB7XG4gICAgLy8gQnVnIGlmIHVzaW5nIHNjYWxlKCk6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI2MzcwNThcbiAgICAvLyBOb3QgYmVpbmcgYWRqdXN0ZWQgZm9yXG4gICAgaWYgKCFnaG9zdEVsKSB7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5vcHRpb25zLmZhbGxiYWNrT25Cb2R5ID8gZG9jdW1lbnQuYm9keSA6IHJvb3RFbCxcbiAgICAgICAgcmVjdCA9IGdldFJlY3QoZHJhZ0VsLCB0cnVlLCBQb3NpdGlvbkdob3N0QWJzb2x1dGVseSwgdHJ1ZSwgY29udGFpbmVyKSxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgICAgLy8gUG9zaXRpb24gYWJzb2x1dGVseVxuICAgICAgaWYgKFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5KSB7XG4gICAgICAgIC8vIEdldCByZWxhdGl2ZWx5IHBvc2l0aW9uZWQgcGFyZW50XG4gICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBjb250YWluZXI7XG4gICAgICAgIHdoaWxlIChjc3MoZ2hvc3RSZWxhdGl2ZVBhcmVudCwgJ3Bvc2l0aW9uJykgPT09ICdzdGF0aWMnICYmIGNzcyhnaG9zdFJlbGF0aXZlUGFyZW50LCAndHJhbnNmb3JtJykgPT09ICdub25lJyAmJiBnaG9zdFJlbGF0aXZlUGFyZW50ICE9PSBkb2N1bWVudCkge1xuICAgICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBnaG9zdFJlbGF0aXZlUGFyZW50LnBhcmVudE5vZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGdob3N0UmVsYXRpdmVQYXJlbnQgIT09IGRvY3VtZW50LmJvZHkgJiYgZ2hvc3RSZWxhdGl2ZVBhcmVudCAhPT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKGdob3N0UmVsYXRpdmVQYXJlbnQgPT09IGRvY3VtZW50KSBnaG9zdFJlbGF0aXZlUGFyZW50ID0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgICAgICAgIHJlY3QudG9wICs9IGdob3N0UmVsYXRpdmVQYXJlbnQuc2Nyb2xsVG9wO1xuICAgICAgICAgIHJlY3QubGVmdCArPSBnaG9zdFJlbGF0aXZlUGFyZW50LnNjcm9sbExlZnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbCA9IGdldFJlbGF0aXZlU2Nyb2xsT2Zmc2V0KGdob3N0UmVsYXRpdmVQYXJlbnQpO1xuICAgICAgfVxuICAgICAgZ2hvc3RFbCA9IGRyYWdFbC5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICB0b2dnbGVDbGFzcyhnaG9zdEVsLCBvcHRpb25zLmdob3N0Q2xhc3MsIGZhbHNlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGdob3N0RWwsIG9wdGlvbnMuZmFsbGJhY2tDbGFzcywgdHJ1ZSk7XG4gICAgICB0b2dnbGVDbGFzcyhnaG9zdEVsLCBvcHRpb25zLmRyYWdDbGFzcywgdHJ1ZSk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3RyYW5zZm9ybScsICcnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnYm94LXNpemluZycsICdib3JkZXItYm94Jyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ21hcmdpbicsIDApO1xuICAgICAgY3NzKGdob3N0RWwsICd0b3AnLCByZWN0LnRvcCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ2xlZnQnLCByZWN0LmxlZnQpO1xuICAgICAgY3NzKGdob3N0RWwsICd3aWR0aCcsIHJlY3Qud2lkdGgpO1xuICAgICAgY3NzKGdob3N0RWwsICdoZWlnaHQnLCByZWN0LmhlaWdodCk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ29wYWNpdHknLCAnMC44Jyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3Bvc2l0aW9uJywgUG9zaXRpb25HaG9zdEFic29sdXRlbHkgPyAnYWJzb2x1dGUnIDogJ2ZpeGVkJyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3pJbmRleCcsICcxMDAwMDAnKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAncG9pbnRlckV2ZW50cycsICdub25lJyk7XG4gICAgICBTb3J0YWJsZS5naG9zdCA9IGdob3N0RWw7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZ2hvc3RFbCk7XG5cbiAgICAgIC8vIFNldCB0cmFuc2Zvcm0tb3JpZ2luXG4gICAgICBjc3MoZ2hvc3RFbCwgJ3RyYW5zZm9ybS1vcmlnaW4nLCB0YXBEaXN0YW5jZUxlZnQgLyBwYXJzZUludChnaG9zdEVsLnN0eWxlLndpZHRoKSAqIDEwMCArICclICcgKyB0YXBEaXN0YW5jZVRvcCAvIHBhcnNlSW50KGdob3N0RWwuc3R5bGUuaGVpZ2h0KSAqIDEwMCArICclJyk7XG4gICAgfVxuICB9LFxuICBfb25EcmFnU3RhcnQ6IGZ1bmN0aW9uIF9vbkRyYWdTdGFydCggLyoqRXZlbnQqL2V2dCwgLyoqYm9vbGVhbiovZmFsbGJhY2spIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHZhciBkYXRhVHJhbnNmZXIgPSBldnQuZGF0YVRyYW5zZmVyO1xuICAgIHZhciBvcHRpb25zID0gX3RoaXMub3B0aW9ucztcbiAgICBwbHVnaW5FdmVudCgnZHJhZ1N0YXJ0JywgdGhpcywge1xuICAgICAgZXZ0OiBldnRcbiAgICB9KTtcbiAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgdGhpcy5fb25Ecm9wKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBsdWdpbkV2ZW50KCdzZXR1cENsb25lJywgdGhpcyk7XG4gICAgaWYgKCFTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICBjbG9uZUVsID0gY2xvbmUoZHJhZ0VsKTtcbiAgICAgIGNsb25lRWwucmVtb3ZlQXR0cmlidXRlKFwiaWRcIik7XG4gICAgICBjbG9uZUVsLmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgICAgY2xvbmVFbC5zdHlsZVsnd2lsbC1jaGFuZ2UnXSA9ICcnO1xuICAgICAgdGhpcy5faGlkZUNsb25lKCk7XG4gICAgICB0b2dnbGVDbGFzcyhjbG9uZUVsLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTtcbiAgICAgIFNvcnRhYmxlLmNsb25lID0gY2xvbmVFbDtcbiAgICB9XG5cbiAgICAvLyAjMTE0MzogSUZyYW1lIHN1cHBvcnQgd29ya2Fyb3VuZFxuICAgIF90aGlzLmNsb25lSWQgPSBfbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgcGx1Z2luRXZlbnQoJ2Nsb25lJywgX3RoaXMpO1xuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybjtcbiAgICAgIGlmICghX3RoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSkge1xuICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lRWwsIGRyYWdFbCk7XG4gICAgICB9XG4gICAgICBfdGhpcy5faGlkZUNsb25lKCk7XG4gICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHNvcnRhYmxlOiBfdGhpcyxcbiAgICAgICAgbmFtZTogJ2Nsb25lJ1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgIWZhbGxiYWNrICYmIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5kcmFnQ2xhc3MsIHRydWUpO1xuXG4gICAgLy8gU2V0IHByb3BlciBkcm9wIGV2ZW50c1xuICAgIGlmIChmYWxsYmFjaykge1xuICAgICAgaWdub3JlTmV4dENsaWNrID0gdHJ1ZTtcbiAgICAgIF90aGlzLl9sb29wSWQgPSBzZXRJbnRlcnZhbChfdGhpcy5fZW11bGF0ZURyYWdPdmVyLCA1MCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFVuZG8gd2hhdCB3YXMgc2V0IGluIF9wcmVwYXJlRHJhZ1N0YXJ0IGJlZm9yZSBkcmFnIHN0YXJ0ZWRcbiAgICAgIG9mZihkb2N1bWVudCwgJ21vdXNldXAnLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ3RvdWNoZW5kJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaGNhbmNlbCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgaWYgKGRhdGFUcmFuc2Zlcikge1xuICAgICAgICBkYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICdtb3ZlJztcbiAgICAgICAgb3B0aW9ucy5zZXREYXRhICYmIG9wdGlvbnMuc2V0RGF0YS5jYWxsKF90aGlzLCBkYXRhVHJhbnNmZXIsIGRyYWdFbCk7XG4gICAgICB9XG4gICAgICBvbihkb2N1bWVudCwgJ2Ryb3AnLCBfdGhpcyk7XG5cbiAgICAgIC8vICMxMjc2IGZpeDpcbiAgICAgIGNzcyhkcmFnRWwsICd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlWigwKScpO1xuICAgIH1cbiAgICBhd2FpdGluZ0RyYWdTdGFydGVkID0gdHJ1ZTtcbiAgICBfdGhpcy5fZHJhZ1N0YXJ0SWQgPSBfbmV4dFRpY2soX3RoaXMuX2RyYWdTdGFydGVkLmJpbmQoX3RoaXMsIGZhbGxiYWNrLCBldnQpKTtcbiAgICBvbihkb2N1bWVudCwgJ3NlbGVjdHN0YXJ0JywgX3RoaXMpO1xuICAgIG1vdmVkID0gdHJ1ZTtcbiAgICBpZiAoU2FmYXJpKSB7XG4gICAgICBjc3MoZG9jdW1lbnQuYm9keSwgJ3VzZXItc2VsZWN0JywgJ25vbmUnKTtcbiAgICB9XG4gIH0sXG4gIC8vIFJldHVybnMgdHJ1ZSAtIGlmIG5vIGZ1cnRoZXIgYWN0aW9uIGlzIG5lZWRlZCAoZWl0aGVyIGluc2VydGVkIG9yIGFub3RoZXIgY29uZGl0aW9uKVxuICBfb25EcmFnT3ZlcjogZnVuY3Rpb24gX29uRHJhZ092ZXIoIC8qKkV2ZW50Ki9ldnQpIHtcbiAgICB2YXIgZWwgPSB0aGlzLmVsLFxuICAgICAgdGFyZ2V0ID0gZXZ0LnRhcmdldCxcbiAgICAgIGRyYWdSZWN0LFxuICAgICAgdGFyZ2V0UmVjdCxcbiAgICAgIHJldmVydCxcbiAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICBncm91cCA9IG9wdGlvbnMuZ3JvdXAsXG4gICAgICBhY3RpdmVTb3J0YWJsZSA9IFNvcnRhYmxlLmFjdGl2ZSxcbiAgICAgIGlzT3duZXIgPSBhY3RpdmVHcm91cCA9PT0gZ3JvdXAsXG4gICAgICBjYW5Tb3J0ID0gb3B0aW9ucy5zb3J0LFxuICAgICAgZnJvbVNvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgYWN0aXZlU29ydGFibGUsXG4gICAgICB2ZXJ0aWNhbCxcbiAgICAgIF90aGlzID0gdGhpcyxcbiAgICAgIGNvbXBsZXRlZEZpcmVkID0gZmFsc2U7XG4gICAgaWYgKF9zaWxlbnQpIHJldHVybjtcbiAgICBmdW5jdGlvbiBkcmFnT3ZlckV2ZW50KG5hbWUsIGV4dHJhKSB7XG4gICAgICBwbHVnaW5FdmVudChuYW1lLCBfdGhpcywgX29iamVjdFNwcmVhZDIoe1xuICAgICAgICBldnQ6IGV2dCxcbiAgICAgICAgaXNPd25lcjogaXNPd25lcixcbiAgICAgICAgYXhpczogdmVydGljYWwgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnLFxuICAgICAgICByZXZlcnQ6IHJldmVydCxcbiAgICAgICAgZHJhZ1JlY3Q6IGRyYWdSZWN0LFxuICAgICAgICB0YXJnZXRSZWN0OiB0YXJnZXRSZWN0LFxuICAgICAgICBjYW5Tb3J0OiBjYW5Tb3J0LFxuICAgICAgICBmcm9tU29ydGFibGU6IGZyb21Tb3J0YWJsZSxcbiAgICAgICAgdGFyZ2V0OiB0YXJnZXQsXG4gICAgICAgIGNvbXBsZXRlZDogY29tcGxldGVkLFxuICAgICAgICBvbk1vdmU6IGZ1bmN0aW9uIG9uTW92ZSh0YXJnZXQsIGFmdGVyKSB7XG4gICAgICAgICAgcmV0dXJuIF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCBnZXRSZWN0KHRhcmdldCksIGV2dCwgYWZ0ZXIpO1xuICAgICAgICB9LFxuICAgICAgICBjaGFuZ2VkOiBjaGFuZ2VkXG4gICAgICB9LCBleHRyYSkpO1xuICAgIH1cblxuICAgIC8vIENhcHR1cmUgYW5pbWF0aW9uIHN0YXRlXG4gICAgZnVuY3Rpb24gY2FwdHVyZSgpIHtcbiAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyQW5pbWF0aW9uQ2FwdHVyZScpO1xuICAgICAgX3RoaXMuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgICBpZiAoX3RoaXMgIT09IGZyb21Tb3J0YWJsZSkge1xuICAgICAgICBmcm9tU29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGludm9jYXRpb24gd2hlbiBkcmFnRWwgaXMgaW5zZXJ0ZWQgKG9yIGNvbXBsZXRlZClcbiAgICBmdW5jdGlvbiBjb21wbGV0ZWQoaW5zZXJ0aW9uKSB7XG4gICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlckNvbXBsZXRlZCcsIHtcbiAgICAgICAgaW5zZXJ0aW9uOiBpbnNlcnRpb25cbiAgICAgIH0pO1xuICAgICAgaWYgKGluc2VydGlvbikge1xuICAgICAgICAvLyBDbG9uZXMgbXVzdCBiZSBoaWRkZW4gYmVmb3JlIGZvbGRpbmcgYW5pbWF0aW9uIHRvIGNhcHR1cmUgZHJhZ1JlY3RBYnNvbHV0ZSBwcm9wZXJseVxuICAgICAgICBpZiAoaXNPd25lcikge1xuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLl9oaWRlQ2xvbmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5fc2hvd0Nsb25lKF90aGlzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX3RoaXMgIT09IGZyb21Tb3J0YWJsZSkge1xuICAgICAgICAgIC8vIFNldCBnaG9zdCBjbGFzcyB0byBuZXcgc29ydGFibGUncyBnaG9zdCBjbGFzc1xuICAgICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgcHV0U29ydGFibGUgPyBwdXRTb3J0YWJsZS5vcHRpb25zLmdob3N0Q2xhc3MgOiBhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmdob3N0Q2xhc3MsIGZhbHNlKTtcbiAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZ2hvc3RDbGFzcywgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHB1dFNvcnRhYmxlICE9PSBfdGhpcyAmJiBfdGhpcyAhPT0gU29ydGFibGUuYWN0aXZlKSB7XG4gICAgICAgICAgcHV0U29ydGFibGUgPSBfdGhpcztcbiAgICAgICAgfSBlbHNlIGlmIChfdGhpcyA9PT0gU29ydGFibGUuYWN0aXZlICYmIHB1dFNvcnRhYmxlKSB7XG4gICAgICAgICAgcHV0U29ydGFibGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQW5pbWF0aW9uXG4gICAgICAgIGlmIChmcm9tU29ydGFibGUgPT09IF90aGlzKSB7XG4gICAgICAgICAgX3RoaXMuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID0gdGFyZ2V0O1xuICAgICAgICB9XG4gICAgICAgIF90aGlzLmFuaW1hdGVBbGwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyQW5pbWF0aW9uQ29tcGxldGUnKTtcbiAgICAgICAgICBfdGhpcy5faWdub3JlV2hpbGVBbmltYXRpbmcgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgICAgaWYgKF90aGlzICE9PSBmcm9tU29ydGFibGUpIHtcbiAgICAgICAgICBmcm9tU29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgICAgICAgIGZyb21Tb3J0YWJsZS5faWdub3JlV2hpbGVBbmltYXRpbmcgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE51bGwgbGFzdFRhcmdldCBpZiBpdCBpcyBub3QgaW5zaWRlIGEgcHJldmlvdXNseSBzd2FwcGVkIGVsZW1lbnRcbiAgICAgIGlmICh0YXJnZXQgPT09IGRyYWdFbCAmJiAhZHJhZ0VsLmFuaW1hdGVkIHx8IHRhcmdldCA9PT0gZWwgJiYgIXRhcmdldC5hbmltYXRlZCkge1xuICAgICAgICBsYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgLy8gbm8gYnViYmxpbmcgYW5kIG5vdCBmYWxsYmFja1xuICAgICAgaWYgKCFvcHRpb25zLmRyYWdvdmVyQnViYmxlICYmICFldnQucm9vdEVsICYmIHRhcmdldCAhPT0gZG9jdW1lbnQpIHtcbiAgICAgICAgZHJhZ0VsLnBhcmVudE5vZGVbZXhwYW5kb10uX2lzT3V0c2lkZVRoaXNFbChldnQudGFyZ2V0KTtcblxuICAgICAgICAvLyBEbyBub3QgZGV0ZWN0IGZvciBlbXB0eSBpbnNlcnQgaWYgYWxyZWFkeSBpbnNlcnRlZFxuICAgICAgICAhaW5zZXJ0aW9uICYmIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KGV2dCk7XG4gICAgICB9XG4gICAgICAhb3B0aW9ucy5kcmFnb3ZlckJ1YmJsZSAmJiBldnQuc3RvcFByb3BhZ2F0aW9uICYmIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHJldHVybiBjb21wbGV0ZWRGaXJlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2FsbCB3aGVuIGRyYWdFbCBoYXMgYmVlbiBpbnNlcnRlZFxuICAgIGZ1bmN0aW9uIGNoYW5nZWQoKSB7XG4gICAgICBuZXdJbmRleCA9IGluZGV4KGRyYWdFbCk7XG4gICAgICBuZXdEcmFnZ2FibGVJbmRleCA9IGluZGV4KGRyYWdFbCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgIG5hbWU6ICdjaGFuZ2UnLFxuICAgICAgICB0b0VsOiBlbCxcbiAgICAgICAgbmV3SW5kZXg6IG5ld0luZGV4LFxuICAgICAgICBuZXdEcmFnZ2FibGVJbmRleDogbmV3RHJhZ2dhYmxlSW5kZXgsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChldnQucHJldmVudERlZmF1bHQgIT09IHZvaWQgMCkge1xuICAgICAgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIHRhcmdldCA9IGNsb3Nlc3QodGFyZ2V0LCBvcHRpb25zLmRyYWdnYWJsZSwgZWwsIHRydWUpO1xuICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyJyk7XG4gICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybiBjb21wbGV0ZWRGaXJlZDtcbiAgICBpZiAoZHJhZ0VsLmNvbnRhaW5zKGV2dC50YXJnZXQpIHx8IHRhcmdldC5hbmltYXRlZCAmJiB0YXJnZXQuYW5pbWF0aW5nWCAmJiB0YXJnZXQuYW5pbWF0aW5nWSB8fCBfdGhpcy5faWdub3JlV2hpbGVBbmltYXRpbmcgPT09IHRhcmdldCkge1xuICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgfVxuICAgIGlnbm9yZU5leHRDbGljayA9IGZhbHNlO1xuICAgIGlmIChhY3RpdmVTb3J0YWJsZSAmJiAhb3B0aW9ucy5kaXNhYmxlZCAmJiAoaXNPd25lciA/IGNhblNvcnQgfHwgKHJldmVydCA9IHBhcmVudEVsICE9PSByb290RWwpIC8vIFJldmVydGluZyBpdGVtIGludG8gdGhlIG9yaWdpbmFsIGxpc3RcbiAgICA6IHB1dFNvcnRhYmxlID09PSB0aGlzIHx8ICh0aGlzLmxhc3RQdXRNb2RlID0gYWN0aXZlR3JvdXAuY2hlY2tQdWxsKHRoaXMsIGFjdGl2ZVNvcnRhYmxlLCBkcmFnRWwsIGV2dCkpICYmIGdyb3VwLmNoZWNrUHV0KHRoaXMsIGFjdGl2ZVNvcnRhYmxlLCBkcmFnRWwsIGV2dCkpKSB7XG4gICAgICB2ZXJ0aWNhbCA9IHRoaXMuX2dldERpcmVjdGlvbihldnQsIHRhcmdldCkgPT09ICd2ZXJ0aWNhbCc7XG4gICAgICBkcmFnUmVjdCA9IGdldFJlY3QoZHJhZ0VsKTtcbiAgICAgIGRyYWdPdmVyRXZlbnQoJ2RyYWdPdmVyVmFsaWQnKTtcbiAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm4gY29tcGxldGVkRmlyZWQ7XG4gICAgICBpZiAocmV2ZXJ0KSB7XG4gICAgICAgIHBhcmVudEVsID0gcm9vdEVsOyAvLyBhY3R1YWxpemF0aW9uXG4gICAgICAgIGNhcHR1cmUoKTtcbiAgICAgICAgdGhpcy5faGlkZUNsb25lKCk7XG4gICAgICAgIGRyYWdPdmVyRXZlbnQoJ3JldmVydCcpO1xuICAgICAgICBpZiAoIVNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgICBpZiAobmV4dEVsKSB7XG4gICAgICAgICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgbmV4dEVsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICB9XG4gICAgICB2YXIgZWxMYXN0Q2hpbGQgPSBsYXN0Q2hpbGQoZWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICAgIGlmICghZWxMYXN0Q2hpbGQgfHwgX2dob3N0SXNMYXN0KGV2dCwgdmVydGljYWwsIHRoaXMpICYmICFlbExhc3RDaGlsZC5hbmltYXRlZCkge1xuICAgICAgICAvLyBJbnNlcnQgdG8gZW5kIG9mIGxpc3RcblxuICAgICAgICAvLyBJZiBhbHJlYWR5IGF0IGVuZCBvZiBsaXN0OiBEbyBub3QgaW5zZXJ0XG4gICAgICAgIGlmIChlbExhc3RDaGlsZCA9PT0gZHJhZ0VsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB0aGVyZSBpcyBhIGxhc3QgZWxlbWVudCwgaXQgaXMgdGhlIHRhcmdldFxuICAgICAgICBpZiAoZWxMYXN0Q2hpbGQgJiYgZWwgPT09IGV2dC50YXJnZXQpIHtcbiAgICAgICAgICB0YXJnZXQgPSBlbExhc3RDaGlsZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGFyZ2V0KSB7XG4gICAgICAgICAgdGFyZ2V0UmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX29uTW92ZShyb290RWwsIGVsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXQsIHRhcmdldFJlY3QsIGV2dCwgISF0YXJnZXQpICE9PSBmYWxzZSkge1xuICAgICAgICAgIGNhcHR1cmUoKTtcbiAgICAgICAgICBpZiAoZWxMYXN0Q2hpbGQgJiYgZWxMYXN0Q2hpbGQubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgIC8vIHRoZSBsYXN0IGRyYWdnYWJsZSBlbGVtZW50IGlzIG5vdCB0aGUgbGFzdCBub2RlXG4gICAgICAgICAgICBlbC5pbnNlcnRCZWZvcmUoZHJhZ0VsLCBlbExhc3RDaGlsZC5uZXh0U2libGluZyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHBhcmVudEVsID0gZWw7IC8vIGFjdHVhbGl6YXRpb25cblxuICAgICAgICAgIGNoYW5nZWQoKTtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGVsTGFzdENoaWxkICYmIF9naG9zdElzRmlyc3QoZXZ0LCB2ZXJ0aWNhbCwgdGhpcykpIHtcbiAgICAgICAgLy8gSW5zZXJ0IHRvIHN0YXJ0IG9mIGxpc3RcbiAgICAgICAgdmFyIGZpcnN0Q2hpbGQgPSBnZXRDaGlsZChlbCwgMCwgb3B0aW9ucywgdHJ1ZSk7XG4gICAgICAgIGlmIChmaXJzdENoaWxkID09PSBkcmFnRWwpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQgPSBmaXJzdENoaWxkO1xuICAgICAgICB0YXJnZXRSZWN0ID0gZ2V0UmVjdCh0YXJnZXQpO1xuICAgICAgICBpZiAoX29uTW92ZShyb290RWwsIGVsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXQsIHRhcmdldFJlY3QsIGV2dCwgZmFsc2UpICE9PSBmYWxzZSkge1xuICAgICAgICAgIGNhcHR1cmUoKTtcbiAgICAgICAgICBlbC5pbnNlcnRCZWZvcmUoZHJhZ0VsLCBmaXJzdENoaWxkKTtcbiAgICAgICAgICBwYXJlbnRFbCA9IGVsOyAvLyBhY3R1YWxpemF0aW9uXG5cbiAgICAgICAgICBjaGFuZ2VkKCk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0YXJnZXQucGFyZW50Tm9kZSA9PT0gZWwpIHtcbiAgICAgICAgdGFyZ2V0UmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgICAgICAgdmFyIGRpcmVjdGlvbiA9IDAsXG4gICAgICAgICAgdGFyZ2V0QmVmb3JlRmlyc3RTd2FwLFxuICAgICAgICAgIGRpZmZlcmVudExldmVsID0gZHJhZ0VsLnBhcmVudE5vZGUgIT09IGVsLFxuICAgICAgICAgIGRpZmZlcmVudFJvd0NvbCA9ICFfZHJhZ0VsSW5Sb3dDb2x1bW4oZHJhZ0VsLmFuaW1hdGVkICYmIGRyYWdFbC50b1JlY3QgfHwgZHJhZ1JlY3QsIHRhcmdldC5hbmltYXRlZCAmJiB0YXJnZXQudG9SZWN0IHx8IHRhcmdldFJlY3QsIHZlcnRpY2FsKSxcbiAgICAgICAgICBzaWRlMSA9IHZlcnRpY2FsID8gJ3RvcCcgOiAnbGVmdCcsXG4gICAgICAgICAgc2Nyb2xsZWRQYXN0VG9wID0gaXNTY3JvbGxlZFBhc3QodGFyZ2V0LCAndG9wJywgJ3RvcCcpIHx8IGlzU2Nyb2xsZWRQYXN0KGRyYWdFbCwgJ3RvcCcsICd0b3AnKSxcbiAgICAgICAgICBzY3JvbGxCZWZvcmUgPSBzY3JvbGxlZFBhc3RUb3AgPyBzY3JvbGxlZFBhc3RUb3Auc2Nyb2xsVG9wIDogdm9pZCAwO1xuICAgICAgICBpZiAobGFzdFRhcmdldCAhPT0gdGFyZ2V0KSB7XG4gICAgICAgICAgdGFyZ2V0QmVmb3JlRmlyc3RTd2FwID0gdGFyZ2V0UmVjdFtzaWRlMV07XG4gICAgICAgICAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gZmFsc2U7XG4gICAgICAgICAgaXNDaXJjdW1zdGFudGlhbEludmVydCA9ICFkaWZmZXJlbnRSb3dDb2wgJiYgb3B0aW9ucy5pbnZlcnRTd2FwIHx8IGRpZmZlcmVudExldmVsO1xuICAgICAgICB9XG4gICAgICAgIGRpcmVjdGlvbiA9IF9nZXRTd2FwRGlyZWN0aW9uKGV2dCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCwgZGlmZmVyZW50Um93Q29sID8gMSA6IG9wdGlvbnMuc3dhcFRocmVzaG9sZCwgb3B0aW9ucy5pbnZlcnRlZFN3YXBUaHJlc2hvbGQgPT0gbnVsbCA/IG9wdGlvbnMuc3dhcFRocmVzaG9sZCA6IG9wdGlvbnMuaW52ZXJ0ZWRTd2FwVGhyZXNob2xkLCBpc0NpcmN1bXN0YW50aWFsSW52ZXJ0LCBsYXN0VGFyZ2V0ID09PSB0YXJnZXQpO1xuICAgICAgICB2YXIgc2libGluZztcbiAgICAgICAgaWYgKGRpcmVjdGlvbiAhPT0gMCkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRhcmdldCBpcyBiZXNpZGUgZHJhZ0VsIGluIHJlc3BlY3RpdmUgZGlyZWN0aW9uIChpZ25vcmluZyBoaWRkZW4gZWxlbWVudHMpXG4gICAgICAgICAgdmFyIGRyYWdJbmRleCA9IGluZGV4KGRyYWdFbCk7XG4gICAgICAgICAgZG8ge1xuICAgICAgICAgICAgZHJhZ0luZGV4IC09IGRpcmVjdGlvbjtcbiAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnRFbC5jaGlsZHJlbltkcmFnSW5kZXhdO1xuICAgICAgICAgIH0gd2hpbGUgKHNpYmxpbmcgJiYgKGNzcyhzaWJsaW5nLCAnZGlzcGxheScpID09PSAnbm9uZScgfHwgc2libGluZyA9PT0gZ2hvc3RFbCkpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGRyYWdFbCBpcyBhbHJlYWR5IGJlc2lkZSB0YXJnZXQ6IERvIG5vdCBpbnNlcnRcbiAgICAgICAgaWYgKGRpcmVjdGlvbiA9PT0gMCB8fCBzaWJsaW5nID09PSB0YXJnZXQpIHtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICBsYXN0VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICBsYXN0RGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuICAgICAgICB2YXIgbmV4dFNpYmxpbmcgPSB0YXJnZXQubmV4dEVsZW1lbnRTaWJsaW5nLFxuICAgICAgICAgIGFmdGVyID0gZmFsc2U7XG4gICAgICAgIGFmdGVyID0gZGlyZWN0aW9uID09PSAxO1xuICAgICAgICB2YXIgbW92ZVZlY3RvciA9IF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCBldnQsIGFmdGVyKTtcbiAgICAgICAgaWYgKG1vdmVWZWN0b3IgIT09IGZhbHNlKSB7XG4gICAgICAgICAgaWYgKG1vdmVWZWN0b3IgPT09IDEgfHwgbW92ZVZlY3RvciA9PT0gLTEpIHtcbiAgICAgICAgICAgIGFmdGVyID0gbW92ZVZlY3RvciA9PT0gMTtcbiAgICAgICAgICB9XG4gICAgICAgICAgX3NpbGVudCA9IHRydWU7XG4gICAgICAgICAgc2V0VGltZW91dChfdW5zaWxlbnQsIDMwKTtcbiAgICAgICAgICBjYXB0dXJlKCk7XG4gICAgICAgICAgaWYgKGFmdGVyICYmICFuZXh0U2libGluZykge1xuICAgICAgICAgICAgZWwuYXBwZW5kQ2hpbGQoZHJhZ0VsKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgYWZ0ZXIgPyBuZXh0U2libGluZyA6IHRhcmdldCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVW5kbyBjaHJvbWUncyBzY3JvbGwgYWRqdXN0bWVudCAoaGFzIG5vIGVmZmVjdCBvbiBvdGhlciBicm93c2VycylcbiAgICAgICAgICBpZiAoc2Nyb2xsZWRQYXN0VG9wKSB7XG4gICAgICAgICAgICBzY3JvbGxCeShzY3JvbGxlZFBhc3RUb3AsIDAsIHNjcm9sbEJlZm9yZSAtIHNjcm9sbGVkUGFzdFRvcC5zY3JvbGxUb3ApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJlbnRFbCA9IGRyYWdFbC5wYXJlbnROb2RlOyAvLyBhY3R1YWxpemF0aW9uXG5cbiAgICAgICAgICAvLyBtdXN0IGJlIGRvbmUgYmVmb3JlIGFuaW1hdGlvblxuICAgICAgICAgIGlmICh0YXJnZXRCZWZvcmVGaXJzdFN3YXAgIT09IHVuZGVmaW5lZCAmJiAhaXNDaXJjdW1zdGFudGlhbEludmVydCkge1xuICAgICAgICAgICAgdGFyZ2V0TW92ZURpc3RhbmNlID0gTWF0aC5hYnModGFyZ2V0QmVmb3JlRmlyc3RTd2FwIC0gZ2V0UmVjdCh0YXJnZXQpW3NpZGUxXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNoYW5nZWQoKTtcbiAgICAgICAgICByZXR1cm4gY29tcGxldGVkKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZWwuY29udGFpbnMoZHJhZ0VsKSkge1xuICAgICAgICByZXR1cm4gY29tcGxldGVkKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBfaWdub3JlV2hpbGVBbmltYXRpbmc6IG51bGwsXG4gIF9vZmZNb3ZlRXZlbnRzOiBmdW5jdGlvbiBfb2ZmTW92ZUV2ZW50cygpIHtcbiAgICBvZmYoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgIG9mZihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgIG9mZihkb2N1bWVudCwgJ2RyYWdvdmVyJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgIG9mZihkb2N1bWVudCwgJ21vdXNlbW92ZScsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICBvZmYoZG9jdW1lbnQsICd0b3VjaG1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gIH0sXG4gIF9vZmZVcEV2ZW50czogZnVuY3Rpb24gX29mZlVwRXZlbnRzKCkge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gdGhpcy5lbC5vd25lckRvY3VtZW50O1xuICAgIG9mZihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIHRoaXMuX29uRHJvcCk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX29uRHJvcCk7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihkb2N1bWVudCwgJ3NlbGVjdHN0YXJ0JywgdGhpcyk7XG4gIH0sXG4gIF9vbkRyb3A6IGZ1bmN0aW9uIF9vbkRyb3AoIC8qKkV2ZW50Ki9ldnQpIHtcbiAgICB2YXIgZWwgPSB0aGlzLmVsLFxuICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuICAgIC8vIEdldCB0aGUgaW5kZXggb2YgdGhlIGRyYWdnZWQgZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudFxuICAgIG5ld0luZGV4ID0gaW5kZXgoZHJhZ0VsKTtcbiAgICBuZXdEcmFnZ2FibGVJbmRleCA9IGluZGV4KGRyYWdFbCwgb3B0aW9ucy5kcmFnZ2FibGUpO1xuICAgIHBsdWdpbkV2ZW50KCdkcm9wJywgdGhpcywge1xuICAgICAgZXZ0OiBldnRcbiAgICB9KTtcbiAgICBwYXJlbnRFbCA9IGRyYWdFbCAmJiBkcmFnRWwucGFyZW50Tm9kZTtcblxuICAgIC8vIEdldCBhZ2FpbiBhZnRlciBwbHVnaW4gZXZlbnRcbiAgICBuZXdJbmRleCA9IGluZGV4KGRyYWdFbCk7XG4gICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgdGhpcy5fbnVsbGluZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBhd2FpdGluZ0RyYWdTdGFydGVkID0gZmFsc2U7XG4gICAgaXNDaXJjdW1zdGFudGlhbEludmVydCA9IGZhbHNlO1xuICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IGZhbHNlO1xuICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fbG9vcElkKTtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5fZHJhZ1N0YXJ0VGltZXIpO1xuICAgIF9jYW5jZWxOZXh0VGljayh0aGlzLmNsb25lSWQpO1xuICAgIF9jYW5jZWxOZXh0VGljayh0aGlzLl9kcmFnU3RhcnRJZCk7XG5cbiAgICAvLyBVbmJpbmQgZXZlbnRzXG4gICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICBvZmYoZG9jdW1lbnQsICdkcm9wJywgdGhpcyk7XG4gICAgICBvZmYoZWwsICdkcmFnc3RhcnQnLCB0aGlzLl9vbkRyYWdTdGFydCk7XG4gICAgfVxuICAgIHRoaXMuX29mZk1vdmVFdmVudHMoKTtcbiAgICB0aGlzLl9vZmZVcEV2ZW50cygpO1xuICAgIGlmIChTYWZhcmkpIHtcbiAgICAgIGNzcyhkb2N1bWVudC5ib2R5LCAndXNlci1zZWxlY3QnLCAnJyk7XG4gICAgfVxuICAgIGNzcyhkcmFnRWwsICd0cmFuc2Zvcm0nLCAnJyk7XG4gICAgaWYgKGV2dCkge1xuICAgICAgaWYgKG1vdmVkKSB7XG4gICAgICAgIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAhb3B0aW9ucy5kcm9wQnViYmxlICYmIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICAgIGdob3N0RWwgJiYgZ2hvc3RFbC5wYXJlbnROb2RlICYmIGdob3N0RWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChnaG9zdEVsKTtcbiAgICAgIGlmIChyb290RWwgPT09IHBhcmVudEVsIHx8IHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlICE9PSAnY2xvbmUnKSB7XG4gICAgICAgIC8vIFJlbW92ZSBjbG9uZShzKVxuICAgICAgICBjbG9uZUVsICYmIGNsb25lRWwucGFyZW50Tm9kZSAmJiBjbG9uZUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmVFbCk7XG4gICAgICB9XG4gICAgICBpZiAoZHJhZ0VsKSB7XG4gICAgICAgIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICAgIG9mZihkcmFnRWwsICdkcmFnZW5kJywgdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgX2Rpc2FibGVEcmFnZ2FibGUoZHJhZ0VsKTtcbiAgICAgICAgZHJhZ0VsLnN0eWxlWyd3aWxsLWNoYW5nZSddID0gJyc7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGNsYXNzZXNcbiAgICAgICAgLy8gZ2hvc3RDbGFzcyBpcyBhZGRlZCBpbiBkcmFnU3RhcnRlZFxuICAgICAgICBpZiAobW92ZWQgJiYgIWF3YWl0aW5nRHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIHB1dFNvcnRhYmxlID8gcHV0U29ydGFibGUub3B0aW9ucy5naG9zdENsYXNzIDogdGhpcy5vcHRpb25zLmdob3N0Q2xhc3MsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIHRoaXMub3B0aW9ucy5jaG9zZW5DbGFzcywgZmFsc2UpO1xuXG4gICAgICAgIC8vIERyYWcgc3RvcCBldmVudFxuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgbmFtZTogJ3VuY2hvb3NlJyxcbiAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICBuZXdJbmRleDogbnVsbCxcbiAgICAgICAgICBuZXdEcmFnZ2FibGVJbmRleDogbnVsbCxcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyb290RWwgIT09IHBhcmVudEVsKSB7XG4gICAgICAgICAgaWYgKG5ld0luZGV4ID49IDApIHtcbiAgICAgICAgICAgIC8vIEFkZCBldmVudFxuICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICByb290RWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBuYW1lOiAnYWRkJyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIGZyb21FbDogcm9vdEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBSZW1vdmUgZXZlbnRcbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgIG5hbWU6ICdyZW1vdmUnLFxuICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gZHJhZyBmcm9tIG9uZSBsaXN0IGFuZCBkcm9wIGludG8gYW5vdGhlclxuICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICByb290RWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBuYW1lOiAnc29ydCcsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBmcm9tRWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgIG5hbWU6ICdzb3J0JyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLnNhdmUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAobmV3SW5kZXggIT09IG9sZEluZGV4KSB7XG4gICAgICAgICAgICBpZiAobmV3SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAvLyBkcmFnICYgZHJvcCB3aXRoaW4gdGhlIHNhbWUgbGlzdFxuICAgICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmFtZTogJ3VwZGF0ZScsXG4gICAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgc29ydGFibGU6IHRoaXMsXG4gICAgICAgICAgICAgICAgbmFtZTogJ3NvcnQnLFxuICAgICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFNvcnRhYmxlLmFjdGl2ZSkge1xuICAgICAgICAgIC8qIGpzaGludCBlcW51bGw6dHJ1ZSAqL1xuICAgICAgICAgIGlmIChuZXdJbmRleCA9PSBudWxsIHx8IG5ld0luZGV4ID09PSAtMSkge1xuICAgICAgICAgICAgbmV3SW5kZXggPSBvbGRJbmRleDtcbiAgICAgICAgICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXg7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgbmFtZTogJ2VuZCcsXG4gICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gU2F2ZSBzb3J0aW5nXG4gICAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fbnVsbGluZygpO1xuICB9LFxuICBfbnVsbGluZzogZnVuY3Rpb24gX251bGxpbmcoKSB7XG4gICAgcGx1Z2luRXZlbnQoJ251bGxpbmcnLCB0aGlzKTtcbiAgICByb290RWwgPSBkcmFnRWwgPSBwYXJlbnRFbCA9IGdob3N0RWwgPSBuZXh0RWwgPSBjbG9uZUVsID0gbGFzdERvd25FbCA9IGNsb25lSGlkZGVuID0gdGFwRXZ0ID0gdG91Y2hFdnQgPSBtb3ZlZCA9IG5ld0luZGV4ID0gbmV3RHJhZ2dhYmxlSW5kZXggPSBvbGRJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4ID0gbGFzdFRhcmdldCA9IGxhc3REaXJlY3Rpb24gPSBwdXRTb3J0YWJsZSA9IGFjdGl2ZUdyb3VwID0gU29ydGFibGUuZHJhZ2dlZCA9IFNvcnRhYmxlLmdob3N0ID0gU29ydGFibGUuY2xvbmUgPSBTb3J0YWJsZS5hY3RpdmUgPSBudWxsO1xuICAgIHNhdmVkSW5wdXRDaGVja2VkLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICBlbC5jaGVja2VkID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBzYXZlZElucHV0Q2hlY2tlZC5sZW5ndGggPSBsYXN0RHggPSBsYXN0RHkgPSAwO1xuICB9LFxuICBoYW5kbGVFdmVudDogZnVuY3Rpb24gaGFuZGxlRXZlbnQoIC8qKkV2ZW50Ki9ldnQpIHtcbiAgICBzd2l0Y2ggKGV2dC50eXBlKSB7XG4gICAgICBjYXNlICdkcm9wJzpcbiAgICAgIGNhc2UgJ2RyYWdlbmQnOlxuICAgICAgICB0aGlzLl9vbkRyb3AoZXZ0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgICAgY2FzZSAnZHJhZ292ZXInOlxuICAgICAgICBpZiAoZHJhZ0VsKSB7XG4gICAgICAgICAgdGhpcy5fb25EcmFnT3ZlcihldnQpO1xuICAgICAgICAgIF9nbG9iYWxEcmFnT3ZlcihldnQpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc2VsZWN0c3RhcnQnOlxuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9LFxuICAvKipcclxuICAgKiBTZXJpYWxpemVzIHRoZSBpdGVtIGludG8gYW4gYXJyYXkgb2Ygc3RyaW5nLlxyXG4gICAqIEByZXR1cm5zIHtTdHJpbmdbXX1cclxuICAgKi9cbiAgdG9BcnJheTogZnVuY3Rpb24gdG9BcnJheSgpIHtcbiAgICB2YXIgb3JkZXIgPSBbXSxcbiAgICAgIGVsLFxuICAgICAgY2hpbGRyZW4gPSB0aGlzLmVsLmNoaWxkcmVuLFxuICAgICAgaSA9IDAsXG4gICAgICBuID0gY2hpbGRyZW4ubGVuZ3RoLFxuICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBmb3IgKDsgaSA8IG47IGkrKykge1xuICAgICAgZWwgPSBjaGlsZHJlbltpXTtcbiAgICAgIGlmIChjbG9zZXN0KGVsLCBvcHRpb25zLmRyYWdnYWJsZSwgdGhpcy5lbCwgZmFsc2UpKSB7XG4gICAgICAgIG9yZGVyLnB1c2goZWwuZ2V0QXR0cmlidXRlKG9wdGlvbnMuZGF0YUlkQXR0cikgfHwgX2dlbmVyYXRlSWQoZWwpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG9yZGVyO1xuICB9LFxuICAvKipcclxuICAgKiBTb3J0cyB0aGUgZWxlbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBhcnJheS5cclxuICAgKiBAcGFyYW0gIHtTdHJpbmdbXX0gIG9yZGVyICBvcmRlciBvZiB0aGUgaXRlbXNcclxuICAgKi9cbiAgc29ydDogZnVuY3Rpb24gc29ydChvcmRlciwgdXNlQW5pbWF0aW9uKSB7XG4gICAgdmFyIGl0ZW1zID0ge30sXG4gICAgICByb290RWwgPSB0aGlzLmVsO1xuICAgIHRoaXMudG9BcnJheSgpLmZvckVhY2goZnVuY3Rpb24gKGlkLCBpKSB7XG4gICAgICB2YXIgZWwgPSByb290RWwuY2hpbGRyZW5baV07XG4gICAgICBpZiAoY2xvc2VzdChlbCwgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSwgcm9vdEVsLCBmYWxzZSkpIHtcbiAgICAgICAgaXRlbXNbaWRdID0gZWw7XG4gICAgICB9XG4gICAgfSwgdGhpcyk7XG4gICAgdXNlQW5pbWF0aW9uICYmIHRoaXMuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgb3JkZXIuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGlmIChpdGVtc1tpZF0pIHtcbiAgICAgICAgcm9vdEVsLnJlbW92ZUNoaWxkKGl0ZW1zW2lkXSk7XG4gICAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChpdGVtc1tpZF0pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHVzZUFuaW1hdGlvbiAmJiB0aGlzLmFuaW1hdGVBbGwoKTtcbiAgfSxcbiAgLyoqXHJcbiAgICogU2F2ZSB0aGUgY3VycmVudCBzb3J0aW5nXHJcbiAgICovXG4gIHNhdmU6IGZ1bmN0aW9uIHNhdmUoKSB7XG4gICAgdmFyIHN0b3JlID0gdGhpcy5vcHRpb25zLnN0b3JlO1xuICAgIHN0b3JlICYmIHN0b3JlLnNldCAmJiBzdG9yZS5zZXQodGhpcyk7XG4gIH0sXG4gIC8qKlxyXG4gICAqIEZvciBlYWNoIGVsZW1lbnQgaW4gdGhlIHNldCwgZ2V0IHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IgYnkgdGVzdGluZyB0aGUgZWxlbWVudCBpdHNlbGYgYW5kIHRyYXZlcnNpbmcgdXAgdGhyb3VnaCBpdHMgYW5jZXN0b3JzIGluIHRoZSBET00gdHJlZS5cclxuICAgKiBAcGFyYW0gICB7SFRNTEVsZW1lbnR9ICBlbFxyXG4gICAqIEBwYXJhbSAgIHtTdHJpbmd9ICAgICAgIFtzZWxlY3Rvcl0gIGRlZmF1bHQ6IGBvcHRpb25zLmRyYWdnYWJsZWBcclxuICAgKiBAcmV0dXJucyB7SFRNTEVsZW1lbnR8bnVsbH1cclxuICAgKi9cbiAgY2xvc2VzdDogZnVuY3Rpb24gY2xvc2VzdCQxKGVsLCBzZWxlY3Rvcikge1xuICAgIHJldHVybiBjbG9zZXN0KGVsLCBzZWxlY3RvciB8fCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLmVsLCBmYWxzZSk7XG4gIH0sXG4gIC8qKlxyXG4gICAqIFNldC9nZXQgb3B0aW9uXHJcbiAgICogQHBhcmFtICAge3N0cmluZ30gbmFtZVxyXG4gICAqIEBwYXJhbSAgIHsqfSAgICAgIFt2YWx1ZV1cclxuICAgKiBAcmV0dXJucyB7Kn1cclxuICAgKi9cbiAgb3B0aW9uOiBmdW5jdGlvbiBvcHRpb24obmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAodmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIG9wdGlvbnNbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBtb2RpZmllZFZhbHVlID0gUGx1Z2luTWFuYWdlci5tb2RpZnlPcHRpb24odGhpcywgbmFtZSwgdmFsdWUpO1xuICAgICAgaWYgKHR5cGVvZiBtb2RpZmllZFZhbHVlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBvcHRpb25zW25hbWVdID0gbW9kaWZpZWRWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9wdGlvbnNbbmFtZV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lID09PSAnZ3JvdXAnKSB7XG4gICAgICAgIF9wcmVwYXJlR3JvdXAob3B0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICAvKipcclxuICAgKiBEZXN0cm95XHJcbiAgICovXG4gIGRlc3Ryb3k6IGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgcGx1Z2luRXZlbnQoJ2Rlc3Ryb3knLCB0aGlzKTtcbiAgICB2YXIgZWwgPSB0aGlzLmVsO1xuICAgIGVsW2V4cGFuZG9dID0gbnVsbDtcbiAgICBvZmYoZWwsICdtb3VzZWRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgICBvZmYoZWwsICd0b3VjaHN0YXJ0JywgdGhpcy5fb25UYXBTdGFydCk7XG4gICAgb2ZmKGVsLCAncG9pbnRlcmRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgIG9mZihlbCwgJ2RyYWdvdmVyJywgdGhpcyk7XG4gICAgICBvZmYoZWwsICdkcmFnZW50ZXInLCB0aGlzKTtcbiAgICB9XG4gICAgLy8gUmVtb3ZlIGRyYWdnYWJsZSBhdHRyaWJ1dGVzXG4gICAgQXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChlbC5xdWVyeVNlbGVjdG9yQWxsKCdbZHJhZ2dhYmxlXScpLCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ2dhYmxlJyk7XG4gICAgfSk7XG4gICAgdGhpcy5fb25Ecm9wKCk7XG4gICAgdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCk7XG4gICAgc29ydGFibGVzLnNwbGljZShzb3J0YWJsZXMuaW5kZXhPZih0aGlzLmVsKSwgMSk7XG4gICAgdGhpcy5lbCA9IGVsID0gbnVsbDtcbiAgfSxcbiAgX2hpZGVDbG9uZTogZnVuY3Rpb24gX2hpZGVDbG9uZSgpIHtcbiAgICBpZiAoIWNsb25lSGlkZGVuKSB7XG4gICAgICBwbHVnaW5FdmVudCgnaGlkZUNsb25lJywgdGhpcyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuO1xuICAgICAgY3NzKGNsb25lRWwsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUgJiYgY2xvbmVFbC5wYXJlbnROb2RlKSB7XG4gICAgICAgIGNsb25lRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZUVsKTtcbiAgICAgIH1cbiAgICAgIGNsb25lSGlkZGVuID0gdHJ1ZTtcbiAgICB9XG4gIH0sXG4gIF9zaG93Q2xvbmU6IGZ1bmN0aW9uIF9zaG93Q2xvbmUocHV0U29ydGFibGUpIHtcbiAgICBpZiAocHV0U29ydGFibGUubGFzdFB1dE1vZGUgIT09ICdjbG9uZScpIHtcbiAgICAgIHRoaXMuX2hpZGVDbG9uZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoY2xvbmVIaWRkZW4pIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdzaG93Q2xvbmUnLCB0aGlzKTtcbiAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm47XG5cbiAgICAgIC8vIHNob3cgY2xvbmUgYXQgZHJhZ0VsIG9yIG9yaWdpbmFsIHBvc2l0aW9uXG4gICAgICBpZiAoZHJhZ0VsLnBhcmVudE5vZGUgPT0gcm9vdEVsICYmICF0aGlzLm9wdGlvbnMuZ3JvdXAucmV2ZXJ0Q2xvbmUpIHtcbiAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShjbG9uZUVsLCBkcmFnRWwpO1xuICAgICAgfSBlbHNlIGlmIChuZXh0RWwpIHtcbiAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShjbG9uZUVsLCBuZXh0RWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKGNsb25lRWwpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3B0aW9ucy5ncm91cC5yZXZlcnRDbG9uZSkge1xuICAgICAgICB0aGlzLmFuaW1hdGUoZHJhZ0VsLCBjbG9uZUVsKTtcbiAgICAgIH1cbiAgICAgIGNzcyhjbG9uZUVsLCAnZGlzcGxheScsICcnKTtcbiAgICAgIGNsb25lSGlkZGVuID0gZmFsc2U7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gX2dsb2JhbERyYWdPdmVyKCAvKipFdmVudCovZXZ0KSB7XG4gIGlmIChldnQuZGF0YVRyYW5zZmVyKSB7XG4gICAgZXZ0LmRhdGFUcmFuc2Zlci5kcm9wRWZmZWN0ID0gJ21vdmUnO1xuICB9XG4gIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xufVxuZnVuY3Rpb24gX29uTW92ZShmcm9tRWwsIHRvRWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldEVsLCB0YXJnZXRSZWN0LCBvcmlnaW5hbEV2ZW50LCB3aWxsSW5zZXJ0QWZ0ZXIpIHtcbiAgdmFyIGV2dCxcbiAgICBzb3J0YWJsZSA9IGZyb21FbFtleHBhbmRvXSxcbiAgICBvbk1vdmVGbiA9IHNvcnRhYmxlLm9wdGlvbnMub25Nb3ZlLFxuICAgIHJldFZhbDtcbiAgLy8gU3VwcG9ydCBmb3IgbmV3IEN1c3RvbUV2ZW50IGZlYXR1cmVcbiAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiAhSUUxMU9yTGVzcyAmJiAhRWRnZSkge1xuICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudCgnbW92ZScsIHtcbiAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgZXZ0ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZ0LmluaXRFdmVudCgnbW92ZScsIHRydWUsIHRydWUpO1xuICB9XG4gIGV2dC50byA9IHRvRWw7XG4gIGV2dC5mcm9tID0gZnJvbUVsO1xuICBldnQuZHJhZ2dlZCA9IGRyYWdFbDtcbiAgZXZ0LmRyYWdnZWRSZWN0ID0gZHJhZ1JlY3Q7XG4gIGV2dC5yZWxhdGVkID0gdGFyZ2V0RWwgfHwgdG9FbDtcbiAgZXZ0LnJlbGF0ZWRSZWN0ID0gdGFyZ2V0UmVjdCB8fCBnZXRSZWN0KHRvRWwpO1xuICBldnQud2lsbEluc2VydEFmdGVyID0gd2lsbEluc2VydEFmdGVyO1xuICBldnQub3JpZ2luYWxFdmVudCA9IG9yaWdpbmFsRXZlbnQ7XG4gIGZyb21FbC5kaXNwYXRjaEV2ZW50KGV2dCk7XG4gIGlmIChvbk1vdmVGbikge1xuICAgIHJldFZhbCA9IG9uTW92ZUZuLmNhbGwoc29ydGFibGUsIGV2dCwgb3JpZ2luYWxFdmVudCk7XG4gIH1cbiAgcmV0dXJuIHJldFZhbDtcbn1cbmZ1bmN0aW9uIF9kaXNhYmxlRHJhZ2dhYmxlKGVsKSB7XG4gIGVsLmRyYWdnYWJsZSA9IGZhbHNlO1xufVxuZnVuY3Rpb24gX3Vuc2lsZW50KCkge1xuICBfc2lsZW50ID0gZmFsc2U7XG59XG5mdW5jdGlvbiBfZ2hvc3RJc0ZpcnN0KGV2dCwgdmVydGljYWwsIHNvcnRhYmxlKSB7XG4gIHZhciBmaXJzdEVsUmVjdCA9IGdldFJlY3QoZ2V0Q2hpbGQoc29ydGFibGUuZWwsIDAsIHNvcnRhYmxlLm9wdGlvbnMsIHRydWUpKTtcbiAgdmFyIGNoaWxkQ29udGFpbmluZ1JlY3QgPSBnZXRDaGlsZENvbnRhaW5pbmdSZWN0RnJvbUVsZW1lbnQoc29ydGFibGUuZWwsIHNvcnRhYmxlLm9wdGlvbnMsIGdob3N0RWwpO1xuICB2YXIgc3BhY2VyID0gMTA7XG4gIHJldHVybiB2ZXJ0aWNhbCA/IGV2dC5jbGllbnRYIDwgY2hpbGRDb250YWluaW5nUmVjdC5sZWZ0IC0gc3BhY2VyIHx8IGV2dC5jbGllbnRZIDwgZmlyc3RFbFJlY3QudG9wICYmIGV2dC5jbGllbnRYIDwgZmlyc3RFbFJlY3QucmlnaHQgOiBldnQuY2xpZW50WSA8IGNoaWxkQ29udGFpbmluZ1JlY3QudG9wIC0gc3BhY2VyIHx8IGV2dC5jbGllbnRZIDwgZmlyc3RFbFJlY3QuYm90dG9tICYmIGV2dC5jbGllbnRYIDwgZmlyc3RFbFJlY3QubGVmdDtcbn1cbmZ1bmN0aW9uIF9naG9zdElzTGFzdChldnQsIHZlcnRpY2FsLCBzb3J0YWJsZSkge1xuICB2YXIgbGFzdEVsUmVjdCA9IGdldFJlY3QobGFzdENoaWxkKHNvcnRhYmxlLmVsLCBzb3J0YWJsZS5vcHRpb25zLmRyYWdnYWJsZSkpO1xuICB2YXIgY2hpbGRDb250YWluaW5nUmVjdCA9IGdldENoaWxkQ29udGFpbmluZ1JlY3RGcm9tRWxlbWVudChzb3J0YWJsZS5lbCwgc29ydGFibGUub3B0aW9ucywgZ2hvc3RFbCk7XG4gIHZhciBzcGFjZXIgPSAxMDtcbiAgcmV0dXJuIHZlcnRpY2FsID8gZXZ0LmNsaWVudFggPiBjaGlsZENvbnRhaW5pbmdSZWN0LnJpZ2h0ICsgc3BhY2VyIHx8IGV2dC5jbGllbnRZID4gbGFzdEVsUmVjdC5ib3R0b20gJiYgZXZ0LmNsaWVudFggPiBsYXN0RWxSZWN0LmxlZnQgOiBldnQuY2xpZW50WSA+IGNoaWxkQ29udGFpbmluZ1JlY3QuYm90dG9tICsgc3BhY2VyIHx8IGV2dC5jbGllbnRYID4gbGFzdEVsUmVjdC5yaWdodCAmJiBldnQuY2xpZW50WSA+IGxhc3RFbFJlY3QudG9wO1xufVxuZnVuY3Rpb24gX2dldFN3YXBEaXJlY3Rpb24oZXZ0LCB0YXJnZXQsIHRhcmdldFJlY3QsIHZlcnRpY2FsLCBzd2FwVGhyZXNob2xkLCBpbnZlcnRlZFN3YXBUaHJlc2hvbGQsIGludmVydFN3YXAsIGlzTGFzdFRhcmdldCkge1xuICB2YXIgbW91c2VPbkF4aXMgPSB2ZXJ0aWNhbCA/IGV2dC5jbGllbnRZIDogZXZ0LmNsaWVudFgsXG4gICAgdGFyZ2V0TGVuZ3RoID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LmhlaWdodCA6IHRhcmdldFJlY3Qud2lkdGgsXG4gICAgdGFyZ2V0UzEgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QudG9wIDogdGFyZ2V0UmVjdC5sZWZ0LFxuICAgIHRhcmdldFMyID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LmJvdHRvbSA6IHRhcmdldFJlY3QucmlnaHQsXG4gICAgaW52ZXJ0ID0gZmFsc2U7XG4gIGlmICghaW52ZXJ0U3dhcCkge1xuICAgIC8vIE5ldmVyIGludmVydCBvciBjcmVhdGUgZHJhZ0VsIHNoYWRvdyB3aGVuIHRhcmdldCBtb3ZlbWVuZXQgY2F1c2VzIG1vdXNlIHRvIG1vdmUgcGFzdCB0aGUgZW5kIG9mIHJlZ3VsYXIgc3dhcFRocmVzaG9sZFxuICAgIGlmIChpc0xhc3RUYXJnZXQgJiYgdGFyZ2V0TW92ZURpc3RhbmNlIDwgdGFyZ2V0TGVuZ3RoICogc3dhcFRocmVzaG9sZCkge1xuICAgICAgLy8gbXVsdGlwbGllZCBvbmx5IGJ5IHN3YXBUaHJlc2hvbGQgYmVjYXVzZSBtb3VzZSB3aWxsIGFscmVhZHkgYmUgaW5zaWRlIHRhcmdldCBieSAoMSAtIHRocmVzaG9sZCkgKiB0YXJnZXRMZW5ndGggLyAyXG4gICAgICAvLyBjaGVjayBpZiBwYXN0IGZpcnN0IGludmVydCB0aHJlc2hvbGQgb24gc2lkZSBvcHBvc2l0ZSBvZiBsYXN0RGlyZWN0aW9uXG4gICAgICBpZiAoIXBhc3RGaXJzdEludmVydFRocmVzaCAmJiAobGFzdERpcmVjdGlvbiA9PT0gMSA/IG1vdXNlT25BeGlzID4gdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyIDogbW91c2VPbkF4aXMgPCB0YXJnZXRTMiAtIHRhcmdldExlbmd0aCAqIGludmVydGVkU3dhcFRocmVzaG9sZCAvIDIpKSB7XG4gICAgICAgIC8vIHBhc3QgZmlyc3QgaW52ZXJ0IHRocmVzaG9sZCwgZG8gbm90IHJlc3RyaWN0IGludmVydGVkIHRocmVzaG9sZCB0byBkcmFnRWwgc2hhZG93XG4gICAgICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoIXBhc3RGaXJzdEludmVydFRocmVzaCkge1xuICAgICAgICAvLyBkcmFnRWwgc2hhZG93ICh0YXJnZXQgbW92ZSBkaXN0YW5jZSBzaGFkb3cpXG4gICAgICAgIGlmIChsYXN0RGlyZWN0aW9uID09PSAxID8gbW91c2VPbkF4aXMgPCB0YXJnZXRTMSArIHRhcmdldE1vdmVEaXN0YW5jZSAvLyBvdmVyIGRyYWdFbCBzaGFkb3dcbiAgICAgICAgOiBtb3VzZU9uQXhpcyA+IHRhcmdldFMyIC0gdGFyZ2V0TW92ZURpc3RhbmNlKSB7XG4gICAgICAgICAgcmV0dXJuIC1sYXN0RGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnZlcnQgPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBSZWd1bGFyXG4gICAgICBpZiAobW91c2VPbkF4aXMgPiB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAqICgxIC0gc3dhcFRocmVzaG9sZCkgLyAyICYmIG1vdXNlT25BeGlzIDwgdGFyZ2V0UzIgLSB0YXJnZXRMZW5ndGggKiAoMSAtIHN3YXBUaHJlc2hvbGQpIC8gMikge1xuICAgICAgICByZXR1cm4gX2dldEluc2VydERpcmVjdGlvbih0YXJnZXQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpbnZlcnQgPSBpbnZlcnQgfHwgaW52ZXJ0U3dhcDtcbiAgaWYgKGludmVydCkge1xuICAgIC8vIEludmVydCBvZiByZWd1bGFyXG4gICAgaWYgKG1vdXNlT25BeGlzIDwgdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyIHx8IG1vdXNlT25BeGlzID4gdGFyZ2V0UzIgLSB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyKSB7XG4gICAgICByZXR1cm4gbW91c2VPbkF4aXMgPiB0YXJnZXRTMSArIHRhcmdldExlbmd0aCAvIDIgPyAxIDogLTE7XG4gICAgfVxuICB9XG4gIHJldHVybiAwO1xufVxuXG4vKipcclxuICogR2V0cyB0aGUgZGlyZWN0aW9uIGRyYWdFbCBtdXN0IGJlIHN3YXBwZWQgcmVsYXRpdmUgdG8gdGFyZ2V0IGluIG9yZGVyIHRvIG1ha2UgaXRcclxuICogc2VlbSB0aGF0IGRyYWdFbCBoYXMgYmVlbiBcImluc2VydGVkXCIgaW50byB0aGF0IGVsZW1lbnQncyBwb3NpdGlvblxyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gdGFyZ2V0ICAgICAgIFRoZSB0YXJnZXQgd2hvc2UgcG9zaXRpb24gZHJhZ0VsIGlzIGJlaW5nIGluc2VydGVkIGF0XHJcbiAqIEByZXR1cm4ge051bWJlcn0gICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uIGRyYWdFbCBtdXN0IGJlIHN3YXBwZWRcclxuICovXG5mdW5jdGlvbiBfZ2V0SW5zZXJ0RGlyZWN0aW9uKHRhcmdldCkge1xuICBpZiAoaW5kZXgoZHJhZ0VsKSA8IGluZGV4KHRhcmdldCkpIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn1cblxuLyoqXHJcbiAqIEdlbmVyYXRlIGlkXHJcbiAqIEBwYXJhbSAgIHtIVE1MRWxlbWVudH0gZWxcclxuICogQHJldHVybnMge1N0cmluZ31cclxuICogQHByaXZhdGVcclxuICovXG5mdW5jdGlvbiBfZ2VuZXJhdGVJZChlbCkge1xuICB2YXIgc3RyID0gZWwudGFnTmFtZSArIGVsLmNsYXNzTmFtZSArIGVsLnNyYyArIGVsLmhyZWYgKyBlbC50ZXh0Q29udGVudCxcbiAgICBpID0gc3RyLmxlbmd0aCxcbiAgICBzdW0gPSAwO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgc3VtICs9IHN0ci5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBzdW0udG9TdHJpbmcoMzYpO1xufVxuZnVuY3Rpb24gX3NhdmVJbnB1dENoZWNrZWRTdGF0ZShyb290KSB7XG4gIHNhdmVkSW5wdXRDaGVja2VkLmxlbmd0aCA9IDA7XG4gIHZhciBpbnB1dHMgPSByb290LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpO1xuICB2YXIgaWR4ID0gaW5wdXRzLmxlbmd0aDtcbiAgd2hpbGUgKGlkeC0tKSB7XG4gICAgdmFyIGVsID0gaW5wdXRzW2lkeF07XG4gICAgZWwuY2hlY2tlZCAmJiBzYXZlZElucHV0Q2hlY2tlZC5wdXNoKGVsKTtcbiAgfVxufVxuZnVuY3Rpb24gX25leHRUaWNrKGZuKSB7XG4gIHJldHVybiBzZXRUaW1lb3V0KGZuLCAwKTtcbn1cbmZ1bmN0aW9uIF9jYW5jZWxOZXh0VGljayhpZCkge1xuICByZXR1cm4gY2xlYXJUaW1lb3V0KGlkKTtcbn1cblxuLy8gRml4ZWQgIzk3MzpcbmlmIChkb2N1bWVudEV4aXN0cykge1xuICBvbihkb2N1bWVudCwgJ3RvdWNobW92ZScsIGZ1bmN0aW9uIChldnQpIHtcbiAgICBpZiAoKFNvcnRhYmxlLmFjdGl2ZSB8fCBhd2FpdGluZ0RyYWdTdGFydGVkKSAmJiBldnQuY2FuY2VsYWJsZSkge1xuICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9KTtcbn1cblxuLy8gRXhwb3J0IHV0aWxzXG5Tb3J0YWJsZS51dGlscyA9IHtcbiAgb246IG9uLFxuICBvZmY6IG9mZixcbiAgY3NzOiBjc3MsXG4gIGZpbmQ6IGZpbmQsXG4gIGlzOiBmdW5jdGlvbiBpcyhlbCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gISFjbG9zZXN0KGVsLCBzZWxlY3RvciwgZWwsIGZhbHNlKTtcbiAgfSxcbiAgZXh0ZW5kOiBleHRlbmQsXG4gIHRocm90dGxlOiB0aHJvdHRsZSxcbiAgY2xvc2VzdDogY2xvc2VzdCxcbiAgdG9nZ2xlQ2xhc3M6IHRvZ2dsZUNsYXNzLFxuICBjbG9uZTogY2xvbmUsXG4gIGluZGV4OiBpbmRleCxcbiAgbmV4dFRpY2s6IF9uZXh0VGljayxcbiAgY2FuY2VsTmV4dFRpY2s6IF9jYW5jZWxOZXh0VGljayxcbiAgZGV0ZWN0RGlyZWN0aW9uOiBfZGV0ZWN0RGlyZWN0aW9uLFxuICBnZXRDaGlsZDogZ2V0Q2hpbGRcbn07XG5cbi8qKlxyXG4gKiBHZXQgdGhlIFNvcnRhYmxlIGluc3RhbmNlIG9mIGFuIGVsZW1lbnRcclxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnRcclxuICogQHJldHVybiB7U29ydGFibGV8dW5kZWZpbmVkfSAgICAgICAgIFRoZSBpbnN0YW5jZSBvZiBTb3J0YWJsZVxyXG4gKi9cblNvcnRhYmxlLmdldCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50W2V4cGFuZG9dO1xufTtcblxuLyoqXHJcbiAqIE1vdW50IGEgcGx1Z2luIHRvIFNvcnRhYmxlXHJcbiAqIEBwYXJhbSAgey4uLlNvcnRhYmxlUGx1Z2lufFNvcnRhYmxlUGx1Z2luW119IHBsdWdpbnMgICAgICAgUGx1Z2lucyBiZWluZyBtb3VudGVkXHJcbiAqL1xuU29ydGFibGUubW91bnQgPSBmdW5jdGlvbiAoKSB7XG4gIGZvciAodmFyIF9sZW4gPSBhcmd1bWVudHMubGVuZ3RoLCBwbHVnaW5zID0gbmV3IEFycmF5KF9sZW4pLCBfa2V5ID0gMDsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIHBsdWdpbnNbX2tleV0gPSBhcmd1bWVudHNbX2tleV07XG4gIH1cbiAgaWYgKHBsdWdpbnNbMF0uY29uc3RydWN0b3IgPT09IEFycmF5KSBwbHVnaW5zID0gcGx1Z2luc1swXTtcbiAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICBpZiAoIXBsdWdpbi5wcm90b3R5cGUgfHwgIXBsdWdpbi5wcm90b3R5cGUuY29uc3RydWN0b3IpIHtcbiAgICAgIHRocm93IFwiU29ydGFibGU6IE1vdW50ZWQgcGx1Z2luIG11c3QgYmUgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgbm90IFwiLmNvbmNhdCh7fS50b1N0cmluZy5jYWxsKHBsdWdpbikpO1xuICAgIH1cbiAgICBpZiAocGx1Z2luLnV0aWxzKSBTb3J0YWJsZS51dGlscyA9IF9vYmplY3RTcHJlYWQyKF9vYmplY3RTcHJlYWQyKHt9LCBTb3J0YWJsZS51dGlscyksIHBsdWdpbi51dGlscyk7XG4gICAgUGx1Z2luTWFuYWdlci5tb3VudChwbHVnaW4pO1xuICB9KTtcbn07XG5cbi8qKlxyXG4gKiBDcmVhdGUgc29ydGFibGUgaW5zdGFuY2VcclxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gIGVsXHJcbiAqIEBwYXJhbSB7T2JqZWN0fSAgICAgIFtvcHRpb25zXVxyXG4gKi9cblNvcnRhYmxlLmNyZWF0ZSA9IGZ1bmN0aW9uIChlbCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IFNvcnRhYmxlKGVsLCBvcHRpb25zKTtcbn07XG5cbi8vIEV4cG9ydFxuU29ydGFibGUudmVyc2lvbiA9IHZlcnNpb247XG5cbnZhciBhdXRvU2Nyb2xscyA9IFtdLFxuICBzY3JvbGxFbCxcbiAgc2Nyb2xsUm9vdEVsLFxuICBzY3JvbGxpbmcgPSBmYWxzZSxcbiAgbGFzdEF1dG9TY3JvbGxYLFxuICBsYXN0QXV0b1Njcm9sbFksXG4gIHRvdWNoRXZ0JDEsXG4gIHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsO1xuZnVuY3Rpb24gQXV0b1Njcm9sbFBsdWdpbigpIHtcbiAgZnVuY3Rpb24gQXV0b1Njcm9sbCgpIHtcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgc2Nyb2xsOiB0cnVlLFxuICAgICAgZm9yY2VBdXRvU2Nyb2xsRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgc2Nyb2xsU2Vuc2l0aXZpdHk6IDMwLFxuICAgICAgc2Nyb2xsU3BlZWQ6IDEwLFxuICAgICAgYnViYmxlU2Nyb2xsOiB0cnVlXG4gICAgfTtcblxuICAgIC8vIEJpbmQgYWxsIHByaXZhdGUgbWV0aG9kc1xuICAgIGZvciAodmFyIGZuIGluIHRoaXMpIHtcbiAgICAgIGlmIChmbi5jaGFyQXQoMCkgPT09ICdfJyAmJiB0eXBlb2YgdGhpc1tmbl0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhpc1tmbl0gPSB0aGlzW2ZuXS5iaW5kKHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBBdXRvU2Nyb2xsLnByb3RvdHlwZSA9IHtcbiAgICBkcmFnU3RhcnRlZDogZnVuY3Rpb24gZHJhZ1N0YXJ0ZWQoX3JlZikge1xuICAgICAgdmFyIG9yaWdpbmFsRXZlbnQgPSBfcmVmLm9yaWdpbmFsRXZlbnQ7XG4gICAgICBpZiAodGhpcy5zb3J0YWJsZS5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdkcmFnb3ZlcicsIHRoaXMuX2hhbmRsZUF1dG9TY3JvbGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgICAgICAgIG9uKGRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICB9IGVsc2UgaWYgKG9yaWdpbmFsRXZlbnQudG91Y2hlcykge1xuICAgICAgICAgIG9uKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQ29tcGxldGVkOiBmdW5jdGlvbiBkcmFnT3ZlckNvbXBsZXRlZChfcmVmMikge1xuICAgICAgdmFyIG9yaWdpbmFsRXZlbnQgPSBfcmVmMi5vcmlnaW5hbEV2ZW50O1xuICAgICAgLy8gRm9yIHdoZW4gYnViYmxpbmcgaXMgY2FuY2VsZWQgYW5kIHVzaW5nIGZhbGxiYWNrIChmYWxsYmFjayAndG91Y2htb3ZlJyBhbHdheXMgcmVhY2hlZClcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmRyYWdPdmVyQnViYmxlICYmICFvcmlnaW5hbEV2ZW50LnJvb3RFbCkge1xuICAgICAgICB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKG9yaWdpbmFsRXZlbnQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZHJvcDogZnVuY3Rpb24gZHJvcCgpIHtcbiAgICAgIGlmICh0aGlzLnNvcnRhYmxlLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgICBvZmYoZG9jdW1lbnQsICdkcmFnb3ZlcicsIHRoaXMuX2hhbmRsZUF1dG9TY3JvbGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAncG9pbnRlcm1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICBvZmYoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgfVxuICAgICAgY2xlYXJQb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCgpO1xuICAgICAgY2xlYXJBdXRvU2Nyb2xscygpO1xuICAgICAgY2FuY2VsVGhyb3R0bGUoKTtcbiAgICB9LFxuICAgIG51bGxpbmc6IGZ1bmN0aW9uIG51bGxpbmcoKSB7XG4gICAgICB0b3VjaEV2dCQxID0gc2Nyb2xsUm9vdEVsID0gc2Nyb2xsRWwgPSBzY3JvbGxpbmcgPSBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCA9IGxhc3RBdXRvU2Nyb2xsWCA9IGxhc3RBdXRvU2Nyb2xsWSA9IG51bGw7XG4gICAgICBhdXRvU2Nyb2xscy5sZW5ndGggPSAwO1xuICAgIH0sXG4gICAgX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbDogZnVuY3Rpb24gX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbChldnQpIHtcbiAgICAgIHRoaXMuX2hhbmRsZUF1dG9TY3JvbGwoZXZ0LCB0cnVlKTtcbiAgICB9LFxuICAgIF9oYW5kbGVBdXRvU2Nyb2xsOiBmdW5jdGlvbiBfaGFuZGxlQXV0b1Njcm9sbChldnQsIGZhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgdmFyIHggPSAoZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCkuY2xpZW50WCxcbiAgICAgICAgeSA9IChldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KS5jbGllbnRZLFxuICAgICAgICBlbGVtID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcbiAgICAgIHRvdWNoRXZ0JDEgPSBldnQ7XG5cbiAgICAgIC8vIElFIGRvZXMgbm90IHNlZW0gdG8gaGF2ZSBuYXRpdmUgYXV0b3Njcm9sbCxcbiAgICAgIC8vIEVkZ2UncyBhdXRvc2Nyb2xsIHNlZW1zIHRvbyBjb25kaXRpb25hbCxcbiAgICAgIC8vIE1BQ09TIFNhZmFyaSBkb2VzIG5vdCBoYXZlIGF1dG9zY3JvbGwsXG4gICAgICAvLyBGaXJlZm94IGFuZCBDaHJvbWUgYXJlIGdvb2RcbiAgICAgIGlmIChmYWxsYmFjayB8fCB0aGlzLm9wdGlvbnMuZm9yY2VBdXRvU2Nyb2xsRmFsbGJhY2sgfHwgRWRnZSB8fCBJRTExT3JMZXNzIHx8IFNhZmFyaSkge1xuICAgICAgICBhdXRvU2Nyb2xsKGV2dCwgdGhpcy5vcHRpb25zLCBlbGVtLCBmYWxsYmFjayk7XG5cbiAgICAgICAgLy8gTGlzdGVuZXIgZm9yIHBvaW50ZXIgZWxlbWVudCBjaGFuZ2VcbiAgICAgICAgdmFyIG9nRWxlbVNjcm9sbGVyID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChzY3JvbGxpbmcgJiYgKCFwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCB8fCB4ICE9PSBsYXN0QXV0b1Njcm9sbFggfHwgeSAhPT0gbGFzdEF1dG9TY3JvbGxZKSkge1xuICAgICAgICAgIHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsICYmIGNsZWFyUG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwoKTtcbiAgICAgICAgICAvLyBEZXRlY3QgZm9yIHBvaW50ZXIgZWxlbSBjaGFuZ2UsIGVtdWxhdGluZyBuYXRpdmUgRG5EIGJlaGF2aW91clxuICAgICAgICAgIHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG5ld0VsZW0gPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHgsIHkpLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChuZXdFbGVtICE9PSBvZ0VsZW1TY3JvbGxlcikge1xuICAgICAgICAgICAgICBvZ0VsZW1TY3JvbGxlciA9IG5ld0VsZW07XG4gICAgICAgICAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF1dG9TY3JvbGwoZXZ0LCBfdGhpcy5vcHRpb25zLCBuZXdFbGVtLCBmYWxsYmFjayk7XG4gICAgICAgICAgfSwgMTApO1xuICAgICAgICAgIGxhc3RBdXRvU2Nyb2xsWCA9IHg7XG4gICAgICAgICAgbGFzdEF1dG9TY3JvbGxZID0geTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgRG5EIGlzIGVuYWJsZWQgKGFuZCBicm93c2VyIGhhcyBnb29kIGF1dG9zY3JvbGxpbmcpLCBmaXJzdCBhdXRvc2Nyb2xsIHdpbGwgYWxyZWFkeSBzY3JvbGwsIHNvIGdldCBwYXJlbnQgYXV0b3Njcm9sbCBvZiBmaXJzdCBhdXRvc2Nyb2xsXG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLmJ1YmJsZVNjcm9sbCB8fCBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbGVtLCB0cnVlKSA9PT0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpKSB7XG4gICAgICAgICAgY2xlYXJBdXRvU2Nyb2xscygpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhdXRvU2Nyb2xsKGV2dCwgdGhpcy5vcHRpb25zLCBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChlbGVtLCBmYWxzZSksIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcyhBdXRvU2Nyb2xsLCB7XG4gICAgcGx1Z2luTmFtZTogJ3Njcm9sbCcsXG4gICAgaW5pdGlhbGl6ZUJ5RGVmYXVsdDogdHJ1ZVxuICB9KTtcbn1cbmZ1bmN0aW9uIGNsZWFyQXV0b1Njcm9sbHMoKSB7XG4gIGF1dG9TY3JvbGxzLmZvckVhY2goZnVuY3Rpb24gKGF1dG9TY3JvbGwpIHtcbiAgICBjbGVhckludGVydmFsKGF1dG9TY3JvbGwucGlkKTtcbiAgfSk7XG4gIGF1dG9TY3JvbGxzID0gW107XG59XG5mdW5jdGlvbiBjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKCkge1xuICBjbGVhckludGVydmFsKHBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKTtcbn1cbnZhciBhdXRvU2Nyb2xsID0gdGhyb3R0bGUoZnVuY3Rpb24gKGV2dCwgb3B0aW9ucywgcm9vdEVsLCBpc0ZhbGxiYWNrKSB7XG4gIC8vIEJ1ZzogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTA1NTIxXG4gIGlmICghb3B0aW9ucy5zY3JvbGwpIHJldHVybjtcbiAgdmFyIHggPSAoZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCkuY2xpZW50WCxcbiAgICB5ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFksXG4gICAgc2VucyA9IG9wdGlvbnMuc2Nyb2xsU2Vuc2l0aXZpdHksXG4gICAgc3BlZWQgPSBvcHRpb25zLnNjcm9sbFNwZWVkLFxuICAgIHdpblNjcm9sbGVyID0gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICB2YXIgc2Nyb2xsVGhpc0luc3RhbmNlID0gZmFsc2UsXG4gICAgc2Nyb2xsQ3VzdG9tRm47XG5cbiAgLy8gTmV3IHNjcm9sbCByb290LCBzZXQgc2Nyb2xsRWxcbiAgaWYgKHNjcm9sbFJvb3RFbCAhPT0gcm9vdEVsKSB7XG4gICAgc2Nyb2xsUm9vdEVsID0gcm9vdEVsO1xuICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICBzY3JvbGxFbCA9IG9wdGlvbnMuc2Nyb2xsO1xuICAgIHNjcm9sbEN1c3RvbUZuID0gb3B0aW9ucy5zY3JvbGxGbjtcbiAgICBpZiAoc2Nyb2xsRWwgPT09IHRydWUpIHtcbiAgICAgIHNjcm9sbEVsID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQocm9vdEVsLCB0cnVlKTtcbiAgICB9XG4gIH1cbiAgdmFyIGxheWVyc091dCA9IDA7XG4gIHZhciBjdXJyZW50UGFyZW50ID0gc2Nyb2xsRWw7XG4gIGRvIHtcbiAgICB2YXIgZWwgPSBjdXJyZW50UGFyZW50LFxuICAgICAgcmVjdCA9IGdldFJlY3QoZWwpLFxuICAgICAgdG9wID0gcmVjdC50b3AsXG4gICAgICBib3R0b20gPSByZWN0LmJvdHRvbSxcbiAgICAgIGxlZnQgPSByZWN0LmxlZnQsXG4gICAgICByaWdodCA9IHJlY3QucmlnaHQsXG4gICAgICB3aWR0aCA9IHJlY3Qud2lkdGgsXG4gICAgICBoZWlnaHQgPSByZWN0LmhlaWdodCxcbiAgICAgIGNhblNjcm9sbFggPSB2b2lkIDAsXG4gICAgICBjYW5TY3JvbGxZID0gdm9pZCAwLFxuICAgICAgc2Nyb2xsV2lkdGggPSBlbC5zY3JvbGxXaWR0aCxcbiAgICAgIHNjcm9sbEhlaWdodCA9IGVsLnNjcm9sbEhlaWdodCxcbiAgICAgIGVsQ1NTID0gY3NzKGVsKSxcbiAgICAgIHNjcm9sbFBvc1ggPSBlbC5zY3JvbGxMZWZ0LFxuICAgICAgc2Nyb2xsUG9zWSA9IGVsLnNjcm9sbFRvcDtcbiAgICBpZiAoZWwgPT09IHdpblNjcm9sbGVyKSB7XG4gICAgICBjYW5TY3JvbGxYID0gd2lkdGggPCBzY3JvbGxXaWR0aCAmJiAoZWxDU1Mub3ZlcmZsb3dYID09PSAnYXV0bycgfHwgZWxDU1Mub3ZlcmZsb3dYID09PSAnc2Nyb2xsJyB8fCBlbENTUy5vdmVyZmxvd1ggPT09ICd2aXNpYmxlJyk7XG4gICAgICBjYW5TY3JvbGxZID0gaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0ICYmIChlbENTUy5vdmVyZmxvd1kgPT09ICdhdXRvJyB8fCBlbENTUy5vdmVyZmxvd1kgPT09ICdzY3JvbGwnIHx8IGVsQ1NTLm92ZXJmbG93WSA9PT0gJ3Zpc2libGUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FuU2Nyb2xsWCA9IHdpZHRoIDwgc2Nyb2xsV2lkdGggJiYgKGVsQ1NTLm92ZXJmbG93WCA9PT0gJ2F1dG8nIHx8IGVsQ1NTLm92ZXJmbG93WCA9PT0gJ3Njcm9sbCcpO1xuICAgICAgY2FuU2Nyb2xsWSA9IGhlaWdodCA8IHNjcm9sbEhlaWdodCAmJiAoZWxDU1Mub3ZlcmZsb3dZID09PSAnYXV0bycgfHwgZWxDU1Mub3ZlcmZsb3dZID09PSAnc2Nyb2xsJyk7XG4gICAgfVxuICAgIHZhciB2eCA9IGNhblNjcm9sbFggJiYgKE1hdGguYWJzKHJpZ2h0IC0geCkgPD0gc2VucyAmJiBzY3JvbGxQb3NYICsgd2lkdGggPCBzY3JvbGxXaWR0aCkgLSAoTWF0aC5hYnMobGVmdCAtIHgpIDw9IHNlbnMgJiYgISFzY3JvbGxQb3NYKTtcbiAgICB2YXIgdnkgPSBjYW5TY3JvbGxZICYmIChNYXRoLmFicyhib3R0b20gLSB5KSA8PSBzZW5zICYmIHNjcm9sbFBvc1kgKyBoZWlnaHQgPCBzY3JvbGxIZWlnaHQpIC0gKE1hdGguYWJzKHRvcCAtIHkpIDw9IHNlbnMgJiYgISFzY3JvbGxQb3NZKTtcbiAgICBpZiAoIWF1dG9TY3JvbGxzW2xheWVyc091dF0pIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGxheWVyc091dDsgaSsrKSB7XG4gICAgICAgIGlmICghYXV0b1Njcm9sbHNbaV0pIHtcbiAgICAgICAgICBhdXRvU2Nyb2xsc1tpXSA9IHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ4ICE9IHZ4IHx8IGF1dG9TY3JvbGxzW2xheWVyc091dF0udnkgIT0gdnkgfHwgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5lbCAhPT0gZWwpIHtcbiAgICAgIGF1dG9TY3JvbGxzW2xheWVyc091dF0uZWwgPSBlbDtcbiAgICAgIGF1dG9TY3JvbGxzW2xheWVyc091dF0udnggPSB2eDtcbiAgICAgIGF1dG9TY3JvbGxzW2xheWVyc091dF0udnkgPSB2eTtcbiAgICAgIGNsZWFySW50ZXJ2YWwoYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5waWQpO1xuICAgICAgaWYgKHZ4ICE9IDAgfHwgdnkgIT0gMCkge1xuICAgICAgICBzY3JvbGxUaGlzSW5zdGFuY2UgPSB0cnVlO1xuICAgICAgICAvKiBqc2hpbnQgbG9vcGZ1bmM6dHJ1ZSAqL1xuICAgICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnBpZCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAvLyBlbXVsYXRlIGRyYWcgb3ZlciBkdXJpbmcgYXV0b3Njcm9sbCAoZmFsbGJhY2spLCBlbXVsYXRpbmcgbmF0aXZlIERuRCBiZWhhdmlvdXJcbiAgICAgICAgICBpZiAoaXNGYWxsYmFjayAmJiB0aGlzLmxheWVyID09PSAwKSB7XG4gICAgICAgICAgICBTb3J0YWJsZS5hY3RpdmUuX29uVG91Y2hNb3ZlKHRvdWNoRXZ0JDEpOyAvLyBUbyBtb3ZlIGdob3N0IGlmIGl0IGlzIHBvc2l0aW9uZWQgYWJzb2x1dGVseVxuICAgICAgICAgIH1cbiAgICAgICAgICB2YXIgc2Nyb2xsT2Zmc2V0WSA9IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ5ID8gYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0udnkgKiBzcGVlZCA6IDA7XG4gICAgICAgICAgdmFyIHNjcm9sbE9mZnNldFggPSBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eCA/IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ4ICogc3BlZWQgOiAwO1xuICAgICAgICAgIGlmICh0eXBlb2Ygc2Nyb2xsQ3VzdG9tRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGlmIChzY3JvbGxDdXN0b21Gbi5jYWxsKFNvcnRhYmxlLmRyYWdnZWQucGFyZW50Tm9kZVtleHBhbmRvXSwgc2Nyb2xsT2Zmc2V0WCwgc2Nyb2xsT2Zmc2V0WSwgZXZ0LCB0b3VjaEV2dCQxLCBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS5lbCkgIT09ICdjb250aW51ZScpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzY3JvbGxCeShhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS5lbCwgc2Nyb2xsT2Zmc2V0WCwgc2Nyb2xsT2Zmc2V0WSk7XG4gICAgICAgIH0uYmluZCh7XG4gICAgICAgICAgbGF5ZXI6IGxheWVyc091dFxuICAgICAgICB9KSwgMjQpO1xuICAgICAgfVxuICAgIH1cbiAgICBsYXllcnNPdXQrKztcbiAgfSB3aGlsZSAob3B0aW9ucy5idWJibGVTY3JvbGwgJiYgY3VycmVudFBhcmVudCAhPT0gd2luU2Nyb2xsZXIgJiYgKGN1cnJlbnRQYXJlbnQgPSBnZXRQYXJlbnRBdXRvU2Nyb2xsRWxlbWVudChjdXJyZW50UGFyZW50LCBmYWxzZSkpKTtcbiAgc2Nyb2xsaW5nID0gc2Nyb2xsVGhpc0luc3RhbmNlOyAvLyBpbiBjYXNlIGFub3RoZXIgZnVuY3Rpb24gY2F0Y2hlcyBzY3JvbGxpbmcgYXMgZmFsc2UgaW4gYmV0d2VlbiB3aGVuIGl0IGlzIG5vdFxufSwgMzApO1xuXG52YXIgZHJvcCA9IGZ1bmN0aW9uIGRyb3AoX3JlZikge1xuICB2YXIgb3JpZ2luYWxFdmVudCA9IF9yZWYub3JpZ2luYWxFdmVudCxcbiAgICBwdXRTb3J0YWJsZSA9IF9yZWYucHV0U29ydGFibGUsXG4gICAgZHJhZ0VsID0gX3JlZi5kcmFnRWwsXG4gICAgYWN0aXZlU29ydGFibGUgPSBfcmVmLmFjdGl2ZVNvcnRhYmxlLFxuICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCA9IF9yZWYuZGlzcGF0Y2hTb3J0YWJsZUV2ZW50LFxuICAgIGhpZGVHaG9zdEZvclRhcmdldCA9IF9yZWYuaGlkZUdob3N0Rm9yVGFyZ2V0LFxuICAgIHVuaGlkZUdob3N0Rm9yVGFyZ2V0ID0gX3JlZi51bmhpZGVHaG9zdEZvclRhcmdldDtcbiAgaWYgKCFvcmlnaW5hbEV2ZW50KSByZXR1cm47XG4gIHZhciB0b1NvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgYWN0aXZlU29ydGFibGU7XG4gIGhpZGVHaG9zdEZvclRhcmdldCgpO1xuICB2YXIgdG91Y2ggPSBvcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID8gb3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlc1swXSA6IG9yaWdpbmFsRXZlbnQ7XG4gIHZhciB0YXJnZXQgPSBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpO1xuICB1bmhpZGVHaG9zdEZvclRhcmdldCgpO1xuICBpZiAodG9Tb3J0YWJsZSAmJiAhdG9Tb3J0YWJsZS5lbC5jb250YWlucyh0YXJnZXQpKSB7XG4gICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50KCdzcGlsbCcpO1xuICAgIHRoaXMub25TcGlsbCh7XG4gICAgICBkcmFnRWw6IGRyYWdFbCxcbiAgICAgIHB1dFNvcnRhYmxlOiBwdXRTb3J0YWJsZVxuICAgIH0pO1xuICB9XG59O1xuZnVuY3Rpb24gUmV2ZXJ0KCkge31cblJldmVydC5wcm90b3R5cGUgPSB7XG4gIHN0YXJ0SW5kZXg6IG51bGwsXG4gIGRyYWdTdGFydDogZnVuY3Rpb24gZHJhZ1N0YXJ0KF9yZWYyKSB7XG4gICAgdmFyIG9sZERyYWdnYWJsZUluZGV4ID0gX3JlZjIub2xkRHJhZ2dhYmxlSW5kZXg7XG4gICAgdGhpcy5zdGFydEluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXg7XG4gIH0sXG4gIG9uU3BpbGw6IGZ1bmN0aW9uIG9uU3BpbGwoX3JlZjMpIHtcbiAgICB2YXIgZHJhZ0VsID0gX3JlZjMuZHJhZ0VsLFxuICAgICAgcHV0U29ydGFibGUgPSBfcmVmMy5wdXRTb3J0YWJsZTtcbiAgICB0aGlzLnNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIGlmIChwdXRTb3J0YWJsZSkge1xuICAgICAgcHV0U29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgfVxuICAgIHZhciBuZXh0U2libGluZyA9IGdldENoaWxkKHRoaXMuc29ydGFibGUuZWwsIHRoaXMuc3RhcnRJbmRleCwgdGhpcy5vcHRpb25zKTtcbiAgICBpZiAobmV4dFNpYmxpbmcpIHtcbiAgICAgIHRoaXMuc29ydGFibGUuZWwuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgbmV4dFNpYmxpbmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvcnRhYmxlLmVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgfVxuICAgIHRoaXMuc29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgIGlmIChwdXRTb3J0YWJsZSkge1xuICAgICAgcHV0U29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgIH1cbiAgfSxcbiAgZHJvcDogZHJvcFxufTtcbl9leHRlbmRzKFJldmVydCwge1xuICBwbHVnaW5OYW1lOiAncmV2ZXJ0T25TcGlsbCdcbn0pO1xuZnVuY3Rpb24gUmVtb3ZlKCkge31cblJlbW92ZS5wcm90b3R5cGUgPSB7XG4gIG9uU3BpbGw6IGZ1bmN0aW9uIG9uU3BpbGwoX3JlZjQpIHtcbiAgICB2YXIgZHJhZ0VsID0gX3JlZjQuZHJhZ0VsLFxuICAgICAgcHV0U29ydGFibGUgPSBfcmVmNC5wdXRTb3J0YWJsZTtcbiAgICB2YXIgcGFyZW50U29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCB0aGlzLnNvcnRhYmxlO1xuICAgIHBhcmVudFNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIGRyYWdFbC5wYXJlbnROb2RlICYmIGRyYWdFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRyYWdFbCk7XG4gICAgcGFyZW50U29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICB9LFxuICBkcm9wOiBkcm9wXG59O1xuX2V4dGVuZHMoUmVtb3ZlLCB7XG4gIHBsdWdpbk5hbWU6ICdyZW1vdmVPblNwaWxsJ1xufSk7XG5cbnZhciBsYXN0U3dhcEVsO1xuZnVuY3Rpb24gU3dhcFBsdWdpbigpIHtcbiAgZnVuY3Rpb24gU3dhcCgpIHtcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgc3dhcENsYXNzOiAnc29ydGFibGUtc3dhcC1oaWdobGlnaHQnXG4gICAgfTtcbiAgfVxuICBTd2FwLnByb3RvdHlwZSA9IHtcbiAgICBkcmFnU3RhcnQ6IGZ1bmN0aW9uIGRyYWdTdGFydChfcmVmKSB7XG4gICAgICB2YXIgZHJhZ0VsID0gX3JlZi5kcmFnRWw7XG4gICAgICBsYXN0U3dhcEVsID0gZHJhZ0VsO1xuICAgIH0sXG4gICAgZHJhZ092ZXJWYWxpZDogZnVuY3Rpb24gZHJhZ092ZXJWYWxpZChfcmVmMikge1xuICAgICAgdmFyIGNvbXBsZXRlZCA9IF9yZWYyLmNvbXBsZXRlZCxcbiAgICAgICAgdGFyZ2V0ID0gX3JlZjIudGFyZ2V0LFxuICAgICAgICBvbk1vdmUgPSBfcmVmMi5vbk1vdmUsXG4gICAgICAgIGFjdGl2ZVNvcnRhYmxlID0gX3JlZjIuYWN0aXZlU29ydGFibGUsXG4gICAgICAgIGNoYW5nZWQgPSBfcmVmMi5jaGFuZ2VkLFxuICAgICAgICBjYW5jZWwgPSBfcmVmMi5jYW5jZWw7XG4gICAgICBpZiAoIWFjdGl2ZVNvcnRhYmxlLm9wdGlvbnMuc3dhcCkgcmV0dXJuO1xuICAgICAgdmFyIGVsID0gdGhpcy5zb3J0YWJsZS5lbCxcbiAgICAgICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIGlmICh0YXJnZXQgJiYgdGFyZ2V0ICE9PSBlbCkge1xuICAgICAgICB2YXIgcHJldlN3YXBFbCA9IGxhc3RTd2FwRWw7XG4gICAgICAgIGlmIChvbk1vdmUodGFyZ2V0KSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICB0b2dnbGVDbGFzcyh0YXJnZXQsIG9wdGlvbnMuc3dhcENsYXNzLCB0cnVlKTtcbiAgICAgICAgICBsYXN0U3dhcEVsID0gdGFyZ2V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhc3RTd2FwRWwgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcmV2U3dhcEVsICYmIHByZXZTd2FwRWwgIT09IGxhc3RTd2FwRWwpIHtcbiAgICAgICAgICB0b2dnbGVDbGFzcyhwcmV2U3dhcEVsLCBvcHRpb25zLnN3YXBDbGFzcywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjaGFuZ2VkKCk7XG4gICAgICBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICBjYW5jZWwoKTtcbiAgICB9LFxuICAgIGRyb3A6IGZ1bmN0aW9uIGRyb3AoX3JlZjMpIHtcbiAgICAgIHZhciBhY3RpdmVTb3J0YWJsZSA9IF9yZWYzLmFjdGl2ZVNvcnRhYmxlLFxuICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYzLnB1dFNvcnRhYmxlLFxuICAgICAgICBkcmFnRWwgPSBfcmVmMy5kcmFnRWw7XG4gICAgICB2YXIgdG9Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IHRoaXMuc29ydGFibGU7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIGxhc3RTd2FwRWwgJiYgdG9nZ2xlQ2xhc3MobGFzdFN3YXBFbCwgb3B0aW9ucy5zd2FwQ2xhc3MsIGZhbHNlKTtcbiAgICAgIGlmIChsYXN0U3dhcEVsICYmIChvcHRpb25zLnN3YXAgfHwgcHV0U29ydGFibGUgJiYgcHV0U29ydGFibGUub3B0aW9ucy5zd2FwKSkge1xuICAgICAgICBpZiAoZHJhZ0VsICE9PSBsYXN0U3dhcEVsKSB7XG4gICAgICAgICAgdG9Tb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgICAgICBpZiAodG9Tb3J0YWJsZSAhPT0gYWN0aXZlU29ydGFibGUpIGFjdGl2ZVNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgICAgIHN3YXBOb2RlcyhkcmFnRWwsIGxhc3RTd2FwRWwpO1xuICAgICAgICAgIHRvU29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgICAgICAgIGlmICh0b1NvcnRhYmxlICE9PSBhY3RpdmVTb3J0YWJsZSkgYWN0aXZlU29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBudWxsaW5nOiBmdW5jdGlvbiBudWxsaW5nKCkge1xuICAgICAgbGFzdFN3YXBFbCA9IG51bGw7XG4gICAgfVxuICB9O1xuICByZXR1cm4gX2V4dGVuZHMoU3dhcCwge1xuICAgIHBsdWdpbk5hbWU6ICdzd2FwJyxcbiAgICBldmVudFByb3BlcnRpZXM6IGZ1bmN0aW9uIGV2ZW50UHJvcGVydGllcygpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN3YXBJdGVtOiBsYXN0U3dhcEVsXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBzd2FwTm9kZXMobjEsIG4yKSB7XG4gIHZhciBwMSA9IG4xLnBhcmVudE5vZGUsXG4gICAgcDIgPSBuMi5wYXJlbnROb2RlLFxuICAgIGkxLFxuICAgIGkyO1xuICBpZiAoIXAxIHx8ICFwMiB8fCBwMS5pc0VxdWFsTm9kZShuMikgfHwgcDIuaXNFcXVhbE5vZGUobjEpKSByZXR1cm47XG4gIGkxID0gaW5kZXgobjEpO1xuICBpMiA9IGluZGV4KG4yKTtcbiAgaWYgKHAxLmlzRXF1YWxOb2RlKHAyKSAmJiBpMSA8IGkyKSB7XG4gICAgaTIrKztcbiAgfVxuICBwMS5pbnNlcnRCZWZvcmUobjIsIHAxLmNoaWxkcmVuW2kxXSk7XG4gIHAyLmluc2VydEJlZm9yZShuMSwgcDIuY2hpbGRyZW5baTJdKTtcbn1cblxudmFyIG11bHRpRHJhZ0VsZW1lbnRzID0gW10sXG4gIG11bHRpRHJhZ0Nsb25lcyA9IFtdLFxuICBsYXN0TXVsdGlEcmFnU2VsZWN0LFxuICAvLyBmb3Igc2VsZWN0aW9uIHdpdGggbW9kaWZpZXIga2V5IGRvd24gKFNISUZUKVxuICBtdWx0aURyYWdTb3J0YWJsZSxcbiAgaW5pdGlhbEZvbGRpbmcgPSBmYWxzZSxcbiAgLy8gSW5pdGlhbCBtdWx0aS1kcmFnIGZvbGQgd2hlbiBkcmFnIHN0YXJ0ZWRcbiAgZm9sZGluZyA9IGZhbHNlLFxuICAvLyBGb2xkaW5nIGFueSBvdGhlciB0aW1lXG4gIGRyYWdTdGFydGVkID0gZmFsc2UsXG4gIGRyYWdFbCQxLFxuICBjbG9uZXNGcm9tUmVjdCxcbiAgY2xvbmVzSGlkZGVuO1xuZnVuY3Rpb24gTXVsdGlEcmFnUGx1Z2luKCkge1xuICBmdW5jdGlvbiBNdWx0aURyYWcoc29ydGFibGUpIHtcbiAgICAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcbiAgICBmb3IgKHZhciBmbiBpbiB0aGlzKSB7XG4gICAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXNbZm5dID0gdGhpc1tmbl0uYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFzb3J0YWJsZS5vcHRpb25zLmF2b2lkSW1wbGljaXREZXNlbGVjdCkge1xuICAgICAgaWYgKHNvcnRhYmxlLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbihkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICAgIG9uKGRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICB9XG4gICAgfVxuICAgIG9uKGRvY3VtZW50LCAna2V5ZG93bicsIHRoaXMuX2NoZWNrS2V5RG93bik7XG4gICAgb24oZG9jdW1lbnQsICdrZXl1cCcsIHRoaXMuX2NoZWNrS2V5VXApO1xuICAgIHRoaXMuZGVmYXVsdHMgPSB7XG4gICAgICBzZWxlY3RlZENsYXNzOiAnc29ydGFibGUtc2VsZWN0ZWQnLFxuICAgICAgbXVsdGlEcmFnS2V5OiBudWxsLFxuICAgICAgYXZvaWRJbXBsaWNpdERlc2VsZWN0OiBmYWxzZSxcbiAgICAgIHNldERhdGE6IGZ1bmN0aW9uIHNldERhdGEoZGF0YVRyYW5zZmVyLCBkcmFnRWwpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAnJztcbiAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCAmJiBtdWx0aURyYWdTb3J0YWJsZSA9PT0gc29ydGFibGUpIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50LCBpKSB7XG4gICAgICAgICAgICBkYXRhICs9ICghaSA/ICcnIDogJywgJykgKyBtdWx0aURyYWdFbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGEgPSBkcmFnRWwudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZGF0YVRyYW5zZmVyLnNldERhdGEoJ1RleHQnLCBkYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIE11bHRpRHJhZy5wcm90b3R5cGUgPSB7XG4gICAgbXVsdGlEcmFnS2V5RG93bjogZmFsc2UsXG4gICAgaXNNdWx0aURyYWc6IGZhbHNlLFxuICAgIGRlbGF5U3RhcnRHbG9iYWw6IGZ1bmN0aW9uIGRlbGF5U3RhcnRHbG9iYWwoX3JlZikge1xuICAgICAgdmFyIGRyYWdnZWQgPSBfcmVmLmRyYWdFbDtcbiAgICAgIGRyYWdFbCQxID0gZHJhZ2dlZDtcbiAgICB9LFxuICAgIGRlbGF5RW5kZWQ6IGZ1bmN0aW9uIGRlbGF5RW5kZWQoKSB7XG4gICAgICB0aGlzLmlzTXVsdGlEcmFnID0gfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZHJhZ0VsJDEpO1xuICAgIH0sXG4gICAgc2V0dXBDbG9uZTogZnVuY3Rpb24gc2V0dXBDbG9uZShfcmVmMikge1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjIuc29ydGFibGUsXG4gICAgICAgIGNhbmNlbCA9IF9yZWYyLmNhbmNlbDtcbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZykgcmV0dXJuO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtdWx0aURyYWdFbGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBtdWx0aURyYWdDbG9uZXMucHVzaChjbG9uZShtdWx0aURyYWdFbGVtZW50c1tpXSkpO1xuICAgICAgICBtdWx0aURyYWdDbG9uZXNbaV0uc29ydGFibGVJbmRleCA9IG11bHRpRHJhZ0VsZW1lbnRzW2ldLnNvcnRhYmxlSW5kZXg7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lc1tpXS5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzW2ldLnN0eWxlWyd3aWxsLWNoYW5nZSddID0gJyc7XG4gICAgICAgIHRvZ2dsZUNsYXNzKG11bHRpRHJhZ0Nsb25lc1tpXSwgdGhpcy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHNbaV0gPT09IGRyYWdFbCQxICYmIHRvZ2dsZUNsYXNzKG11bHRpRHJhZ0Nsb25lc1tpXSwgdGhpcy5vcHRpb25zLmNob3NlbkNsYXNzLCBmYWxzZSk7XG4gICAgICB9XG4gICAgICBzb3J0YWJsZS5faGlkZUNsb25lKCk7XG4gICAgICBjYW5jZWwoKTtcbiAgICB9LFxuICAgIGNsb25lOiBmdW5jdGlvbiBjbG9uZShfcmVmMykge1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjMuc29ydGFibGUsXG4gICAgICAgIHJvb3RFbCA9IF9yZWYzLnJvb3RFbCxcbiAgICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50ID0gX3JlZjMuZGlzcGF0Y2hTb3J0YWJsZUV2ZW50LFxuICAgICAgICBjYW5jZWwgPSBfcmVmMy5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlKSB7XG4gICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggJiYgbXVsdGlEcmFnU29ydGFibGUgPT09IHNvcnRhYmxlKSB7XG4gICAgICAgICAgaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKHRydWUsIHJvb3RFbCk7XG4gICAgICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50KCdjbG9uZScpO1xuICAgICAgICAgIGNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBzaG93Q2xvbmU6IGZ1bmN0aW9uIHNob3dDbG9uZShfcmVmNCkge1xuICAgICAgdmFyIGNsb25lTm93U2hvd24gPSBfcmVmNC5jbG9uZU5vd1Nob3duLFxuICAgICAgICByb290RWwgPSBfcmVmNC5yb290RWwsXG4gICAgICAgIGNhbmNlbCA9IF9yZWY0LmNhbmNlbDtcbiAgICAgIGlmICghdGhpcy5pc011bHRpRHJhZykgcmV0dXJuO1xuICAgICAgaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKGZhbHNlLCByb290RWwpO1xuICAgICAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgIGNzcyhjbG9uZSwgJ2Rpc3BsYXknLCAnJyk7XG4gICAgICB9KTtcbiAgICAgIGNsb25lTm93U2hvd24oKTtcbiAgICAgIGNsb25lc0hpZGRlbiA9IGZhbHNlO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBoaWRlQ2xvbmU6IGZ1bmN0aW9uIGhpZGVDbG9uZShfcmVmNSkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWY1LnNvcnRhYmxlLFxuICAgICAgICBjbG9uZU5vd0hpZGRlbiA9IF9yZWY1LmNsb25lTm93SGlkZGVuLFxuICAgICAgICBjYW5jZWwgPSBfcmVmNS5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICBjc3MoY2xvbmUsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgaWYgKF90aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUgJiYgY2xvbmUucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGNsb25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGNsb25lTm93SGlkZGVuKCk7XG4gICAgICBjbG9uZXNIaWRkZW4gPSB0cnVlO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBkcmFnU3RhcnRHbG9iYWw6IGZ1bmN0aW9uIGRyYWdTdGFydEdsb2JhbChfcmVmNikge1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjYuc29ydGFibGU7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcgJiYgbXVsdGlEcmFnU29ydGFibGUpIHtcbiAgICAgICAgbXVsdGlEcmFnU29ydGFibGUubXVsdGlEcmFnLl9kZXNlbGVjdE11bHRpRHJhZygpO1xuICAgICAgfVxuICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTb3J0IG11bHRpLWRyYWcgZWxlbWVudHNcbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzID0gbXVsdGlEcmFnRWxlbWVudHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICByZXR1cm4gYS5zb3J0YWJsZUluZGV4IC0gYi5zb3J0YWJsZUluZGV4O1xuICAgICAgfSk7XG4gICAgICBkcmFnU3RhcnRlZCA9IHRydWU7XG4gICAgfSxcbiAgICBkcmFnU3RhcnRlZDogZnVuY3Rpb24gZHJhZ1N0YXJ0ZWQoX3JlZjcpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuICAgICAgdmFyIHNvcnRhYmxlID0gX3JlZjcuc29ydGFibGU7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc29ydCkge1xuICAgICAgICAvLyBDYXB0dXJlIHJlY3RzLFxuICAgICAgICAvLyBoaWRlIG11bHRpIGRyYWcgZWxlbWVudHMgKGJ5IHBvc2l0aW9uaW5nIHRoZW0gYWJzb2x1dGUpLFxuICAgICAgICAvLyBzZXQgbXVsdGkgZHJhZyBlbGVtZW50cyByZWN0cyB0byBkcmFnUmVjdCxcbiAgICAgICAgLy8gc2hvdyBtdWx0aSBkcmFnIGVsZW1lbnRzLFxuICAgICAgICAvLyBhbmltYXRlIHRvIHJlY3RzLFxuICAgICAgICAvLyB1bnNldCByZWN0cyAmIHJlbW92ZSBmcm9tIERPTVxuXG4gICAgICAgIHNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgICAgICAgICAgY3NzKG11bHRpRHJhZ0VsZW1lbnQsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHZhciBkcmFnUmVjdCA9IGdldFJlY3QoZHJhZ0VsJDEsIGZhbHNlLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICAgICAgICAgIHNldFJlY3QobXVsdGlEcmFnRWxlbWVudCwgZHJhZ1JlY3QpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvbGRpbmcgPSB0cnVlO1xuICAgICAgICAgIGluaXRpYWxGb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc29ydGFibGUuYW5pbWF0ZUFsbChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgICAgICAgaW5pdGlhbEZvbGRpbmcgPSBmYWxzZTtcbiAgICAgICAgaWYgKF90aGlzMi5vcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHVuc2V0UmVjdChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSBhbGwgYXV4aWxpYXJ5IG11bHRpZHJhZyBpdGVtcyBmcm9tIGVsLCBpZiBzb3J0aW5nIGVuYWJsZWRcbiAgICAgICAgaWYgKF90aGlzMi5vcHRpb25zLnNvcnQpIHtcbiAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9LFxuICAgIGRyYWdPdmVyOiBmdW5jdGlvbiBkcmFnT3ZlcihfcmVmOCkge1xuICAgICAgdmFyIHRhcmdldCA9IF9yZWY4LnRhcmdldCxcbiAgICAgICAgY29tcGxldGVkID0gX3JlZjguY29tcGxldGVkLFxuICAgICAgICBjYW5jZWwgPSBfcmVmOC5jYW5jZWw7XG4gICAgICBpZiAoZm9sZGluZyAmJiB+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZih0YXJnZXQpKSB7XG4gICAgICAgIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIGNhbmNlbCgpO1xuICAgICAgfVxuICAgIH0sXG4gICAgcmV2ZXJ0OiBmdW5jdGlvbiByZXZlcnQoX3JlZjkpIHtcbiAgICAgIHZhciBmcm9tU29ydGFibGUgPSBfcmVmOS5mcm9tU29ydGFibGUsXG4gICAgICAgIHJvb3RFbCA9IF9yZWY5LnJvb3RFbCxcbiAgICAgICAgc29ydGFibGUgPSBfcmVmOS5zb3J0YWJsZSxcbiAgICAgICAgZHJhZ1JlY3QgPSBfcmVmOS5kcmFnUmVjdDtcbiAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgIC8vIFNldHVwIHVuZm9sZCBhbmltYXRpb25cbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgIHNvcnRhYmxlLmFkZEFuaW1hdGlvblN0YXRlKHtcbiAgICAgICAgICAgIHRhcmdldDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICAgIHJlY3Q6IGZvbGRpbmcgPyBnZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpIDogZHJhZ1JlY3RcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB1bnNldFJlY3QobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudC5mcm9tUmVjdCA9IGRyYWdSZWN0O1xuICAgICAgICAgIGZyb21Tb3J0YWJsZS5yZW1vdmVBbmltYXRpb25TdGF0ZShtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgICAgICAgaW5zZXJ0TXVsdGlEcmFnRWxlbWVudHMoIXRoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSwgcm9vdEVsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQ29tcGxldGVkOiBmdW5jdGlvbiBkcmFnT3ZlckNvbXBsZXRlZChfcmVmMTApIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWYxMC5zb3J0YWJsZSxcbiAgICAgICAgaXNPd25lciA9IF9yZWYxMC5pc093bmVyLFxuICAgICAgICBpbnNlcnRpb24gPSBfcmVmMTAuaW5zZXJ0aW9uLFxuICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IF9yZWYxMC5hY3RpdmVTb3J0YWJsZSxcbiAgICAgICAgcGFyZW50RWwgPSBfcmVmMTAucGFyZW50RWwsXG4gICAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjEwLnB1dFNvcnRhYmxlO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICBpZiAoaW5zZXJ0aW9uKSB7XG4gICAgICAgIC8vIENsb25lcyBtdXN0IGJlIGhpZGRlbiBiZWZvcmUgZm9sZGluZyBhbmltYXRpb24gdG8gY2FwdHVyZSBkcmFnUmVjdEFic29sdXRlIHByb3Blcmx5XG4gICAgICAgIGlmIChpc093bmVyKSB7XG4gICAgICAgICAgYWN0aXZlU29ydGFibGUuX2hpZGVDbG9uZSgpO1xuICAgICAgICB9XG4gICAgICAgIGluaXRpYWxGb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIC8vIElmIGxlYXZpbmcgc29ydDpmYWxzZSByb290LCBvciBhbHJlYWR5IGZvbGRpbmcgLSBGb2xkIHRvIG5ldyBsb2NhdGlvblxuICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24gJiYgbXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoID4gMSAmJiAoZm9sZGluZyB8fCAhaXNPd25lciAmJiAhYWN0aXZlU29ydGFibGUub3B0aW9ucy5zb3J0ICYmICFwdXRTb3J0YWJsZSkpIHtcbiAgICAgICAgICAvLyBGb2xkOiBTZXQgYWxsIG11bHRpIGRyYWcgZWxlbWVudHMncyByZWN0cyB0byBkcmFnRWwncyByZWN0IHdoZW4gbXVsdGktZHJhZyBlbGVtZW50cyBhcmUgaW52aXNpYmxlXG4gICAgICAgICAgdmFyIGRyYWdSZWN0QWJzb2x1dGUgPSBnZXRSZWN0KGRyYWdFbCQxLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgICAgICAgICBzZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQsIGRyYWdSZWN0QWJzb2x1dGUpO1xuXG4gICAgICAgICAgICAvLyBNb3ZlIGVsZW1lbnQocykgdG8gZW5kIG9mIHBhcmVudEVsIHNvIHRoYXQgaXQgZG9lcyBub3QgaW50ZXJmZXJlIHdpdGggbXVsdGktZHJhZyBjbG9uZXMgaW5zZXJ0aW9uIGlmIHRoZXkgYXJlIGluc2VydGVkXG4gICAgICAgICAgICAvLyB3aGlsZSBmb2xkaW5nLCBhbmQgc28gdGhhdCB3ZSBjYW4gY2FwdHVyZSB0aGVtIGFnYWluIGJlY2F1c2Ugb2xkIHNvcnRhYmxlIHdpbGwgbm8gbG9uZ2VyIGJlIGZyb21Tb3J0YWJsZVxuICAgICAgICAgICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgZm9sZGluZyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbG9uZXMgbXVzdCBiZSBzaG93biAoYW5kIGNoZWNrIHRvIHJlbW92ZSBtdWx0aSBkcmFncykgYWZ0ZXIgZm9sZGluZyB3aGVuIGludGVyZmVyaW5nIG11bHRpRHJhZ0VsZW1lbnRzIGFyZSBtb3ZlZCBvdXRcbiAgICAgICAgaWYgKCFpc093bmVyKSB7XG4gICAgICAgICAgLy8gT25seSByZW1vdmUgaWYgbm90IGZvbGRpbmcgKGZvbGRpbmcgd2lsbCByZW1vdmUgdGhlbSBhbnl3YXlzKVxuICAgICAgICAgIGlmICghZm9sZGluZykge1xuICAgICAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHZhciBjbG9uZXNIaWRkZW5CZWZvcmUgPSBjbG9uZXNIaWRkZW47XG4gICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5fc2hvd0Nsb25lKHNvcnRhYmxlKTtcblxuICAgICAgICAgICAgLy8gVW5mb2xkIGFuaW1hdGlvbiBmb3IgY2xvbmVzIGlmIHNob3dpbmcgZnJvbSBoaWRkZW5cbiAgICAgICAgICAgIGlmIChhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmFuaW1hdGlvbiAmJiAhY2xvbmVzSGlkZGVuICYmIGNsb25lc0hpZGRlbkJlZm9yZSkge1xuICAgICAgICAgICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5hZGRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgICAgICAgICB0YXJnZXQ6IGNsb25lLFxuICAgICAgICAgICAgICAgICAgcmVjdDogY2xvbmVzRnJvbVJlY3RcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjbG9uZS5mcm9tUmVjdCA9IGNsb25lc0Zyb21SZWN0O1xuICAgICAgICAgICAgICAgIGNsb25lLnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5fc2hvd0Nsb25lKHNvcnRhYmxlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQW5pbWF0aW9uQ2FwdHVyZTogZnVuY3Rpb24gZHJhZ092ZXJBbmltYXRpb25DYXB0dXJlKF9yZWYxMSkge1xuICAgICAgdmFyIGRyYWdSZWN0ID0gX3JlZjExLmRyYWdSZWN0LFxuICAgICAgICBpc093bmVyID0gX3JlZjExLmlzT3duZXIsXG4gICAgICAgIGFjdGl2ZVNvcnRhYmxlID0gX3JlZjExLmFjdGl2ZVNvcnRhYmxlO1xuICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGlmIChhY3RpdmVTb3J0YWJsZS5vcHRpb25zLmFuaW1hdGlvbiAmJiAhaXNPd25lciAmJiBhY3RpdmVTb3J0YWJsZS5tdWx0aURyYWcuaXNNdWx0aURyYWcpIHtcbiAgICAgICAgY2xvbmVzRnJvbVJlY3QgPSBfZXh0ZW5kcyh7fSwgZHJhZ1JlY3QpO1xuICAgICAgICB2YXIgZHJhZ01hdHJpeCA9IG1hdHJpeChkcmFnRWwkMSwgdHJ1ZSk7XG4gICAgICAgIGNsb25lc0Zyb21SZWN0LnRvcCAtPSBkcmFnTWF0cml4LmY7XG4gICAgICAgIGNsb25lc0Zyb21SZWN0LmxlZnQgLT0gZHJhZ01hdHJpeC5lO1xuICAgICAgfVxuICAgIH0sXG4gICAgZHJhZ092ZXJBbmltYXRpb25Db21wbGV0ZTogZnVuY3Rpb24gZHJhZ092ZXJBbmltYXRpb25Db21wbGV0ZSgpIHtcbiAgICAgIGlmIChmb2xkaW5nKSB7XG4gICAgICAgIGZvbGRpbmcgPSBmYWxzZTtcbiAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyb3A6IGZ1bmN0aW9uIGRyb3AoX3JlZjEyKSB7XG4gICAgICB2YXIgZXZ0ID0gX3JlZjEyLm9yaWdpbmFsRXZlbnQsXG4gICAgICAgIHJvb3RFbCA9IF9yZWYxMi5yb290RWwsXG4gICAgICAgIHBhcmVudEVsID0gX3JlZjEyLnBhcmVudEVsLFxuICAgICAgICBzb3J0YWJsZSA9IF9yZWYxMi5zb3J0YWJsZSxcbiAgICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50ID0gX3JlZjEyLmRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICAgICAgb2xkSW5kZXggPSBfcmVmMTIub2xkSW5kZXgsXG4gICAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjEyLnB1dFNvcnRhYmxlO1xuICAgICAgdmFyIHRvU29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCB0aGlzLnNvcnRhYmxlO1xuICAgICAgaWYgKCFldnQpIHJldHVybjtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICBjaGlsZHJlbiA9IHBhcmVudEVsLmNoaWxkcmVuO1xuXG4gICAgICAvLyBNdWx0aS1kcmFnIHNlbGVjdGlvblxuICAgICAgaWYgKCFkcmFnU3RhcnRlZCkge1xuICAgICAgICBpZiAob3B0aW9ucy5tdWx0aURyYWdLZXkgJiYgIXRoaXMubXVsdGlEcmFnS2V5RG93bikge1xuICAgICAgICAgIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG4gICAgICAgIH1cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsJDEsIG9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgIX5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKSk7XG4gICAgICAgIGlmICghfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZHJhZ0VsJDEpKSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMucHVzaChkcmFnRWwkMSk7XG4gICAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgICAgICByb290RWw6IHJvb3RFbCxcbiAgICAgICAgICAgIG5hbWU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgdGFyZ2V0RWw6IGRyYWdFbCQxLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBNb2RpZmllciBhY3RpdmF0ZWQsIHNlbGVjdCBmcm9tIGxhc3QgdG8gZHJhZ0VsXG4gICAgICAgICAgaWYgKGV2dC5zaGlmdEtleSAmJiBsYXN0TXVsdGlEcmFnU2VsZWN0ICYmIHNvcnRhYmxlLmVsLmNvbnRhaW5zKGxhc3RNdWx0aURyYWdTZWxlY3QpKSB7XG4gICAgICAgICAgICB2YXIgbGFzdEluZGV4ID0gaW5kZXgobGFzdE11bHRpRHJhZ1NlbGVjdCksXG4gICAgICAgICAgICAgIGN1cnJlbnRJbmRleCA9IGluZGV4KGRyYWdFbCQxKTtcbiAgICAgICAgICAgIGlmICh+bGFzdEluZGV4ICYmIH5jdXJyZW50SW5kZXggJiYgbGFzdEluZGV4ICE9PSBjdXJyZW50SW5kZXgpIHtcbiAgICAgICAgICAgICAgLy8gTXVzdCBpbmNsdWRlIGxhc3RNdWx0aURyYWdTZWxlY3QgKHNlbGVjdCBpdCksIGluIGNhc2UgbW9kaWZpZWQgc2VsZWN0aW9uIGZyb20gbm8gc2VsZWN0aW9uXG4gICAgICAgICAgICAgIC8vIChidXQgcHJldmlvdXMgc2VsZWN0aW9uIGV4aXN0ZWQpXG4gICAgICAgICAgICAgIHZhciBuLCBpO1xuICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gbGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgaSA9IGxhc3RJbmRleDtcbiAgICAgICAgICAgICAgICBuID0gY3VycmVudEluZGV4O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGkgPSBjdXJyZW50SW5kZXg7XG4gICAgICAgICAgICAgICAgbiA9IGxhc3RJbmRleCArIDE7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZm9yICg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAofm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoY2hpbGRyZW5baV0pKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB0b2dnbGVDbGFzcyhjaGlsZHJlbltpXSwgb3B0aW9ucy5zZWxlY3RlZENsYXNzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5wdXNoKGNoaWxkcmVuW2ldKTtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgICAgICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICAgICAgICAgICAgbmFtZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICAgICAgICB0YXJnZXRFbDogY2hpbGRyZW5baV0sXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXN0TXVsdGlEcmFnU2VsZWN0ID0gZHJhZ0VsJDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gdG9Tb3J0YWJsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5zcGxpY2UobXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSksIDEpO1xuICAgICAgICAgIGxhc3RNdWx0aURyYWdTZWxlY3QgPSBudWxsO1xuICAgICAgICAgIGRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlLFxuICAgICAgICAgICAgcm9vdEVsOiByb290RWwsXG4gICAgICAgICAgICBuYW1lOiAnZGVzZWxlY3QnLFxuICAgICAgICAgICAgdGFyZ2V0RWw6IGRyYWdFbCQxLFxuICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTXVsdGktZHJhZyBkcm9wXG4gICAgICBpZiAoZHJhZ1N0YXJ0ZWQgJiYgdGhpcy5pc011bHRpRHJhZykge1xuICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIC8vIERvIG5vdCBcInVuZm9sZFwiIGFmdGVyIGFyb3VuZCBkcmFnRWwgaWYgcmV2ZXJ0ZWRcbiAgICAgICAgaWYgKChwYXJlbnRFbFtleHBhbmRvXS5vcHRpb25zLnNvcnQgfHwgcGFyZW50RWwgIT09IHJvb3RFbCkgJiYgbXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHZhciBkcmFnUmVjdCA9IGdldFJlY3QoZHJhZ0VsJDEpLFxuICAgICAgICAgICAgbXVsdGlEcmFnSW5kZXggPSBpbmRleChkcmFnRWwkMSwgJzpub3QoLicgKyB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcyArICcpJyk7XG4gICAgICAgICAgaWYgKCFpbml0aWFsRm9sZGluZyAmJiBvcHRpb25zLmFuaW1hdGlvbikgZHJhZ0VsJDEudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgICB0b1NvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgICAgIGlmICghaW5pdGlhbEZvbGRpbmcpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICAgICAgICBkcmFnRWwkMS5mcm9tUmVjdCA9IGRyYWdSZWN0O1xuICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudC50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ICE9PSBkcmFnRWwkMSkge1xuICAgICAgICAgICAgICAgICAgdmFyIHJlY3QgPSBmb2xkaW5nID8gZ2V0UmVjdChtdWx0aURyYWdFbGVtZW50KSA6IGRyYWdSZWN0O1xuICAgICAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudC5mcm9tUmVjdCA9IHJlY3Q7XG5cbiAgICAgICAgICAgICAgICAgIC8vIFByZXBhcmUgdW5mb2xkIGFuaW1hdGlvblxuICAgICAgICAgICAgICAgICAgdG9Tb3J0YWJsZS5hZGRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgcmVjdDogcmVjdFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTXVsdGkgZHJhZyBlbGVtZW50cyBhcmUgbm90IG5lY2Vzc2FyaWx5IHJlbW92ZWQgZnJvbSB0aGUgRE9NIG9uIGRyb3AsIHNvIHRvIHJlaW5zZXJ0XG4gICAgICAgICAgICAvLyBwcm9wZXJseSB0aGV5IG11c3QgYWxsIGJlIHJlbW92ZWRcbiAgICAgICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICAgIGlmIChjaGlsZHJlblttdWx0aURyYWdJbmRleF0pIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRFbC5pbnNlcnRCZWZvcmUobXVsdGlEcmFnRWxlbWVudCwgY2hpbGRyZW5bbXVsdGlEcmFnSW5kZXhdKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXJlbnRFbC5hcHBlbmRDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtdWx0aURyYWdJbmRleCsrO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIElmIGluaXRpYWwgZm9sZGluZyBpcyBkb25lLCB0aGUgZWxlbWVudHMgbWF5IGhhdmUgY2hhbmdlZCBwb3NpdGlvbiBiZWNhdXNlIHRoZXkgYXJlIG5vd1xuICAgICAgICAgICAgLy8gdW5mb2xkaW5nIGFyb3VuZCBkcmFnRWwsIGV2ZW4gdGhvdWdoIGRyYWdFbCBtYXkgbm90IGhhdmUgaGlzIGluZGV4IGNoYW5nZWQsIHNvIHVwZGF0ZSBldmVudFxuICAgICAgICAgICAgLy8gbXVzdCBiZSBmaXJlZCBoZXJlIGFzIFNvcnRhYmxlIHdpbGwgbm90LlxuICAgICAgICAgICAgaWYgKG9sZEluZGV4ID09PSBpbmRleChkcmFnRWwkMSkpIHtcbiAgICAgICAgICAgICAgdmFyIHVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQuc29ydGFibGVJbmRleCAhPT0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgIHVwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKHVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCgndXBkYXRlJyk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50KCdzb3J0Jyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBNdXN0IGJlIGRvbmUgYWZ0ZXIgY2FwdHVyaW5nIGluZGl2aWR1YWwgcmVjdHMgKHNjcm9sbCBiYXIpXG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgdW5zZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRvU29ydGFibGUuYW5pbWF0ZUFsbCgpO1xuICAgICAgICB9XG4gICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gdG9Tb3J0YWJsZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIGNsb25lcyBpZiBuZWNlc3NhcnlcbiAgICAgIGlmIChyb290RWwgPT09IHBhcmVudEVsIHx8IHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlICE9PSAnY2xvbmUnKSB7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICAgIGNsb25lLnBhcmVudE5vZGUgJiYgY2xvbmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjbG9uZSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgbnVsbGluZ0dsb2JhbDogZnVuY3Rpb24gbnVsbGluZ0dsb2JhbCgpIHtcbiAgICAgIHRoaXMuaXNNdWx0aURyYWcgPSBkcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgICAgbXVsdGlEcmFnQ2xvbmVzLmxlbmd0aCA9IDA7XG4gICAgfSxcbiAgICBkZXN0cm95R2xvYmFsOiBmdW5jdGlvbiBkZXN0cm95R2xvYmFsKCkge1xuICAgICAgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ3BvaW50ZXJ1cCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaGVuZCcsIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ2tleWRvd24nLCB0aGlzLl9jaGVja0tleURvd24pO1xuICAgICAgb2ZmKGRvY3VtZW50LCAna2V5dXAnLCB0aGlzLl9jaGVja0tleVVwKTtcbiAgICB9LFxuICAgIF9kZXNlbGVjdE11bHRpRHJhZzogZnVuY3Rpb24gX2Rlc2VsZWN0TXVsdGlEcmFnKGV2dCkge1xuICAgICAgaWYgKHR5cGVvZiBkcmFnU3RhcnRlZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkcmFnU3RhcnRlZCkgcmV0dXJuO1xuXG4gICAgICAvLyBPbmx5IGRlc2VsZWN0IGlmIHNlbGVjdGlvbiBpcyBpbiB0aGlzIHNvcnRhYmxlXG4gICAgICBpZiAobXVsdGlEcmFnU29ydGFibGUgIT09IHRoaXMuc29ydGFibGUpIHJldHVybjtcblxuICAgICAgLy8gT25seSBkZXNlbGVjdCBpZiB0YXJnZXQgaXMgbm90IGl0ZW0gaW4gdGhpcyBzb3J0YWJsZVxuICAgICAgaWYgKGV2dCAmJiBjbG9zZXN0KGV2dC50YXJnZXQsIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUsIHRoaXMuc29ydGFibGUuZWwsIGZhbHNlKSkgcmV0dXJuO1xuXG4gICAgICAvLyBPbmx5IGRlc2VsZWN0IGlmIGxlZnQgY2xpY2tcbiAgICAgIGlmIChldnQgJiYgZXZ0LmJ1dHRvbiAhPT0gMCkgcmV0dXJuO1xuICAgICAgd2hpbGUgKG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICB2YXIgZWwgPSBtdWx0aURyYWdFbGVtZW50c1swXTtcbiAgICAgICAgdG9nZ2xlQ2xhc3MoZWwsIHRoaXMub3B0aW9ucy5zZWxlY3RlZENsYXNzLCBmYWxzZSk7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnNoaWZ0KCk7XG4gICAgICAgIGRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLnNvcnRhYmxlLFxuICAgICAgICAgIHJvb3RFbDogdGhpcy5zb3J0YWJsZS5lbCxcbiAgICAgICAgICBuYW1lOiAnZGVzZWxlY3QnLFxuICAgICAgICAgIHRhcmdldEVsOiBlbCxcbiAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICBfY2hlY2tLZXlEb3duOiBmdW5jdGlvbiBfY2hlY2tLZXlEb3duKGV2dCkge1xuICAgICAgaWYgKGV2dC5rZXkgPT09IHRoaXMub3B0aW9ucy5tdWx0aURyYWdLZXkpIHtcbiAgICAgICAgdGhpcy5tdWx0aURyYWdLZXlEb3duID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIF9jaGVja0tleVVwOiBmdW5jdGlvbiBfY2hlY2tLZXlVcChldnQpIHtcbiAgICAgIGlmIChldnQua2V5ID09PSB0aGlzLm9wdGlvbnMubXVsdGlEcmFnS2V5KSB7XG4gICAgICAgIHRoaXMubXVsdGlEcmFnS2V5RG93biA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzKE11bHRpRHJhZywge1xuICAgIC8vIFN0YXRpYyBtZXRob2RzICYgcHJvcGVydGllc1xuICAgIHBsdWdpbk5hbWU6ICdtdWx0aURyYWcnLFxuICAgIHV0aWxzOiB7XG4gICAgICAvKipcclxuICAgICAgICogU2VsZWN0cyB0aGUgcHJvdmlkZWQgbXVsdGktZHJhZyBpdGVtXHJcbiAgICAgICAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbCAgICBUaGUgZWxlbWVudCB0byBiZSBzZWxlY3RlZFxyXG4gICAgICAgKi9cbiAgICAgIHNlbGVjdDogZnVuY3Rpb24gc2VsZWN0KGVsKSB7XG4gICAgICAgIHZhciBzb3J0YWJsZSA9IGVsLnBhcmVudE5vZGVbZXhwYW5kb107XG4gICAgICAgIGlmICghc29ydGFibGUgfHwgIXNvcnRhYmxlLm9wdGlvbnMubXVsdGlEcmFnIHx8IH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGVsKSkgcmV0dXJuO1xuICAgICAgICBpZiAobXVsdGlEcmFnU29ydGFibGUgJiYgbXVsdGlEcmFnU29ydGFibGUgIT09IHNvcnRhYmxlKSB7XG4gICAgICAgICAgbXVsdGlEcmFnU29ydGFibGUubXVsdGlEcmFnLl9kZXNlbGVjdE11bHRpRHJhZygpO1xuICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlID0gc29ydGFibGU7XG4gICAgICAgIH1cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZWwsIHNvcnRhYmxlLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgdHJ1ZSk7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnB1c2goZWwpO1xuICAgICAgfSxcbiAgICAgIC8qKlxyXG4gICAgICAgKiBEZXNlbGVjdHMgdGhlIHByb3ZpZGVkIG11bHRpLWRyYWcgaXRlbVxyXG4gICAgICAgKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgVGhlIGVsZW1lbnQgdG8gYmUgZGVzZWxlY3RlZFxyXG4gICAgICAgKi9cbiAgICAgIGRlc2VsZWN0OiBmdW5jdGlvbiBkZXNlbGVjdChlbCkge1xuICAgICAgICB2YXIgc29ydGFibGUgPSBlbC5wYXJlbnROb2RlW2V4cGFuZG9dLFxuICAgICAgICAgIGluZGV4ID0gbXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihlbCk7XG4gICAgICAgIGlmICghc29ydGFibGUgfHwgIXNvcnRhYmxlLm9wdGlvbnMubXVsdGlEcmFnIHx8ICF+aW5kZXgpIHJldHVybjtcbiAgICAgICAgdG9nZ2xlQ2xhc3MoZWwsIHNvcnRhYmxlLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgZmFsc2UpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH0sXG4gICAgZXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBldmVudFByb3BlcnRpZXMoKSB7XG4gICAgICB2YXIgX3RoaXMzID0gdGhpcztcbiAgICAgIHZhciBvbGRJbmRpY2llcyA9IFtdLFxuICAgICAgICBuZXdJbmRpY2llcyA9IFtdO1xuICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICBvbGRJbmRpY2llcy5wdXNoKHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50OiBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgIGluZGV4OiBtdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXhcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gbXVsdGlEcmFnRWxlbWVudHMgd2lsbCBhbHJlYWR5IGJlIHNvcnRlZCBpZiBmb2xkaW5nXG4gICAgICAgIHZhciBuZXdJbmRleDtcbiAgICAgICAgaWYgKGZvbGRpbmcgJiYgbXVsdGlEcmFnRWxlbWVudCAhPT0gZHJhZ0VsJDEpIHtcbiAgICAgICAgICBuZXdJbmRleCA9IC0xO1xuICAgICAgICB9IGVsc2UgaWYgKGZvbGRpbmcpIHtcbiAgICAgICAgICBuZXdJbmRleCA9IGluZGV4KG11bHRpRHJhZ0VsZW1lbnQsICc6bm90KC4nICsgX3RoaXMzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcyArICcpJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3SW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgICBuZXdJbmRpY2llcy5wdXNoKHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50OiBtdWx0aURyYWdFbGVtZW50LFxuICAgICAgICAgIGluZGV4OiBuZXdJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaXRlbXM6IF90b0NvbnN1bWFibGVBcnJheShtdWx0aURyYWdFbGVtZW50cyksXG4gICAgICAgIGNsb25lczogW10uY29uY2F0KG11bHRpRHJhZ0Nsb25lcyksXG4gICAgICAgIG9sZEluZGljaWVzOiBvbGRJbmRpY2llcyxcbiAgICAgICAgbmV3SW5kaWNpZXM6IG5ld0luZGljaWVzXG4gICAgICB9O1xuICAgIH0sXG4gICAgb3B0aW9uTGlzdGVuZXJzOiB7XG4gICAgICBtdWx0aURyYWdLZXk6IGZ1bmN0aW9uIG11bHRpRHJhZ0tleShrZXkpIHtcbiAgICAgICAga2V5ID0ga2V5LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChrZXkgPT09ICdjdHJsJykge1xuICAgICAgICAgIGtleSA9ICdDb250cm9sJztcbiAgICAgICAgfSBlbHNlIGlmIChrZXkubGVuZ3RoID4gMSkge1xuICAgICAgICAgIGtleSA9IGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHIoMSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gaW5zZXJ0TXVsdGlEcmFnRWxlbWVudHMoY2xvbmVzSW5zZXJ0ZWQsIHJvb3RFbCkge1xuICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50LCBpKSB7XG4gICAgdmFyIHRhcmdldCA9IHJvb3RFbC5jaGlsZHJlblttdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggKyAoY2xvbmVzSW5zZXJ0ZWQgPyBOdW1iZXIoaSkgOiAwKV07XG4gICAgaWYgKHRhcmdldCkge1xuICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShtdWx0aURyYWdFbGVtZW50LCB0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByb290RWwuYXBwZW5kQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXHJcbiAqIEluc2VydCBtdWx0aS1kcmFnIGNsb25lc1xyXG4gKiBAcGFyYW0gIHtbQm9vbGVhbl19IGVsZW1lbnRzSW5zZXJ0ZWQgIFdoZXRoZXIgdGhlIG11bHRpLWRyYWcgZWxlbWVudHMgYXJlIGluc2VydGVkXHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSByb290RWxcclxuICovXG5mdW5jdGlvbiBpbnNlcnRNdWx0aURyYWdDbG9uZXMoZWxlbWVudHNJbnNlcnRlZCwgcm9vdEVsKSB7XG4gIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSwgaSkge1xuICAgIHZhciB0YXJnZXQgPSByb290RWwuY2hpbGRyZW5bY2xvbmUuc29ydGFibGVJbmRleCArIChlbGVtZW50c0luc2VydGVkID8gTnVtYmVyKGkpIDogMCldO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChjbG9uZSk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCkge1xuICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgbXVsdGlEcmFnRWxlbWVudC5wYXJlbnROb2RlICYmIG11bHRpRHJhZ0VsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtdWx0aURyYWdFbGVtZW50KTtcbiAgfSk7XG59XG5cblNvcnRhYmxlLm1vdW50KG5ldyBBdXRvU2Nyb2xsUGx1Z2luKCkpO1xuU29ydGFibGUubW91bnQoUmVtb3ZlLCBSZXZlcnQpO1xuXG5leHBvcnQgZGVmYXVsdCBTb3J0YWJsZTtcbmV4cG9ydCB7IE11bHRpRHJhZ1BsdWdpbiBhcyBNdWx0aURyYWcsIFNvcnRhYmxlLCBTd2FwUGx1Z2luIGFzIFN3YXAgfTtcbiIsICJpbXBvcnQgU29ydGFibGUgZnJvbSAnc29ydGFibGVqcydcblxud2luZG93LlNvcnRhYmxlID0gU29ydGFibGVcblxuaWYgKHR5cGVvZiB3aW5kb3cuTGl2ZXdpcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gIHRocm93ICdMaXZld2lyZSBTb3J0YWJsZSBQbHVnaW46IHdpbmRvdy5MaXZld2lyZSBpcyB1bmRlZmluZWQuIE1ha2Ugc3VyZSBAbGl2ZXdpcmVTY3JpcHRzIGlzIHBsYWNlZCBhYm92ZSB0aGlzIHNjcmlwdCBpbmNsdWRlJ1xufVxuXG5jb25zdCBtb3ZlRW5kTW9ycGhNYXJrZXIgPSAoZWwpID0+IHtcbiAgY29uc3QgZW5kTW9ycGhNYXJrZXIgPSBBcnJheS5mcm9tKGVsLmNoaWxkTm9kZXMpLmZpbHRlcigoY2hpbGROb2RlKSA9PiB7XG4gICAgcmV0dXJuIGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gOCAmJiBbJ1tpZiBFTkRCTE9DS10+PCFbZW5kaWZdJywgJ19fRU5EQkxPQ0tfXyddLmluY2x1ZGVzKGNoaWxkTm9kZS5ub2RlVmFsdWU/LnRyaW0oKSlcbiAgfSlbMF07XG5cbiAgaWYgKGVuZE1vcnBoTWFya2VyKSB7XG4gICAgZWwuYXBwZW5kQ2hpbGQoZW5kTW9ycGhNYXJrZXIpXG4gIH1cbn1cblxuTGl2ZXdpcmUuZGlyZWN0aXZlKCdzb3J0YWJsZScsICh7IGVsLCBkaXJlY3RpdmUsIGNvbXBvbmVudCB9KSA9PiB7XG4gIGlmIChkaXJlY3RpdmUubW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm5cbiAgfVxuXG4gIGxldCBvcHRpb25zID0ge31cblxuICBpZiAoZWwuaGFzQXR0cmlidXRlKCd3aXJlOnNvcnRhYmxlLm9wdGlvbnMnKSkge1xuICAgIG9wdGlvbnMgPSAobmV3IEZ1bmN0aW9uKGByZXR1cm4gJHtlbC5nZXRBdHRyaWJ1dGUoJ3dpcmU6c29ydGFibGUub3B0aW9ucycpfTtgKSkoKVxuICB9XG5cbiAgZWwubGl2ZXdpcmVfc29ydGFibGUgPSB3aW5kb3cuU29ydGFibGUuY3JlYXRlKGVsLCB7XG4gICAgc29ydDogdHJ1ZSxcbiAgICAuLi5vcHRpb25zLFxuICAgIGRyYWdnYWJsZTogJ1t3aXJlXFxcXDpzb3J0YWJsZVxcXFwuaXRlbV0nLFxuICAgIGhhbmRsZTogZWwucXVlcnlTZWxlY3RvcignW3dpcmVcXFxcOnNvcnRhYmxlXFxcXC5oYW5kbGVdJykgPyAnW3dpcmVcXFxcOnNvcnRhYmxlXFxcXC5oYW5kbGVdJyA6IG51bGwsXG4gICAgZGF0YUlkQXR0cjogJ3dpcmU6c29ydGFibGUuaXRlbScsXG4gICAgZ3JvdXA6IHtcbiAgICAgIHB1bGw6IGZhbHNlLFxuICAgICAgcHV0OiBmYWxzZSxcbiAgICAgIC4uLm9wdGlvbnMuZ3JvdXAsXG4gICAgICBuYW1lOiBlbC5nZXRBdHRyaWJ1dGUoJ3dpcmU6c29ydGFibGUnKSxcbiAgICB9LFxuICAgIHN0b3JlOiB7XG4gICAgICAuLi5vcHRpb25zLnN0b3JlLFxuICAgICAgc2V0OiBmdW5jdGlvbiAoc29ydGFibGUpIHtcbiAgICAgICAgbGV0IGl0ZW1zID0gc29ydGFibGUudG9BcnJheSgpLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG9yZGVyOiBpbmRleCArIDEsXG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIG1vdmVFbmRNb3JwaE1hcmtlcihlbClcblxuICAgICAgICBjb21wb25lbnQuJHdpcmUuY2FsbChkaXJlY3RpdmUubWV0aG9kLCBpdGVtcylcbiAgICAgIH0sXG4gICAgfSxcbiAgfSlcblxuICBsZXQgaGFzU2V0SGFuZGxlQ29ycmVjdGx5ID0gZWwucXVlcnlTZWxlY3RvcignW3dpcmVcXFxcOnNvcnRhYmxlXFxcXC5pdGVtXScpICE9PSBudWxsXG5cbiAgLy8gSWYgdGhlcmUgYXJlIGFscmVhZHkgaXRlbXMsIHRoZW4gdGhlICdoYW5kbGUnIG9wdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGNvcnJlY3RseSBzZXQuXG4gIC8vIFRoZSBvcHRpb24gZG9lcyBub3QgaGF2ZSB0byByZWV2YWx1YXRlZCBhZnRlciB0aGUgbmV4dCBMaXZld2lyZSBjb21wb25lbnQgdXBkYXRlLlxuICBpZiAoaGFzU2V0SGFuZGxlQ29ycmVjdGx5KSB7XG4gICAgcmV0dXJuXG4gIH1cblxuICBjb25zdCBjdXJyZW50Q29tcG9uZW50ID0gY29tcG9uZW50XG5cbiAgTGl2ZXdpcmUuaG9vaygnY29tbWl0JywgKHsgY29tcG9uZW50LCBzdWNjZWVkIH0pID0+IHtcbiAgICBpZiAoY29tcG9uZW50LmlkICE9PSBjdXJyZW50Q29tcG9uZW50LmlkKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoaGFzU2V0SGFuZGxlQ29ycmVjdGx5KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBzdWNjZWVkKCgpID0+IHtcbiAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgZWwubGl2ZXdpcmVfc29ydGFibGUub3B0aW9uKCdoYW5kbGUnLCBlbC5xdWVyeVNlbGVjdG9yKCdbd2lyZVxcXFw6c29ydGFibGVcXFxcLmhhbmRsZV0nKSA/ICdbd2lyZVxcXFw6c29ydGFibGVcXFxcLmhhbmRsZV0nIDogbnVsbClcblxuICAgICAgICBoYXNTZXRIYW5kbGVDb3JyZWN0bHkgPSBlbC5xdWVyeVNlbGVjdG9yKCdbd2lyZVxcXFw6c29ydGFibGVcXFxcLml0ZW1dJykgIT09IG51bGxcbiAgICAgIH0pXG4gICAgfSlcbiAgfSlcbn0pXG5cbkxpdmV3aXJlLmRpcmVjdGl2ZSgnc29ydGFibGUtZ3JvdXAnLCAoeyBlbCwgZGlyZWN0aXZlLCBjb21wb25lbnQgfSkgPT4ge1xuICAvLyBPbmx5IGZpcmUgdGhpcyBoYW5kbGVyIG9uIHRoZSBcInJvb3RcIiBncm91cCBkaXJlY3RpdmUuXG4gIGlmICghIGRpcmVjdGl2ZS5tb2RpZmllcnMuaW5jbHVkZXMoJ2l0ZW0tZ3JvdXAnKSkge1xuICAgIHJldHVyblxuICB9XG5cbiAgbGV0IG9wdGlvbnMgPSB7fVxuXG4gIGlmIChlbC5oYXNBdHRyaWJ1dGUoJ3dpcmU6c29ydGFibGUtZ3JvdXAub3B0aW9ucycpKSB7XG4gICAgb3B0aW9ucyA9IChuZXcgRnVuY3Rpb24oYHJldHVybiAke2VsLmdldEF0dHJpYnV0ZSgnd2lyZTpzb3J0YWJsZS1ncm91cC5vcHRpb25zJyl9O2ApKSgpO1xuICB9XG5cbiAgZWwubGl2ZXdpcmVfc29ydGFibGUgPSB3aW5kb3cuU29ydGFibGUuY3JlYXRlKGVsLCB7XG4gICAgc29ydDogdHJ1ZSxcbiAgICAuLi5vcHRpb25zLFxuICAgIGRyYWdnYWJsZTogJ1t3aXJlXFxcXDpzb3J0YWJsZS1ncm91cFxcXFwuaXRlbV0nLFxuICAgIGhhbmRsZTogJ1t3aXJlXFxcXDpzb3J0YWJsZS1ncm91cFxcXFwuaGFuZGxlXScsXG4gICAgZGF0YUlkQXR0cjogJ3dpcmU6c29ydGFibGUtZ3JvdXAuaXRlbScsXG4gICAgZ3JvdXA6IHtcbiAgICAgIHB1bGw6IHRydWUsXG4gICAgICBwdXQ6IHRydWUsXG4gICAgICAuLi5vcHRpb25zLmdyb3VwLFxuICAgICAgbmFtZTogZWwuY2xvc2VzdCgnW3dpcmVcXFxcOnNvcnRhYmxlLWdyb3VwXScpLmdldEF0dHJpYnV0ZSgnd2lyZTpzb3J0YWJsZS1ncm91cCcpLFxuICAgIH0sXG4gICAgb25Tb3J0OiAoZXZ0KSA9PiB7XG4gICAgICBpZiAoZXZ0LnRvICE9PSBldnQuZnJvbSAmJiBlbCA9PT0gZXZ0LmZyb20pIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIGxldCBtYXN0ZXJFbCA9IGVsLmNsb3Nlc3QoJ1t3aXJlXFxcXDpzb3J0YWJsZS1ncm91cF0nKVxuXG4gICAgICBsZXQgZ3JvdXBzID0gQXJyYXkuZnJvbShtYXN0ZXJFbC5xdWVyeVNlbGVjdG9yQWxsKCdbd2lyZVxcXFw6c29ydGFibGUtZ3JvdXBcXFxcLml0ZW0tZ3JvdXBdJykpLm1hcCgoZWwsIGluZGV4KSA9PiB7XG4gICAgICAgIG1vdmVFbmRNb3JwaE1hcmtlcihlbClcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG9yZGVyOiBpbmRleCArIDEsXG4gICAgICAgICAgdmFsdWU6IGVsLmdldEF0dHJpYnV0ZSgnd2lyZTpzb3J0YWJsZS1ncm91cC5pdGVtLWdyb3VwJyksXG4gICAgICAgICAgaXRlbXM6ICBlbC5saXZld2lyZV9zb3J0YWJsZS50b0FycmF5KCkubWFwKCh2YWx1ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIG9yZGVyOiBpbmRleCArIDEsXG4gICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pLFxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICBtYXN0ZXJFbC5jbG9zZXN0KCdbd2lyZVxcXFw6aWRdJykuX19saXZld2lyZS4kd2lyZS5jYWxsKG1hc3RlckVsLmdldEF0dHJpYnV0ZSgnd2lyZTpzb3J0YWJsZS1ncm91cCcpLCBncm91cHMpXG4gICAgfSxcbiAgfSlcbn0pXG4iLCAiaW1wb3J0IFNsaWRlT3ZlclBhbmVsIGZyb20gJy4vY29tcG9uZW50cy9wYW5lbCdcbmltcG9ydCBTZWxlY3RUcmVlIGZyb20gJy4vY29tcG9uZW50cy9zZWxlY3QtdHJlZSdcbmltcG9ydCAnLi9jb21wb25lbnRzL3NvcnRhYmxlJ1xuXG53aW5kb3cuU2xpZGVPdmVyUGFuZWwgPSBTbGlkZU92ZXJQYW5lbFxud2luZG93LnNlbGVjdFRyZWUgPSBTZWxlY3RUcmVlXG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2FscGluZTppbml0JywgKCkgPT4ge1xuICBjb25zdCB0aGVtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0aGVtZScpID8/ICdzeXN0ZW0nXG5cbiAgd2luZG93LkFscGluZS5zdG9yZShcbiAgICAndGhlbWUnLFxuICAgIHRoZW1lID09PSAnZGFyaycgfHxcbiAgICAodGhlbWUgPT09ICdzeXN0ZW0nICYmXG4gICAgICB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXMpXG4gICAgICA/ICdkYXJrJ1xuICAgICAgOiAnbGlnaHQnLFxuICApXG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RoZW1lLWNoYW5nZWQnLCAoZXZlbnQpID0+IHtcbiAgICBsZXQgdGhlbWUgPSBldmVudC5kZXRhaWxcblxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCd0aGVtZScsIHRoZW1lKVxuXG4gICAgaWYgKHRoZW1lID09PSAnc3lzdGVtJykge1xuICAgICAgdGhlbWUgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXNcbiAgICAgICAgPyAnZGFyaydcbiAgICAgICAgOiAnbGlnaHQnXG4gICAgfVxuXG4gICAgd2luZG93LkFscGluZS5zdG9yZSgndGhlbWUnLCB0aGVtZSlcbiAgfSlcblxuICB3aW5kb3dcbiAgICAubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpXG4gICAgLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldmVudCkgPT4ge1xuICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0aGVtZScpID09PSAnc3lzdGVtJykge1xuICAgICAgICB3aW5kb3cuQWxwaW5lLnN0b3JlKCd0aGVtZScsIGV2ZW50Lm1hdGNoZXMgPyAnZGFyaycgOiAnbGlnaHQnKVxuICAgICAgfVxuICAgIH0pXG5cbiAgd2luZG93LkFscGluZS5lZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHRoZW1lID0gd2luZG93LkFscGluZS5zdG9yZSgndGhlbWUnKVxuXG4gICAgdGhlbWUgPT09ICdkYXJrJ1xuICAgICAgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZGFyaycpXG4gICAgICA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkYXJrJylcbiAgfSlcbn0pXG4iXSwKICAibWFwcGluZ3MiOiAiOztBQUFBLE1BQU0saUJBQWlCLE1BQU07QUFDM0IsV0FBTztBQUFBLE1BQ0wsTUFBTTtBQUFBLE1BQ04scUJBQXFCO0FBQUEsTUFDckIsaUJBQWlCO0FBQUEsTUFDakIsa0JBQWtCLENBQUM7QUFBQSxNQUNuQixZQUFZO0FBQUEsTUFDWixXQUFXLENBQUM7QUFBQSxNQUNaLGlDQUFpQyxLQUFLO0FBQ3BDLFlBQUksS0FBSyxNQUFNLElBQUksWUFBWSxFQUFFLEtBQUssZUFBZSxNQUFNLFFBQVc7QUFDcEUsaUJBQU8sS0FBSyxNQUFNLElBQUksWUFBWSxFQUFFLEtBQUssZUFBZSxFQUFFLGlCQUFpQixFQUFFLEdBQUc7QUFBQSxRQUNsRjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLG1CQUFtQixTQUFTO0FBQzFCLFlBQUksS0FBSyxpQ0FBaUMsZUFBZSxNQUFNLE9BQU87QUFDcEU7QUFBQSxRQUNGO0FBRUEsWUFBSSxRQUFRLEtBQUssaUNBQWlDLHlCQUF5QixNQUFNO0FBQ2pGLGFBQUssV0FBVyxLQUFLO0FB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T0FBTyxNQUFNLFNBQVNBLE1BQUs7QUFBQSxJQUNwQyxDQUFDO0FBRUQsV0FDRyxXQUFXLDhCQUE4QixFQUN6QyxpQkFBaUIsVUFBVSxDQUFDLFVBQVU7QUFDckMsVUFBSSxhQUFhLFFBQVEsT0FBTyxNQUFNLFVBQVU7QUFDOUMsZUFBTyxPQUFPLE1BQU0sU0FBUyxNQUFNLFVBQVUsU0FBUyxPQUFPO0FBQUEsTUFDL0Q7QUFBQSxJQUNGLENBQUM7QUFFSCxXQUFPLE9BQU8sT0FBTyxNQUFNO0FBQ3pCLFlBQU1BLFNBQVEsT0FBTyxPQUFPLE1BQU0sT0FBTztBQUV6QyxNQUFBQSxXQUFVLFNBQ04sU0FBUyxnQkFBZ0IsVUFBVSxJQUFJLE1BQU0sSUFDN0MsU0FBUyxnQkFBZ0IsVUFBVSxPQUFPLE1BQU07QUFBQSxJQUN0RCxDQUFDO0FBQUEsRUFDSCxDQUFDOyIsCiAgIm5hbWVzIjogWyJpZCIsICJvYmoiLCAiXyIsICJuIiwgImluZGV4IiwgIm1zIiwgImdob3N0RWwiLCAib3B0aW9uIiwgInAiLCAiZGVmYXVsdHMiLCAicm9vdEVsIiwgImNsb25lRWwiLCAib2xkSW5kZXgiLCAibmV3SW5kZXgiLCAib2xkRHJhZ2dhYmxlSW5kZXgiLCAibmV3RHJhZ2dhYmxlSW5kZXgiLCAicHV0U29ydGFibGUiLCAicGx1Z2luRXZlbnQiLCAiX2RldGVjdERpcmVjdGlvbiIsICJfZHJhZ0VsSW5Sb3dDb2x1bW4iLCAiX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlIiwgIl9wcmVwYXJlR3JvdXAiLCAiZHJhZ0VsIiwgIl9oaWRlR2hvc3RGb3JUYXJnZXQiLCAiX3VuaGlkZUdob3N0Rm9yVGFyZ2V0IiwgIm5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50IiwgIl9jaGVja091dHNpZGVUYXJnZXRFbCIsICJkcmFnU3RhcnRGbiIsICJ0YXJnZXQiLCAiYWZ0ZXIiLCAibiIsICJlbCIsICJpcyIsICJwbHVnaW5zIiwgImRyb3AiLCAiYXV0b1Njcm9sbCIsICJvblNwaWxsIiwgImluZGV4IiwgImNvbXBvbmVudCIsICJlbCIsICJ0aGVtZSJdCn0K +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvcGFuZWwuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3RyZWVzZWxlY3Rqcy9kaXN0L3RyZWVzZWxlY3Rqcy5tanMiLCAiLi4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvc2VsZWN0LXRyZWUuanMiLCAiLi4vbm9kZV9tb2R1bGVzL3NvcnRhYmxlanMvbW9kdWxhci9zb3J0YWJsZS5lc20uanMiLCAiLi4vcmVzb3VyY2VzL2pzL2NvbXBvbmVudHMvc29ydGFibGUuanMiLCAiLi4vcmVzb3VyY2VzL2pzL2luZGV4LmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJjb25zdCBTbGlkZU92ZXJQYW5lbCA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBvcGVuOiBmYWxzZSxcbiAgICAgICAgc2hvd0FjdGl2ZUNvbXBvbmVudDogdHJ1ZSxcbiAgICAgICAgYWN0aXZlQ29tcG9uZW50OiBmYWxzZSxcbiAgICAgICAgY29tcG9uZW50SGlzdG9yeTogW10sXG4gICAgICAgIHBhbmVsV2lkdGg6IG51bGwsXG4gICAgICAgIGxpc3RlbmVyczogW10sXG4gICAgICAgIGdldEFjdGl2ZUNvbXBvbmVudFBhbmVsQXR0cmlidXRlKGtleSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuJHdpcmUuZ2V0KCdjb21wb25lbnRzJylbdGhpcy5hY3RpdmVDb21wb25lbnRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy4kd2lyZS5nZXQoJ2NvbXBvbmVudHMnKVt0aGlzLmFjdGl2ZUNvbXBvbmVudF1bJ3BhbmVsQXR0cmlidXRlcyddW2tleV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VQYW5lbE9uRXNjYXBlKHRyaWdnZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdldEFjdGl2ZUNvbXBvbmVudFBhbmVsQXR0cmlidXRlKCdjbG9zZU9uRXNjYXBlJykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBmb3JjZSA9IHRoaXMuZ2V0QWN0aXZlQ29tcG9uZW50UGFuZWxBdHRyaWJ1dGUoJ2Nsb3NlT25Fc2NhcGVJc0ZvcmNlZnVsJykgPT09IHRydWVcbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbChmb3JjZSlcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VQYW5lbE9uQ2xpY2tBd2F5KHRyaWdnZXIpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmdldEFjdGl2ZUNvbXBvbmVudFBhbmVsQXR0cmlidXRlKCdjbG9zZU9uQ2xpY2tBd2F5JykgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2xvc2VQYW5lbCh0cnVlKVxuICAgICAgICB9LFxuICAgICAgICBjbG9zZVBhbmVsKGZvcmNlID0gZmFsc2UsIHNraXBQcmV2aW91c1BhbmVscyA9IDAsIGRlc3Ryb3lTa2lwcGVkID0gZmFsc2UpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnNob3cgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmdldEFjdGl2ZUNvbXBvbmVudFBhbmVsQXR0cmlidXRlKCdkaXNwYXRjaENsb3NlRXZlbnQnKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSB0aGlzLiR3aXJlLmdldCgnY29tcG9uZW50cycpW3RoaXMuYWN0aXZlQ29tcG9uZW50XS5uYW1lXG4gICAgICAgICAgICAgICAgTGl2ZXdpcmUuZGlzcGF0Y2goJ3BhbmVsQ2xvc2VkJywgeyBuYW1lOiBjb21wb25lbnROYW1lIH0pXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmdldEFjdGl2ZUNvbXBvbmVudFBhbmVsQXR0cmlidXRlKCdkZXN0cm95T25DbG9zZScpID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgTGl2ZXdpcmUuZGlzcGF0Y2goJ2Rlc3Ryb3lDb21wb25lbnQnLCB7IGlkOiB0aGlzLmFjdGl2ZUNvbXBvbmVudCB9KVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2tpcFByZXZpb3VzUGFuZWxzID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2tpcFByZXZpb3VzUGFuZWxzOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3Ryb3lTa2lwcGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuY29tcG9uZW50SGlzdG9yeVt0aGlzLmNvbXBvbmVudEhpc3RvcnkubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgICAgICAgICAgIExpdmV3aXJlLmRpc3BhdGNoKCdkZXN0cm95Q29tcG9uZW50JywgeyBpZDogaWQgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEhpc3RvcnkucG9wKClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5jb21wb25lbnRIaXN0b3J5LnBvcCgpXG5cbiAgICAgICAgICAgIGlmIChpZCAmJiAhZm9yY2UpIHtcbiAgICAgICAgICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVQYW5lbENvbXBvbmVudChpZCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFNob3dQcm9wZXJ0eVRvKGZhbHNlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTaG93UHJvcGVydHlUbyhmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2V0QWN0aXZlUGFuZWxDb21wb25lbnQoaWQsIHNraXAgPSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTaG93UHJvcGVydHlUbyh0cnVlKVxuXG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVDb21wb25lbnQgPT09IGlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUNvbXBvbmVudCAhPT0gZmFsc2UgJiYgc2tpcCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEhpc3RvcnkucHVzaCh0aGlzLmFjdGl2ZUNvbXBvbmVudClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGZvY3VzYWJsZVRpbWVvdXQgPSA1MFxuXG4gICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVDb21wb25lbnQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVDb21wb25lbnQgPSBpZFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FjdGl2ZUNvbXBvbmVudCA9IHRydWVcbiAgICAgICAgICAgICAgICB0aGlzLnBhbmVsV2lkdGggPSB0aGlzLmdldEFjdGl2ZUNvbXBvbmVudFBhbmVsQXR0cmlidXRlKCdtYXhXaWR0aENsYXNzJylcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93QWN0aXZlQ29tcG9uZW50ID0gZmFsc2VcblxuICAgICAgICAgICAgICAgIGZvY3VzYWJsZVRpbWVvdXQgPSA0MDBcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNvbXBvbmVudCA9IGlkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FjdGl2ZUNvbXBvbmVudCA9IHRydWVcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYW5lbFdpZHRoID0gdGhpcy5nZXRBY3RpdmVDb21wb25lbnRQYW5lbEF0dHJpYnV0ZSgnbWF4V2lkdGhDbGFzcycpXG4gICAgICAgICAgICAgICAgfSwgMzAwKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGZvY3VzYWJsZSA9IHRoaXMuJHJlZnNbaWRdPy5xdWVyeVNlbGVjdG9yKCdbYXV0b2ZvY3VzXScpXG4gICAgICAgICAgICAgICAgaWYgKGZvY3VzYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzYWJsZS5mb2N1cygpXG4gICAgICAgICAgICAgICAgICAgIH0sIGZvY3VzYWJsZVRpbWVvdXQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSxcbiAgICAgICAgZm9jdXNhYmxlcygpIHtcbiAgICAgICAgICAgIGxldCBzZWxlY3RvciA9XG4gICAgICAgICAgICAgICAgXCJhLCBidXR0b24sIGlucHV0Om5vdChbdHlwZT0naGlkZGVuJ10sIHRleHRhcmVhLCBzZWxlY3QsIGRldGFpbHMsIFt0YWJpbmRleF06bm90KFt0YWJpbmRleD0nLTEnXSlcIlxuXG4gICAgICAgICAgICByZXR1cm4gWy4uLnRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpXS5maWx0ZXIoKGVsKSA9PiAhZWwuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKVxuICAgICAgICB9LFxuICAgICAgICBmaXJzdEZvY3VzYWJsZSgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvY3VzYWJsZXMoKVswXVxuICAgICAgICB9LFxuICAgICAgICBsYXN0Rm9jdXNhYmxlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNhYmxlcygpLnNsaWNlKC0xKVswXVxuICAgICAgICB9LFxuICAgICAgICBuZXh0Rm9jdXNhYmxlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNhYmxlcygpW3RoaXMubmV4dEZvY3VzYWJsZUluZGV4KCldIHx8IHRoaXMuZmlyc3RGb2N1c2FibGUoKVxuICAgICAgICB9LFxuICAgICAgICBwcmV2Rm9jdXNhYmxlKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZm9jdXNhYmxlcygpW3RoaXMucHJldkZvY3VzYWJsZUluZGV4KCldIHx8IHRoaXMubGFzdEZvY3VzYWJsZSgpXG4gICAgICAgIH0sXG4gICAgICAgIG5leHRGb2N1c2FibGVJbmRleCgpIHtcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5mb2N1c2FibGVzKCkuaW5kZXhPZihkb2N1bWVudC5hY3RpdmVFbGVtZW50KSArIDEpICUgKHRoaXMuZm9jdXNhYmxlcygpLmxlbmd0aCArIDEpXG4gICAgICAgIH0sXG4gICAgICAgIHByZXZGb2N1c2FibGVJbmRleCgpIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLmZvY3VzYWJsZXMoKS5pbmRleE9mKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSAtIDFcbiAgICAgICAgfSxcbiAgICAgICAgc2V0U2hvd1Byb3BlcnR5VG8ob3Blbikge1xuICAgICAgICAgICAgdGhpcy5vcGVuID0gb3BlblxuXG4gICAgICAgICAgICBpZiAob3Blbikge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnb3ZlcmZsb3cteS1oaWRkZW4nKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ292ZXJmbG93LXktaGlkZGVuJylcblxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZUNvbXBvbmVudCA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHdpcmUucmVzZXRTdGF0ZSgpXG4gICAgICAgICAgICAgICAgfSwgMzAwKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgdGhpcy5wYW5lbFdpZHRoID0gdGhpcy5nZXRBY3RpdmVDb21wb25lbnRQYW5lbEF0dHJpYnV0ZSgnbWF4V2lkdGhDbGFzcycpXG5cbiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLnB1c2goXG4gICAgICAgICAgICAgICAgTGl2ZXdpcmUub24oJ2Nsb3NlUGFuZWwnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoZGF0YT8uZm9yY2UgPz8gZmFsc2UsIGRhdGE/LnNraXBQcmV2aW91c1BhbmVscyA/PyAwLCBkYXRhPy5kZXN0cm95U2tpcHBlZCA/PyBmYWxzZSlcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMucHVzaChcbiAgICAgICAgICAgICAgICBMaXZld2lyZS5vbignYWN0aXZlUGFuZWxDb21wb25lbnRDaGFuZ2VkJywgKHsgaWQgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVBhbmVsQ29tcG9uZW50KGlkKVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgKVxuICAgICAgICB9LFxuICAgICAgICBkZXN0cm95KCkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpID0+IHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcigpXG4gICAgICAgICAgICB9KVxuICAgICAgICB9LFxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgU2xpZGVPdmVyUGFuZWxcbiIsICJ2YXIgcmkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG52YXIgY2kgPSAobCwgZSwgdCkgPT4gZSBpbiBsID8gcmkobCwgZSwgeyBlbnVtZXJhYmxlOiAhMCwgY29uZmlndXJhYmxlOiAhMCwgd3JpdGFibGU6ICEwLCB2YWx1ZTogdCB9KSA6IGxbZV0gPSB0O1xudmFyIGMgPSAobCwgZSwgdCkgPT4gKGNpKGwsIHR5cGVvZiBlICE9IFwic3ltYm9sXCIgPyBlICsgXCJcIiA6IGUsIHQpLCB0KSwga3QgPSAobCwgZSwgdCkgPT4ge1xuICBpZiAoIWUuaGFzKGwpKVxuICAgIHRocm93IFR5cGVFcnJvcihcIkNhbm5vdCBcIiArIHQpO1xufTtcbnZhciBuID0gKGwsIGUsIHQpID0+IChrdChsLCBlLCBcInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkXCIpLCB0ID8gdC5jYWxsKGwpIDogZS5nZXQobCkpLCByID0gKGwsIGUsIHQpID0+IHtcbiAgaWYgKGUuaGFzKGwpKVxuICAgIHRocm93IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgdGhlIHNhbWUgcHJpdmF0ZSBtZW1iZXIgbW9yZSB0aGFuIG9uY2VcIik7XG4gIGUgaW5zdGFuY2VvZiBXZWFrU2V0ID8gZS5hZGQobCkgOiBlLnNldChsLCB0KTtcbn0sIG0gPSAobCwgZSwgdCwgcykgPT4gKGt0KGwsIGUsIFwid3JpdGUgdG8gcHJpdmF0ZSBmaWVsZFwiKSwgcyA/IHMuY2FsbChsLCB0KSA6IGUuc2V0KGwsIHQpLCB0KTtcbnZhciBvID0gKGwsIGUsIHQpID0+IChrdChsLCBlLCBcImFjY2VzcyBwcml2YXRlIG1ldGhvZFwiKSwgdCk7XG5jb25zdCBQdCA9IHtcbiAgYXJyb3dVcDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjUgMjVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0xOCAxNWwtNi02LTYgNlwiLz48L3N2Zz4nLFxuICBhcnJvd0Rvd246ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNNiA5bDYgNiA2LTZcIi8+PC9zdmc+JyxcbiAgYXJyb3dSaWdodDogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjUgMjVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk05IDE4bDYtNi02LTZcIi8+PC9zdmc+JyxcbiAgYXR0ZW50aW9uOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNSAyNVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTEwLjI5IDMuODZMMS44MiAxOGEyIDIgMCAwIDAgMS43MSAzaDE2Ljk0YTIgMiAwIDAgMCAxLjcxLTNMMTMuNzEgMy44NmEyIDIgMCAwIDAtMy40MiAwelwiPjwvcGF0aD48bGluZSB4MT1cIjEyXCIgeTE9XCI5XCIgeDI9XCIxMlwiIHkyPVwiMTNcIj48L2xpbmU+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTdcIiB4Mj1cIjEyLjAxXCIgeTI9XCIxN1wiPjwvbGluZT48L3N2Zz4nLFxuICBjbGVhcjogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjUgMjVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIxMFwiPjwvY2lyY2xlPjxsaW5lIHgxPVwiMTVcIiB5MT1cIjlcIiB4Mj1cIjlcIiB5Mj1cIjE1XCI+PC9saW5lPjxsaW5lIHgxPVwiOVwiIHkxPVwiOVwiIHgyPVwiMTVcIiB5Mj1cIjE1XCI+PC9saW5lPjwvc3ZnPicsXG4gIGNyb3NzOiAnPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNVwiIGhlaWdodD1cIjE1XCIgdmlld0JveD1cIjAgMCAyNSAyNVwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwMDAwMFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48bGluZSB4MT1cIjE4XCIgeTE9XCI2XCIgeDI9XCI2XCIgeTI9XCIxOFwiPjwvbGluZT48bGluZSB4MT1cIjZcIiB5MT1cIjZcIiB4Mj1cIjE4XCIgeTI9XCIxOFwiPjwvbGluZT48L3N2Zz4nLFxuICBjaGVjazogJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTVcIiBoZWlnaHQ9XCIxNVwiIHZpZXdCb3g9XCIwIDAgMjUgMjVcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMDAwMDBcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBvbHlsaW5lIHBvaW50cz1cIjIwIDYgOSAxNyA0IDEyXCI+PC9wb2x5bGluZT48L3N2Zz4nLFxuICBwYXJ0aWFsQ2hlY2s6ICc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB3aWR0aD1cIjE1XCIgaGVpZ2h0PVwiMTVcIiB2aWV3Qm94PVwiMCAwIDI1IDI1XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMDAwMDAwXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxsaW5lIHgxPVwiNVwiIHkxPVwiMTJcIiB4Mj1cIjE5XCIgeTI9XCIxMlwiPjwvbGluZT48L3N2Zz4nXG59LCBJID0gKGwsIGUpID0+IHtcbiAgaWYgKGUuaW5uZXJIVE1MID0gXCJcIiwgdHlwZW9mIGwgPT0gXCJzdHJpbmdcIilcbiAgICBlLmlubmVySFRNTCA9IGw7XG4gIGVsc2Uge1xuICAgIGNvbnN0IHQgPSBsLmNsb25lTm9kZSghMCk7XG4gICAgZS5hcHBlbmRDaGlsZCh0KTtcbiAgfVxufSwgQnQgPSAobCkgPT4ge1xuICBjb25zdCBlID0gbCA/IHsgLi4ubCB9IDoge307XG4gIHJldHVybiBPYmplY3Qua2V5cyhQdCkuZm9yRWFjaCgodCkgPT4ge1xuICAgIGVbdF0gfHwgKGVbdF0gPSBQdFt0XSk7XG4gIH0pLCBlO1xufSwgaGkgPSAobCkgPT4gbC5yZWR1Y2UoKGUsIHsgbmFtZTogdCB9LCBzKSA9PiAoZSArPSB0LCBzIDwgbC5sZW5ndGggLSAxICYmIChlICs9IFwiLCBcIiksIGUpLCBcIlwiKTtcbnZhciBOLCBFLCBELCB2LCB1ZSwgSHQsIEgsIFcsIHBlLCBHdCwgbWUsIE10LCBHLCBVLCBPLCBWLCBmZSwgRnQsIGJlLCBxdCwgQ2UsIGp0LCBnZSwgUnQsIGtlLCAkdCwgd2UsIFd0LCBFZSwgVXQsIHZlLCB6dCwgTGUsIFl0LCB5ZSwgS3QsIHhlLCBYdCwgU2UsIEp0LCBfZSwgWnQsIEFlLCBRdCwgVGUsIGVzLCBOZSwgdHMsIHosIHd0O1xuY2xhc3MgZGkge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgdmFsdWU6IGUsXG4gICAgc2hvd1RhZ3M6IHQsXG4gICAgdGFnc0NvdW50VGV4dDogcyxcbiAgICBjbGVhcmFibGU6IGksXG4gICAgaXNBbHdheXNPcGVuZWQ6IGEsXG4gICAgc2VhcmNoYWJsZTogaCxcbiAgICBwbGFjZWhvbGRlcjogZCxcbiAgICBkaXNhYmxlZDogQyxcbiAgICBpc1NpbmdsZVNlbGVjdDogZixcbiAgICBpZDogYixcbiAgICBhcmlhTGFiZWw6IGcsXG4gICAgaWNvbkVsZW1lbnRzOiBrLFxuICAgIGlucHV0Q2FsbGJhY2s6IHcsXG4gICAgc2VhcmNoQ2FsbGJhY2s6IHksXG4gICAgb3BlbkNhbGxiYWNrOiB4LFxuICAgIGNsb3NlQ2FsbGJhY2s6ICQsXG4gICAga2V5ZG93bkNhbGxiYWNrOiBhZSxcbiAgICBmb2N1c0NhbGxiYWNrOiBDdCxcbiAgICBibHVyQ2FsbGJhY2s6IGd0LFxuICAgIG5hbWVDaGFuZ2VDYWxsYmFjazogb2VcbiAgfSkge1xuICAgIC8vIFByaXZhdGUgbWV0aG9kc1xuICAgIHIodGhpcywgdWUpO1xuICAgIHIodGhpcywgSCk7XG4gICAgcih0aGlzLCBwZSk7XG4gICAgcih0aGlzLCBtZSk7XG4gICAgcih0aGlzLCBHKTtcbiAgICByKHRoaXMsIE8pO1xuICAgIHIodGhpcywgZmUpO1xuICAgIHIodGhpcywgYmUpO1xuICAgIHIodGhpcywgQ2UpO1xuICAgIHIodGhpcywgZ2UpO1xuICAgIHIodGhpcywga2UpO1xuICAgIHIodGhpcywgd2UpO1xuICAgIHIodGhpcywgRWUpO1xuICAgIHIodGhpcywgdmUpO1xuICAgIHIodGhpcywgTGUpO1xuICAgIHIodGhpcywgeWUpO1xuICAgIHIodGhpcywgeGUpO1xuICAgIHIodGhpcywgU2UpO1xuICAgIHIodGhpcywgX2UpO1xuICAgIHIodGhpcywgQWUpO1xuICAgIHIodGhpcywgVGUpO1xuICAgIHIodGhpcywgTmUpO1xuICAgIC8vIEVtaXRzXG4gICAgcih0aGlzLCB6KTtcbiAgICAvLyBQcm9wc1xuICAgIGModGhpcywgXCJ2YWx1ZVwiKTtcbiAgICBjKHRoaXMsIFwic2hvd1RhZ3NcIik7XG4gICAgYyh0aGlzLCBcInRhZ3NDb3VudFRleHRcIik7XG4gICAgYyh0aGlzLCBcImNsZWFyYWJsZVwiKTtcbiAgICBjKHRoaXMsIFwiaXNBbHdheXNPcGVuZWRcIik7XG4gICAgYyh0aGlzLCBcInNlYXJjaGFibGVcIik7XG4gICAgYyh0aGlzLCBcInBsYWNlaG9sZGVyXCIpO1xuICAgIGModGhpcywgXCJkaXNhYmxlZFwiKTtcbiAgICBjKHRoaXMsIFwiaXNTaW5nbGVTZWxlY3RcIik7XG4gICAgYyh0aGlzLCBcImlkXCIpO1xuICAgIGModGhpcywgXCJhcmlhTGFiZWxcIik7XG4gICAgYyh0aGlzLCBcImljb25FbGVtZW50c1wiKTtcbiAgICAvLyBJbm5lclN0YXRlXG4gICAgYyh0aGlzLCBcImlzT3BlbmVkXCIpO1xuICAgIGModGhpcywgXCJzZWFyY2hUZXh0XCIpO1xuICAgIGModGhpcywgXCJzcmNFbGVtZW50XCIpO1xuICAgIC8vIFByaXZhdGVJbm5lclN0YXRlXG4gICAgcih0aGlzLCBOLCB2b2lkIDApO1xuICAgIHIodGhpcywgRSwgdm9pZCAwKTtcbiAgICByKHRoaXMsIEQsIHZvaWQgMCk7XG4gICAgcih0aGlzLCB2LCB2b2lkIDApO1xuICAgIC8vIENhbGxiYWNrc1xuICAgIGModGhpcywgXCJpbnB1dENhbGxiYWNrXCIpO1xuICAgIGModGhpcywgXCJzZWFyY2hDYWxsYmFja1wiKTtcbiAgICBjKHRoaXMsIFwib3BlbkNhbGxiYWNrXCIpO1xuICAgIGModGhpcywgXCJjbG9zZUNhbGxiYWNrXCIpO1xuICAgIGModGhpcywgXCJrZXlkb3duQ2FsbGJhY2tcIik7XG4gICAgYyh0aGlzLCBcImZvY3VzQ2FsbGJhY2tcIik7XG4gICAgYyh0aGlzLCBcImJsdXJDYWxsYmFja1wiKTtcbiAgICBjKHRoaXMsIFwibmFtZUNoYW5nZUNhbGxiYWNrXCIpO1xuICAgIHRoaXMudmFsdWUgPSBlLCB0aGlzLnNob3dUYWdzID0gdCwgdGhpcy50YWdzQ291bnRUZXh0ID0gcywgdGhpcy5zZWFyY2hhYmxlID0gaCwgdGhpcy5wbGFjZWhvbGRlciA9IGQsIHRoaXMuY2xlYXJhYmxlID0gaSwgdGhpcy5pc0Fsd2F5c09wZW5lZCA9IGEsIHRoaXMuZGlzYWJsZWQgPSBDLCB0aGlzLmlzU2luZ2xlU2VsZWN0ID0gZiwgdGhpcy5pZCA9IGIsIHRoaXMuYXJpYUxhYmVsID0gZywgdGhpcy5pY29uRWxlbWVudHMgPSBrLCB0aGlzLmlzT3BlbmVkID0gITEsIHRoaXMuc2VhcmNoVGV4dCA9IFwiXCIsIG0odGhpcywgTiwgbyh0aGlzLCBDZSwganQpLmNhbGwodGhpcykpLCBtKHRoaXMsIEUsIG8odGhpcywgTGUsIFl0KS5jYWxsKHRoaXMpKSwgbSh0aGlzLCBELCBvKHRoaXMsIFNlLCBKdCkuY2FsbCh0aGlzKSksIG0odGhpcywgdiwgbnVsbCksIHRoaXMuaW5wdXRDYWxsYmFjayA9IHcsIHRoaXMuc2VhcmNoQ2FsbGJhY2sgPSB5LCB0aGlzLm9wZW5DYWxsYmFjayA9IHgsIHRoaXMuY2xvc2VDYWxsYmFjayA9ICQsIHRoaXMua2V5ZG93bkNhbGxiYWNrID0gYWUsIHRoaXMuZm9jdXNDYWxsYmFjayA9IEN0LCB0aGlzLmJsdXJDYWxsYmFjayA9IGd0LCB0aGlzLm5hbWVDaGFuZ2VDYWxsYmFjayA9IG9lLCB0aGlzLnNyY0VsZW1lbnQgPSBvKHRoaXMsIGZlLCBGdCkuY2FsbCh0aGlzLCBuKHRoaXMsIE4pLCBuKHRoaXMsIEUpLCBuKHRoaXMsIEQpKSwgbyh0aGlzLCB1ZSwgSHQpLmNhbGwodGhpcyk7XG4gIH1cbiAgLy8gUHVibGljIG1ldGhvZHNcbiAgZm9jdXMoKSB7XG4gICAgc2V0VGltZW91dCgoKSA9PiBuKHRoaXMsIEUpLmZvY3VzKCksIDApO1xuICB9XG4gIGJsdXIoKSB7XG4gICAgdGhpcy5pc09wZW5lZCAmJiBvKHRoaXMsIE8sIFYpLmNhbGwodGhpcyksIHRoaXMuY2xlYXJTZWFyY2goKSwgbih0aGlzLCBFKS5ibHVyKCk7XG4gIH1cbiAgdXBkYXRlVmFsdWUoZSkge1xuICAgIHRoaXMudmFsdWUgPSBlLCBvKHRoaXMsIEgsIFcpLmNhbGwodGhpcyksIG8odGhpcywgRywgVSkuY2FsbCh0aGlzKTtcbiAgfVxuICByZW1vdmVJdGVtKGUpIHtcbiAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZS5maWx0ZXIoKHQpID0+IHQuaWQgIT09IGUpLCBvKHRoaXMsIHosIHd0KS5jYWxsKHRoaXMpLCBvKHRoaXMsIEgsIFcpLmNhbGwodGhpcyksIG8odGhpcywgRywgVSkuY2FsbCh0aGlzKTtcbiAgfVxuICBjbGVhcigpIHtcbiAgICB0aGlzLnZhbHVlID0gW10sIG8odGhpcywgeiwgd3QpLmNhbGwodGhpcyksIG8odGhpcywgSCwgVykuY2FsbCh0aGlzKSwgdGhpcy5jbGVhclNlYXJjaCgpO1xuICB9XG4gIG9wZW5DbG9zZSgpIHtcbiAgICBvKHRoaXMsIE8sIFYpLmNhbGwodGhpcyk7XG4gIH1cbiAgY2xlYXJTZWFyY2goKSB7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gXCJcIiwgdGhpcy5zZWFyY2hDYWxsYmFjayhcIlwiKSwgbyh0aGlzLCBHLCBVKS5jYWxsKHRoaXMpO1xuICB9XG59XG5OID0gbmV3IFdlYWtNYXAoKSwgRSA9IG5ldyBXZWFrTWFwKCksIEQgPSBuZXcgV2Vha01hcCgpLCB2ID0gbmV3IFdlYWtNYXAoKSwgdWUgPSBuZXcgV2Vha1NldCgpLCBIdCA9IGZ1bmN0aW9uKCkge1xuICBvKHRoaXMsIEgsIFcpLmNhbGwodGhpcyksIG8odGhpcywgRywgVSkuY2FsbCh0aGlzKSwgbyh0aGlzLCBwZSwgR3QpLmNhbGwodGhpcyk7XG59LCBIID0gbmV3IFdlYWtTZXQoKSwgVyA9IGZ1bmN0aW9uKCkge1xuICBpZiAobih0aGlzLCBOKS5pbm5lckhUTUwgPSBcIlwiLCB0aGlzLnNob3dUYWdzKSB7XG4gICAgbih0aGlzLCBOKS5hcHBlbmQoLi4ubyh0aGlzLCBnZSwgUnQpLmNhbGwodGhpcykpO1xuICAgIGNvbnN0IGUgPSBoaSh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm5hbWVDaGFuZ2VDYWxsYmFjayhlKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBlID0gbyh0aGlzLCB2ZSwgenQpLmNhbGwodGhpcyk7XG4gICAgbih0aGlzLCBOKS5hcHBlbmRDaGlsZChlKSwgdGhpcy5uYW1lQ2hhbmdlQ2FsbGJhY2soZS5pbm5lclRleHQpO1xuICB9XG4gIG4odGhpcywgTikuYXBwZW5kQ2hpbGQobih0aGlzLCBFKSk7XG59LCBwZSA9IG5ldyBXZWFrU2V0KCksIEd0ID0gZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGUgPSBbXTtcbiAgbih0aGlzLCBEKS5pbm5lckhUTUwgPSBcIlwiLCB0aGlzLmNsZWFyYWJsZSAmJiBlLnB1c2gobyh0aGlzLCBfZSwgWnQpLmNhbGwodGhpcykpLCB0aGlzLmlzQWx3YXlzT3BlbmVkIHx8IGUucHVzaChvKHRoaXMsIFRlLCBlcykuY2FsbCh0aGlzLCB0aGlzLmlzT3BlbmVkKSksIGUubGVuZ3RoICYmIG4odGhpcywgRCkuYXBwZW5kKC4uLmUpO1xufSwgbWUgPSBuZXcgV2Vha1NldCgpLCBNdCA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMuaXNBbHdheXNPcGVuZWQgJiYgbih0aGlzLCB2KSkge1xuICAgIGNvbnN0IGUgPSB0aGlzLmlzT3BlbmVkID8gdGhpcy5pY29uRWxlbWVudHMuYXJyb3dVcCA6IHRoaXMuaWNvbkVsZW1lbnRzLmFycm93RG93bjtcbiAgICBJKGUsIG4odGhpcywgdikpO1xuICB9XG59LCBHID0gbmV3IFdlYWtTZXQoKSwgVSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZTtcbiAgKGUgPSB0aGlzLnZhbHVlKSAhPSBudWxsICYmIGUubGVuZ3RoID8gKG4odGhpcywgRSkucmVtb3ZlQXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIiksIHRoaXMuc3JjRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwidHJlZXNlbGVjdC1pbnB1dC0tdmFsdWUtbm90LXNlbGVjdGVkXCIpKSA6IChuKHRoaXMsIEUpLnNldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIsIHRoaXMucGxhY2Vob2xkZXIpLCB0aGlzLnNyY0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtaW5wdXQtLXZhbHVlLW5vdC1zZWxlY3RlZFwiKSksIHRoaXMuc2VhcmNoYWJsZSA/IHRoaXMuc3JjRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwidHJlZXNlbGVjdC1pbnB1dC0tdW5zZWFyY2hhYmxlXCIpIDogdGhpcy5zcmNFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0LS11bnNlYXJjaGFibGVcIiksIHRoaXMuaXNTaW5nbGVTZWxlY3QgPyB0aGlzLnNyY0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtaW5wdXQtLWlzLXNpbmdsZS1zZWxlY3RcIikgOiB0aGlzLnNyY0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtaW5wdXQtLWlzLXNpbmdsZS1zZWxlY3RcIiksIG4odGhpcywgRSkudmFsdWUgPSB0aGlzLnNlYXJjaFRleHQ7XG59LCBPID0gbmV3IFdlYWtTZXQoKSwgViA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmlzT3BlbmVkID0gIXRoaXMuaXNPcGVuZWQsIG8odGhpcywgbWUsIE10KS5jYWxsKHRoaXMpLCB0aGlzLmlzT3BlbmVkID8gdGhpcy5vcGVuQ2FsbGJhY2soKSA6IHRoaXMuY2xvc2VDYWxsYmFjaygpO1xufSwgZmUgPSBuZXcgV2Vha1NldCgpLCBGdCA9IGZ1bmN0aW9uKGUsIHQsIHMpIHtcbiAgY29uc3QgaSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHJldHVybiBpLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0XCIpLCBpLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIiksIGkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoYSkgPT4gbyh0aGlzLCBiZSwgcXQpLmNhbGwodGhpcywgYSkpLCBpLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCAoKSA9PiB0aGlzLmZvY3VzQ2FsbGJhY2soKSwgITApLCBpLmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsICgpID0+IHRoaXMuYmx1ckNhbGxiYWNrKCksICEwKSwgZS5hcHBlbmRDaGlsZCh0KSwgaS5hcHBlbmQoZSwgcyksIGk7XG59LCBiZSA9IG5ldyBXZWFrU2V0KCksIHF0ID0gZnVuY3Rpb24oZSkge1xuICBlLnN0b3BQcm9wYWdhdGlvbigpLCB0aGlzLmlzT3BlbmVkIHx8IG8odGhpcywgTywgVikuY2FsbCh0aGlzKSwgdGhpcy5mb2N1cygpO1xufSwgQ2UgPSBuZXcgV2Vha1NldCgpLCBqdCA9IGZ1bmN0aW9uKCkge1xuICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgcmV0dXJuIGUuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtaW5wdXRfX3RhZ3NcIiksIGU7XG59LCBnZSA9IG5ldyBXZWFrU2V0KCksIFJ0ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnZhbHVlLm1hcCgoZSkgPT4ge1xuICAgIGNvbnN0IHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtaW5wdXRfX3RhZ3MtZWxlbWVudFwiKSwgdC5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpLCB0LnNldEF0dHJpYnV0ZShcInRhZy1pZFwiLCBlLmlkLnRvU3RyaW5nKCkpLCB0LnNldEF0dHJpYnV0ZShcInRpdGxlXCIsIGUubmFtZSk7XG4gICAgY29uc3QgcyA9IG8odGhpcywgd2UsIFd0KS5jYWxsKHRoaXMsIGUubmFtZSksIGkgPSBvKHRoaXMsIEVlLCBVdCkuY2FsbCh0aGlzKTtcbiAgICByZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIChhKSA9PiBvKHRoaXMsIGtlLCAkdCkuY2FsbCh0aGlzLCBhLCBlLmlkKSksIHQuYXBwZW5kKHMsIGkpLCB0O1xuICB9KTtcbn0sIGtlID0gbmV3IFdlYWtTZXQoKSwgJHQgPSBmdW5jdGlvbihlLCB0KSB7XG4gIGUucHJldmVudERlZmF1bHQoKSwgZS5zdG9wUHJvcGFnYXRpb24oKSwgdGhpcy5yZW1vdmVJdGVtKHQpLCB0aGlzLmZvY3VzKCk7XG59LCB3ZSA9IG5ldyBXZWFrU2V0KCksIFd0ID0gZnVuY3Rpb24oZSkge1xuICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHJldHVybiB0LmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0X190YWdzLW5hbWVcIiksIHQudGV4dENvbnRlbnQgPSBlLCB0O1xufSwgRWUgPSBuZXcgV2Vha1NldCgpLCBVdCA9IGZ1bmN0aW9uKCkge1xuICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHJldHVybiBlLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0X190YWdzLWNyb3NzXCIpLCBJKHRoaXMuaWNvbkVsZW1lbnRzLmNyb3NzLCBlKSwgZTtcbn0sIHZlID0gbmV3IFdlYWtTZXQoKSwgenQgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICBpZiAoZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1pbnB1dF9fdGFncy1jb3VudFwiKSwgIXRoaXMudmFsdWUubGVuZ3RoKVxuICAgIHJldHVybiBlLnRleHRDb250ZW50ID0gXCJcIiwgZS5zZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiLCBcIlwiKSwgZTtcbiAgY29uc3QgdCA9IHRoaXMudmFsdWUubGVuZ3RoID09PSAxID8gdGhpcy52YWx1ZVswXS5uYW1lIDogYCR7dGhpcy52YWx1ZS5sZW5ndGh9ICR7dGhpcy50YWdzQ291bnRUZXh0fWA7XG4gIHJldHVybiBlLnRleHRDb250ZW50ID0gdCwgZS5zZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiLCB0KSwgZTtcbn0sIExlID0gbmV3IFdlYWtTZXQoKSwgWXQgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgcmV0dXJuIGUuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtaW5wdXRfX2VkaXRcIiksIHRoaXMuaWQgJiYgZS5zZXRBdHRyaWJ1dGUoXCJpZFwiLCB0aGlzLmlkKSwgKCF0aGlzLnNlYXJjaGFibGUgfHwgdGhpcy5kaXNhYmxlZCkgJiYgZS5zZXRBdHRyaWJ1dGUoXCJyZWFkb25seVwiLCBcInJlYWRvbmx5XCIpLCB0aGlzLmRpc2FibGVkICYmIGUuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCItMVwiKSwgdGhpcy5hcmlhTGFiZWwubGVuZ3RoICYmIGUuc2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiLCB0aGlzLmFyaWFMYWJlbCksIGUuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgKHQpID0+IG8odGhpcywgeWUsIEt0KS5jYWxsKHRoaXMsIHQpKSwgZS5hZGRFdmVudExpc3RlbmVyKFwiaW5wdXRcIiwgKHQpID0+IG8odGhpcywgeGUsIFh0KS5jYWxsKHRoaXMsIHQsIGUpKSwgZTtcbn0sIHllID0gbmV3IFdlYWtTZXQoKSwgS3QgPSBmdW5jdGlvbihlKSB7XG4gIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIGNvbnN0IHQgPSBlLmtleTtcbiAgdCA9PT0gXCJCYWNrc3BhY2VcIiAmJiAhdGhpcy5zZWFyY2hUZXh0Lmxlbmd0aCAmJiB0aGlzLnZhbHVlLmxlbmd0aCAmJiAhdGhpcy5zaG93VGFncyAmJiB0aGlzLmNsZWFyKCksIHQgPT09IFwiQmFja3NwYWNlXCIgJiYgIXRoaXMuc2VhcmNoVGV4dC5sZW5ndGggJiYgdGhpcy52YWx1ZS5sZW5ndGggJiYgdGhpcy5yZW1vdmVJdGVtKHRoaXMudmFsdWVbdGhpcy52YWx1ZS5sZW5ndGggLSAxXS5pZCksIGUuY29kZSA9PT0gXCJTcGFjZVwiICYmICghdGhpcy5zZWFyY2hUZXh0IHx8ICF0aGlzLnNlYXJjaGFibGUpICYmIG8odGhpcywgTywgVikuY2FsbCh0aGlzKSwgKHQgPT09IFwiRW50ZXJcIiB8fCB0ID09PSBcIkFycm93RG93blwiIHx8IHQgPT09IFwiQXJyb3dVcFwiKSAmJiBlLnByZXZlbnREZWZhdWx0KCksIHRoaXMua2V5ZG93bkNhbGxiYWNrKGUpLCB0ICE9PSBcIlRhYlwiICYmIHRoaXMuZm9jdXMoKTtcbn0sIHhlID0gbmV3IFdlYWtTZXQoKSwgWHQgPSBmdW5jdGlvbihlLCB0KSB7XG4gIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIGNvbnN0IHMgPSB0aGlzLnNlYXJjaFRleHQsIGkgPSB0LnZhbHVlLnRyaW0oKTtcbiAgaWYgKHMubGVuZ3RoID09PSAwICYmIGkubGVuZ3RoID09PSAwKSB7XG4gICAgdC52YWx1ZSA9IFwiXCI7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICh0aGlzLnNlYXJjaGFibGUpIHtcbiAgICBjb25zdCBhID0gZS50YXJnZXQudmFsdWU7XG4gICAgdGhpcy5zZWFyY2hDYWxsYmFjayhhKSwgdGhpcy5pc09wZW5lZCB8fCBvKHRoaXMsIE8sIFYpLmNhbGwodGhpcyk7XG4gIH0gZWxzZVxuICAgIHQudmFsdWUgPSBcIlwiO1xuICB0aGlzLnNlYXJjaFRleHQgPSB0LnZhbHVlO1xufSwgU2UgPSBuZXcgV2Vha1NldCgpLCBKdCA9IGZ1bmN0aW9uKCkge1xuICBjb25zdCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgcmV0dXJuIGUuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtaW5wdXRfX29wZXJhdG9yc1wiKSwgZTtcbn0sIF9lID0gbmV3IFdlYWtTZXQoKSwgWnQgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICByZXR1cm4gZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1pbnB1dF9fY2xlYXJcIiksIGUuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCItMVwiKSwgSSh0aGlzLmljb25FbGVtZW50cy5jbGVhciwgZSksIGUuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAodCkgPT4gbyh0aGlzLCBBZSwgUXQpLmNhbGwodGhpcywgdCkpLCBlO1xufSwgQWUgPSBuZXcgV2Vha1NldCgpLCBRdCA9IGZ1bmN0aW9uKGUpIHtcbiAgZS5wcmV2ZW50RGVmYXVsdCgpLCBlLnN0b3BQcm9wYWdhdGlvbigpLCAodGhpcy5zZWFyY2hUZXh0Lmxlbmd0aCB8fCB0aGlzLnZhbHVlLmxlbmd0aCkgJiYgdGhpcy5jbGVhcigpLCB0aGlzLmZvY3VzKCk7XG59LCBUZSA9IG5ldyBXZWFrU2V0KCksIGVzID0gZnVuY3Rpb24oZSkge1xuICBtKHRoaXMsIHYsIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKSwgbih0aGlzLCB2KS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1pbnB1dF9fYXJyb3dcIik7XG4gIGNvbnN0IHQgPSBlID8gdGhpcy5pY29uRWxlbWVudHMuYXJyb3dVcCA6IHRoaXMuaWNvbkVsZW1lbnRzLmFycm93RG93bjtcbiAgcmV0dXJuIEkodCwgbih0aGlzLCB2KSksIG4odGhpcywgdikuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAocykgPT4gbyh0aGlzLCBOZSwgdHMpLmNhbGwodGhpcywgcykpLCBuKHRoaXMsIHYpO1xufSwgTmUgPSBuZXcgV2Vha1NldCgpLCB0cyA9IGZ1bmN0aW9uKGUpIHtcbiAgZS5zdG9wUHJvcGFnYXRpb24oKSwgZS5wcmV2ZW50RGVmYXVsdCgpLCB0aGlzLmZvY3VzKCksIG8odGhpcywgTywgVikuY2FsbCh0aGlzKTtcbn0sIHogPSBuZXcgV2Vha1NldCgpLCB3dCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmlucHV0Q2FsbGJhY2sodGhpcy52YWx1ZSk7XG59O1xuY29uc3Qgc3MgPSAobCwgZSwgdCwgcykgPT4ge1xuICBmaShlKTtcbiAgY29uc3QgaSA9IGUuZmlsdGVyKChhKSA9PiAhYS5kaXNhYmxlZCAmJiBsLnNvbWUoKGgpID0+IGggPT09IGEuaWQpKTtcbiAgaWYgKHQgJiYgaS5sZW5ndGgpIHtcbiAgICBpWzBdLmNoZWNrZWQgPSAhMDtcbiAgICByZXR1cm47XG4gIH1cbiAgaS5mb3JFYWNoKChhKSA9PiB7XG4gICAgYS5jaGVja2VkID0gITA7XG4gICAgY29uc3QgaCA9IEl0KGEsIGUsIHMpO1xuICAgIGEuY2hlY2tlZCA9IGg7XG4gIH0pO1xufSwgSXQgPSAoeyBpZDogbCwgY2hlY2tlZDogZSB9LCB0LCBzKSA9PiB7XG4gIGNvbnN0IGkgPSB0LmZpbmQoKGgpID0+IGguaWQgPT09IGwpO1xuICBpZiAoIWkpXG4gICAgcmV0dXJuICExO1xuICBpZiAocylcbiAgICByZXR1cm4gaS5jaGVja2VkID0gaS5kaXNhYmxlZCA/ICExIDogISFlLCBpLmNoZWNrZWQ7XG4gIGNvbnN0IGEgPSBpcyghIWUsIGksIHQpO1xuICByZXR1cm4gbHMoaSwgdCksIGE7XG59LCBpcyA9IChsLCBlLCB0KSA9PiB7XG4gIGlmICghZS5pc0dyb3VwKVxuICAgIHJldHVybiBlLmNoZWNrZWQgPSBlLmRpc2FibGVkID8gITEgOiAhIWwsIGUuaXNQYXJ0aWFsQ2hlY2tlZCA9ICExLCBlLmNoZWNrZWQ7XG4gIGNvbnN0IHMgPSB0LmZpbHRlcigoZCkgPT4gZC5jaGlsZE9mID09PSBlLmlkKTtcbiAgcmV0dXJuICFsIHx8IGUuZGlzYWJsZWQgfHwgZS5pc1BhcnRpYWxDaGVja2VkID8gKGUuY2hlY2tlZCA9ICExLCBlLmlzUGFydGlhbENoZWNrZWQgPSAhMSwgRXQoZSwgcywgdCksIGUuY2hlY2tlZCkgOiBucyhzLCB0KSA/IGFzKHMpID8gKGUuY2hlY2tlZCA9ICExLCBlLmlzUGFydGlhbENoZWNrZWQgPSAhMSwgZS5kaXNhYmxlZCA9ICEwLCBlLmNoZWNrZWQpIDogKGUuY2hlY2tlZCA9ICExLCBlLmlzUGFydGlhbENoZWNrZWQgPSAhMCwgcy5mb3JFYWNoKChkKSA9PiB7XG4gICAgaXMobCwgZCwgdCk7XG4gIH0pLCBlLmNoZWNrZWQpIDogKGUuY2hlY2tlZCA9ICEwLCBlLmlzUGFydGlhbENoZWNrZWQgPSAhMSwgRXQoZSwgcywgdCksIGUuY2hlY2tlZCk7XG59LCBscyA9IChsLCBlKSA9PiB7XG4gIGNvbnN0IHQgPSBlLmZpbmQoKHMpID0+IHMuaWQgPT09IGwuY2hpbGRPZik7XG4gIHQgJiYgKHVpKHQsIGUpLCBscyh0LCBlKSk7XG59LCB1aSA9IChsLCBlKSA9PiB7XG4gIGNvbnN0IHQgPSBmdChsLCBlKTtcbiAgaWYgKGFzKHQpKSB7XG4gICAgbC5jaGVja2VkID0gITEsIGwuaXNQYXJ0aWFsQ2hlY2tlZCA9ICExLCBsLmRpc2FibGVkID0gITA7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwaSh0KSkge1xuICAgIGwuY2hlY2tlZCA9ICEwLCBsLmlzUGFydGlhbENoZWNrZWQgPSAhMTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKG1pKHQpKSB7XG4gICAgbC5jaGVja2VkID0gITEsIGwuaXNQYXJ0aWFsQ2hlY2tlZCA9ICEwO1xuICAgIHJldHVybjtcbiAgfVxuICBsLmNoZWNrZWQgPSAhMSwgbC5pc1BhcnRpYWxDaGVja2VkID0gITE7XG59LCBFdCA9ICh7IGNoZWNrZWQ6IGwsIGRpc2FibGVkOiBlIH0sIHQsIHMpID0+IHtcbiAgdC5mb3JFYWNoKChpKSA9PiB7XG4gICAgaS5kaXNhYmxlZCA9ICEhZSB8fCAhIWkuZGlzYWJsZWQsIGkuY2hlY2tlZCA9ICEhbCAmJiAhaS5kaXNhYmxlZCwgaS5pc1BhcnRpYWxDaGVja2VkID0gITE7XG4gICAgY29uc3QgYSA9IGZ0KGksIHMpO1xuICAgIEV0KHsgY2hlY2tlZDogbCwgZGlzYWJsZWQ6IGUgfSwgYSwgcyk7XG4gIH0pO1xufSwgbnMgPSAobCwgZSkgPT4gbC5zb21lKChpKSA9PiBpLmRpc2FibGVkKSA/ICEwIDogbC5zb21lKChpKSA9PiB7XG4gIGlmIChpLmlzR3JvdXApIHtcbiAgICBjb25zdCBhID0gZnQoaSwgZSk7XG4gICAgcmV0dXJuIG5zKGEsIGUpO1xuICB9XG4gIHJldHVybiAhMTtcbn0pLCBhcyA9IChsKSA9PiBsLmV2ZXJ5KChlKSA9PiAhIWUuZGlzYWJsZWQpLCBwaSA9IChsKSA9PiBsLmV2ZXJ5KChlKSA9PiAhIWUuY2hlY2tlZCksIG1pID0gKGwpID0+IGwuc29tZSgoZSkgPT4gISFlLmNoZWNrZWQgfHwgISFlLmlzUGFydGlhbENoZWNrZWQpLCBmaSA9IChsKSA9PiB7XG4gIGwuZm9yRWFjaCgoZSkgPT4ge1xuICAgIGUuY2hlY2tlZCA9ICExLCBlLmlzUGFydGlhbENoZWNrZWQgPSAhMTtcbiAgfSk7XG59LCBiaSA9IChsLCBlLCB0KSA9PiB7XG4gIGNvbnN0IHMgPSB7IGxldmVsOiAwLCBncm91cElkOiBcIlwiIH0sIGkgPSBvcyhsLCBlLCBzLmdyb3VwSWQsIHMubGV2ZWwpO1xuICByZXR1cm4gZ2koaSwgdCk7XG59LCBvcyA9IChsLCBlLCB0LCBzKSA9PiBsLnJlZHVjZSgoaSwgYSkgPT4ge1xuICB2YXIgZjtcbiAgY29uc3QgaCA9ICEhKChmID0gYS5jaGlsZHJlbikgIT0gbnVsbCAmJiBmLmxlbmd0aCksIGQgPSBzID49IGUgJiYgaCwgQyA9IHMgPiBlO1xuICBpZiAoaS5wdXNoKHtcbiAgICBpZDogYS52YWx1ZSxcbiAgICBuYW1lOiBhLm5hbWUsXG4gICAgY2hpbGRPZjogdCxcbiAgICBpc0dyb3VwOiBoLFxuICAgIGNoZWNrZWQ6ICExLFxuICAgIGlzUGFydGlhbENoZWNrZWQ6ICExLFxuICAgIGxldmVsOiBzLFxuICAgIGlzQ2xvc2VkOiBkLFxuICAgIGhpZGRlbjogQyxcbiAgICBkaXNhYmxlZDogYS5kaXNhYmxlZCA/PyAhMVxuICB9KSwgaCkge1xuICAgIGNvbnN0IGIgPSBvcyhhLmNoaWxkcmVuLCBlLCBhLnZhbHVlLCBzICsgMSk7XG4gICAgaS5wdXNoKC4uLmIpO1xuICB9XG4gIHJldHVybiBpO1xufSwgW10pLCBmdCA9ICh7IGlkOiBsIH0sIGUpID0+IGUuZmlsdGVyKCh0KSA9PiB0LmNoaWxkT2YgPT09IGwpLCBDaSA9IChsKSA9PiB7XG4gIGNvbnN0IHsgdW5ncm91cGVkTm9kZXM6IGUsIGFsbEdyb3VwZWROb2RlczogdCwgYWxsTm9kZXM6IHMgfSA9IGwucmVkdWNlKFxuICAgIChhLCBoKSA9PiAoaC5jaGVja2VkICYmIChhLmFsbE5vZGVzLnB1c2goaCksIGguaXNHcm91cCA/IGEuYWxsR3JvdXBlZE5vZGVzLnB1c2goaCkgOiBhLnVuZ3JvdXBlZE5vZGVzLnB1c2goaCkpLCBhKSxcbiAgICB7XG4gICAgICB1bmdyb3VwZWROb2RlczogW10sXG4gICAgICBhbGxHcm91cGVkTm9kZXM6IFtdLFxuICAgICAgYWxsTm9kZXM6IFtdXG4gICAgfVxuICApLCBpID0gcy5maWx0ZXIoKGEpID0+ICF0LnNvbWUoKHsgaWQ6IGggfSkgPT4gaCA9PT0gYS5jaGlsZE9mKSk7XG4gIHJldHVybiB7IHVuZ3JvdXBlZE5vZGVzOiBlLCBncm91cGVkTm9kZXM6IGksIGFsbE5vZGVzOiBzIH07XG59LCBnaSA9IChsLCBlKSA9PiAobC5maWx0ZXIoKHMpID0+ICEhcy5kaXNhYmxlZCkuZm9yRWFjaChcbiAgKHsgaWQ6IHMgfSkgPT4gSXQoeyBpZDogcywgY2hlY2tlZDogITEgfSwgbCwgZSlcbiksIGwpLCBidCA9IChsLCB7IGlkOiBlLCBpc0Nsb3NlZDogdCB9KSA9PiB7XG4gIGZ0KHsgaWQ6IGUgfSwgbCkuZm9yRWFjaCgoaSkgPT4ge1xuICAgIGkuaGlkZGVuID0gdCA/PyAhMSwgaS5pc0dyb3VwICYmICFpLmlzQ2xvc2VkICYmIGJ0KGwsIHsgaWQ6IGkuaWQsIGlzQ2xvc2VkOiB0IH0pO1xuICB9KTtcbn0sIGtpID0gKGwpID0+IHtcbiAgbC5maWx0ZXIoKGUpID0+IGUuaXNHcm91cCAmJiAhZS5kaXNhYmxlZCAmJiAoZS5jaGVja2VkIHx8IGUuaXNQYXJ0aWFsQ2hlY2tlZCkpLmZvckVhY2goKGUpID0+IHtcbiAgICBlLmlzQ2xvc2VkID0gITEsIGJ0KGwsIGUpO1xuICB9KTtcbn0sIHdpID0gKGwsIGUpID0+IHtcbiAgY29uc3QgdCA9IEVpKGwsIGUpO1xuICBsLmZvckVhY2goKHMpID0+IHtcbiAgICB0LnNvbWUoKHsgaWQ6IGEgfSkgPT4gYSA9PT0gcy5pZCkgPyAocy5pc0dyb3VwICYmIChzLmlzQ2xvc2VkID0gITEsIGJ0KGwsIHMpKSwgcy5oaWRkZW4gPSAhMSkgOiBzLmhpZGRlbiA9ICEwO1xuICB9KTtcbn0sIEVpID0gKGwsIGUpID0+IGwucmVkdWNlKCh0LCBzKSA9PiB7XG4gIGlmIChzLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhlLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgaWYgKHQucHVzaChzKSwgcy5pc0dyb3VwKSB7XG4gICAgICBjb25zdCBhID0gcnMocy5pZCwgbCk7XG4gICAgICB0LnB1c2goLi4uYSk7XG4gICAgfVxuICAgIGlmIChzLmNoaWxkT2YpIHtcbiAgICAgIGNvbnN0IGEgPSBjcyhzLmNoaWxkT2YsIGwpO1xuICAgICAgdC5wdXNoKC4uLmEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdDtcbn0sIFtdKSwgcnMgPSAobCwgZSkgPT4gZS5yZWR1Y2UoKHQsIHMpID0+IChzLmNoaWxkT2YgPT09IGwgJiYgKHQucHVzaChzKSwgcy5pc0dyb3VwICYmIHQucHVzaCguLi5ycyhzLmlkLCBlKSkpLCB0KSwgW10pLCBjcyA9IChsLCBlKSA9PiBlLnJlZHVjZSgodCwgcykgPT4gKHMuaWQgPT09IGwgJiYgKHQucHVzaChzKSwgcy5jaGlsZE9mICYmIHQucHVzaCguLi5jcyhzLmNoaWxkT2YsIGUpKSksIHQpLCBbXSksIHZpID0gKGwpID0+IHtcbiAgY29uc3QgeyBkdXBsaWNhdGlvbnM6IGUgfSA9IGwucmVkdWNlKFxuICAgICh0LCBzKSA9PiAodC5hbGxJdGVtcy5zb21lKChpKSA9PiBpLnRvU3RyaW5nKCkgPT09IHMuaWQudG9TdHJpbmcoKSkgJiYgdC5kdXBsaWNhdGlvbnMucHVzaChzLmlkKSwgdC5hbGxJdGVtcy5wdXNoKHMuaWQpLCB0KSxcbiAgICB7XG4gICAgICBkdXBsaWNhdGlvbnM6IFtdLFxuICAgICAgYWxsSXRlbXM6IFtdXG4gICAgfVxuICApO1xuICBlLmxlbmd0aCAmJiBjb25zb2xlLmVycm9yKGBWYWxpZGF0aW9uOiBZb3UgaGF2ZSBkdXBsaWNhdGVkIHZhbHVlczogJHtlLmpvaW4oXCIsIFwiKX0hIFlvdSBzaG91bGQgdXNlIHVuaXF1ZSB2YWx1ZXMuYCk7XG59LCBMaSA9IChsLCBlLCB0LCBzLCBpLCBhLCBoLCBkLCBDLCBmKSA9PiB7XG4gIHNzKGwsIGUsIGksIEMpLCBkICYmIGggJiYga2koZSksIGNlKGUsIHQsIHMsIGEsIGYpO1xufSwgY2UgPSAobCwgZSwgdCwgcywgaSkgPT4ge1xuICBsLmZvckVhY2goKGEpID0+IHtcbiAgICBjb25zdCBoID0gZS5xdWVyeVNlbGVjdG9yKGBbaW5wdXQtaWQ9XCIke2EuaWR9XCJdYCksIGQgPSBUKGgpO1xuICAgIGguY2hlY2tlZCA9IGEuY2hlY2tlZCwgeWkoYSwgZCwgcyksIHhpKGEsIGQpLCBTaShhLCBkKSwgX2koYSwgZCwgdCksIEFpKGEsIGQpLCBOaShhLCBkLCBsLCBpKSwgVGkoYSwgaCwgdCk7XG4gIH0pLCBPaShsLCBlKTtcbn0sIHlpID0gKGwsIGUsIHQpID0+IHtcbiAgbC5jaGVja2VkID8gZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1jaGVja2VkXCIpIDogZS5jbGFzc0xpc3QucmVtb3ZlKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1jaGVja2VkXCIpLCBBcnJheS5pc0FycmF5KHQpICYmIHRbMF0gPT09IGwuaWQgJiYgIWwuZGlzYWJsZWQgPyBlLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLXNpbmdsZS1zZWxlY3RlZFwiKSA6IGUuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tc2luZ2xlLXNlbGVjdGVkXCIpO1xufSwgeGkgPSAobCwgZSkgPT4ge1xuICBsLmlzUGFydGlhbENoZWNrZWQgPyBlLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLXBhcnRpYWwtY2hlY2tlZFwiKSA6IGUuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tcGFydGlhbC1jaGVja2VkXCIpO1xufSwgU2kgPSAobCwgZSkgPT4ge1xuICBsLmRpc2FibGVkID8gZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1kaXNhYmxlZFwiKSA6IGUuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tZGlzYWJsZWRcIik7XG59LCBfaSA9IChsLCBlLCB0KSA9PiB7XG4gIGlmIChsLmlzR3JvdXApIHtcbiAgICBjb25zdCBzID0gZS5xdWVyeVNlbGVjdG9yKFwiLnRyZWVzZWxlY3QtbGlzdF9faXRlbS1pY29uXCIpLCBpID0gbC5pc0Nsb3NlZCA/IHQuYXJyb3dSaWdodCA6IHQuYXJyb3dEb3duO1xuICAgIEkoaSwgcyksIGwuaXNDbG9zZWQgPyBlLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLWNsb3NlZFwiKSA6IGUuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tY2xvc2VkXCIpO1xuICB9XG59LCBBaSA9IChsLCBlKSA9PiB7XG4gIGwuaGlkZGVuID8gZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1oaWRkZW5cIikgOiBlLmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLWhpZGRlblwiKTtcbn0sIFRpID0gKGwsIGUsIHQpID0+IHtcbiAgY29uc3QgaSA9IGUucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yKFwiLnRyZWVzZWxlY3QtbGlzdF9faXRlbS1jaGVja2JveC1pY29uXCIpO1xuICBsLmNoZWNrZWQgPyBJKHQuY2hlY2ssIGkpIDogbC5pc1BhcnRpYWxDaGVja2VkID8gSSh0LnBhcnRpYWxDaGVjaywgaSkgOiBpLmlubmVySFRNTCA9IFwiXCI7XG59LCBOaSA9IChsLCBlLCB0LCBzKSA9PiB7XG4gIGNvbnN0IGkgPSBsLmxldmVsID09PSAwLCBhID0gMjAsIGggPSA1O1xuICBpZiAoaSkge1xuICAgIGNvbnN0IGQgPSB0LnNvbWUoKGIpID0+IGIuaXNHcm91cCAmJiBiLmxldmVsID09PSBsLmxldmVsKSwgQyA9ICFsLmlzR3JvdXAgJiYgZCA/IGAke2F9cHhgIDogYCR7aH1weGAsIGYgPSBsLmlzR3JvdXAgPyBcIjBcIiA6IEM7XG4gICAgcyA/IGUuc3R5bGUucGFkZGluZ1JpZ2h0ID0gZiA6IGUuc3R5bGUucGFkZGluZ0xlZnQgPSBmO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGQgPSBsLmlzR3JvdXAgPyBgJHtsLmxldmVsICogYX1weGAgOiBgJHtsLmxldmVsICogYSArIGF9cHhgO1xuICAgIHMgPyBlLnN0eWxlLnBhZGRpbmdSaWdodCA9IGQgOiBlLnN0eWxlLnBhZGRpbmdMZWZ0ID0gZDtcbiAgfVxuICBlLnNldEF0dHJpYnV0ZShcImxldmVsXCIsIGwubGV2ZWwudG9TdHJpbmcoKSksIGUuc2V0QXR0cmlidXRlKFwiZ3JvdXBcIiwgbC5pc0dyb3VwLnRvU3RyaW5nKCkpO1xufSwgT2kgPSAobCwgZSkgPT4ge1xuICBjb25zdCB0ID0gbC5zb21lKChpKSA9PiAhaS5oaWRkZW4pLCBzID0gZS5xdWVyeVNlbGVjdG9yKFwiLnRyZWVzZWxlY3QtbGlzdF9fZW1wdHlcIik7XG4gIHQgPyBzLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2VtcHR5LS1oaWRkZW5cIikgOiBzLmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LWxpc3RfX2VtcHR5LS1oaWRkZW5cIik7XG59LCBUID0gKGwpID0+IGwucGFyZW50Tm9kZS5wYXJlbnROb2RlLCBWdCA9IChsLCBlKSA9PiBlLmZpbmQoKHQpID0+IHQuaWQudG9TdHJpbmcoKSA9PT0gbCksIElpID0gKGwpID0+IFQobCkucXVlcnlTZWxlY3RvcihcIi50cmVlc2VsZWN0LWxpc3RfX2l0ZW0taWNvblwiKSwgUGkgPSAobCwgZSkgPT4ge1xuICBlICYmIE9iamVjdC5rZXlzKGUpLmZvckVhY2goKHQpID0+IHtcbiAgICBjb25zdCBzID0gZVt0XTtcbiAgICB0eXBlb2YgcyA9PSBcInN0cmluZ1wiICYmIGwuc2V0QXR0cmlidXRlKHQsIHMpO1xuICB9KTtcbn07XG52YXIgTSwgUCwgUywgWSwgT2UsIGhzLCBJZSwgZHMsIFBlLCB1cywgQmUsIHBzLCBWZSwgbXMsIERlLCBmcywgSywgdnQsIEhlLCBicywgR2UsIENzLCBNZSwgZ3MsIFgsIEx0LCBGZSwga3MsIHFlLCB3cywgamUsIEVzLCBSZSwgdnMsICRlLCBMcywgV2UsIHlzLCBVZSwgeHMsIHplLCBTcywgWWUsIF9zLCBLZSwgQXMsIFhlLCBUcywgSiwgeXQsIFosIHh0LCBKZSwgTnM7XG5jbGFzcyBCaSB7XG4gIGNvbnN0cnVjdG9yKHtcbiAgICBvcHRpb25zOiBlLFxuICAgIHZhbHVlOiB0LFxuICAgIG9wZW5MZXZlbDogcyxcbiAgICBsaXN0U2xvdEh0bWxDb21wb25lbnQ6IGksXG4gICAgZW1wdHlUZXh0OiBhLFxuICAgIGlzU2luZ2xlU2VsZWN0OiBoLFxuICAgIGljb25FbGVtZW50czogZCxcbiAgICBzaG93Q291bnQ6IEMsXG4gICAgZGlzYWJsZWRCcmFuY2hOb2RlOiBmLFxuICAgIGV4cGFuZFNlbGVjdGVkOiBiLFxuICAgIGlzSW5kZXBlbmRlbnROb2RlczogZyxcbiAgICBydGw6IGssXG4gICAgaW5wdXRDYWxsYmFjazogdyxcbiAgICBhcnJvd0NsaWNrQ2FsbGJhY2s6IHksXG4gICAgbW91c2V1cENhbGxiYWNrOiB4XG4gIH0pIHtcbiAgICAvLyBQcml2YXRlIG1ldGhvZHNcbiAgICByKHRoaXMsIE9lKTtcbiAgICByKHRoaXMsIEllKTtcbiAgICByKHRoaXMsIFBlKTtcbiAgICByKHRoaXMsIEJlKTtcbiAgICByKHRoaXMsIFZlKTtcbiAgICByKHRoaXMsIERlKTtcbiAgICByKHRoaXMsIEspO1xuICAgIHIodGhpcywgSGUpO1xuICAgIHIodGhpcywgR2UpO1xuICAgIHIodGhpcywgTWUpO1xuICAgIHIodGhpcywgWCk7XG4gICAgcih0aGlzLCBGZSk7XG4gICAgcih0aGlzLCBxZSk7XG4gICAgcih0aGlzLCBqZSk7XG4gICAgcih0aGlzLCBSZSk7XG4gICAgcih0aGlzLCAkZSk7XG4gICAgcih0aGlzLCBXZSk7XG4gICAgcih0aGlzLCBVZSk7XG4gICAgcih0aGlzLCB6ZSk7XG4gICAgcih0aGlzLCBZZSk7XG4gICAgLy8gQWN0aW9uc1xuICAgIHIodGhpcywgS2UpO1xuICAgIHIodGhpcywgWGUpO1xuICAgIHIodGhpcywgSik7XG4gICAgcih0aGlzLCBaKTtcbiAgICAvLyBFbWl0c1xuICAgIHIodGhpcywgSmUpO1xuICAgIC8vIFByb3BzXG4gICAgYyh0aGlzLCBcIm9wdGlvbnNcIik7XG4gICAgYyh0aGlzLCBcInZhbHVlXCIpO1xuICAgIGModGhpcywgXCJvcGVuTGV2ZWxcIik7XG4gICAgYyh0aGlzLCBcImxpc3RTbG90SHRtbENvbXBvbmVudFwiKTtcbiAgICBjKHRoaXMsIFwiZW1wdHlUZXh0XCIpO1xuICAgIGModGhpcywgXCJpc1NpbmdsZVNlbGVjdFwiKTtcbiAgICBjKHRoaXMsIFwic2hvd0NvdW50XCIpO1xuICAgIGModGhpcywgXCJkaXNhYmxlZEJyYW5jaE5vZGVcIik7XG4gICAgYyh0aGlzLCBcImV4cGFuZFNlbGVjdGVkXCIpO1xuICAgIGModGhpcywgXCJpc0luZGVwZW5kZW50Tm9kZXNcIik7XG4gICAgYyh0aGlzLCBcInJ0bFwiKTtcbiAgICBjKHRoaXMsIFwiaWNvbkVsZW1lbnRzXCIpO1xuICAgIC8vIElubmVyU3RhdGVcbiAgICBjKHRoaXMsIFwic2VhcmNoVGV4dFwiKTtcbiAgICBjKHRoaXMsIFwiZmxhdHRlZE9wdGlvbnNcIik7XG4gICAgYyh0aGlzLCBcImZsYXR0ZWRPcHRpb25zQmVmb3JlU2VhcmNoXCIpO1xuICAgIGModGhpcywgXCJzZWxlY3RlZE5vZGVzXCIpO1xuICAgIGModGhpcywgXCJzcmNFbGVtZW50XCIpO1xuICAgIC8vIENhbGxiYWNrc1xuICAgIGModGhpcywgXCJpbnB1dENhbGxiYWNrXCIpO1xuICAgIGModGhpcywgXCJhcnJvd0NsaWNrQ2FsbGJhY2tcIik7XG4gICAgYyh0aGlzLCBcIm1vdXNldXBDYWxsYmFja1wiKTtcbiAgICAvLyBQcml2YXRlSW5uZXJTdGF0ZVxuICAgIHIodGhpcywgTSwgbnVsbCk7XG4gICAgcih0aGlzLCBQLCAhMCk7XG4gICAgcih0aGlzLCBTLCBbXSk7XG4gICAgcih0aGlzLCBZLCAhMCk7XG4gICAgdGhpcy5vcHRpb25zID0gZSwgdGhpcy52YWx1ZSA9IHQsIHRoaXMub3BlbkxldmVsID0gcyA/PyAwLCB0aGlzLmxpc3RTbG90SHRtbENvbXBvbmVudCA9IGkgPz8gbnVsbCwgdGhpcy5lbXB0eVRleHQgPSBhID8/IFwiTm8gcmVzdWx0cyBmb3VuZC4uLlwiLCB0aGlzLmlzU2luZ2xlU2VsZWN0ID0gaCA/PyAhMSwgdGhpcy5zaG93Q291bnQgPSBDID8/ICExLCB0aGlzLmRpc2FibGVkQnJhbmNoTm9kZSA9IGYgPz8gITEsIHRoaXMuZXhwYW5kU2VsZWN0ZWQgPSBiID8/ICExLCB0aGlzLmlzSW5kZXBlbmRlbnROb2RlcyA9IGcgPz8gITEsIHRoaXMucnRsID0gayA/PyAhMSwgdGhpcy5pY29uRWxlbWVudHMgPSBkLCB0aGlzLnNlYXJjaFRleHQgPSBcIlwiLCB0aGlzLmZsYXR0ZWRPcHRpb25zID0gYmkodGhpcy5vcHRpb25zLCB0aGlzLm9wZW5MZXZlbCwgdGhpcy5pc0luZGVwZW5kZW50Tm9kZXMpLCB0aGlzLmZsYXR0ZWRPcHRpb25zQmVmb3JlU2VhcmNoID0gdGhpcy5mbGF0dGVkT3B0aW9ucywgdGhpcy5zZWxlY3RlZE5vZGVzID0geyBub2RlczogW10sIGdyb3VwZWROb2RlczogW10sIGFsbE5vZGVzOiBbXSB9LCB0aGlzLnNyY0VsZW1lbnQgPSBvKHRoaXMsIFBlLCB1cykuY2FsbCh0aGlzKSwgdGhpcy5pbnB1dENhbGxiYWNrID0gdywgdGhpcy5hcnJvd0NsaWNrQ2FsbGJhY2sgPSB5LCB0aGlzLm1vdXNldXBDYWxsYmFjayA9IHgsIHZpKHRoaXMuZmxhdHRlZE9wdGlvbnMpO1xuICB9XG4gIC8vIFB1YmxpYyBtZXRob2RzXG4gIHVwZGF0ZVZhbHVlKGUpIHtcbiAgICB0aGlzLnZhbHVlID0gZSwgbSh0aGlzLCBTLCB0aGlzLmlzU2luZ2xlU2VsZWN0ID8gdGhpcy52YWx1ZSA6IFtdKSwgTGkoXG4gICAgICBlLFxuICAgICAgdGhpcy5mbGF0dGVkT3B0aW9ucyxcbiAgICAgIHRoaXMuc3JjRWxlbWVudCxcbiAgICAgIHRoaXMuaWNvbkVsZW1lbnRzLFxuICAgICAgdGhpcy5pc1NpbmdsZVNlbGVjdCxcbiAgICAgIG4odGhpcywgUyksXG4gICAgICB0aGlzLmV4cGFuZFNlbGVjdGVkLFxuICAgICAgbih0aGlzLCBZKSxcbiAgICAgIHRoaXMuaXNJbmRlcGVuZGVudE5vZGVzLFxuICAgICAgdGhpcy5ydGxcbiAgICApLCBtKHRoaXMsIFksICExKSwgbyh0aGlzLCBaLCB4dCkuY2FsbCh0aGlzKTtcbiAgfVxuICB1cGRhdGVTZWFyY2hWYWx1ZShlKSB7XG4gICAgaWYgKGUgPT09IHRoaXMuc2VhcmNoVGV4dClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB0ID0gdGhpcy5zZWFyY2hUZXh0ID09PSBcIlwiICYmIGUgIT09IFwiXCI7XG4gICAgdGhpcy5zZWFyY2hUZXh0ID0gZSwgdCAmJiAodGhpcy5mbGF0dGVkT3B0aW9uc0JlZm9yZVNlYXJjaCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5mbGF0dGVkT3B0aW9ucykpKSwgdGhpcy5zZWFyY2hUZXh0ID09PSBcIlwiICYmICh0aGlzLmZsYXR0ZWRPcHRpb25zID0gdGhpcy5mbGF0dGVkT3B0aW9uc0JlZm9yZVNlYXJjaC5tYXAoKHMpID0+IHtcbiAgICAgIGNvbnN0IGkgPSB0aGlzLmZsYXR0ZWRPcHRpb25zLmZpbmQoKGEpID0+IGEuaWQgPT09IHMuaWQpO1xuICAgICAgcmV0dXJuIGkuaXNDbG9zZWQgPSBzLmlzQ2xvc2VkLCBpLmhpZGRlbiA9IHMuaGlkZGVuLCBpO1xuICAgIH0pLCB0aGlzLmZsYXR0ZWRPcHRpb25zQmVmb3JlU2VhcmNoID0gW10pLCB0aGlzLnNlYXJjaFRleHQgJiYgd2kodGhpcy5mbGF0dGVkT3B0aW9ucywgZSksIGNlKHRoaXMuZmxhdHRlZE9wdGlvbnMsIHRoaXMuc3JjRWxlbWVudCwgdGhpcy5pY29uRWxlbWVudHMsIG4odGhpcywgUyksIHRoaXMucnRsKSwgdGhpcy5mb2N1c0ZpcnN0TGlzdEVsZW1lbnQoKTtcbiAgfVxuICBjYWxsS2V5QWN0aW9uKGUpIHtcbiAgICBtKHRoaXMsIFAsICExKTtcbiAgICBjb25zdCB0ID0gdGhpcy5zcmNFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCIudHJlZXNlbGVjdC1saXN0X19pdGVtLS1mb2N1c2VkXCIpO1xuICAgIGlmICh0ID09IG51bGwgPyB2b2lkIDAgOiB0LmNsYXNzTGlzdC5jb250YWlucyhcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0taGlkZGVuXCIpKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IGkgPSBlLmtleTtcbiAgICBpID09PSBcIkVudGVyXCIgJiYgdCAmJiB0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwibW91c2Vkb3duXCIpKSwgKGkgPT09IFwiQXJyb3dMZWZ0XCIgfHwgaSA9PT0gXCJBcnJvd1JpZ2h0XCIpICYmIG8odGhpcywgT2UsIGhzKS5jYWxsKHRoaXMsIHQsIGUpLCAoaSA9PT0gXCJBcnJvd0Rvd25cIiB8fCBpID09PSBcIkFycm93VXBcIikgJiYgbyh0aGlzLCBJZSwgZHMpLmNhbGwodGhpcywgdCwgaSk7XG4gIH1cbiAgZm9jdXNGaXJzdExpc3RFbGVtZW50KCkge1xuICAgIGNvbnN0IGUgPSBcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tZm9jdXNlZFwiLCB0ID0gdGhpcy5zcmNFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2V9YCksIHMgPSBBcnJheS5mcm9tKHRoaXMuc3JjRWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKFwiLnRyZWVzZWxlY3QtbGlzdF9faXRlbS1jaGVja2JveFwiKSkuZmlsdGVyKFxuICAgICAgKGEpID0+IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKFQoYSkpLmRpc3BsYXkgIT09IFwibm9uZVwiXG4gICAgKTtcbiAgICBpZiAoIXMubGVuZ3RoKVxuICAgICAgcmV0dXJuO1xuICAgIHQgJiYgdC5jbGFzc0xpc3QucmVtb3ZlKGUpLCBUKHNbMF0pLmNsYXNzTGlzdC5hZGQoZSk7XG4gIH1cbiAgaXNMYXN0Rm9jdXNlZEVsZW1lbnRFeGlzdCgpIHtcbiAgICByZXR1cm4gISFuKHRoaXMsIE0pO1xuICB9XG59XG5NID0gbmV3IFdlYWtNYXAoKSwgUCA9IG5ldyBXZWFrTWFwKCksIFMgPSBuZXcgV2Vha01hcCgpLCBZID0gbmV3IFdlYWtNYXAoKSwgT2UgPSBuZXcgV2Vha1NldCgpLCBocyA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgaWYgKCFlKVxuICAgIHJldHVybjtcbiAgY29uc3QgcyA9IHQua2V5LCBhID0gZS5xdWVyeVNlbGVjdG9yKFwiLnRyZWVzZWxlY3QtbGlzdF9faXRlbS1jaGVja2JveFwiKS5nZXRBdHRyaWJ1dGUoXCJpbnB1dC1pZFwiKSwgaCA9IFZ0KGEsIHRoaXMuZmxhdHRlZE9wdGlvbnMpLCBkID0gZS5xdWVyeVNlbGVjdG9yKFwiLnRyZWVzZWxlY3QtbGlzdF9faXRlbS1pY29uXCIpO1xuICBzID09PSBcIkFycm93TGVmdFwiICYmICFoLmlzQ2xvc2VkICYmIGguaXNHcm91cCAmJiAoZC5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcIm1vdXNlZG93blwiKSksIHQucHJldmVudERlZmF1bHQoKSksIHMgPT09IFwiQXJyb3dSaWdodFwiICYmIGguaXNDbG9zZWQgJiYgaC5pc0dyb3VwICYmIChkLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwibW91c2Vkb3duXCIpKSwgdC5wcmV2ZW50RGVmYXVsdCgpKTtcbn0sIEllID0gbmV3IFdlYWtTZXQoKSwgZHMgPSBmdW5jdGlvbihlLCB0KSB7XG4gIHZhciBpO1xuICBjb25zdCBzID0gQXJyYXkuZnJvbSh0aGlzLnNyY0VsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi50cmVlc2VsZWN0LWxpc3RfX2l0ZW0tY2hlY2tib3hcIikpLmZpbHRlcihcbiAgICAoYSkgPT4gd2luZG93LmdldENvbXB1dGVkU3R5bGUoVChhKSkuZGlzcGxheSAhPT0gXCJub25lXCJcbiAgKTtcbiAgaWYgKHMubGVuZ3RoKVxuICAgIGlmICghZSlcbiAgICAgIFQoc1swXSkuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdF9faXRlbS0tZm9jdXNlZFwiKTtcbiAgICBlbHNlIHtcbiAgICAgIGNvbnN0IGEgPSBzLmZpbmRJbmRleChcbiAgICAgICAgKHgpID0+IFQoeCkuY2xhc3NMaXN0LmNvbnRhaW5zKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1mb2N1c2VkXCIpXG4gICAgICApO1xuICAgICAgVChzW2FdKS5jbGFzc0xpc3QucmVtb3ZlKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1mb2N1c2VkXCIpO1xuICAgICAgY29uc3QgZCA9IHQgPT09IFwiQXJyb3dEb3duXCIgPyBhICsgMSA6IGEgLSAxLCBDID0gdCA9PT0gXCJBcnJvd0Rvd25cIiA/IDAgOiBzLmxlbmd0aCAtIDEsIGYgPSBzW2RdID8/IHNbQ10sIGIgPSAhc1tkXSwgZyA9IFQoZik7XG4gICAgICBnLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLWZvY3VzZWRcIik7XG4gICAgICBjb25zdCBrID0gdGhpcy5zcmNFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB3ID0gZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmIChiICYmIHQgPT09IFwiQXJyb3dEb3duXCIpIHtcbiAgICAgICAgdGhpcy5zcmNFbGVtZW50LnNjcm9sbCgwLCAwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGIgJiYgdCA9PT0gXCJBcnJvd1VwXCIpIHtcbiAgICAgICAgdGhpcy5zcmNFbGVtZW50LnNjcm9sbCgwLCB0aGlzLnNyY0VsZW1lbnQuc2Nyb2xsSGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgeSA9ICgoaSA9IHRoaXMubGlzdFNsb3RIdG1sQ29tcG9uZW50KSA9PSBudWxsID8gdm9pZCAwIDogaS5jbGllbnRIZWlnaHQpID8/IDA7XG4gICAgICBpZiAoay55ICsgay5oZWlnaHQgPCB3LnkgKyB3LmhlaWdodCArIHkpIHtcbiAgICAgICAgdGhpcy5zcmNFbGVtZW50LnNjcm9sbCgwLCB0aGlzLnNyY0VsZW1lbnQuc2Nyb2xsVG9wICsgdy5oZWlnaHQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoay55ID4gdy55KSB7XG4gICAgICAgIHRoaXMuc3JjRWxlbWVudC5zY3JvbGwoMCwgdGhpcy5zcmNFbGVtZW50LnNjcm9sbFRvcCAtIHcuaGVpZ2h0KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbn0sIFBlID0gbmV3IFdlYWtTZXQoKSwgdXMgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgZSA9IG8odGhpcywgQmUsIHBzKS5jYWxsKHRoaXMpLCB0ID0gbyh0aGlzLCBLLCB2dCkuY2FsbCh0aGlzLCB0aGlzLm9wdGlvbnMpO1xuICBlLmFwcGVuZCguLi50KTtcbiAgY29uc3QgcyA9IG8odGhpcywgR2UsIENzKS5jYWxsKHRoaXMpO1xuICBlLmFwcGVuZChzKTtcbiAgY29uc3QgaSA9IG8odGhpcywgSGUsIGJzKS5jYWxsKHRoaXMpO1xuICByZXR1cm4gaSAmJiBlLmFwcGVuZChpKSwgZTtcbn0sIEJlID0gbmV3IFdlYWtTZXQoKSwgcHMgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHJldHVybiBlLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RcIiksIHRoaXMuaXNTaW5nbGVTZWxlY3QgJiYgZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0LS1zaW5nbGUtc2VsZWN0XCIpLCB0aGlzLmRpc2FibGVkQnJhbmNoTm9kZSAmJiBlLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3QtLWRpc2FibGVkLWJyYW5jaC1ub2RlXCIpLCBlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLCAodCkgPT4gbyh0aGlzLCBWZSwgbXMpLmNhbGwodGhpcywgdCkpLCBlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgKCkgPT4gbyh0aGlzLCBEZSwgZnMpLmNhbGwodGhpcykpLCBlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsICgpID0+IHRoaXMubW91c2V1cENhbGxiYWNrKCksICEwKSwgZTtcbn0sIFZlID0gbmV3IFdlYWtTZXQoKSwgbXMgPSBmdW5jdGlvbihlKSB7XG4gIGUuc3RvcFByb3BhZ2F0aW9uKCksIG4odGhpcywgTSkgJiYgbih0aGlzLCBQKSAmJiBuKHRoaXMsIE0pLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tLWZvY3VzZWRcIik7XG59LCBEZSA9IG5ldyBXZWFrU2V0KCksIGZzID0gZnVuY3Rpb24oKSB7XG4gIG0odGhpcywgUCwgITApO1xufSwgSyA9IG5ldyBXZWFrU2V0KCksIHZ0ID0gZnVuY3Rpb24oZSkge1xuICByZXR1cm4gZS5yZWR1Y2UoKHQsIHMpID0+IHtcbiAgICB2YXIgYTtcbiAgICBpZiAoKGEgPSBzLmNoaWxkcmVuKSAhPSBudWxsICYmIGEubGVuZ3RoKSB7XG4gICAgICBjb25zdCBoID0gbyh0aGlzLCBNZSwgZ3MpLmNhbGwodGhpcywgcyksIGQgPSBvKHRoaXMsIEssIHZ0KS5jYWxsKHRoaXMsIHMuY2hpbGRyZW4pO1xuICAgICAgcmV0dXJuIGguYXBwZW5kKC4uLmQpLCB0LnB1c2goaCksIHQ7XG4gICAgfVxuICAgIGNvbnN0IGkgPSBvKHRoaXMsIFgsIEx0KS5jYWxsKHRoaXMsIHMsICExKTtcbiAgICByZXR1cm4gdC5wdXNoKGkpLCB0O1xuICB9LCBbXSk7XG59LCBIZSA9IG5ldyBXZWFrU2V0KCksIGJzID0gZnVuY3Rpb24oKSB7XG4gIGlmICghdGhpcy5saXN0U2xvdEh0bWxDb21wb25lbnQpXG4gICAgcmV0dXJuIG51bGw7XG4gIGNvbnN0IGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICByZXR1cm4gZS5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19zbG90XCIpLCBlLmFwcGVuZENoaWxkKHRoaXMubGlzdFNsb3RIdG1sQ29tcG9uZW50KSwgZTtcbn0sIEdlID0gbmV3IFdlYWtTZXQoKSwgQ3MgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGUuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdF9fZW1wdHlcIiksIGUuc2V0QXR0cmlidXRlKFwidGl0bGVcIiwgdGhpcy5lbXB0eVRleHQpO1xuICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdF9fZW1wdHktaWNvblwiKSwgSSh0aGlzLmljb25FbGVtZW50cy5hdHRlbnRpb24sIHQpO1xuICBjb25zdCBzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHJldHVybiBzLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2VtcHR5LXRleHRcIiksIHMudGV4dENvbnRlbnQgPSB0aGlzLmVtcHR5VGV4dCwgZS5hcHBlbmQodCwgcyksIGU7XG59LCBNZSA9IG5ldyBXZWFrU2V0KCksIGdzID0gZnVuY3Rpb24oZSkge1xuICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgdC5zZXRBdHRyaWJ1dGUoXCJncm91cC1jb250YWluZXItaWRcIiwgZS52YWx1ZS50b1N0cmluZygpKSwgdC5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19ncm91cC1jb250YWluZXJcIik7XG4gIGNvbnN0IHMgPSBvKHRoaXMsIFgsIEx0KS5jYWxsKHRoaXMsIGUsICEwKTtcbiAgcmV0dXJuIHQuYXBwZW5kQ2hpbGQocyksIHQ7XG59LCBYID0gbmV3IFdlYWtTZXQoKSwgTHQgPSBmdW5jdGlvbihlLCB0KSB7XG4gIGNvbnN0IHMgPSBvKHRoaXMsIEZlLCBrcykuY2FsbCh0aGlzLCBlKTtcbiAgaWYgKHQpIHtcbiAgICBjb25zdCBoID0gbyh0aGlzLCAkZSwgTHMpLmNhbGwodGhpcyk7XG4gICAgcy5hcHBlbmRDaGlsZChoKSwgcy5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1ncm91cFwiKTtcbiAgfVxuICBjb25zdCBpID0gbyh0aGlzLCBVZSwgeHMpLmNhbGwodGhpcywgZSksIGEgPSBvKHRoaXMsIHplLCBTcykuY2FsbCh0aGlzLCBlLCB0KTtcbiAgcmV0dXJuIHMuYXBwZW5kKGksIGEpLCBzO1xufSwgRmUgPSBuZXcgV2Vha1NldCgpLCBrcyA9IGZ1bmN0aW9uKGUpIHtcbiAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIHJldHVybiBQaSh0LCBlLmh0bWxBdHRyKSwgdC5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpLCB0LnNldEF0dHJpYnV0ZShcInRpdGxlXCIsIGUubmFtZSksIHQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdF9faXRlbVwiKSwgdC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VvdmVyXCIsICgpID0+IG8odGhpcywgcWUsIHdzKS5jYWxsKHRoaXMsIHQpLCAhMCksIHQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3V0XCIsICgpID0+IG8odGhpcywgamUsIEVzKS5jYWxsKHRoaXMsIHQpLCAhMCksIHQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAocykgPT4gbyh0aGlzLCBSZSwgdnMpLmNhbGwodGhpcywgcywgZSkpLCB0O1xufSwgcWUgPSBuZXcgV2Vha1NldCgpLCB3cyA9IGZ1bmN0aW9uKGUpIHtcbiAgbih0aGlzLCBQKSAmJiBvKHRoaXMsIEosIHl0KS5jYWxsKHRoaXMsICEwLCBlKTtcbn0sIGplID0gbmV3IFdlYWtTZXQoKSwgRXMgPSBmdW5jdGlvbihlKSB7XG4gIG4odGhpcywgUCkgJiYgKG8odGhpcywgSiwgeXQpLmNhbGwodGhpcywgITEsIGUpLCBtKHRoaXMsIE0sIGUpKTtcbn0sIFJlID0gbmV3IFdlYWtTZXQoKSwgdnMgPSBmdW5jdGlvbihlLCB0KSB7XG4gIHZhciBhO1xuICBpZiAoZS5wcmV2ZW50RGVmYXVsdCgpLCBlLnN0b3BQcm9wYWdhdGlvbigpLCAoYSA9IHRoaXMuZmxhdHRlZE9wdGlvbnMuZmluZCgoaCkgPT4gaC5pZCA9PT0gdC52YWx1ZSkpID09IG51bGwgPyB2b2lkIDAgOiBhLmRpc2FibGVkKVxuICAgIHJldHVybjtcbiAgY29uc3QgaSA9IGUudGFyZ2V0LnF1ZXJ5U2VsZWN0b3IoXCIudHJlZXNlbGVjdC1saXN0X19pdGVtLWNoZWNrYm94XCIpO1xuICBpLmNoZWNrZWQgPSAhaS5jaGVja2VkLCBvKHRoaXMsIEtlLCBBcykuY2FsbCh0aGlzLCBpLCB0KTtcbn0sICRlID0gbmV3IFdlYWtTZXQoKSwgTHMgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICByZXR1cm4gZS5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpLCBlLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0taWNvblwiKSwgSSh0aGlzLmljb25FbGVtZW50cy5hcnJvd0Rvd24sIGUpLCBlLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgKHQpID0+IG8odGhpcywgV2UsIHlzKS5jYWxsKHRoaXMsIHQpKSwgZTtcbn0sIFdlID0gbmV3IFdlYWtTZXQoKSwgeXMgPSBmdW5jdGlvbihlKSB7XG4gIGUucHJldmVudERlZmF1bHQoKSwgZS5zdG9wUHJvcGFnYXRpb24oKSwgbyh0aGlzLCBYZSwgVHMpLmNhbGwodGhpcywgZSk7XG59LCBVZSA9IG5ldyBXZWFrU2V0KCksIHhzID0gZnVuY3Rpb24oZSkge1xuICBjb25zdCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgdC5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0X19pdGVtLWNoZWNrYm94LWNvbnRhaW5lclwiKTtcbiAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICBzLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tY2hlY2tib3gtaWNvblwiKSwgcy5pbm5lckhUTUwgPSBcIlwiO1xuICBjb25zdCBpID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICByZXR1cm4gaS5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIi0xXCIpLCBpLnNldEF0dHJpYnV0ZShcInR5cGVcIiwgXCJjaGVja2JveFwiKSwgaS5zZXRBdHRyaWJ1dGUoXCJpbnB1dC1pZFwiLCBlLnZhbHVlLnRvU3RyaW5nKCkpLCBpLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tY2hlY2tib3hcIiksIHQuYXBwZW5kKHMsIGkpLCB0O1xufSwgemUgPSBuZXcgV2Vha1NldCgpLCBTcyA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgY29uc3QgcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJsYWJlbFwiKTtcbiAgaWYgKHMudGV4dENvbnRlbnQgPSBlLm5hbWUsIHMuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtbGlzdF9faXRlbS1sYWJlbFwiKSwgdCAmJiB0aGlzLnNob3dDb3VudCkge1xuICAgIGNvbnN0IGkgPSBvKHRoaXMsIFllLCBfcykuY2FsbCh0aGlzLCBlKTtcbiAgICBzLmFwcGVuZENoaWxkKGkpO1xuICB9XG4gIHJldHVybiBzO1xufSwgWWUgPSBuZXcgV2Vha1NldCgpLCBfcyA9IGZ1bmN0aW9uKGUpIHtcbiAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpLCBzID0gdGhpcy5mbGF0dGVkT3B0aW9ucy5maWx0ZXIoKGkpID0+IGkuY2hpbGRPZiA9PT0gZS52YWx1ZSk7XG4gIHJldHVybiB0LnRleHRDb250ZW50ID0gYCgke3MubGVuZ3RofSlgLCB0LmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWxpc3RfX2l0ZW0tbGFiZWwtY291bnRlclwiKSwgdDtcbn0sIEtlID0gbmV3IFdlYWtTZXQoKSwgQXMgPSBmdW5jdGlvbihlLCB0KSB7XG4gIGNvbnN0IHMgPSB0aGlzLmZsYXR0ZWRPcHRpb25zLmZpbmQoKGkpID0+IGkuaWQgPT09IHQudmFsdWUpO1xuICBpZiAocykge1xuICAgIGlmIChzICE9IG51bGwgJiYgcy5pc0dyb3VwICYmIHRoaXMuZGlzYWJsZWRCcmFuY2hOb2RlKSB7XG4gICAgICBjb25zdCBpID0gSWkoZSk7XG4gICAgICBpID09IG51bGwgfHwgaS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcIm1vdXNlZG93blwiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmlzU2luZ2xlU2VsZWN0KSB7XG4gICAgICBjb25zdCBbaV0gPSBuKHRoaXMsIFMpO1xuICAgICAgaWYgKHMuaWQgPT09IGkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIG0odGhpcywgUywgW3MuaWRdKSwgc3MoW3MuaWRdLCB0aGlzLmZsYXR0ZWRPcHRpb25zLCB0aGlzLmlzU2luZ2xlU2VsZWN0LCB0aGlzLmlzSW5kZXBlbmRlbnROb2Rlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMuY2hlY2tlZCA9IGUuY2hlY2tlZDtcbiAgICAgIGNvbnN0IGkgPSBJdChzLCB0aGlzLmZsYXR0ZWRPcHRpb25zLCB0aGlzLmlzSW5kZXBlbmRlbnROb2Rlcyk7XG4gICAgICBlLmNoZWNrZWQgPSBpO1xuICAgIH1cbiAgICBjZSh0aGlzLmZsYXR0ZWRPcHRpb25zLCB0aGlzLnNyY0VsZW1lbnQsIHRoaXMuaWNvbkVsZW1lbnRzLCBuKHRoaXMsIFMpLCB0aGlzLnJ0bCksIG8odGhpcywgSmUsIE5zKS5jYWxsKHRoaXMpO1xuICB9XG59LCBYZSA9IG5ldyBXZWFrU2V0KCksIFRzID0gZnVuY3Rpb24oZSkge1xuICB2YXIgYSwgaDtcbiAgY29uc3QgdCA9IChoID0gKGEgPSBlLnRhcmdldCkgPT0gbnVsbCA/IHZvaWQgMCA6IGEucGFyZW50Tm9kZSkgPT0gbnVsbCA/IHZvaWQgMCA6IGgucXVlcnlTZWxlY3RvcihcIltpbnB1dC1pZF1cIiksIHMgPSAodCA9PSBudWxsID8gdm9pZCAwIDogdC5nZXRBdHRyaWJ1dGUoXCJpbnB1dC1pZFwiKSkgPz8gbnVsbCwgaSA9IFZ0KHMsIHRoaXMuZmxhdHRlZE9wdGlvbnMpO1xuICBpICYmIChpLmlzQ2xvc2VkID0gIWkuaXNDbG9zZWQsIGJ0KHRoaXMuZmxhdHRlZE9wdGlvbnMsIGkpLCBjZSh0aGlzLmZsYXR0ZWRPcHRpb25zLCB0aGlzLnNyY0VsZW1lbnQsIHRoaXMuaWNvbkVsZW1lbnRzLCBuKHRoaXMsIFMpLCB0aGlzLnJ0bCksIHRoaXMuYXJyb3dDbGlja0NhbGxiYWNrKGkuaWQsIGkuaXNDbG9zZWQpKTtcbn0sIEogPSBuZXcgV2Vha1NldCgpLCB5dCA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgY29uc3QgcyA9IFwidHJlZXNlbGVjdC1saXN0X19pdGVtLS1mb2N1c2VkXCI7XG4gIGlmIChlKSB7XG4gICAgY29uc3QgaSA9IEFycmF5LmZyb20odGhpcy5zcmNFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC4ke3N9YCkpO1xuICAgIGkubGVuZ3RoICYmIGkuZm9yRWFjaCgoYSkgPT4gYS5jbGFzc0xpc3QucmVtb3ZlKHMpKSwgdC5jbGFzc0xpc3QuYWRkKHMpO1xuICB9IGVsc2VcbiAgICB0LmNsYXNzTGlzdC5yZW1vdmUocyk7XG59LCBaID0gbmV3IFdlYWtTZXQoKSwgeHQgPSBmdW5jdGlvbigpIHtcbiAgY29uc3QgeyB1bmdyb3VwZWROb2RlczogZSwgZ3JvdXBlZE5vZGVzOiB0LCBhbGxOb2RlczogcyB9ID0gQ2kodGhpcy5mbGF0dGVkT3B0aW9ucyk7XG4gIHRoaXMuc2VsZWN0ZWROb2RlcyA9IHsgbm9kZXM6IGUsIGdyb3VwZWROb2RlczogdCwgYWxsTm9kZXM6IHMgfTtcbn0sIEplID0gbmV3IFdlYWtTZXQoKSwgTnMgPSBmdW5jdGlvbigpIHtcbiAgbyh0aGlzLCBaLCB4dCkuY2FsbCh0aGlzKSwgdGhpcy5pbnB1dENhbGxiYWNrKHRoaXMuc2VsZWN0ZWROb2RlcyksIHRoaXMudmFsdWUgPSB0aGlzLnNlbGVjdGVkTm9kZXMubm9kZXMubWFwKChlKSA9PiBlLmlkKTtcbn07XG5jb25zdCBEdCA9ICh7XG4gIHBhcmVudEh0bWxDb250YWluZXI6IGwsXG4gIHN0YXRpY0xpc3Q6IGUsXG4gIGFwcGVuZFRvQm9keTogdCxcbiAgaXNTaW5nbGVTZWxlY3Q6IHMsXG4gIHZhbHVlOiBpLFxuICBkaXJlY3Rpb246IGFcbn0pID0+IHtcbiAgbCB8fCBjb25zb2xlLmVycm9yKFwiVmFsaWRhdGlvbjogcGFyZW50SHRtbENvbnRhaW5lciBwcm9wIGlzIHJlcXVpcmVkIVwiKSwgZSAmJiB0ICYmIGNvbnNvbGUuZXJyb3IoXCJWYWxpZGF0aW9uOiBZb3Ugc2hvdWxkIHNldCBzdGF0aWNMaXN0IHRvIGZhbHNlIGlmIHlvdSB1c2UgYXBwZW5kVG9Cb2R5IVwiKSwgcyAmJiBBcnJheS5pc0FycmF5KGkpICYmIGNvbnNvbGUuZXJyb3IoXCJWYWxpZGF0aW9uOiBpZiB5b3UgdXNlIGlzU2luZ2xlU2VsZWN0IHByb3AsIHlvdSBzaG91bGQgcGFzcyBhIHNpbmdsZSB2YWx1ZSFcIiksICFzICYmICFBcnJheS5pc0FycmF5KGkpICYmIGNvbnNvbGUuZXJyb3IoXCJWYWxpZGF0aW9uOiB5b3Ugc2hvdWxkIHBhc3MgYW4gYXJyYXkgYXMgYSB2YWx1ZSFcIiksIGEgJiYgYSAhPT0gXCJhdXRvXCIgJiYgYSAhPT0gXCJib3R0b21cIiAmJiBhICE9PSBcInRvcFwiICYmIGNvbnNvbGUuZXJyb3IoXCJWYWxpZGF0aW9uOiB5b3Ugc2hvdWxkIHBhc3MgKGF1dG8gfCB0b3AgfCBib3R0b20gfCB1bmRlZmluZWQpIGFzIGEgdmFsdWUgZm9yIHRoZSBkaXJlY3Rpb24gcHJvcCFcIik7XG59LCByZSA9IChsKSA9PiBsLm1hcCgoZSkgPT4gZS5pZCksIFZpID0gKGwpID0+IGwgPyBBcnJheS5pc0FycmF5KGwpID8gbCA6IFtsXSA6IFtdLCBEaSA9IChsLCBlKSA9PiB7XG4gIGlmIChlKSB7XG4gICAgY29uc3QgW3RdID0gbDtcbiAgICByZXR1cm4gdCA/PyBudWxsO1xuICB9XG4gIHJldHVybiBsO1xufTtcbnZhciB1LCBwLCBGLCBRLCBxLCBfLCBBLCBMLCBCLCBlZSwgU3QsIHRlLCBfdCwgWmUsIE9zLCBRZSwgSXMsIGV0LCBQcywgdHQsIEJzLCBzdCwgVnMsIGl0LCBEcywgc2UsIEF0LCBsdCwgSHMsIG50LCBHcywgYXQsIE1zLCBvdCwgRnMsIGllLCBUdCwgcnQsIHFzLCBqLCBoZSwgbGUsIE50LCBSLCBkZSwgY3QsIGpzLCBuZSwgT3QsIGh0LCBScywgZHQsICRzLCB1dCwgV3MsIHB0LCBVcywgbXQsIHpzO1xuY2xhc3MgR2kge1xuICBjb25zdHJ1Y3Rvcih7XG4gICAgcGFyZW50SHRtbENvbnRhaW5lcjogZSxcbiAgICB2YWx1ZTogdCxcbiAgICBvcHRpb25zOiBzLFxuICAgIG9wZW5MZXZlbDogaSxcbiAgICBhcHBlbmRUb0JvZHk6IGEsXG4gICAgYWx3YXlzT3BlbjogaCxcbiAgICBzaG93VGFnczogZCxcbiAgICB0YWdzQ291bnRUZXh0OiBDLFxuICAgIGNsZWFyYWJsZTogZixcbiAgICBzZWFyY2hhYmxlOiBiLFxuICAgIHBsYWNlaG9sZGVyOiBnLFxuICAgIGdyb3VwZWQ6IGssXG4gICAgaXNHcm91cGVkVmFsdWU6IHcsXG4gICAgbGlzdFNsb3RIdG1sQ29tcG9uZW50OiB5LFxuICAgIGRpc2FibGVkOiB4LFxuICAgIGVtcHR5VGV4dDogJCxcbiAgICBzdGF0aWNMaXN0OiBhZSxcbiAgICBpZDogQ3QsXG4gICAgYXJpYUxhYmVsOiBndCxcbiAgICBpc1NpbmdsZVNlbGVjdDogb2UsXG4gICAgc2hvd0NvdW50OiBZcyxcbiAgICBkaXNhYmxlZEJyYW5jaE5vZGU6IEtzLFxuICAgIGRpcmVjdGlvbjogWHMsXG4gICAgZXhwYW5kU2VsZWN0ZWQ6IEpzLFxuICAgIHNhdmVTY3JvbGxQb3NpdGlvbjogWnMsXG4gICAgaXNJbmRlcGVuZGVudE5vZGVzOiBRcyxcbiAgICBydGw6IGVpLFxuICAgIGljb25FbGVtZW50czogdGksXG4gICAgaW5wdXRDYWxsYmFjazogc2ksXG4gICAgb3BlbkNhbGxiYWNrOiBpaSxcbiAgICBjbG9zZUNhbGxiYWNrOiBsaSxcbiAgICBuYW1lQ2hhbmdlQ2FsbGJhY2s6IG5pLFxuICAgIHNlYXJjaENhbGxiYWNrOiBhaSxcbiAgICBvcGVuQ2xvc2VHcm91cENhbGxiYWNrOiBvaVxuICB9KSB7XG4gICAgcih0aGlzLCBlZSk7XG4gICAgcih0aGlzLCB0ZSk7XG4gICAgcih0aGlzLCBaZSk7XG4gICAgcih0aGlzLCBRZSk7XG4gICAgcih0aGlzLCBldCk7XG4gICAgcih0aGlzLCB0dCk7XG4gICAgcih0aGlzLCBzdCk7XG4gICAgcih0aGlzLCBpdCk7XG4gICAgcih0aGlzLCBzZSk7XG4gICAgcih0aGlzLCBsdCk7XG4gICAgcih0aGlzLCBudCk7XG4gICAgcih0aGlzLCBhdCk7XG4gICAgcih0aGlzLCBvdCk7XG4gICAgcih0aGlzLCBpZSk7XG4gICAgcih0aGlzLCBydCk7XG4gICAgcih0aGlzLCBqKTtcbiAgICByKHRoaXMsIGxlKTtcbiAgICByKHRoaXMsIFIpO1xuICAgIHIodGhpcywgY3QpO1xuICAgIC8vIEVtaXRzXG4gICAgcih0aGlzLCBuZSk7XG4gICAgcih0aGlzLCBodCk7XG4gICAgcih0aGlzLCBkdCk7XG4gICAgcih0aGlzLCB1dCk7XG4gICAgcih0aGlzLCBwdCk7XG4gICAgcih0aGlzLCBtdCk7XG4gICAgLy8gUHJvcHNcbiAgICBjKHRoaXMsIFwicGFyZW50SHRtbENvbnRhaW5lclwiKTtcbiAgICBjKHRoaXMsIFwidmFsdWVcIik7XG4gICAgYyh0aGlzLCBcIm9wdGlvbnNcIik7XG4gICAgYyh0aGlzLCBcIm9wZW5MZXZlbFwiKTtcbiAgICBjKHRoaXMsIFwiYXBwZW5kVG9Cb2R5XCIpO1xuICAgIGModGhpcywgXCJhbHdheXNPcGVuXCIpO1xuICAgIGModGhpcywgXCJzaG93VGFnc1wiKTtcbiAgICBjKHRoaXMsIFwidGFnc0NvdW50VGV4dFwiKTtcbiAgICBjKHRoaXMsIFwiY2xlYXJhYmxlXCIpO1xuICAgIGModGhpcywgXCJzZWFyY2hhYmxlXCIpO1xuICAgIGModGhpcywgXCJwbGFjZWhvbGRlclwiKTtcbiAgICBjKHRoaXMsIFwiZ3JvdXBlZFwiKTtcbiAgICBjKHRoaXMsIFwiaXNHcm91cGVkVmFsdWVcIik7XG4gICAgYyh0aGlzLCBcImxpc3RTbG90SHRtbENvbXBvbmVudFwiKTtcbiAgICBjKHRoaXMsIFwiZGlzYWJsZWRcIik7XG4gICAgYyh0aGlzLCBcImVtcHR5VGV4dFwiKTtcbiAgICBjKHRoaXMsIFwic3RhdGljTGlzdFwiKTtcbiAgICBjKHRoaXMsIFwiaWRcIik7XG4gICAgYyh0aGlzLCBcImFyaWFMYWJlbFwiKTtcbiAgICBjKHRoaXMsIFwiaXNTaW5nbGVTZWxlY3RcIik7XG4gICAgYyh0aGlzLCBcInNob3dDb3VudFwiKTtcbiAgICBjKHRoaXMsIFwiZGlzYWJsZWRCcmFuY2hOb2RlXCIpO1xuICAgIGModGhpcywgXCJkaXJlY3Rpb25cIik7XG4gICAgYyh0aGlzLCBcImV4cGFuZFNlbGVjdGVkXCIpO1xuICAgIGModGhpcywgXCJzYXZlU2Nyb2xsUG9zaXRpb25cIik7XG4gICAgYyh0aGlzLCBcImlzSW5kZXBlbmRlbnROb2Rlc1wiKTtcbiAgICBjKHRoaXMsIFwicnRsXCIpO1xuICAgIGModGhpcywgXCJpY29uRWxlbWVudHNcIik7XG4gICAgYyh0aGlzLCBcImlucHV0Q2FsbGJhY2tcIik7XG4gICAgYyh0aGlzLCBcIm9wZW5DYWxsYmFja1wiKTtcbiAgICBjKHRoaXMsIFwiY2xvc2VDYWxsYmFja1wiKTtcbiAgICBjKHRoaXMsIFwibmFtZUNoYW5nZUNhbGxiYWNrXCIpO1xuICAgIGModGhpcywgXCJzZWFyY2hDYWxsYmFja1wiKTtcbiAgICBjKHRoaXMsIFwib3BlbkNsb3NlR3JvdXBDYWxsYmFja1wiKTtcbiAgICAvLyBJbm5lclN0YXRlXG4gICAgYyh0aGlzLCBcInVuZ3JvdXBlZFZhbHVlXCIpO1xuICAgIGModGhpcywgXCJncm91cGVkVmFsdWVcIik7XG4gICAgYyh0aGlzLCBcImFsbFZhbHVlXCIpO1xuICAgIGModGhpcywgXCJpc0xpc3RPcGVuZWRcIik7XG4gICAgYyh0aGlzLCBcInNlbGVjdGVkTmFtZVwiKTtcbiAgICBjKHRoaXMsIFwic3JjRWxlbWVudFwiKTtcbiAgICAvLyBDb21wb25lbnRzXG4gICAgcih0aGlzLCB1LCBudWxsKTtcbiAgICByKHRoaXMsIHAsIG51bGwpO1xuICAgIC8vIFJlc2l6ZSBwcm9wc1xuICAgIHIodGhpcywgRiwgbnVsbCk7XG4gICAgLy8gTGlzdCBwb3NpdGlvbiBzY3JvbGxcbiAgICByKHRoaXMsIFEsIDApO1xuICAgIC8vIFRpbWVyIGZvciBzZWFyY2ggdGV4dFxuICAgIHIodGhpcywgcSwgMCk7XG4gICAgLy8gT3V0c2lkZSBsaXN0ZW5lcnNcbiAgICByKHRoaXMsIF8sIG51bGwpO1xuICAgIHIodGhpcywgQSwgbnVsbCk7XG4gICAgcih0aGlzLCBMLCBudWxsKTtcbiAgICByKHRoaXMsIEIsIG51bGwpO1xuICAgIER0KHtcbiAgICAgIHBhcmVudEh0bWxDb250YWluZXI6IGUsXG4gICAgICB2YWx1ZTogdCxcbiAgICAgIHN0YXRpY0xpc3Q6IGFlLFxuICAgICAgYXBwZW5kVG9Cb2R5OiBhLFxuICAgICAgaXNTaW5nbGVTZWxlY3Q6IG9lXG4gICAgfSksIHRoaXMucGFyZW50SHRtbENvbnRhaW5lciA9IGUsIHRoaXMudmFsdWUgPSBbXSwgdGhpcy5vcHRpb25zID0gcyA/PyBbXSwgdGhpcy5vcGVuTGV2ZWwgPSBpID8/IDAsIHRoaXMuYXBwZW5kVG9Cb2R5ID0gYSA/PyAhMSwgdGhpcy5hbHdheXNPcGVuID0gISEoaCAmJiAheCksIHRoaXMuc2hvd1RhZ3MgPSBkID8/ICEwLCB0aGlzLnRhZ3NDb3VudFRleHQgPSBDID8/IFwiZWxlbWVudHMgc2VsZWN0ZWRcIiwgdGhpcy5jbGVhcmFibGUgPSBmID8/ICEwLCB0aGlzLnNlYXJjaGFibGUgPSBiID8/ICEwLCB0aGlzLnBsYWNlaG9sZGVyID0gZyA/PyBcIlNlYXJjaC4uLlwiLCB0aGlzLmdyb3VwZWQgPSBrID8/ICEwLCB0aGlzLmlzR3JvdXBlZFZhbHVlID0gdyA/PyAhMSwgdGhpcy5saXN0U2xvdEh0bWxDb21wb25lbnQgPSB5ID8/IG51bGwsIHRoaXMuZGlzYWJsZWQgPSB4ID8/ICExLCB0aGlzLmVtcHR5VGV4dCA9ICQgPz8gXCJObyByZXN1bHRzIGZvdW5kLi4uXCIsIHRoaXMuc3RhdGljTGlzdCA9ICEhKGFlICYmICF0aGlzLmFwcGVuZFRvQm9keSksIHRoaXMuaWQgPSBDdCA/PyBcIlwiLCB0aGlzLmFyaWFMYWJlbCA9IGd0ID8/IFwiXCIsIHRoaXMuaXNTaW5nbGVTZWxlY3QgPSBvZSA/PyAhMSwgdGhpcy5zaG93Q291bnQgPSBZcyA/PyAhMSwgdGhpcy5kaXNhYmxlZEJyYW5jaE5vZGUgPSBLcyA/PyAhMSwgdGhpcy5kaXJlY3Rpb24gPSBYcyA/PyBcImF1dG9cIiwgdGhpcy5leHBhbmRTZWxlY3RlZCA9IEpzID8/ICExLCB0aGlzLnNhdmVTY3JvbGxQb3NpdGlvbiA9IFpzID8/ICEwLCB0aGlzLmlzSW5kZXBlbmRlbnROb2RlcyA9IFFzID8/ICExLCB0aGlzLnJ0bCA9IGVpID8/ICExLCB0aGlzLmljb25FbGVtZW50cyA9IEJ0KHRpKSwgdGhpcy5pbnB1dENhbGxiYWNrID0gc2ksIHRoaXMub3BlbkNhbGxiYWNrID0gaWksIHRoaXMuY2xvc2VDYWxsYmFjayA9IGxpLCB0aGlzLm5hbWVDaGFuZ2VDYWxsYmFjayA9IG5pLCB0aGlzLnNlYXJjaENhbGxiYWNrID0gYWksIHRoaXMub3BlbkNsb3NlR3JvdXBDYWxsYmFjayA9IG9pLCB0aGlzLnVuZ3JvdXBlZFZhbHVlID0gW10sIHRoaXMuZ3JvdXBlZFZhbHVlID0gW10sIHRoaXMuYWxsVmFsdWUgPSBbXSwgdGhpcy5pc0xpc3RPcGVuZWQgPSAhMSwgdGhpcy5zZWxlY3RlZE5hbWUgPSBcIlwiLCB0aGlzLnNyY0VsZW1lbnQgPSBudWxsLCBvKHRoaXMsIGVlLCBTdCkuY2FsbCh0aGlzLCB0KTtcbiAgfVxuICBtb3VudCgpIHtcbiAgICBEdCh7XG4gICAgICBwYXJlbnRIdG1sQ29udGFpbmVyOiB0aGlzLnBhcmVudEh0bWxDb250YWluZXIsXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcbiAgICAgIHN0YXRpY0xpc3Q6IHRoaXMuc3RhdGljTGlzdCxcbiAgICAgIGFwcGVuZFRvQm9keTogdGhpcy5hcHBlbmRUb0JvZHksXG4gICAgICBpc1NpbmdsZVNlbGVjdDogdGhpcy5pc1NpbmdsZVNlbGVjdFxuICAgIH0pLCB0aGlzLmljb25FbGVtZW50cyA9IEJ0KHRoaXMuaWNvbkVsZW1lbnRzKSwgbyh0aGlzLCBlZSwgU3QpLmNhbGwodGhpcywgdGhpcy52YWx1ZSk7XG4gIH1cbiAgdXBkYXRlVmFsdWUoZSkge1xuICAgIGNvbnN0IHQgPSBWaShlKSwgcyA9IG4odGhpcywgdSk7XG4gICAgcyAmJiAocy51cGRhdGVWYWx1ZSh0KSwgbyh0aGlzLCBzZSwgQXQpLmNhbGwodGhpcywgcyA9PSBudWxsID8gdm9pZCAwIDogcy5zZWxlY3RlZE5vZGVzKSk7XG4gIH1cbiAgZGVzdHJveSgpIHtcbiAgICB0aGlzLnNyY0VsZW1lbnQgJiYgKG8odGhpcywgaWUsIFR0KS5jYWxsKHRoaXMpLCB0aGlzLnNyY0VsZW1lbnQuaW5uZXJIVE1MID0gXCJcIiwgdGhpcy5zcmNFbGVtZW50ID0gbnVsbCwgbyh0aGlzLCBSLCBkZSkuY2FsbCh0aGlzLCAhMCkpO1xuICB9XG4gIGZvY3VzKCkge1xuICAgIG4odGhpcywgcCkgJiYgbih0aGlzLCBwKS5mb2N1cygpO1xuICB9XG4gIHRvZ2dsZU9wZW5DbG9zZSgpIHtcbiAgICBuKHRoaXMsIHApICYmIChuKHRoaXMsIHApLm9wZW5DbG9zZSgpLCBuKHRoaXMsIHApLmZvY3VzKCkpO1xuICB9XG4gIC8vIE91dHNpZGUgTGlzdGVuZXJzXG4gIHNjcm9sbFdpbmRvd0hhbmRsZXIoKSB7XG4gICAgdGhpcy51cGRhdGVMaXN0UG9zaXRpb24oKTtcbiAgfVxuICBmb2N1c1dpbmRvd0hhbmRsZXIoZSkge1xuICAgIHZhciBzLCBpLCBhO1xuICAgICgocyA9IHRoaXMuc3JjRWxlbWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IHMuY29udGFpbnMoZS50YXJnZXQpKSB8fCAoKGkgPSBuKHRoaXMsIHUpKSA9PSBudWxsID8gdm9pZCAwIDogaS5zcmNFbGVtZW50LmNvbnRhaW5zKGUudGFyZ2V0KSkgfHwgKChhID0gbih0aGlzLCBwKSkgPT0gbnVsbCB8fCBhLmJsdXIoKSwgbyh0aGlzLCBSLCBkZSkuY2FsbCh0aGlzLCAhMSksIG8odGhpcywgaiwgaGUpLmNhbGwodGhpcywgITEpKTtcbiAgfVxuICBibHVyV2luZG93SGFuZGxlcigpIHtcbiAgICB2YXIgZTtcbiAgICAoZSA9IG4odGhpcywgcCkpID09IG51bGwgfHwgZS5ibHVyKCksIG8odGhpcywgUiwgZGUpLmNhbGwodGhpcywgITEpLCBvKHRoaXMsIGosIGhlKS5jYWxsKHRoaXMsICExKTtcbiAgfVxuICAvLyBVcGRhdGUgZGlyZWN0aW9uIG9mIHRoZSBsaXN0LiBTdXBwb3J0IGFwcGVuZFRvQm9keSBhbmQgc3RhbmRhcmQgbW9kZSB3aXRoIGFic29sdXRlXG4gIHVwZGF0ZUxpc3RQb3NpdGlvbigpIHtcbiAgICB2YXIgeTtcbiAgICBjb25zdCBlID0gdGhpcy5zcmNFbGVtZW50LCB0ID0gKHkgPSBuKHRoaXMsIHUpKSA9PSBudWxsID8gdm9pZCAwIDogeS5zcmNFbGVtZW50O1xuICAgIGlmICghZSB8fCAhdClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB7IGhlaWdodDogcyB9ID0gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwge1xuICAgICAgeDogaSxcbiAgICAgIHk6IGEsXG4gICAgICBoZWlnaHQ6IGgsXG4gICAgICB3aWR0aDogZFxuICAgIH0gPSBlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBDID0gd2luZG93LmlubmVySGVpZ2h0LCBmID0gYSwgYiA9IEMgLSBhIC0gaDtcbiAgICBsZXQgZyA9IGYgPiBiICYmIGYgPj0gcyAmJiBiIDwgcztcbiAgICBpZiAodGhpcy5kaXJlY3Rpb24gIT09IFwiYXV0b1wiICYmIChnID0gdGhpcy5kaXJlY3Rpb24gPT09IFwidG9wXCIpLCB0aGlzLmFwcGVuZFRvQm9keSkge1xuICAgICAgKHQuc3R5bGUudG9wICE9PSBcIjBweFwiIHx8IHQuc3R5bGUubGVmdCAhPT0gXCIwcHhcIikgJiYgKHQuc3R5bGUudG9wID0gXCIwcHhcIiwgdC5zdHlsZS5sZWZ0ID0gXCIwcHhcIik7XG4gICAgICBjb25zdCB4ID0gaSArIHdpbmRvdy5zY3JvbGxYLCAkID0gZyA/IGEgKyB3aW5kb3cuc2Nyb2xsWSAtIHMgOiBhICsgd2luZG93LnNjcm9sbFkgKyBoO1xuICAgICAgdC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7eH1weCwkeyR9cHgpYCwgdC5zdHlsZS53aWR0aCA9IGAke2R9cHhgO1xuICAgIH1cbiAgICBjb25zdCBrID0gZyA/IFwidG9wXCIgOiBcImJvdHRvbVwiO1xuICAgIHQuZ2V0QXR0cmlidXRlKFwiZGlyZWN0aW9uXCIpICE9PSBrICYmICh0LnNldEF0dHJpYnV0ZShcImRpcmVjdGlvblwiLCBrKSwgbyh0aGlzLCBydCwgcXMpLmNhbGwodGhpcywgZywgdGhpcy5hcHBlbmRUb0JvZHkpKTtcbiAgfVxufVxudSA9IG5ldyBXZWFrTWFwKCksIHAgPSBuZXcgV2Vha01hcCgpLCBGID0gbmV3IFdlYWtNYXAoKSwgUSA9IG5ldyBXZWFrTWFwKCksIHEgPSBuZXcgV2Vha01hcCgpLCBfID0gbmV3IFdlYWtNYXAoKSwgQSA9IG5ldyBXZWFrTWFwKCksIEwgPSBuZXcgV2Vha01hcCgpLCBCID0gbmV3IFdlYWtNYXAoKSwgZWUgPSBuZXcgV2Vha1NldCgpLCBTdCA9IGZ1bmN0aW9uKGUpIHtcbiAgdmFyIGE7XG4gIHRoaXMuZGVzdHJveSgpO1xuICBjb25zdCB7IGNvbnRhaW5lcjogdCwgbGlzdDogcywgaW5wdXQ6IGkgfSA9IG8odGhpcywgWmUsIE9zKS5jYWxsKHRoaXMpO1xuICB0aGlzLnNyY0VsZW1lbnQgPSB0LCBtKHRoaXMsIHUsIHMpLCBtKHRoaXMsIHAsIGkpLCBtKHRoaXMsIF8sIHRoaXMuc2Nyb2xsV2luZG93SGFuZGxlci5iaW5kKHRoaXMpKSwgbSh0aGlzLCBBLCB0aGlzLnNjcm9sbFdpbmRvd0hhbmRsZXIuYmluZCh0aGlzKSksIG0odGhpcywgTCwgdGhpcy5mb2N1c1dpbmRvd0hhbmRsZXIuYmluZCh0aGlzKSksIG0odGhpcywgQiwgdGhpcy5ibHVyV2luZG93SGFuZGxlci5iaW5kKHRoaXMpKSwgdGhpcy5hbHdheXNPcGVuICYmICgoYSA9IG4odGhpcywgcCkpID09IG51bGwgfHwgYS5vcGVuQ2xvc2UoKSksIHRoaXMuZGlzYWJsZWQgPyB0aGlzLnNyY0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtLWRpc2FibGVkXCIpIDogdGhpcy5zcmNFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LS1kaXNhYmxlZFwiKSwgdGhpcy51cGRhdGVWYWx1ZShlID8/IHRoaXMudmFsdWUpO1xufSwgdGUgPSBuZXcgV2Vha1NldCgpLCBfdCA9IGZ1bmN0aW9uKHtcbiAgZ3JvdXBlZE5vZGVzOiBlLFxuICBub2RlczogdCxcbiAgYWxsTm9kZXM6IHNcbn0pIHtcbiAgdGhpcy51bmdyb3VwZWRWYWx1ZSA9IHQgPyByZSh0KSA6IFtdLCB0aGlzLmdyb3VwZWRWYWx1ZSA9IGUgPyByZShlKSA6IFtdLCB0aGlzLmFsbFZhbHVlID0gcyA/IHJlKHMpIDogW107XG4gIGxldCBpID0gW107XG4gIHRoaXMuaXNJbmRlcGVuZGVudE5vZGVzIHx8IHRoaXMuaXNTaW5nbGVTZWxlY3QgPyBpID0gdGhpcy5hbGxWYWx1ZSA6IHRoaXMuaXNHcm91cGVkVmFsdWUgPyBpID0gdGhpcy5ncm91cGVkVmFsdWUgOiBpID0gdGhpcy51bmdyb3VwZWRWYWx1ZSwgdGhpcy52YWx1ZSA9IERpKGksIHRoaXMuaXNTaW5nbGVTZWxlY3QpO1xufSwgWmUgPSBuZXcgV2Vha1NldCgpLCBPcyA9IGZ1bmN0aW9uKCkge1xuICBjb25zdCBlID0gdGhpcy5wYXJlbnRIdG1sQ29udGFpbmVyO1xuICBlLmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0XCIpLCB0aGlzLnJ0bCAmJiBlLnNldEF0dHJpYnV0ZShcImRpclwiLCBcInJ0bFwiKTtcbiAgY29uc3QgdCA9IG5ldyBCaSh7XG4gICAgdmFsdWU6IFtdLFxuICAgIC8vIHVwZGF0ZVZhbHVlIG1ldGhvZCBjYWxscyBpbiBpbml0TW91bnQgbWV0aG9kIHRvIHNldCBhY3R1YWwgdmFsdWVcbiAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnMsXG4gICAgb3BlbkxldmVsOiB0aGlzLm9wZW5MZXZlbCxcbiAgICBsaXN0U2xvdEh0bWxDb21wb25lbnQ6IHRoaXMubGlzdFNsb3RIdG1sQ29tcG9uZW50LFxuICAgIGVtcHR5VGV4dDogdGhpcy5lbXB0eVRleHQsXG4gICAgaXNTaW5nbGVTZWxlY3Q6IHRoaXMuaXNTaW5nbGVTZWxlY3QsXG4gICAgc2hvd0NvdW50OiB0aGlzLnNob3dDb3VudCxcbiAgICBkaXNhYmxlZEJyYW5jaE5vZGU6IHRoaXMuZGlzYWJsZWRCcmFuY2hOb2RlLFxuICAgIGV4cGFuZFNlbGVjdGVkOiB0aGlzLmV4cGFuZFNlbGVjdGVkLFxuICAgIGlzSW5kZXBlbmRlbnROb2RlczogdGhpcy5pc0luZGVwZW5kZW50Tm9kZXMsXG4gICAgcnRsOiB0aGlzLnJ0bCxcbiAgICBpY29uRWxlbWVudHM6IHRoaXMuaWNvbkVsZW1lbnRzLFxuICAgIGlucHV0Q2FsbGJhY2s6IChpKSA9PiBvKHRoaXMsIGx0LCBIcykuY2FsbCh0aGlzLCBpKSxcbiAgICBhcnJvd0NsaWNrQ2FsbGJhY2s6IChpLCBhKSA9PiBvKHRoaXMsIG50LCBHcykuY2FsbCh0aGlzLCBpLCBhKSxcbiAgICBtb3VzZXVwQ2FsbGJhY2s6ICgpID0+IHtcbiAgICAgIHZhciBpO1xuICAgICAgcmV0dXJuIChpID0gbih0aGlzLCBwKSkgPT0gbnVsbCA/IHZvaWQgMCA6IGkuZm9jdXMoKTtcbiAgICB9XG4gIH0pLCBzID0gbmV3IGRpKHtcbiAgICB2YWx1ZTogW10sXG4gICAgLy8gdXBkYXRlVmFsdWUgbWV0aG9kIGNhbGxzIGluIGluaXRNb3VudCBtZXRob2QgdG8gc2V0IGFjdHVhbCB2YWx1ZVxuICAgIHNob3dUYWdzOiB0aGlzLnNob3dUYWdzLFxuICAgIHRhZ3NDb3VudFRleHQ6IHRoaXMudGFnc0NvdW50VGV4dCxcbiAgICBjbGVhcmFibGU6IHRoaXMuY2xlYXJhYmxlLFxuICAgIGlzQWx3YXlzT3BlbmVkOiB0aGlzLmFsd2F5c09wZW4sXG4gICAgc2VhcmNoYWJsZTogdGhpcy5zZWFyY2hhYmxlLFxuICAgIHBsYWNlaG9sZGVyOiB0aGlzLnBsYWNlaG9sZGVyLFxuICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkLFxuICAgIGlzU2luZ2xlU2VsZWN0OiB0aGlzLmlzU2luZ2xlU2VsZWN0LFxuICAgIGlkOiB0aGlzLmlkLFxuICAgIGFyaWFMYWJlbDogdGhpcy5hcmlhTGFiZWwsXG4gICAgaWNvbkVsZW1lbnRzOiB0aGlzLmljb25FbGVtZW50cyxcbiAgICBpbnB1dENhbGxiYWNrOiAoaSkgPT4gbyh0aGlzLCBRZSwgSXMpLmNhbGwodGhpcywgaSksXG4gICAgc2VhcmNoQ2FsbGJhY2s6IChpKSA9PiBvKHRoaXMsIHR0LCBCcykuY2FsbCh0aGlzLCBpKSxcbiAgICBvcGVuQ2FsbGJhY2s6ICgpID0+IG8odGhpcywgb3QsIEZzKS5jYWxsKHRoaXMpLFxuICAgIGNsb3NlQ2FsbGJhY2s6ICgpID0+IG8odGhpcywgaWUsIFR0KS5jYWxsKHRoaXMpLFxuICAgIGtleWRvd25DYWxsYmFjazogKGkpID0+IG8odGhpcywgZXQsIFBzKS5jYWxsKHRoaXMsIGkpLFxuICAgIGZvY3VzQ2FsbGJhY2s6ICgpID0+IG8odGhpcywgc3QsIFZzKS5jYWxsKHRoaXMpLFxuICAgIGJsdXJDYWxsYmFjazogKCkgPT4gbyh0aGlzLCBpdCwgRHMpLmNhbGwodGhpcyksXG4gICAgbmFtZUNoYW5nZUNhbGxiYWNrOiAoaSkgPT4gbyh0aGlzLCBhdCwgTXMpLmNhbGwodGhpcywgaSlcbiAgfSk7XG4gIHJldHVybiB0aGlzLmFwcGVuZFRvQm9keSAmJiBtKHRoaXMsIEYsIG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLnVwZGF0ZUxpc3RQb3NpdGlvbigpKSksIGUuYXBwZW5kKHMuc3JjRWxlbWVudCksIHsgY29udGFpbmVyOiBlLCBsaXN0OiB0LCBpbnB1dDogcyB9O1xufSwgUWUgPSBuZXcgV2Vha1NldCgpLCBJcyA9IGZ1bmN0aW9uKGUpIHtcbiAgdmFyIGksIGE7XG4gIGNvbnN0IHQgPSByZShlKTtcbiAgKGkgPSBuKHRoaXMsIHUpKSA9PSBudWxsIHx8IGkudXBkYXRlVmFsdWUodCk7XG4gIGNvbnN0IHMgPSAoKGEgPSBuKHRoaXMsIHUpKSA9PSBudWxsID8gdm9pZCAwIDogYS5zZWxlY3RlZE5vZGVzKSA/PyB7fTtcbiAgbyh0aGlzLCB0ZSwgX3QpLmNhbGwodGhpcywgcyksIG8odGhpcywgbmUsIE90KS5jYWxsKHRoaXMpO1xufSwgZXQgPSBuZXcgV2Vha1NldCgpLCBQcyA9IGZ1bmN0aW9uKGUpIHtcbiAgdmFyIHQ7XG4gIHRoaXMuaXNMaXN0T3BlbmVkICYmICgodCA9IG4odGhpcywgdSkpID09IG51bGwgfHwgdC5jYWxsS2V5QWN0aW9uKGUpKTtcbn0sIHR0ID0gbmV3IFdlYWtTZXQoKSwgQnMgPSBmdW5jdGlvbihlKSB7XG4gIG4odGhpcywgcSkgJiYgY2xlYXJUaW1lb3V0KG4odGhpcywgcSkpLCBtKHRoaXMsIHEsIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICB2YXIgdDtcbiAgICAodCA9IG4odGhpcywgdSkpID09IG51bGwgfHwgdC51cGRhdGVTZWFyY2hWYWx1ZShlKSwgdGhpcy51cGRhdGVMaXN0UG9zaXRpb24oKTtcbiAgfSwgMzUwKSksIG8odGhpcywgcHQsIFVzKS5jYWxsKHRoaXMsIGUpO1xufSwgc3QgPSBuZXcgV2Vha1NldCgpLCBWcyA9IGZ1bmN0aW9uKCkge1xuICBvKHRoaXMsIGosIGhlKS5jYWxsKHRoaXMsICEwKSwgbih0aGlzLCBMKSAmJiBuKHRoaXMsIEwpICYmIG4odGhpcywgQikgJiYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgbih0aGlzLCBMKSwgITApLCBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgbih0aGlzLCBMKSwgITApLCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgbih0aGlzLCBCKSkpO1xufSwgaXQgPSBuZXcgV2Vha1NldCgpLCBEcyA9IGZ1bmN0aW9uKCkge1xuICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICB2YXIgcywgaTtcbiAgICBjb25zdCBlID0gKHMgPSBuKHRoaXMsIHApKSA9PSBudWxsID8gdm9pZCAwIDogcy5zcmNFbGVtZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLCB0ID0gKGkgPSBuKHRoaXMsIHUpKSA9PSBudWxsID8gdm9pZCAwIDogaS5zcmNFbGVtZW50LmNvbnRhaW5zKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICAgICFlICYmICF0ICYmIHRoaXMuYmx1cldpbmRvd0hhbmRsZXIoKTtcbiAgfSwgMSk7XG59LCBzZSA9IG5ldyBXZWFrU2V0KCksIEF0ID0gZnVuY3Rpb24oZSkge1xuICB2YXIgcztcbiAgaWYgKCFlKVxuICAgIHJldHVybjtcbiAgbGV0IHQgPSBbXTtcbiAgdGhpcy5pc0luZGVwZW5kZW50Tm9kZXMgfHwgdGhpcy5pc1NpbmdsZVNlbGVjdCA/IHQgPSBlLmFsbE5vZGVzIDogdGhpcy5ncm91cGVkID8gdCA9IGUuZ3JvdXBlZE5vZGVzIDogdCA9IGUubm9kZXMsIChzID0gbih0aGlzLCBwKSkgPT0gbnVsbCB8fCBzLnVwZGF0ZVZhbHVlKHQpLCBvKHRoaXMsIHRlLCBfdCkuY2FsbCh0aGlzLCBlKTtcbn0sIGx0ID0gbmV3IFdlYWtTZXQoKSwgSHMgPSBmdW5jdGlvbihlKSB7XG4gIHZhciB0LCBzLCBpO1xuICBvKHRoaXMsIHNlLCBBdCkuY2FsbCh0aGlzLCBlKSwgdGhpcy5pc1NpbmdsZVNlbGVjdCAmJiAhdGhpcy5hbHdheXNPcGVuICYmICgodCA9IG4odGhpcywgcCkpID09IG51bGwgfHwgdC5vcGVuQ2xvc2UoKSwgKHMgPSBuKHRoaXMsIHApKSA9PSBudWxsIHx8IHMuY2xlYXJTZWFyY2goKSksIChpID0gbih0aGlzLCBwKSkgPT0gbnVsbCB8fCBpLmZvY3VzKCksIG8odGhpcywgbmUsIE90KS5jYWxsKHRoaXMpO1xufSwgbnQgPSBuZXcgV2Vha1NldCgpLCBHcyA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgdmFyIHM7XG4gIChzID0gbih0aGlzLCBwKSkgPT0gbnVsbCB8fCBzLmZvY3VzKCksIHRoaXMudXBkYXRlTGlzdFBvc2l0aW9uKCksIG8odGhpcywgbXQsIHpzKS5jYWxsKHRoaXMsIGUsIHQpO1xufSwgYXQgPSBuZXcgV2Vha1NldCgpLCBNcyA9IGZ1bmN0aW9uKGUpIHtcbiAgdGhpcy5zZWxlY3RlZE5hbWUgIT09IGUgJiYgKHRoaXMuc2VsZWN0ZWROYW1lID0gZSwgbyh0aGlzLCBodCwgUnMpLmNhbGwodGhpcykpO1xufSwgb3QgPSBuZXcgV2Vha1NldCgpLCBGcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZTtcbiAgdGhpcy5pc0xpc3RPcGVuZWQgPSAhMCwgbih0aGlzLCBfKSAmJiBuKHRoaXMsIEEpICYmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBuKHRoaXMsIF8pLCAhMCksIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIG4odGhpcywgQSkpKSwgISghbih0aGlzLCB1KSB8fCAhdGhpcy5zcmNFbGVtZW50KSAmJiAodGhpcy5hcHBlbmRUb0JvZHkgPyAoZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChuKHRoaXMsIHUpLnNyY0VsZW1lbnQpLCAoZSA9IG4odGhpcywgRikpID09IG51bGwgfHwgZS5vYnNlcnZlKHRoaXMuc3JjRWxlbWVudCkpIDogdGhpcy5zcmNFbGVtZW50LmFwcGVuZENoaWxkKG4odGhpcywgdSkuc3JjRWxlbWVudCksIHRoaXMudXBkYXRlTGlzdFBvc2l0aW9uKCksIG8odGhpcywgbGUsIE50KS5jYWxsKHRoaXMsICEwKSwgbyh0aGlzLCBjdCwganMpLmNhbGwodGhpcyksIG8odGhpcywgZHQsICRzKS5jYWxsKHRoaXMpKTtcbn0sIGllID0gbmV3IFdlYWtTZXQoKSwgVHQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHQ7XG4gIHRoaXMuYWx3YXlzT3BlbiB8fCAodGhpcy5pc0xpc3RPcGVuZWQgPSAhMSwgbih0aGlzLCBfKSAmJiBuKHRoaXMsIEEpICYmICh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBuKHRoaXMsIF8pLCAhMCksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIG4odGhpcywgQSkpKSwgIW4odGhpcywgdSkgfHwgIXRoaXMuc3JjRWxlbWVudCkgfHwgISh0aGlzLmFwcGVuZFRvQm9keSA/IGRvY3VtZW50LmJvZHkuY29udGFpbnMobih0aGlzLCB1KS5zcmNFbGVtZW50KSA6IHRoaXMuc3JjRWxlbWVudC5jb250YWlucyhuKHRoaXMsIHUpLnNyY0VsZW1lbnQpKSB8fCAobSh0aGlzLCBRLCBuKHRoaXMsIHUpLnNyY0VsZW1lbnQuc2Nyb2xsVG9wKSwgdGhpcy5hcHBlbmRUb0JvZHkgPyAoZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChuKHRoaXMsIHUpLnNyY0VsZW1lbnQpLCAodCA9IG4odGhpcywgRikpID09IG51bGwgfHwgdC5kaXNjb25uZWN0KCkpIDogdGhpcy5zcmNFbGVtZW50LnJlbW92ZUNoaWxkKG4odGhpcywgdSkuc3JjRWxlbWVudCksIG8odGhpcywgbGUsIE50KS5jYWxsKHRoaXMsICExKSwgbyh0aGlzLCB1dCwgV3MpLmNhbGwodGhpcykpO1xufSwgcnQgPSBuZXcgV2Vha1NldCgpLCBxcyA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgaWYgKCFuKHRoaXMsIHUpIHx8ICFuKHRoaXMsIHApKVxuICAgIHJldHVybjtcbiAgY29uc3QgcyA9IHQgPyBcInRyZWVzZWxlY3QtbGlzdC0tdG9wLXRvLWJvZHlcIiA6IFwidHJlZXNlbGVjdC1saXN0LS10b3BcIiwgaSA9IHQgPyBcInRyZWVzZWxlY3QtbGlzdC0tYm90dG9tLXRvLWJvZHlcIiA6IFwidHJlZXNlbGVjdC1saXN0LS1ib3R0b21cIjtcbiAgZSA/IChuKHRoaXMsIHUpLnNyY0VsZW1lbnQuY2xhc3NMaXN0LmFkZChzKSwgbih0aGlzLCB1KS5zcmNFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoaSksIG4odGhpcywgcCkuc3JjRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1pbnB1dC0tdG9wXCIpLCBuKHRoaXMsIHApLnNyY0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtaW5wdXQtLWJvdHRvbVwiKSkgOiAobih0aGlzLCB1KS5zcmNFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUocyksIG4odGhpcywgdSkuc3JjRWxlbWVudC5jbGFzc0xpc3QuYWRkKGkpLCBuKHRoaXMsIHApLnNyY0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtaW5wdXQtLXRvcFwiKSwgbih0aGlzLCBwKS5zcmNFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJ0cmVlc2VsZWN0LWlucHV0LS1ib3R0b21cIikpO1xufSwgaiA9IG5ldyBXZWFrU2V0KCksIGhlID0gZnVuY3Rpb24oZSkge1xuICAhbih0aGlzLCBwKSB8fCAhbih0aGlzLCB1KSB8fCAoZSA/IChuKHRoaXMsIHApLnNyY0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtaW5wdXQtLWZvY3VzZWRcIiksIG4odGhpcywgdSkuc3JjRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0LS1mb2N1c2VkXCIpKSA6IChuKHRoaXMsIHApLnNyY0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtaW5wdXQtLWZvY3VzZWRcIiksIG4odGhpcywgdSkuc3JjRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwidHJlZXNlbGVjdC1saXN0LS1mb2N1c2VkXCIpKSk7XG59LCBsZSA9IG5ldyBXZWFrU2V0KCksIE50ID0gZnVuY3Rpb24oZSkge1xuICB2YXIgdCwgcywgaSwgYTtcbiAgZSA/ICh0ID0gbih0aGlzLCBwKSkgPT0gbnVsbCB8fCB0LnNyY0VsZW1lbnQuY2xhc3NMaXN0LmFkZChcInRyZWVzZWxlY3QtaW5wdXQtLW9wZW5lZFwiKSA6IChzID0gbih0aGlzLCBwKSkgPT0gbnVsbCB8fCBzLnNyY0VsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcInRyZWVzZWxlY3QtaW5wdXQtLW9wZW5lZFwiKSwgdGhpcy5zdGF0aWNMaXN0ID8gKGkgPSBuKHRoaXMsIHUpKSA9PSBudWxsIHx8IGkuc3JjRWxlbWVudC5jbGFzc0xpc3QuYWRkKFwidHJlZXNlbGVjdC1saXN0LS1zdGF0aWNcIikgOiAoYSA9IG4odGhpcywgdSkpID09IG51bGwgfHwgYS5zcmNFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXCJ0cmVlc2VsZWN0LWxpc3QtLXN0YXRpY1wiKTtcbn0sIFIgPSBuZXcgV2Vha1NldCgpLCBkZSA9IGZ1bmN0aW9uKGUpIHtcbiAgIW4odGhpcywgXykgfHwgIW4odGhpcywgQSkgfHwgIW4odGhpcywgTCkgfHwgIW4odGhpcywgQikgfHwgKCghdGhpcy5hbHdheXNPcGVuIHx8IGUpICYmICh3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBuKHRoaXMsIF8pLCAhMCksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIG4odGhpcywgQSkpKSwgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBuKHRoaXMsIEwpLCAhMCksIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBuKHRoaXMsIEwpLCAhMCksIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBuKHRoaXMsIEIpKSk7XG59LCBjdCA9IG5ldyBXZWFrU2V0KCksIGpzID0gZnVuY3Rpb24oKSB7XG4gIHZhciB0LCBzLCBpO1xuICBjb25zdCBlID0gKHQgPSBuKHRoaXMsIHUpKSA9PSBudWxsID8gdm9pZCAwIDogdC5pc0xhc3RGb2N1c2VkRWxlbWVudEV4aXN0KCk7XG4gIHRoaXMuc2F2ZVNjcm9sbFBvc2l0aW9uICYmIGUgPyAocyA9IG4odGhpcywgdSkpID09IG51bGwgfHwgcy5zcmNFbGVtZW50LnNjcm9sbCgwLCBuKHRoaXMsIFEpKSA6IChpID0gbih0aGlzLCB1KSkgPT0gbnVsbCB8fCBpLmZvY3VzRmlyc3RMaXN0RWxlbWVudCgpO1xufSwgbmUgPSBuZXcgV2Vha1NldCgpLCBPdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZTtcbiAgKGUgPSB0aGlzLnNyY0VsZW1lbnQpID09IG51bGwgfHwgZS5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudChcImlucHV0XCIsIHsgZGV0YWlsOiB0aGlzLnZhbHVlIH0pKSwgdGhpcy5pbnB1dENhbGxiYWNrICYmIHRoaXMuaW5wdXRDYWxsYmFjayh0aGlzLnZhbHVlKTtcbn0sIGh0ID0gbmV3IFdlYWtTZXQoKSwgUnMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGU7XG4gIChlID0gdGhpcy5zcmNFbGVtZW50KSA9PSBudWxsIHx8IGUuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJuYW1lLWNoYW5nZVwiLCB7IGRldGFpbDogdGhpcy5zZWxlY3RlZE5hbWUgfSkpLCB0aGlzLm5hbWVDaGFuZ2VDYWxsYmFjayAmJiB0aGlzLm5hbWVDaGFuZ2VDYWxsYmFjayh0aGlzLnNlbGVjdGVkTmFtZSk7XG59LCBkdCA9IG5ldyBXZWFrU2V0KCksICRzID0gZnVuY3Rpb24oKSB7XG4gIHZhciBlO1xuICB0aGlzLmFsd2F5c09wZW4gfHwgKChlID0gdGhpcy5zcmNFbGVtZW50KSA9PSBudWxsIHx8IGUuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJvcGVuXCIsIHsgZGV0YWlsOiB0aGlzLnZhbHVlIH0pKSwgdGhpcy5vcGVuQ2FsbGJhY2sgJiYgdGhpcy5vcGVuQ2FsbGJhY2sodGhpcy52YWx1ZSkpO1xufSwgdXQgPSBuZXcgV2Vha1NldCgpLCBXcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgZTtcbiAgdGhpcy5hbHdheXNPcGVuIHx8ICgoZSA9IHRoaXMuc3JjRWxlbWVudCkgPT0gbnVsbCB8fCBlLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwiY2xvc2VcIiwgeyBkZXRhaWw6IHRoaXMudmFsdWUgfSkpLCB0aGlzLmNsb3NlQ2FsbGJhY2sgJiYgdGhpcy5jbG9zZUNhbGxiYWNrKHRoaXMudmFsdWUpKTtcbn0sIHB0ID0gbmV3IFdlYWtTZXQoKSwgVXMgPSBmdW5jdGlvbihlKSB7XG4gIHZhciBzO1xuICBjb25zdCB0ID0gKGUgPT0gbnVsbCA/IHZvaWQgMCA6IGUudHJpbSgpKSA/PyBcIlwiO1xuICAocyA9IHRoaXMuc3JjRWxlbWVudCkgPT0gbnVsbCB8fCBzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KFwic2VhcmNoXCIsIHsgZGV0YWlsOiB0IH0pKSwgdGhpcy5zZWFyY2hDYWxsYmFjayAmJiB0aGlzLnNlYXJjaENhbGxiYWNrKHQpO1xufSwgbXQgPSBuZXcgV2Vha1NldCgpLCB6cyA9IGZ1bmN0aW9uKGUsIHQpIHtcbiAgdmFyIHM7XG4gIChzID0gdGhpcy5zcmNFbGVtZW50KSA9PSBudWxsIHx8IHMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoXCJvcGVuLWNsb3NlLWdyb3VwXCIsIHsgZGV0YWlsOiB7IGdyb3VwSWQ6IGUsIGlzQ2xvc2VkOiB0IH0gfSkpLCB0aGlzLm9wZW5DbG9zZUdyb3VwQ2FsbGJhY2sgJiYgdGhpcy5vcGVuQ2xvc2VHcm91cENhbGxiYWNrKGUsIHQpO1xufTtcbmV4cG9ydCB7XG4gIEdpIGFzIGRlZmF1bHRcbn07XG4iLCAiaW1wb3J0IFRyZWVzZWxlY3QgZnJvbSAndHJlZXNlbGVjdGpzJ1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBzZWxlY3RUcmVlKHtcbiAgICBzdGF0ZSxcbiAgICBuYW1lLFxuICAgIG9wdGlvbnMsXG4gICAgc2VhcmNoYWJsZSxcbiAgICBzaG93Q291bnQsXG4gICAgcGxhY2Vob2xkZXIsXG4gICAgcnRsLFxuICAgIGRpc2FibGVkQnJhbmNoTm9kZSA9IHRydWUsXG4gICAgZGlzYWJsZWQgPSBmYWxzZSxcbiAgICBpc1NpbmdsZVNlbGVjdCA9IHRydWUsXG4gICAgc2hvd1RhZ3MgPSB0cnVlLFxuICAgIGNsZWFyYWJsZSA9IHRydWUsXG4gICAgaXNJbmRlcGVuZGVudE5vZGVzID0gdHJ1ZSxcbiAgICBhbHdheXNPcGVuID0gZmFsc2UsXG4gICAgZW1wdHlUZXh0LFxuICAgIGV4cGFuZFNlbGVjdGVkID0gdHJ1ZSxcbiAgICBncm91cGVkID0gdHJ1ZSxcbiAgICBvcGVuTGV2ZWwgPSAwLFxuICAgIGRpcmVjdGlvbiA9ICdhdXRvJyxcbn0pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGF0ZSxcblxuICAgICAgICAvKiogQHR5cGUgVHJlZXNlbGVjdCAqL1xuICAgICAgICB0cmVlOiBudWxsLFxuXG4gICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICB0aGlzLnRyZWUgPSBuZXcgVHJlZXNlbGVjdCh7XG4gICAgICAgICAgICAgICAgaWQ6IGB0cmVlLSR7bmFtZX0taWRgLFxuICAgICAgICAgICAgICAgIGFyaWFMYWJlbDogYHRyZWUtJHtuYW1lfS1sYWJlbGAsXG4gICAgICAgICAgICAgICAgcGFyZW50SHRtbENvbnRhaW5lcjogdGhpcy4kcmVmcy50cmVlLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnN0YXRlID8/IFtdLFxuICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgc2VhcmNoYWJsZSxcbiAgICAgICAgICAgICAgICBzaG93Q291bnQsXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgICAgZGlzYWJsZWRCcmFuY2hOb2RlLFxuICAgICAgICAgICAgICAgIGRpc2FibGVkLFxuICAgICAgICAgICAgICAgIGlzU2luZ2xlU2VsZWN0LFxuICAgICAgICAgICAgICAgIHNob3dUYWdzLFxuICAgICAgICAgICAgICAgIGNsZWFyYWJsZSxcbiAgICAgICAgICAgICAgICBpc0luZGVwZW5kZW50Tm9kZXMsXG4gICAgICAgICAgICAgICAgYWx3YXlzT3BlbixcbiAgICAgICAgICAgICAgICBlbXB0eVRleHQsXG4gICAgICAgICAgICAgICAgZXhwYW5kU2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgZ3JvdXBlZCxcbiAgICAgICAgICAgICAgICBvcGVuTGV2ZWwsXG4gICAgICAgICAgICAgICAgZGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgIHJ0bCxcbiAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgIHRoaXMudHJlZS5zcmNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gZS5kZXRhaWxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgfVxufVxuIiwgIi8qKiFcbiAqIFNvcnRhYmxlIDEuMTUuMlxuICogQGF1dGhvclx0UnViYVhhICAgPHRyYXNoQHJ1YmF4YS5vcmc+XG4gKiBAYXV0aG9yXHRvd2VubSAgICA8b3dlbjIzMzU1QGdtYWlsLmNvbT5cbiAqIEBsaWNlbnNlIE1JVFxuICovXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHtcbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpO1xuICAgIGlmIChlbnVtZXJhYmxlT25seSkge1xuICAgICAgc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7XG4gICAgICB9KTtcbiAgICB9XG4gICAga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufVxuZnVuY3Rpb24gX29iamVjdFNwcmVhZDIodGFyZ2V0KSB7XG4gIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXSAhPSBudWxsID8gYXJndW1lbnRzW2ldIDoge307XG4gICAgaWYgKGkgJSAyKSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpLCB0cnVlKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cbmZ1bmN0aW9uIF90eXBlb2Yob2JqKSB7XG4gIFwiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2ZcIjtcblxuICBpZiAodHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgPT09IFwic3ltYm9sXCIpIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBfdHlwZW9mID0gZnVuY3Rpb24gKG9iaikge1xuICAgICAgcmV0dXJuIG9iaiAmJiB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gXCJzeW1ib2xcIiA6IHR5cGVvZiBvYmo7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gX3R5cGVvZihvYmopO1xufVxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnR5KG9iaiwga2V5LCB2YWx1ZSkge1xuICBpZiAoa2V5IGluIG9iaikge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvYmosIGtleSwge1xuICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgfVxuICByZXR1cm4gb2JqO1xufVxuZnVuY3Rpb24gX2V4dGVuZHMoKSB7XG4gIF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cbmZ1bmN0aW9uIF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpIHtcbiAgaWYgKHNvdXJjZSA9PSBudWxsKSByZXR1cm4ge307XG4gIHZhciB0YXJnZXQgPSB7fTtcbiAgdmFyIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuICB2YXIga2V5LCBpO1xuICBmb3IgKGkgPSAwOyBpIDwgc291cmNlS2V5cy5sZW5ndGg7IGkrKykge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaV07XG4gICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICB9XG4gIHJldHVybiB0YXJnZXQ7XG59XG5mdW5jdGlvbiBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoc291cmNlLCBleGNsdWRlZCkge1xuICBpZiAoc291cmNlID09IG51bGwpIHJldHVybiB7fTtcbiAgdmFyIHRhcmdldCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllc0xvb3NlKHNvdXJjZSwgZXhjbHVkZWQpO1xuICB2YXIga2V5LCBpO1xuICBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykge1xuICAgIHZhciBzb3VyY2VTeW1ib2xLZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhzb3VyY2UpO1xuICAgIGZvciAoaSA9IDA7IGkgPCBzb3VyY2VTeW1ib2xLZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBzb3VyY2VTeW1ib2xLZXlzW2ldO1xuICAgICAgaWYgKGV4Y2x1ZGVkLmluZGV4T2Yoa2V5KSA+PSAwKSBjb250aW51ZTtcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHNvdXJjZSwga2V5KSkgY29udGludWU7XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFyZ2V0O1xufVxuZnVuY3Rpb24gX3RvQ29uc3VtYWJsZUFycmF5KGFycikge1xuICByZXR1cm4gX2FycmF5V2l0aG91dEhvbGVzKGFycikgfHwgX2l0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShhcnIpIHx8IF9ub25JdGVyYWJsZVNwcmVhZCgpO1xufVxuZnVuY3Rpb24gX2FycmF5V2l0aG91dEhvbGVzKGFycikge1xuICBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkoYXJyKTtcbn1cbmZ1bmN0aW9uIF9pdGVyYWJsZVRvQXJyYXkoaXRlcikge1xuICBpZiAodHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBpdGVyW1N5bWJvbC5pdGVyYXRvcl0gIT0gbnVsbCB8fCBpdGVyW1wiQEBpdGVyYXRvclwiXSAhPSBudWxsKSByZXR1cm4gQXJyYXkuZnJvbShpdGVyKTtcbn1cbmZ1bmN0aW9uIF91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheShvLCBtaW5MZW4pIHtcbiAgaWYgKCFvKSByZXR1cm47XG4gIGlmICh0eXBlb2YgbyA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIF9hcnJheUxpa2VUb0FycmF5KG8sIG1pbkxlbik7XG4gIHZhciBuID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pLnNsaWNlKDgsIC0xKTtcbiAgaWYgKG4gPT09IFwiT2JqZWN0XCIgJiYgby5jb25zdHJ1Y3RvcikgbiA9IG8uY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKG4gPT09IFwiTWFwXCIgfHwgbiA9PT0gXCJTZXRcIikgcmV0dXJuIEFycmF5LmZyb20obyk7XG4gIGlmIChuID09PSBcIkFyZ3VtZW50c1wiIHx8IC9eKD86VWl8SSludCg/Ojh8MTZ8MzIpKD86Q2xhbXBlZCk/QXJyYXkkLy50ZXN0KG4pKSByZXR1cm4gX2FycmF5TGlrZVRvQXJyYXkobywgbWluTGVuKTtcbn1cbmZ1bmN0aW9uIF9hcnJheUxpa2VUb0FycmF5KGFyciwgbGVuKSB7XG4gIGlmIChsZW4gPT0gbnVsbCB8fCBsZW4gPiBhcnIubGVuZ3RoKSBsZW4gPSBhcnIubGVuZ3RoO1xuICBmb3IgKHZhciBpID0gMCwgYXJyMiA9IG5ldyBBcnJheShsZW4pOyBpIDwgbGVuOyBpKyspIGFycjJbaV0gPSBhcnJbaV07XG4gIHJldHVybiBhcnIyO1xufVxuZnVuY3Rpb24gX25vbkl0ZXJhYmxlU3ByZWFkKCkge1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuXFxuSW4gb3JkZXIgdG8gYmUgaXRlcmFibGUsIG5vbi1hcnJheSBvYmplY3RzIG11c3QgaGF2ZSBhIFtTeW1ib2wuaXRlcmF0b3JdKCkgbWV0aG9kLlwiKTtcbn1cblxudmFyIHZlcnNpb24gPSBcIjEuMTUuMlwiO1xuXG5mdW5jdGlvbiB1c2VyQWdlbnQocGF0dGVybikge1xuICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93Lm5hdmlnYXRvcikge1xuICAgIHJldHVybiAhISAvKkBfX1BVUkVfXyovbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaChwYXR0ZXJuKTtcbiAgfVxufVxudmFyIElFMTFPckxlc3MgPSB1c2VyQWdlbnQoLyg/OlRyaWRlbnQuKnJ2WyA6XT8xMVxcLnxtc2llfGllbW9iaWxlfFdpbmRvd3MgUGhvbmUpL2kpO1xudmFyIEVkZ2UgPSB1c2VyQWdlbnQoL0VkZ2UvaSk7XG52YXIgRmlyZUZveCA9IHVzZXJBZ2VudCgvZmlyZWZveC9pKTtcbnZhciBTYWZhcmkgPSB1c2VyQWdlbnQoL3NhZmFyaS9pKSAmJiAhdXNlckFnZW50KC9jaHJvbWUvaSkgJiYgIXVzZXJBZ2VudCgvYW5kcm9pZC9pKTtcbnZhciBJT1MgPSB1c2VyQWdlbnQoL2lQKGFkfG9kfGhvbmUpL2kpO1xudmFyIENocm9tZUZvckFuZHJvaWQgPSB1c2VyQWdlbnQoL2Nocm9tZS9pKSAmJiB1c2VyQWdlbnQoL2FuZHJvaWQvaSk7XG5cbnZhciBjYXB0dXJlTW9kZSA9IHtcbiAgY2FwdHVyZTogZmFsc2UsXG4gIHBhc3NpdmU6IGZhbHNlXG59O1xuZnVuY3Rpb24gb24oZWwsIGV2ZW50LCBmbikge1xuICBlbC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgIUlFMTFPckxlc3MgJiYgY2FwdHVyZU1vZGUpO1xufVxuZnVuY3Rpb24gb2ZmKGVsLCBldmVudCwgZm4pIHtcbiAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgZm4sICFJRTExT3JMZXNzICYmIGNhcHR1cmVNb2RlKTtcbn1cbmZ1bmN0aW9uIG1hdGNoZXMoIC8qKkhUTUxFbGVtZW50Ki9lbCwgLyoqU3RyaW5nKi9zZWxlY3Rvcikge1xuICBpZiAoIXNlbGVjdG9yKSByZXR1cm47XG4gIHNlbGVjdG9yWzBdID09PSAnPicgJiYgKHNlbGVjdG9yID0gc2VsZWN0b3Iuc3Vic3RyaW5nKDEpKTtcbiAgaWYgKGVsKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChlbC5tYXRjaGVzKSB7XG4gICAgICAgIHJldHVybiBlbC5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgICAgIH0gZWxzZSBpZiAoZWwubXNNYXRjaGVzU2VsZWN0b3IpIHtcbiAgICAgICAgcmV0dXJuIGVsLm1zTWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIH0gZWxzZSBpZiAoZWwud2Via2l0TWF0Y2hlc1NlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBlbC53ZWJraXRNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuZnVuY3Rpb24gZ2V0UGFyZW50T3JIb3N0KGVsKSB7XG4gIHJldHVybiBlbC5ob3N0ICYmIGVsICE9PSBkb2N1bWVudCAmJiBlbC5ob3N0Lm5vZGVUeXBlID8gZWwuaG9zdCA6IGVsLnBhcmVudE5vZGU7XG59XG5mdW5jdGlvbiBjbG9zZXN0KCAvKipIVE1MRWxlbWVudCovZWwsIC8qKlN0cmluZyovc2VsZWN0b3IsIC8qKkhUTUxFbGVtZW50Ki9jdHgsIGluY2x1ZGVDVFgpIHtcbiAgaWYgKGVsKSB7XG4gICAgY3R4ID0gY3R4IHx8IGRvY3VtZW50O1xuICAgIGRvIHtcbiAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsICYmIChzZWxlY3RvclswXSA9PT0gJz4nID8gZWwucGFyZW50Tm9kZSA9PT0gY3R4ICYmIG1hdGNoZXMoZWwsIHNlbGVjdG9yKSA6IG1hdGNoZXMoZWwsIHNlbGVjdG9yKSkgfHwgaW5jbHVkZUNUWCAmJiBlbCA9PT0gY3R4KSB7XG4gICAgICAgIHJldHVybiBlbDtcbiAgICAgIH1cbiAgICAgIGlmIChlbCA9PT0gY3R4KSBicmVhaztcbiAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgICB9IHdoaWxlIChlbCA9IGdldFBhcmVudE9ySG9zdChlbCkpO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxudmFyIFJfU1BBQ0UgPSAvXFxzKy9nO1xuZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWwsIG5hbWUsIHN0YXRlKSB7XG4gIGlmIChlbCAmJiBuYW1lKSB7XG4gICAgaWYgKGVsLmNsYXNzTGlzdCkge1xuICAgICAgZWwuY2xhc3NMaXN0W3N0YXRlID8gJ2FkZCcgOiAncmVtb3ZlJ10obmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjbGFzc05hbWUgPSAoJyAnICsgZWwuY2xhc3NOYW1lICsgJyAnKS5yZXBsYWNlKFJfU1BBQ0UsICcgJykucmVwbGFjZSgnICcgKyBuYW1lICsgJyAnLCAnICcpO1xuICAgICAgZWwuY2xhc3NOYW1lID0gKGNsYXNzTmFtZSArIChzdGF0ZSA/ICcgJyArIG5hbWUgOiAnJykpLnJlcGxhY2UoUl9TUEFDRSwgJyAnKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNzcyhlbCwgcHJvcCwgdmFsKSB7XG4gIHZhciBzdHlsZSA9IGVsICYmIGVsLnN0eWxlO1xuICBpZiAoc3R5bGUpIHtcbiAgICBpZiAodmFsID09PSB2b2lkIDApIHtcbiAgICAgIGlmIChkb2N1bWVudC5kZWZhdWx0VmlldyAmJiBkb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKSB7XG4gICAgICAgIHZhbCA9IGRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWwsICcnKTtcbiAgICAgIH0gZWxzZSBpZiAoZWwuY3VycmVudFN0eWxlKSB7XG4gICAgICAgIHZhbCA9IGVsLmN1cnJlbnRTdHlsZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wID09PSB2b2lkIDAgPyB2YWwgOiB2YWxbcHJvcF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghKHByb3AgaW4gc3R5bGUpICYmIHByb3AuaW5kZXhPZignd2Via2l0JykgPT09IC0xKSB7XG4gICAgICAgIHByb3AgPSAnLXdlYmtpdC0nICsgcHJvcDtcbiAgICAgIH1cbiAgICAgIHN0eWxlW3Byb3BdID0gdmFsICsgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gJycgOiAncHgnKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIG1hdHJpeChlbCwgc2VsZk9ubHkpIHtcbiAgdmFyIGFwcGxpZWRUcmFuc2Zvcm1zID0gJyc7XG4gIGlmICh0eXBlb2YgZWwgPT09ICdzdHJpbmcnKSB7XG4gICAgYXBwbGllZFRyYW5zZm9ybXMgPSBlbDtcbiAgfSBlbHNlIHtcbiAgICBkbyB7XG4gICAgICB2YXIgdHJhbnNmb3JtID0gY3NzKGVsLCAndHJhbnNmb3JtJyk7XG4gICAgICBpZiAodHJhbnNmb3JtICYmIHRyYW5zZm9ybSAhPT0gJ25vbmUnKSB7XG4gICAgICAgIGFwcGxpZWRUcmFuc2Zvcm1zID0gdHJhbnNmb3JtICsgJyAnICsgYXBwbGllZFRyYW5zZm9ybXM7XG4gICAgICB9XG4gICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG4gICAgfSB3aGlsZSAoIXNlbGZPbmx5ICYmIChlbCA9IGVsLnBhcmVudE5vZGUpKTtcbiAgfVxuICB2YXIgbWF0cml4Rm4gPSB3aW5kb3cuRE9NTWF0cml4IHx8IHdpbmRvdy5XZWJLaXRDU1NNYXRyaXggfHwgd2luZG93LkNTU01hdHJpeCB8fCB3aW5kb3cuTVNDU1NNYXRyaXg7XG4gIC8qanNoaW50IC1XMDU2ICovXG4gIHJldHVybiBtYXRyaXhGbiAmJiBuZXcgbWF0cml4Rm4oYXBwbGllZFRyYW5zZm9ybXMpO1xufVxuZnVuY3Rpb24gZmluZChjdHgsIHRhZ05hbWUsIGl0ZXJhdG9yKSB7XG4gIGlmIChjdHgpIHtcbiAgICB2YXIgbGlzdCA9IGN0eC5nZXRFbGVtZW50c0J5VGFnTmFtZSh0YWdOYW1lKSxcbiAgICAgIGkgPSAwLFxuICAgICAgbiA9IGxpc3QubGVuZ3RoO1xuICAgIGlmIChpdGVyYXRvcikge1xuICAgICAgZm9yICg7IGkgPCBuOyBpKyspIHtcbiAgICAgICAgaXRlcmF0b3IobGlzdFtpXSwgaSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xuICB9XG4gIHJldHVybiBbXTtcbn1cbmZ1bmN0aW9uIGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSB7XG4gIHZhciBzY3JvbGxpbmdFbGVtZW50ID0gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudDtcbiAgaWYgKHNjcm9sbGluZ0VsZW1lbnQpIHtcbiAgICByZXR1cm4gc2Nyb2xsaW5nRWxlbWVudDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICB9XG59XG5cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBcImJvdW5kaW5nIGNsaWVudCByZWN0XCIgb2YgZ2l2ZW4gZWxlbWVudFxyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgICAgICAgICAgICAgICAgIFRoZSBlbGVtZW50IHdob3NlIGJvdW5kaW5nQ2xpZW50UmVjdCBpcyB3YW50ZWRcclxuICogQHBhcmFtICB7W0Jvb2xlYW5dfSByZWxhdGl2ZVRvQ29udGFpbmluZ0Jsb2NrICBXaGV0aGVyIHRoZSByZWN0IHNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgY29udGFpbmluZyBibG9jayBvZiAoaW5jbHVkaW5nKSB0aGUgY29udGFpbmVyXHJcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCAgV2hldGhlciB0aGUgcmVjdCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHJlbGF0aXZlIHBhcmVudCBvZiAoaW5jbHVkaW5nKSB0aGUgY29udGFpZW5yXHJcbiAqIEBwYXJhbSAge1tCb29sZWFuXX0gdW5kb1NjYWxlICAgICAgICAgICAgICAgICAgV2hldGhlciB0aGUgY29udGFpbmVyJ3Mgc2NhbGUoKSBzaG91bGQgYmUgdW5kb25lXHJcbiAqIEBwYXJhbSAge1tIVE1MRWxlbWVudF19IGNvbnRhaW5lciAgICAgICAgICAgICAgVGhlIHBhcmVudCB0aGUgZWxlbWVudCB3aWxsIGJlIHBsYWNlZCBpblxyXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBib3VuZGluZ0NsaWVudFJlY3Qgb2YgZWwsIHdpdGggc3BlY2lmaWVkIGFkanVzdG1lbnRzXHJcbiAqL1xuZnVuY3Rpb24gZ2V0UmVjdChlbCwgcmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jaywgcmVsYXRpdmVUb05vblN0YXRpY1BhcmVudCwgdW5kb1NjYWxlLCBjb250YWluZXIpIHtcbiAgaWYgKCFlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgJiYgZWwgIT09IHdpbmRvdykgcmV0dXJuO1xuICB2YXIgZWxSZWN0LCB0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQsIGhlaWdodCwgd2lkdGg7XG4gIGlmIChlbCAhPT0gd2luZG93ICYmIGVsLnBhcmVudE5vZGUgJiYgZWwgIT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkge1xuICAgIGVsUmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRvcCA9IGVsUmVjdC50b3A7XG4gICAgbGVmdCA9IGVsUmVjdC5sZWZ0O1xuICAgIGJvdHRvbSA9IGVsUmVjdC5ib3R0b207XG4gICAgcmlnaHQgPSBlbFJlY3QucmlnaHQ7XG4gICAgaGVpZ2h0ID0gZWxSZWN0LmhlaWdodDtcbiAgICB3aWR0aCA9IGVsUmVjdC53aWR0aDtcbiAgfSBlbHNlIHtcbiAgICB0b3AgPSAwO1xuICAgIGxlZnQgPSAwO1xuICAgIGJvdHRvbSA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICByaWdodCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIGhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICB3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICB9XG4gIGlmICgocmVsYXRpdmVUb0NvbnRhaW5pbmdCbG9jayB8fCByZWxhdGl2ZVRvTm9uU3RhdGljUGFyZW50KSAmJiBlbCAhPT0gd2luZG93KSB7XG4gICAgLy8gQWRqdXN0IGZvciB0cmFuc2xhdGUoKVxuICAgIGNvbnRhaW5lciA9IGNvbnRhaW5lciB8fCBlbC5wYXJlbnROb2RlO1xuXG4gICAgLy8gc29sdmVzICMxMTIzIChzZWU6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNzk1MzgwNi82MDg4MzEyKVxuICAgIC8vIE5vdCBuZWVkZWQgb24gPD0gSUUxMVxuICAgIGlmICghSUUxMU9yTGVzcykge1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoY29udGFpbmVyICYmIGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QgJiYgKGNzcyhjb250YWluZXIsICd0cmFuc2Zvcm0nKSAhPT0gJ25vbmUnIHx8IHJlbGF0aXZlVG9Ob25TdGF0aWNQYXJlbnQgJiYgY3NzKGNvbnRhaW5lciwgJ3Bvc2l0aW9uJykgIT09ICdzdGF0aWMnKSkge1xuICAgICAgICAgIHZhciBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgLy8gU2V0IHJlbGF0aXZlIHRvIGVkZ2VzIG9mIHBhZGRpbmcgYm94IG9mIGNvbnRhaW5lclxuICAgICAgICAgIHRvcCAtPSBjb250YWluZXJSZWN0LnRvcCArIHBhcnNlSW50KGNzcyhjb250YWluZXIsICdib3JkZXItdG9wLXdpZHRoJykpO1xuICAgICAgICAgIGxlZnQgLT0gY29udGFpbmVyUmVjdC5sZWZ0ICsgcGFyc2VJbnQoY3NzKGNvbnRhaW5lciwgJ2JvcmRlci1sZWZ0LXdpZHRoJykpO1xuICAgICAgICAgIGJvdHRvbSA9IHRvcCArIGVsUmVjdC5oZWlnaHQ7XG4gICAgICAgICAgcmlnaHQgPSBsZWZ0ICsgZWxSZWN0LndpZHRoO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgICAgIH0gd2hpbGUgKGNvbnRhaW5lciA9IGNvbnRhaW5lci5wYXJlbnROb2RlKTtcbiAgICB9XG4gIH1cbiAgaWYgKHVuZG9TY2FsZSAmJiBlbCAhPT0gd2luZG93KSB7XG4gICAgLy8gQWRqdXN0IGZvciBzY2FsZSgpXG4gICAgdmFyIGVsTWF0cml4ID0gbWF0cml4KGNvbnRhaW5lciB8fCBlbCksXG4gICAgICBzY2FsZVggPSBlbE1hdHJpeCAmJiBlbE1hdHJpeC5hLFxuICAgICAgc2NhbGVZID0gZWxNYXRyaXggJiYgZWxNYXRyaXguZDtcbiAgICBpZiAoZWxNYXRyaXgpIHtcbiAgICAgIHRvcCAvPSBzY2FsZVk7XG4gICAgICBsZWZ0IC89IHNjYWxlWDtcbiAgICAgIHdpZHRoIC89IHNjYWxlWDtcbiAgICAgIGhlaWdodCAvPSBzY2FsZVk7XG4gICAgICBib3R0b20gPSB0b3AgKyBoZWlnaHQ7XG4gICAgICByaWdodCA9IGxlZnQgKyB3aWR0aDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0b3A6IHRvcCxcbiAgICBsZWZ0OiBsZWZ0LFxuICAgIGJvdHRvbTogYm90dG9tLFxuICAgIHJpZ2h0OiByaWdodCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn1cblxuLyoqXHJcbiAqIENoZWNrcyBpZiBhIHNpZGUgb2YgYW4gZWxlbWVudCBpcyBzY3JvbGxlZCBwYXN0IGEgc2lkZSBvZiBpdHMgcGFyZW50c1xyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gIGVsICAgICAgICAgICBUaGUgZWxlbWVudCB3aG8ncyBzaWRlIGJlaW5nIHNjcm9sbGVkIG91dCBvZiB2aWV3IGlzIGluIHF1ZXN0aW9uXHJcbiAqIEBwYXJhbSAge1N0cmluZ30gICAgICAgZWxTaWRlICAgICAgIFNpZGUgb2YgdGhlIGVsZW1lbnQgaW4gcXVlc3Rpb24gKCd0b3AnLCAnbGVmdCcsICdyaWdodCcsICdib3R0b20nKVxyXG4gKiBAcGFyYW0gIHtTdHJpbmd9ICAgICAgIHBhcmVudFNpZGUgICBTaWRlIG9mIHRoZSBwYXJlbnQgaW4gcXVlc3Rpb24gKCd0b3AnLCAnbGVmdCcsICdyaWdodCcsICdib3R0b20nKVxyXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gICAgICAgICAgICAgICBUaGUgcGFyZW50IHNjcm9sbCBlbGVtZW50IHRoYXQgdGhlIGVsJ3Mgc2lkZSBpcyBzY3JvbGxlZCBwYXN0LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZWxlbWVudFxyXG4gKi9cbmZ1bmN0aW9uIGlzU2Nyb2xsZWRQYXN0KGVsLCBlbFNpZGUsIHBhcmVudFNpZGUpIHtcbiAgdmFyIHBhcmVudCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsLCB0cnVlKSxcbiAgICBlbFNpZGVWYWwgPSBnZXRSZWN0KGVsKVtlbFNpZGVdO1xuXG4gIC8qIGpzaGludCBib3NzOnRydWUgKi9cbiAgd2hpbGUgKHBhcmVudCkge1xuICAgIHZhciBwYXJlbnRTaWRlVmFsID0gZ2V0UmVjdChwYXJlbnQpW3BhcmVudFNpZGVdLFxuICAgICAgdmlzaWJsZSA9IHZvaWQgMDtcbiAgICBpZiAocGFyZW50U2lkZSA9PT0gJ3RvcCcgfHwgcGFyZW50U2lkZSA9PT0gJ2xlZnQnKSB7XG4gICAgICB2aXNpYmxlID0gZWxTaWRlVmFsID49IHBhcmVudFNpZGVWYWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZpc2libGUgPSBlbFNpZGVWYWwgPD0gcGFyZW50U2lkZVZhbDtcbiAgICB9XG4gICAgaWYgKCF2aXNpYmxlKSByZXR1cm4gcGFyZW50O1xuICAgIGlmIChwYXJlbnQgPT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkgYnJlYWs7XG4gICAgcGFyZW50ID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQocGFyZW50LCBmYWxzZSk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcclxuICogR2V0cyBudGggY2hpbGQgb2YgZWwsIGlnbm9yaW5nIGhpZGRlbiBjaGlsZHJlbiwgc29ydGFibGUncyBlbGVtZW50cyAoZG9lcyBub3QgaWdub3JlIGNsb25lIGlmIGl0J3MgdmlzaWJsZSlcclxuICogYW5kIG5vbi1kcmFnZ2FibGUgZWxlbWVudHNcclxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgICAgIFRoZSBwYXJlbnQgZWxlbWVudFxyXG4gKiBAcGFyYW0gIHtOdW1iZXJ9IGNoaWxkTnVtICAgICAgVGhlIGluZGV4IG9mIHRoZSBjaGlsZFxyXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9wdGlvbnMgICAgICAgUGFyZW50IFNvcnRhYmxlJ3Mgb3B0aW9uc1xyXG4gKiBAcmV0dXJuIHtIVE1MRWxlbWVudH0gICAgICAgICAgVGhlIGNoaWxkIGF0IGluZGV4IGNoaWxkTnVtLCBvciBudWxsIGlmIG5vdCBmb3VuZFxyXG4gKi9cbmZ1bmN0aW9uIGdldENoaWxkKGVsLCBjaGlsZE51bSwgb3B0aW9ucywgaW5jbHVkZURyYWdFbCkge1xuICB2YXIgY3VycmVudENoaWxkID0gMCxcbiAgICBpID0gMCxcbiAgICBjaGlsZHJlbiA9IGVsLmNoaWxkcmVuO1xuICB3aGlsZSAoaSA8IGNoaWxkcmVuLmxlbmd0aCkge1xuICAgIGlmIChjaGlsZHJlbltpXS5zdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScgJiYgY2hpbGRyZW5baV0gIT09IFNvcnRhYmxlLmdob3N0ICYmIChpbmNsdWRlRHJhZ0VsIHx8IGNoaWxkcmVuW2ldICE9PSBTb3J0YWJsZS5kcmFnZ2VkKSAmJiBjbG9zZXN0KGNoaWxkcmVuW2ldLCBvcHRpb25zLmRyYWdnYWJsZSwgZWwsIGZhbHNlKSkge1xuICAgICAgaWYgKGN1cnJlbnRDaGlsZCA9PT0gY2hpbGROdW0pIHtcbiAgICAgICAgcmV0dXJuIGNoaWxkcmVuW2ldO1xuICAgICAgfVxuICAgICAgY3VycmVudENoaWxkKys7XG4gICAgfVxuICAgIGkrKztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXHJcbiAqIEdldHMgdGhlIGxhc3QgY2hpbGQgaW4gdGhlIGVsLCBpZ25vcmluZyBnaG9zdEVsIG9yIGludmlzaWJsZSBlbGVtZW50cyAoY2xvbmVzKVxyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgICAgUGFyZW50IGVsZW1lbnRcclxuICogQHBhcmFtICB7c2VsZWN0b3J9IHNlbGVjdG9yICAgIEFueSBvdGhlciBlbGVtZW50cyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkXHJcbiAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgICAgICAgICBUaGUgbGFzdCBjaGlsZCwgaWdub3JpbmcgZ2hvc3RFbFxyXG4gKi9cbmZ1bmN0aW9uIGxhc3RDaGlsZChlbCwgc2VsZWN0b3IpIHtcbiAgdmFyIGxhc3QgPSBlbC5sYXN0RWxlbWVudENoaWxkO1xuICB3aGlsZSAobGFzdCAmJiAobGFzdCA9PT0gU29ydGFibGUuZ2hvc3QgfHwgY3NzKGxhc3QsICdkaXNwbGF5JykgPT09ICdub25lJyB8fCBzZWxlY3RvciAmJiAhbWF0Y2hlcyhsYXN0LCBzZWxlY3RvcikpKSB7XG4gICAgbGFzdCA9IGxhc3QucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgfVxuICByZXR1cm4gbGFzdCB8fCBudWxsO1xufVxuXG4vKipcclxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgYW4gZWxlbWVudCB3aXRoaW4gaXRzIHBhcmVudCBmb3IgYSBzZWxlY3RlZCBzZXQgb2ZcclxuICogZWxlbWVudHNcclxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsXHJcbiAqIEBwYXJhbSAge3NlbGVjdG9yfSBzZWxlY3RvclxyXG4gKiBAcmV0dXJuIHtudW1iZXJ9XHJcbiAqL1xuZnVuY3Rpb24gaW5kZXgoZWwsIHNlbGVjdG9yKSB7XG4gIHZhciBpbmRleCA9IDA7XG4gIGlmICghZWwgfHwgIWVsLnBhcmVudE5vZGUpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG4gIHdoaWxlIChlbCA9IGVsLnByZXZpb3VzRWxlbWVudFNpYmxpbmcpIHtcbiAgICBpZiAoZWwubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gJ1RFTVBMQVRFJyAmJiBlbCAhPT0gU29ydGFibGUuY2xvbmUgJiYgKCFzZWxlY3RvciB8fCBtYXRjaGVzKGVsLCBzZWxlY3RvcikpKSB7XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbi8qKlxyXG4gKiBSZXR1cm5zIHRoZSBzY3JvbGwgb2Zmc2V0IG9mIHRoZSBnaXZlbiBlbGVtZW50LCBhZGRlZCB3aXRoIGFsbCB0aGUgc2Nyb2xsIG9mZnNldHMgb2YgcGFyZW50IGVsZW1lbnRzLlxyXG4gKiBUaGUgdmFsdWUgaXMgcmV0dXJuZWQgaW4gcmVhbCBwaXhlbHMuXHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbFxyXG4gKiBAcmV0dXJuIHtBcnJheX0gICAgICAgICAgICAgT2Zmc2V0cyBpbiB0aGUgZm9ybWF0IG9mIFtsZWZ0LCB0b3BdXHJcbiAqL1xuZnVuY3Rpb24gZ2V0UmVsYXRpdmVTY3JvbGxPZmZzZXQoZWwpIHtcbiAgdmFyIG9mZnNldExlZnQgPSAwLFxuICAgIG9mZnNldFRvcCA9IDAsXG4gICAgd2luU2Nyb2xsZXIgPSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gIGlmIChlbCkge1xuICAgIGRvIHtcbiAgICAgIHZhciBlbE1hdHJpeCA9IG1hdHJpeChlbCksXG4gICAgICAgIHNjYWxlWCA9IGVsTWF0cml4LmEsXG4gICAgICAgIHNjYWxlWSA9IGVsTWF0cml4LmQ7XG4gICAgICBvZmZzZXRMZWZ0ICs9IGVsLnNjcm9sbExlZnQgKiBzY2FsZVg7XG4gICAgICBvZmZzZXRUb3AgKz0gZWwuc2Nyb2xsVG9wICogc2NhbGVZO1xuICAgIH0gd2hpbGUgKGVsICE9PSB3aW5TY3JvbGxlciAmJiAoZWwgPSBlbC5wYXJlbnROb2RlKSk7XG4gIH1cbiAgcmV0dXJuIFtvZmZzZXRMZWZ0LCBvZmZzZXRUb3BdO1xufVxuXG4vKipcclxuICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG9iamVjdCB3aXRoaW4gdGhlIGdpdmVuIGFycmF5XHJcbiAqIEBwYXJhbSAge0FycmF5fSBhcnIgICBBcnJheSB0aGF0IG1heSBvciBtYXkgbm90IGhvbGQgdGhlIG9iamVjdFxyXG4gKiBAcGFyYW0gIHtPYmplY3R9IG9iaiAgQW4gb2JqZWN0IHRoYXQgaGFzIGEga2V5LXZhbHVlIHBhaXIgdW5pcXVlIHRvIGFuZCBpZGVudGljYWwgdG8gYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgb2JqZWN0IHlvdSB3YW50IHRvIGZpbmRcclxuICogQHJldHVybiB7TnVtYmVyfSAgICAgIFRoZSBpbmRleCBvZiB0aGUgb2JqZWN0IGluIHRoZSBhcnJheSwgb3IgLTFcclxuICovXG5mdW5jdGlvbiBpbmRleE9mT2JqZWN0KGFyciwgb2JqKSB7XG4gIGZvciAodmFyIGkgaW4gYXJyKSB7XG4gICAgaWYgKCFhcnIuaGFzT3duUHJvcGVydHkoaSkpIGNvbnRpbnVlO1xuICAgIGZvciAodmFyIGtleSBpbiBvYmopIHtcbiAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSAmJiBvYmpba2V5XSA9PT0gYXJyW2ldW2tleV0pIHJldHVybiBOdW1iZXIoaSk7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn1cbmZ1bmN0aW9uIGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsLCBpbmNsdWRlU2VsZikge1xuICAvLyBza2lwIHRvIHdpbmRvd1xuICBpZiAoIWVsIHx8ICFlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QpIHJldHVybiBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gIHZhciBlbGVtID0gZWw7XG4gIHZhciBnb3RTZWxmID0gZmFsc2U7XG4gIGRvIHtcbiAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGdldCBlbGVtIGNzcyBpZiBpdCBpc24ndCBldmVuIG92ZXJmbG93aW5nIGluIHRoZSBmaXJzdCBwbGFjZSAocGVyZm9ybWFuY2UpXG4gICAgaWYgKGVsZW0uY2xpZW50V2lkdGggPCBlbGVtLnNjcm9sbFdpZHRoIHx8IGVsZW0uY2xpZW50SGVpZ2h0IDwgZWxlbS5zY3JvbGxIZWlnaHQpIHtcbiAgICAgIHZhciBlbGVtQ1NTID0gY3NzKGVsZW0pO1xuICAgICAgaWYgKGVsZW0uY2xpZW50V2lkdGggPCBlbGVtLnNjcm9sbFdpZHRoICYmIChlbGVtQ1NTLm92ZXJmbG93WCA9PSAnYXV0bycgfHwgZWxlbUNTUy5vdmVyZmxvd1ggPT0gJ3Njcm9sbCcpIHx8IGVsZW0uY2xpZW50SGVpZ2h0IDwgZWxlbS5zY3JvbGxIZWlnaHQgJiYgKGVsZW1DU1Mub3ZlcmZsb3dZID09ICdhdXRvJyB8fCBlbGVtQ1NTLm92ZXJmbG93WSA9PSAnc2Nyb2xsJykpIHtcbiAgICAgICAgaWYgKCFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCB8fCBlbGVtID09PSBkb2N1bWVudC5ib2R5KSByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xuICAgICAgICBpZiAoZ290U2VsZiB8fCBpbmNsdWRlU2VsZikgcmV0dXJuIGVsZW07XG4gICAgICAgIGdvdFNlbGYgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovXG4gIH0gd2hpbGUgKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpO1xuICByZXR1cm4gZ2V0V2luZG93U2Nyb2xsaW5nRWxlbWVudCgpO1xufVxuZnVuY3Rpb24gZXh0ZW5kKGRzdCwgc3JjKSB7XG4gIGlmIChkc3QgJiYgc3JjKSB7XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgaWYgKHNyYy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgIGRzdFtrZXldID0gc3JjW2tleV07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBkc3Q7XG59XG5mdW5jdGlvbiBpc1JlY3RFcXVhbChyZWN0MSwgcmVjdDIpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQocmVjdDEudG9wKSA9PT0gTWF0aC5yb3VuZChyZWN0Mi50b3ApICYmIE1hdGgucm91bmQocmVjdDEubGVmdCkgPT09IE1hdGgucm91bmQocmVjdDIubGVmdCkgJiYgTWF0aC5yb3VuZChyZWN0MS5oZWlnaHQpID09PSBNYXRoLnJvdW5kKHJlY3QyLmhlaWdodCkgJiYgTWF0aC5yb3VuZChyZWN0MS53aWR0aCkgPT09IE1hdGgucm91bmQocmVjdDIud2lkdGgpO1xufVxudmFyIF90aHJvdHRsZVRpbWVvdXQ7XG5mdW5jdGlvbiB0aHJvdHRsZShjYWxsYmFjaywgbXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIV90aHJvdHRsZVRpbWVvdXQpIHtcbiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLFxuICAgICAgICBfdGhpcyA9IHRoaXM7XG4gICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY2FsbGJhY2suY2FsbChfdGhpcywgYXJnc1swXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjYWxsYmFjay5hcHBseShfdGhpcywgYXJncyk7XG4gICAgICB9XG4gICAgICBfdGhyb3R0bGVUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aHJvdHRsZVRpbWVvdXQgPSB2b2lkIDA7XG4gICAgICB9LCBtcyk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY2FuY2VsVGhyb3R0bGUoKSB7XG4gIGNsZWFyVGltZW91dChfdGhyb3R0bGVUaW1lb3V0KTtcbiAgX3Rocm90dGxlVGltZW91dCA9IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHNjcm9sbEJ5KGVsLCB4LCB5KSB7XG4gIGVsLnNjcm9sbExlZnQgKz0geDtcbiAgZWwuc2Nyb2xsVG9wICs9IHk7XG59XG5mdW5jdGlvbiBjbG9uZShlbCkge1xuICB2YXIgUG9seW1lciA9IHdpbmRvdy5Qb2x5bWVyO1xuICB2YXIgJCA9IHdpbmRvdy5qUXVlcnkgfHwgd2luZG93LlplcHRvO1xuICBpZiAoUG9seW1lciAmJiBQb2x5bWVyLmRvbSkge1xuICAgIHJldHVybiBQb2x5bWVyLmRvbShlbCkuY2xvbmVOb2RlKHRydWUpO1xuICB9IGVsc2UgaWYgKCQpIHtcbiAgICByZXR1cm4gJChlbCkuY2xvbmUodHJ1ZSlbMF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGVsLmNsb25lTm9kZSh0cnVlKTtcbiAgfVxufVxuZnVuY3Rpb24gc2V0UmVjdChlbCwgcmVjdCkge1xuICBjc3MoZWwsICdwb3NpdGlvbicsICdhYnNvbHV0ZScpO1xuICBjc3MoZWwsICd0b3AnLCByZWN0LnRvcCk7XG4gIGNzcyhlbCwgJ2xlZnQnLCByZWN0LmxlZnQpO1xuICBjc3MoZWwsICd3aWR0aCcsIHJlY3Qud2lkdGgpO1xuICBjc3MoZWwsICdoZWlnaHQnLCByZWN0LmhlaWdodCk7XG59XG5mdW5jdGlvbiB1bnNldFJlY3QoZWwpIHtcbiAgY3NzKGVsLCAncG9zaXRpb24nLCAnJyk7XG4gIGNzcyhlbCwgJ3RvcCcsICcnKTtcbiAgY3NzKGVsLCAnbGVmdCcsICcnKTtcbiAgY3NzKGVsLCAnd2lkdGgnLCAnJyk7XG4gIGNzcyhlbCwgJ2hlaWdodCcsICcnKTtcbn1cbmZ1bmN0aW9uIGdldENoaWxkQ29udGFpbmluZ1JlY3RGcm9tRWxlbWVudChjb250YWluZXIsIG9wdGlvbnMsIGdob3N0RWwpIHtcbiAgdmFyIHJlY3QgPSB7fTtcbiAgQXJyYXkuZnJvbShjb250YWluZXIuY2hpbGRyZW4pLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgdmFyIF9yZWN0JGxlZnQsIF9yZWN0JHRvcCwgX3JlY3QkcmlnaHQsIF9yZWN0JGJvdHRvbTtcbiAgICBpZiAoIWNsb3Nlc3QoY2hpbGQsIG9wdGlvbnMuZHJhZ2dhYmxlLCBjb250YWluZXIsIGZhbHNlKSB8fCBjaGlsZC5hbmltYXRlZCB8fCBjaGlsZCA9PT0gZ2hvc3RFbCkgcmV0dXJuO1xuICAgIHZhciBjaGlsZFJlY3QgPSBnZXRSZWN0KGNoaWxkKTtcbiAgICByZWN0LmxlZnQgPSBNYXRoLm1pbigoX3JlY3QkbGVmdCA9IHJlY3QubGVmdCkgIT09IG51bGwgJiYgX3JlY3QkbGVmdCAhPT0gdm9pZCAwID8gX3JlY3QkbGVmdCA6IEluZmluaXR5LCBjaGlsZFJlY3QubGVmdCk7XG4gICAgcmVjdC50b3AgPSBNYXRoLm1pbigoX3JlY3QkdG9wID0gcmVjdC50b3ApICE9PSBudWxsICYmIF9yZWN0JHRvcCAhPT0gdm9pZCAwID8gX3JlY3QkdG9wIDogSW5maW5pdHksIGNoaWxkUmVjdC50b3ApO1xuICAgIHJlY3QucmlnaHQgPSBNYXRoLm1heCgoX3JlY3QkcmlnaHQgPSByZWN0LnJpZ2h0KSAhPT0gbnVsbCAmJiBfcmVjdCRyaWdodCAhPT0gdm9pZCAwID8gX3JlY3QkcmlnaHQgOiAtSW5maW5pdHksIGNoaWxkUmVjdC5yaWdodCk7XG4gICAgcmVjdC5ib3R0b20gPSBNYXRoLm1heCgoX3JlY3QkYm90dG9tID0gcmVjdC5ib3R0b20pICE9PSBudWxsICYmIF9yZWN0JGJvdHRvbSAhPT0gdm9pZCAwID8gX3JlY3QkYm90dG9tIDogLUluZmluaXR5LCBjaGlsZFJlY3QuYm90dG9tKTtcbiAgfSk7XG4gIHJlY3Qud2lkdGggPSByZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0O1xuICByZWN0LmhlaWdodCA9IHJlY3QuYm90dG9tIC0gcmVjdC50b3A7XG4gIHJlY3QueCA9IHJlY3QubGVmdDtcbiAgcmVjdC55ID0gcmVjdC50b3A7XG4gIHJldHVybiByZWN0O1xufVxudmFyIGV4cGFuZG8gPSAnU29ydGFibGUnICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cbmZ1bmN0aW9uIEFuaW1hdGlvblN0YXRlTWFuYWdlcigpIHtcbiAgdmFyIGFuaW1hdGlvblN0YXRlcyA9IFtdLFxuICAgIGFuaW1hdGlvbkNhbGxiYWNrSWQ7XG4gIHJldHVybiB7XG4gICAgY2FwdHVyZUFuaW1hdGlvblN0YXRlOiBmdW5jdGlvbiBjYXB0dXJlQW5pbWF0aW9uU3RhdGUoKSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMgPSBbXTtcbiAgICAgIGlmICghdGhpcy5vcHRpb25zLmFuaW1hdGlvbikgcmV0dXJuO1xuICAgICAgdmFyIGNoaWxkcmVuID0gW10uc2xpY2UuY2FsbCh0aGlzLmVsLmNoaWxkcmVuKTtcbiAgICAgIGNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkKSB7XG4gICAgICAgIGlmIChjc3MoY2hpbGQsICdkaXNwbGF5JykgPT09ICdub25lJyB8fCBjaGlsZCA9PT0gU29ydGFibGUuZ2hvc3QpIHJldHVybjtcbiAgICAgICAgYW5pbWF0aW9uU3RhdGVzLnB1c2goe1xuICAgICAgICAgIHRhcmdldDogY2hpbGQsXG4gICAgICAgICAgcmVjdDogZ2V0UmVjdChjaGlsZClcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBmcm9tUmVjdCA9IF9vYmplY3RTcHJlYWQyKHt9LCBhbmltYXRpb25TdGF0ZXNbYW5pbWF0aW9uU3RhdGVzLmxlbmd0aCAtIDFdLnJlY3QpO1xuXG4gICAgICAgIC8vIElmIGFuaW1hdGluZzogY29tcGVuc2F0ZSBmb3IgY3VycmVudCBhbmltYXRpb25cbiAgICAgICAgaWYgKGNoaWxkLnRoaXNBbmltYXRpb25EdXJhdGlvbikge1xuICAgICAgICAgIHZhciBjaGlsZE1hdHJpeCA9IG1hdHJpeChjaGlsZCwgdHJ1ZSk7XG4gICAgICAgICAgaWYgKGNoaWxkTWF0cml4KSB7XG4gICAgICAgICAgICBmcm9tUmVjdC50b3AgLT0gY2hpbGRNYXRyaXguZjtcbiAgICAgICAgICAgIGZyb21SZWN0LmxlZnQgLT0gY2hpbGRNYXRyaXguZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY2hpbGQuZnJvbVJlY3QgPSBmcm9tUmVjdDtcbiAgICAgIH0pO1xuICAgIH0sXG4gICAgYWRkQW5pbWF0aW9uU3RhdGU6IGZ1bmN0aW9uIGFkZEFuaW1hdGlvblN0YXRlKHN0YXRlKSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMucHVzaChzdGF0ZSk7XG4gICAgfSxcbiAgICByZW1vdmVBbmltYXRpb25TdGF0ZTogZnVuY3Rpb24gcmVtb3ZlQW5pbWF0aW9uU3RhdGUodGFyZ2V0KSB7XG4gICAgICBhbmltYXRpb25TdGF0ZXMuc3BsaWNlKGluZGV4T2ZPYmplY3QoYW5pbWF0aW9uU3RhdGVzLCB7XG4gICAgICAgIHRhcmdldDogdGFyZ2V0XG4gICAgICB9KSwgMSk7XG4gICAgfSxcbiAgICBhbmltYXRlQWxsOiBmdW5jdGlvbiBhbmltYXRlQWxsKGNhbGxiYWNrKSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuYW5pbWF0aW9uKSB7XG4gICAgICAgIGNsZWFyVGltZW91dChhbmltYXRpb25DYWxsYmFja0lkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2soKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdmFyIGFuaW1hdGluZyA9IGZhbHNlLFxuICAgICAgICBhbmltYXRpb25UaW1lID0gMDtcbiAgICAgIGFuaW1hdGlvblN0YXRlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgICB2YXIgdGltZSA9IDAsXG4gICAgICAgICAgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0LFxuICAgICAgICAgIGZyb21SZWN0ID0gdGFyZ2V0LmZyb21SZWN0LFxuICAgICAgICAgIHRvUmVjdCA9IGdldFJlY3QodGFyZ2V0KSxcbiAgICAgICAgICBwcmV2RnJvbVJlY3QgPSB0YXJnZXQucHJldkZyb21SZWN0LFxuICAgICAgICAgIHByZXZUb1JlY3QgPSB0YXJnZXQucHJldlRvUmVjdCxcbiAgICAgICAgICBhbmltYXRpbmdSZWN0ID0gc3RhdGUucmVjdCxcbiAgICAgICAgICB0YXJnZXRNYXRyaXggPSBtYXRyaXgodGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgaWYgKHRhcmdldE1hdHJpeCkge1xuICAgICAgICAgIC8vIENvbXBlbnNhdGUgZm9yIGN1cnJlbnQgYW5pbWF0aW9uXG4gICAgICAgICAgdG9SZWN0LnRvcCAtPSB0YXJnZXRNYXRyaXguZjtcbiAgICAgICAgICB0b1JlY3QubGVmdCAtPSB0YXJnZXRNYXRyaXguZTtcbiAgICAgICAgfVxuICAgICAgICB0YXJnZXQudG9SZWN0ID0gdG9SZWN0O1xuICAgICAgICBpZiAodGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbikge1xuICAgICAgICAgIC8vIENvdWxkIGFsc28gY2hlY2sgaWYgYW5pbWF0aW5nUmVjdCBpcyBiZXR3ZWVuIGZyb21SZWN0IGFuZCB0b1JlY3RcbiAgICAgICAgICBpZiAoaXNSZWN0RXF1YWwocHJldkZyb21SZWN0LCB0b1JlY3QpICYmICFpc1JlY3RFcXVhbChmcm9tUmVjdCwgdG9SZWN0KSAmJlxuICAgICAgICAgIC8vIE1ha2Ugc3VyZSBhbmltYXRpbmdSZWN0IGlzIG9uIGxpbmUgYmV0d2VlbiB0b1JlY3QgJiBmcm9tUmVjdFxuICAgICAgICAgIChhbmltYXRpbmdSZWN0LnRvcCAtIHRvUmVjdC50b3ApIC8gKGFuaW1hdGluZ1JlY3QubGVmdCAtIHRvUmVjdC5sZWZ0KSA9PT0gKGZyb21SZWN0LnRvcCAtIHRvUmVjdC50b3ApIC8gKGZyb21SZWN0LmxlZnQgLSB0b1JlY3QubGVmdCkpIHtcbiAgICAgICAgICAgIC8vIElmIHJldHVybmluZyB0byBzYW1lIHBsYWNlIGFzIHN0YXJ0ZWQgZnJvbSBhbmltYXRpb24gYW5kIG9uIHNhbWUgYXhpc1xuICAgICAgICAgICAgdGltZSA9IGNhbGN1bGF0ZVJlYWxUaW1lKGFuaW1hdGluZ1JlY3QsIHByZXZGcm9tUmVjdCwgcHJldlRvUmVjdCwgX3RoaXMub3B0aW9ucyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgZnJvbVJlY3QgIT0gdG9SZWN0OiBhbmltYXRlXG4gICAgICAgIGlmICghaXNSZWN0RXF1YWwodG9SZWN0LCBmcm9tUmVjdCkpIHtcbiAgICAgICAgICB0YXJnZXQucHJldkZyb21SZWN0ID0gZnJvbVJlY3Q7XG4gICAgICAgICAgdGFyZ2V0LnByZXZUb1JlY3QgPSB0b1JlY3Q7XG4gICAgICAgICAgaWYgKCF0aW1lKSB7XG4gICAgICAgICAgICB0aW1lID0gX3RoaXMub3B0aW9ucy5hbmltYXRpb247XG4gICAgICAgICAgfVxuICAgICAgICAgIF90aGlzLmFuaW1hdGUodGFyZ2V0LCBhbmltYXRpbmdSZWN0LCB0b1JlY3QsIHRpbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aW1lKSB7XG4gICAgICAgICAgYW5pbWF0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBhbmltYXRpb25UaW1lID0gTWF0aC5tYXgoYW5pbWF0aW9uVGltZSwgdGltZSk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRhcmdldC5hbmltYXRpb25SZXNldFRpbWVyKTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0aW9uUmVzZXRUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGFyZ2V0LmFuaW1hdGlvblRpbWUgPSAwO1xuICAgICAgICAgICAgdGFyZ2V0LnByZXZGcm9tUmVjdCA9IG51bGw7XG4gICAgICAgICAgICB0YXJnZXQuZnJvbVJlY3QgPSBudWxsO1xuICAgICAgICAgICAgdGFyZ2V0LnByZXZUb1JlY3QgPSBudWxsO1xuICAgICAgICAgICAgdGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgfSwgdGltZSk7XG4gICAgICAgICAgdGFyZ2V0LnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IHRpbWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgY2xlYXJUaW1lb3V0KGFuaW1hdGlvbkNhbGxiYWNrSWQpO1xuICAgICAgaWYgKCFhbmltYXRpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgY2FsbGJhY2soKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFuaW1hdGlvbkNhbGxiYWNrSWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAnZnVuY3Rpb24nKSBjYWxsYmFjaygpO1xuICAgICAgICB9LCBhbmltYXRpb25UaW1lKTtcbiAgICAgIH1cbiAgICAgIGFuaW1hdGlvblN0YXRlcyA9IFtdO1xuICAgIH0sXG4gICAgYW5pbWF0ZTogZnVuY3Rpb24gYW5pbWF0ZSh0YXJnZXQsIGN1cnJlbnRSZWN0LCB0b1JlY3QsIGR1cmF0aW9uKSB7XG4gICAgICBpZiAoZHVyYXRpb24pIHtcbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgICAgIGNzcyh0YXJnZXQsICd0cmFuc2Zvcm0nLCAnJyk7XG4gICAgICAgIHZhciBlbE1hdHJpeCA9IG1hdHJpeCh0aGlzLmVsKSxcbiAgICAgICAgICBzY2FsZVggPSBlbE1hdHJpeCAmJiBlbE1hdHJpeC5hLFxuICAgICAgICAgIHNjYWxlWSA9IGVsTWF0cml4ICYmIGVsTWF0cml4LmQsXG4gICAgICAgICAgdHJhbnNsYXRlWCA9IChjdXJyZW50UmVjdC5sZWZ0IC0gdG9SZWN0LmxlZnQpIC8gKHNjYWxlWCB8fCAxKSxcbiAgICAgICAgICB0cmFuc2xhdGVZID0gKGN1cnJlbnRSZWN0LnRvcCAtIHRvUmVjdC50b3ApIC8gKHNjYWxlWSB8fCAxKTtcbiAgICAgICAgdGFyZ2V0LmFuaW1hdGluZ1ggPSAhIXRyYW5zbGF0ZVg7XG4gICAgICAgIHRhcmdldC5hbmltYXRpbmdZID0gISF0cmFuc2xhdGVZO1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZTNkKCcgKyB0cmFuc2xhdGVYICsgJ3B4LCcgKyB0cmFuc2xhdGVZICsgJ3B4LDApJyk7XG4gICAgICAgIHRoaXMuZm9yUmVwYWludER1bW15ID0gcmVwYWludCh0YXJnZXQpOyAvLyByZXBhaW50XG5cbiAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zaXRpb24nLCAndHJhbnNmb3JtICcgKyBkdXJhdGlvbiArICdtcycgKyAodGhpcy5vcHRpb25zLmVhc2luZyA/ICcgJyArIHRoaXMub3B0aW9ucy5lYXNpbmcgOiAnJykpO1xuICAgICAgICBjc3ModGFyZ2V0LCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZTNkKDAsMCwwKScpO1xuICAgICAgICB0eXBlb2YgdGFyZ2V0LmFuaW1hdGVkID09PSAnbnVtYmVyJyAmJiBjbGVhclRpbWVvdXQodGFyZ2V0LmFuaW1hdGVkKTtcbiAgICAgICAgdGFyZ2V0LmFuaW1hdGVkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zaXRpb24nLCAnJyk7XG4gICAgICAgICAgY3NzKHRhcmdldCwgJ3RyYW5zZm9ybScsICcnKTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICB0YXJnZXQuYW5pbWF0aW5nWCA9IGZhbHNlO1xuICAgICAgICAgIHRhcmdldC5hbmltYXRpbmdZID0gZmFsc2U7XG4gICAgICAgIH0sIGR1cmF0aW9uKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG5mdW5jdGlvbiByZXBhaW50KHRhcmdldCkge1xuICByZXR1cm4gdGFyZ2V0Lm9mZnNldFdpZHRoO1xufVxuZnVuY3Rpb24gY2FsY3VsYXRlUmVhbFRpbWUoYW5pbWF0aW5nUmVjdCwgZnJvbVJlY3QsIHRvUmVjdCwgb3B0aW9ucykge1xuICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KGZyb21SZWN0LnRvcCAtIGFuaW1hdGluZ1JlY3QudG9wLCAyKSArIE1hdGgucG93KGZyb21SZWN0LmxlZnQgLSBhbmltYXRpbmdSZWN0LmxlZnQsIDIpKSAvIE1hdGguc3FydChNYXRoLnBvdyhmcm9tUmVjdC50b3AgLSB0b1JlY3QudG9wLCAyKSArIE1hdGgucG93KGZyb21SZWN0LmxlZnQgLSB0b1JlY3QubGVmdCwgMikpICogb3B0aW9ucy5hbmltYXRpb247XG59XG5cbnZhciBwbHVnaW5zID0gW107XG52YXIgZGVmYXVsdHMgPSB7XG4gIGluaXRpYWxpemVCeURlZmF1bHQ6IHRydWVcbn07XG52YXIgUGx1Z2luTWFuYWdlciA9IHtcbiAgbW91bnQ6IGZ1bmN0aW9uIG1vdW50KHBsdWdpbikge1xuICAgIC8vIFNldCBkZWZhdWx0IHN0YXRpYyBwcm9wZXJ0aWVzXG4gICAgZm9yICh2YXIgb3B0aW9uIGluIGRlZmF1bHRzKSB7XG4gICAgICBpZiAoZGVmYXVsdHMuaGFzT3duUHJvcGVydHkob3B0aW9uKSAmJiAhKG9wdGlvbiBpbiBwbHVnaW4pKSB7XG4gICAgICAgIHBsdWdpbltvcHRpb25dID0gZGVmYXVsdHNbb3B0aW9uXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAocC5wbHVnaW5OYW1lID09PSBwbHVnaW4ucGx1Z2luTmFtZSkge1xuICAgICAgICB0aHJvdyBcIlNvcnRhYmxlOiBDYW5ub3QgbW91bnQgcGx1Z2luIFwiLmNvbmNhdChwbHVnaW4ucGx1Z2luTmFtZSwgXCIgbW9yZSB0aGFuIG9uY2VcIik7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcGx1Z2lucy5wdXNoKHBsdWdpbik7XG4gIH0sXG4gIHBsdWdpbkV2ZW50OiBmdW5jdGlvbiBwbHVnaW5FdmVudChldmVudE5hbWUsIHNvcnRhYmxlLCBldnQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXMuZXZlbnRDYW5jZWxlZCA9IGZhbHNlO1xuICAgIGV2dC5jYW5jZWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBfdGhpcy5ldmVudENhbmNlbGVkID0gdHJ1ZTtcbiAgICB9O1xuICAgIHZhciBldmVudE5hbWVHbG9iYWwgPSBldmVudE5hbWUgKyAnR2xvYmFsJztcbiAgICBwbHVnaW5zLmZvckVhY2goZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgaWYgKCFzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0pIHJldHVybjtcbiAgICAgIC8vIEZpcmUgZ2xvYmFsIGV2ZW50cyBpZiBpdCBleGlzdHMgaW4gdGhpcyBzb3J0YWJsZVxuICAgICAgaWYgKHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVHbG9iYWxdKSB7XG4gICAgICAgIHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXVtldmVudE5hbWVHbG9iYWxdKF9vYmplY3RTcHJlYWQyKHtcbiAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGVcbiAgICAgICAgfSwgZXZ0KSk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgZmlyZSBwbHVnaW4gZXZlbnQgaWYgcGx1Z2luIGlzIGVuYWJsZWQgaW4gdGhpcyBzb3J0YWJsZSxcbiAgICAgIC8vIGFuZCBwbHVnaW4gaGFzIGV2ZW50IGRlZmluZWRcbiAgICAgIGlmIChzb3J0YWJsZS5vcHRpb25zW3BsdWdpbi5wbHVnaW5OYW1lXSAmJiBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lXSkge1xuICAgICAgICBzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV1bZXZlbnROYW1lXShfb2JqZWN0U3ByZWFkMih7XG4gICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlXG4gICAgICAgIH0sIGV2dCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9LFxuICBpbml0aWFsaXplUGx1Z2luczogZnVuY3Rpb24gaW5pdGlhbGl6ZVBsdWdpbnMoc29ydGFibGUsIGVsLCBkZWZhdWx0cywgb3B0aW9ucykge1xuICAgIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgICB2YXIgcGx1Z2luTmFtZSA9IHBsdWdpbi5wbHVnaW5OYW1lO1xuICAgICAgaWYgKCFzb3J0YWJsZS5vcHRpb25zW3BsdWdpbk5hbWVdICYmICFwbHVnaW4uaW5pdGlhbGl6ZUJ5RGVmYXVsdCkgcmV0dXJuO1xuICAgICAgdmFyIGluaXRpYWxpemVkID0gbmV3IHBsdWdpbihzb3J0YWJsZSwgZWwsIHNvcnRhYmxlLm9wdGlvbnMpO1xuICAgICAgaW5pdGlhbGl6ZWQuc29ydGFibGUgPSBzb3J0YWJsZTtcbiAgICAgIGluaXRpYWxpemVkLm9wdGlvbnMgPSBzb3J0YWJsZS5vcHRpb25zO1xuICAgICAgc29ydGFibGVbcGx1Z2luTmFtZV0gPSBpbml0aWFsaXplZDtcblxuICAgICAgLy8gQWRkIGRlZmF1bHQgb3B0aW9ucyBmcm9tIHBsdWdpblxuICAgICAgX2V4dGVuZHMoZGVmYXVsdHMsIGluaXRpYWxpemVkLmRlZmF1bHRzKTtcbiAgICB9KTtcbiAgICBmb3IgKHZhciBvcHRpb24gaW4gc29ydGFibGUub3B0aW9ucykge1xuICAgICAgaWYgKCFzb3J0YWJsZS5vcHRpb25zLmhhc093blByb3BlcnR5KG9wdGlvbikpIGNvbnRpbnVlO1xuICAgICAgdmFyIG1vZGlmaWVkID0gdGhpcy5tb2RpZnlPcHRpb24oc29ydGFibGUsIG9wdGlvbiwgc29ydGFibGUub3B0aW9uc1tvcHRpb25dKTtcbiAgICAgIGlmICh0eXBlb2YgbW9kaWZpZWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHNvcnRhYmxlLm9wdGlvbnNbb3B0aW9uXSA9IG1vZGlmaWVkO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgZ2V0RXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBnZXRFdmVudFByb3BlcnRpZXMobmFtZSwgc29ydGFibGUpIHtcbiAgICB2YXIgZXZlbnRQcm9wZXJ0aWVzID0ge307XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIGlmICh0eXBlb2YgcGx1Z2luLmV2ZW50UHJvcGVydGllcyAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuO1xuICAgICAgX2V4dGVuZHMoZXZlbnRQcm9wZXJ0aWVzLCBwbHVnaW4uZXZlbnRQcm9wZXJ0aWVzLmNhbGwoc29ydGFibGVbcGx1Z2luLnBsdWdpbk5hbWVdLCBuYW1lKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGV2ZW50UHJvcGVydGllcztcbiAgfSxcbiAgbW9kaWZ5T3B0aW9uOiBmdW5jdGlvbiBtb2RpZnlPcHRpb24oc29ydGFibGUsIG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIG1vZGlmaWVkVmFsdWU7XG4gICAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHtcbiAgICAgIC8vIFBsdWdpbiBtdXN0IGV4aXN0IG9uIHRoZSBTb3J0YWJsZVxuICAgICAgaWYgKCFzb3J0YWJsZVtwbHVnaW4ucGx1Z2luTmFtZV0pIHJldHVybjtcblxuICAgICAgLy8gSWYgc3RhdGljIG9wdGlvbiBsaXN0ZW5lciBleGlzdHMgZm9yIHRoaXMgb3B0aW9uLCBjYWxsIGluIHRoZSBjb250ZXh0IG9mIHRoZSBTb3J0YWJsZSdzIGluc3RhbmNlIG9mIHRoaXMgcGx1Z2luXG4gICAgICBpZiAocGx1Z2luLm9wdGlvbkxpc3RlbmVycyAmJiB0eXBlb2YgcGx1Z2luLm9wdGlvbkxpc3RlbmVyc1tuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBtb2RpZmllZFZhbHVlID0gcGx1Z2luLm9wdGlvbkxpc3RlbmVyc1tuYW1lXS5jYWxsKHNvcnRhYmxlW3BsdWdpbi5wbHVnaW5OYW1lXSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBtb2RpZmllZFZhbHVlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KF9yZWYpIHtcbiAgdmFyIHNvcnRhYmxlID0gX3JlZi5zb3J0YWJsZSxcbiAgICByb290RWwgPSBfcmVmLnJvb3RFbCxcbiAgICBuYW1lID0gX3JlZi5uYW1lLFxuICAgIHRhcmdldEVsID0gX3JlZi50YXJnZXRFbCxcbiAgICBjbG9uZUVsID0gX3JlZi5jbG9uZUVsLFxuICAgIHRvRWwgPSBfcmVmLnRvRWwsXG4gICAgZnJvbUVsID0gX3JlZi5mcm9tRWwsXG4gICAgb2xkSW5kZXggPSBfcmVmLm9sZEluZGV4LFxuICAgIG5ld0luZGV4ID0gX3JlZi5uZXdJbmRleCxcbiAgICBvbGREcmFnZ2FibGVJbmRleCA9IF9yZWYub2xkRHJhZ2dhYmxlSW5kZXgsXG4gICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBfcmVmLm5ld0RyYWdnYWJsZUluZGV4LFxuICAgIG9yaWdpbmFsRXZlbnQgPSBfcmVmLm9yaWdpbmFsRXZlbnQsXG4gICAgcHV0U29ydGFibGUgPSBfcmVmLnB1dFNvcnRhYmxlLFxuICAgIGV4dHJhRXZlbnRQcm9wZXJ0aWVzID0gX3JlZi5leHRyYUV2ZW50UHJvcGVydGllcztcbiAgc29ydGFibGUgPSBzb3J0YWJsZSB8fCByb290RWwgJiYgcm9vdEVsW2V4cGFuZG9dO1xuICBpZiAoIXNvcnRhYmxlKSByZXR1cm47XG4gIHZhciBldnQsXG4gICAgb3B0aW9ucyA9IHNvcnRhYmxlLm9wdGlvbnMsXG4gICAgb25OYW1lID0gJ29uJyArIG5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnN1YnN0cigxKTtcbiAgLy8gU3VwcG9ydCBmb3IgbmV3IEN1c3RvbUV2ZW50IGZlYXR1cmVcbiAgaWYgKHdpbmRvdy5DdXN0b21FdmVudCAmJiAhSUUxMU9yTGVzcyAmJiAhRWRnZSkge1xuICAgIGV2dCA9IG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2dC5pbml0RXZlbnQobmFtZSwgdHJ1ZSwgdHJ1ZSk7XG4gIH1cbiAgZXZ0LnRvID0gdG9FbCB8fCByb290RWw7XG4gIGV2dC5mcm9tID0gZnJvbUVsIHx8IHJvb3RFbDtcbiAgZXZ0Lml0ZW0gPSB0YXJnZXRFbCB8fCByb290RWw7XG4gIGV2dC5jbG9uZSA9IGNsb25lRWw7XG4gIGV2dC5vbGRJbmRleCA9IG9sZEluZGV4O1xuICBldnQubmV3SW5kZXggPSBuZXdJbmRleDtcbiAgZXZ0Lm9sZERyYWdnYWJsZUluZGV4ID0gb2xkRHJhZ2dhYmxlSW5kZXg7XG4gIGV2dC5uZXdEcmFnZ2FibGVJbmRleCA9IG5ld0RyYWdnYWJsZUluZGV4O1xuICBldnQub3JpZ2luYWxFdmVudCA9IG9yaWdpbmFsRXZlbnQ7XG4gIGV2dC5wdWxsTW9kZSA9IHB1dFNvcnRhYmxlID8gcHV0U29ydGFibGUubGFzdFB1dE1vZGUgOiB1bmRlZmluZWQ7XG4gIHZhciBhbGxFdmVudFByb3BlcnRpZXMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgZXh0cmFFdmVudFByb3BlcnRpZXMpLCBQbHVnaW5NYW5hZ2VyLmdldEV2ZW50UHJvcGVydGllcyhuYW1lLCBzb3J0YWJsZSkpO1xuICBmb3IgKHZhciBvcHRpb24gaW4gYWxsRXZlbnRQcm9wZXJ0aWVzKSB7XG4gICAgZXZ0W29wdGlvbl0gPSBhbGxFdmVudFByb3BlcnRpZXNbb3B0aW9uXTtcbiAgfVxuICBpZiAocm9vdEVsKSB7XG4gICAgcm9vdEVsLmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgfVxuICBpZiAob3B0aW9uc1tvbk5hbWVdKSB7XG4gICAgb3B0aW9uc1tvbk5hbWVdLmNhbGwoc29ydGFibGUsIGV2dCk7XG4gIH1cbn1cblxudmFyIF9leGNsdWRlZCA9IFtcImV2dFwiXTtcbnZhciBwbHVnaW5FdmVudCA9IGZ1bmN0aW9uIHBsdWdpbkV2ZW50KGV2ZW50TmFtZSwgc29ydGFibGUpIHtcbiAgdmFyIF9yZWYgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6IHt9LFxuICAgIG9yaWdpbmFsRXZlbnQgPSBfcmVmLmV2dCxcbiAgICBkYXRhID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKF9yZWYsIF9leGNsdWRlZCk7XG4gIFBsdWdpbk1hbmFnZXIucGx1Z2luRXZlbnQuYmluZChTb3J0YWJsZSkoZXZlbnROYW1lLCBzb3J0YWJsZSwgX29iamVjdFNwcmVhZDIoe1xuICAgIGRyYWdFbDogZHJhZ0VsLFxuICAgIHBhcmVudEVsOiBwYXJlbnRFbCxcbiAgICBnaG9zdEVsOiBnaG9zdEVsLFxuICAgIHJvb3RFbDogcm9vdEVsLFxuICAgIG5leHRFbDogbmV4dEVsLFxuICAgIGxhc3REb3duRWw6IGxhc3REb3duRWwsXG4gICAgY2xvbmVFbDogY2xvbmVFbCxcbiAgICBjbG9uZUhpZGRlbjogY2xvbmVIaWRkZW4sXG4gICAgZHJhZ1N0YXJ0ZWQ6IG1vdmVkLFxuICAgIHB1dFNvcnRhYmxlOiBwdXRTb3J0YWJsZSxcbiAgICBhY3RpdmVTb3J0YWJsZTogU29ydGFibGUuYWN0aXZlLFxuICAgIG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnQsXG4gICAgb2xkSW5kZXg6IG9sZEluZGV4LFxuICAgIG9sZERyYWdnYWJsZUluZGV4OiBvbGREcmFnZ2FibGVJbmRleCxcbiAgICBuZXdJbmRleDogbmV3SW5kZXgsXG4gICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG5ld0RyYWdnYWJsZUluZGV4LFxuICAgIGhpZGVHaG9zdEZvclRhcmdldDogX2hpZGVHaG9zdEZvclRhcmdldCxcbiAgICB1bmhpZGVHaG9zdEZvclRhcmdldDogX3VuaGlkZUdob3N0Rm9yVGFyZ2V0LFxuICAgIGNsb25lTm93SGlkZGVuOiBmdW5jdGlvbiBjbG9uZU5vd0hpZGRlbigpIHtcbiAgICAgIGNsb25lSGlkZGVuID0gdHJ1ZTtcbiAgICB9LFxuICAgIGNsb25lTm93U2hvd246IGZ1bmN0aW9uIGNsb25lTm93U2hvd24oKSB7XG4gICAgICBjbG9uZUhpZGRlbiA9IGZhbHNlO1xuICAgIH0sXG4gICAgZGlzcGF0Y2hTb3J0YWJsZUV2ZW50OiBmdW5jdGlvbiBkaXNwYXRjaFNvcnRhYmxlRXZlbnQobmFtZSkge1xuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IG9yaWdpbmFsRXZlbnRcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgZGF0YSkpO1xufTtcbmZ1bmN0aW9uIF9kaXNwYXRjaEV2ZW50KGluZm8pIHtcbiAgZGlzcGF0Y2hFdmVudChfb2JqZWN0U3ByZWFkMih7XG4gICAgcHV0U29ydGFibGU6IHB1dFNvcnRhYmxlLFxuICAgIGNsb25lRWw6IGNsb25lRWwsXG4gICAgdGFyZ2V0RWw6IGRyYWdFbCxcbiAgICByb290RWw6IHJvb3RFbCxcbiAgICBvbGRJbmRleDogb2xkSW5kZXgsXG4gICAgb2xkRHJhZ2dhYmxlSW5kZXg6IG9sZERyYWdnYWJsZUluZGV4LFxuICAgIG5ld0luZGV4OiBuZXdJbmRleCxcbiAgICBuZXdEcmFnZ2FibGVJbmRleDogbmV3RHJhZ2dhYmxlSW5kZXhcbiAgfSwgaW5mbykpO1xufVxudmFyIGRyYWdFbCxcbiAgcGFyZW50RWwsXG4gIGdob3N0RWwsXG4gIHJvb3RFbCxcbiAgbmV4dEVsLFxuICBsYXN0RG93bkVsLFxuICBjbG9uZUVsLFxuICBjbG9uZUhpZGRlbixcbiAgb2xkSW5kZXgsXG4gIG5ld0luZGV4LFxuICBvbGREcmFnZ2FibGVJbmRleCxcbiAgbmV3RHJhZ2dhYmxlSW5kZXgsXG4gIGFjdGl2ZUdyb3VwLFxuICBwdXRTb3J0YWJsZSxcbiAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IGZhbHNlLFxuICBpZ25vcmVOZXh0Q2xpY2sgPSBmYWxzZSxcbiAgc29ydGFibGVzID0gW10sXG4gIHRhcEV2dCxcbiAgdG91Y2hFdnQsXG4gIGxhc3REeCxcbiAgbGFzdER5LFxuICB0YXBEaXN0YW5jZUxlZnQsXG4gIHRhcERpc3RhbmNlVG9wLFxuICBtb3ZlZCxcbiAgbGFzdFRhcmdldCxcbiAgbGFzdERpcmVjdGlvbixcbiAgcGFzdEZpcnN0SW52ZXJ0VGhyZXNoID0gZmFsc2UsXG4gIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQgPSBmYWxzZSxcbiAgdGFyZ2V0TW92ZURpc3RhbmNlLFxuICAvLyBGb3IgcG9zaXRpb25pbmcgZ2hvc3QgYWJzb2x1dGVseVxuICBnaG9zdFJlbGF0aXZlUGFyZW50LFxuICBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbCA9IFtdLFxuICAvLyAobGVmdCwgdG9wKVxuXG4gIF9zaWxlbnQgPSBmYWxzZSxcbiAgc2F2ZWRJbnB1dENoZWNrZWQgPSBbXTtcblxuLyoqIEBjb25zdCAqL1xudmFyIGRvY3VtZW50RXhpc3RzID0gdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyxcbiAgUG9zaXRpb25HaG9zdEFic29sdXRlbHkgPSBJT1MsXG4gIENTU0Zsb2F0UHJvcGVydHkgPSBFZGdlIHx8IElFMTFPckxlc3MgPyAnY3NzRmxvYXQnIDogJ2Zsb2F0JyxcbiAgLy8gVGhpcyB3aWxsIG5vdCBwYXNzIGZvciBJRTksIGJlY2F1c2UgSUU5IERuRCBvbmx5IHdvcmtzIG9uIGFuY2hvcnNcbiAgc3VwcG9ydERyYWdnYWJsZSA9IGRvY3VtZW50RXhpc3RzICYmICFDaHJvbWVGb3JBbmRyb2lkICYmICFJT1MgJiYgJ2RyYWdnYWJsZScgaW4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksXG4gIHN1cHBvcnRDc3NQb2ludGVyRXZlbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghZG9jdW1lbnRFeGlzdHMpIHJldHVybjtcbiAgICAvLyBmYWxzZSB3aGVuIDw9IElFMTFcbiAgICBpZiAoSUUxMU9yTGVzcykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd4Jyk7XG4gICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdwb2ludGVyLWV2ZW50czphdXRvJztcbiAgICByZXR1cm4gZWwuc3R5bGUucG9pbnRlckV2ZW50cyA9PT0gJ2F1dG8nO1xuICB9KCksXG4gIF9kZXRlY3REaXJlY3Rpb24gPSBmdW5jdGlvbiBfZGV0ZWN0RGlyZWN0aW9uKGVsLCBvcHRpb25zKSB7XG4gICAgdmFyIGVsQ1NTID0gY3NzKGVsKSxcbiAgICAgIGVsV2lkdGggPSBwYXJzZUludChlbENTUy53aWR0aCkgLSBwYXJzZUludChlbENTUy5wYWRkaW5nTGVmdCkgLSBwYXJzZUludChlbENTUy5wYWRkaW5nUmlnaHQpIC0gcGFyc2VJbnQoZWxDU1MuYm9yZGVyTGVmdFdpZHRoKSAtIHBhcnNlSW50KGVsQ1NTLmJvcmRlclJpZ2h0V2lkdGgpLFxuICAgICAgY2hpbGQxID0gZ2V0Q2hpbGQoZWwsIDAsIG9wdGlvbnMpLFxuICAgICAgY2hpbGQyID0gZ2V0Q2hpbGQoZWwsIDEsIG9wdGlvbnMpLFxuICAgICAgZmlyc3RDaGlsZENTUyA9IGNoaWxkMSAmJiBjc3MoY2hpbGQxKSxcbiAgICAgIHNlY29uZENoaWxkQ1NTID0gY2hpbGQyICYmIGNzcyhjaGlsZDIpLFxuICAgICAgZmlyc3RDaGlsZFdpZHRoID0gZmlyc3RDaGlsZENTUyAmJiBwYXJzZUludChmaXJzdENoaWxkQ1NTLm1hcmdpbkxlZnQpICsgcGFyc2VJbnQoZmlyc3RDaGlsZENTUy5tYXJnaW5SaWdodCkgKyBnZXRSZWN0KGNoaWxkMSkud2lkdGgsXG4gICAgICBzZWNvbmRDaGlsZFdpZHRoID0gc2Vjb25kQ2hpbGRDU1MgJiYgcGFyc2VJbnQoc2Vjb25kQ2hpbGRDU1MubWFyZ2luTGVmdCkgKyBwYXJzZUludChzZWNvbmRDaGlsZENTUy5tYXJnaW5SaWdodCkgKyBnZXRSZWN0KGNoaWxkMikud2lkdGg7XG4gICAgaWYgKGVsQ1NTLmRpc3BsYXkgPT09ICdmbGV4Jykge1xuICAgICAgcmV0dXJuIGVsQ1NTLmZsZXhEaXJlY3Rpb24gPT09ICdjb2x1bW4nIHx8IGVsQ1NTLmZsZXhEaXJlY3Rpb24gPT09ICdjb2x1bW4tcmV2ZXJzZScgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuICAgIH1cbiAgICBpZiAoZWxDU1MuZGlzcGxheSA9PT0gJ2dyaWQnKSB7XG4gICAgICByZXR1cm4gZWxDU1MuZ3JpZFRlbXBsYXRlQ29sdW1ucy5zcGxpdCgnICcpLmxlbmd0aCA8PSAxID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICB9XG4gICAgaWYgKGNoaWxkMSAmJiBmaXJzdENoaWxkQ1NTW1wiZmxvYXRcIl0gJiYgZmlyc3RDaGlsZENTU1tcImZsb2F0XCJdICE9PSAnbm9uZScpIHtcbiAgICAgIHZhciB0b3VjaGluZ1NpZGVDaGlsZDIgPSBmaXJzdENoaWxkQ1NTW1wiZmxvYXRcIl0gPT09ICdsZWZ0JyA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgICByZXR1cm4gY2hpbGQyICYmIChzZWNvbmRDaGlsZENTUy5jbGVhciA9PT0gJ2JvdGgnIHx8IHNlY29uZENoaWxkQ1NTLmNsZWFyID09PSB0b3VjaGluZ1NpZGVDaGlsZDIpID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJztcbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkMSAmJiAoZmlyc3RDaGlsZENTUy5kaXNwbGF5ID09PSAnYmxvY2snIHx8IGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ2ZsZXgnIHx8IGZpcnN0Q2hpbGRDU1MuZGlzcGxheSA9PT0gJ3RhYmxlJyB8fCBmaXJzdENoaWxkQ1NTLmRpc3BsYXkgPT09ICdncmlkJyB8fCBmaXJzdENoaWxkV2lkdGggPj0gZWxXaWR0aCAmJiBlbENTU1tDU1NGbG9hdFByb3BlcnR5XSA9PT0gJ25vbmUnIHx8IGNoaWxkMiAmJiBlbENTU1tDU1NGbG9hdFByb3BlcnR5XSA9PT0gJ25vbmUnICYmIGZpcnN0Q2hpbGRXaWR0aCArIHNlY29uZENoaWxkV2lkdGggPiBlbFdpZHRoKSA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG4gIH0sXG4gIF9kcmFnRWxJblJvd0NvbHVtbiA9IGZ1bmN0aW9uIF9kcmFnRWxJblJvd0NvbHVtbihkcmFnUmVjdCwgdGFyZ2V0UmVjdCwgdmVydGljYWwpIHtcbiAgICB2YXIgZHJhZ0VsUzFPcHAgPSB2ZXJ0aWNhbCA/IGRyYWdSZWN0LmxlZnQgOiBkcmFnUmVjdC50b3AsXG4gICAgICBkcmFnRWxTMk9wcCA9IHZlcnRpY2FsID8gZHJhZ1JlY3QucmlnaHQgOiBkcmFnUmVjdC5ib3R0b20sXG4gICAgICBkcmFnRWxPcHBMZW5ndGggPSB2ZXJ0aWNhbCA/IGRyYWdSZWN0LndpZHRoIDogZHJhZ1JlY3QuaGVpZ2h0LFxuICAgICAgdGFyZ2V0UzFPcHAgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QubGVmdCA6IHRhcmdldFJlY3QudG9wLFxuICAgICAgdGFyZ2V0UzJPcHAgPSB2ZXJ0aWNhbCA/IHRhcmdldFJlY3QucmlnaHQgOiB0YXJnZXRSZWN0LmJvdHRvbSxcbiAgICAgIHRhcmdldE9wcExlbmd0aCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC53aWR0aCA6IHRhcmdldFJlY3QuaGVpZ2h0O1xuICAgIHJldHVybiBkcmFnRWxTMU9wcCA9PT0gdGFyZ2V0UzFPcHAgfHwgZHJhZ0VsUzJPcHAgPT09IHRhcmdldFMyT3BwIHx8IGRyYWdFbFMxT3BwICsgZHJhZ0VsT3BwTGVuZ3RoIC8gMiA9PT0gdGFyZ2V0UzFPcHAgKyB0YXJnZXRPcHBMZW5ndGggLyAyO1xuICB9LFxuICAvKipcclxuICAgKiBEZXRlY3RzIGZpcnN0IG5lYXJlc3QgZW1wdHkgc29ydGFibGUgdG8gWCBhbmQgWSBwb3NpdGlvbiB1c2luZyBlbXB0eUluc2VydFRocmVzaG9sZC5cclxuICAgKiBAcGFyYW0gIHtOdW1iZXJ9IHggICAgICBYIHBvc2l0aW9uXHJcbiAgICogQHBhcmFtICB7TnVtYmVyfSB5ICAgICAgWSBwb3NpdGlvblxyXG4gICAqIEByZXR1cm4ge0hUTUxFbGVtZW50fSAgIEVsZW1lbnQgb2YgdGhlIGZpcnN0IGZvdW5kIG5lYXJlc3QgU29ydGFibGVcclxuICAgKi9cbiAgX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlID0gZnVuY3Rpb24gX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlKHgsIHkpIHtcbiAgICB2YXIgcmV0O1xuICAgIHNvcnRhYmxlcy5zb21lKGZ1bmN0aW9uIChzb3J0YWJsZSkge1xuICAgICAgdmFyIHRocmVzaG9sZCA9IHNvcnRhYmxlW2V4cGFuZG9dLm9wdGlvbnMuZW1wdHlJbnNlcnRUaHJlc2hvbGQ7XG4gICAgICBpZiAoIXRocmVzaG9sZCB8fCBsYXN0Q2hpbGQoc29ydGFibGUpKSByZXR1cm47XG4gICAgICB2YXIgcmVjdCA9IGdldFJlY3Qoc29ydGFibGUpLFxuICAgICAgICBpbnNpZGVIb3Jpem9udGFsbHkgPSB4ID49IHJlY3QubGVmdCAtIHRocmVzaG9sZCAmJiB4IDw9IHJlY3QucmlnaHQgKyB0aHJlc2hvbGQsXG4gICAgICAgIGluc2lkZVZlcnRpY2FsbHkgPSB5ID49IHJlY3QudG9wIC0gdGhyZXNob2xkICYmIHkgPD0gcmVjdC5ib3R0b20gKyB0aHJlc2hvbGQ7XG4gICAgICBpZiAoaW5zaWRlSG9yaXpvbnRhbGx5ICYmIGluc2lkZVZlcnRpY2FsbHkpIHtcbiAgICAgICAgcmV0dXJuIHJldCA9IHNvcnRhYmxlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiByZXQ7XG4gIH0sXG4gIF9wcmVwYXJlR3JvdXAgPSBmdW5jdGlvbiBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpIHtcbiAgICBmdW5jdGlvbiB0b0ZuKHZhbHVlLCBwdWxsKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKHRvLCBmcm9tLCBkcmFnRWwsIGV2dCkge1xuICAgICAgICB2YXIgc2FtZUdyb3VwID0gdG8ub3B0aW9ucy5ncm91cC5uYW1lICYmIGZyb20ub3B0aW9ucy5ncm91cC5uYW1lICYmIHRvLm9wdGlvbnMuZ3JvdXAubmFtZSA9PT0gZnJvbS5vcHRpb25zLmdyb3VwLm5hbWU7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIChwdWxsIHx8IHNhbWVHcm91cCkpIHtcbiAgICAgICAgICAvLyBEZWZhdWx0IHB1bGwgdmFsdWVcbiAgICAgICAgICAvLyBEZWZhdWx0IHB1bGwgYW5kIHB1dCB2YWx1ZSBpZiBzYW1lIGdyb3VwXG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAocHVsbCAmJiB2YWx1ZSA9PT0gJ2Nsb25lJykge1xuICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gdG9Gbih2YWx1ZSh0bywgZnJvbSwgZHJhZ0VsLCBldnQpLCBwdWxsKSh0bywgZnJvbSwgZHJhZ0VsLCBldnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBvdGhlckdyb3VwID0gKHB1bGwgPyB0byA6IGZyb20pLm9wdGlvbnMuZ3JvdXAubmFtZTtcbiAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSA9PT0gb3RoZXJHcm91cCB8fCB2YWx1ZS5qb2luICYmIHZhbHVlLmluZGV4T2Yob3RoZXJHcm91cCkgPiAtMTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgdmFyIGdyb3VwID0ge307XG4gICAgdmFyIG9yaWdpbmFsR3JvdXAgPSBvcHRpb25zLmdyb3VwO1xuICAgIGlmICghb3JpZ2luYWxHcm91cCB8fCBfdHlwZW9mKG9yaWdpbmFsR3JvdXApICE9ICdvYmplY3QnKSB7XG4gICAgICBvcmlnaW5hbEdyb3VwID0ge1xuICAgICAgICBuYW1lOiBvcmlnaW5hbEdyb3VwXG4gICAgICB9O1xuICAgIH1cbiAgICBncm91cC5uYW1lID0gb3JpZ2luYWxHcm91cC5uYW1lO1xuICAgIGdyb3VwLmNoZWNrUHVsbCA9IHRvRm4ob3JpZ2luYWxHcm91cC5wdWxsLCB0cnVlKTtcbiAgICBncm91cC5jaGVja1B1dCA9IHRvRm4ob3JpZ2luYWxHcm91cC5wdXQpO1xuICAgIGdyb3VwLnJldmVydENsb25lID0gb3JpZ2luYWxHcm91cC5yZXZlcnRDbG9uZTtcbiAgICBvcHRpb25zLmdyb3VwID0gZ3JvdXA7XG4gIH0sXG4gIF9oaWRlR2hvc3RGb3JUYXJnZXQgPSBmdW5jdGlvbiBfaGlkZUdob3N0Rm9yVGFyZ2V0KCkge1xuICAgIGlmICghc3VwcG9ydENzc1BvaW50ZXJFdmVudHMgJiYgZ2hvc3RFbCkge1xuICAgICAgY3NzKGdob3N0RWwsICdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICB9XG4gIH0sXG4gIF91bmhpZGVHaG9zdEZvclRhcmdldCA9IGZ1bmN0aW9uIF91bmhpZGVHaG9zdEZvclRhcmdldCgpIHtcbiAgICBpZiAoIXN1cHBvcnRDc3NQb2ludGVyRXZlbnRzICYmIGdob3N0RWwpIHtcbiAgICAgIGNzcyhnaG9zdEVsLCAnZGlzcGxheScsICcnKTtcbiAgICB9XG4gIH07XG5cbi8vICMxMTg0IGZpeCAtIFByZXZlbnQgY2xpY2sgZXZlbnQgb24gZmFsbGJhY2sgaWYgZHJhZ2dlZCBidXQgaXRlbSBub3QgY2hhbmdlZCBwb3NpdGlvblxuaWYgKGRvY3VtZW50RXhpc3RzICYmICFDaHJvbWVGb3JBbmRyb2lkKSB7XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2dCkge1xuICAgIGlmIChpZ25vcmVOZXh0Q2xpY2spIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZ0LnN0b3BQcm9wYWdhdGlvbiAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBldnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uICYmIGV2dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIGlnbm9yZU5leHRDbGljayA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG59XG52YXIgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQgPSBmdW5jdGlvbiBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudChldnQpIHtcbiAgaWYgKGRyYWdFbCkge1xuICAgIGV2dCA9IGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQ7XG4gICAgdmFyIG5lYXJlc3QgPSBfZGV0ZWN0TmVhcmVzdEVtcHR5U29ydGFibGUoZXZ0LmNsaWVudFgsIGV2dC5jbGllbnRZKTtcbiAgICBpZiAobmVhcmVzdCkge1xuICAgICAgLy8gQ3JlYXRlIGltaXRhdGlvbiBldmVudFxuICAgICAgdmFyIGV2ZW50ID0ge307XG4gICAgICBmb3IgKHZhciBpIGluIGV2dCkge1xuICAgICAgICBpZiAoZXZ0Lmhhc093blByb3BlcnR5KGkpKSB7XG4gICAgICAgICAgZXZlbnRbaV0gPSBldnRbaV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGV2ZW50LnRhcmdldCA9IGV2ZW50LnJvb3RFbCA9IG5lYXJlc3Q7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCA9IHZvaWQgMDtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbiA9IHZvaWQgMDtcbiAgICAgIG5lYXJlc3RbZXhwYW5kb10uX29uRHJhZ092ZXIoZXZlbnQpO1xuICAgIH1cbiAgfVxufTtcbnZhciBfY2hlY2tPdXRzaWRlVGFyZ2V0RWwgPSBmdW5jdGlvbiBfY2hlY2tPdXRzaWRlVGFyZ2V0RWwoZXZ0KSB7XG4gIGlmIChkcmFnRWwpIHtcbiAgICBkcmFnRWwucGFyZW50Tm9kZVtleHBhbmRvXS5faXNPdXRzaWRlVGhpc0VsKGV2dC50YXJnZXQpO1xuICB9XG59O1xuXG4vKipcclxuICogQGNsYXNzICBTb3J0YWJsZVxyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gIGVsXHJcbiAqIEBwYXJhbSAge09iamVjdH0gICAgICAgW29wdGlvbnNdXHJcbiAqL1xuZnVuY3Rpb24gU29ydGFibGUoZWwsIG9wdGlvbnMpIHtcbiAgaWYgKCEoZWwgJiYgZWwubm9kZVR5cGUgJiYgZWwubm9kZVR5cGUgPT09IDEpKSB7XG4gICAgdGhyb3cgXCJTb3J0YWJsZTogYGVsYCBtdXN0IGJlIGFuIEhUTUxFbGVtZW50LCBub3QgXCIuY29uY2F0KHt9LnRvU3RyaW5nLmNhbGwoZWwpKTtcbiAgfVxuICB0aGlzLmVsID0gZWw7IC8vIHJvb3QgZWxlbWVudFxuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID0gX2V4dGVuZHMoe30sIG9wdGlvbnMpO1xuXG4gIC8vIEV4cG9ydCBpbnN0YW5jZVxuICBlbFtleHBhbmRvXSA9IHRoaXM7XG4gIHZhciBkZWZhdWx0cyA9IHtcbiAgICBncm91cDogbnVsbCxcbiAgICBzb3J0OiB0cnVlLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBzdG9yZTogbnVsbCxcbiAgICBoYW5kbGU6IG51bGwsXG4gICAgZHJhZ2dhYmxlOiAvXlt1b11sJC9pLnRlc3QoZWwubm9kZU5hbWUpID8gJz5saScgOiAnPionLFxuICAgIHN3YXBUaHJlc2hvbGQ6IDEsXG4gICAgLy8gcGVyY2VudGFnZTsgMCA8PSB4IDw9IDFcbiAgICBpbnZlcnRTd2FwOiBmYWxzZSxcbiAgICAvLyBpbnZlcnQgYWx3YXlzXG4gICAgaW52ZXJ0ZWRTd2FwVGhyZXNob2xkOiBudWxsLFxuICAgIC8vIHdpbGwgYmUgc2V0IHRvIHNhbWUgYXMgc3dhcFRocmVzaG9sZCBpZiBkZWZhdWx0XG4gICAgcmVtb3ZlQ2xvbmVPbkhpZGU6IHRydWUsXG4gICAgZGlyZWN0aW9uOiBmdW5jdGlvbiBkaXJlY3Rpb24oKSB7XG4gICAgICByZXR1cm4gX2RldGVjdERpcmVjdGlvbihlbCwgdGhpcy5vcHRpb25zKTtcbiAgICB9LFxuICAgIGdob3N0Q2xhc3M6ICdzb3J0YWJsZS1naG9zdCcsXG4gICAgY2hvc2VuQ2xhc3M6ICdzb3J0YWJsZS1jaG9zZW4nLFxuICAgIGRyYWdDbGFzczogJ3NvcnRhYmxlLWRyYWcnLFxuICAgIGlnbm9yZTogJ2EsIGltZycsXG4gICAgZmlsdGVyOiBudWxsLFxuICAgIHByZXZlbnRPbkZpbHRlcjogdHJ1ZSxcbiAgICBhbmltYXRpb246IDAsXG4gICAgZWFzaW5nOiBudWxsLFxuICAgIHNldERhdGE6IGZ1bmN0aW9uIHNldERhdGEoZGF0YVRyYW5zZmVyLCBkcmFnRWwpIHtcbiAgICAgIGRhdGFUcmFuc2Zlci5zZXREYXRhKCdUZXh0JywgZHJhZ0VsLnRleHRDb250ZW50KTtcbiAgICB9LFxuICAgIGRyb3BCdWJibGU6IGZhbHNlLFxuICAgIGRyYWdvdmVyQnViYmxlOiBmYWxzZSxcbiAgICBkYXRhSWRBdHRyOiAnZGF0YS1pZCcsXG4gICAgZGVsYXk6IDAsXG4gICAgZGVsYXlPblRvdWNoT25seTogZmFsc2UsXG4gICAgdG91Y2hTdGFydFRocmVzaG9sZDogKE51bWJlci5wYXJzZUludCA/IE51bWJlciA6IHdpbmRvdykucGFyc2VJbnQod2luZG93LmRldmljZVBpeGVsUmF0aW8sIDEwKSB8fCAxLFxuICAgIGZvcmNlRmFsbGJhY2s6IGZhbHNlLFxuICAgIGZhbGxiYWNrQ2xhc3M6ICdzb3J0YWJsZS1mYWxsYmFjaycsXG4gICAgZmFsbGJhY2tPbkJvZHk6IGZhbHNlLFxuICAgIGZhbGxiYWNrVG9sZXJhbmNlOiAwLFxuICAgIGZhbGxiYWNrT2Zmc2V0OiB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMFxuICAgIH0sXG4gICAgc3VwcG9ydFBvaW50ZXI6IFNvcnRhYmxlLnN1cHBvcnRQb2ludGVyICE9PSBmYWxzZSAmJiAnUG9pbnRlckV2ZW50JyBpbiB3aW5kb3cgJiYgIVNhZmFyaSxcbiAgICBlbXB0eUluc2VydFRocmVzaG9sZDogNVxuICB9O1xuICBQbHVnaW5NYW5hZ2VyLmluaXRpYWxpemVQbHVnaW5zKHRoaXMsIGVsLCBkZWZhdWx0cyk7XG5cbiAgLy8gU2V0IGRlZmF1bHQgb3B0aW9uc1xuICBmb3IgKHZhciBuYW1lIGluIGRlZmF1bHRzKSB7XG4gICAgIShuYW1lIGluIG9wdGlvbnMpICYmIChvcHRpb25zW25hbWVdID0gZGVmYXVsdHNbbmFtZV0pO1xuICB9XG4gIF9wcmVwYXJlR3JvdXAob3B0aW9ucyk7XG5cbiAgLy8gQmluZCBhbGwgcHJpdmF0ZSBtZXRob2RzXG4gIGZvciAodmFyIGZuIGluIHRoaXMpIHtcbiAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ZuXSA9IHRoaXNbZm5dLmJpbmQodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0dXAgZHJhZyBtb2RlXG4gIHRoaXMubmF0aXZlRHJhZ2dhYmxlID0gb3B0aW9ucy5mb3JjZUZhbGxiYWNrID8gZmFsc2UgOiBzdXBwb3J0RHJhZ2dhYmxlO1xuICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAvLyBUb3VjaCBzdGFydCB0aHJlc2hvbGQgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbmF0aXZlIGRyYWdzdGFydCB0aHJlc2hvbGRcbiAgICB0aGlzLm9wdGlvbnMudG91Y2hTdGFydFRocmVzaG9sZCA9IDE7XG4gIH1cblxuICAvLyBCaW5kIGV2ZW50c1xuICBpZiAob3B0aW9ucy5zdXBwb3J0UG9pbnRlcikge1xuICAgIG9uKGVsLCAncG9pbnRlcmRvd24nLCB0aGlzLl9vblRhcFN0YXJ0KTtcbiAgfSBlbHNlIHtcbiAgICBvbihlbCwgJ21vdXNlZG93bicsIHRoaXMuX29uVGFwU3RhcnQpO1xuICAgIG9uKGVsLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVGFwU3RhcnQpO1xuICB9XG4gIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgIG9uKGVsLCAnZHJhZ292ZXInLCB0aGlzKTtcbiAgICBvbihlbCwgJ2RyYWdlbnRlcicsIHRoaXMpO1xuICB9XG4gIHNvcnRhYmxlcy5wdXNoKHRoaXMuZWwpO1xuXG4gIC8vIFJlc3RvcmUgc29ydGluZ1xuICBvcHRpb25zLnN0b3JlICYmIG9wdGlvbnMuc3RvcmUuZ2V0ICYmIHRoaXMuc29ydChvcHRpb25zLnN0b3JlLmdldCh0aGlzKSB8fCBbXSk7XG5cbiAgLy8gQWRkIGFuaW1hdGlvbiBzdGF0ZSBtYW5hZ2VyXG4gIF9leHRlbmRzKHRoaXMsIEFuaW1hdGlvblN0YXRlTWFuYWdlcigpKTtcbn1cblNvcnRhYmxlLnByb3RvdHlwZSA9IC8qKiBAbGVuZHMgU29ydGFibGUucHJvdG90eXBlICove1xuICBjb25zdHJ1Y3RvcjogU29ydGFibGUsXG4gIF9pc091dHNpZGVUaGlzRWw6IGZ1bmN0aW9uIF9pc091dHNpZGVUaGlzRWwodGFyZ2V0KSB7XG4gICAgaWYgKCF0aGlzLmVsLmNvbnRhaW5zKHRhcmdldCkgJiYgdGFyZ2V0ICE9PSB0aGlzLmVsKSB7XG4gICAgICBsYXN0VGFyZ2V0ID0gbnVsbDtcbiAgICB9XG4gIH0sXG4gIF9nZXREaXJlY3Rpb246IGZ1bmN0aW9uIF9nZXREaXJlY3Rpb24oZXZ0LCB0YXJnZXQpIHtcbiAgICByZXR1cm4gdHlwZW9mIHRoaXMub3B0aW9ucy5kaXJlY3Rpb24gPT09ICdmdW5jdGlvbicgPyB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uLmNhbGwodGhpcywgZXZ0LCB0YXJnZXQsIGRyYWdFbCkgOiB0aGlzLm9wdGlvbnMuZGlyZWN0aW9uO1xuICB9LFxuICBfb25UYXBTdGFydDogZnVuY3Rpb24gX29uVGFwU3RhcnQoIC8qKiBFdmVudHxUb3VjaEV2ZW50ICovZXZ0KSB7XG4gICAgaWYgKCFldnQuY2FuY2VsYWJsZSkgcmV0dXJuO1xuICAgIHZhciBfdGhpcyA9IHRoaXMsXG4gICAgICBlbCA9IHRoaXMuZWwsXG4gICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgcHJldmVudE9uRmlsdGVyID0gb3B0aW9ucy5wcmV2ZW50T25GaWx0ZXIsXG4gICAgICB0eXBlID0gZXZ0LnR5cGUsXG4gICAgICB0b3VjaCA9IGV2dC50b3VjaGVzICYmIGV2dC50b3VjaGVzWzBdIHx8IGV2dC5wb2ludGVyVHlwZSAmJiBldnQucG9pbnRlclR5cGUgPT09ICd0b3VjaCcgJiYgZXZ0LFxuICAgICAgdGFyZ2V0ID0gKHRvdWNoIHx8IGV2dCkudGFyZ2V0LFxuICAgICAgb3JpZ2luYWxUYXJnZXQgPSBldnQudGFyZ2V0LnNoYWRvd1Jvb3QgJiYgKGV2dC5wYXRoICYmIGV2dC5wYXRoWzBdIHx8IGV2dC5jb21wb3NlZFBhdGggJiYgZXZ0LmNvbXBvc2VkUGF0aCgpWzBdKSB8fCB0YXJnZXQsXG4gICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICBfc2F2ZUlucHV0Q2hlY2tlZFN0YXRlKGVsKTtcblxuICAgIC8vIERvbid0IHRyaWdnZXIgc3RhcnQgZXZlbnQgd2hlbiBhbiBlbGVtZW50IGlzIGJlZW4gZHJhZ2dlZCwgb3RoZXJ3aXNlIHRoZSBldnQub2xkaW5kZXggYWx3YXlzIHdyb25nIHdoZW4gc2V0IG9wdGlvbi5ncm91cC5cbiAgICBpZiAoZHJhZ0VsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICgvbW91c2Vkb3dufHBvaW50ZXJkb3duLy50ZXN0KHR5cGUpICYmIGV2dC5idXR0b24gIT09IDAgfHwgb3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuOyAvLyBvbmx5IGxlZnQgYnV0dG9uIGFuZCBlbmFibGVkXG4gICAgfVxuXG4gICAgLy8gY2FuY2VsIGRuZCBpZiBvcmlnaW5hbCB0YXJnZXQgaXMgY29udGVudCBlZGl0YWJsZVxuICAgIGlmIChvcmlnaW5hbFRhcmdldC5pc0NvbnRlbnRFZGl0YWJsZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFNhZmFyaSBpZ25vcmVzIGZ1cnRoZXIgZXZlbnQgaGFuZGxpbmcgYWZ0ZXIgbW91c2Vkb3duXG4gICAgaWYgKCF0aGlzLm5hdGl2ZURyYWdnYWJsZSAmJiBTYWZhcmkgJiYgdGFyZ2V0ICYmIHRhcmdldC50YWdOYW1lLnRvVXBwZXJDYXNlKCkgPT09ICdTRUxFQ1QnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRhcmdldCA9IGNsb3Nlc3QodGFyZ2V0LCBvcHRpb25zLmRyYWdnYWJsZSwgZWwsIGZhbHNlKTtcbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5hbmltYXRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAobGFzdERvd25FbCA9PT0gdGFyZ2V0KSB7XG4gICAgICAvLyBJZ25vcmluZyBkdXBsaWNhdGUgYGRvd25gXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgZHJhZ2dlZCBlbGVtZW50IHdpdGhpbiBpdHMgcGFyZW50XG4gICAgb2xkSW5kZXggPSBpbmRleCh0YXJnZXQpO1xuICAgIG9sZERyYWdnYWJsZUluZGV4ID0gaW5kZXgodGFyZ2V0LCBvcHRpb25zLmRyYWdnYWJsZSk7XG5cbiAgICAvLyBDaGVjayBmaWx0ZXJcbiAgICBpZiAodHlwZW9mIGZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGZpbHRlci5jYWxsKHRoaXMsIGV2dCwgdGFyZ2V0LCB0aGlzKSkge1xuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgIHJvb3RFbDogb3JpZ2luYWxUYXJnZXQsXG4gICAgICAgICAgbmFtZTogJ2ZpbHRlcicsXG4gICAgICAgICAgdGFyZ2V0RWw6IHRhcmdldCxcbiAgICAgICAgICB0b0VsOiBlbCxcbiAgICAgICAgICBmcm9tRWw6IGVsXG4gICAgICAgIH0pO1xuICAgICAgICBwbHVnaW5FdmVudCgnZmlsdGVyJywgX3RoaXMsIHtcbiAgICAgICAgICBldnQ6IGV2dFxuICAgICAgICB9KTtcbiAgICAgICAgcHJldmVudE9uRmlsdGVyICYmIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47IC8vIGNhbmNlbCBkbmRcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpbHRlcikge1xuICAgICAgZmlsdGVyID0gZmlsdGVyLnNwbGl0KCcsJykuc29tZShmdW5jdGlvbiAoY3JpdGVyaWEpIHtcbiAgICAgICAgY3JpdGVyaWEgPSBjbG9zZXN0KG9yaWdpbmFsVGFyZ2V0LCBjcml0ZXJpYS50cmltKCksIGVsLCBmYWxzZSk7XG4gICAgICAgIGlmIChjcml0ZXJpYSkge1xuICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiBfdGhpcyxcbiAgICAgICAgICAgIHJvb3RFbDogY3JpdGVyaWEsXG4gICAgICAgICAgICBuYW1lOiAnZmlsdGVyJyxcbiAgICAgICAgICAgIHRhcmdldEVsOiB0YXJnZXQsXG4gICAgICAgICAgICBmcm9tRWw6IGVsLFxuICAgICAgICAgICAgdG9FbDogZWxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwbHVnaW5FdmVudCgnZmlsdGVyJywgX3RoaXMsIHtcbiAgICAgICAgICAgIGV2dDogZXZ0XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICBwcmV2ZW50T25GaWx0ZXIgJiYgZXZ0LmNhbmNlbGFibGUgJiYgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybjsgLy8gY2FuY2VsIGRuZFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAob3B0aW9ucy5oYW5kbGUgJiYgIWNsb3Nlc3Qob3JpZ2luYWxUYXJnZXQsIG9wdGlvbnMuaGFuZGxlLCBlbCwgZmFsc2UpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBgZHJhZ3N0YXJ0YFxuICAgIHRoaXMuX3ByZXBhcmVEcmFnU3RhcnQoZXZ0LCB0b3VjaCwgdGFyZ2V0KTtcbiAgfSxcbiAgX3ByZXBhcmVEcmFnU3RhcnQ6IGZ1bmN0aW9uIF9wcmVwYXJlRHJhZ1N0YXJ0KCAvKiogRXZlbnQgKi9ldnQsIC8qKiBUb3VjaCAqL3RvdWNoLCAvKiogSFRNTEVsZW1lbnQgKi90YXJnZXQpIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzLFxuICAgICAgZWwgPSBfdGhpcy5lbCxcbiAgICAgIG9wdGlvbnMgPSBfdGhpcy5vcHRpb25zLFxuICAgICAgb3duZXJEb2N1bWVudCA9IGVsLm93bmVyRG9jdW1lbnQsXG4gICAgICBkcmFnU3RhcnRGbjtcbiAgICBpZiAodGFyZ2V0ICYmICFkcmFnRWwgJiYgdGFyZ2V0LnBhcmVudE5vZGUgPT09IGVsKSB7XG4gICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICByb290RWwgPSBlbDtcbiAgICAgIGRyYWdFbCA9IHRhcmdldDtcbiAgICAgIHBhcmVudEVsID0gZHJhZ0VsLnBhcmVudE5vZGU7XG4gICAgICBuZXh0RWwgPSBkcmFnRWwubmV4dFNpYmxpbmc7XG4gICAgICBsYXN0RG93bkVsID0gdGFyZ2V0O1xuICAgICAgYWN0aXZlR3JvdXAgPSBvcHRpb25zLmdyb3VwO1xuICAgICAgU29ydGFibGUuZHJhZ2dlZCA9IGRyYWdFbDtcbiAgICAgIHRhcEV2dCA9IHtcbiAgICAgICAgdGFyZ2V0OiBkcmFnRWwsXG4gICAgICAgIGNsaWVudFg6ICh0b3VjaCB8fCBldnQpLmNsaWVudFgsXG4gICAgICAgIGNsaWVudFk6ICh0b3VjaCB8fCBldnQpLmNsaWVudFlcbiAgICAgIH07XG4gICAgICB0YXBEaXN0YW5jZUxlZnQgPSB0YXBFdnQuY2xpZW50WCAtIGRyYWdSZWN0LmxlZnQ7XG4gICAgICB0YXBEaXN0YW5jZVRvcCA9IHRhcEV2dC5jbGllbnRZIC0gZHJhZ1JlY3QudG9wO1xuICAgICAgdGhpcy5fbGFzdFggPSAodG91Y2ggfHwgZXZ0KS5jbGllbnRYO1xuICAgICAgdGhpcy5fbGFzdFkgPSAodG91Y2ggfHwgZXZ0KS5jbGllbnRZO1xuICAgICAgZHJhZ0VsLnN0eWxlWyd3aWxsLWNoYW5nZSddID0gJ2FsbCc7XG4gICAgICBkcmFnU3RhcnRGbiA9IGZ1bmN0aW9uIGRyYWdTdGFydEZuKCkge1xuICAgICAgICBwbHVnaW5FdmVudCgnZGVsYXlFbmRlZCcsIF90aGlzLCB7XG4gICAgICAgICAgZXZ0OiBldnRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICAgICAgX3RoaXMuX29uRHJvcCgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBEZWxheWVkIGRyYWcgaGFzIGJlZW4gdHJpZ2dlcmVkXG4gICAgICAgIC8vIHdlIGNhbiByZS1lbmFibGUgdGhlIGV2ZW50czogdG91Y2htb3ZlL21vdXNlbW92ZVxuICAgICAgICBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnRXZlbnRzKCk7XG4gICAgICAgIGlmICghRmlyZUZveCAmJiBfdGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgICBkcmFnRWwuZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJpbmQgdGhlIGV2ZW50czogZHJhZ3N0YXJ0L2RyYWdlbmRcbiAgICAgICAgX3RoaXMuX3RyaWdnZXJEcmFnU3RhcnQoZXZ0LCB0b3VjaCk7XG5cbiAgICAgICAgLy8gRHJhZyBzdGFydCBldmVudFxuICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICAgIG5hbWU6ICdjaG9vc2UnLFxuICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaG9zZW4gaXRlbVxuICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuY2hvc2VuQ2xhc3MsIHRydWUpO1xuICAgICAgfTtcblxuICAgICAgLy8gRGlzYWJsZSBcImRyYWdnYWJsZVwiXG4gICAgICBvcHRpb25zLmlnbm9yZS5zcGxpdCgnLCcpLmZvckVhY2goZnVuY3Rpb24gKGNyaXRlcmlhKSB7XG4gICAgICAgIGZpbmQoZHJhZ0VsLCBjcml0ZXJpYS50cmltKCksIF9kaXNhYmxlRHJhZ2dhYmxlKTtcbiAgICAgIH0pO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ2RyYWdvdmVyJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ21vdXNlbW92ZScsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICAgIG9uKG93bmVyRG9jdW1lbnQsICd0b3VjaG1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoZW5kJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCBfdGhpcy5fb25Ecm9wKTtcblxuICAgICAgLy8gTWFrZSBkcmFnRWwgZHJhZ2dhYmxlIChtdXN0IGJlIGJlZm9yZSBkZWxheSBmb3IgRmlyZUZveClcbiAgICAgIGlmIChGaXJlRm94ICYmIHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy50b3VjaFN0YXJ0VGhyZXNob2xkID0gNDtcbiAgICAgICAgZHJhZ0VsLmRyYWdnYWJsZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBwbHVnaW5FdmVudCgnZGVsYXlTdGFydCcsIHRoaXMsIHtcbiAgICAgICAgZXZ0OiBldnRcbiAgICAgIH0pO1xuXG4gICAgICAvLyBEZWxheSBpcyBpbXBvc3NpYmxlIGZvciBuYXRpdmUgRG5EIGluIEVkZ2Ugb3IgSUVcbiAgICAgIGlmIChvcHRpb25zLmRlbGF5ICYmICghb3B0aW9ucy5kZWxheU9uVG91Y2hPbmx5IHx8IHRvdWNoKSAmJiAoIXRoaXMubmF0aXZlRHJhZ2dhYmxlIHx8ICEoRWRnZSB8fCBJRTExT3JMZXNzKSkpIHtcbiAgICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgICAgICB0aGlzLl9vbkRyb3AoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIHVzZXIgbW92ZXMgdGhlIHBvaW50ZXIgb3IgbGV0IGdvIHRoZSBjbGljayBvciB0b3VjaFxuICAgICAgICAvLyBiZWZvcmUgdGhlIGRlbGF5IGhhcyBiZWVuIHJlYWNoZWQ6XG4gICAgICAgIC8vIGRpc2FibGUgdGhlIGRlbGF5ZWQgZHJhZ1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAnbW91c2V1cCcsIF90aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgICAgICBvbihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCBfdGhpcy5fZGlzYWJsZURlbGF5ZWREcmFnKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgX3RoaXMuX2Rpc2FibGVEZWxheWVkRHJhZyk7XG4gICAgICAgIG9uKG93bmVyRG9jdW1lbnQsICdtb3VzZW1vdmUnLCBfdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICAgICAgb24ob3duZXJEb2N1bWVudCwgJ3RvdWNobW92ZScsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICBvcHRpb25zLnN1cHBvcnRQb2ludGVyICYmIG9uKG93bmVyRG9jdW1lbnQsICdwb2ludGVybW92ZScsIF90aGlzLl9kZWxheWVkRHJhZ1RvdWNoTW92ZUhhbmRsZXIpO1xuICAgICAgICBfdGhpcy5fZHJhZ1N0YXJ0VGltZXIgPSBzZXRUaW1lb3V0KGRyYWdTdGFydEZuLCBvcHRpb25zLmRlbGF5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRyYWdTdGFydEZuKCk7XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBfZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyOiBmdW5jdGlvbiBfZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKCAvKiogVG91Y2hFdmVudHxQb2ludGVyRXZlbnQgKiovZSkge1xuICAgIHZhciB0b3VjaCA9IGUudG91Y2hlcyA/IGUudG91Y2hlc1swXSA6IGU7XG4gICAgaWYgKE1hdGgubWF4KE1hdGguYWJzKHRvdWNoLmNsaWVudFggLSB0aGlzLl9sYXN0WCksIE1hdGguYWJzKHRvdWNoLmNsaWVudFkgLSB0aGlzLl9sYXN0WSkpID49IE1hdGguZmxvb3IodGhpcy5vcHRpb25zLnRvdWNoU3RhcnRUaHJlc2hvbGQgLyAodGhpcy5uYXRpdmVEcmFnZ2FibGUgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8gfHwgMSkpKSB7XG4gICAgICB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcoKTtcbiAgICB9XG4gIH0sXG4gIF9kaXNhYmxlRGVsYXllZERyYWc6IGZ1bmN0aW9uIF9kaXNhYmxlRGVsYXllZERyYWcoKSB7XG4gICAgZHJhZ0VsICYmIF9kaXNhYmxlRHJhZ2dhYmxlKGRyYWdFbCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2RyYWdTdGFydFRpbWVyKTtcbiAgICB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWdFdmVudHMoKTtcbiAgfSxcbiAgX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50czogZnVuY3Rpb24gX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHRoaXMuZWwub3duZXJEb2N1bWVudDtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCB0aGlzLl9kaXNhYmxlRGVsYXllZERyYWcpO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fZGVsYXllZERyYWdUb3VjaE1vdmVIYW5kbGVyKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gICAgb2ZmKG93bmVyRG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX2RlbGF5ZWREcmFnVG91Y2hNb3ZlSGFuZGxlcik7XG4gIH0sXG4gIF90cmlnZ2VyRHJhZ1N0YXJ0OiBmdW5jdGlvbiBfdHJpZ2dlckRyYWdTdGFydCggLyoqIEV2ZW50ICovZXZ0LCAvKiogVG91Y2ggKi90b3VjaCkge1xuICAgIHRvdWNoID0gdG91Y2ggfHwgZXZ0LnBvaW50ZXJUeXBlID09ICd0b3VjaCcgJiYgZXZ0O1xuICAgIGlmICghdGhpcy5uYXRpdmVEcmFnZ2FibGUgfHwgdG91Y2gpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIH0gZWxzZSBpZiAodG91Y2gpIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICd0b3VjaG1vdmUnLCB0aGlzLl9vblRvdWNoTW92ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvbihkb2N1bWVudCwgJ21vdXNlbW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgb24oZHJhZ0VsLCAnZHJhZ2VuZCcsIHRoaXMpO1xuICAgICAgb24ocm9vdEVsLCAnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgaWYgKGRvY3VtZW50LnNlbGVjdGlvbikge1xuICAgICAgICAvLyBUaW1lb3V0IG5lY2Nlc3NhcnkgZm9yIElFOVxuICAgICAgICBfbmV4dFRpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGRvY3VtZW50LnNlbGVjdGlvbi5lbXB0eSgpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKS5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHt9XG4gIH0sXG4gIF9kcmFnU3RhcnRlZDogZnVuY3Rpb24gX2RyYWdTdGFydGVkKGZhbGxiYWNrLCBldnQpIHtcbiAgICBhd2FpdGluZ0RyYWdTdGFydGVkID0gZmFsc2U7XG4gICAgaWYgKHJvb3RFbCAmJiBkcmFnRWwpIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdkcmFnU3RhcnRlZCcsIHRoaXMsIHtcbiAgICAgICAgZXZ0OiBldnRcbiAgICAgIH0pO1xuICAgICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAnZHJhZ292ZXInLCBfY2hlY2tPdXRzaWRlVGFyZ2V0RWwpO1xuICAgICAgfVxuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIC8vIEFwcGx5IGVmZmVjdFxuICAgICAgIWZhbGxiYWNrICYmIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5kcmFnQ2xhc3MsIGZhbHNlKTtcbiAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCwgb3B0aW9ucy5naG9zdENsYXNzLCB0cnVlKTtcbiAgICAgIFNvcnRhYmxlLmFjdGl2ZSA9IHRoaXM7XG4gICAgICBmYWxsYmFjayAmJiB0aGlzLl9hcHBlbmRHaG9zdCgpO1xuXG4gICAgICAvLyBEcmFnIHN0YXJ0IGV2ZW50XG4gICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICBuYW1lOiAnc3RhcnQnLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9udWxsaW5nKCk7XG4gICAgfVxuICB9LFxuICBfZW11bGF0ZURyYWdPdmVyOiBmdW5jdGlvbiBfZW11bGF0ZURyYWdPdmVyKCkge1xuICAgIGlmICh0b3VjaEV2dCkge1xuICAgICAgdGhpcy5fbGFzdFggPSB0b3VjaEV2dC5jbGllbnRYO1xuICAgICAgdGhpcy5fbGFzdFkgPSB0b3VjaEV2dC5jbGllbnRZO1xuICAgICAgX2hpZGVHaG9zdEZvclRhcmdldCgpO1xuICAgICAgdmFyIHRhcmdldCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQodG91Y2hFdnQuY2xpZW50WCwgdG91Y2hFdnQuY2xpZW50WSk7XG4gICAgICB2YXIgcGFyZW50ID0gdGFyZ2V0O1xuICAgICAgd2hpbGUgKHRhcmdldCAmJiB0YXJnZXQuc2hhZG93Um9vdCkge1xuICAgICAgICB0YXJnZXQgPSB0YXJnZXQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHRvdWNoRXZ0LmNsaWVudFgsIHRvdWNoRXZ0LmNsaWVudFkpO1xuICAgICAgICBpZiAodGFyZ2V0ID09PSBwYXJlbnQpIGJyZWFrO1xuICAgICAgICBwYXJlbnQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICBkcmFnRWwucGFyZW50Tm9kZVtleHBhbmRvXS5faXNPdXRzaWRlVGhpc0VsKHRhcmdldCk7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBpZiAocGFyZW50W2V4cGFuZG9dKSB7XG4gICAgICAgICAgICB2YXIgaW5zZXJ0ZWQgPSB2b2lkIDA7XG4gICAgICAgICAgICBpbnNlcnRlZCA9IHBhcmVudFtleHBhbmRvXS5fb25EcmFnT3Zlcih7XG4gICAgICAgICAgICAgIGNsaWVudFg6IHRvdWNoRXZ0LmNsaWVudFgsXG4gICAgICAgICAgICAgIGNsaWVudFk6IHRvdWNoRXZ0LmNsaWVudFksXG4gICAgICAgICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICAgICAgICByb290RWw6IHBhcmVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaW5zZXJ0ZWQgJiYgIXRoaXMub3B0aW9ucy5kcmFnb3ZlckJ1YmJsZSkge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGFyZ2V0ID0gcGFyZW50OyAvLyBzdG9yZSBsYXN0IGVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICAvKiBqc2hpbnQgYm9zczp0cnVlICovIHdoaWxlIChwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSk7XG4gICAgICB9XG4gICAgICBfdW5oaWRlR2hvc3RGb3JUYXJnZXQoKTtcbiAgICB9XG4gIH0sXG4gIF9vblRvdWNoTW92ZTogZnVuY3Rpb24gX29uVG91Y2hNb3ZlKCAvKipUb3VjaEV2ZW50Ki9ldnQpIHtcbiAgICBpZiAodGFwRXZ0KSB7XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgZmFsbGJhY2tUb2xlcmFuY2UgPSBvcHRpb25zLmZhbGxiYWNrVG9sZXJhbmNlLFxuICAgICAgICBmYWxsYmFja09mZnNldCA9IG9wdGlvbnMuZmFsbGJhY2tPZmZzZXQsXG4gICAgICAgIHRvdWNoID0gZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCxcbiAgICAgICAgZ2hvc3RNYXRyaXggPSBnaG9zdEVsICYmIG1hdHJpeChnaG9zdEVsLCB0cnVlKSxcbiAgICAgICAgc2NhbGVYID0gZ2hvc3RFbCAmJiBnaG9zdE1hdHJpeCAmJiBnaG9zdE1hdHJpeC5hLFxuICAgICAgICBzY2FsZVkgPSBnaG9zdEVsICYmIGdob3N0TWF0cml4ICYmIGdob3N0TWF0cml4LmQsXG4gICAgICAgIHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID0gUG9zaXRpb25HaG9zdEFic29sdXRlbHkgJiYgZ2hvc3RSZWxhdGl2ZVBhcmVudCAmJiBnZXRSZWxhdGl2ZVNjcm9sbE9mZnNldChnaG9zdFJlbGF0aXZlUGFyZW50KSxcbiAgICAgICAgZHggPSAodG91Y2guY2xpZW50WCAtIHRhcEV2dC5jbGllbnRYICsgZmFsbGJhY2tPZmZzZXQueCkgLyAoc2NhbGVYIHx8IDEpICsgKHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID8gcmVsYXRpdmVTY3JvbGxPZmZzZXRbMF0gLSBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbFswXSA6IDApIC8gKHNjYWxlWCB8fCAxKSxcbiAgICAgICAgZHkgPSAodG91Y2guY2xpZW50WSAtIHRhcEV2dC5jbGllbnRZICsgZmFsbGJhY2tPZmZzZXQueSkgLyAoc2NhbGVZIHx8IDEpICsgKHJlbGF0aXZlU2Nyb2xsT2Zmc2V0ID8gcmVsYXRpdmVTY3JvbGxPZmZzZXRbMV0gLSBnaG9zdFJlbGF0aXZlUGFyZW50SW5pdGlhbFNjcm9sbFsxXSA6IDApIC8gKHNjYWxlWSB8fCAxKTtcblxuICAgICAgLy8gb25seSBzZXQgdGhlIHN0YXR1cyB0byBkcmFnZ2luZywgd2hlbiB3ZSBhcmUgYWN0dWFsbHkgZHJhZ2dpbmdcbiAgICAgIGlmICghU29ydGFibGUuYWN0aXZlICYmICFhd2FpdGluZ0RyYWdTdGFydGVkKSB7XG4gICAgICAgIGlmIChmYWxsYmFja1RvbGVyYW5jZSAmJiBNYXRoLm1heChNYXRoLmFicyh0b3VjaC5jbGllbnRYIC0gdGhpcy5fbGFzdFgpLCBNYXRoLmFicyh0b3VjaC5jbGllbnRZIC0gdGhpcy5fbGFzdFkpKSA8IGZhbGxiYWNrVG9sZXJhbmNlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX29uRHJhZ1N0YXJ0KGV2dCwgdHJ1ZSk7XG4gICAgICB9XG4gICAgICBpZiAoZ2hvc3RFbCkge1xuICAgICAgICBpZiAoZ2hvc3RNYXRyaXgpIHtcbiAgICAgICAgICBnaG9zdE1hdHJpeC5lICs9IGR4IC0gKGxhc3REeCB8fCAwKTtcbiAgICAgICAgICBnaG9zdE1hdHJpeC5mICs9IGR5IC0gKGxhc3REeSB8fCAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBnaG9zdE1hdHJpeCA9IHtcbiAgICAgICAgICAgIGE6IDEsXG4gICAgICAgICAgICBiOiAwLFxuICAgICAgICAgICAgYzogMCxcbiAgICAgICAgICAgIGQ6IDEsXG4gICAgICAgICAgICBlOiBkeCxcbiAgICAgICAgICAgIGY6IGR5XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICB2YXIgY3NzTWF0cml4ID0gXCJtYXRyaXgoXCIuY29uY2F0KGdob3N0TWF0cml4LmEsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguYiwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5jLCBcIixcIikuY29uY2F0KGdob3N0TWF0cml4LmQsIFwiLFwiKS5jb25jYXQoZ2hvc3RNYXRyaXguZSwgXCIsXCIpLmNvbmNhdChnaG9zdE1hdHJpeC5mLCBcIilcIik7XG4gICAgICAgIGNzcyhnaG9zdEVsLCAnd2Via2l0VHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgY3NzKGdob3N0RWwsICdtb3pUcmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBjc3MoZ2hvc3RFbCwgJ21zVHJhbnNmb3JtJywgY3NzTWF0cml4KTtcbiAgICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0nLCBjc3NNYXRyaXgpO1xuICAgICAgICBsYXN0RHggPSBkeDtcbiAgICAgICAgbGFzdER5ID0gZHk7XG4gICAgICAgIHRvdWNoRXZ0ID0gdG91Y2g7XG4gICAgICB9XG4gICAgICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gIH0sXG4gIF9hcHBlbmRHaG9zdDogZnVuY3Rpb24gX2FwcGVuZEdob3N0KCkge1xuICAgIC8vIEJ1ZyBpZiB1c2luZyBzY2FsZSgpOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNjM3MDU4XG4gICAgLy8gTm90IGJlaW5nIGFkanVzdGVkIGZvclxuICAgIGlmICghZ2hvc3RFbCkge1xuICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMub3B0aW9ucy5mYWxsYmFja09uQm9keSA/IGRvY3VtZW50LmJvZHkgOiByb290RWwsXG4gICAgICAgIHJlY3QgPSBnZXRSZWN0KGRyYWdFbCwgdHJ1ZSwgUG9zaXRpb25HaG9zdEFic29sdXRlbHksIHRydWUsIGNvbnRhaW5lciksXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgIC8vIFBvc2l0aW9uIGFic29sdXRlbHlcbiAgICAgIGlmIChQb3NpdGlvbkdob3N0QWJzb2x1dGVseSkge1xuICAgICAgICAvLyBHZXQgcmVsYXRpdmVseSBwb3NpdGlvbmVkIHBhcmVudFxuICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50ID0gY29udGFpbmVyO1xuICAgICAgICB3aGlsZSAoY3NzKGdob3N0UmVsYXRpdmVQYXJlbnQsICdwb3NpdGlvbicpID09PSAnc3RhdGljJyAmJiBjc3MoZ2hvc3RSZWxhdGl2ZVBhcmVudCwgJ3RyYW5zZm9ybScpID09PSAnbm9uZScgJiYgZ2hvc3RSZWxhdGl2ZVBhcmVudCAhPT0gZG9jdW1lbnQpIHtcbiAgICAgICAgICBnaG9zdFJlbGF0aXZlUGFyZW50ID0gZ2hvc3RSZWxhdGl2ZVBhcmVudC5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChnaG9zdFJlbGF0aXZlUGFyZW50ICE9PSBkb2N1bWVudC5ib2R5ICYmIGdob3N0UmVsYXRpdmVQYXJlbnQgIT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgIGlmIChnaG9zdFJlbGF0aXZlUGFyZW50ID09PSBkb2N1bWVudCkgZ2hvc3RSZWxhdGl2ZVBhcmVudCA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgICAgICAgICByZWN0LnRvcCArPSBnaG9zdFJlbGF0aXZlUGFyZW50LnNjcm9sbFRvcDtcbiAgICAgICAgICByZWN0LmxlZnQgKz0gZ2hvc3RSZWxhdGl2ZVBhcmVudC5zY3JvbGxMZWZ0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGdob3N0UmVsYXRpdmVQYXJlbnQgPSBnZXRXaW5kb3dTY3JvbGxpbmdFbGVtZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgZ2hvc3RSZWxhdGl2ZVBhcmVudEluaXRpYWxTY3JvbGwgPSBnZXRSZWxhdGl2ZVNjcm9sbE9mZnNldChnaG9zdFJlbGF0aXZlUGFyZW50KTtcbiAgICAgIH1cbiAgICAgIGdob3N0RWwgPSBkcmFnRWwuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgdG9nZ2xlQ2xhc3MoZ2hvc3RFbCwgb3B0aW9ucy5naG9zdENsYXNzLCBmYWxzZSk7XG4gICAgICB0b2dnbGVDbGFzcyhnaG9zdEVsLCBvcHRpb25zLmZhbGxiYWNrQ2xhc3MsIHRydWUpO1xuICAgICAgdG9nZ2xlQ2xhc3MoZ2hvc3RFbCwgb3B0aW9ucy5kcmFnQ2xhc3MsIHRydWUpO1xuICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2l0aW9uJywgJycpO1xuICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0nLCAnJyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ2JveC1zaXppbmcnLCAnYm9yZGVyLWJveCcpO1xuICAgICAgY3NzKGdob3N0RWwsICdtYXJnaW4nLCAwKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAndG9wJywgcmVjdC50b3ApO1xuICAgICAgY3NzKGdob3N0RWwsICdsZWZ0JywgcmVjdC5sZWZ0KTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnd2lkdGgnLCByZWN0LndpZHRoKTtcbiAgICAgIGNzcyhnaG9zdEVsLCAnaGVpZ2h0JywgcmVjdC5oZWlnaHQpO1xuICAgICAgY3NzKGdob3N0RWwsICdvcGFjaXR5JywgJzAuOCcpO1xuICAgICAgY3NzKGdob3N0RWwsICdwb3NpdGlvbicsIFBvc2l0aW9uR2hvc3RBYnNvbHV0ZWx5ID8gJ2Fic29sdXRlJyA6ICdmaXhlZCcpO1xuICAgICAgY3NzKGdob3N0RWwsICd6SW5kZXgnLCAnMTAwMDAwJyk7XG4gICAgICBjc3MoZ2hvc3RFbCwgJ3BvaW50ZXJFdmVudHMnLCAnbm9uZScpO1xuICAgICAgU29ydGFibGUuZ2hvc3QgPSBnaG9zdEVsO1xuICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGdob3N0RWwpO1xuXG4gICAgICAvLyBTZXQgdHJhbnNmb3JtLW9yaWdpblxuICAgICAgY3NzKGdob3N0RWwsICd0cmFuc2Zvcm0tb3JpZ2luJywgdGFwRGlzdGFuY2VMZWZ0IC8gcGFyc2VJbnQoZ2hvc3RFbC5zdHlsZS53aWR0aCkgKiAxMDAgKyAnJSAnICsgdGFwRGlzdGFuY2VUb3AgLyBwYXJzZUludChnaG9zdEVsLnN0eWxlLmhlaWdodCkgKiAxMDAgKyAnJScpO1xuICAgIH1cbiAgfSxcbiAgX29uRHJhZ1N0YXJ0OiBmdW5jdGlvbiBfb25EcmFnU3RhcnQoIC8qKkV2ZW50Ki9ldnQsIC8qKmJvb2xlYW4qL2ZhbGxiYWNrKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICB2YXIgZGF0YVRyYW5zZmVyID0gZXZ0LmRhdGFUcmFuc2ZlcjtcbiAgICB2YXIgb3B0aW9ucyA9IF90aGlzLm9wdGlvbnM7XG4gICAgcGx1Z2luRXZlbnQoJ2RyYWdTdGFydCcsIHRoaXMsIHtcbiAgICAgIGV2dDogZXZ0XG4gICAgfSk7XG4gICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgIHRoaXMuX29uRHJvcCgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwbHVnaW5FdmVudCgnc2V0dXBDbG9uZScsIHRoaXMpO1xuICAgIGlmICghU29ydGFibGUuZXZlbnRDYW5jZWxlZCkge1xuICAgICAgY2xvbmVFbCA9IGNsb25lKGRyYWdFbCk7XG4gICAgICBjbG9uZUVsLnJlbW92ZUF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgY2xvbmVFbC5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICAgIGNsb25lRWwuc3R5bGVbJ3dpbGwtY2hhbmdlJ10gPSAnJztcbiAgICAgIHRoaXMuX2hpZGVDbG9uZSgpO1xuICAgICAgdG9nZ2xlQ2xhc3MoY2xvbmVFbCwgdGhpcy5vcHRpb25zLmNob3NlbkNsYXNzLCBmYWxzZSk7XG4gICAgICBTb3J0YWJsZS5jbG9uZSA9IGNsb25lRWw7XG4gICAgfVxuXG4gICAgLy8gIzExNDM6IElGcmFtZSBzdXBwb3J0IHdvcmthcm91bmRcbiAgICBfdGhpcy5jbG9uZUlkID0gX25leHRUaWNrKGZ1bmN0aW9uICgpIHtcbiAgICAgIHBsdWdpbkV2ZW50KCdjbG9uZScsIF90aGlzKTtcbiAgICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm47XG4gICAgICBpZiAoIV90aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUpIHtcbiAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShjbG9uZUVsLCBkcmFnRWwpO1xuICAgICAgfVxuICAgICAgX3RoaXMuX2hpZGVDbG9uZSgpO1xuICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICBzb3J0YWJsZTogX3RoaXMsXG4gICAgICAgIG5hbWU6ICdjbG9uZSdcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgICFmYWxsYmFjayAmJiB0b2dnbGVDbGFzcyhkcmFnRWwsIG9wdGlvbnMuZHJhZ0NsYXNzLCB0cnVlKTtcblxuICAgIC8vIFNldCBwcm9wZXIgZHJvcCBldmVudHNcbiAgICBpZiAoZmFsbGJhY2spIHtcbiAgICAgIGlnbm9yZU5leHRDbGljayA9IHRydWU7XG4gICAgICBfdGhpcy5fbG9vcElkID0gc2V0SW50ZXJ2YWwoX3RoaXMuX2VtdWxhdGVEcmFnT3ZlciwgNTApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBVbmRvIHdoYXQgd2FzIHNldCBpbiBfcHJlcGFyZURyYWdTdGFydCBiZWZvcmUgZHJhZyBzdGFydGVkXG4gICAgICBvZmYoZG9jdW1lbnQsICdtb3VzZXVwJywgX3RoaXMuX29uRHJvcCk7XG4gICAgICBvZmYoZG9jdW1lbnQsICd0b3VjaGVuZCcsIF90aGlzLl9vbkRyb3ApO1xuICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2hjYW5jZWwnLCBfdGhpcy5fb25Ecm9wKTtcbiAgICAgIGlmIChkYXRhVHJhbnNmZXIpIHtcbiAgICAgICAgZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7XG4gICAgICAgIG9wdGlvbnMuc2V0RGF0YSAmJiBvcHRpb25zLnNldERhdGEuY2FsbChfdGhpcywgZGF0YVRyYW5zZmVyLCBkcmFnRWwpO1xuICAgICAgfVxuICAgICAgb24oZG9jdW1lbnQsICdkcm9wJywgX3RoaXMpO1xuXG4gICAgICAvLyAjMTI3NiBmaXg6XG4gICAgICBjc3MoZHJhZ0VsLCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZVooMCknKTtcbiAgICB9XG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IHRydWU7XG4gICAgX3RoaXMuX2RyYWdTdGFydElkID0gX25leHRUaWNrKF90aGlzLl9kcmFnU3RhcnRlZC5iaW5kKF90aGlzLCBmYWxsYmFjaywgZXZ0KSk7XG4gICAgb24oZG9jdW1lbnQsICdzZWxlY3RzdGFydCcsIF90aGlzKTtcbiAgICBtb3ZlZCA9IHRydWU7XG4gICAgaWYgKFNhZmFyaSkge1xuICAgICAgY3NzKGRvY3VtZW50LmJvZHksICd1c2VyLXNlbGVjdCcsICdub25lJyk7XG4gICAgfVxuICB9LFxuICAvLyBSZXR1cm5zIHRydWUgLSBpZiBubyBmdXJ0aGVyIGFjdGlvbiBpcyBuZWVkZWQgKGVpdGhlciBpbnNlcnRlZCBvciBhbm90aGVyIGNvbmRpdGlvbilcbiAgX29uRHJhZ092ZXI6IGZ1bmN0aW9uIF9vbkRyYWdPdmVyKCAvKipFdmVudCovZXZ0KSB7XG4gICAgdmFyIGVsID0gdGhpcy5lbCxcbiAgICAgIHRhcmdldCA9IGV2dC50YXJnZXQsXG4gICAgICBkcmFnUmVjdCxcbiAgICAgIHRhcmdldFJlY3QsXG4gICAgICByZXZlcnQsXG4gICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgZ3JvdXAgPSBvcHRpb25zLmdyb3VwLFxuICAgICAgYWN0aXZlU29ydGFibGUgPSBTb3J0YWJsZS5hY3RpdmUsXG4gICAgICBpc093bmVyID0gYWN0aXZlR3JvdXAgPT09IGdyb3VwLFxuICAgICAgY2FuU29ydCA9IG9wdGlvbnMuc29ydCxcbiAgICAgIGZyb21Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IGFjdGl2ZVNvcnRhYmxlLFxuICAgICAgdmVydGljYWwsXG4gICAgICBfdGhpcyA9IHRoaXMsXG4gICAgICBjb21wbGV0ZWRGaXJlZCA9IGZhbHNlO1xuICAgIGlmIChfc2lsZW50KSByZXR1cm47XG4gICAgZnVuY3Rpb24gZHJhZ092ZXJFdmVudChuYW1lLCBleHRyYSkge1xuICAgICAgcGx1Z2luRXZlbnQobmFtZSwgX3RoaXMsIF9vYmplY3RTcHJlYWQyKHtcbiAgICAgICAgZXZ0OiBldnQsXG4gICAgICAgIGlzT3duZXI6IGlzT3duZXIsXG4gICAgICAgIGF4aXM6IHZlcnRpY2FsID8gJ3ZlcnRpY2FsJyA6ICdob3Jpem9udGFsJyxcbiAgICAgICAgcmV2ZXJ0OiByZXZlcnQsXG4gICAgICAgIGRyYWdSZWN0OiBkcmFnUmVjdCxcbiAgICAgICAgdGFyZ2V0UmVjdDogdGFyZ2V0UmVjdCxcbiAgICAgICAgY2FuU29ydDogY2FuU29ydCxcbiAgICAgICAgZnJvbVNvcnRhYmxlOiBmcm9tU29ydGFibGUsXG4gICAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgICBjb21wbGV0ZWQ6IGNvbXBsZXRlZCxcbiAgICAgICAgb25Nb3ZlOiBmdW5jdGlvbiBvbk1vdmUodGFyZ2V0LCBhZnRlcikge1xuICAgICAgICAgIHJldHVybiBfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgZ2V0UmVjdCh0YXJnZXQpLCBldnQsIGFmdGVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hhbmdlZDogY2hhbmdlZFxuICAgICAgfSwgZXh0cmEpKTtcbiAgICB9XG5cbiAgICAvLyBDYXB0dXJlIGFuaW1hdGlvbiBzdGF0ZVxuICAgIGZ1bmN0aW9uIGNhcHR1cmUoKSB7XG4gICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlckFuaW1hdGlvbkNhcHR1cmUnKTtcbiAgICAgIF90aGlzLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgaWYgKF90aGlzICE9PSBmcm9tU29ydGFibGUpIHtcbiAgICAgICAgZnJvbVNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybiBpbnZvY2F0aW9uIHdoZW4gZHJhZ0VsIGlzIGluc2VydGVkIChvciBjb21wbGV0ZWQpXG4gICAgZnVuY3Rpb24gY29tcGxldGVkKGluc2VydGlvbikge1xuICAgICAgZHJhZ092ZXJFdmVudCgnZHJhZ092ZXJDb21wbGV0ZWQnLCB7XG4gICAgICAgIGluc2VydGlvbjogaW5zZXJ0aW9uXG4gICAgICB9KTtcbiAgICAgIGlmIChpbnNlcnRpb24pIHtcbiAgICAgICAgLy8gQ2xvbmVzIG11c3QgYmUgaGlkZGVuIGJlZm9yZSBmb2xkaW5nIGFuaW1hdGlvbiB0byBjYXB0dXJlIGRyYWdSZWN0QWJzb2x1dGUgcHJvcGVybHlcbiAgICAgICAgaWYgKGlzT3duZXIpIHtcbiAgICAgICAgICBhY3RpdmVTb3J0YWJsZS5faGlkZUNsb25lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYWN0aXZlU29ydGFibGUuX3Nob3dDbG9uZShfdGhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF90aGlzICE9PSBmcm9tU29ydGFibGUpIHtcbiAgICAgICAgICAvLyBTZXQgZ2hvc3QgY2xhc3MgdG8gbmV3IHNvcnRhYmxlJ3MgZ2hvc3QgY2xhc3NcbiAgICAgICAgICB0b2dnbGVDbGFzcyhkcmFnRWwsIHB1dFNvcnRhYmxlID8gcHV0U29ydGFibGUub3B0aW9ucy5naG9zdENsYXNzIDogYWN0aXZlU29ydGFibGUub3B0aW9ucy5naG9zdENsYXNzLCBmYWxzZSk7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBvcHRpb25zLmdob3N0Q2xhc3MsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwdXRTb3J0YWJsZSAhPT0gX3RoaXMgJiYgX3RoaXMgIT09IFNvcnRhYmxlLmFjdGl2ZSkge1xuICAgICAgICAgIHB1dFNvcnRhYmxlID0gX3RoaXM7XG4gICAgICAgIH0gZWxzZSBpZiAoX3RoaXMgPT09IFNvcnRhYmxlLmFjdGl2ZSAmJiBwdXRTb3J0YWJsZSkge1xuICAgICAgICAgIHB1dFNvcnRhYmxlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFuaW1hdGlvblxuICAgICAgICBpZiAoZnJvbVNvcnRhYmxlID09PSBfdGhpcykge1xuICAgICAgICAgIF90aGlzLl9pZ25vcmVXaGlsZUFuaW1hdGluZyA9IHRhcmdldDtcbiAgICAgICAgfVxuICAgICAgICBfdGhpcy5hbmltYXRlQWxsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlckFuaW1hdGlvbkNvbXBsZXRlJyk7XG4gICAgICAgICAgX3RoaXMuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID0gbnVsbDtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChfdGhpcyAhPT0gZnJvbVNvcnRhYmxlKSB7XG4gICAgICAgICAgZnJvbVNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgICBmcm9tU29ydGFibGUuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBOdWxsIGxhc3RUYXJnZXQgaWYgaXQgaXMgbm90IGluc2lkZSBhIHByZXZpb3VzbHkgc3dhcHBlZCBlbGVtZW50XG4gICAgICBpZiAodGFyZ2V0ID09PSBkcmFnRWwgJiYgIWRyYWdFbC5hbmltYXRlZCB8fCB0YXJnZXQgPT09IGVsICYmICF0YXJnZXQuYW5pbWF0ZWQpIHtcbiAgICAgICAgbGFzdFRhcmdldCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIG5vIGJ1YmJsaW5nIGFuZCBub3QgZmFsbGJhY2tcbiAgICAgIGlmICghb3B0aW9ucy5kcmFnb3ZlckJ1YmJsZSAmJiAhZXZ0LnJvb3RFbCAmJiB0YXJnZXQgIT09IGRvY3VtZW50KSB7XG4gICAgICAgIGRyYWdFbC5wYXJlbnROb2RlW2V4cGFuZG9dLl9pc091dHNpZGVUaGlzRWwoZXZ0LnRhcmdldCk7XG5cbiAgICAgICAgLy8gRG8gbm90IGRldGVjdCBmb3IgZW1wdHkgaW5zZXJ0IGlmIGFscmVhZHkgaW5zZXJ0ZWRcbiAgICAgICAgIWluc2VydGlvbiAmJiBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudChldnQpO1xuICAgICAgfVxuICAgICAgIW9wdGlvbnMuZHJhZ292ZXJCdWJibGUgJiYgZXZ0LnN0b3BQcm9wYWdhdGlvbiAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZXR1cm4gY29tcGxldGVkRmlyZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIENhbGwgd2hlbiBkcmFnRWwgaGFzIGJlZW4gaW5zZXJ0ZWRcbiAgICBmdW5jdGlvbiBjaGFuZ2VkKCkge1xuICAgICAgbmV3SW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgc29ydGFibGU6IF90aGlzLFxuICAgICAgICBuYW1lOiAnY2hhbmdlJyxcbiAgICAgICAgdG9FbDogZWwsXG4gICAgICAgIG5ld0luZGV4OiBuZXdJbmRleCxcbiAgICAgICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG5ld0RyYWdnYWJsZUluZGV4LFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZXZ0LnByZXZlbnREZWZhdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgIGV2dC5jYW5jZWxhYmxlICYmIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICB0YXJnZXQgPSBjbG9zZXN0KHRhcmdldCwgb3B0aW9ucy5kcmFnZ2FibGUsIGVsLCB0cnVlKTtcbiAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlcicpO1xuICAgIGlmIChTb3J0YWJsZS5ldmVudENhbmNlbGVkKSByZXR1cm4gY29tcGxldGVkRmlyZWQ7XG4gICAgaWYgKGRyYWdFbC5jb250YWlucyhldnQudGFyZ2V0KSB8fCB0YXJnZXQuYW5pbWF0ZWQgJiYgdGFyZ2V0LmFuaW1hdGluZ1ggJiYgdGFyZ2V0LmFuaW1hdGluZ1kgfHwgX3RoaXMuX2lnbm9yZVdoaWxlQW5pbWF0aW5nID09PSB0YXJnZXQpIHtcbiAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgIH1cbiAgICBpZ25vcmVOZXh0Q2xpY2sgPSBmYWxzZTtcbiAgICBpZiAoYWN0aXZlU29ydGFibGUgJiYgIW9wdGlvbnMuZGlzYWJsZWQgJiYgKGlzT3duZXIgPyBjYW5Tb3J0IHx8IChyZXZlcnQgPSBwYXJlbnRFbCAhPT0gcm9vdEVsKSAvLyBSZXZlcnRpbmcgaXRlbSBpbnRvIHRoZSBvcmlnaW5hbCBsaXN0XG4gICAgOiBwdXRTb3J0YWJsZSA9PT0gdGhpcyB8fCAodGhpcy5sYXN0UHV0TW9kZSA9IGFjdGl2ZUdyb3VwLmNoZWNrUHVsbCh0aGlzLCBhY3RpdmVTb3J0YWJsZSwgZHJhZ0VsLCBldnQpKSAmJiBncm91cC5jaGVja1B1dCh0aGlzLCBhY3RpdmVTb3J0YWJsZSwgZHJhZ0VsLCBldnQpKSkge1xuICAgICAgdmVydGljYWwgPSB0aGlzLl9nZXREaXJlY3Rpb24oZXZ0LCB0YXJnZXQpID09PSAndmVydGljYWwnO1xuICAgICAgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCk7XG4gICAgICBkcmFnT3ZlckV2ZW50KCdkcmFnT3ZlclZhbGlkJyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuIGNvbXBsZXRlZEZpcmVkO1xuICAgICAgaWYgKHJldmVydCkge1xuICAgICAgICBwYXJlbnRFbCA9IHJvb3RFbDsgLy8gYWN0dWFsaXphdGlvblxuICAgICAgICBjYXB0dXJlKCk7XG4gICAgICAgIHRoaXMuX2hpZGVDbG9uZSgpO1xuICAgICAgICBkcmFnT3ZlckV2ZW50KCdyZXZlcnQnKTtcbiAgICAgICAgaWYgKCFTb3J0YWJsZS5ldmVudENhbmNlbGVkKSB7XG4gICAgICAgICAgaWYgKG5leHRFbCkge1xuICAgICAgICAgICAgcm9vdEVsLmluc2VydEJlZm9yZShkcmFnRWwsIG5leHRFbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGxldGVkKHRydWUpO1xuICAgICAgfVxuICAgICAgdmFyIGVsTGFzdENoaWxkID0gbGFzdENoaWxkKGVsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG4gICAgICBpZiAoIWVsTGFzdENoaWxkIHx8IF9naG9zdElzTGFzdChldnQsIHZlcnRpY2FsLCB0aGlzKSAmJiAhZWxMYXN0Q2hpbGQuYW5pbWF0ZWQpIHtcbiAgICAgICAgLy8gSW5zZXJ0IHRvIGVuZCBvZiBsaXN0XG5cbiAgICAgICAgLy8gSWYgYWxyZWFkeSBhdCBlbmQgb2YgbGlzdDogRG8gbm90IGluc2VydFxuICAgICAgICBpZiAoZWxMYXN0Q2hpbGQgPT09IGRyYWdFbCkge1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBsYXN0IGVsZW1lbnQsIGl0IGlzIHRoZSB0YXJnZXRcbiAgICAgICAgaWYgKGVsTGFzdENoaWxkICYmIGVsID09PSBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgdGFyZ2V0ID0gZWxMYXN0Q2hpbGQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgIHRhcmdldFJlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCBldnQsICEhdGFyZ2V0KSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjYXB0dXJlKCk7XG4gICAgICAgICAgaWYgKGVsTGFzdENoaWxkICYmIGVsTGFzdENoaWxkLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAvLyB0aGUgbGFzdCBkcmFnZ2FibGUgZWxlbWVudCBpcyBub3QgdGhlIGxhc3Qgbm9kZVxuICAgICAgICAgICAgZWwuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgZWxMYXN0Q2hpbGQubmV4dFNpYmxpbmcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwYXJlbnRFbCA9IGVsOyAvLyBhY3R1YWxpemF0aW9uXG5cbiAgICAgICAgICBjaGFuZ2VkKCk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChlbExhc3RDaGlsZCAmJiBfZ2hvc3RJc0ZpcnN0KGV2dCwgdmVydGljYWwsIHRoaXMpKSB7XG4gICAgICAgIC8vIEluc2VydCB0byBzdGFydCBvZiBsaXN0XG4gICAgICAgIHZhciBmaXJzdENoaWxkID0gZ2V0Q2hpbGQoZWwsIDAsIG9wdGlvbnMsIHRydWUpO1xuICAgICAgICBpZiAoZmlyc3RDaGlsZCA9PT0gZHJhZ0VsKSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gZmlyc3RDaGlsZDtcbiAgICAgICAgdGFyZ2V0UmVjdCA9IGdldFJlY3QodGFyZ2V0KTtcbiAgICAgICAgaWYgKF9vbk1vdmUocm9vdEVsLCBlbCwgZHJhZ0VsLCBkcmFnUmVjdCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCBldnQsIGZhbHNlKSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICBjYXB0dXJlKCk7XG4gICAgICAgICAgZWwuaW5zZXJ0QmVmb3JlKGRyYWdFbCwgZmlyc3RDaGlsZCk7XG4gICAgICAgICAgcGFyZW50RWwgPSBlbDsgLy8gYWN0dWFsaXphdGlvblxuXG4gICAgICAgICAgY2hhbmdlZCgpO1xuICAgICAgICAgIHJldHVybiBjb21wbGV0ZWQodHJ1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGFyZ2V0LnBhcmVudE5vZGUgPT09IGVsKSB7XG4gICAgICAgIHRhcmdldFJlY3QgPSBnZXRSZWN0KHRhcmdldCk7XG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSAwLFxuICAgICAgICAgIHRhcmdldEJlZm9yZUZpcnN0U3dhcCxcbiAgICAgICAgICBkaWZmZXJlbnRMZXZlbCA9IGRyYWdFbC5wYXJlbnROb2RlICE9PSBlbCxcbiAgICAgICAgICBkaWZmZXJlbnRSb3dDb2wgPSAhX2RyYWdFbEluUm93Q29sdW1uKGRyYWdFbC5hbmltYXRlZCAmJiBkcmFnRWwudG9SZWN0IHx8IGRyYWdSZWN0LCB0YXJnZXQuYW5pbWF0ZWQgJiYgdGFyZ2V0LnRvUmVjdCB8fCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCksXG4gICAgICAgICAgc2lkZTEgPSB2ZXJ0aWNhbCA/ICd0b3AnIDogJ2xlZnQnLFxuICAgICAgICAgIHNjcm9sbGVkUGFzdFRvcCA9IGlzU2Nyb2xsZWRQYXN0KHRhcmdldCwgJ3RvcCcsICd0b3AnKSB8fCBpc1Njcm9sbGVkUGFzdChkcmFnRWwsICd0b3AnLCAndG9wJyksXG4gICAgICAgICAgc2Nyb2xsQmVmb3JlID0gc2Nyb2xsZWRQYXN0VG9wID8gc2Nyb2xsZWRQYXN0VG9wLnNjcm9sbFRvcCA6IHZvaWQgMDtcbiAgICAgICAgaWYgKGxhc3RUYXJnZXQgIT09IHRhcmdldCkge1xuICAgICAgICAgIHRhcmdldEJlZm9yZUZpcnN0U3dhcCA9IHRhcmdldFJlY3Rbc2lkZTFdO1xuICAgICAgICAgIHBhc3RGaXJzdEludmVydFRocmVzaCA9IGZhbHNlO1xuICAgICAgICAgIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQgPSAhZGlmZmVyZW50Um93Q29sICYmIG9wdGlvbnMuaW52ZXJ0U3dhcCB8fCBkaWZmZXJlbnRMZXZlbDtcbiAgICAgICAgfVxuICAgICAgICBkaXJlY3Rpb24gPSBfZ2V0U3dhcERpcmVjdGlvbihldnQsIHRhcmdldCwgdGFyZ2V0UmVjdCwgdmVydGljYWwsIGRpZmZlcmVudFJvd0NvbCA/IDEgOiBvcHRpb25zLnN3YXBUaHJlc2hvbGQsIG9wdGlvbnMuaW52ZXJ0ZWRTd2FwVGhyZXNob2xkID09IG51bGwgPyBvcHRpb25zLnN3YXBUaHJlc2hvbGQgOiBvcHRpb25zLmludmVydGVkU3dhcFRocmVzaG9sZCwgaXNDaXJjdW1zdGFudGlhbEludmVydCwgbGFzdFRhcmdldCA9PT0gdGFyZ2V0KTtcbiAgICAgICAgdmFyIHNpYmxpbmc7XG4gICAgICAgIGlmIChkaXJlY3Rpb24gIT09IDApIHtcbiAgICAgICAgICAvLyBDaGVjayBpZiB0YXJnZXQgaXMgYmVzaWRlIGRyYWdFbCBpbiByZXNwZWN0aXZlIGRpcmVjdGlvbiAoaWdub3JpbmcgaGlkZGVuIGVsZW1lbnRzKVxuICAgICAgICAgIHZhciBkcmFnSW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgIGRyYWdJbmRleCAtPSBkaXJlY3Rpb247XG4gICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50RWwuY2hpbGRyZW5bZHJhZ0luZGV4XTtcbiAgICAgICAgICB9IHdoaWxlIChzaWJsaW5nICYmIChjc3Moc2libGluZywgJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8IHNpYmxpbmcgPT09IGdob3N0RWwpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBkcmFnRWwgaXMgYWxyZWFkeSBiZXNpZGUgdGFyZ2V0OiBEbyBub3QgaW5zZXJ0XG4gICAgICAgIGlmIChkaXJlY3Rpb24gPT09IDAgfHwgc2libGluZyA9PT0gdGFyZ2V0KSB7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFRhcmdldCA9IHRhcmdldDtcbiAgICAgICAgbGFzdERpcmVjdGlvbiA9IGRpcmVjdGlvbjtcbiAgICAgICAgdmFyIG5leHRTaWJsaW5nID0gdGFyZ2V0Lm5leHRFbGVtZW50U2libGluZyxcbiAgICAgICAgICBhZnRlciA9IGZhbHNlO1xuICAgICAgICBhZnRlciA9IGRpcmVjdGlvbiA9PT0gMTtcbiAgICAgICAgdmFyIG1vdmVWZWN0b3IgPSBfb25Nb3ZlKHJvb3RFbCwgZWwsIGRyYWdFbCwgZHJhZ1JlY3QsIHRhcmdldCwgdGFyZ2V0UmVjdCwgZXZ0LCBhZnRlcik7XG4gICAgICAgIGlmIChtb3ZlVmVjdG9yICE9PSBmYWxzZSkge1xuICAgICAgICAgIGlmIChtb3ZlVmVjdG9yID09PSAxIHx8IG1vdmVWZWN0b3IgPT09IC0xKSB7XG4gICAgICAgICAgICBhZnRlciA9IG1vdmVWZWN0b3IgPT09IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIF9zaWxlbnQgPSB0cnVlO1xuICAgICAgICAgIHNldFRpbWVvdXQoX3Vuc2lsZW50LCAzMCk7XG4gICAgICAgICAgY2FwdHVyZSgpO1xuICAgICAgICAgIGlmIChhZnRlciAmJiAhbmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKGRyYWdFbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRhcmdldC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShkcmFnRWwsIGFmdGVyID8gbmV4dFNpYmxpbmcgOiB0YXJnZXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVuZG8gY2hyb21lJ3Mgc2Nyb2xsIGFkanVzdG1lbnQgKGhhcyBubyBlZmZlY3Qgb24gb3RoZXIgYnJvd3NlcnMpXG4gICAgICAgICAgaWYgKHNjcm9sbGVkUGFzdFRvcCkge1xuICAgICAgICAgICAgc2Nyb2xsQnkoc2Nyb2xsZWRQYXN0VG9wLCAwLCBzY3JvbGxCZWZvcmUgLSBzY3JvbGxlZFBhc3RUb3Auc2Nyb2xsVG9wKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFyZW50RWwgPSBkcmFnRWwucGFyZW50Tm9kZTsgLy8gYWN0dWFsaXphdGlvblxuXG4gICAgICAgICAgLy8gbXVzdCBiZSBkb25lIGJlZm9yZSBhbmltYXRpb25cbiAgICAgICAgICBpZiAodGFyZ2V0QmVmb3JlRmlyc3RTd2FwICE9PSB1bmRlZmluZWQgJiYgIWlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQpIHtcbiAgICAgICAgICAgIHRhcmdldE1vdmVEaXN0YW5jZSA9IE1hdGguYWJzKHRhcmdldEJlZm9yZUZpcnN0U3dhcCAtIGdldFJlY3QodGFyZ2V0KVtzaWRlMV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjaGFuZ2VkKCk7XG4gICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZCh0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGVsLmNvbnRhaW5zKGRyYWdFbCkpIHtcbiAgICAgICAgcmV0dXJuIGNvbXBsZXRlZChmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgX2lnbm9yZVdoaWxlQW5pbWF0aW5nOiBudWxsLFxuICBfb2ZmTW92ZUV2ZW50czogZnVuY3Rpb24gX29mZk1vdmVFdmVudHMoKSB7XG4gICAgb2ZmKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5fb25Ub3VjaE1vdmUpO1xuICAgIG9mZihkb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICBvZmYoZG9jdW1lbnQsICdwb2ludGVybW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlKTtcbiAgICBvZmYoZG9jdW1lbnQsICdkcmFnb3ZlcicsIG5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50KTtcbiAgICBvZmYoZG9jdW1lbnQsICdtb3VzZW1vdmUnLCBuZWFyZXN0RW1wdHlJbnNlcnREZXRlY3RFdmVudCk7XG4gICAgb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgbmVhcmVzdEVtcHR5SW5zZXJ0RGV0ZWN0RXZlbnQpO1xuICB9LFxuICBfb2ZmVXBFdmVudHM6IGZ1bmN0aW9uIF9vZmZVcEV2ZW50cygpIHtcbiAgICB2YXIgb3duZXJEb2N1bWVudCA9IHRoaXMuZWwub3duZXJEb2N1bWVudDtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ21vdXNldXAnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9vbkRyb3ApO1xuICAgIG9mZihvd25lckRvY3VtZW50LCAncG9pbnRlcnVwJywgdGhpcy5fb25Ecm9wKTtcbiAgICBvZmYob3duZXJEb2N1bWVudCwgJ3RvdWNoY2FuY2VsJywgdGhpcy5fb25Ecm9wKTtcbiAgICBvZmYoZG9jdW1lbnQsICdzZWxlY3RzdGFydCcsIHRoaXMpO1xuICB9LFxuICBfb25Ecm9wOiBmdW5jdGlvbiBfb25Ecm9wKCAvKipFdmVudCovZXZ0KSB7XG4gICAgdmFyIGVsID0gdGhpcy5lbCxcbiAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAvLyBHZXQgdGhlIGluZGV4IG9mIHRoZSBkcmFnZ2VkIGVsZW1lbnQgd2l0aGluIGl0cyBwYXJlbnRcbiAgICBuZXdJbmRleCA9IGluZGV4KGRyYWdFbCk7XG4gICAgbmV3RHJhZ2dhYmxlSW5kZXggPSBpbmRleChkcmFnRWwsIG9wdGlvbnMuZHJhZ2dhYmxlKTtcbiAgICBwbHVnaW5FdmVudCgnZHJvcCcsIHRoaXMsIHtcbiAgICAgIGV2dDogZXZ0XG4gICAgfSk7XG4gICAgcGFyZW50RWwgPSBkcmFnRWwgJiYgZHJhZ0VsLnBhcmVudE5vZGU7XG5cbiAgICAvLyBHZXQgYWdhaW4gYWZ0ZXIgcGx1Z2luIGV2ZW50XG4gICAgbmV3SW5kZXggPSBpbmRleChkcmFnRWwpO1xuICAgIG5ld0RyYWdnYWJsZUluZGV4ID0gaW5kZXgoZHJhZ0VsLCBvcHRpb25zLmRyYWdnYWJsZSk7XG4gICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHtcbiAgICAgIHRoaXMuX251bGxpbmcoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgYXdhaXRpbmdEcmFnU3RhcnRlZCA9IGZhbHNlO1xuICAgIGlzQ2lyY3Vtc3RhbnRpYWxJbnZlcnQgPSBmYWxzZTtcbiAgICBwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggPSBmYWxzZTtcbiAgICBjbGVhckludGVydmFsKHRoaXMuX2xvb3BJZCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuX2RyYWdTdGFydFRpbWVyKTtcbiAgICBfY2FuY2VsTmV4dFRpY2sodGhpcy5jbG9uZUlkKTtcbiAgICBfY2FuY2VsTmV4dFRpY2sodGhpcy5fZHJhZ1N0YXJ0SWQpO1xuXG4gICAgLy8gVW5iaW5kIGV2ZW50c1xuICAgIGlmICh0aGlzLm5hdGl2ZURyYWdnYWJsZSkge1xuICAgICAgb2ZmKGRvY3VtZW50LCAnZHJvcCcsIHRoaXMpO1xuICAgICAgb2ZmKGVsLCAnZHJhZ3N0YXJ0JywgdGhpcy5fb25EcmFnU3RhcnQpO1xuICAgIH1cbiAgICB0aGlzLl9vZmZNb3ZlRXZlbnRzKCk7XG4gICAgdGhpcy5fb2ZmVXBFdmVudHMoKTtcbiAgICBpZiAoU2FmYXJpKSB7XG4gICAgICBjc3MoZG9jdW1lbnQuYm9keSwgJ3VzZXItc2VsZWN0JywgJycpO1xuICAgIH1cbiAgICBjc3MoZHJhZ0VsLCAndHJhbnNmb3JtJywgJycpO1xuICAgIGlmIChldnQpIHtcbiAgICAgIGlmIChtb3ZlZCkge1xuICAgICAgICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgIW9wdGlvbnMuZHJvcEJ1YmJsZSAmJiBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICB9XG4gICAgICBnaG9zdEVsICYmIGdob3N0RWwucGFyZW50Tm9kZSAmJiBnaG9zdEVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZ2hvc3RFbCk7XG4gICAgICBpZiAocm9vdEVsID09PSBwYXJlbnRFbCB8fCBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSAhPT0gJ2Nsb25lJykge1xuICAgICAgICAvLyBSZW1vdmUgY2xvbmUocylcbiAgICAgICAgY2xvbmVFbCAmJiBjbG9uZUVsLnBhcmVudE5vZGUgJiYgY2xvbmVFbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lRWwpO1xuICAgICAgfVxuICAgICAgaWYgKGRyYWdFbCkge1xuICAgICAgICBpZiAodGhpcy5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgICBvZmYoZHJhZ0VsLCAnZHJhZ2VuZCcsIHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIF9kaXNhYmxlRHJhZ2dhYmxlKGRyYWdFbCk7XG4gICAgICAgIGRyYWdFbC5zdHlsZVsnd2lsbC1jaGFuZ2UnXSA9ICcnO1xuXG4gICAgICAgIC8vIFJlbW92ZSBjbGFzc2VzXG4gICAgICAgIC8vIGdob3N0Q2xhc3MgaXMgYWRkZWQgaW4gZHJhZ1N0YXJ0ZWRcbiAgICAgICAgaWYgKG1vdmVkICYmICFhd2FpdGluZ0RyYWdTdGFydGVkKSB7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCBwdXRTb3J0YWJsZSA/IHB1dFNvcnRhYmxlLm9wdGlvbnMuZ2hvc3RDbGFzcyA6IHRoaXMub3B0aW9ucy5naG9zdENsYXNzLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgICAgdG9nZ2xlQ2xhc3MoZHJhZ0VsLCB0aGlzLm9wdGlvbnMuY2hvc2VuQ2xhc3MsIGZhbHNlKTtcblxuICAgICAgICAvLyBEcmFnIHN0b3AgZXZlbnRcbiAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgIG5hbWU6ICd1bmNob29zZScsXG4gICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgbmV3SW5kZXg6IG51bGwsXG4gICAgICAgICAgbmV3RHJhZ2dhYmxlSW5kZXg6IG51bGwsXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAocm9vdEVsICE9PSBwYXJlbnRFbCkge1xuICAgICAgICAgIGlmIChuZXdJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAvLyBBZGQgZXZlbnRcbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgcm9vdEVsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgbmFtZTogJ2FkZCcsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBmcm9tRWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gUmVtb3ZlIGV2ZW50XG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICBuYW1lOiAncmVtb3ZlJyxcbiAgICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGRyYWcgZnJvbSBvbmUgbGlzdCBhbmQgZHJvcCBpbnRvIGFub3RoZXJcbiAgICAgICAgICAgIF9kaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgICAgcm9vdEVsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgbmFtZTogJ3NvcnQnLFxuICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgZnJvbUVsOiByb290RWwsXG4gICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICBuYW1lOiAnc29ydCcsXG4gICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5zYXZlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKG5ld0luZGV4ICE9PSBvbGRJbmRleCkge1xuICAgICAgICAgICAgaWYgKG5ld0luZGV4ID49IDApIHtcbiAgICAgICAgICAgICAgLy8gZHJhZyAmIGRyb3Agd2l0aGluIHRoZSBzYW1lIGxpc3RcbiAgICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICAgIG5hbWU6ICd1cGRhdGUnLFxuICAgICAgICAgICAgICAgIHRvRWw6IHBhcmVudEVsLFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgX2Rpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgICAgIHNvcnRhYmxlOiB0aGlzLFxuICAgICAgICAgICAgICAgIG5hbWU6ICdzb3J0JyxcbiAgICAgICAgICAgICAgICB0b0VsOiBwYXJlbnRFbCxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChTb3J0YWJsZS5hY3RpdmUpIHtcbiAgICAgICAgICAvKiBqc2hpbnQgZXFudWxsOnRydWUgKi9cbiAgICAgICAgICBpZiAobmV3SW5kZXggPT0gbnVsbCB8fCBuZXdJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgIG5ld0luZGV4ID0gb2xkSW5kZXg7XG4gICAgICAgICAgICBuZXdEcmFnZ2FibGVJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBfZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICBzb3J0YWJsZTogdGhpcyxcbiAgICAgICAgICAgIG5hbWU6ICdlbmQnLFxuICAgICAgICAgICAgdG9FbDogcGFyZW50RWwsXG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBldnRcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFNhdmUgc29ydGluZ1xuICAgICAgICAgIHRoaXMuc2F2ZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuX251bGxpbmcoKTtcbiAgfSxcbiAgX251bGxpbmc6IGZ1bmN0aW9uIF9udWxsaW5nKCkge1xuICAgIHBsdWdpbkV2ZW50KCdudWxsaW5nJywgdGhpcyk7XG4gICAgcm9vdEVsID0gZHJhZ0VsID0gcGFyZW50RWwgPSBnaG9zdEVsID0gbmV4dEVsID0gY2xvbmVFbCA9IGxhc3REb3duRWwgPSBjbG9uZUhpZGRlbiA9IHRhcEV2dCA9IHRvdWNoRXZ0ID0gbW92ZWQgPSBuZXdJbmRleCA9IG5ld0RyYWdnYWJsZUluZGV4ID0gb2xkSW5kZXggPSBvbGREcmFnZ2FibGVJbmRleCA9IGxhc3RUYXJnZXQgPSBsYXN0RGlyZWN0aW9uID0gcHV0U29ydGFibGUgPSBhY3RpdmVHcm91cCA9IFNvcnRhYmxlLmRyYWdnZWQgPSBTb3J0YWJsZS5naG9zdCA9IFNvcnRhYmxlLmNsb25lID0gU29ydGFibGUuYWN0aXZlID0gbnVsbDtcbiAgICBzYXZlZElucHV0Q2hlY2tlZC5mb3JFYWNoKGZ1bmN0aW9uIChlbCkge1xuICAgICAgZWwuY2hlY2tlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgc2F2ZWRJbnB1dENoZWNrZWQubGVuZ3RoID0gbGFzdER4ID0gbGFzdER5ID0gMDtcbiAgfSxcbiAgaGFuZGxlRXZlbnQ6IGZ1bmN0aW9uIGhhbmRsZUV2ZW50KCAvKipFdmVudCovZXZ0KSB7XG4gICAgc3dpdGNoIChldnQudHlwZSkge1xuICAgICAgY2FzZSAnZHJvcCc6XG4gICAgICBjYXNlICdkcmFnZW5kJzpcbiAgICAgICAgdGhpcy5fb25Ecm9wKGV2dCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZHJhZ2VudGVyJzpcbiAgICAgIGNhc2UgJ2RyYWdvdmVyJzpcbiAgICAgICAgaWYgKGRyYWdFbCkge1xuICAgICAgICAgIHRoaXMuX29uRHJhZ092ZXIoZXZ0KTtcbiAgICAgICAgICBfZ2xvYmFsRHJhZ092ZXIoZXZ0KTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3NlbGVjdHN0YXJ0JzpcbiAgICAgICAgZXZ0LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfSxcbiAgLyoqXHJcbiAgICogU2VyaWFsaXplcyB0aGUgaXRlbSBpbnRvIGFuIGFycmF5IG9mIHN0cmluZy5cclxuICAgKiBAcmV0dXJucyB7U3RyaW5nW119XHJcbiAgICovXG4gIHRvQXJyYXk6IGZ1bmN0aW9uIHRvQXJyYXkoKSB7XG4gICAgdmFyIG9yZGVyID0gW10sXG4gICAgICBlbCxcbiAgICAgIGNoaWxkcmVuID0gdGhpcy5lbC5jaGlsZHJlbixcbiAgICAgIGkgPSAwLFxuICAgICAgbiA9IGNoaWxkcmVuLmxlbmd0aCxcbiAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgZm9yICg7IGkgPCBuOyBpKyspIHtcbiAgICAgIGVsID0gY2hpbGRyZW5baV07XG4gICAgICBpZiAoY2xvc2VzdChlbCwgb3B0aW9ucy5kcmFnZ2FibGUsIHRoaXMuZWwsIGZhbHNlKSkge1xuICAgICAgICBvcmRlci5wdXNoKGVsLmdldEF0dHJpYnV0ZShvcHRpb25zLmRhdGFJZEF0dHIpIHx8IF9nZW5lcmF0ZUlkKGVsKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvcmRlcjtcbiAgfSxcbiAgLyoqXHJcbiAgICogU29ydHMgdGhlIGVsZW1lbnRzIGFjY29yZGluZyB0byB0aGUgYXJyYXkuXHJcbiAgICogQHBhcmFtICB7U3RyaW5nW119ICBvcmRlciAgb3JkZXIgb2YgdGhlIGl0ZW1zXHJcbiAgICovXG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQob3JkZXIsIHVzZUFuaW1hdGlvbikge1xuICAgIHZhciBpdGVtcyA9IHt9LFxuICAgICAgcm9vdEVsID0gdGhpcy5lbDtcbiAgICB0aGlzLnRvQXJyYXkoKS5mb3JFYWNoKGZ1bmN0aW9uIChpZCwgaSkge1xuICAgICAgdmFyIGVsID0gcm9vdEVsLmNoaWxkcmVuW2ldO1xuICAgICAgaWYgKGNsb3Nlc3QoZWwsIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUsIHJvb3RFbCwgZmFsc2UpKSB7XG4gICAgICAgIGl0ZW1zW2lkXSA9IGVsO1xuICAgICAgfVxuICAgIH0sIHRoaXMpO1xuICAgIHVzZUFuaW1hdGlvbiAmJiB0aGlzLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIG9yZGVyLmZvckVhY2goZnVuY3Rpb24gKGlkKSB7XG4gICAgICBpZiAoaXRlbXNbaWRdKSB7XG4gICAgICAgIHJvb3RFbC5yZW1vdmVDaGlsZChpdGVtc1tpZF0pO1xuICAgICAgICByb290RWwuYXBwZW5kQ2hpbGQoaXRlbXNbaWRdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB1c2VBbmltYXRpb24gJiYgdGhpcy5hbmltYXRlQWxsKCk7XG4gIH0sXG4gIC8qKlxyXG4gICAqIFNhdmUgdGhlIGN1cnJlbnQgc29ydGluZ1xyXG4gICAqL1xuICBzYXZlOiBmdW5jdGlvbiBzYXZlKCkge1xuICAgIHZhciBzdG9yZSA9IHRoaXMub3B0aW9ucy5zdG9yZTtcbiAgICBzdG9yZSAmJiBzdG9yZS5zZXQgJiYgc3RvcmUuc2V0KHRoaXMpO1xuICB9LFxuICAvKipcclxuICAgKiBGb3IgZWFjaCBlbGVtZW50IGluIHRoZSBzZXQsIGdldCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yIGJ5IHRlc3RpbmcgdGhlIGVsZW1lbnQgaXRzZWxmIGFuZCB0cmF2ZXJzaW5nIHVwIHRocm91Z2ggaXRzIGFuY2VzdG9ycyBpbiB0aGUgRE9NIHRyZWUuXHJcbiAgICogQHBhcmFtICAge0hUTUxFbGVtZW50fSAgZWxcclxuICAgKiBAcGFyYW0gICB7U3RyaW5nfSAgICAgICBbc2VsZWN0b3JdICBkZWZhdWx0OiBgb3B0aW9ucy5kcmFnZ2FibGVgXHJcbiAgICogQHJldHVybnMge0hUTUxFbGVtZW50fG51bGx9XHJcbiAgICovXG4gIGNsb3Nlc3Q6IGZ1bmN0aW9uIGNsb3Nlc3QkMShlbCwgc2VsZWN0b3IpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbCwgc2VsZWN0b3IgfHwgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSwgdGhpcy5lbCwgZmFsc2UpO1xuICB9LFxuICAvKipcclxuICAgKiBTZXQvZ2V0IG9wdGlvblxyXG4gICAqIEBwYXJhbSAgIHtzdHJpbmd9IG5hbWVcclxuICAgKiBAcGFyYW0gICB7Kn0gICAgICBbdmFsdWVdXHJcbiAgICogQHJldHVybnMgeyp9XHJcbiAgICovXG4gIG9wdGlvbjogZnVuY3Rpb24gb3B0aW9uKG5hbWUsIHZhbHVlKSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKHZhbHVlID09PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiBvcHRpb25zW25hbWVdO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgbW9kaWZpZWRWYWx1ZSA9IFBsdWdpbk1hbmFnZXIubW9kaWZ5T3B0aW9uKHRoaXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgIGlmICh0eXBlb2YgbW9kaWZpZWRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgb3B0aW9uc1tuYW1lXSA9IG1vZGlmaWVkVmFsdWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcHRpb25zW25hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgICBpZiAobmFtZSA9PT0gJ2dyb3VwJykge1xuICAgICAgICBfcHJlcGFyZUdyb3VwKG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbiAgLyoqXHJcbiAgICogRGVzdHJveVxyXG4gICAqL1xuICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIHBsdWdpbkV2ZW50KCdkZXN0cm95JywgdGhpcyk7XG4gICAgdmFyIGVsID0gdGhpcy5lbDtcbiAgICBlbFtleHBhbmRvXSA9IG51bGw7XG4gICAgb2ZmKGVsLCAnbW91c2Vkb3duJywgdGhpcy5fb25UYXBTdGFydCk7XG4gICAgb2ZmKGVsLCAndG91Y2hzdGFydCcsIHRoaXMuX29uVGFwU3RhcnQpO1xuICAgIG9mZihlbCwgJ3BvaW50ZXJkb3duJywgdGhpcy5fb25UYXBTdGFydCk7XG4gICAgaWYgKHRoaXMubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICBvZmYoZWwsICdkcmFnb3ZlcicsIHRoaXMpO1xuICAgICAgb2ZmKGVsLCAnZHJhZ2VudGVyJywgdGhpcyk7XG4gICAgfVxuICAgIC8vIFJlbW92ZSBkcmFnZ2FibGUgYXR0cmlidXRlc1xuICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZWwucXVlcnlTZWxlY3RvckFsbCgnW2RyYWdnYWJsZV0nKSwgZnVuY3Rpb24gKGVsKSB7XG4gICAgICBlbC5yZW1vdmVBdHRyaWJ1dGUoJ2RyYWdnYWJsZScpO1xuICAgIH0pO1xuICAgIHRoaXMuX29uRHJvcCgpO1xuICAgIHRoaXMuX2Rpc2FibGVEZWxheWVkRHJhZ0V2ZW50cygpO1xuICAgIHNvcnRhYmxlcy5zcGxpY2Uoc29ydGFibGVzLmluZGV4T2YodGhpcy5lbCksIDEpO1xuICAgIHRoaXMuZWwgPSBlbCA9IG51bGw7XG4gIH0sXG4gIF9oaWRlQ2xvbmU6IGZ1bmN0aW9uIF9oaWRlQ2xvbmUoKSB7XG4gICAgaWYgKCFjbG9uZUhpZGRlbikge1xuICAgICAgcGx1Z2luRXZlbnQoJ2hpZGVDbG9uZScsIHRoaXMpO1xuICAgICAgaWYgKFNvcnRhYmxlLmV2ZW50Q2FuY2VsZWQpIHJldHVybjtcbiAgICAgIGNzcyhjbG9uZUVsLCAnZGlzcGxheScsICdub25lJyk7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlICYmIGNsb25lRWwucGFyZW50Tm9kZSkge1xuICAgICAgICBjbG9uZUVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmVFbCk7XG4gICAgICB9XG4gICAgICBjbG9uZUhpZGRlbiA9IHRydWU7XG4gICAgfVxuICB9LFxuICBfc2hvd0Nsb25lOiBmdW5jdGlvbiBfc2hvd0Nsb25lKHB1dFNvcnRhYmxlKSB7XG4gICAgaWYgKHB1dFNvcnRhYmxlLmxhc3RQdXRNb2RlICE9PSAnY2xvbmUnKSB7XG4gICAgICB0aGlzLl9oaWRlQ2xvbmUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKGNsb25lSGlkZGVuKSB7XG4gICAgICBwbHVnaW5FdmVudCgnc2hvd0Nsb25lJywgdGhpcyk7XG4gICAgICBpZiAoU29ydGFibGUuZXZlbnRDYW5jZWxlZCkgcmV0dXJuO1xuXG4gICAgICAvLyBzaG93IGNsb25lIGF0IGRyYWdFbCBvciBvcmlnaW5hbCBwb3NpdGlvblxuICAgICAgaWYgKGRyYWdFbC5wYXJlbnROb2RlID09IHJvb3RFbCAmJiAhdGhpcy5vcHRpb25zLmdyb3VwLnJldmVydENsb25lKSB7XG4gICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmVFbCwgZHJhZ0VsKTtcbiAgICAgIH0gZWxzZSBpZiAobmV4dEVsKSB7XG4gICAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUoY2xvbmVFbCwgbmV4dEVsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvb3RFbC5hcHBlbmRDaGlsZChjbG9uZUVsKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuZ3JvdXAucmV2ZXJ0Q2xvbmUpIHtcbiAgICAgICAgdGhpcy5hbmltYXRlKGRyYWdFbCwgY2xvbmVFbCk7XG4gICAgICB9XG4gICAgICBjc3MoY2xvbmVFbCwgJ2Rpc3BsYXknLCAnJyk7XG4gICAgICBjbG9uZUhpZGRlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxufTtcbmZ1bmN0aW9uIF9nbG9iYWxEcmFnT3ZlciggLyoqRXZlbnQqL2V2dCkge1xuICBpZiAoZXZ0LmRhdGFUcmFuc2Zlcikge1xuICAgIGV2dC5kYXRhVHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdtb3ZlJztcbiAgfVxuICBldnQuY2FuY2VsYWJsZSAmJiBldnQucHJldmVudERlZmF1bHQoKTtcbn1cbmZ1bmN0aW9uIF9vbk1vdmUoZnJvbUVsLCB0b0VsLCBkcmFnRWwsIGRyYWdSZWN0LCB0YXJnZXRFbCwgdGFyZ2V0UmVjdCwgb3JpZ2luYWxFdmVudCwgd2lsbEluc2VydEFmdGVyKSB7XG4gIHZhciBldnQsXG4gICAgc29ydGFibGUgPSBmcm9tRWxbZXhwYW5kb10sXG4gICAgb25Nb3ZlRm4gPSBzb3J0YWJsZS5vcHRpb25zLm9uTW92ZSxcbiAgICByZXRWYWw7XG4gIC8vIFN1cHBvcnQgZm9yIG5ldyBDdXN0b21FdmVudCBmZWF0dXJlXG4gIGlmICh3aW5kb3cuQ3VzdG9tRXZlbnQgJiYgIUlFMTFPckxlc3MgJiYgIUVkZ2UpIHtcbiAgICBldnQgPSBuZXcgQ3VzdG9tRXZlbnQoJ21vdmUnLCB7XG4gICAgICBidWJibGVzOiB0cnVlLFxuICAgICAgY2FuY2VsYWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2dC5pbml0RXZlbnQoJ21vdmUnLCB0cnVlLCB0cnVlKTtcbiAgfVxuICBldnQudG8gPSB0b0VsO1xuICBldnQuZnJvbSA9IGZyb21FbDtcbiAgZXZ0LmRyYWdnZWQgPSBkcmFnRWw7XG4gIGV2dC5kcmFnZ2VkUmVjdCA9IGRyYWdSZWN0O1xuICBldnQucmVsYXRlZCA9IHRhcmdldEVsIHx8IHRvRWw7XG4gIGV2dC5yZWxhdGVkUmVjdCA9IHRhcmdldFJlY3QgfHwgZ2V0UmVjdCh0b0VsKTtcbiAgZXZ0LndpbGxJbnNlcnRBZnRlciA9IHdpbGxJbnNlcnRBZnRlcjtcbiAgZXZ0Lm9yaWdpbmFsRXZlbnQgPSBvcmlnaW5hbEV2ZW50O1xuICBmcm9tRWwuZGlzcGF0Y2hFdmVudChldnQpO1xuICBpZiAob25Nb3ZlRm4pIHtcbiAgICByZXRWYWwgPSBvbk1vdmVGbi5jYWxsKHNvcnRhYmxlLCBldnQsIG9yaWdpbmFsRXZlbnQpO1xuICB9XG4gIHJldHVybiByZXRWYWw7XG59XG5mdW5jdGlvbiBfZGlzYWJsZURyYWdnYWJsZShlbCkge1xuICBlbC5kcmFnZ2FibGUgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIF91bnNpbGVudCgpIHtcbiAgX3NpbGVudCA9IGZhbHNlO1xufVxuZnVuY3Rpb24gX2dob3N0SXNGaXJzdChldnQsIHZlcnRpY2FsLCBzb3J0YWJsZSkge1xuICB2YXIgZmlyc3RFbFJlY3QgPSBnZXRSZWN0KGdldENoaWxkKHNvcnRhYmxlLmVsLCAwLCBzb3J0YWJsZS5vcHRpb25zLCB0cnVlKSk7XG4gIHZhciBjaGlsZENvbnRhaW5pbmdSZWN0ID0gZ2V0Q2hpbGRDb250YWluaW5nUmVjdEZyb21FbGVtZW50KHNvcnRhYmxlLmVsLCBzb3J0YWJsZS5vcHRpb25zLCBnaG9zdEVsKTtcbiAgdmFyIHNwYWNlciA9IDEwO1xuICByZXR1cm4gdmVydGljYWwgPyBldnQuY2xpZW50WCA8IGNoaWxkQ29udGFpbmluZ1JlY3QubGVmdCAtIHNwYWNlciB8fCBldnQuY2xpZW50WSA8IGZpcnN0RWxSZWN0LnRvcCAmJiBldnQuY2xpZW50WCA8IGZpcnN0RWxSZWN0LnJpZ2h0IDogZXZ0LmNsaWVudFkgPCBjaGlsZENvbnRhaW5pbmdSZWN0LnRvcCAtIHNwYWNlciB8fCBldnQuY2xpZW50WSA8IGZpcnN0RWxSZWN0LmJvdHRvbSAmJiBldnQuY2xpZW50WCA8IGZpcnN0RWxSZWN0LmxlZnQ7XG59XG5mdW5jdGlvbiBfZ2hvc3RJc0xhc3QoZXZ0LCB2ZXJ0aWNhbCwgc29ydGFibGUpIHtcbiAgdmFyIGxhc3RFbFJlY3QgPSBnZXRSZWN0KGxhc3RDaGlsZChzb3J0YWJsZS5lbCwgc29ydGFibGUub3B0aW9ucy5kcmFnZ2FibGUpKTtcbiAgdmFyIGNoaWxkQ29udGFpbmluZ1JlY3QgPSBnZXRDaGlsZENvbnRhaW5pbmdSZWN0RnJvbUVsZW1lbnQoc29ydGFibGUuZWwsIHNvcnRhYmxlLm9wdGlvbnMsIGdob3N0RWwpO1xuICB2YXIgc3BhY2VyID0gMTA7XG4gIHJldHVybiB2ZXJ0aWNhbCA/IGV2dC5jbGllbnRYID4gY2hpbGRDb250YWluaW5nUmVjdC5yaWdodCArIHNwYWNlciB8fCBldnQuY2xpZW50WSA+IGxhc3RFbFJlY3QuYm90dG9tICYmIGV2dC5jbGllbnRYID4gbGFzdEVsUmVjdC5sZWZ0IDogZXZ0LmNsaWVudFkgPiBjaGlsZENvbnRhaW5pbmdSZWN0LmJvdHRvbSArIHNwYWNlciB8fCBldnQuY2xpZW50WCA+IGxhc3RFbFJlY3QucmlnaHQgJiYgZXZ0LmNsaWVudFkgPiBsYXN0RWxSZWN0LnRvcDtcbn1cbmZ1bmN0aW9uIF9nZXRTd2FwRGlyZWN0aW9uKGV2dCwgdGFyZ2V0LCB0YXJnZXRSZWN0LCB2ZXJ0aWNhbCwgc3dhcFRocmVzaG9sZCwgaW52ZXJ0ZWRTd2FwVGhyZXNob2xkLCBpbnZlcnRTd2FwLCBpc0xhc3RUYXJnZXQpIHtcbiAgdmFyIG1vdXNlT25BeGlzID0gdmVydGljYWwgPyBldnQuY2xpZW50WSA6IGV2dC5jbGllbnRYLFxuICAgIHRhcmdldExlbmd0aCA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5oZWlnaHQgOiB0YXJnZXRSZWN0LndpZHRoLFxuICAgIHRhcmdldFMxID0gdmVydGljYWwgPyB0YXJnZXRSZWN0LnRvcCA6IHRhcmdldFJlY3QubGVmdCxcbiAgICB0YXJnZXRTMiA9IHZlcnRpY2FsID8gdGFyZ2V0UmVjdC5ib3R0b20gOiB0YXJnZXRSZWN0LnJpZ2h0LFxuICAgIGludmVydCA9IGZhbHNlO1xuICBpZiAoIWludmVydFN3YXApIHtcbiAgICAvLyBOZXZlciBpbnZlcnQgb3IgY3JlYXRlIGRyYWdFbCBzaGFkb3cgd2hlbiB0YXJnZXQgbW92ZW1lbmV0IGNhdXNlcyBtb3VzZSB0byBtb3ZlIHBhc3QgdGhlIGVuZCBvZiByZWd1bGFyIHN3YXBUaHJlc2hvbGRcbiAgICBpZiAoaXNMYXN0VGFyZ2V0ICYmIHRhcmdldE1vdmVEaXN0YW5jZSA8IHRhcmdldExlbmd0aCAqIHN3YXBUaHJlc2hvbGQpIHtcbiAgICAgIC8vIG11bHRpcGxpZWQgb25seSBieSBzd2FwVGhyZXNob2xkIGJlY2F1c2UgbW91c2Ugd2lsbCBhbHJlYWR5IGJlIGluc2lkZSB0YXJnZXQgYnkgKDEgLSB0aHJlc2hvbGQpICogdGFyZ2V0TGVuZ3RoIC8gMlxuICAgICAgLy8gY2hlY2sgaWYgcGFzdCBmaXJzdCBpbnZlcnQgdGhyZXNob2xkIG9uIHNpZGUgb3Bwb3NpdGUgb2YgbGFzdERpcmVjdGlvblxuICAgICAgaWYgKCFwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggJiYgKGxhc3REaXJlY3Rpb24gPT09IDEgPyBtb3VzZU9uQXhpcyA+IHRhcmdldFMxICsgdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMiA6IG1vdXNlT25BeGlzIDwgdGFyZ2V0UzIgLSB0YXJnZXRMZW5ndGggKiBpbnZlcnRlZFN3YXBUaHJlc2hvbGQgLyAyKSkge1xuICAgICAgICAvLyBwYXN0IGZpcnN0IGludmVydCB0aHJlc2hvbGQsIGRvIG5vdCByZXN0cmljdCBpbnZlcnRlZCB0aHJlc2hvbGQgdG8gZHJhZ0VsIHNoYWRvd1xuICAgICAgICBwYXN0Rmlyc3RJbnZlcnRUaHJlc2ggPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFwYXN0Rmlyc3RJbnZlcnRUaHJlc2gpIHtcbiAgICAgICAgLy8gZHJhZ0VsIHNoYWRvdyAodGFyZ2V0IG1vdmUgZGlzdGFuY2Ugc2hhZG93KVxuICAgICAgICBpZiAobGFzdERpcmVjdGlvbiA9PT0gMSA/IG1vdXNlT25BeGlzIDwgdGFyZ2V0UzEgKyB0YXJnZXRNb3ZlRGlzdGFuY2UgLy8gb3ZlciBkcmFnRWwgc2hhZG93XG4gICAgICAgIDogbW91c2VPbkF4aXMgPiB0YXJnZXRTMiAtIHRhcmdldE1vdmVEaXN0YW5jZSkge1xuICAgICAgICAgIHJldHVybiAtbGFzdERpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW52ZXJ0ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUmVndWxhclxuICAgICAgaWYgKG1vdXNlT25BeGlzID4gdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggKiAoMSAtIHN3YXBUaHJlc2hvbGQpIC8gMiAmJiBtb3VzZU9uQXhpcyA8IHRhcmdldFMyIC0gdGFyZ2V0TGVuZ3RoICogKDEgLSBzd2FwVGhyZXNob2xkKSAvIDIpIHtcbiAgICAgICAgcmV0dXJuIF9nZXRJbnNlcnREaXJlY3Rpb24odGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaW52ZXJ0ID0gaW52ZXJ0IHx8IGludmVydFN3YXA7XG4gIGlmIChpbnZlcnQpIHtcbiAgICAvLyBJbnZlcnQgb2YgcmVndWxhclxuICAgIGlmIChtb3VzZU9uQXhpcyA8IHRhcmdldFMxICsgdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMiB8fCBtb3VzZU9uQXhpcyA+IHRhcmdldFMyIC0gdGFyZ2V0TGVuZ3RoICogaW52ZXJ0ZWRTd2FwVGhyZXNob2xkIC8gMikge1xuICAgICAgcmV0dXJuIG1vdXNlT25BeGlzID4gdGFyZ2V0UzEgKyB0YXJnZXRMZW5ndGggLyAyID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuICByZXR1cm4gMDtcbn1cblxuLyoqXHJcbiAqIEdldHMgdGhlIGRpcmVjdGlvbiBkcmFnRWwgbXVzdCBiZSBzd2FwcGVkIHJlbGF0aXZlIHRvIHRhcmdldCBpbiBvcmRlciB0byBtYWtlIGl0XHJcbiAqIHNlZW0gdGhhdCBkcmFnRWwgaGFzIGJlZW4gXCJpbnNlcnRlZFwiIGludG8gdGhhdCBlbGVtZW50J3MgcG9zaXRpb25cclxuICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IHRhcmdldCAgICAgICBUaGUgdGFyZ2V0IHdob3NlIHBvc2l0aW9uIGRyYWdFbCBpcyBiZWluZyBpbnNlcnRlZCBhdFxyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9ICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbiBkcmFnRWwgbXVzdCBiZSBzd2FwcGVkXHJcbiAqL1xuZnVuY3Rpb24gX2dldEluc2VydERpcmVjdGlvbih0YXJnZXQpIHtcbiAgaWYgKGluZGV4KGRyYWdFbCkgPCBpbmRleCh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG5cbi8qKlxyXG4gKiBHZW5lcmF0ZSBpZFxyXG4gKiBAcGFyYW0gICB7SFRNTEVsZW1lbnR9IGVsXHJcbiAqIEByZXR1cm5zIHtTdHJpbmd9XHJcbiAqIEBwcml2YXRlXHJcbiAqL1xuZnVuY3Rpb24gX2dlbmVyYXRlSWQoZWwpIHtcbiAgdmFyIHN0ciA9IGVsLnRhZ05hbWUgKyBlbC5jbGFzc05hbWUgKyBlbC5zcmMgKyBlbC5ocmVmICsgZWwudGV4dENvbnRlbnQsXG4gICAgaSA9IHN0ci5sZW5ndGgsXG4gICAgc3VtID0gMDtcbiAgd2hpbGUgKGktLSkge1xuICAgIHN1bSArPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gc3VtLnRvU3RyaW5nKDM2KTtcbn1cbmZ1bmN0aW9uIF9zYXZlSW5wdXRDaGVja2VkU3RhdGUocm9vdCkge1xuICBzYXZlZElucHV0Q2hlY2tlZC5sZW5ndGggPSAwO1xuICB2YXIgaW5wdXRzID0gcm9vdC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTtcbiAgdmFyIGlkeCA9IGlucHV0cy5sZW5ndGg7XG4gIHdoaWxlIChpZHgtLSkge1xuICAgIHZhciBlbCA9IGlucHV0c1tpZHhdO1xuICAgIGVsLmNoZWNrZWQgJiYgc2F2ZWRJbnB1dENoZWNrZWQucHVzaChlbCk7XG4gIH1cbn1cbmZ1bmN0aW9uIF9uZXh0VGljayhmbikge1xuICByZXR1cm4gc2V0VGltZW91dChmbiwgMCk7XG59XG5mdW5jdGlvbiBfY2FuY2VsTmV4dFRpY2soaWQpIHtcbiAgcmV0dXJuIGNsZWFyVGltZW91dChpZCk7XG59XG5cbi8vIEZpeGVkICM5NzM6XG5pZiAoZG9jdW1lbnRFeGlzdHMpIHtcbiAgb24oZG9jdW1lbnQsICd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoZXZ0KSB7XG4gICAgaWYgKChTb3J0YWJsZS5hY3RpdmUgfHwgYXdhaXRpbmdEcmFnU3RhcnRlZCkgJiYgZXZ0LmNhbmNlbGFibGUpIHtcbiAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8vIEV4cG9ydCB1dGlsc1xuU29ydGFibGUudXRpbHMgPSB7XG4gIG9uOiBvbixcbiAgb2ZmOiBvZmYsXG4gIGNzczogY3NzLFxuICBmaW5kOiBmaW5kLFxuICBpczogZnVuY3Rpb24gaXMoZWwsIHNlbGVjdG9yKSB7XG4gICAgcmV0dXJuICEhY2xvc2VzdChlbCwgc2VsZWN0b3IsIGVsLCBmYWxzZSk7XG4gIH0sXG4gIGV4dGVuZDogZXh0ZW5kLFxuICB0aHJvdHRsZTogdGhyb3R0bGUsXG4gIGNsb3Nlc3Q6IGNsb3Nlc3QsXG4gIHRvZ2dsZUNsYXNzOiB0b2dnbGVDbGFzcyxcbiAgY2xvbmU6IGNsb25lLFxuICBpbmRleDogaW5kZXgsXG4gIG5leHRUaWNrOiBfbmV4dFRpY2ssXG4gIGNhbmNlbE5leHRUaWNrOiBfY2FuY2VsTmV4dFRpY2ssXG4gIGRldGVjdERpcmVjdGlvbjogX2RldGVjdERpcmVjdGlvbixcbiAgZ2V0Q2hpbGQ6IGdldENoaWxkXG59O1xuXG4vKipcclxuICogR2V0IHRoZSBTb3J0YWJsZSBpbnN0YW5jZSBvZiBhbiBlbGVtZW50XHJcbiAqIEBwYXJhbSAge0hUTUxFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50XHJcbiAqIEByZXR1cm4ge1NvcnRhYmxlfHVuZGVmaW5lZH0gICAgICAgICBUaGUgaW5zdGFuY2Ugb2YgU29ydGFibGVcclxuICovXG5Tb3J0YWJsZS5nZXQgPSBmdW5jdGlvbiAoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudFtleHBhbmRvXTtcbn07XG5cbi8qKlxyXG4gKiBNb3VudCBhIHBsdWdpbiB0byBTb3J0YWJsZVxyXG4gKiBAcGFyYW0gIHsuLi5Tb3J0YWJsZVBsdWdpbnxTb3J0YWJsZVBsdWdpbltdfSBwbHVnaW5zICAgICAgIFBsdWdpbnMgYmVpbmcgbW91bnRlZFxyXG4gKi9cblNvcnRhYmxlLm1vdW50ID0gZnVuY3Rpb24gKCkge1xuICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgcGx1Z2lucyA9IG5ldyBBcnJheShfbGVuKSwgX2tleSA9IDA7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICBwbHVnaW5zW19rZXldID0gYXJndW1lbnRzW19rZXldO1xuICB9XG4gIGlmIChwbHVnaW5zWzBdLmNvbnN0cnVjdG9yID09PSBBcnJheSkgcGx1Z2lucyA9IHBsdWdpbnNbMF07XG4gIHBsdWdpbnMuZm9yRWFjaChmdW5jdGlvbiAocGx1Z2luKSB7XG4gICAgaWYgKCFwbHVnaW4ucHJvdG90eXBlIHx8ICFwbHVnaW4ucHJvdG90eXBlLmNvbnN0cnVjdG9yKSB7XG4gICAgICB0aHJvdyBcIlNvcnRhYmxlOiBNb3VudGVkIHBsdWdpbiBtdXN0IGJlIGEgY29uc3RydWN0b3IgZnVuY3Rpb24sIG5vdCBcIi5jb25jYXQoe30udG9TdHJpbmcuY2FsbChwbHVnaW4pKTtcbiAgICB9XG4gICAgaWYgKHBsdWdpbi51dGlscykgU29ydGFibGUudXRpbHMgPSBfb2JqZWN0U3ByZWFkMihfb2JqZWN0U3ByZWFkMih7fSwgU29ydGFibGUudXRpbHMpLCBwbHVnaW4udXRpbHMpO1xuICAgIFBsdWdpbk1hbmFnZXIubW91bnQocGx1Z2luKTtcbiAgfSk7XG59O1xuXG4vKipcclxuICogQ3JlYXRlIHNvcnRhYmxlIGluc3RhbmNlXHJcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9ICBlbFxyXG4gKiBAcGFyYW0ge09iamVjdH0gICAgICBbb3B0aW9uc11cclxuICovXG5Tb3J0YWJsZS5jcmVhdGUgPSBmdW5jdGlvbiAoZWwsIG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBTb3J0YWJsZShlbCwgb3B0aW9ucyk7XG59O1xuXG4vLyBFeHBvcnRcblNvcnRhYmxlLnZlcnNpb24gPSB2ZXJzaW9uO1xuXG52YXIgYXV0b1Njcm9sbHMgPSBbXSxcbiAgc2Nyb2xsRWwsXG4gIHNjcm9sbFJvb3RFbCxcbiAgc2Nyb2xsaW5nID0gZmFsc2UsXG4gIGxhc3RBdXRvU2Nyb2xsWCxcbiAgbGFzdEF1dG9TY3JvbGxZLFxuICB0b3VjaEV2dCQxLFxuICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbDtcbmZ1bmN0aW9uIEF1dG9TY3JvbGxQbHVnaW4oKSB7XG4gIGZ1bmN0aW9uIEF1dG9TY3JvbGwoKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIHNjcm9sbDogdHJ1ZSxcbiAgICAgIGZvcmNlQXV0b1Njcm9sbEZhbGxiYWNrOiBmYWxzZSxcbiAgICAgIHNjcm9sbFNlbnNpdGl2aXR5OiAzMCxcbiAgICAgIHNjcm9sbFNwZWVkOiAxMCxcbiAgICAgIGJ1YmJsZVNjcm9sbDogdHJ1ZVxuICAgIH07XG5cbiAgICAvLyBCaW5kIGFsbCBwcml2YXRlIG1ldGhvZHNcbiAgICBmb3IgKHZhciBmbiBpbiB0aGlzKSB7XG4gICAgICBpZiAoZm4uY2hhckF0KDApID09PSAnXycgJiYgdHlwZW9mIHRoaXNbZm5dID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRoaXNbZm5dID0gdGhpc1tmbl0uYmluZCh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgQXV0b1Njcm9sbC5wcm90b3R5cGUgPSB7XG4gICAgZHJhZ1N0YXJ0ZWQ6IGZ1bmN0aW9uIGRyYWdTdGFydGVkKF9yZWYpIHtcbiAgICAgIHZhciBvcmlnaW5hbEV2ZW50ID0gX3JlZi5vcmlnaW5hbEV2ZW50O1xuICAgICAgaWYgKHRoaXMuc29ydGFibGUubmF0aXZlRHJhZ2dhYmxlKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAnZHJhZ292ZXInLCB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3VwcG9ydFBvaW50ZXIpIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbEV2ZW50LnRvdWNoZXMpIHtcbiAgICAgICAgICBvbihkb2N1bWVudCwgJ3RvdWNobW92ZScsIHRoaXMuX2hhbmRsZUZhbGxiYWNrQXV0b1Njcm9sbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb24oZG9jdW1lbnQsICdtb3VzZW1vdmUnLCB0aGlzLl9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkcmFnT3ZlckNvbXBsZXRlZDogZnVuY3Rpb24gZHJhZ092ZXJDb21wbGV0ZWQoX3JlZjIpIHtcbiAgICAgIHZhciBvcmlnaW5hbEV2ZW50ID0gX3JlZjIub3JpZ2luYWxFdmVudDtcbiAgICAgIC8vIEZvciB3aGVuIGJ1YmJsaW5nIGlzIGNhbmNlbGVkIGFuZCB1c2luZyBmYWxsYmFjayAoZmFsbGJhY2sgJ3RvdWNobW92ZScgYWx3YXlzIHJlYWNoZWQpXG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5kcmFnT3ZlckJ1YmJsZSAmJiAhb3JpZ2luYWxFdmVudC5yb290RWwpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlQXV0b1Njcm9sbChvcmlnaW5hbEV2ZW50KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyb3A6IGZ1bmN0aW9uIGRyb3AoKSB7XG4gICAgICBpZiAodGhpcy5zb3J0YWJsZS5uYXRpdmVEcmFnZ2FibGUpIHtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAnZHJhZ292ZXInLCB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZihkb2N1bWVudCwgJ3BvaW50ZXJtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2htb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgICAgb2ZmKGRvY3VtZW50LCAnbW91c2Vtb3ZlJywgdGhpcy5faGFuZGxlRmFsbGJhY2tBdXRvU2Nyb2xsKTtcbiAgICAgIH1cbiAgICAgIGNsZWFyUG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwoKTtcbiAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgIGNhbmNlbFRocm90dGxlKCk7XG4gICAgfSxcbiAgICBudWxsaW5nOiBmdW5jdGlvbiBudWxsaW5nKCkge1xuICAgICAgdG91Y2hFdnQkMSA9IHNjcm9sbFJvb3RFbCA9IHNjcm9sbEVsID0gc2Nyb2xsaW5nID0gcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgPSBsYXN0QXV0b1Njcm9sbFggPSBsYXN0QXV0b1Njcm9sbFkgPSBudWxsO1xuICAgICAgYXV0b1Njcm9sbHMubGVuZ3RoID0gMDtcbiAgICB9LFxuICAgIF9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGw6IGZ1bmN0aW9uIF9oYW5kbGVGYWxsYmFja0F1dG9TY3JvbGwoZXZ0KSB7XG4gICAgICB0aGlzLl9oYW5kbGVBdXRvU2Nyb2xsKGV2dCwgdHJ1ZSk7XG4gICAgfSxcbiAgICBfaGFuZGxlQXV0b1Njcm9sbDogZnVuY3Rpb24gX2hhbmRsZUF1dG9TY3JvbGwoZXZ0LCBmYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgIHZhciB4ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFgsXG4gICAgICAgIHkgPSAoZXZ0LnRvdWNoZXMgPyBldnQudG91Y2hlc1swXSA6IGV2dCkuY2xpZW50WSxcbiAgICAgICAgZWxlbSA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7XG4gICAgICB0b3VjaEV2dCQxID0gZXZ0O1xuXG4gICAgICAvLyBJRSBkb2VzIG5vdCBzZWVtIHRvIGhhdmUgbmF0aXZlIGF1dG9zY3JvbGwsXG4gICAgICAvLyBFZGdlJ3MgYXV0b3Njcm9sbCBzZWVtcyB0b28gY29uZGl0aW9uYWwsXG4gICAgICAvLyBNQUNPUyBTYWZhcmkgZG9lcyBub3QgaGF2ZSBhdXRvc2Nyb2xsLFxuICAgICAgLy8gRmlyZWZveCBhbmQgQ2hyb21lIGFyZSBnb29kXG4gICAgICBpZiAoZmFsbGJhY2sgfHwgdGhpcy5vcHRpb25zLmZvcmNlQXV0b1Njcm9sbEZhbGxiYWNrIHx8IEVkZ2UgfHwgSUUxMU9yTGVzcyB8fCBTYWZhcmkpIHtcbiAgICAgICAgYXV0b1Njcm9sbChldnQsIHRoaXMub3B0aW9ucywgZWxlbSwgZmFsbGJhY2spO1xuXG4gICAgICAgIC8vIExpc3RlbmVyIGZvciBwb2ludGVyIGVsZW1lbnQgY2hhbmdlXG4gICAgICAgIHZhciBvZ0VsZW1TY3JvbGxlciA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KGVsZW0sIHRydWUpO1xuICAgICAgICBpZiAoc2Nyb2xsaW5nICYmICghcG9pbnRlckVsZW1DaGFuZ2VkSW50ZXJ2YWwgfHwgeCAhPT0gbGFzdEF1dG9TY3JvbGxYIHx8IHkgIT09IGxhc3RBdXRvU2Nyb2xsWSkpIHtcbiAgICAgICAgICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCAmJiBjbGVhclBvaW50ZXJFbGVtQ2hhbmdlZEludGVydmFsKCk7XG4gICAgICAgICAgLy8gRGV0ZWN0IGZvciBwb2ludGVyIGVsZW0gY2hhbmdlLCBlbXVsYXRpbmcgbmF0aXZlIERuRCBiZWhhdmlvdXJcbiAgICAgICAgICBwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBuZXdFbGVtID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAobmV3RWxlbSAhPT0gb2dFbGVtU2Nyb2xsZXIpIHtcbiAgICAgICAgICAgICAgb2dFbGVtU2Nyb2xsZXIgPSBuZXdFbGVtO1xuICAgICAgICAgICAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhdXRvU2Nyb2xsKGV2dCwgX3RoaXMub3B0aW9ucywgbmV3RWxlbSwgZmFsbGJhY2spO1xuICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgICBsYXN0QXV0b1Njcm9sbFggPSB4O1xuICAgICAgICAgIGxhc3RBdXRvU2Nyb2xsWSA9IHk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIERuRCBpcyBlbmFibGVkIChhbmQgYnJvd3NlciBoYXMgZ29vZCBhdXRvc2Nyb2xsaW5nKSwgZmlyc3QgYXV0b3Njcm9sbCB3aWxsIGFscmVhZHkgc2Nyb2xsLCBzbyBnZXQgcGFyZW50IGF1dG9zY3JvbGwgb2YgZmlyc3QgYXV0b3Njcm9sbFxuICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5idWJibGVTY3JvbGwgfHwgZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgdHJ1ZSkgPT09IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKSkge1xuICAgICAgICAgIGNsZWFyQXV0b1Njcm9sbHMoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXV0b1Njcm9sbChldnQsIHRoaXMub3B0aW9ucywgZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoZWxlbSwgZmFsc2UpLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gX2V4dGVuZHMoQXV0b1Njcm9sbCwge1xuICAgIHBsdWdpbk5hbWU6ICdzY3JvbGwnLFxuICAgIGluaXRpYWxpemVCeURlZmF1bHQ6IHRydWVcbiAgfSk7XG59XG5mdW5jdGlvbiBjbGVhckF1dG9TY3JvbGxzKCkge1xuICBhdXRvU2Nyb2xscy5mb3JFYWNoKGZ1bmN0aW9uIChhdXRvU2Nyb2xsKSB7XG4gICAgY2xlYXJJbnRlcnZhbChhdXRvU2Nyb2xsLnBpZCk7XG4gIH0pO1xuICBhdXRvU2Nyb2xscyA9IFtdO1xufVxuZnVuY3Rpb24gY2xlYXJQb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCgpIHtcbiAgY2xlYXJJbnRlcnZhbChwb2ludGVyRWxlbUNoYW5nZWRJbnRlcnZhbCk7XG59XG52YXIgYXV0b1Njcm9sbCA9IHRocm90dGxlKGZ1bmN0aW9uIChldnQsIG9wdGlvbnMsIHJvb3RFbCwgaXNGYWxsYmFjaykge1xuICAvLyBCdWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTUwNTUyMVxuICBpZiAoIW9wdGlvbnMuc2Nyb2xsKSByZXR1cm47XG4gIHZhciB4ID0gKGV2dC50b3VjaGVzID8gZXZ0LnRvdWNoZXNbMF0gOiBldnQpLmNsaWVudFgsXG4gICAgeSA9IChldnQudG91Y2hlcyA/IGV2dC50b3VjaGVzWzBdIDogZXZ0KS5jbGllbnRZLFxuICAgIHNlbnMgPSBvcHRpb25zLnNjcm9sbFNlbnNpdGl2aXR5LFxuICAgIHNwZWVkID0gb3B0aW9ucy5zY3JvbGxTcGVlZCxcbiAgICB3aW5TY3JvbGxlciA9IGdldFdpbmRvd1Njcm9sbGluZ0VsZW1lbnQoKTtcbiAgdmFyIHNjcm9sbFRoaXNJbnN0YW5jZSA9IGZhbHNlLFxuICAgIHNjcm9sbEN1c3RvbUZuO1xuXG4gIC8vIE5ldyBzY3JvbGwgcm9vdCwgc2V0IHNjcm9sbEVsXG4gIGlmIChzY3JvbGxSb290RWwgIT09IHJvb3RFbCkge1xuICAgIHNjcm9sbFJvb3RFbCA9IHJvb3RFbDtcbiAgICBjbGVhckF1dG9TY3JvbGxzKCk7XG4gICAgc2Nyb2xsRWwgPSBvcHRpb25zLnNjcm9sbDtcbiAgICBzY3JvbGxDdXN0b21GbiA9IG9wdGlvbnMuc2Nyb2xsRm47XG4gICAgaWYgKHNjcm9sbEVsID09PSB0cnVlKSB7XG4gICAgICBzY3JvbGxFbCA9IGdldFBhcmVudEF1dG9TY3JvbGxFbGVtZW50KHJvb3RFbCwgdHJ1ZSk7XG4gICAgfVxuICB9XG4gIHZhciBsYXllcnNPdXQgPSAwO1xuICB2YXIgY3VycmVudFBhcmVudCA9IHNjcm9sbEVsO1xuICBkbyB7XG4gICAgdmFyIGVsID0gY3VycmVudFBhcmVudCxcbiAgICAgIHJlY3QgPSBnZXRSZWN0KGVsKSxcbiAgICAgIHRvcCA9IHJlY3QudG9wLFxuICAgICAgYm90dG9tID0gcmVjdC5ib3R0b20sXG4gICAgICBsZWZ0ID0gcmVjdC5sZWZ0LFxuICAgICAgcmlnaHQgPSByZWN0LnJpZ2h0LFxuICAgICAgd2lkdGggPSByZWN0LndpZHRoLFxuICAgICAgaGVpZ2h0ID0gcmVjdC5oZWlnaHQsXG4gICAgICBjYW5TY3JvbGxYID0gdm9pZCAwLFxuICAgICAgY2FuU2Nyb2xsWSA9IHZvaWQgMCxcbiAgICAgIHNjcm9sbFdpZHRoID0gZWwuc2Nyb2xsV2lkdGgsXG4gICAgICBzY3JvbGxIZWlnaHQgPSBlbC5zY3JvbGxIZWlnaHQsXG4gICAgICBlbENTUyA9IGNzcyhlbCksXG4gICAgICBzY3JvbGxQb3NYID0gZWwuc2Nyb2xsTGVmdCxcbiAgICAgIHNjcm9sbFBvc1kgPSBlbC5zY3JvbGxUb3A7XG4gICAgaWYgKGVsID09PSB3aW5TY3JvbGxlcikge1xuICAgICAgY2FuU2Nyb2xsWCA9IHdpZHRoIDwgc2Nyb2xsV2lkdGggJiYgKGVsQ1NTLm92ZXJmbG93WCA9PT0gJ2F1dG8nIHx8IGVsQ1NTLm92ZXJmbG93WCA9PT0gJ3Njcm9sbCcgfHwgZWxDU1Mub3ZlcmZsb3dYID09PSAndmlzaWJsZScpO1xuICAgICAgY2FuU2Nyb2xsWSA9IGhlaWdodCA8IHNjcm9sbEhlaWdodCAmJiAoZWxDU1Mub3ZlcmZsb3dZID09PSAnYXV0bycgfHwgZWxDU1Mub3ZlcmZsb3dZID09PSAnc2Nyb2xsJyB8fCBlbENTUy5vdmVyZmxvd1kgPT09ICd2aXNpYmxlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhblNjcm9sbFggPSB3aWR0aCA8IHNjcm9sbFdpZHRoICYmIChlbENTUy5vdmVyZmxvd1ggPT09ICdhdXRvJyB8fCBlbENTUy5vdmVyZmxvd1ggPT09ICdzY3JvbGwnKTtcbiAgICAgIGNhblNjcm9sbFkgPSBoZWlnaHQgPCBzY3JvbGxIZWlnaHQgJiYgKGVsQ1NTLm92ZXJmbG93WSA9PT0gJ2F1dG8nIHx8IGVsQ1NTLm92ZXJmbG93WSA9PT0gJ3Njcm9sbCcpO1xuICAgIH1cbiAgICB2YXIgdnggPSBjYW5TY3JvbGxYICYmIChNYXRoLmFicyhyaWdodCAtIHgpIDw9IHNlbnMgJiYgc2Nyb2xsUG9zWCArIHdpZHRoIDwgc2Nyb2xsV2lkdGgpIC0gKE1hdGguYWJzKGxlZnQgLSB4KSA8PSBzZW5zICYmICEhc2Nyb2xsUG9zWCk7XG4gICAgdmFyIHZ5ID0gY2FuU2Nyb2xsWSAmJiAoTWF0aC5hYnMoYm90dG9tIC0geSkgPD0gc2VucyAmJiBzY3JvbGxQb3NZICsgaGVpZ2h0IDwgc2Nyb2xsSGVpZ2h0KSAtIChNYXRoLmFicyh0b3AgLSB5KSA8PSBzZW5zICYmICEhc2Nyb2xsUG9zWSk7XG4gICAgaWYgKCFhdXRvU2Nyb2xsc1tsYXllcnNPdXRdKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBsYXllcnNPdXQ7IGkrKykge1xuICAgICAgICBpZiAoIWF1dG9TY3JvbGxzW2ldKSB7XG4gICAgICAgICAgYXV0b1Njcm9sbHNbaV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS52eCAhPSB2eCB8fCBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ5ICE9IHZ5IHx8IGF1dG9TY3JvbGxzW2xheWVyc091dF0uZWwgIT09IGVsKSB7XG4gICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLmVsID0gZWw7XG4gICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ4ID0gdng7XG4gICAgICBhdXRvU2Nyb2xsc1tsYXllcnNPdXRdLnZ5ID0gdnk7XG4gICAgICBjbGVhckludGVydmFsKGF1dG9TY3JvbGxzW2xheWVyc091dF0ucGlkKTtcbiAgICAgIGlmICh2eCAhPSAwIHx8IHZ5ICE9IDApIHtcbiAgICAgICAgc2Nyb2xsVGhpc0luc3RhbmNlID0gdHJ1ZTtcbiAgICAgICAgLyoganNoaW50IGxvb3BmdW5jOnRydWUgKi9cbiAgICAgICAgYXV0b1Njcm9sbHNbbGF5ZXJzT3V0XS5waWQgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gZW11bGF0ZSBkcmFnIG92ZXIgZHVyaW5nIGF1dG9zY3JvbGwgKGZhbGxiYWNrKSwgZW11bGF0aW5nIG5hdGl2ZSBEbkQgYmVoYXZpb3VyXG4gICAgICAgICAgaWYgKGlzRmFsbGJhY2sgJiYgdGhpcy5sYXllciA9PT0gMCkge1xuICAgICAgICAgICAgU29ydGFibGUuYWN0aXZlLl9vblRvdWNoTW92ZSh0b3VjaEV2dCQxKTsgLy8gVG8gbW92ZSBnaG9zdCBpZiBpdCBpcyBwb3NpdGlvbmVkIGFic29sdXRlbHlcbiAgICAgICAgICB9XG4gICAgICAgICAgdmFyIHNjcm9sbE9mZnNldFkgPSBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eSA/IGF1dG9TY3JvbGxzW3RoaXMubGF5ZXJdLnZ5ICogc3BlZWQgOiAwO1xuICAgICAgICAgIHZhciBzY3JvbGxPZmZzZXRYID0gYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0udnggPyBhdXRvU2Nyb2xsc1t0aGlzLmxheWVyXS52eCAqIHNwZWVkIDogMDtcbiAgICAgICAgICBpZiAodHlwZW9mIHNjcm9sbEN1c3RvbUZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAoc2Nyb2xsQ3VzdG9tRm4uY2FsbChTb3J0YWJsZS5kcmFnZ2VkLnBhcmVudE5vZGVbZXhwYW5kb10sIHNjcm9sbE9mZnNldFgsIHNjcm9sbE9mZnNldFksIGV2dCwgdG91Y2hFdnQkMSwgYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0uZWwpICE9PSAnY29udGludWUnKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2Nyb2xsQnkoYXV0b1Njcm9sbHNbdGhpcy5sYXllcl0uZWwsIHNjcm9sbE9mZnNldFgsIHNjcm9sbE9mZnNldFkpO1xuICAgICAgICB9LmJpbmQoe1xuICAgICAgICAgIGxheWVyOiBsYXllcnNPdXRcbiAgICAgICAgfSksIDI0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGF5ZXJzT3V0Kys7XG4gIH0gd2hpbGUgKG9wdGlvbnMuYnViYmxlU2Nyb2xsICYmIGN1cnJlbnRQYXJlbnQgIT09IHdpblNjcm9sbGVyICYmIChjdXJyZW50UGFyZW50ID0gZ2V0UGFyZW50QXV0b1Njcm9sbEVsZW1lbnQoY3VycmVudFBhcmVudCwgZmFsc2UpKSk7XG4gIHNjcm9sbGluZyA9IHNjcm9sbFRoaXNJbnN0YW5jZTsgLy8gaW4gY2FzZSBhbm90aGVyIGZ1bmN0aW9uIGNhdGNoZXMgc2Nyb2xsaW5nIGFzIGZhbHNlIGluIGJldHdlZW4gd2hlbiBpdCBpcyBub3Rcbn0sIDMwKTtcblxudmFyIGRyb3AgPSBmdW5jdGlvbiBkcm9wKF9yZWYpIHtcbiAgdmFyIG9yaWdpbmFsRXZlbnQgPSBfcmVmLm9yaWdpbmFsRXZlbnQsXG4gICAgcHV0U29ydGFibGUgPSBfcmVmLnB1dFNvcnRhYmxlLFxuICAgIGRyYWdFbCA9IF9yZWYuZHJhZ0VsLFxuICAgIGFjdGl2ZVNvcnRhYmxlID0gX3JlZi5hY3RpdmVTb3J0YWJsZSxcbiAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQgPSBfcmVmLmRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICBoaWRlR2hvc3RGb3JUYXJnZXQgPSBfcmVmLmhpZGVHaG9zdEZvclRhcmdldCxcbiAgICB1bmhpZGVHaG9zdEZvclRhcmdldCA9IF9yZWYudW5oaWRlR2hvc3RGb3JUYXJnZXQ7XG4gIGlmICghb3JpZ2luYWxFdmVudCkgcmV0dXJuO1xuICB2YXIgdG9Tb3J0YWJsZSA9IHB1dFNvcnRhYmxlIHx8IGFjdGl2ZVNvcnRhYmxlO1xuICBoaWRlR2hvc3RGb3JUYXJnZXQoKTtcbiAgdmFyIHRvdWNoID0gb3JpZ2luYWxFdmVudC5jaGFuZ2VkVG91Y2hlcyAmJiBvcmlnaW5hbEV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA/IG9yaWdpbmFsRXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0gOiBvcmlnaW5hbEV2ZW50O1xuICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZKTtcbiAgdW5oaWRlR2hvc3RGb3JUYXJnZXQoKTtcbiAgaWYgKHRvU29ydGFibGUgJiYgIXRvU29ydGFibGUuZWwuY29udGFpbnModGFyZ2V0KSkge1xuICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCgnc3BpbGwnKTtcbiAgICB0aGlzLm9uU3BpbGwoe1xuICAgICAgZHJhZ0VsOiBkcmFnRWwsXG4gICAgICBwdXRTb3J0YWJsZTogcHV0U29ydGFibGVcbiAgICB9KTtcbiAgfVxufTtcbmZ1bmN0aW9uIFJldmVydCgpIHt9XG5SZXZlcnQucHJvdG90eXBlID0ge1xuICBzdGFydEluZGV4OiBudWxsLFxuICBkcmFnU3RhcnQ6IGZ1bmN0aW9uIGRyYWdTdGFydChfcmVmMikge1xuICAgIHZhciBvbGREcmFnZ2FibGVJbmRleCA9IF9yZWYyLm9sZERyYWdnYWJsZUluZGV4O1xuICAgIHRoaXMuc3RhcnRJbmRleCA9IG9sZERyYWdnYWJsZUluZGV4O1xuICB9LFxuICBvblNwaWxsOiBmdW5jdGlvbiBvblNwaWxsKF9yZWYzKSB7XG4gICAgdmFyIGRyYWdFbCA9IF9yZWYzLmRyYWdFbCxcbiAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjMucHV0U29ydGFibGU7XG4gICAgdGhpcy5zb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICBpZiAocHV0U29ydGFibGUpIHtcbiAgICAgIHB1dFNvcnRhYmxlLmNhcHR1cmVBbmltYXRpb25TdGF0ZSgpO1xuICAgIH1cbiAgICB2YXIgbmV4dFNpYmxpbmcgPSBnZXRDaGlsZCh0aGlzLnNvcnRhYmxlLmVsLCB0aGlzLnN0YXJ0SW5kZXgsIHRoaXMub3B0aW9ucyk7XG4gICAgaWYgKG5leHRTaWJsaW5nKSB7XG4gICAgICB0aGlzLnNvcnRhYmxlLmVsLmluc2VydEJlZm9yZShkcmFnRWwsIG5leHRTaWJsaW5nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zb3J0YWJsZS5lbC5hcHBlbmRDaGlsZChkcmFnRWwpO1xuICAgIH1cbiAgICB0aGlzLnNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICBpZiAocHV0U29ydGFibGUpIHtcbiAgICAgIHB1dFNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICB9XG4gIH0sXG4gIGRyb3A6IGRyb3Bcbn07XG5fZXh0ZW5kcyhSZXZlcnQsIHtcbiAgcGx1Z2luTmFtZTogJ3JldmVydE9uU3BpbGwnXG59KTtcbmZ1bmN0aW9uIFJlbW92ZSgpIHt9XG5SZW1vdmUucHJvdG90eXBlID0ge1xuICBvblNwaWxsOiBmdW5jdGlvbiBvblNwaWxsKF9yZWY0KSB7XG4gICAgdmFyIGRyYWdFbCA9IF9yZWY0LmRyYWdFbCxcbiAgICAgIHB1dFNvcnRhYmxlID0gX3JlZjQucHV0U29ydGFibGU7XG4gICAgdmFyIHBhcmVudFNvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgdGhpcy5zb3J0YWJsZTtcbiAgICBwYXJlbnRTb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICBkcmFnRWwucGFyZW50Tm9kZSAmJiBkcmFnRWwucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkcmFnRWwpO1xuICAgIHBhcmVudFNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgfSxcbiAgZHJvcDogZHJvcFxufTtcbl9leHRlbmRzKFJlbW92ZSwge1xuICBwbHVnaW5OYW1lOiAncmVtb3ZlT25TcGlsbCdcbn0pO1xuXG52YXIgbGFzdFN3YXBFbDtcbmZ1bmN0aW9uIFN3YXBQbHVnaW4oKSB7XG4gIGZ1bmN0aW9uIFN3YXAoKSB7XG4gICAgdGhpcy5kZWZhdWx0cyA9IHtcbiAgICAgIHN3YXBDbGFzczogJ3NvcnRhYmxlLXN3YXAtaGlnaGxpZ2h0J1xuICAgIH07XG4gIH1cbiAgU3dhcC5wcm90b3R5cGUgPSB7XG4gICAgZHJhZ1N0YXJ0OiBmdW5jdGlvbiBkcmFnU3RhcnQoX3JlZikge1xuICAgICAgdmFyIGRyYWdFbCA9IF9yZWYuZHJhZ0VsO1xuICAgICAgbGFzdFN3YXBFbCA9IGRyYWdFbDtcbiAgICB9LFxuICAgIGRyYWdPdmVyVmFsaWQ6IGZ1bmN0aW9uIGRyYWdPdmVyVmFsaWQoX3JlZjIpIHtcbiAgICAgIHZhciBjb21wbGV0ZWQgPSBfcmVmMi5jb21wbGV0ZWQsXG4gICAgICAgIHRhcmdldCA9IF9yZWYyLnRhcmdldCxcbiAgICAgICAgb25Nb3ZlID0gX3JlZjIub25Nb3ZlLFxuICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IF9yZWYyLmFjdGl2ZVNvcnRhYmxlLFxuICAgICAgICBjaGFuZ2VkID0gX3JlZjIuY2hhbmdlZCxcbiAgICAgICAgY2FuY2VsID0gX3JlZjIuY2FuY2VsO1xuICAgICAgaWYgKCFhY3RpdmVTb3J0YWJsZS5vcHRpb25zLnN3YXApIHJldHVybjtcbiAgICAgIHZhciBlbCA9IHRoaXMuc29ydGFibGUuZWwsXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldCAhPT0gZWwpIHtcbiAgICAgICAgdmFyIHByZXZTd2FwRWwgPSBsYXN0U3dhcEVsO1xuICAgICAgICBpZiAob25Nb3ZlKHRhcmdldCkgIT09IGZhbHNlKSB7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3ModGFyZ2V0LCBvcHRpb25zLnN3YXBDbGFzcywgdHJ1ZSk7XG4gICAgICAgICAgbGFzdFN3YXBFbCA9IHRhcmdldDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsYXN0U3dhcEVsID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJldlN3YXBFbCAmJiBwcmV2U3dhcEVsICE9PSBsYXN0U3dhcEVsKSB7XG4gICAgICAgICAgdG9nZ2xlQ2xhc3MocHJldlN3YXBFbCwgb3B0aW9ucy5zd2FwQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2hhbmdlZCgpO1xuICAgICAgY29tcGxldGVkKHRydWUpO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKF9yZWYzKSB7XG4gICAgICB2YXIgYWN0aXZlU29ydGFibGUgPSBfcmVmMy5hY3RpdmVTb3J0YWJsZSxcbiAgICAgICAgcHV0U29ydGFibGUgPSBfcmVmMy5wdXRTb3J0YWJsZSxcbiAgICAgICAgZHJhZ0VsID0gX3JlZjMuZHJhZ0VsO1xuICAgICAgdmFyIHRvU29ydGFibGUgPSBwdXRTb3J0YWJsZSB8fCB0aGlzLnNvcnRhYmxlO1xuICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG4gICAgICBsYXN0U3dhcEVsICYmIHRvZ2dsZUNsYXNzKGxhc3RTd2FwRWwsIG9wdGlvbnMuc3dhcENsYXNzLCBmYWxzZSk7XG4gICAgICBpZiAobGFzdFN3YXBFbCAmJiAob3B0aW9ucy5zd2FwIHx8IHB1dFNvcnRhYmxlICYmIHB1dFNvcnRhYmxlLm9wdGlvbnMuc3dhcCkpIHtcbiAgICAgICAgaWYgKGRyYWdFbCAhPT0gbGFzdFN3YXBFbCkge1xuICAgICAgICAgIHRvU29ydGFibGUuY2FwdHVyZUFuaW1hdGlvblN0YXRlKCk7XG4gICAgICAgICAgaWYgKHRvU29ydGFibGUgIT09IGFjdGl2ZVNvcnRhYmxlKSBhY3RpdmVTb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgICAgICBzd2FwTm9kZXMoZHJhZ0VsLCBsYXN0U3dhcEVsKTtcbiAgICAgICAgICB0b1NvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgICBpZiAodG9Tb3J0YWJsZSAhPT0gYWN0aXZlU29ydGFibGUpIGFjdGl2ZVNvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgbnVsbGluZzogZnVuY3Rpb24gbnVsbGluZygpIHtcbiAgICAgIGxhc3RTd2FwRWwgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIF9leHRlbmRzKFN3YXAsIHtcbiAgICBwbHVnaW5OYW1lOiAnc3dhcCcsXG4gICAgZXZlbnRQcm9wZXJ0aWVzOiBmdW5jdGlvbiBldmVudFByb3BlcnRpZXMoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzd2FwSXRlbTogbGFzdFN3YXBFbFxuICAgICAgfTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gc3dhcE5vZGVzKG4xLCBuMikge1xuICB2YXIgcDEgPSBuMS5wYXJlbnROb2RlLFxuICAgIHAyID0gbjIucGFyZW50Tm9kZSxcbiAgICBpMSxcbiAgICBpMjtcbiAgaWYgKCFwMSB8fCAhcDIgfHwgcDEuaXNFcXVhbE5vZGUobjIpIHx8IHAyLmlzRXF1YWxOb2RlKG4xKSkgcmV0dXJuO1xuICBpMSA9IGluZGV4KG4xKTtcbiAgaTIgPSBpbmRleChuMik7XG4gIGlmIChwMS5pc0VxdWFsTm9kZShwMikgJiYgaTEgPCBpMikge1xuICAgIGkyKys7XG4gIH1cbiAgcDEuaW5zZXJ0QmVmb3JlKG4yLCBwMS5jaGlsZHJlbltpMV0pO1xuICBwMi5pbnNlcnRCZWZvcmUobjEsIHAyLmNoaWxkcmVuW2kyXSk7XG59XG5cbnZhciBtdWx0aURyYWdFbGVtZW50cyA9IFtdLFxuICBtdWx0aURyYWdDbG9uZXMgPSBbXSxcbiAgbGFzdE11bHRpRHJhZ1NlbGVjdCxcbiAgLy8gZm9yIHNlbGVjdGlvbiB3aXRoIG1vZGlmaWVyIGtleSBkb3duIChTSElGVClcbiAgbXVsdGlEcmFnU29ydGFibGUsXG4gIGluaXRpYWxGb2xkaW5nID0gZmFsc2UsXG4gIC8vIEluaXRpYWwgbXVsdGktZHJhZyBmb2xkIHdoZW4gZHJhZyBzdGFydGVkXG4gIGZvbGRpbmcgPSBmYWxzZSxcbiAgLy8gRm9sZGluZyBhbnkgb3RoZXIgdGltZVxuICBkcmFnU3RhcnRlZCA9IGZhbHNlLFxuICBkcmFnRWwkMSxcbiAgY2xvbmVzRnJvbVJlY3QsXG4gIGNsb25lc0hpZGRlbjtcbmZ1bmN0aW9uIE11bHRpRHJhZ1BsdWdpbigpIHtcbiAgZnVuY3Rpb24gTXVsdGlEcmFnKHNvcnRhYmxlKSB7XG4gICAgLy8gQmluZCBhbGwgcHJpdmF0ZSBtZXRob2RzXG4gICAgZm9yICh2YXIgZm4gaW4gdGhpcykge1xuICAgICAgaWYgKGZuLmNoYXJBdCgwKSA9PT0gJ18nICYmIHR5cGVvZiB0aGlzW2ZuXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB0aGlzW2ZuXSA9IHRoaXNbZm5dLmJpbmQodGhpcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghc29ydGFibGUub3B0aW9ucy5hdm9pZEltcGxpY2l0RGVzZWxlY3QpIHtcbiAgICAgIGlmIChzb3J0YWJsZS5vcHRpb25zLnN1cHBvcnRQb2ludGVyKSB7XG4gICAgICAgIG9uKGRvY3VtZW50LCAncG9pbnRlcnVwJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb24oZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgICBvbihkb2N1bWVudCwgJ3RvdWNoZW5kJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgfVxuICAgIH1cbiAgICBvbihkb2N1bWVudCwgJ2tleWRvd24nLCB0aGlzLl9jaGVja0tleURvd24pO1xuICAgIG9uKGRvY3VtZW50LCAna2V5dXAnLCB0aGlzLl9jaGVja0tleVVwKTtcbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgc2VsZWN0ZWRDbGFzczogJ3NvcnRhYmxlLXNlbGVjdGVkJyxcbiAgICAgIG11bHRpRHJhZ0tleTogbnVsbCxcbiAgICAgIGF2b2lkSW1wbGljaXREZXNlbGVjdDogZmFsc2UsXG4gICAgICBzZXREYXRhOiBmdW5jdGlvbiBzZXREYXRhKGRhdGFUcmFuc2ZlciwgZHJhZ0VsKSB7XG4gICAgICAgIHZhciBkYXRhID0gJyc7XG4gICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggJiYgbXVsdGlEcmFnU29ydGFibGUgPT09IHNvcnRhYmxlKSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCwgaSkge1xuICAgICAgICAgICAgZGF0YSArPSAoIWkgPyAnJyA6ICcsICcpICsgbXVsdGlEcmFnRWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkYXRhID0gZHJhZ0VsLnRleHRDb250ZW50O1xuICAgICAgICB9XG4gICAgICAgIGRhdGFUcmFuc2Zlci5zZXREYXRhKCdUZXh0JywgZGF0YSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICBNdWx0aURyYWcucHJvdG90eXBlID0ge1xuICAgIG11bHRpRHJhZ0tleURvd246IGZhbHNlLFxuICAgIGlzTXVsdGlEcmFnOiBmYWxzZSxcbiAgICBkZWxheVN0YXJ0R2xvYmFsOiBmdW5jdGlvbiBkZWxheVN0YXJ0R2xvYmFsKF9yZWYpIHtcbiAgICAgIHZhciBkcmFnZ2VkID0gX3JlZi5kcmFnRWw7XG4gICAgICBkcmFnRWwkMSA9IGRyYWdnZWQ7XG4gICAgfSxcbiAgICBkZWxheUVuZGVkOiBmdW5jdGlvbiBkZWxheUVuZGVkKCkge1xuICAgICAgdGhpcy5pc011bHRpRHJhZyA9IH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKTtcbiAgICB9LFxuICAgIHNldHVwQ2xvbmU6IGZ1bmN0aW9uIHNldHVwQ2xvbmUoX3JlZjIpIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWYyLnNvcnRhYmxlLFxuICAgICAgICBjYW5jZWwgPSBfcmVmMi5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzLnB1c2goY2xvbmUobXVsdGlEcmFnRWxlbWVudHNbaV0pKTtcbiAgICAgICAgbXVsdGlEcmFnQ2xvbmVzW2ldLnNvcnRhYmxlSW5kZXggPSBtdWx0aURyYWdFbGVtZW50c1tpXS5zb3J0YWJsZUluZGV4O1xuICAgICAgICBtdWx0aURyYWdDbG9uZXNbaV0uZHJhZ2dhYmxlID0gZmFsc2U7XG4gICAgICAgIG11bHRpRHJhZ0Nsb25lc1tpXS5zdHlsZVsnd2lsbC1jaGFuZ2UnXSA9ICcnO1xuICAgICAgICB0b2dnbGVDbGFzcyhtdWx0aURyYWdDbG9uZXNbaV0sIHRoaXMub3B0aW9ucy5zZWxlY3RlZENsYXNzLCBmYWxzZSk7XG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzW2ldID09PSBkcmFnRWwkMSAmJiB0b2dnbGVDbGFzcyhtdWx0aURyYWdDbG9uZXNbaV0sIHRoaXMub3B0aW9ucy5jaG9zZW5DbGFzcywgZmFsc2UpO1xuICAgICAgfVxuICAgICAgc29ydGFibGUuX2hpZGVDbG9uZSgpO1xuICAgICAgY2FuY2VsKCk7XG4gICAgfSxcbiAgICBjbG9uZTogZnVuY3Rpb24gY2xvbmUoX3JlZjMpIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWYzLnNvcnRhYmxlLFxuICAgICAgICByb290RWwgPSBfcmVmMy5yb290RWwsXG4gICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCA9IF9yZWYzLmRpc3BhdGNoU29ydGFibGVFdmVudCxcbiAgICAgICAgY2FuY2VsID0gX3JlZjMuY2FuY2VsO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG4gICAgICBpZiAoIXRoaXMub3B0aW9ucy5yZW1vdmVDbG9uZU9uSGlkZSkge1xuICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoICYmIG11bHRpRHJhZ1NvcnRhYmxlID09PSBzb3J0YWJsZSkge1xuICAgICAgICAgIGluc2VydE11bHRpRHJhZ0Nsb25lcyh0cnVlLCByb290RWwpO1xuICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCgnY2xvbmUnKTtcbiAgICAgICAgICBjYW5jZWwoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgc2hvd0Nsb25lOiBmdW5jdGlvbiBzaG93Q2xvbmUoX3JlZjQpIHtcbiAgICAgIHZhciBjbG9uZU5vd1Nob3duID0gX3JlZjQuY2xvbmVOb3dTaG93bixcbiAgICAgICAgcm9vdEVsID0gX3JlZjQucm9vdEVsLFxuICAgICAgICBjYW5jZWwgPSBfcmVmNC5jYW5jZWw7XG4gICAgICBpZiAoIXRoaXMuaXNNdWx0aURyYWcpIHJldHVybjtcbiAgICAgIGluc2VydE11bHRpRHJhZ0Nsb25lcyhmYWxzZSwgcm9vdEVsKTtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5mb3JFYWNoKGZ1bmN0aW9uIChjbG9uZSkge1xuICAgICAgICBjc3MoY2xvbmUsICdkaXNwbGF5JywgJycpO1xuICAgICAgfSk7XG4gICAgICBjbG9uZU5vd1Nob3duKCk7XG4gICAgICBjbG9uZXNIaWRkZW4gPSBmYWxzZTtcbiAgICAgIGNhbmNlbCgpO1xuICAgIH0sXG4gICAgaGlkZUNsb25lOiBmdW5jdGlvbiBoaWRlQ2xvbmUoX3JlZjUpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmNS5zb3J0YWJsZSxcbiAgICAgICAgY2xvbmVOb3dIaWRkZW4gPSBfcmVmNS5jbG9uZU5vd0hpZGRlbixcbiAgICAgICAgY2FuY2VsID0gX3JlZjUuY2FuY2VsO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG4gICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgY3NzKGNsb25lLCAnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgIGlmIChfdGhpcy5vcHRpb25zLnJlbW92ZUNsb25lT25IaWRlICYmIGNsb25lLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICBjbG9uZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNsb25lKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBjbG9uZU5vd0hpZGRlbigpO1xuICAgICAgY2xvbmVzSGlkZGVuID0gdHJ1ZTtcbiAgICAgIGNhbmNlbCgpO1xuICAgIH0sXG4gICAgZHJhZ1N0YXJ0R2xvYmFsOiBmdW5jdGlvbiBkcmFnU3RhcnRHbG9iYWwoX3JlZjYpIHtcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWY2LnNvcnRhYmxlO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnICYmIG11bHRpRHJhZ1NvcnRhYmxlKSB7XG4gICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlLm11bHRpRHJhZy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcbiAgICAgIH1cbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4ID0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gU29ydCBtdWx0aS1kcmFnIGVsZW1lbnRzXG4gICAgICBtdWx0aURyYWdFbGVtZW50cyA9IG11bHRpRHJhZ0VsZW1lbnRzLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIGEuc29ydGFibGVJbmRleCAtIGIuc29ydGFibGVJbmRleDtcbiAgICAgIH0pO1xuICAgICAgZHJhZ1N0YXJ0ZWQgPSB0cnVlO1xuICAgIH0sXG4gICAgZHJhZ1N0YXJ0ZWQ6IGZ1bmN0aW9uIGRyYWdTdGFydGVkKF9yZWY3KSB7XG4gICAgICB2YXIgX3RoaXMyID0gdGhpcztcbiAgICAgIHZhciBzb3J0YWJsZSA9IF9yZWY3LnNvcnRhYmxlO1xuICAgICAgaWYgKCF0aGlzLmlzTXVsdGlEcmFnKSByZXR1cm47XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNvcnQpIHtcbiAgICAgICAgLy8gQ2FwdHVyZSByZWN0cyxcbiAgICAgICAgLy8gaGlkZSBtdWx0aSBkcmFnIGVsZW1lbnRzIChieSBwb3NpdGlvbmluZyB0aGVtIGFic29sdXRlKSxcbiAgICAgICAgLy8gc2V0IG11bHRpIGRyYWcgZWxlbWVudHMgcmVjdHMgdG8gZHJhZ1JlY3QsXG4gICAgICAgIC8vIHNob3cgbXVsdGkgZHJhZyBlbGVtZW50cyxcbiAgICAgICAgLy8gYW5pbWF0ZSB0byByZWN0cyxcbiAgICAgICAgLy8gdW5zZXQgcmVjdHMgJiByZW1vdmUgZnJvbSBET01cblxuICAgICAgICBzb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCA9PT0gZHJhZ0VsJDEpIHJldHVybjtcbiAgICAgICAgICAgIGNzcyhtdWx0aURyYWdFbGVtZW50LCAncG9zaXRpb24nLCAnYWJzb2x1dGUnKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCQxLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgaWYgKG11bHRpRHJhZ0VsZW1lbnQgPT09IGRyYWdFbCQxKSByZXR1cm47XG4gICAgICAgICAgICBzZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQsIGRyYWdSZWN0KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBmb2xkaW5nID0gdHJ1ZTtcbiAgICAgICAgICBpbml0aWFsRm9sZGluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNvcnRhYmxlLmFuaW1hdGVBbGwoZnVuY3Rpb24gKCkge1xuICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIGluaXRpYWxGb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIGlmIChfdGhpczIub3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChtdWx0aURyYWdFbGVtZW50KSB7XG4gICAgICAgICAgICB1bnNldFJlY3QobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgYWxsIGF1eGlsaWFyeSBtdWx0aWRyYWcgaXRlbXMgZnJvbSBlbCwgaWYgc29ydGluZyBlbmFibGVkXG4gICAgICAgIGlmIChfdGhpczIub3B0aW9ucy5zb3J0KSB7XG4gICAgICAgICAgcmVtb3ZlTXVsdGlEcmFnRWxlbWVudHMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICBkcmFnT3ZlcjogZnVuY3Rpb24gZHJhZ092ZXIoX3JlZjgpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBfcmVmOC50YXJnZXQsXG4gICAgICAgIGNvbXBsZXRlZCA9IF9yZWY4LmNvbXBsZXRlZCxcbiAgICAgICAgY2FuY2VsID0gX3JlZjguY2FuY2VsO1xuICAgICAgaWYgKGZvbGRpbmcgJiYgfm11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YodGFyZ2V0KSkge1xuICAgICAgICBjb21wbGV0ZWQoZmFsc2UpO1xuICAgICAgICBjYW5jZWwoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHJldmVydDogZnVuY3Rpb24gcmV2ZXJ0KF9yZWY5KSB7XG4gICAgICB2YXIgZnJvbVNvcnRhYmxlID0gX3JlZjkuZnJvbVNvcnRhYmxlLFxuICAgICAgICByb290RWwgPSBfcmVmOS5yb290RWwsXG4gICAgICAgIHNvcnRhYmxlID0gX3JlZjkuc29ydGFibGUsXG4gICAgICAgIGRyYWdSZWN0ID0gX3JlZjkuZHJhZ1JlY3Q7XG4gICAgICBpZiAobXVsdGlEcmFnRWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAvLyBTZXR1cCB1bmZvbGQgYW5pbWF0aW9uXG4gICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICBzb3J0YWJsZS5hZGRBbmltYXRpb25TdGF0ZSh7XG4gICAgICAgICAgICB0YXJnZXQ6IG11bHRpRHJhZ0VsZW1lbnQsXG4gICAgICAgICAgICByZWN0OiBmb2xkaW5nID8gZ2V0UmVjdChtdWx0aURyYWdFbGVtZW50KSA6IGRyYWdSZWN0XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdW5zZXRSZWN0KG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQuZnJvbVJlY3QgPSBkcmFnUmVjdDtcbiAgICAgICAgICBmcm9tU29ydGFibGUucmVtb3ZlQW5pbWF0aW9uU3RhdGUobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIGluc2VydE11bHRpRHJhZ0VsZW1lbnRzKCF0aGlzLm9wdGlvbnMucmVtb3ZlQ2xvbmVPbkhpZGUsIHJvb3RFbCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkcmFnT3ZlckNvbXBsZXRlZDogZnVuY3Rpb24gZHJhZ092ZXJDb21wbGV0ZWQoX3JlZjEwKSB7XG4gICAgICB2YXIgc29ydGFibGUgPSBfcmVmMTAuc29ydGFibGUsXG4gICAgICAgIGlzT3duZXIgPSBfcmVmMTAuaXNPd25lcixcbiAgICAgICAgaW5zZXJ0aW9uID0gX3JlZjEwLmluc2VydGlvbixcbiAgICAgICAgYWN0aXZlU29ydGFibGUgPSBfcmVmMTAuYWN0aXZlU29ydGFibGUsXG4gICAgICAgIHBhcmVudEVsID0gX3JlZjEwLnBhcmVudEVsLFxuICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYxMC5wdXRTb3J0YWJsZTtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgaWYgKGluc2VydGlvbikge1xuICAgICAgICAvLyBDbG9uZXMgbXVzdCBiZSBoaWRkZW4gYmVmb3JlIGZvbGRpbmcgYW5pbWF0aW9uIHRvIGNhcHR1cmUgZHJhZ1JlY3RBYnNvbHV0ZSBwcm9wZXJseVxuICAgICAgICBpZiAoaXNPd25lcikge1xuICAgICAgICAgIGFjdGl2ZVNvcnRhYmxlLl9oaWRlQ2xvbmUoKTtcbiAgICAgICAgfVxuICAgICAgICBpbml0aWFsRm9sZGluZyA9IGZhbHNlO1xuICAgICAgICAvLyBJZiBsZWF2aW5nIHNvcnQ6ZmFsc2Ugcm9vdCwgb3IgYWxyZWFkeSBmb2xkaW5nIC0gRm9sZCB0byBuZXcgbG9jYXRpb25cbiAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0aW9uICYmIG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEgJiYgKGZvbGRpbmcgfHwgIWlzT3duZXIgJiYgIWFjdGl2ZVNvcnRhYmxlLm9wdGlvbnMuc29ydCAmJiAhcHV0U29ydGFibGUpKSB7XG4gICAgICAgICAgLy8gRm9sZDogU2V0IGFsbCBtdWx0aSBkcmFnIGVsZW1lbnRzJ3MgcmVjdHMgdG8gZHJhZ0VsJ3MgcmVjdCB3aGVuIG11bHRpLWRyYWcgZWxlbWVudHMgYXJlIGludmlzaWJsZVxuICAgICAgICAgIHZhciBkcmFnUmVjdEFic29sdXRlID0gZ2V0UmVjdChkcmFnRWwkMSwgZmFsc2UsIHRydWUsIHRydWUpO1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgICAgICAgICAgc2V0UmVjdChtdWx0aURyYWdFbGVtZW50LCBkcmFnUmVjdEFic29sdXRlKTtcblxuICAgICAgICAgICAgLy8gTW92ZSBlbGVtZW50KHMpIHRvIGVuZCBvZiBwYXJlbnRFbCBzbyB0aGF0IGl0IGRvZXMgbm90IGludGVyZmVyZSB3aXRoIG11bHRpLWRyYWcgY2xvbmVzIGluc2VydGlvbiBpZiB0aGV5IGFyZSBpbnNlcnRlZFxuICAgICAgICAgICAgLy8gd2hpbGUgZm9sZGluZywgYW5kIHNvIHRoYXQgd2UgY2FuIGNhcHR1cmUgdGhlbSBhZ2FpbiBiZWNhdXNlIG9sZCBzb3J0YWJsZSB3aWxsIG5vIGxvbmdlciBiZSBmcm9tU29ydGFibGVcbiAgICAgICAgICAgIHBhcmVudEVsLmFwcGVuZENoaWxkKG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGZvbGRpbmcgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xvbmVzIG11c3QgYmUgc2hvd24gKGFuZCBjaGVjayB0byByZW1vdmUgbXVsdGkgZHJhZ3MpIGFmdGVyIGZvbGRpbmcgd2hlbiBpbnRlcmZlcmluZyBtdWx0aURyYWdFbGVtZW50cyBhcmUgbW92ZWQgb3V0XG4gICAgICAgIGlmICghaXNPd25lcikge1xuICAgICAgICAgIC8vIE9ubHkgcmVtb3ZlIGlmIG5vdCBmb2xkaW5nIChmb2xkaW5nIHdpbGwgcmVtb3ZlIHRoZW0gYW55d2F5cylcbiAgICAgICAgICBpZiAoIWZvbGRpbmcpIHtcbiAgICAgICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB2YXIgY2xvbmVzSGlkZGVuQmVmb3JlID0gY2xvbmVzSGlkZGVuO1xuICAgICAgICAgICAgYWN0aXZlU29ydGFibGUuX3Nob3dDbG9uZShzb3J0YWJsZSk7XG5cbiAgICAgICAgICAgIC8vIFVuZm9sZCBhbmltYXRpb24gZm9yIGNsb25lcyBpZiBzaG93aW5nIGZyb20gaGlkZGVuXG4gICAgICAgICAgICBpZiAoYWN0aXZlU29ydGFibGUub3B0aW9ucy5hbmltYXRpb24gJiYgIWNsb25lc0hpZGRlbiAmJiBjbG9uZXNIaWRkZW5CZWZvcmUpIHtcbiAgICAgICAgICAgICAgbXVsdGlEcmFnQ2xvbmVzLmZvckVhY2goZnVuY3Rpb24gKGNsb25lKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlU29ydGFibGUuYWRkQW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBjbG9uZSxcbiAgICAgICAgICAgICAgICAgIHJlY3Q6IGNsb25lc0Zyb21SZWN0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2xvbmUuZnJvbVJlY3QgPSBjbG9uZXNGcm9tUmVjdDtcbiAgICAgICAgICAgICAgICBjbG9uZS50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWN0aXZlU29ydGFibGUuX3Nob3dDbG9uZShzb3J0YWJsZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcbiAgICBkcmFnT3ZlckFuaW1hdGlvbkNhcHR1cmU6IGZ1bmN0aW9uIGRyYWdPdmVyQW5pbWF0aW9uQ2FwdHVyZShfcmVmMTEpIHtcbiAgICAgIHZhciBkcmFnUmVjdCA9IF9yZWYxMS5kcmFnUmVjdCxcbiAgICAgICAgaXNPd25lciA9IF9yZWYxMS5pc093bmVyLFxuICAgICAgICBhY3RpdmVTb3J0YWJsZSA9IF9yZWYxMS5hY3RpdmVTb3J0YWJsZTtcbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudC50aGlzQW5pbWF0aW9uRHVyYXRpb24gPSBudWxsO1xuICAgICAgfSk7XG4gICAgICBpZiAoYWN0aXZlU29ydGFibGUub3B0aW9ucy5hbmltYXRpb24gJiYgIWlzT3duZXIgJiYgYWN0aXZlU29ydGFibGUubXVsdGlEcmFnLmlzTXVsdGlEcmFnKSB7XG4gICAgICAgIGNsb25lc0Zyb21SZWN0ID0gX2V4dGVuZHMoe30sIGRyYWdSZWN0KTtcbiAgICAgICAgdmFyIGRyYWdNYXRyaXggPSBtYXRyaXgoZHJhZ0VsJDEsIHRydWUpO1xuICAgICAgICBjbG9uZXNGcm9tUmVjdC50b3AgLT0gZHJhZ01hdHJpeC5mO1xuICAgICAgICBjbG9uZXNGcm9tUmVjdC5sZWZ0IC09IGRyYWdNYXRyaXguZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGRyYWdPdmVyQW5pbWF0aW9uQ29tcGxldGU6IGZ1bmN0aW9uIGRyYWdPdmVyQW5pbWF0aW9uQ29tcGxldGUoKSB7XG4gICAgICBpZiAoZm9sZGluZykge1xuICAgICAgICBmb2xkaW5nID0gZmFsc2U7XG4gICAgICAgIHJlbW92ZU11bHRpRHJhZ0VsZW1lbnRzKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBkcm9wOiBmdW5jdGlvbiBkcm9wKF9yZWYxMikge1xuICAgICAgdmFyIGV2dCA9IF9yZWYxMi5vcmlnaW5hbEV2ZW50LFxuICAgICAgICByb290RWwgPSBfcmVmMTIucm9vdEVsLFxuICAgICAgICBwYXJlbnRFbCA9IF9yZWYxMi5wYXJlbnRFbCxcbiAgICAgICAgc29ydGFibGUgPSBfcmVmMTIuc29ydGFibGUsXG4gICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCA9IF9yZWYxMi5kaXNwYXRjaFNvcnRhYmxlRXZlbnQsXG4gICAgICAgIG9sZEluZGV4ID0gX3JlZjEyLm9sZEluZGV4LFxuICAgICAgICBwdXRTb3J0YWJsZSA9IF9yZWYxMi5wdXRTb3J0YWJsZTtcbiAgICAgIHZhciB0b1NvcnRhYmxlID0gcHV0U29ydGFibGUgfHwgdGhpcy5zb3J0YWJsZTtcbiAgICAgIGlmICghZXZ0KSByZXR1cm47XG4gICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgY2hpbGRyZW4gPSBwYXJlbnRFbC5jaGlsZHJlbjtcblxuICAgICAgLy8gTXVsdGktZHJhZyBzZWxlY3Rpb25cbiAgICAgIGlmICghZHJhZ1N0YXJ0ZWQpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubXVsdGlEcmFnS2V5ICYmICF0aGlzLm11bHRpRHJhZ0tleURvd24pIHtcbiAgICAgICAgICB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZygpO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZUNsYXNzKGRyYWdFbCQxLCBvcHRpb25zLnNlbGVjdGVkQ2xhc3MsICF+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihkcmFnRWwkMSkpO1xuICAgICAgICBpZiAoIX5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGRyYWdFbCQxKSkge1xuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLnB1c2goZHJhZ0VsJDEpO1xuICAgICAgICAgIGRpc3BhdGNoRXZlbnQoe1xuICAgICAgICAgICAgc29ydGFibGU6IHNvcnRhYmxlLFxuICAgICAgICAgICAgcm9vdEVsOiByb290RWwsXG4gICAgICAgICAgICBuYW1lOiAnc2VsZWN0JyxcbiAgICAgICAgICAgIHRhcmdldEVsOiBkcmFnRWwkMSxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gTW9kaWZpZXIgYWN0aXZhdGVkLCBzZWxlY3QgZnJvbSBsYXN0IHRvIGRyYWdFbFxuICAgICAgICAgIGlmIChldnQuc2hpZnRLZXkgJiYgbGFzdE11bHRpRHJhZ1NlbGVjdCAmJiBzb3J0YWJsZS5lbC5jb250YWlucyhsYXN0TXVsdGlEcmFnU2VsZWN0KSkge1xuICAgICAgICAgICAgdmFyIGxhc3RJbmRleCA9IGluZGV4KGxhc3RNdWx0aURyYWdTZWxlY3QpLFxuICAgICAgICAgICAgICBjdXJyZW50SW5kZXggPSBpbmRleChkcmFnRWwkMSk7XG4gICAgICAgICAgICBpZiAofmxhc3RJbmRleCAmJiB+Y3VycmVudEluZGV4ICYmIGxhc3RJbmRleCAhPT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgICAgICAgIC8vIE11c3QgaW5jbHVkZSBsYXN0TXVsdGlEcmFnU2VsZWN0IChzZWxlY3QgaXQpLCBpbiBjYXNlIG1vZGlmaWVkIHNlbGVjdGlvbiBmcm9tIG5vIHNlbGVjdGlvblxuICAgICAgICAgICAgICAvLyAoYnV0IHByZXZpb3VzIHNlbGVjdGlvbiBleGlzdGVkKVxuICAgICAgICAgICAgICB2YXIgbiwgaTtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgICAgIGkgPSBsYXN0SW5kZXg7XG4gICAgICAgICAgICAgICAgbiA9IGN1cnJlbnRJbmRleDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpID0gY3VycmVudEluZGV4O1xuICAgICAgICAgICAgICAgIG4gPSBsYXN0SW5kZXggKyAxO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZvciAoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKH5tdWx0aURyYWdFbGVtZW50cy5pbmRleE9mKGNoaWxkcmVuW2ldKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgdG9nZ2xlQ2xhc3MoY2hpbGRyZW5baV0sIG9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMucHVzaChjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgZGlzcGF0Y2hFdmVudCh7XG4gICAgICAgICAgICAgICAgICBzb3J0YWJsZTogc29ydGFibGUsXG4gICAgICAgICAgICAgICAgICByb290RWw6IHJvb3RFbCxcbiAgICAgICAgICAgICAgICAgIG5hbWU6ICdzZWxlY3QnLFxuICAgICAgICAgICAgICAgICAgdGFyZ2V0RWw6IGNoaWxkcmVuW2ldLFxuICAgICAgICAgICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFzdE11bHRpRHJhZ1NlbGVjdCA9IGRyYWdFbCQxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHRvU29ydGFibGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc3BsaWNlKG11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZHJhZ0VsJDEpLCAxKTtcbiAgICAgICAgICBsYXN0TXVsdGlEcmFnU2VsZWN0ID0gbnVsbDtcbiAgICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICAgIHNvcnRhYmxlOiBzb3J0YWJsZSxcbiAgICAgICAgICAgIHJvb3RFbDogcm9vdEVsLFxuICAgICAgICAgICAgbmFtZTogJ2Rlc2VsZWN0JyxcbiAgICAgICAgICAgIHRhcmdldEVsOiBkcmFnRWwkMSxcbiAgICAgICAgICAgIG9yaWdpbmFsRXZlbnQ6IGV2dFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIE11bHRpLWRyYWcgZHJvcFxuICAgICAgaWYgKGRyYWdTdGFydGVkICYmIHRoaXMuaXNNdWx0aURyYWcpIHtcbiAgICAgICAgZm9sZGluZyA9IGZhbHNlO1xuICAgICAgICAvLyBEbyBub3QgXCJ1bmZvbGRcIiBhZnRlciBhcm91bmQgZHJhZ0VsIGlmIHJldmVydGVkXG4gICAgICAgIGlmICgocGFyZW50RWxbZXhwYW5kb10ub3B0aW9ucy5zb3J0IHx8IHBhcmVudEVsICE9PSByb290RWwpICYmIG11bHRpRHJhZ0VsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB2YXIgZHJhZ1JlY3QgPSBnZXRSZWN0KGRyYWdFbCQxKSxcbiAgICAgICAgICAgIG11bHRpRHJhZ0luZGV4ID0gaW5kZXgoZHJhZ0VsJDEsICc6bm90KC4nICsgdGhpcy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MgKyAnKScpO1xuICAgICAgICAgIGlmICghaW5pdGlhbEZvbGRpbmcgJiYgb3B0aW9ucy5hbmltYXRpb24pIGRyYWdFbCQxLnRoaXNBbmltYXRpb25EdXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgdG9Tb3J0YWJsZS5jYXB0dXJlQW5pbWF0aW9uU3RhdGUoKTtcbiAgICAgICAgICBpZiAoIWluaXRpYWxGb2xkaW5nKSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgZHJhZ0VsJDEuZnJvbVJlY3QgPSBkcmFnUmVjdDtcbiAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQudGhpc0FuaW1hdGlvbkR1cmF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAobXVsdGlEcmFnRWxlbWVudCAhPT0gZHJhZ0VsJDEpIHtcbiAgICAgICAgICAgICAgICAgIHZhciByZWN0ID0gZm9sZGluZyA/IGdldFJlY3QobXVsdGlEcmFnRWxlbWVudCkgOiBkcmFnUmVjdDtcbiAgICAgICAgICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnQuZnJvbVJlY3QgPSByZWN0O1xuXG4gICAgICAgICAgICAgICAgICAvLyBQcmVwYXJlIHVuZm9sZCBhbmltYXRpb25cbiAgICAgICAgICAgICAgICAgIHRvU29ydGFibGUuYWRkQW5pbWF0aW9uU3RhdGUoe1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG11bHRpRHJhZ0VsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHJlY3Q6IHJlY3RcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE11bHRpIGRyYWcgZWxlbWVudHMgYXJlIG5vdCBuZWNlc3NhcmlseSByZW1vdmVkIGZyb20gdGhlIERPTSBvbiBkcm9wLCBzbyB0byByZWluc2VydFxuICAgICAgICAgICAgLy8gcHJvcGVybHkgdGhleSBtdXN0IGFsbCBiZSByZW1vdmVkXG4gICAgICAgICAgICByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpO1xuICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICBpZiAoY2hpbGRyZW5bbXVsdGlEcmFnSW5kZXhdKSB7XG4gICAgICAgICAgICAgICAgcGFyZW50RWwuaW5zZXJ0QmVmb3JlKG11bHRpRHJhZ0VsZW1lbnQsIGNoaWxkcmVuW211bHRpRHJhZ0luZGV4XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGFyZW50RWwuYXBwZW5kQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbXVsdGlEcmFnSW5kZXgrKztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBJZiBpbml0aWFsIGZvbGRpbmcgaXMgZG9uZSwgdGhlIGVsZW1lbnRzIG1heSBoYXZlIGNoYW5nZWQgcG9zaXRpb24gYmVjYXVzZSB0aGV5IGFyZSBub3dcbiAgICAgICAgICAgIC8vIHVuZm9sZGluZyBhcm91bmQgZHJhZ0VsLCBldmVuIHRob3VnaCBkcmFnRWwgbWF5IG5vdCBoYXZlIGhpcyBpbmRleCBjaGFuZ2VkLCBzbyB1cGRhdGUgZXZlbnRcbiAgICAgICAgICAgIC8vIG11c3QgYmUgZmlyZWQgaGVyZSBhcyBTb3J0YWJsZSB3aWxsIG5vdC5cbiAgICAgICAgICAgIGlmIChvbGRJbmRleCA9PT0gaW5kZXgoZHJhZ0VsJDEpKSB7XG4gICAgICAgICAgICAgIHZhciB1cGRhdGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGlmIChtdWx0aURyYWdFbGVtZW50LnNvcnRhYmxlSW5kZXggIT09IGluZGV4KG11bHRpRHJhZ0VsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICB1cGRhdGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmICh1cGRhdGUpIHtcbiAgICAgICAgICAgICAgICBkaXNwYXRjaFNvcnRhYmxlRXZlbnQoJ3VwZGF0ZScpO1xuICAgICAgICAgICAgICAgIGRpc3BhdGNoU29ydGFibGVFdmVudCgnc29ydCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTXVzdCBiZSBkb25lIGFmdGVyIGNhcHR1cmluZyBpbmRpdmlkdWFsIHJlY3RzIChzY3JvbGwgYmFyKVxuICAgICAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHVuc2V0UmVjdChtdWx0aURyYWdFbGVtZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0b1NvcnRhYmxlLmFuaW1hdGVBbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHRvU29ydGFibGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBjbG9uZXMgaWYgbmVjZXNzYXJ5XG4gICAgICBpZiAocm9vdEVsID09PSBwYXJlbnRFbCB8fCBwdXRTb3J0YWJsZSAmJiBwdXRTb3J0YWJsZS5sYXN0UHV0TW9kZSAhPT0gJ2Nsb25lJykge1xuICAgICAgICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUpIHtcbiAgICAgICAgICBjbG9uZS5wYXJlbnROb2RlICYmIGNsb25lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY2xvbmUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG51bGxpbmdHbG9iYWw6IGZ1bmN0aW9uIG51bGxpbmdHbG9iYWwoKSB7XG4gICAgICB0aGlzLmlzTXVsdGlEcmFnID0gZHJhZ1N0YXJ0ZWQgPSBmYWxzZTtcbiAgICAgIG11bHRpRHJhZ0Nsb25lcy5sZW5ndGggPSAwO1xuICAgIH0sXG4gICAgZGVzdHJveUdsb2JhbDogZnVuY3Rpb24gZGVzdHJveUdsb2JhbCgpIHtcbiAgICAgIHRoaXMuX2Rlc2VsZWN0TXVsdGlEcmFnKCk7XG4gICAgICBvZmYoZG9jdW1lbnQsICdwb2ludGVydXAnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICBvZmYoZG9jdW1lbnQsICdtb3VzZXVwJywgdGhpcy5fZGVzZWxlY3RNdWx0aURyYWcpO1xuICAgICAgb2ZmKGRvY3VtZW50LCAndG91Y2hlbmQnLCB0aGlzLl9kZXNlbGVjdE11bHRpRHJhZyk7XG4gICAgICBvZmYoZG9jdW1lbnQsICdrZXlkb3duJywgdGhpcy5fY2hlY2tLZXlEb3duKTtcbiAgICAgIG9mZihkb2N1bWVudCwgJ2tleXVwJywgdGhpcy5fY2hlY2tLZXlVcCk7XG4gICAgfSxcbiAgICBfZGVzZWxlY3RNdWx0aURyYWc6IGZ1bmN0aW9uIF9kZXNlbGVjdE11bHRpRHJhZyhldnQpIHtcbiAgICAgIGlmICh0eXBlb2YgZHJhZ1N0YXJ0ZWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZHJhZ1N0YXJ0ZWQpIHJldHVybjtcblxuICAgICAgLy8gT25seSBkZXNlbGVjdCBpZiBzZWxlY3Rpb24gaXMgaW4gdGhpcyBzb3J0YWJsZVxuICAgICAgaWYgKG11bHRpRHJhZ1NvcnRhYmxlICE9PSB0aGlzLnNvcnRhYmxlKSByZXR1cm47XG5cbiAgICAgIC8vIE9ubHkgZGVzZWxlY3QgaWYgdGFyZ2V0IGlzIG5vdCBpdGVtIGluIHRoaXMgc29ydGFibGVcbiAgICAgIGlmIChldnQgJiYgY2xvc2VzdChldnQudGFyZ2V0LCB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlLCB0aGlzLnNvcnRhYmxlLmVsLCBmYWxzZSkpIHJldHVybjtcblxuICAgICAgLy8gT25seSBkZXNlbGVjdCBpZiBsZWZ0IGNsaWNrXG4gICAgICBpZiAoZXZ0ICYmIGV2dC5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIHdoaWxlIChtdWx0aURyYWdFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGVsID0gbXVsdGlEcmFnRWxlbWVudHNbMF07XG4gICAgICAgIHRvZ2dsZUNsYXNzKGVsLCB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRDbGFzcywgZmFsc2UpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5zaGlmdCgpO1xuICAgICAgICBkaXNwYXRjaEV2ZW50KHtcbiAgICAgICAgICBzb3J0YWJsZTogdGhpcy5zb3J0YWJsZSxcbiAgICAgICAgICByb290RWw6IHRoaXMuc29ydGFibGUuZWwsXG4gICAgICAgICAgbmFtZTogJ2Rlc2VsZWN0JyxcbiAgICAgICAgICB0YXJnZXRFbDogZWwsXG4gICAgICAgICAgb3JpZ2luYWxFdmVudDogZXZ0XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgX2NoZWNrS2V5RG93bjogZnVuY3Rpb24gX2NoZWNrS2V5RG93bihldnQpIHtcbiAgICAgIGlmIChldnQua2V5ID09PSB0aGlzLm9wdGlvbnMubXVsdGlEcmFnS2V5KSB7XG4gICAgICAgIHRoaXMubXVsdGlEcmFnS2V5RG93biA9IHRydWU7XG4gICAgICB9XG4gICAgfSxcbiAgICBfY2hlY2tLZXlVcDogZnVuY3Rpb24gX2NoZWNrS2V5VXAoZXZ0KSB7XG4gICAgICBpZiAoZXZ0LmtleSA9PT0gdGhpcy5vcHRpb25zLm11bHRpRHJhZ0tleSkge1xuICAgICAgICB0aGlzLm11bHRpRHJhZ0tleURvd24gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBfZXh0ZW5kcyhNdWx0aURyYWcsIHtcbiAgICAvLyBTdGF0aWMgbWV0aG9kcyAmIHByb3BlcnRpZXNcbiAgICBwbHVnaW5OYW1lOiAnbXVsdGlEcmFnJyxcbiAgICB1dGlsczoge1xuICAgICAgLyoqXHJcbiAgICAgICAqIFNlbGVjdHMgdGhlIHByb3ZpZGVkIG11bHRpLWRyYWcgaXRlbVxyXG4gICAgICAgKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gZWwgICAgVGhlIGVsZW1lbnQgdG8gYmUgc2VsZWN0ZWRcclxuICAgICAgICovXG4gICAgICBzZWxlY3Q6IGZ1bmN0aW9uIHNlbGVjdChlbCkge1xuICAgICAgICB2YXIgc29ydGFibGUgPSBlbC5wYXJlbnROb2RlW2V4cGFuZG9dO1xuICAgICAgICBpZiAoIXNvcnRhYmxlIHx8ICFzb3J0YWJsZS5vcHRpb25zLm11bHRpRHJhZyB8fCB+bXVsdGlEcmFnRWxlbWVudHMuaW5kZXhPZihlbCkpIHJldHVybjtcbiAgICAgICAgaWYgKG11bHRpRHJhZ1NvcnRhYmxlICYmIG11bHRpRHJhZ1NvcnRhYmxlICE9PSBzb3J0YWJsZSkge1xuICAgICAgICAgIG11bHRpRHJhZ1NvcnRhYmxlLm11bHRpRHJhZy5fZGVzZWxlY3RNdWx0aURyYWcoKTtcbiAgICAgICAgICBtdWx0aURyYWdTb3J0YWJsZSA9IHNvcnRhYmxlO1xuICAgICAgICB9XG4gICAgICAgIHRvZ2dsZUNsYXNzKGVsLCBzb3J0YWJsZS5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIHRydWUpO1xuICAgICAgICBtdWx0aURyYWdFbGVtZW50cy5wdXNoKGVsKTtcbiAgICAgIH0sXG4gICAgICAvKipcclxuICAgICAgICogRGVzZWxlY3RzIHRoZSBwcm92aWRlZCBtdWx0aS1kcmFnIGl0ZW1cclxuICAgICAgICogQHBhcmFtICB7SFRNTEVsZW1lbnR9IGVsICAgIFRoZSBlbGVtZW50IHRvIGJlIGRlc2VsZWN0ZWRcclxuICAgICAgICovXG4gICAgICBkZXNlbGVjdDogZnVuY3Rpb24gZGVzZWxlY3QoZWwpIHtcbiAgICAgICAgdmFyIHNvcnRhYmxlID0gZWwucGFyZW50Tm9kZVtleHBhbmRvXSxcbiAgICAgICAgICBpbmRleCA9IG11bHRpRHJhZ0VsZW1lbnRzLmluZGV4T2YoZWwpO1xuICAgICAgICBpZiAoIXNvcnRhYmxlIHx8ICFzb3J0YWJsZS5vcHRpb25zLm11bHRpRHJhZyB8fCAhfmluZGV4KSByZXR1cm47XG4gICAgICAgIHRvZ2dsZUNsYXNzKGVsLCBzb3J0YWJsZS5vcHRpb25zLnNlbGVjdGVkQ2xhc3MsIGZhbHNlKTtcbiAgICAgICAgbXVsdGlEcmFnRWxlbWVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGV2ZW50UHJvcGVydGllczogZnVuY3Rpb24gZXZlbnRQcm9wZXJ0aWVzKCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG4gICAgICB2YXIgb2xkSW5kaWNpZXMgPSBbXSxcbiAgICAgICAgbmV3SW5kaWNpZXMgPSBbXTtcbiAgICAgIG11bHRpRHJhZ0VsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKG11bHRpRHJhZ0VsZW1lbnQpIHtcbiAgICAgICAgb2xkSW5kaWNpZXMucHVzaCh7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICBpbmRleDogbXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIG11bHRpRHJhZ0VsZW1lbnRzIHdpbGwgYWxyZWFkeSBiZSBzb3J0ZWQgaWYgZm9sZGluZ1xuICAgICAgICB2YXIgbmV3SW5kZXg7XG4gICAgICAgIGlmIChmb2xkaW5nICYmIG11bHRpRHJhZ0VsZW1lbnQgIT09IGRyYWdFbCQxKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSAtMTtcbiAgICAgICAgfSBlbHNlIGlmIChmb2xkaW5nKSB7XG4gICAgICAgICAgbmV3SW5kZXggPSBpbmRleChtdWx0aURyYWdFbGVtZW50LCAnOm5vdCguJyArIF90aGlzMy5vcHRpb25zLnNlbGVjdGVkQ2xhc3MgKyAnKScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5ld0luZGV4ID0gaW5kZXgobXVsdGlEcmFnRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgbmV3SW5kaWNpZXMucHVzaCh7XG4gICAgICAgICAgbXVsdGlEcmFnRWxlbWVudDogbXVsdGlEcmFnRWxlbWVudCxcbiAgICAgICAgICBpbmRleDogbmV3SW5kZXhcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGl0ZW1zOiBfdG9Db25zdW1hYmxlQXJyYXkobXVsdGlEcmFnRWxlbWVudHMpLFxuICAgICAgICBjbG9uZXM6IFtdLmNvbmNhdChtdWx0aURyYWdDbG9uZXMpLFxuICAgICAgICBvbGRJbmRpY2llczogb2xkSW5kaWNpZXMsXG4gICAgICAgIG5ld0luZGljaWVzOiBuZXdJbmRpY2llc1xuICAgICAgfTtcbiAgICB9LFxuICAgIG9wdGlvbkxpc3RlbmVyczoge1xuICAgICAgbXVsdGlEcmFnS2V5OiBmdW5jdGlvbiBtdWx0aURyYWdLZXkoa2V5KSB7XG4gICAgICAgIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAoa2V5ID09PSAnY3RybCcpIHtcbiAgICAgICAgICBrZXkgPSAnQ29udHJvbCc7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBrZXkgPSBrZXkuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBrZXkuc3Vic3RyKDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBrZXk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIGluc2VydE11bHRpRHJhZ0VsZW1lbnRzKGNsb25lc0luc2VydGVkLCByb290RWwpIHtcbiAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCwgaSkge1xuICAgIHZhciB0YXJnZXQgPSByb290RWwuY2hpbGRyZW5bbXVsdGlEcmFnRWxlbWVudC5zb3J0YWJsZUluZGV4ICsgKGNsb25lc0luc2VydGVkID8gTnVtYmVyKGkpIDogMCldO1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgIHJvb3RFbC5pbnNlcnRCZWZvcmUobXVsdGlEcmFnRWxlbWVudCwgdGFyZ2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcm9vdEVsLmFwcGVuZENoaWxkKG11bHRpRHJhZ0VsZW1lbnQpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxyXG4gKiBJbnNlcnQgbXVsdGktZHJhZyBjbG9uZXNcclxuICogQHBhcmFtICB7W0Jvb2xlYW5dfSBlbGVtZW50c0luc2VydGVkICBXaGV0aGVyIHRoZSBtdWx0aS1kcmFnIGVsZW1lbnRzIGFyZSBpbnNlcnRlZFxyXG4gKiBAcGFyYW0gIHtIVE1MRWxlbWVudH0gcm9vdEVsXHJcbiAqL1xuZnVuY3Rpb24gaW5zZXJ0TXVsdGlEcmFnQ2xvbmVzKGVsZW1lbnRzSW5zZXJ0ZWQsIHJvb3RFbCkge1xuICBtdWx0aURyYWdDbG9uZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xvbmUsIGkpIHtcbiAgICB2YXIgdGFyZ2V0ID0gcm9vdEVsLmNoaWxkcmVuW2Nsb25lLnNvcnRhYmxlSW5kZXggKyAoZWxlbWVudHNJbnNlcnRlZCA/IE51bWJlcihpKSA6IDApXTtcbiAgICBpZiAodGFyZ2V0KSB7XG4gICAgICByb290RWwuaW5zZXJ0QmVmb3JlKGNsb25lLCB0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByb290RWwuYXBwZW5kQ2hpbGQoY2xvbmUpO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiByZW1vdmVNdWx0aURyYWdFbGVtZW50cygpIHtcbiAgbXVsdGlEcmFnRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAobXVsdGlEcmFnRWxlbWVudCkge1xuICAgIGlmIChtdWx0aURyYWdFbGVtZW50ID09PSBkcmFnRWwkMSkgcmV0dXJuO1xuICAgIG11bHRpRHJhZ0VsZW1lbnQucGFyZW50Tm9kZSAmJiBtdWx0aURyYWdFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobXVsdGlEcmFnRWxlbWVudCk7XG4gIH0pO1xufVxuXG5Tb3J0YWJsZS5tb3VudChuZXcgQXV0b1Njcm9sbFBsdWdpbigpKTtcblNvcnRhYmxlLm1vdW50KFJlbW92ZSwgUmV2ZXJ0KTtcblxuZXhwb3J0IGRlZmF1bHQgU29ydGFibGU7XG5leHBvcnQgeyBNdWx0aURyYWdQbHVnaW4gYXMgTXVsdGlEcmFnLCBTb3J0YWJsZSwgU3dhcFBsdWdpbiBhcyBTd2FwIH07XG4iLCAiaW1wb3J0IFNvcnRhYmxlIGZyb20gJ3NvcnRhYmxlanMnXG5cbndpbmRvdy5Tb3J0YWJsZSA9IFNvcnRhYmxlXG5cbmlmICh0eXBlb2Ygd2luZG93LkxpdmV3aXJlID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93ICdMaXZld2lyZSBTb3J0YWJsZSBQbHVnaW46IHdpbmRvdy5MaXZld2lyZSBpcyB1bmRlZmluZWQuIE1ha2Ugc3VyZSBAbGl2ZXdpcmVTY3JpcHRzIGlzIHBsYWNlZCBhYm92ZSB0aGlzIHNjcmlwdCBpbmNsdWRlJ1xufVxuXG5jb25zdCBtb3ZlRW5kTW9ycGhNYXJrZXIgPSAoZWwpID0+IHtcbiAgICBjb25zdCBlbmRNb3JwaE1hcmtlciA9IEFycmF5LmZyb20oZWwuY2hpbGROb2RlcykuZmlsdGVyKChjaGlsZE5vZGUpID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNoaWxkTm9kZS5ub2RlVHlwZSA9PT0gOCAmJlxuICAgICAgICAgICAgWydbaWYgRU5EQkxPQ0tdPjwhW2VuZGlmXScsICdfX0VOREJMT0NLX18nXS5pbmNsdWRlcyhjaGlsZE5vZGUubm9kZVZhbHVlPy50cmltKCkpXG4gICAgICAgIClcbiAgICB9KVswXVxuXG4gICAgaWYgKGVuZE1vcnBoTWFya2VyKSB7XG4gICAgICAgIGVsLmFwcGVuZENoaWxkKGVuZE1vcnBoTWFya2VyKVxuICAgIH1cbn1cblxuTGl2ZXdpcmUuZGlyZWN0aXZlKCdzb3J0YWJsZScsICh7IGVsLCBkaXJlY3RpdmUsIGNvbXBvbmVudCB9KSA9PiB7XG4gICAgaWYgKGRpcmVjdGl2ZS5tb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBsZXQgb3B0aW9ucyA9IHt9XG5cbiAgICBpZiAoZWwuaGFzQXR0cmlidXRlKCd3aXJlOnNvcnRhYmxlLm9wdGlvbnMnKSkge1xuICAgICAgICBvcHRpb25zID0gbmV3IEZ1bmN0aW9uKGByZXR1cm4gJHtlbC5nZXRBdHRyaWJ1dGUoJ3dpcmU6c29ydGFibGUub3B0aW9ucycpfTtgKSgpXG4gICAgfVxuXG4gICAgZWwubGl2ZXdpcmVfc29ydGFibGUgPSB3aW5kb3cuU29ydGFibGUuY3JlYXRlKGVsLCB7XG4gICAgICAgIHNvcnQ6IHRydWUsXG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGRyYWdnYWJsZTogJ1t3aXJlXFxcXDpzb3J0YWJsZVxcXFwuaXRlbV0nLFxuICAgICAgICBoYW5kbGU6IGVsLnF1ZXJ5U2VsZWN0b3IoJ1t3aXJlXFxcXDpzb3J0YWJsZVxcXFwuaGFuZGxlXScpID8gJ1t3aXJlXFxcXDpzb3J0YWJsZVxcXFwuaGFuZGxlXScgOiBudWxsLFxuICAgICAgICBkYXRhSWRBdHRyOiAnd2lyZTpzb3J0YWJsZS5pdGVtJyxcbiAgICAgICAgZ3JvdXA6IHtcbiAgICAgICAgICAgIHB1bGw6IGZhbHNlLFxuICAgICAgICAgICAgcHV0OiBmYWxzZSxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMuZ3JvdXAsXG4gICAgICAgICAgICBuYW1lOiBlbC5nZXRBdHRyaWJ1dGUoJ3dpcmU6c29ydGFibGUnKSxcbiAgICAgICAgfSxcbiAgICAgICAgc3RvcmU6IHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMuc3RvcmUsXG4gICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uIChzb3J0YWJsZSkge1xuICAgICAgICAgICAgICAgIGxldCBpdGVtcyA9IHNvcnRhYmxlLnRvQXJyYXkoKS5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXI6IGluZGV4ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBtb3ZlRW5kTW9ycGhNYXJrZXIoZWwpXG5cbiAgICAgICAgICAgICAgICBjb21wb25lbnQuJHdpcmUuY2FsbChkaXJlY3RpdmUubWV0aG9kLCBpdGVtcylcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSlcblxuICAgIGxldCBoYXNTZXRIYW5kbGVDb3JyZWN0bHkgPSBlbC5xdWVyeVNlbGVjdG9yKCdbd2lyZVxcXFw6c29ydGFibGVcXFxcLml0ZW1dJykgIT09IG51bGxcblxuICAgIC8vIElmIHRoZXJlIGFyZSBhbHJlYWR5IGl0ZW1zLCB0aGVuIHRoZSAnaGFuZGxlJyBvcHRpb24gaGFzIGFscmVhZHkgYmVlbiBjb3JyZWN0bHkgc2V0LlxuICAgIC8vIFRoZSBvcHRpb24gZG9lcyBub3QgaGF2ZSB0byByZWV2YWx1YXRlZCBhZnRlciB0aGUgbmV4dCBMaXZld2lyZSBjb21wb25lbnQgdXBkYXRlLlxuICAgIGlmIChoYXNTZXRIYW5kbGVDb3JyZWN0bHkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudENvbXBvbmVudCA9IGNvbXBvbmVudFxuXG4gICAgTGl2ZXdpcmUuaG9vaygnY29tbWl0JywgKHsgY29tcG9uZW50LCBzdWNjZWVkIH0pID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC5pZCAhPT0gY3VycmVudENvbXBvbmVudC5pZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzU2V0SGFuZGxlQ29ycmVjdGx5KSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIHN1Y2NlZWQoKCkgPT4ge1xuICAgICAgICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIGVsLmxpdmV3aXJlX3NvcnRhYmxlLm9wdGlvbihcbiAgICAgICAgICAgICAgICAgICAgJ2hhbmRsZScsXG4gICAgICAgICAgICAgICAgICAgIGVsLnF1ZXJ5U2VsZWN0b3IoJ1t3aXJlXFxcXDpzb3J0YWJsZVxcXFwuaGFuZGxlXScpID8gJ1t3aXJlXFxcXDpzb3J0YWJsZVxcXFwuaGFuZGxlXScgOiBudWxsLFxuICAgICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAgIGhhc1NldEhhbmRsZUNvcnJlY3RseSA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1t3aXJlXFxcXDpzb3J0YWJsZVxcXFwuaXRlbV0nKSAhPT0gbnVsbFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSlcbiAgICB9KVxufSlcblxuTGl2ZXdpcmUuZGlyZWN0aXZlKCdzb3J0YWJsZS1ncm91cCcsICh7IGVsLCBkaXJlY3RpdmUsIGNvbXBvbmVudCB9KSA9PiB7XG4gICAgLy8gT25seSBmaXJlIHRoaXMgaGFuZGxlciBvbiB0aGUgXCJyb290XCIgZ3JvdXAgZGlyZWN0aXZlLlxuICAgIGlmICghZGlyZWN0aXZlLm1vZGlmaWVycy5pbmNsdWRlcygnaXRlbS1ncm91cCcpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGxldCBvcHRpb25zID0ge31cblxuICAgIGlmIChlbC5oYXNBdHRyaWJ1dGUoJ3dpcmU6c29ydGFibGUtZ3JvdXAub3B0aW9ucycpKSB7XG4gICAgICAgIG9wdGlvbnMgPSBuZXcgRnVuY3Rpb24oYHJldHVybiAke2VsLmdldEF0dHJpYnV0ZSgnd2lyZTpzb3J0YWJsZS1ncm91cC5vcHRpb25zJyl9O2ApKClcbiAgICB9XG5cbiAgICBlbC5saXZld2lyZV9zb3J0YWJsZSA9IHdpbmRvdy5Tb3J0YWJsZS5jcmVhdGUoZWwsIHtcbiAgICAgICAgc29ydDogdHJ1ZSxcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgZHJhZ2dhYmxlOiAnW3dpcmVcXFxcOnNvcnRhYmxlLWdyb3VwXFxcXC5pdGVtXScsXG4gICAgICAgIGhhbmRsZTogJ1t3aXJlXFxcXDpzb3J0YWJsZS1ncm91cFxcXFwuaGFuZGxlXScsXG4gICAgICAgIGRhdGFJZEF0dHI6ICd3aXJlOnNvcnRhYmxlLWdyb3VwLml0ZW0nLFxuICAgICAgICBncm91cDoge1xuICAgICAgICAgICAgcHVsbDogdHJ1ZSxcbiAgICAgICAgICAgIHB1dDogdHJ1ZSxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMuZ3JvdXAsXG4gICAgICAgICAgICBuYW1lOiBlbC5jbG9zZXN0KCdbd2lyZVxcXFw6c29ydGFibGUtZ3JvdXBdJykuZ2V0QXR0cmlidXRlKCd3aXJlOnNvcnRhYmxlLWdyb3VwJyksXG4gICAgICAgIH0sXG4gICAgICAgIG9uU29ydDogKGV2dCkgPT4ge1xuICAgICAgICAgICAgaWYgKGV2dC50byAhPT0gZXZ0LmZyb20gJiYgZWwgPT09IGV2dC5mcm9tKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBtYXN0ZXJFbCA9IGVsLmNsb3Nlc3QoJ1t3aXJlXFxcXDpzb3J0YWJsZS1ncm91cF0nKVxuXG4gICAgICAgICAgICBsZXQgZ3JvdXBzID0gQXJyYXkuZnJvbShtYXN0ZXJFbC5xdWVyeVNlbGVjdG9yQWxsKCdbd2lyZVxcXFw6c29ydGFibGUtZ3JvdXBcXFxcLml0ZW0tZ3JvdXBdJykpLm1hcChcbiAgICAgICAgICAgICAgICAoZWwsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG1vdmVFbmRNb3JwaE1hcmtlcihlbClcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXI6IGluZGV4ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlbC5nZXRBdHRyaWJ1dGUoJ3dpcmU6c29ydGFibGUtZ3JvdXAuaXRlbS1ncm91cCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IGVsLmxpdmV3aXJlX3NvcnRhYmxlLnRvQXJyYXkoKS5tYXAoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyOiBpbmRleCArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIG1hc3RlckVsLmNsb3Nlc3QoJ1t3aXJlXFxcXDppZF0nKS5fX2xpdmV3aXJlLiR3aXJlLmNhbGwobWFzdGVyRWwuZ2V0QXR0cmlidXRlKCd3aXJlOnNvcnRhYmxlLWdyb3VwJyksIGdyb3VwcylcbiAgICAgICAgfSxcbiAgICB9KVxufSlcbiIsICJpbXBvcnQgU2xpZGVPdmVyUGFuZWwgZnJvbSAnLi9jb21wb25lbnRzL3BhbmVsJ1xuaW1wb3J0IFNlbGVjdFRyZWUgZnJvbSAnLi9jb21wb25lbnRzL3NlbGVjdC10cmVlJ1xuaW1wb3J0ICcuL2NvbXBvbmVudHMvc29ydGFibGUnXG5cbndpbmRvdy5TbGlkZU92ZXJQYW5lbCA9IFNsaWRlT3ZlclBhbmVsXG53aW5kb3cuc2VsZWN0VHJlZSA9IFNlbGVjdFRyZWVcblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYWxwaW5lOmluaXQnLCAoKSA9PiB7XG4gICAgY29uc3QgdGhlbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndGhlbWUnKSA/PyAnc3lzdGVtJ1xuXG4gICAgd2luZG93LkFscGluZS5zdG9yZShcbiAgICAgICAgJ3RoZW1lJyxcbiAgICAgICAgdGhlbWUgPT09ICdkYXJrJyB8fCAodGhlbWUgPT09ICdzeXN0ZW0nICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspJykubWF0Y2hlcylcbiAgICAgICAgICAgID8gJ2RhcmsnXG4gICAgICAgICAgICA6ICdsaWdodCcsXG4gICAgKVxuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3RoZW1lLWNoYW5nZWQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgbGV0IHRoZW1lID0gZXZlbnQuZGV0YWlsXG5cbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RoZW1lJywgdGhlbWUpXG5cbiAgICAgICAgaWYgKHRoZW1lID09PSAnc3lzdGVtJykge1xuICAgICAgICAgICAgdGhlbWUgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLm1hdGNoZXMgPyAnZGFyaycgOiAnbGlnaHQnXG4gICAgICAgIH1cblxuICAgICAgICB3aW5kb3cuQWxwaW5lLnN0b3JlKCd0aGVtZScsIHRoZW1lKVxuICAgIH0pXG5cbiAgICB3aW5kb3cubWF0Y2hNZWRpYSgnKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldmVudCkgPT4ge1xuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3RoZW1lJykgPT09ICdzeXN0ZW0nKSB7XG4gICAgICAgICAgICB3aW5kb3cuQWxwaW5lLnN0b3JlKCd0aGVtZScsIGV2ZW50Lm1hdGNoZXMgPyAnZGFyaycgOiAnbGlnaHQnKVxuICAgICAgICB9XG4gICAgfSlcblxuICAgIHdpbmRvdy5BbHBpbmUuZWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgdGhlbWUgPSB3aW5kb3cuQWxwaW5lLnN0b3JlKCd0aGVtZScpXG5cbiAgICAgICAgdGhlbWUgPT09ICdkYXJrJ1xuICAgICAgICAgICAgPyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZGFyaycpXG4gICAgICAgICAgICA6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkYXJrJylcbiAgICB9KVxufSlcbiJdLAogICJtYXBwaW5ncyI6ICI7O0FBQUEsTUFBTSxpQkFBaUIsTUFBTTtBQUN6QixXQUFPO0FBQUEsTUFDSCxNQUFNO0FBQUEsTUFDTixxQkFBcUI7QUFBQSxNQUNyQixpQkFBaUI7QUFBQSxNQUNqQixrQkFBa0IsQ0FBQztBQUFBLE1BQ25CLFlBQVk7QUFBQSxNQUNaLFdBQVcsQ0FBQztBQUFBLE1BQ1osaUNBQWlDLEtBQUs7QUFDbEMsWUFBSSxLQUFLLE1BQU0sSUFBSSxZQUFZLEVBQUUsS0FBSyxlQUFlLE1BQU0sUUFBVztBQUNsRSxpQkFBTyxLQUFLLE1BQU0sSUFBSSxZQUFZLEVBQUUsS0FBSyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsR0FBRztBQUFBLFFBQ3BGO0FBQUEsTUFDSjtBQUFBLE1BQ0EsbUJBQW1CLFNBQVM7QUFDeEIsWUFBSSxLQUFLLGlDQUFpQyxlQUFlLE1BQU0sT0FBTztBQUNsRTtBQUFBLFFBQ0o7QUFFQSxZQUFJLFFB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QSxXQUFVLFVBQVU7QUFDcEIsUUFBQUEsU0FBUSxPQUFPLFdBQVcsOEJBQThCLEVBQUUsVUFBVSxTQUFTO0FBQUEsTUFDakY7QUFFQSxhQUFPLE9BQU8sTUFBTSxTQUFTQSxNQUFLO0FBQUEsSUFDdEMsQ0FBQztBQUVELFdBQU8sV0FBVyw4QkFBOEIsRUFBRSxpQkFBaUIsVUFBVSxDQUFDLFVBQVU7QUFDcEYsVUFBSSxhQUFhLFFBQVEsT0FBTyxNQUFNLFVBQVU7QUFDNUMsZUFBTyxPQUFPLE1BQU0sU0FBUyxNQUFNLFVBQVUsU0FBUyxPQUFPO0FBQUEsTUFDakU7QUFBQSxJQUNKLENBQUM7QUFFRCxXQUFPLE9BQU8sT0FBTyxNQUFNO0FBQ3ZCLFlBQU1BLFNBQVEsT0FBTyxPQUFPLE1BQU0sT0FBTztBQUV6QyxNQUFBQSxXQUFVLFNBQ0osU0FBUyxnQkFBZ0IsVUFBVSxJQUFJLE1BQU0sSUFDN0MsU0FBUyxnQkFBZ0IsVUFBVSxPQUFPLE1BQU07QUFBQSxJQUMxRCxDQUFDO0FBQUEsRUFDTCxDQUFDOyIsCiAgIm5hbWVzIjogWyJpZCIsICJvYmoiLCAiXyIsICJuIiwgImluZGV4IiwgIm1zIiwgImdob3N0RWwiLCAib3B0aW9uIiwgInAiLCAiZGVmYXVsdHMiLCAicm9vdEVsIiwgImNsb25lRWwiLCAib2xkSW5kZXgiLCAibmV3SW5kZXgiLCAib2xkRHJhZ2dhYmxlSW5kZXgiLCAibmV3RHJhZ2dhYmxlSW5kZXgiLCAicHV0U29ydGFibGUiLCAicGx1Z2luRXZlbnQiLCAiX2RldGVjdERpcmVjdGlvbiIsICJfZHJhZ0VsSW5Sb3dDb2x1bW4iLCAiX2RldGVjdE5lYXJlc3RFbXB0eVNvcnRhYmxlIiwgIl9wcmVwYXJlR3JvdXAiLCAiZHJhZ0VsIiwgIl9oaWRlR2hvc3RGb3JUYXJnZXQiLCAiX3VuaGlkZUdob3N0Rm9yVGFyZ2V0IiwgIm5lYXJlc3RFbXB0eUluc2VydERldGVjdEV2ZW50IiwgIl9jaGVja091dHNpZGVUYXJnZXRFbCIsICJkcmFnU3RhcnRGbiIsICJ0YXJnZXQiLCAiYWZ0ZXIiLCAibiIsICJlbCIsICJpcyIsICJwbHVnaW5zIiwgImRyb3AiLCAiYXV0b1Njcm9sbCIsICJvblNwaWxsIiwgImluZGV4IiwgImNvbXBvbmVudCIsICJlbCIsICJ0aGVtZSJdCn0K diff --git a/packages/admin/resources/css/base.css b/packages/admin/resources/css/base.css index 7baff8ced..3e52d8af5 100755 --- a/packages/admin/resources/css/base.css +++ b/packages/admin/resources/css/base.css @@ -1,67 +1,67 @@ input { - width: 100%; + width: 100%; } input[type='number']::-webkit-inner-spin-button { - -webkit-appearance: none; + -webkit-appearance: none; } input[type='number'] { - -moz-appearance: textfield; - appearance: textfield; - margin: 0; + -moz-appearance: textfield; + appearance: textfield; + margin: 0; } *::-webkit-scrollbar-track { - background-color: transparent; + background-color: transparent; } *::-webkit-scrollbar { - width: 4px; - height: 4px; + width: 4px; + height: 4px; } *::-webkit-scrollbar-thumb { - background-color: theme('colors.gray.300'); - border-radius: 8px; + background-color: theme('colors.gray.300'); + border-radius: 8px; } *::-webkit-scrollbar-thumb:hover { - background-color: theme('colors.gray.400'); + background-color: theme('colors.gray.400'); } .dark *::-webkit-scrollbar-thumb { - background-color: theme('colors.gray.700'); + background-color: theme('colors.gray.700'); } .dark *::-webkit-scrollbar-thumb:hover { - background-color: theme('colors.gray.900'); + background-color: theme('colors.gray.900'); } .hide-scroll::-webkit-scrollbar { - display: none; + display: none; } [x-cloak] { - display: none !important; + display: none !important; } .primary-menu .active { - background-color: theme('colors.primary.900'); + background-color: theme('colors.primary.900'); } .primary-menu .active:hover, .primary-menu .active:focus { - background-color: theme('colors.primary.900'); + background-color: theme('colors.primary.900'); } .ui-modal > div > div.fixed { - @apply z-50 backdrop-blur-sm transition-opacity; + @apply z-50 backdrop-blur-sm transition-opacity; } .shopper-product-wizard > div { - @apply flex-1 h-full; + @apply h-full flex-1; } .sh-input-media .filepond--list-scroller { - z-index: 100; + z-index: 100; } diff --git a/packages/admin/resources/css/components/filament.css b/packages/admin/resources/css/components/filament.css index 6daaa266d..21c26e5b7 100644 --- a/packages/admin/resources/css/components/filament.css +++ b/packages/admin/resources/css/components/filament.css @@ -1,39 +1,49 @@ .fi-modal-close-overlay { - @apply backdrop-blur-sm; + @apply backdrop-blur-sm; } @keyframes shaking { - 0% { transform: translateX(0) } - 25% { transform: translateX(5px) } - 50% { transform: translateX(-5px) } - 75% { transform: translateX(5px) } - 100% { transform: translateX(0) } + 0% { + transform: translateX(0); + } + 25% { + transform: translateX(5px); + } + 50% { + transform: translateX(-5px); + } + 75% { + transform: translateX(5px); + } + 100% { + transform: translateX(0); + } } .horizontal-shake { - animation: shaking 0.35s normal; - animation-iteration-count: 1 + animation: shaking 0.35s normal; + animation-iteration-count: 1; } @layer components { - .filament-icon-picker .choices > .choices__list { - @apply px-2; - } + .filament-icon-picker .choices > .choices__list { + @apply px-2; + } - .filament-icon-picker .choices > .choices__inner > .choices__list.choices__list--single { - @apply w-full; - } + .filament-icon-picker .choices > .choices__inner > .choices__list.choices__list--single { + @apply w-full; + } - .filament-icon-picker .choices > .choices__list .choices__list { - @apply pb-2 gap-2; - } + .filament-icon-picker .choices > .choices__list .choices__list { + @apply gap-2 pb-2; + } - .filament-icon-picker .choices > .choices__list .choices__list { - @apply grid; - } + .filament-icon-picker .choices > .choices__list .choices__list { + @apply grid; + } } .filament-icon-picker .choices > .choices__list .choices__list .choices__item.has-no-choices, .filament-icon-picker .choices > .choices__list .choices__list .choices__item.has-no-results, .filament-icon-picker .choices > .choices__list .choices__list .choices__item.choices__item--disabled { - @apply col-span-full; + @apply col-span-full; } diff --git a/packages/admin/resources/css/components/intl-phone.css b/packages/admin/resources/css/components/intl-phone.css index 4259534b5..16b9db4cd 100755 --- a/packages/admin/resources/css/components/intl-phone.css +++ b/packages/admin/resources/css/components/intl-phone.css @@ -1,932 +1,1243 @@ .iti { - position: relative; - display: block; + position: relative; + display: block; } .iti * { - box-sizing: border-box; - -moz-box-sizing: border-box; } + box-sizing: border-box; + -moz-box-sizing: border-box; +} .iti__hide { - display: none; } + display: none; +} .iti__v-hide { - visibility: hidden; } -.iti input, .iti input[type=text], .iti input[type=tel] { - position: relative; - z-index: 0; - margin-top: 0 !important; - margin-bottom: 0 !important; - padding-right: 36px; - margin-right: 0; } + visibility: hidden; +} +.iti input, +.iti input[type='text'], +.iti input[type='tel'] { + position: relative; + z-index: 0; + margin-top: 0 !important; + margin-bottom: 0 !important; + padding-right: 36px; + margin-right: 0; +} .iti__flag-container { - position: absolute; - top: 0; - bottom: 0; - right: 0; - padding: 1px; } + position: absolute; + top: 0; + bottom: 0; + right: 0; + padding: 1px; +} .iti__selected-flag { - z-index: 1; - position: relative; - display: flex; - align-items: center; - height: 100%; - padding: 0 10px; + z-index: 1; + position: relative; + display: flex; + align-items: center; + height: 100%; + padding: 0 10px; } .iti__arrow { - margin-left: 6px; - width: 0; - height: 0; - border-left: 3px solid transparent; - border-right: 3px solid transparent; - border-top: 4px solid #555; } + margin-left: 6px; + width: 0; + height: 0; + border-left: 3px solid transparent; + border-right: 3px solid transparent; + border-top: 4px solid #555; +} .iti__arrow--up { - border-top: none; - border-bottom: 4px solid #555; } + border-top: none; + border-bottom: 4px solid #555; +} .iti__country-list { - position: absolute; - z-index: 2; - list-style: none; - text-align: left; - padding: 0; - margin: 0 0 0 -1px; - box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.2); - background-color: white; - border: 1px solid #CCC; - white-space: nowrap; - max-height: 200px; - overflow-y: scroll; - -webkit-overflow-scrolling: touch; } + position: absolute; + z-index: 2; + list-style: none; + text-align: left; + padding: 0; + margin: 0 0 0 -1px; + box-shadow: 1px 1px 4px rgba(0, 0, 0, 0.2); + background-color: white; + border: 1px solid #ccc; + white-space: nowrap; + max-height: 200px; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; +} .iti__country-list--dropup { - bottom: 100%; - margin-bottom: -1px; } + bottom: 100%; + margin-bottom: -1px; +} @media (max-width: 500px) { - .iti__country-list { - white-space: normal; } } + .iti__country-list { + white-space: normal; + } +} .iti__flag-box { - display: inline-block; - width: 20px; } + display: inline-block; + width: 20px; +} .iti__divider { - padding-bottom: 5px; - margin-bottom: 5px; - border-bottom: 1px solid #CCC; } + padding-bottom: 5px; + margin-bottom: 5px; + border-bottom: 1px solid #ccc; +} .iti__country { - padding: 5px 10px; - outline: none; } + padding: 5px 10px; + outline: none; +} .iti__dial-code { - color: #999; } + color: #999; +} .iti__country.iti__highlight { - background-color: rgba(0, 0, 0, 0.05); } -.iti__flag-box, .iti__country-name, .iti__dial-code { - vertical-align: middle; } -.iti__flag-box, .iti__country-name { - margin-right: 6px; } -.iti--allow-dropdown input, .iti--allow-dropdown input[type=text], .iti--allow-dropdown input[type=tel], .iti--separate-dial-code input, .iti--separate-dial-code input[type=text], .iti--separate-dial-code input[type=tel] { - padding-right: 6px; - padding-left: 52px; - margin-left: 0; } -.iti--allow-dropdown .iti__flag-container, .iti--separate-dial-code .iti__flag-container { - right: auto; - left: 0; } + background-color: rgba(0, 0, 0, 0.05); +} +.iti__flag-box, +.iti__country-name, +.iti__dial-code { + vertical-align: middle; +} +.iti__flag-box, +.iti__country-name { + margin-right: 6px; +} +.iti--allow-dropdown input, +.iti--allow-dropdown input[type='text'], +.iti--allow-dropdown input[type='tel'], +.iti--separate-dial-code input, +.iti--separate-dial-code input[type='text'], +.iti--separate-dial-code input[type='tel'] { + padding-right: 6px; + padding-left: 52px; + margin-left: 0; +} +.iti--allow-dropdown .iti__flag-container, +.iti--separate-dial-code .iti__flag-container { + right: auto; + left: 0; +} .iti--allow-dropdown .iti__flag-container:hover { - cursor: pointer; } + cursor: pointer; +} .iti--allow-dropdown .iti__flag-container:hover .iti__selected-flag { - background-color: rgba(0, 0, 0, 0.05); } + background-color: rgba(0, 0, 0, 0.05); +} .iti--allow-dropdown input[disabled] + .iti__flag-container:hover, .iti--allow-dropdown input[readonly] + .iti__flag-container:hover { - cursor: default; } + cursor: default; +} .iti--allow-dropdown input[disabled] + .iti__flag-container:hover .iti__selected-flag, .iti--allow-dropdown input[readonly] + .iti__flag-container:hover .iti__selected-flag { - background-color: transparent; } + background-color: transparent; +} .iti--separate-dial-code .iti__selected-flag { - background-color: rgba(0, 0, 0, 0.05); } + background-color: rgba(0, 0, 0, 0.05); +} .iti--separate-dial-code .iti__selected-dial-code { - margin-left: 6px; } + margin-left: 6px; +} .iti--container { - position: absolute; - top: -1000px; - left: -1000px; - z-index: 1060; - padding: 1px; } + position: absolute; + top: -1000px; + left: -1000px; + z-index: 1060; + padding: 1px; +} .iti--container:hover { - cursor: pointer; } + cursor: pointer; +} .iti-mobile .iti--container { - top: 30px; - bottom: 30px; - left: 30px; - right: 30px; - position: fixed; } + top: 30px; + bottom: 30px; + left: 30px; + right: 30px; + position: fixed; +} .iti-mobile .iti__country-list { - max-height: 100%; - width: 100%; } + max-height: 100%; + width: 100%; +} .iti-mobile .iti__country { - padding: 10px 10px; - line-height: 1.5em; } + padding: 10px 10px; + line-height: 1.5em; +} .iti__flag { - width: 20px; } + width: 20px; +} .iti__flag.iti__be { - width: 18px; } + width: 18px; +} .iti__flag.iti__ch { - width: 15px; } + width: 15px; +} .iti__flag.iti__mc { - width: 19px; } + width: 19px; +} .iti__flag.iti__ne { - width: 18px; } + width: 18px; +} .iti__flag.iti__np { - width: 13px; } + width: 13px; +} .iti__flag.iti__va { - width: 15px; } + width: 15px; +} @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { - .iti__flag { - background-size: 5652px 15px; } } + .iti__flag { + background-size: 5652px 15px; + } +} .iti__flag.iti__ac { - height: 10px; - background-position: 0px 0px; } + height: 10px; + background-position: 0px 0px; +} .iti__flag.iti__ad { - height: 14px; - background-position: -22px 0px; } + height: 14px; + background-position: -22px 0px; +} .iti__flag.iti__ae { - height: 10px; - background-position: -44px 0px; } + height: 10px; + background-position: -44px 0px; +} .iti__flag.iti__af { - height: 14px; - background-position: -66px 0px; } + height: 14px; + background-position: -66px 0px; +} .iti__flag.iti__ag { - height: 14px; - background-position: -88px 0px; } + height: 14px; + background-position: -88px 0px; +} .iti__flag.iti__ai { - height: 10px; - background-position: -110px 0px; } + height: 10px; + background-position: -110px 0px; +} .iti__flag.iti__al { - height: 15px; - background-position: -132px 0px; } + height: 15px; + background-position: -132px 0px; +} .iti__flag.iti__am { - height: 10px; - background-position: -154px 0px; } + height: 10px; + background-position: -154px 0px; +} .iti__flag.iti__ao { - height: 14px; - background-position: -176px 0px; } + height: 14px; + background-position: -176px 0px; +} .iti__flag.iti__aq { - height: 14px; - background-position: -198px 0px; } + height: 14px; + background-position: -198px 0px; +} .iti__flag.iti__ar { - height: 13px; - background-position: -220px 0px; } + height: 13px; + background-position: -220px 0px; +} .iti__flag.iti__as { - height: 10px; - background-position: -242px 0px; } + height: 10px; + background-position: -242px 0px; +} .iti__flag.iti__at { - height: 14px; - background-position: -264px 0px; } + height: 14px; + background-position: -264px 0px; +} .iti__flag.iti__au { - height: 10px; - background-position: -286px 0px; } + height: 10px; + background-position: -286px 0px; +} .iti__flag.iti__aw { - height: 14px; - background-position: -308px 0px; } + height: 14px; + background-position: -308px 0px; +} .iti__flag.iti__ax { - height: 13px; - background-position: -330px 0px; } + height: 13px; + background-position: -330px 0px; +} .iti__flag.iti__az { - height: 10px; - background-position: -352px 0px; } + height: 10px; + background-position: -352px 0px; +} .iti__flag.iti__ba { - height: 10px; - background-position: -374px 0px; } + height: 10px; + background-position: -374px 0px; +} .iti__flag.iti__bb { - height: 14px; - background-position: -396px 0px; } + height: 14px; + background-position: -396px 0px; +} .iti__flag.iti__bd { - height: 12px; - background-position: -418px 0px; } + height: 12px; + background-position: -418px 0px; +} .iti__flag.iti__be { - height: 15px; - background-position: -440px 0px; } + height: 15px; + background-position: -440px 0px; +} .iti__flag.iti__bf { - height: 14px; - background-position: -460px 0px; } + height: 14px; + background-position: -460px 0px; +} .iti__flag.iti__bg { - height: 12px; - background-position: -482px 0px; } + height: 12px; + background-position: -482px 0px; +} .iti__flag.iti__bh { - height: 12px; - background-position: -504px 0px; } + height: 12px; + background-position: -504px 0px; +} .iti__flag.iti__bi { - height: 12px; - background-position: -526px 0px; } + height: 12px; + background-position: -526px 0px; +} .iti__flag.iti__bj { - height: 14px; - background-position: -548px 0px; } + height: 14px; + background-position: -548px 0px; +} .iti__flag.iti__bl { - height: 14px; - background-position: -570px 0px; } + height: 14px; + background-position: -570px 0px; +} .iti__flag.iti__bm { - height: 10px; - background-position: -592px 0px; } + height: 10px; + background-position: -592px 0px; +} .iti__flag.iti__bn { - height: 10px; - background-position: -614px 0px; } + height: 10px; + background-position: -614px 0px; +} .iti__flag.iti__bo { - height: 14px; - background-position: -636px 0px; } + height: 14px; + background-position: -636px 0px; +} .iti__flag.iti__bq { - height: 14px; - background-position: -658px 0px; } + height: 14px; + background-position: -658px 0px; +} .iti__flag.iti__br { - height: 14px; - background-position: -680px 0px; } + height: 14px; + background-position: -680px 0px; +} .iti__flag.iti__bs { - height: 10px; - background-position: -702px 0px; } + height: 10px; + background-position: -702px 0px; +} .iti__flag.iti__bt { - height: 14px; - background-position: -724px 0px; } + height: 14px; + background-position: -724px 0px; +} .iti__flag.iti__bv { - height: 15px; - background-position: -746px 0px; } + height: 15px; + background-position: -746px 0px; +} .iti__flag.iti__bw { - height: 14px; - background-position: -768px 0px; } + height: 14px; + background-position: -768px 0px; +} .iti__flag.iti__by { - height: 10px; - background-position: -790px 0px; } + height: 10px; + background-position: -790px 0px; +} .iti__flag.iti__bz { - height: 14px; - background-position: -812px 0px; } + height: 14px; + background-position: -812px 0px; +} .iti__flag.iti__ca { - height: 10px; - background-position: -834px 0px; } + height: 10px; + background-position: -834px 0px; +} .iti__flag.iti__cc { - height: 10px; - background-position: -856px 0px; } + height: 10px; + background-position: -856px 0px; +} .iti__flag.iti__cd { - height: 15px; - background-position: -878px 0px; } + height: 15px; + background-position: -878px 0px; +} .iti__flag.iti__cf { - height: 14px; - background-position: -900px 0px; } + height: 14px; + background-position: -900px 0px; +} .iti__flag.iti__cg { - height: 14px; - background-position: -922px 0px; } + height: 14px; + background-position: -922px 0px; +} .iti__flag.iti__ch { - height: 15px; - background-position: -944px 0px; } + height: 15px; + background-position: -944px 0px; +} .iti__flag.iti__ci { - height: 14px; - background-position: -961px 0px; } + height: 14px; + background-position: -961px 0px; +} .iti__flag.iti__ck { - height: 10px; - background-position: -983px 0px; } + height: 10px; + background-position: -983px 0px; +} .iti__flag.iti__cl { - height: 14px; - background-position: -1005px 0px; } + height: 14px; + background-position: -1005px 0px; +} .iti__flag.iti__cm { - height: 14px; - background-position: -1027px 0px; } + height: 14px; + background-position: -1027px 0px; +} .iti__flag.iti__cn { - height: 14px; - background-position: -1049px 0px; } + height: 14px; + background-position: -1049px 0px; +} .iti__flag.iti__co { - height: 14px; - background-position: -1071px 0px; } + height: 14px; + background-position: -1071px 0px; +} .iti__flag.iti__cp { - height: 14px; - background-position: -1093px 0px; } + height: 14px; + background-position: -1093px 0px; +} .iti__flag.iti__cr { - height: 12px; - background-position: -1115px 0px; } + height: 12px; + background-position: -1115px 0px; +} .iti__flag.iti__cu { - height: 10px; - background-position: -1137px 0px; } + height: 10px; + background-position: -1137px 0px; +} .iti__flag.iti__cv { - height: 12px; - background-position: -1159px 0px; } + height: 12px; + background-position: -1159px 0px; +} .iti__flag.iti__cw { - height: 14px; - background-position: -1181px 0px; } + height: 14px; + background-position: -1181px 0px; +} .iti__flag.iti__cx { - height: 10px; - background-position: -1203px 0px; } + height: 10px; + background-position: -1203px 0px; +} .iti__flag.iti__cy { - height: 14px; - background-position: -1225px 0px; } + height: 14px; + background-position: -1225px 0px; +} .iti__flag.iti__cz { - height: 14px; - background-position: -1247px 0px; } + height: 14px; + background-position: -1247px 0px; +} .iti__flag.iti__de { - height: 12px; - background-position: -1269px 0px; } + height: 12px; + background-position: -1269px 0px; +} .iti__flag.iti__dg { - height: 10px; - background-position: -1291px 0px; } + height: 10px; + background-position: -1291px 0px; +} .iti__flag.iti__dj { - height: 14px; - background-position: -1313px 0px; } + height: 14px; + background-position: -1313px 0px; +} .iti__flag.iti__dk { - height: 15px; - background-position: -1335px 0px; } + height: 15px; + background-position: -1335px 0px; +} .iti__flag.iti__dm { - height: 10px; - background-position: -1357px 0px; } + height: 10px; + background-position: -1357px 0px; +} .iti__flag.iti__do { - height: 14px; - background-position: -1379px 0px; } + height: 14px; + background-position: -1379px 0px; +} .iti__flag.iti__dz { - height: 14px; - background-position: -1401px 0px; } + height: 14px; + background-position: -1401px 0px; +} .iti__flag.iti__ea { - height: 14px; - background-position: -1423px 0px; } + height: 14px; + background-position: -1423px 0px; +} .iti__flag.iti__ec { - height: 14px; - background-position: -1445px 0px; } + height: 14px; + background-position: -1445px 0px; +} .iti__flag.iti__ee { - height: 13px; - background-position: -1467px 0px; } + height: 13px; + background-position: -1467px 0px; +} .iti__flag.iti__eg { - height: 14px; - background-position: -1489px 0px; } + height: 14px; + background-position: -1489px 0px; +} .iti__flag.iti__eh { - height: 10px; - background-position: -1511px 0px; } + height: 10px; + background-position: -1511px 0px; +} .iti__flag.iti__er { - height: 10px; - background-position: -1533px 0px; } + height: 10px; + background-position: -1533px 0px; +} .iti__flag.iti__es { - height: 14px; - background-position: -1555px 0px; } + height: 14px; + background-position: -1555px 0px; +} .iti__flag.iti__et { - height: 10px; - background-position: -1577px 0px; } + height: 10px; + background-position: -1577px 0px; +} .iti__flag.iti__eu { - height: 14px; - background-position: -1599px 0px; } + height: 14px; + background-position: -1599px 0px; +} .iti__flag.iti__fi { - height: 12px; - background-position: -1621px 0px; } + height: 12px; + background-position: -1621px 0px; +} .iti__flag.iti__fj { - height: 10px; - background-position: -1643px 0px; } + height: 10px; + background-position: -1643px 0px; +} .iti__flag.iti__fk { - height: 10px; - background-position: -1665px 0px; } + height: 10px; + background-position: -1665px 0px; +} .iti__flag.iti__fm { - height: 11px; - background-position: -1687px 0px; } + height: 11px; + background-position: -1687px 0px; +} .iti__flag.iti__fo { - height: 15px; - background-position: -1709px 0px; } + height: 15px; + background-position: -1709px 0px; +} .iti__flag.iti__fr { - height: 14px; - background-position: -1731px 0px; } + height: 14px; + background-position: -1731px 0px; +} .iti__flag.iti__ga { - height: 15px; - background-position: -1753px 0px; } + height: 15px; + background-position: -1753px 0px; +} .iti__flag.iti__gb { - height: 10px; - background-position: -1775px 0px; } + height: 10px; + background-position: -1775px 0px; +} .iti__flag.iti__gd { - height: 12px; - background-position: -1797px 0px; } + height: 12px; + background-position: -1797px 0px; +} .iti__flag.iti__ge { - height: 14px; - background-position: -1819px 0px; } + height: 14px; + background-position: -1819px 0px; +} .iti__flag.iti__gf { - height: 14px; - background-position: -1841px 0px; } + height: 14px; + background-position: -1841px 0px; +} .iti__flag.iti__gg { - height: 14px; - background-position: -1863px 0px; } + height: 14px; + background-position: -1863px 0px; +} .iti__flag.iti__gh { - height: 14px; - background-position: -1885px 0px; } + height: 14px; + background-position: -1885px 0px; +} .iti__flag.iti__gi { - height: 10px; - background-position: -1907px 0px; } + height: 10px; + background-position: -1907px 0px; +} .iti__flag.iti__gl { - height: 14px; - background-position: -1929px 0px; } + height: 14px; + background-position: -1929px 0px; +} .iti__flag.iti__gm { - height: 14px; - background-position: -1951px 0px; } + height: 14px; + background-position: -1951px 0px; +} .iti__flag.iti__gn { - height: 14px; - background-position: -1973px 0px; } + height: 14px; + background-position: -1973px 0px; +} .iti__flag.iti__gp { - height: 14px; - background-position: -1995px 0px; } + height: 14px; + background-position: -1995px 0px; +} .iti__flag.iti__gq { - height: 14px; - background-position: -2017px 0px; } + height: 14px; + background-position: -2017px 0px; +} .iti__flag.iti__gr { - height: 14px; - background-position: -2039px 0px; } + height: 14px; + background-position: -2039px 0px; +} .iti__flag.iti__gs { - height: 10px; - background-position: -2061px 0px; } + height: 10px; + background-position: -2061px 0px; +} .iti__flag.iti__gt { - height: 13px; - background-position: -2083px 0px; } + height: 13px; + background-position: -2083px 0px; +} .iti__flag.iti__gu { - height: 11px; - background-position: -2105px 0px; } + height: 11px; + background-position: -2105px 0px; +} .iti__flag.iti__gw { - height: 10px; - background-position: -2127px 0px; } + height: 10px; + background-position: -2127px 0px; +} .iti__flag.iti__gy { - height: 12px; - background-position: -2149px 0px; } + height: 12px; + background-position: -2149px 0px; +} .iti__flag.iti__hk { - height: 14px; - background-position: -2171px 0px; } + height: 14px; + background-position: -2171px 0px; +} .iti__flag.iti__hm { - height: 10px; - background-position: -2193px 0px; } + height: 10px; + background-position: -2193px 0px; +} .iti__flag.iti__hn { - height: 10px; - background-position: -2215px 0px; } + height: 10px; + background-position: -2215px 0px; +} .iti__flag.iti__hr { - height: 10px; - background-position: -2237px 0px; } + height: 10px; + background-position: -2237px 0px; +} .iti__flag.iti__ht { - height: 12px; - background-position: -2259px 0px; } + height: 12px; + background-position: -2259px 0px; +} .iti__flag.iti__hu { - height: 10px; - background-position: -2281px 0px; } + height: 10px; + background-position: -2281px 0px; +} .iti__flag.iti__ic { - height: 14px; - background-position: -2303px 0px; } + height: 14px; + background-position: -2303px 0px; +} .iti__flag.iti__id { - height: 14px; - background-position: -2325px 0px; } + height: 14px; + background-position: -2325px 0px; +} .iti__flag.iti__ie { - height: 10px; - background-position: -2347px 0px; } + height: 10px; + background-position: -2347px 0px; +} .iti__flag.iti__il { - height: 15px; - background-position: -2369px 0px; } + height: 15px; + background-position: -2369px 0px; +} .iti__flag.iti__im { - height: 10px; - background-position: -2391px 0px; } + height: 10px; + background-position: -2391px 0px; +} .iti__flag.iti__in { - height: 14px; - background-position: -2413px 0px; } + height: 14px; + background-position: -2413px 0px; +} .iti__flag.iti__io { - height: 10px; - background-position: -2435px 0px; } + height: 10px; + background-position: -2435px 0px; +} .iti__flag.iti__iq { - height: 14px; - background-position: -2457px 0px; } + height: 14px; + background-position: -2457px 0px; +} .iti__flag.iti__ir { - height: 12px; - background-position: -2479px 0px; } + height: 12px; + background-position: -2479px 0px; +} .iti__flag.iti__is { - height: 15px; - background-position: -2501px 0px; } + height: 15px; + background-position: -2501px 0px; +} .iti__flag.iti__it { - height: 14px; - background-position: -2523px 0px; } + height: 14px; + background-position: -2523px 0px; +} .iti__flag.iti__je { - height: 12px; - background-position: -2545px 0px; } + height: 12px; + background-position: -2545px 0px; +} .iti__flag.iti__jm { - height: 10px; - background-position: -2567px 0px; } + height: 10px; + background-position: -2567px 0px; +} .iti__flag.iti__jo { - height: 10px; - background-position: -2589px 0px; } + height: 10px; + background-position: -2589px 0px; +} .iti__flag.iti__jp { - height: 14px; - background-position: -2611px 0px; } + height: 14px; + background-position: -2611px 0px; +} .iti__flag.iti__ke { - height: 14px; - background-position: -2633px 0px; } + height: 14px; + background-position: -2633px 0px; +} .iti__flag.iti__kg { - height: 12px; - background-position: -2655px 0px; } + height: 12px; + background-position: -2655px 0px; +} .iti__flag.iti__kh { - height: 13px; - background-position: -2677px 0px; } + height: 13px; + background-position: -2677px 0px; +} .iti__flag.iti__ki { - height: 10px; - background-position: -2699px 0px; } + height: 10px; + background-position: -2699px 0px; +} .iti__flag.iti__km { - height: 12px; - background-position: -2721px 0px; } + height: 12px; + background-position: -2721px 0px; +} .iti__flag.iti__kn { - height: 14px; - background-position: -2743px 0px; } + height: 14px; + background-position: -2743px 0px; +} .iti__flag.iti__kp { - height: 10px; - background-position: -2765px 0px; } + height: 10px; + background-position: -2765px 0px; +} .iti__flag.iti__kr { - height: 14px; - background-position: -2787px 0px; } + height: 14px; + background-position: -2787px 0px; +} .iti__flag.iti__kw { - height: 10px; - background-position: -2809px 0px; } + height: 10px; + background-position: -2809px 0px; +} .iti__flag.iti__ky { - height: 10px; - background-position: -2831px 0px; } + height: 10px; + background-position: -2831px 0px; +} .iti__flag.iti__kz { - height: 10px; - background-position: -2853px 0px; } + height: 10px; + background-position: -2853px 0px; +} .iti__flag.iti__la { - height: 14px; - background-position: -2875px 0px; } + height: 14px; + background-position: -2875px 0px; +} .iti__flag.iti__lb { - height: 14px; - background-position: -2897px 0px; } + height: 14px; + background-position: -2897px 0px; +} .iti__flag.iti__lc { - height: 10px; - background-position: -2919px 0px; } + height: 10px; + background-position: -2919px 0px; +} .iti__flag.iti__li { - height: 12px; - background-position: -2941px 0px; } + height: 12px; + background-position: -2941px 0px; +} .iti__flag.iti__lk { - height: 10px; - background-position: -2963px 0px; } + height: 10px; + background-position: -2963px 0px; +} .iti__flag.iti__lr { - height: 11px; - background-position: -2985px 0px; } + height: 11px; + background-position: -2985px 0px; +} .iti__flag.iti__ls { - height: 14px; - background-position: -3007px 0px; } + height: 14px; + background-position: -3007px 0px; +} .iti__flag.iti__lt { - height: 12px; - background-position: -3029px 0px; } + height: 12px; + background-position: -3029px 0px; +} .iti__flag.iti__lu { - height: 12px; - background-position: -3051px 0px; } + height: 12px; + background-position: -3051px 0px; +} .iti__flag.iti__lv { - height: 10px; - background-position: -3073px 0px; } + height: 10px; + background-position: -3073px 0px; +} .iti__flag.iti__ly { - height: 10px; - background-position: -3095px 0px; } + height: 10px; + background-position: -3095px 0px; +} .iti__flag.iti__ma { - height: 14px; - background-position: -3117px 0px; } + height: 14px; + background-position: -3117px 0px; +} .iti__flag.iti__mc { - height: 15px; - background-position: -3139px 0px; } + height: 15px; + background-position: -3139px 0px; +} .iti__flag.iti__md { - height: 10px; - background-position: -3160px 0px; } + height: 10px; + background-position: -3160px 0px; +} .iti__flag.iti__me { - height: 10px; - background-position: -3182px 0px; } + height: 10px; + background-position: -3182px 0px; +} .iti__flag.iti__mf { - height: 14px; - background-position: -3204px 0px; } + height: 14px; + background-position: -3204px 0px; +} .iti__flag.iti__mg { - height: 14px; - background-position: -3226px 0px; } + height: 14px; + background-position: -3226px 0px; +} .iti__flag.iti__mh { - height: 11px; - background-position: -3248px 0px; } + height: 11px; + background-position: -3248px 0px; +} .iti__flag.iti__mk { - height: 10px; - background-position: -3270px 0px; } + height: 10px; + background-position: -3270px 0px; +} .iti__flag.iti__ml { - height: 14px; - background-position: -3292px 0px; } + height: 14px; + background-position: -3292px 0px; +} .iti__flag.iti__mm { - height: 14px; - background-position: -3314px 0px; } + height: 14px; + background-position: -3314px 0px; +} .iti__flag.iti__mn { - height: 10px; - background-position: -3336px 0px; } + height: 10px; + background-position: -3336px 0px; +} .iti__flag.iti__mo { - height: 14px; - background-position: -3358px 0px; } + height: 14px; + background-position: -3358px 0px; +} .iti__flag.iti__mp { - height: 10px; - background-position: -3380px 0px; } + height: 10px; + background-position: -3380px 0px; +} .iti__flag.iti__mq { - height: 14px; - background-position: -3402px 0px; } + height: 14px; + background-position: -3402px 0px; +} .iti__flag.iti__mr { - height: 14px; - background-position: -3424px 0px; } + height: 14px; + background-position: -3424px 0px; +} .iti__flag.iti__ms { - height: 10px; - background-position: -3446px 0px; } + height: 10px; + background-position: -3446px 0px; +} .iti__flag.iti__mt { - height: 14px; - background-position: -3468px 0px; } + height: 14px; + background-position: -3468px 0px; +} .iti__flag.iti__mu { - height: 14px; - background-position: -3490px 0px; } + height: 14px; + background-position: -3490px 0px; +} .iti__flag.iti__mv { - height: 14px; - background-position: -3512px 0px; } + height: 14px; + background-position: -3512px 0px; +} .iti__flag.iti__mw { - height: 14px; - background-position: -3534px 0px; } + height: 14px; + background-position: -3534px 0px; +} .iti__flag.iti__mx { - height: 12px; - background-position: -3556px 0px; } + height: 12px; + background-position: -3556px 0px; +} .iti__flag.iti__my { - height: 10px; - background-position: -3578px 0px; } + height: 10px; + background-position: -3578px 0px; +} .iti__flag.iti__mz { - height: 14px; - background-position: -3600px 0px; } + height: 14px; + background-position: -3600px 0px; +} .iti__flag.iti__na { - height: 14px; - background-position: -3622px 0px; } + height: 14px; + background-position: -3622px 0px; +} .iti__flag.iti__nc { - height: 10px; - background-position: -3644px 0px; } + height: 10px; + background-position: -3644px 0px; +} .iti__flag.iti__ne { - height: 15px; - background-position: -3666px 0px; } + height: 15px; + background-position: -3666px 0px; +} .iti__flag.iti__nf { - height: 10px; - background-position: -3686px 0px; } + height: 10px; + background-position: -3686px 0px; +} .iti__flag.iti__ng { - height: 10px; - background-position: -3708px 0px; } + height: 10px; + background-position: -3708px 0px; +} .iti__flag.iti__ni { - height: 12px; - background-position: -3730px 0px; } + height: 12px; + background-position: -3730px 0px; +} .iti__flag.iti__nl { - height: 14px; - background-position: -3752px 0px; } + height: 14px; + background-position: -3752px 0px; +} .iti__flag.iti__no { - height: 15px; - background-position: -3774px 0px; } + height: 15px; + background-position: -3774px 0px; +} .iti__flag.iti__np { - height: 15px; - background-position: -3796px 0px; } + height: 15px; + background-position: -3796px 0px; +} .iti__flag.iti__nr { - height: 10px; - background-position: -3811px 0px; } + height: 10px; + background-position: -3811px 0px; +} .iti__flag.iti__nu { - height: 10px; - background-position: -3833px 0px; } + height: 10px; + background-position: -3833px 0px; +} .iti__flag.iti__nz { - height: 10px; - background-position: -3855px 0px; } + height: 10px; + background-position: -3855px 0px; +} .iti__flag.iti__om { - height: 10px; - background-position: -3877px 0px; } + height: 10px; + background-position: -3877px 0px; +} .iti__flag.iti__pa { - height: 14px; - background-position: -3899px 0px; } + height: 14px; + background-position: -3899px 0px; +} .iti__flag.iti__pe { - height: 14px; - background-position: -3921px 0px; } + height: 14px; + background-position: -3921px 0px; +} .iti__flag.iti__pf { - height: 14px; - background-position: -3943px 0px; } + height: 14px; + background-position: -3943px 0px; +} .iti__flag.iti__pg { - height: 15px; - background-position: -3965px 0px; } + height: 15px; + background-position: -3965px 0px; +} .iti__flag.iti__ph { - height: 10px; - background-position: -3987px 0px; } + height: 10px; + background-position: -3987px 0px; +} .iti__flag.iti__pk { - height: 14px; - background-position: -4009px 0px; } + height: 14px; + background-position: -4009px 0px; +} .iti__flag.iti__pl { - height: 13px; - background-position: -4031px 0px; } + height: 13px; + background-position: -4031px 0px; +} .iti__flag.iti__pm { - height: 14px; - background-position: -4053px 0px; } + height: 14px; + background-position: -4053px 0px; +} .iti__flag.iti__pn { - height: 10px; - background-position: -4075px 0px; } + height: 10px; + background-position: -4075px 0px; +} .iti__flag.iti__pr { - height: 14px; - background-position: -4097px 0px; } + height: 14px; + background-position: -4097px 0px; +} .iti__flag.iti__ps { - height: 10px; - background-position: -4119px 0px; } + height: 10px; + background-position: -4119px 0px; +} .iti__flag.iti__pt { - height: 14px; - background-position: -4141px 0px; } + height: 14px; + background-position: -4141px 0px; +} .iti__flag.iti__pw { - height: 13px; - background-position: -4163px 0px; } + height: 13px; + background-position: -4163px 0px; +} .iti__flag.iti__py { - height: 11px; - background-position: -4185px 0px; } + height: 11px; + background-position: -4185px 0px; +} .iti__flag.iti__qa { - height: 8px; - background-position: -4207px 0px; } + height: 8px; + background-position: -4207px 0px; +} .iti__flag.iti__re { - height: 14px; - background-position: -4229px 0px; } + height: 14px; + background-position: -4229px 0px; +} .iti__flag.iti__ro { - height: 14px; - background-position: -4251px 0px; } + height: 14px; + background-position: -4251px 0px; +} .iti__flag.iti__rs { - height: 14px; - background-position: -4273px 0px; } + height: 14px; + background-position: -4273px 0px; +} .iti__flag.iti__ru { - height: 14px; - background-position: -4295px 0px; } + height: 14px; + background-position: -4295px 0px; +} .iti__flag.iti__rw { - height: 14px; - background-position: -4317px 0px; } + height: 14px; + background-position: -4317px 0px; +} .iti__flag.iti__sa { - height: 14px; - background-position: -4339px 0px; } + height: 14px; + background-position: -4339px 0px; +} .iti__flag.iti__sb { - height: 10px; - background-position: -4361px 0px; } + height: 10px; + background-position: -4361px 0px; +} .iti__flag.iti__sc { - height: 10px; - background-position: -4383px 0px; } + height: 10px; + background-position: -4383px 0px; +} .iti__flag.iti__sd { - height: 10px; - background-position: -4405px 0px; } + height: 10px; + background-position: -4405px 0px; +} .iti__flag.iti__se { - height: 13px; - background-position: -4427px 0px; } + height: 13px; + background-position: -4427px 0px; +} .iti__flag.iti__sg { - height: 14px; - background-position: -4449px 0px; } + height: 14px; + background-position: -4449px 0px; +} .iti__flag.iti__sh { - height: 10px; - background-position: -4471px 0px; } + height: 10px; + background-position: -4471px 0px; +} .iti__flag.iti__si { - height: 10px; - background-position: -4493px 0px; } + height: 10px; + background-position: -4493px 0px; +} .iti__flag.iti__sj { - height: 15px; - background-position: -4515px 0px; } + height: 15px; + background-position: -4515px 0px; +} .iti__flag.iti__sk { - height: 14px; - background-position: -4537px 0px; } + height: 14px; + background-position: -4537px 0px; +} .iti__flag.iti__sl { - height: 14px; - background-position: -4559px 0px; } + height: 14px; + background-position: -4559px 0px; +} .iti__flag.iti__sm { - height: 15px; - background-position: -4581px 0px; } + height: 15px; + background-position: -4581px 0px; +} .iti__flag.iti__sn { - height: 14px; - background-position: -4603px 0px; } + height: 14px; + background-position: -4603px 0px; +} .iti__flag.iti__so { - height: 14px; - background-position: -4625px 0px; } + height: 14px; + background-position: -4625px 0px; +} .iti__flag.iti__sr { - height: 14px; - background-position: -4647px 0px; } + height: 14px; + background-position: -4647px 0px; +} .iti__flag.iti__ss { - height: 10px; - background-position: -4669px 0px; } + height: 10px; + background-position: -4669px 0px; +} .iti__flag.iti__st { - height: 10px; - background-position: -4691px 0px; } + height: 10px; + background-position: -4691px 0px; +} .iti__flag.iti__sv { - height: 12px; - background-position: -4713px 0px; } + height: 12px; + background-position: -4713px 0px; +} .iti__flag.iti__sx { - height: 14px; - background-position: -4735px 0px; } + height: 14px; + background-position: -4735px 0px; +} .iti__flag.iti__sy { - height: 14px; - background-position: -4757px 0px; } + height: 14px; + background-position: -4757px 0px; +} .iti__flag.iti__sz { - height: 14px; - background-position: -4779px 0px; } + height: 14px; + background-position: -4779px 0px; +} .iti__flag.iti__ta { - height: 10px; - background-position: -4801px 0px; } + height: 10px; + background-position: -4801px 0px; +} .iti__flag.iti__tc { - height: 10px; - background-position: -4823px 0px; } + height: 10px; + background-position: -4823px 0px; +} .iti__flag.iti__td { - height: 14px; - background-position: -4845px 0px; } + height: 14px; + background-position: -4845px 0px; +} .iti__flag.iti__tf { - height: 14px; - background-position: -4867px 0px; } + height: 14px; + background-position: -4867px 0px; +} .iti__flag.iti__tg { - height: 13px; - background-position: -4889px 0px; } + height: 13px; + background-position: -4889px 0px; +} .iti__flag.iti__th { - height: 14px; - background-position: -4911px 0px; } + height: 14px; + background-position: -4911px 0px; +} .iti__flag.iti__tj { - height: 10px; - background-position: -4933px 0px; } + height: 10px; + background-position: -4933px 0px; +} .iti__flag.iti__tk { - height: 10px; - background-position: -4955px 0px; } + height: 10px; + background-position: -4955px 0px; +} .iti__flag.iti__tl { - height: 10px; - background-position: -4977px 0px; } + height: 10px; + background-position: -4977px 0px; +} .iti__flag.iti__tm { - height: 14px; - background-position: -4999px 0px; } + height: 14px; + background-position: -4999px 0px; +} .iti__flag.iti__tn { - height: 14px; - background-position: -5021px 0px; } + height: 14px; + background-position: -5021px 0px; +} .iti__flag.iti__to { - height: 10px; - background-position: -5043px 0px; } + height: 10px; + background-position: -5043px 0px; +} .iti__flag.iti__tr { - height: 14px; - background-position: -5065px 0px; } + height: 14px; + background-position: -5065px 0px; +} .iti__flag.iti__tt { - height: 12px; - background-position: -5087px 0px; } + height: 12px; + background-position: -5087px 0px; +} .iti__flag.iti__tv { - height: 10px; - background-position: -5109px 0px; } + height: 10px; + background-position: -5109px 0px; +} .iti__flag.iti__tw { - height: 14px; - background-position: -5131px 0px; } + height: 14px; + background-position: -5131px 0px; +} .iti__flag.iti__tz { - height: 14px; - background-position: -5153px 0px; } + height: 14px; + background-position: -5153px 0px; +} .iti__flag.iti__ua { - height: 14px; - background-position: -5175px 0px; } + height: 14px; + background-position: -5175px 0px; +} .iti__flag.iti__ug { - height: 14px; - background-position: -5197px 0px; } + height: 14px; + background-position: -5197px 0px; +} .iti__flag.iti__um { - height: 11px; - background-position: -5219px 0px; } + height: 11px; + background-position: -5219px 0px; +} .iti__flag.iti__un { - height: 14px; - background-position: -5241px 0px; } + height: 14px; + background-position: -5241px 0px; +} .iti__flag.iti__us { - height: 11px; - background-position: -5263px 0px; } + height: 11px; + background-position: -5263px 0px; +} .iti__flag.iti__uy { - height: 14px; - background-position: -5285px 0px; } + height: 14px; + background-position: -5285px 0px; +} .iti__flag.iti__uz { - height: 10px; - background-position: -5307px 0px; } + height: 10px; + background-position: -5307px 0px; +} .iti__flag.iti__va { - height: 15px; - background-position: -5329px 0px; } + height: 15px; + background-position: -5329px 0px; +} .iti__flag.iti__vc { - height: 14px; - background-position: -5346px 0px; } + height: 14px; + background-position: -5346px 0px; +} .iti__flag.iti__ve { - height: 14px; - background-position: -5368px 0px; } + height: 14px; + background-position: -5368px 0px; +} .iti__flag.iti__vg { - height: 10px; - background-position: -5390px 0px; } + height: 10px; + background-position: -5390px 0px; +} .iti__flag.iti__vi { - height: 14px; - background-position: -5412px 0px; } + height: 14px; + background-position: -5412px 0px; +} .iti__flag.iti__vn { - height: 14px; - background-position: -5434px 0px; } + height: 14px; + background-position: -5434px 0px; +} .iti__flag.iti__vu { - height: 12px; - background-position: -5456px 0px; } + height: 12px; + background-position: -5456px 0px; +} .iti__flag.iti__wf { - height: 14px; - background-position: -5478px 0px; } + height: 14px; + background-position: -5478px 0px; +} .iti__flag.iti__ws { - height: 10px; - background-position: -5500px 0px; } + height: 10px; + background-position: -5500px 0px; +} .iti__flag.iti__xk { - height: 15px; - background-position: -5522px 0px; } + height: 15px; + background-position: -5522px 0px; +} .iti__flag.iti__ye { - height: 14px; - background-position: -5544px 0px; } + height: 14px; + background-position: -5544px 0px; +} .iti__flag.iti__yt { - height: 14px; - background-position: -5566px 0px; } + height: 14px; + background-position: -5566px 0px; +} .iti__flag.iti__za { - height: 14px; - background-position: -5588px 0px; } + height: 14px; + background-position: -5588px 0px; +} .iti__flag.iti__zm { - height: 14px; - background-position: -5610px 0px; } + height: 14px; + background-position: -5610px 0px; +} .iti__flag.iti__zw { - height: 10px; - background-position: -5632px 0px; } + height: 10px; + background-position: -5632px 0px; +} .iti__flag { - height: 15px; - box-shadow: 0px 0px 1px 0px #888; - background-image: url("/shopper/img/flags.png"); - background-repeat: no-repeat; - background-color: #DBDBDB; - background-position: 20px 0; } + height: 15px; + box-shadow: 0px 0px 1px 0px #888; + background-image: url('/shopper/img/flags.png'); + background-repeat: no-repeat; + background-color: #dbdbdb; + background-position: 20px 0; +} @media (-webkit-min-device-pixel-ratio: 2), (min-resolution: 192dpi) { - .iti__flag { - background-image: url("/shopper/img/flags@2x.png"); - } + .iti__flag { + background-image: url('/shopper/img/flags@2x.png'); + } } .iti__flag.iti__np { - background-color: transparent; } + background-color: transparent; +} diff --git a/packages/admin/resources/css/components/sidebar.css b/packages/admin/resources/css/components/sidebar.css index f12bf280c..2b981b811 100755 --- a/packages/admin/resources/css/components/sidebar.css +++ b/packages/admin/resources/css/components/sidebar.css @@ -1,31 +1,31 @@ .sidebar { - @apply space-y-5; + @apply space-y-5; } .sh-heading { - @apply text-xs leading-5 text-gray-500 dark:text-gray-400 uppercase tracking-wider mb-2 font-medium ml-3; + @apply mb-2 ml-3 text-xs font-medium uppercase leading-5 tracking-wider text-gray-500 dark:text-gray-400; } .sh-sidebar-item { - @apply flex items-center rounded-lg py-2 px-3 text-sm font-medium transition ease-in-out duration-150; + @apply flex items-center rounded-lg px-3 py-2 text-sm font-medium transition duration-150 ease-in-out; } .sh-sidebar-item-active { - @apply text-primary-600 bg-white ring-1 ring-inset ring-gray-200 shadow-sm dark:text-primary-500 dark:bg-gray-800 dark:ring-gray-700; + @apply bg-white text-primary-600 shadow-sm ring-1 ring-inset ring-gray-200 dark:bg-gray-800 dark:text-primary-500 dark:ring-gray-700; } .sh-sidebar-item-inactive { - @apply text-gray-600 hover:text-gray-900 hover:bg-gray-100 dark:text-gray-300 dark:hover:text-white dark:hover:bg-gray-900; + @apply text-gray-600 hover:bg-gray-100 hover:text-gray-900 dark:text-gray-300 dark:hover:bg-gray-900 dark:hover:text-white; } .item-name { - @apply flex-1 truncate; + @apply flex-1 truncate; } .submenu { - @apply my-3 ml-5 hidden space-y-2 py-2.5 border-l border-gray-200 dark:border-gray-800 lg:space-y-3; + @apply my-3 ml-5 hidden space-y-2 border-l border-gray-200 py-2.5 dark:border-gray-800 lg:space-y-3; } .current-group .submenu { - @apply block; + @apply block; } diff --git a/packages/admin/resources/css/components/treeselect.css b/packages/admin/resources/css/components/treeselect.css index c34334e2a..0278c2701 100644 --- a/packages/admin/resources/css/components/treeselect.css +++ b/packages/admin/resources/css/components/treeselect.css @@ -1,94 +1,83 @@ -@import "treeselectjs/dist/treeselectjs.css"; +@import 'treeselectjs/dist/treeselectjs.css'; .treeselect-input { - @apply text-base text-gray-900 pl-2.5 bg-transparent border-0 transition duration-75 sm:text-sm sm:leading-6; - /*font-size: 0.875rem; - color: rgba(var(--gray-950), var(--tw-text-opacity)); - transition-duration: 75ms; - border-style: none; - line-height: 1.5rem;*/ - outline: 2px solid transparent; - outline-offset: 2px; - padding-left: 8px; + @apply border-0 bg-transparent pl-2.5 text-base text-gray-900 transition duration-75 sm:text-sm sm:leading-6; + outline: 2px solid transparent; + outline-offset: 2px; + padding-left: 8px; } .dark .treeselect > .treeselect-input { - color: rgb(255 255 255 / var(--tw-text-opacity)) !important; + color: rgb(255 255 255 / var(--tw-text-opacity)) !important; } .treeselect-input--opened.treeselect-input--bottom { - border: inherit; - border-radius: inherit; + border: inherit; + border-radius: inherit; } .treeselect-input__edit { - @apply bg-transparent placeholder-gray-400 dark:placeholder-gray-500; + @apply bg-transparent placeholder-gray-400 dark:placeholder-gray-500; } .treeselect-input__tags-count { - margin-left: 9px; + margin-left: 9px; } .treeselect-list { - font-size: 0.875rem; - line-height: 1.25rem; - margin-top: 0.5rem; - border-radius: 0.5rem; - padding: 0.25rem; - --tw-bg-opacity: 1; - --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), - 0 4px 6px -4px rgba(0, 0, 0, 0.1); - --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), - 0 4px 6px -4px var(--tw-shadow-color); - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 - var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 - calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - --tw-ring-color: rgba(var(--gray-950), 0.05); - background-color: rgb(255 255 255 / var(--tw-bg-opacity)); - box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), - var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), - var(--tw-shadow, 0 0 #0000); - border: none; + font-size: 0.875rem; + line-height: 1.25rem; + margin-top: 0.5rem; + border-radius: 0.5rem; + padding: 0.25rem; + --tw-bg-opacity: 1; + --tw-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + --tw-ring-color: rgba(var(--gray-950), 0.05); + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + border: none; } .treeselect-list__item { - padding: 1.1rem; - border-radius: 0.475rem; + padding: 1.1rem; + border-radius: 0.475rem; } .treeselect-list.treeselect-list--single-select .treeselect-list__item--single-selected { - --tw-bg-opacity: 1; - background-color: rgba(var(--gray-50), var(--tw-bg-opacity)) !important; + --tw-bg-opacity: 1; + background-color: rgba(var(--gray-50), var(--tw-bg-opacity)) !important; } .treeselect-list__item:hover, .treeselect-list__item--focused { - --tw-bg-opacity: 1; - background-color: rgba(var(--gray-50), var(--tw-bg-opacity)) !important; + --tw-bg-opacity: 1; + background-color: rgba(var(--gray-50), var(--tw-bg-opacity)) !important; } .treeselect-list.treeselect-list--single-select .treeselect-list__item--single-selected { - font-weight: 500; + font-weight: 500; } .dark .treeselect-list { - --tw-bg-opacity: 1; - --tw-ring-color: hsla(0, 0%, 100%, 0.1); - background-color: rgba(var(--gray-900), var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + --tw-ring-color: hsla(0, 0%, 100%, 0.1); + background-color: rgba(var(--gray-900), var(--tw-bg-opacity)); } .dark .treeselect-list { - --tw-bg-opacity: 1; - --tw-ring-color: hsla(0, 0%, 100%, 0.1); - background-color: rgba(var(--gray-900), var(--tw-bg-opacity)); + --tw-bg-opacity: 1; + --tw-ring-color: hsla(0, 0%, 100%, 0.1); + background-color: rgba(var(--gray-900), var(--tw-bg-opacity)); } .treeselect-input__edit { - border: transparent !important; - --tw-ring-color: none !important; - --tw-ring-shadow: none !important; + border: transparent !important; + --tw-ring-color: none !important; + --tw-ring-shadow: none !important; } .dark .treeselect-list.treeselect-list--single-select .treeselect-list__item--single-selected, @@ -97,156 +86,150 @@ .dark .treeselect-list.treeselect-list--single-select .treeselect-list__item--single-selected, .dark .treeselect-list__item--focused, .dark .treeselect-list__item:hover { - background-color: hsla(0, 0%, 100%, 0.05) !important; + background-color: hsla(0, 0%, 100%, 0.05) !important; } dark .treeselect-list__item--checked, .treeselect-list__item--checked { - background: transparent; + background: transparent; } .treeselect-input__tags-element { - --tw-bg-opacity: 1; - --tw-text-opacity: 1; - --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 - var(--tw-ring-offset-width) var(--tw-ring-offset-color); - --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 - calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); - --tw-ring-inset: inset; - --tw-ring-color: rgba(var(--primary-600), 0.1); - align-items: center; - background-color: rgba(var(--primary-50), var(--tw-bg-opacity)); - border-radius: 0.375rem; - box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), - var(--tw-shadow, 0 0 #0000); - color: rgba(var(--primary-600), var(--tw-text-opacity)); - display: inline-flex; - font-size: 0.75rem; - font-weight: 500; - gap: 0.25rem; - line-height: 1rem; - padding: 0.25rem 0.5rem; - word-break: break-all; + --tw-bg-opacity: 1; + --tw-text-opacity: 1; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + --tw-ring-inset: inset; + --tw-ring-color: rgba(var(--primary-600), 0.1); + align-items: center; + background-color: rgba(var(--primary-50), var(--tw-bg-opacity)); + border-radius: 0.375rem; + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + color: rgba(var(--primary-600), var(--tw-text-opacity)); + display: inline-flex; + font-size: 0.75rem; + font-weight: 500; + gap: 0.25rem; + line-height: 1rem; + padding: 0.25rem 0.5rem; + word-break: break-all; } .dark .treeselect-input__tags-element { - --tw-text-opacity: 1; - --tw-ring-color: rgba(var(--primary-400), 0.3); - background-color: rgba(var(--primary-400), 0.1); - color: rgba(var(--primary-400), var(--tw-text-opacity)); + --tw-text-opacity: 1; + --tw-ring-color: rgba(var(--primary-400), 0.3); + background-color: rgba(var(--primary-400), 0.1); + color: rgba(var(--primary-400), var(--tw-text-opacity)); } .treeselect-list__item-checkbox-container { - border-radius: 0.25rem; - height: 16px; - min-width: 16px; - width: 16px; + border-radius: 0.25rem; + height: 16px; + min-width: 16px; + width: 16px; } .treeselect-list__item--checked .treeselect-list__item-checkbox-container, .treeselect-list__item--partial-checked .treeselect-list__item-checkbox-container { - background-color: theme('colors.primary.600'); + background-color: theme('colors.primary.600'); } .treeselect-list__item-checkbox { - transition-duration: 75ms; - background-color: transparent !important; - border: none; + transition-duration: 75ms; + background-color: transparent !important; + border: none; } .treeselect-list__item-checkbox-container { - background-color: #f8f5f5; - border: none; + background-color: #f8f5f5; + border: none; } .dark .treeselect-list__item-checkbox-container { - border: rgb(255 255 255 / var(--tw-text-opacity)); + border: rgb(255 255 255 / var(--tw-text-opacity)); } .dark .treeselect-list__item-checkbox-container { - background-color: hsla(0, 0%, 100%, 0.05); + background-color: hsla(0, 0%, 100%, 0.05); } .treeselect-list__item-checkbox-icon { - height: 80%; - left: 0.1rem; - top: 0.1rem; - width: 80%; + height: 80%; + left: 0.1rem; + top: 0.1rem; + width: 80%; } .treeselect-input__tags-element:hover { - background-color: rgba(var(--primary-50), var(--tw-bg-opacity)); + background-color: rgba(var(--primary-50), var(--tw-bg-opacity)); } .treeselect-input__tags-element:hover .treeselect-input__tags-cross svg { - stroke: rgba(var(--gray-950), var(--tw-text-opacity)); + stroke: rgba(var(--gray-950), var(--tw-text-opacity)); } -.dark -.treeselect-input__tags-element:hover -.treeselect-input__tags-cross -svg { - stroke: rgb(255 255 255 / var(--tw-text-opacity)); +.dark .treeselect-input__tags-element:hover .treeselect-input__tags-cross svg { + stroke: rgb(255 255 255 / var(--tw-text-opacity)); } .treeselect-input__tags-element { - color: rgba(var(--primary-600), var(--tw-text-opacity)); + color: rgba(var(--primary-600), var(--tw-text-opacity)); } .dark .treeselect-input__tags-element { - color: rgba(var(--primary-400), var(--tw-text-opacity)); + color: rgba(var(--primary-400), var(--tw-text-opacity)); } .dark .treeselect-input__tags-cross svg { - stroke-width: 3px; + stroke-width: 3px; } .dark .treeselect-input__tags-cross svg { - stroke: rgb(255 255 255 / var(--tw-text-opacity)); - opacity: 0.5; + stroke: rgb(255 255 255 / var(--tw-text-opacity)); + opacity: 0.5; } .dark .treeselect-input__tags-element:hover svg { - opacity: 0.6; + opacity: 0.6; } .treeselect-input__clear svg { - opacity: 0.8; + opacity: 0.8; } .treeselect-input__tags { - margin-left: 3px; + margin-left: 3px; } .treeselect--disabled .treeselect-input__tags-cross { - display: none; + display: none; } .treeselect--disabled .treeselect-input__arrow { - display: none; + display: none; } .treeselect-input__arrow { - margin-right: 7px; + margin-right: 7px; } .treeselect--disabled .treeselect-input__clear { - display: none; + display: none; } .treeselect-list__item--disabled { - cursor: not-allowed !important; + cursor: not-allowed !important; } .dark .treeselect-list__item--disabled .treeselect-list__item-checkbox-container { - background-color: hsl(0deg 0% 30.77% / 5%); + background-color: hsl(0deg 0% 30.77% / 5%); } [dir='rtl'] .treeselect-input__operators { - left: 2px !important; - right: unset; + left: 2px !important; + right: unset; } [dir='rtl'] .treeselect-input { - padding: 2px 4px 2px 40px; + padding: 2px 4px 2px 40px; } diff --git a/packages/admin/resources/css/shopper.css b/packages/admin/resources/css/shopper.css index 76d1d2bf4..e52d046a2 100755 --- a/packages/admin/resources/css/shopper.css +++ b/packages/admin/resources/css/shopper.css @@ -9,17 +9,17 @@ @import 'components/treeselect.css'; @layer base { - html { - -webkit-tap-highlight-color: transparent; - } + html { + -webkit-tap-highlight-color: transparent; + } - :root.dark { - color-scheme: dark; - } + :root.dark { + color-scheme: dark; + } - [dir='rtl'] select { - background-position: left 0.5rem center !important; - padding-left: 2.5rem; - padding-right: 0.75rem; - } + [dir='rtl'] select { + background-position: left 0.5rem center !important; + padding-left: 2.5rem; + padding-right: 0.75rem; + } } diff --git a/packages/admin/resources/js/components/internationalNumber.js b/packages/admin/resources/js/components/internationalNumber.js index 10ad3dadb..efbde2476 100755 --- a/packages/admin/resources/js/components/internationalNumber.js +++ b/packages/admin/resources/js/components/internationalNumber.js @@ -1,27 +1,26 @@ import intlTelInput from 'intl-tel-input' export default (element) => ({ - input: element, + input: element, - init() { - const phoneNumber = document.querySelector(this.input) - let iti = intlTelInput(phoneNumber, { - nationalMode: true, - geoIpLookup: function (success, failure) { - fetch('https://ipinfo.io').then((response) => { - let countryCode = - response && response.country ? response.country : 'CM' - success(countryCode) + init() { + const phoneNumber = document.querySelector(this.input) + let iti = intlTelInput(phoneNumber, { + nationalMode: true, + geoIpLookup: function (success, failure) { + fetch('https://ipinfo.io').then((response) => { + let countryCode = response && response.country ? response.country : 'CM' + success(countryCode) + }) + }, + utilsScript: 'https://unpkg.com/intl-tel-input@17.0.3/build/js/utils.js', }) - }, - utilsScript: 'https://unpkg.com/intl-tel-input@17.0.3/build/js/utils.js', - }) - let handleChange = () => { - if (iti.isValidNumber()) { - phoneNumber.value = iti.getNumber() - } - } - phoneNumber.addEventListener('change', handleChange) - phoneNumber.addEventListener('keyup', handleChange) - }, + let handleChange = () => { + if (iti.isValidNumber()) { + phoneNumber.value = iti.getNumber() + } + } + phoneNumber.addEventListener('change', handleChange) + phoneNumber.addEventListener('keyup', handleChange) + }, }) diff --git a/packages/admin/resources/js/components/panel.js b/packages/admin/resources/js/components/panel.js index 3d24f39ae..5f41f4ada 100644 --- a/packages/admin/resources/js/components/panel.js +++ b/packages/admin/resources/js/components/panel.js @@ -1,164 +1,164 @@ const SlideOverPanel = () => { - return { - open: false, - showActiveComponent: true, - activeComponent: false, - componentHistory: [], - panelWidth: null, - listeners: [], - getActiveComponentPanelAttribute(key) { - if (this.$wire.get('components')[this.activeComponent] !== undefined) { - return this.$wire.get('components')[this.activeComponent]['panelAttributes'][key]; - } - }, - closePanelOnEscape(trigger) { - if (this.getActiveComponentPanelAttribute('closeOnEscape') === false) { - return; - } - - let force = this.getActiveComponentPanelAttribute('closeOnEscapeIsForceful') === true; - this.closePanel(force); - }, - closePanelOnClickAway(trigger) { - if (this.getActiveComponentPanelAttribute('closeOnClickAway') === false) { - return; - } - - this.closePanel(true); - }, - closePanel(force = false, skipPreviousPanels = 0, destroySkipped = false) { - if(this.show === false) { - return; - } - - if (this.getActiveComponentPanelAttribute('dispatchCloseEvent') === true) { - const componentName = this.$wire.get('components')[this.activeComponent].name; - Livewire.dispatch('panelClosed', { name: componentName }); - } - - if (this.getActiveComponentPanelAttribute('destroyOnClose') === true) { - Livewire.dispatch('destroyComponent', { id: this.activeComponent }); - } - - if (skipPreviousPanels > 0) { - for (let i = 0; i < skipPreviousPanels; i++) { - if (destroySkipped) { - const id = this.componentHistory[this.componentHistory.length - 1]; - Livewire.dispatch('destroyComponent', { id: id }); - } - this.componentHistory.pop(); - } - } - - const id = this.componentHistory.pop(); - - if (id && !force) { - if (id) { - this.setActivePanelComponent(id, true); - } else { - this.setShowPropertyTo(false); - } - } else { - this.setShowPropertyTo(false); - } - }, - setActivePanelComponent(id, skip = false) { - this.setShowPropertyTo(true); - - if (this.activeComponent === id) { - return; - } - - if (this.activeComponent !== false && skip === false) { - this.componentHistory.push(this.activeComponent); - } - - let focusableTimeout = 50; - - if (this.activeComponent === false) { - this.activeComponent = id - this.showActiveComponent = true; - this.panelWidth = this.getActiveComponentPanelAttribute('maxWidthClass'); - } else { - this.showActiveComponent = false; - - focusableTimeout = 400; - - setTimeout(() => { - this.activeComponent = id; - this.showActiveComponent = true; - this.panelWidth = this.getActiveComponentPanelAttribute('maxWidthClass'); - }, 300); - } - - this.$nextTick(() => { - let focusable = this.$refs[id]?.querySelector('[autofocus]'); - if (focusable) { - setTimeout(() => { - focusable.focus(); - }, focusableTimeout); - } - }); - }, - focusables() { - let selector = 'a, button, input:not([type=\'hidden\'], textarea, select, details, [tabindex]:not([tabindex=\'-1\'])' - - return [...this.$el.querySelectorAll(selector)] - .filter(el => !el.hasAttribute('disabled')) - }, - firstFocusable() { - return this.focusables()[0] - }, - lastFocusable() { - return this.focusables().slice(-1)[0] - }, - nextFocusable() { - return this.focusables()[this.nextFocusableIndex()] || this.firstFocusable() - }, - prevFocusable() { - return this.focusables()[this.prevFocusableIndex()] || this.lastFocusable() - }, - nextFocusableIndex() { - return (this.focusables().indexOf(document.activeElement) + 1) % (this.focusables().length + 1) - }, - prevFocusableIndex() { - return Math.max(0, this.focusables().indexOf(document.activeElement)) - 1 - }, - setShowPropertyTo(open) { - this.open = open; - - if (open) { - document.body.classList.add('overflow-y-hidden'); - } else { - document.body.classList.remove('overflow-y-hidden'); - - setTimeout(() => { - this.activeComponent = false; - this.$wire.resetState(); - }, 300); - } - }, - init() { - this.panelWidth = this.getActiveComponentPanelAttribute('maxWidthClass'); - - this.listeners.push( - Livewire.on('closePanel', (data) => { - this.closePanel(data?.force ?? false, data?.skipPreviousPanels ?? 0, data?.destroySkipped ?? false); - }) - ); - - this.listeners.push( - Livewire.on('activePanelComponentChanged', ({ id }) => { - this.setActivePanelComponent(id); - }) - ); - }, - destroy() { - this.listeners.forEach((listener) => { - listener(); - }); + return { + open: false, + showActiveComponent: true, + activeComponent: false, + componentHistory: [], + panelWidth: null, + listeners: [], + getActiveComponentPanelAttribute(key) { + if (this.$wire.get('components')[this.activeComponent] !== undefined) { + return this.$wire.get('components')[this.activeComponent]['panelAttributes'][key] + } + }, + closePanelOnEscape(trigger) { + if (this.getActiveComponentPanelAttribute('closeOnEscape') === false) { + return + } + + let force = this.getActiveComponentPanelAttribute('closeOnEscapeIsForceful') === true + this.closePanel(force) + }, + closePanelOnClickAway(trigger) { + if (this.getActiveComponentPanelAttribute('closeOnClickAway') === false) { + return + } + + this.closePanel(true) + }, + closePanel(force = false, skipPreviousPanels = 0, destroySkipped = false) { + if (this.show === false) { + return + } + + if (this.getActiveComponentPanelAttribute('dispatchCloseEvent') === true) { + const componentName = this.$wire.get('components')[this.activeComponent].name + Livewire.dispatch('panelClosed', { name: componentName }) + } + + if (this.getActiveComponentPanelAttribute('destroyOnClose') === true) { + Livewire.dispatch('destroyComponent', { id: this.activeComponent }) + } + + if (skipPreviousPanels > 0) { + for (let i = 0; i < skipPreviousPanels; i++) { + if (destroySkipped) { + const id = this.componentHistory[this.componentHistory.length - 1] + Livewire.dispatch('destroyComponent', { id: id }) + } + this.componentHistory.pop() + } + } + + const id = this.componentHistory.pop() + + if (id && !force) { + if (id) { + this.setActivePanelComponent(id, true) + } else { + this.setShowPropertyTo(false) + } + } else { + this.setShowPropertyTo(false) + } + }, + setActivePanelComponent(id, skip = false) { + this.setShowPropertyTo(true) + + if (this.activeComponent === id) { + return + } + + if (this.activeComponent !== false && skip === false) { + this.componentHistory.push(this.activeComponent) + } + + let focusableTimeout = 50 + + if (this.activeComponent === false) { + this.activeComponent = id + this.showActiveComponent = true + this.panelWidth = this.getActiveComponentPanelAttribute('maxWidthClass') + } else { + this.showActiveComponent = false + + focusableTimeout = 400 + + setTimeout(() => { + this.activeComponent = id + this.showActiveComponent = true + this.panelWidth = this.getActiveComponentPanelAttribute('maxWidthClass') + }, 300) + } + + this.$nextTick(() => { + let focusable = this.$refs[id]?.querySelector('[autofocus]') + if (focusable) { + setTimeout(() => { + focusable.focus() + }, focusableTimeout) + } + }) + }, + focusables() { + let selector = + "a, button, input:not([type='hidden'], textarea, select, details, [tabindex]:not([tabindex='-1'])" + + return [...this.$el.querySelectorAll(selector)].filter((el) => !el.hasAttribute('disabled')) + }, + firstFocusable() { + return this.focusables()[0] + }, + lastFocusable() { + return this.focusables().slice(-1)[0] + }, + nextFocusable() { + return this.focusables()[this.nextFocusableIndex()] || this.firstFocusable() + }, + prevFocusable() { + return this.focusables()[this.prevFocusableIndex()] || this.lastFocusable() + }, + nextFocusableIndex() { + return (this.focusables().indexOf(document.activeElement) + 1) % (this.focusables().length + 1) + }, + prevFocusableIndex() { + return Math.max(0, this.focusables().indexOf(document.activeElement)) - 1 + }, + setShowPropertyTo(open) { + this.open = open + + if (open) { + document.body.classList.add('overflow-y-hidden') + } else { + document.body.classList.remove('overflow-y-hidden') + + setTimeout(() => { + this.activeComponent = false + this.$wire.resetState() + }, 300) + } + }, + init() { + this.panelWidth = this.getActiveComponentPanelAttribute('maxWidthClass') + + this.listeners.push( + Livewire.on('closePanel', (data) => { + this.closePanel(data?.force ?? false, data?.skipPreviousPanels ?? 0, data?.destroySkipped ?? false) + }), + ) + + this.listeners.push( + Livewire.on('activePanelComponentChanged', ({ id }) => { + this.setActivePanelComponent(id) + }), + ) + }, + destroy() { + this.listeners.forEach((listener) => { + listener() + }) + }, } - } } export default SlideOverPanel diff --git a/packages/admin/resources/js/components/select-tree.js b/packages/admin/resources/js/components/select-tree.js index 1bee2c3b0..97906533a 100644 --- a/packages/admin/resources/js/components/select-tree.js +++ b/packages/admin/resources/js/components/select-tree.js @@ -1,60 +1,60 @@ import Treeselect from 'treeselectjs' export default function selectTree({ - state, - name, - options, - searchable, - showCount, - placeholder, - rtl, - disabledBranchNode = true, - disabled = false, - isSingleSelect = true, - showTags = true, - clearable = true, - isIndependentNodes = true, - alwaysOpen = false, - emptyText, - expandSelected = true, - grouped = true, - openLevel = 0, - direction = 'auto' - }) { - return { state, + name, + options, + searchable, + showCount, + placeholder, + rtl, + disabledBranchNode = true, + disabled = false, + isSingleSelect = true, + showTags = true, + clearable = true, + isIndependentNodes = true, + alwaysOpen = false, + emptyText, + expandSelected = true, + grouped = true, + openLevel = 0, + direction = 'auto', +}) { + return { + state, - /** @type Treeselect */ - tree: null, + /** @type Treeselect */ + tree: null, - init() { - this.tree = new Treeselect({ - id: `tree-${name}-id`, - ariaLabel: `tree-${name}-label`, - parentHtmlContainer: this.$refs.tree, - value: this.state ?? [], - options, - searchable, - showCount, - placeholder, - disabledBranchNode, - disabled, - isSingleSelect, - showTags, - clearable, - isIndependentNodes, - alwaysOpen, - emptyText, - expandSelected, - grouped, - openLevel, - direction, - rtl - }); + init() { + this.tree = new Treeselect({ + id: `tree-${name}-id`, + ariaLabel: `tree-${name}-label`, + parentHtmlContainer: this.$refs.tree, + value: this.state ?? [], + options, + searchable, + showCount, + placeholder, + disabledBranchNode, + disabled, + isSingleSelect, + showTags, + clearable, + isIndependentNodes, + alwaysOpen, + emptyText, + expandSelected, + grouped, + openLevel, + direction, + rtl, + }) - this.tree.srcElement.addEventListener('input', (e) => { - this.state = e.detail; - }); + this.tree.srcElement.addEventListener('input', (e) => { + this.state = e.detail + }) + }, } - } } diff --git a/packages/admin/resources/js/components/sortable.js b/packages/admin/resources/js/components/sortable.js index c09214585..063bed744 100644 --- a/packages/admin/resources/js/components/sortable.js +++ b/packages/admin/resources/js/components/sortable.js @@ -3,135 +3,143 @@ import Sortable from 'sortablejs' window.Sortable = Sortable if (typeof window.Livewire === 'undefined') { - throw 'Livewire Sortable Plugin: window.Livewire is undefined. Make sure @livewireScripts is placed above this script include' + throw 'Livewire Sortable Plugin: window.Livewire is undefined. Make sure @livewireScripts is placed above this script include' } const moveEndMorphMarker = (el) => { - const endMorphMarker = Array.from(el.childNodes).filter((childNode) => { - return childNode.nodeType === 8 && ['[if ENDBLOCK]> { + return ( + childNode.nodeType === 8 && + ['[if ENDBLOCK]> { - if (directive.modifiers.length > 0) { - return - } - - let options = {} - - if (el.hasAttribute('wire:sortable.options')) { - options = (new Function(`return ${el.getAttribute('wire:sortable.options')};`))() - } - - el.livewire_sortable = window.Sortable.create(el, { - sort: true, - ...options, - draggable: '[wire\\:sortable\\.item]', - handle: el.querySelector('[wire\\:sortable\\.handle]') ? '[wire\\:sortable\\.handle]' : null, - dataIdAttr: 'wire:sortable.item', - group: { - pull: false, - put: false, - ...options.group, - name: el.getAttribute('wire:sortable'), - }, - store: { - ...options.store, - set: function (sortable) { - let items = sortable.toArray().map((value, index) => { - return { - order: index + 1, - value: value, - } - }) - - moveEndMorphMarker(el) - - component.$wire.call(directive.method, items) - }, - }, - }) + if (directive.modifiers.length > 0) { + return + } - let hasSetHandleCorrectly = el.querySelector('[wire\\:sortable\\.item]') !== null + let options = {} - // If there are already items, then the 'handle' option has already been correctly set. - // The option does not have to reevaluated after the next Livewire component update. - if (hasSetHandleCorrectly) { - return - } + if (el.hasAttribute('wire:sortable.options')) { + options = new Function(`return ${el.getAttribute('wire:sortable.options')};`)() + } - const currentComponent = component + el.livewire_sortable = window.Sortable.create(el, { + sort: true, + ...options, + draggable: '[wire\\:sortable\\.item]', + handle: el.querySelector('[wire\\:sortable\\.handle]') ? '[wire\\:sortable\\.handle]' : null, + dataIdAttr: 'wire:sortable.item', + group: { + pull: false, + put: false, + ...options.group, + name: el.getAttribute('wire:sortable'), + }, + store: { + ...options.store, + set: function (sortable) { + let items = sortable.toArray().map((value, index) => { + return { + order: index + 1, + value: value, + } + }) + + moveEndMorphMarker(el) + + component.$wire.call(directive.method, items) + }, + }, + }) - Livewire.hook('commit', ({ component, succeed }) => { - if (component.id !== currentComponent.id) { - return - } + let hasSetHandleCorrectly = el.querySelector('[wire\\:sortable\\.item]') !== null + // If there are already items, then the 'handle' option has already been correctly set. + // The option does not have to reevaluated after the next Livewire component update. if (hasSetHandleCorrectly) { - return + return } - succeed(() => { - queueMicrotask(() => { - el.livewire_sortable.option('handle', el.querySelector('[wire\\:sortable\\.handle]') ? '[wire\\:sortable\\.handle]' : null) + const currentComponent = component - hasSetHandleCorrectly = el.querySelector('[wire\\:sortable\\.item]') !== null - }) + Livewire.hook('commit', ({ component, succeed }) => { + if (component.id !== currentComponent.id) { + return + } + + if (hasSetHandleCorrectly) { + return + } + + succeed(() => { + queueMicrotask(() => { + el.livewire_sortable.option( + 'handle', + el.querySelector('[wire\\:sortable\\.handle]') ? '[wire\\:sortable\\.handle]' : null, + ) + + hasSetHandleCorrectly = el.querySelector('[wire\\:sortable\\.item]') !== null + }) + }) }) - }) }) Livewire.directive('sortable-group', ({ el, directive, component }) => { - // Only fire this handler on the "root" group directive. - if (! directive.modifiers.includes('item-group')) { - return - } - - let options = {} - - if (el.hasAttribute('wire:sortable-group.options')) { - options = (new Function(`return ${el.getAttribute('wire:sortable-group.options')};`))(); - } - - el.livewire_sortable = window.Sortable.create(el, { - sort: true, - ...options, - draggable: '[wire\\:sortable-group\\.item]', - handle: '[wire\\:sortable-group\\.handle]', - dataIdAttr: 'wire:sortable-group.item', - group: { - pull: true, - put: true, - ...options.group, - name: el.closest('[wire\\:sortable-group]').getAttribute('wire:sortable-group'), - }, - onSort: (evt) => { - if (evt.to !== evt.from && el === evt.from) { + // Only fire this handler on the "root" group directive. + if (!directive.modifiers.includes('item-group')) { return - } + } - let masterEl = el.closest('[wire\\:sortable-group]') + let options = {} - let groups = Array.from(masterEl.querySelectorAll('[wire\\:sortable-group\\.item-group]')).map((el, index) => { - moveEndMorphMarker(el) + if (el.hasAttribute('wire:sortable-group.options')) { + options = new Function(`return ${el.getAttribute('wire:sortable-group.options')};`)() + } - return { - order: index + 1, - value: el.getAttribute('wire:sortable-group.item-group'), - items: el.livewire_sortable.toArray().map((value, index) => { - return { - order: index + 1, - value: value + el.livewire_sortable = window.Sortable.create(el, { + sort: true, + ...options, + draggable: '[wire\\:sortable-group\\.item]', + handle: '[wire\\:sortable-group\\.handle]', + dataIdAttr: 'wire:sortable-group.item', + group: { + pull: true, + put: true, + ...options.group, + name: el.closest('[wire\\:sortable-group]').getAttribute('wire:sortable-group'), + }, + onSort: (evt) => { + if (evt.to !== evt.from && el === evt.from) { + return } - }), - } - }) - masterEl.closest('[wire\\:id]').__livewire.$wire.call(masterEl.getAttribute('wire:sortable-group'), groups) - }, - }) + let masterEl = el.closest('[wire\\:sortable-group]') + + let groups = Array.from(masterEl.querySelectorAll('[wire\\:sortable-group\\.item-group]')).map( + (el, index) => { + moveEndMorphMarker(el) + + return { + order: index + 1, + value: el.getAttribute('wire:sortable-group.item-group'), + items: el.livewire_sortable.toArray().map((value, index) => { + return { + order: index + 1, + value: value, + } + }), + } + }, + ) + + masterEl.closest('[wire\\:id]').__livewire.$wire.call(masterEl.getAttribute('wire:sortable-group'), groups) + }, + }) }) diff --git a/packages/admin/resources/js/index.js b/packages/admin/resources/js/index.js index ea938420a..f9752dc80 100755 --- a/packages/admin/resources/js/index.js +++ b/packages/admin/resources/js/index.js @@ -6,44 +6,38 @@ window.SlideOverPanel = SlideOverPanel window.selectTree = SelectTree document.addEventListener('alpine:init', () => { - const theme = localStorage.getItem('theme') ?? 'system' - - window.Alpine.store( - 'theme', - theme === 'dark' || - (theme === 'system' && - window.matchMedia('(prefers-color-scheme: dark)').matches) - ? 'dark' - : 'light', - ) - - window.addEventListener('theme-changed', (event) => { - let theme = event.detail - - localStorage.setItem('theme', theme) - - if (theme === 'system') { - theme = window.matchMedia('(prefers-color-scheme: dark)').matches - ? 'dark' - : 'light' - } - - window.Alpine.store('theme', theme) - }) - - window - .matchMedia('(prefers-color-scheme: dark)') - .addEventListener('change', (event) => { - if (localStorage.getItem('theme') === 'system') { - window.Alpine.store('theme', event.matches ? 'dark' : 'light') - } + const theme = localStorage.getItem('theme') ?? 'system' + + window.Alpine.store( + 'theme', + theme === 'dark' || (theme === 'system' && window.matchMedia('(prefers-color-scheme: dark)').matches) + ? 'dark' + : 'light', + ) + + window.addEventListener('theme-changed', (event) => { + let theme = event.detail + + localStorage.setItem('theme', theme) + + if (theme === 'system') { + theme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light' + } + + window.Alpine.store('theme', theme) + }) + + window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (event) => { + if (localStorage.getItem('theme') === 'system') { + window.Alpine.store('theme', event.matches ? 'dark' : 'light') + } }) - window.Alpine.effect(() => { - const theme = window.Alpine.store('theme') + window.Alpine.effect(() => { + const theme = window.Alpine.store('theme') - theme === 'dark' - ? document.documentElement.classList.add('dark') - : document.documentElement.classList.remove('dark') - }) + theme === 'dark' + ? document.documentElement.classList.add('dark') + : document.documentElement.classList.remove('dark') + }) }) diff --git a/packages/admin/resources/lang/en.json b/packages/admin/resources/lang/en.json index 5ea8db152..a1da5d71c 100755 --- a/packages/admin/resources/lang/en.json +++ b/packages/admin/resources/lang/en.json @@ -1,44 +1,44 @@ { - "General": "General", - "View and update your store information.": "View and update your store information.", - "Staff & permissions": "Staff & permissions", - "View and manage what staff can see or do in your store.": "View and manage what staff can see or do in your store.", - "Email": "Email", - "Manage email notifications that will be sent to your customers.": "Manage email notifications that will be sent to your customers.", - "Locations": "Inventories", - "Manage the places you stock inventory and sell products.": "Manage the places you stock inventory and sell products.", - "Attributes": "Attributes", - "Manage additional attributes for your products.": "Manage additional attributes for your products.", - "Shipping and delivery": "Shipping and delivery", - "Manage how you ship orders to customers.": "Manage how you ship orders to customers.", - "Integrations": "Integrations", - "Connect with third-party tools that you’re already using.": "Connect with third-party tools that you’re already using.", - "Analytics": "Analytics", - "Get a better understanding of where your traffic is coming from.": "Get a better understanding of where your traffic is coming from.", - "Taxes": "Taxes", - "Manage how your store charges taxes.": "Manage how your store charges taxes.", - "Payment methods": "Payment methods", - "Add different payment methods for your customers.": "Add different payment methods for your customers.", - "Files": "Files", - "Manage store assets (images, videos and documents).": "Manage store assets (images, videos and documents).", - "Legal": "Legal", - "Manage your store's legal pages such as privacy, terms.": "Manage your store's legal pages such as privacy, terms.", - "Manually added": "Manually added", - "Initial inventory": "Initial inventory", - "Text field :type": "Text field :type", - "Richtext": "Richtext", - "Select": "Select", - "Checkbox": "Checkbox", - "Radio": "Radio", - "Color picker": "Color picker", - "Date picker": "Date picker", - "Categories": "Categories", - "System": "System", - "Discounts": "Discounts", - "Customers": "Customers", - "Orders": "Orders", - "Products": "Products", - "Brands": "Brands", - "Collections": "Collections", - "Reviews": "Reviews" + "General": "General", + "View and update your store information.": "View and update your store information.", + "Staff & permissions": "Staff & permissions", + "View and manage what staff can see or do in your store.": "View and manage what staff can see or do in your store.", + "Email": "Email", + "Manage email notifications that will be sent to your customers.": "Manage email notifications that will be sent to your customers.", + "Locations": "Inventories", + "Manage the places you stock inventory and sell products.": "Manage the places you stock inventory and sell products.", + "Attributes": "Attributes", + "Manage additional attributes for your products.": "Manage additional attributes for your products.", + "Shipping and delivery": "Shipping and delivery", + "Manage how you ship orders to customers.": "Manage how you ship orders to customers.", + "Integrations": "Integrations", + "Connect with third-party tools that you’re already using.": "Connect with third-party tools that you’re already using.", + "Analytics": "Analytics", + "Get a better understanding of where your traffic is coming from.": "Get a better understanding of where your traffic is coming from.", + "Taxes": "Taxes", + "Manage how your store charges taxes.": "Manage how your store charges taxes.", + "Payment methods": "Payment methods", + "Add different payment methods for your customers.": "Add different payment methods for your customers.", + "Files": "Files", + "Manage store assets (images, videos and documents).": "Manage store assets (images, videos and documents).", + "Legal": "Legal", + "Manage your store's legal pages such as privacy, terms.": "Manage your store's legal pages such as privacy, terms.", + "Manually added": "Manually added", + "Initial inventory": "Initial inventory", + "Text field :type": "Text field :type", + "Richtext": "Richtext", + "Select": "Select", + "Checkbox": "Checkbox", + "Radio": "Radio", + "Color picker": "Color picker", + "Date picker": "Date picker", + "Categories": "Categories", + "System": "System", + "Discounts": "Discounts", + "Customers": "Customers", + "Orders": "Orders", + "Products": "Products", + "Brands": "Brands", + "Collections": "Collections", + "Reviews": "Reviews" } diff --git a/packages/admin/resources/lang/en/messages.php b/packages/admin/resources/lang/en/messages.php index 65f4d5442..4f46c5c71 100755 --- a/packages/admin/resources/lang/en/messages.php +++ b/packages/admin/resources/lang/en/messages.php @@ -8,7 +8,7 @@ 'welcome_message' => 'Welcome to Shopper Dashboard', 'header' => 'Start with the basic for your online store', 'description' => ' To begin building your new store with Laravel Shopper, we recommend starting with these steps. The framework allows you to create - your store and configure it exactly as you want. You can make integrations to go faster if you want.', + your store and configure it exactly as you want. You can make integrations to go faster if you want.', 'cards' => [ 'doc_title' => 'Documentation', 'doc_description' => 'Get to know Laravel Shopper by understanding its capabilities the right way, whether you are new to the framework or have already worked on it. This documentation is made for you.', diff --git a/packages/admin/resources/lang/fr.json b/packages/admin/resources/lang/fr.json index 44115d57a..a4ac6a0db 100755 --- a/packages/admin/resources/lang/fr.json +++ b/packages/admin/resources/lang/fr.json @@ -1,44 +1,44 @@ { - "General": "Général", - "View and update your store information.": "Affichez et mettez à jour les informations de votre magasin.", - "Staff & permissions": "Personnel et autorisations", - "View and manage what staff can see or do in your store.": "Affichez et gérez ce que le personnel peut voir ou faire dans votre magasin.", - "Email": "E-mail", - "Manage email notifications that will be sent to your customers.": "Gérez les notifications par e-mail qui seront envoyées à vos clients.", - "Locations": "Inventaires", - "Manage the places you stock inventory and sell products.": "Gérez les emplacements où vous stockez l'inventaire et vendez des produits.", - "Attributes": "Attributs", - "Manage additional attributes for your products.": "Gérez des attributs supplémentaires pour vos produits.", - "Shipping and delivery": "Expédition et livraison", - "Manage how you ship orders to customers.": "Gérez la façon dont vous expédiez les commandes aux clients.", - "Integrations": "Intégrations", - "Connect with third-party tools that you’re already using.": "Connectez-vous aux outils tiers que vous utilisez déjà.", - "Analytics": "Analytics", - "Get a better understanding of where your traffic is coming from.": "Obtenez une meilleure compréhension de la provenance de votre trafic.", - "Taxes": "Tax", - "Manage how your store charges taxes.": "Gérez la façon dont votre boutique facture les taxes.", - "Payment methods": "Méthodes de paiement", - "Add different payment methods for your customers.": "Ajoutez différents modes de paiement pour vos clients.", - "Files": "Fichiers", - "Manage store assets (images, videos and documents).": "Gérer les fichiers de votre boutique (images, vidéos et documents).", - "Legal": "Légal", - "Manage your store's legal pages such as privacy, terms.": "Gérez les pages légales de votre boutique telles que la confidentialité, les conditions d'utilisation, etc.", - "Manually added": "Ajout manuel", - "Initial inventory": "Stock Initial", - "Text field :type": "Text field :type", - "Richtext": "Richtext", - "Select": "Select", - "Checkbox": "Choix multiple", - "Radio": "Choix unique", - "Color picker": "Choix des couleurs", - "Date picker": "Sélecteur de date", - "Categories": "Catégories", - "System": "Système", - "Discounts": "Coupons", - "Customers": "Clients", - "Orders": "Commandes", - "Products": "Produits", - "Brands": "Marques", - "Collections": "Collections", - "Reviews": "Avis" + "General": "Général", + "View and update your store information.": "Affichez et mettez à jour les informations de votre magasin.", + "Staff & permissions": "Personnel et autorisations", + "View and manage what staff can see or do in your store.": "Affichez et gérez ce que le personnel peut voir ou faire dans votre magasin.", + "Email": "E-mail", + "Manage email notifications that will be sent to your customers.": "Gérez les notifications par e-mail qui seront envoyées à vos clients.", + "Locations": "Inventaires", + "Manage the places you stock inventory and sell products.": "Gérez les emplacements où vous stockez l'inventaire et vendez des produits.", + "Attributes": "Attributs", + "Manage additional attributes for your products.": "Gérez des attributs supplémentaires pour vos produits.", + "Shipping and delivery": "Expédition et livraison", + "Manage how you ship orders to customers.": "Gérez la façon dont vous expédiez les commandes aux clients.", + "Integrations": "Intégrations", + "Connect with third-party tools that you’re already using.": "Connectez-vous aux outils tiers que vous utilisez déjà.", + "Analytics": "Analytics", + "Get a better understanding of where your traffic is coming from.": "Obtenez une meilleure compréhension de la provenance de votre trafic.", + "Taxes": "Tax", + "Manage how your store charges taxes.": "Gérez la façon dont votre boutique facture les taxes.", + "Payment methods": "Méthodes de paiement", + "Add different payment methods for your customers.": "Ajoutez différents modes de paiement pour vos clients.", + "Files": "Fichiers", + "Manage store assets (images, videos and documents).": "Gérer les fichiers de votre boutique (images, vidéos et documents).", + "Legal": "Légal", + "Manage your store's legal pages such as privacy, terms.": "Gérez les pages légales de votre boutique telles que la confidentialité, les conditions d'utilisation, etc.", + "Manually added": "Ajout manuel", + "Initial inventory": "Stock Initial", + "Text field :type": "Text field :type", + "Richtext": "Richtext", + "Select": "Select", + "Checkbox": "Choix multiple", + "Radio": "Choix unique", + "Color picker": "Choix des couleurs", + "Date picker": "Sélecteur de date", + "Categories": "Catégories", + "System": "Système", + "Discounts": "Coupons", + "Customers": "Clients", + "Orders": "Commandes", + "Products": "Produits", + "Brands": "Marques", + "Collections": "Collections", + "Reviews": "Avis" } diff --git a/packages/admin/resources/lang/fr/messages.php b/packages/admin/resources/lang/fr/messages.php index ad1505298..8e06032c2 100755 --- a/packages/admin/resources/lang/fr/messages.php +++ b/packages/admin/resources/lang/fr/messages.php @@ -9,7 +9,7 @@ 'header' => 'Commencez par les éléments de base de votre boutique en ligne', 'description' => 'Pour commencer à construire votre nouvelle boutique avec Laravel Shopper, nous vous recommandons de commencer par ces étapes. Le framework vous permet de créer votre boutique et de la configurer exactement comme vous le souhaitez. - Vous pouvez faire des intégrations pour aller plus vite si vous le souhaitez.', + Vous pouvez faire des intégrations pour aller plus vite si vous le souhaitez.', 'cards' => [ 'doc_title' => 'Documentation', 'doc_description' => 'Apprenez à connaître Laravel Shopper en comprenant ses capacités de la bonne manière, que vous soyez nouveau sur le framework ou que vous ayez déjà travaillé dessus. Cette documentation est faite pour vous.', diff --git a/packages/admin/resources/lang/tr.json b/packages/admin/resources/lang/tr.json deleted file mode 100755 index 0303af09e..000000000 --- a/packages/admin/resources/lang/tr.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "Manually added": "Manuel ekleme", - "Initial inventory": "İlk stoklar" -} diff --git a/packages/admin/resources/lang/tr/messages.php b/packages/admin/resources/lang/tr/messages.php deleted file mode 100755 index 5d3bafde8..000000000 --- a/packages/admin/resources/lang/tr/messages.php +++ /dev/null @@ -1,20 +0,0 @@ - '{1} Limitten 1 tanesi kullanıldı|[2,*] Limitten :count tanesi kullanıldı', - -]; diff --git a/packages/admin/resources/views/auth/two-factor-login.blade.php b/packages/admin/resources/views/auth/two-factor-login.blade.php index 5944c8e93..71dd6f4d2 100755 --- a/packages/admin/resources/views/auth/two-factor-login.blade.php +++ b/packages/admin/resources/views/auth/two-factor-login.blade.php @@ -7,37 +7,70 @@
-

- +

+

-

+

{{ __('shopper::pages/auth.two_factor.authentication_code') }}

-

@csrf - - + + - - + +

{{ __('shopper::pages/auth.two_factor.remember') }} diff --git a/packages/admin/resources/views/components/attribute-card.blade.php b/packages/admin/resources/views/components/attribute-card.blade.php index b4a82803c..45337c440 100644 --- a/packages/admin/resources/views/components/attribute-card.blade.php +++ b/packages/admin/resources/views/components/attribute-card.blade.php @@ -1,24 +1,26 @@ -@props(['attribute', 'activated' => false]) +@props([ + 'attribute', + 'activated' => false, +]) -

-
+
+
- @if($attribute->icon) + @if ($attribute->icon)
-
+
{{ $slot }}
diff --git a/packages/admin/resources/views/components/auth-card.blade.php b/packages/admin/resources/views/components/auth-card.blade.php index f77e146c3..f13b1ee22 100755 --- a/packages/admin/resources/views/components/auth-card.blade.php +++ b/packages/admin/resources/views/components/auth-card.blade.php @@ -1,25 +1,66 @@ -
-
+ -
-
- @foreach($categories as $category) -
-
+
+ @foreach ($categories as $category) +
+
- + /{{ $category->slug }}
- @if($category->children->isNotEmpty()) -