@valbuild/ui 0.26.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/valbuild-ui.cjs.js +41 -15
- package/dist/valbuild-ui.esm.js +41 -15
- package/package.json +7 -3
- package/server/.tmp/assets/index-18cfa26c.css +1 -0
- package/server/.tmp/assets/index-513f7a9c.js +197 -0
- package/{index.html → server/.tmp/index.html} +3 -1
- package/server/dist/style.css +0 -3
- package/server/dist/valbuild-ui-main.cjs.js +60 -34
- package/server/dist/valbuild-ui-main.esm.js +60 -34
- package/server/dist/valbuild-ui-server.cjs.js +1 -1
- package/server/dist/valbuild-ui-server.esm.js +1 -1
- package/.babelrc.json +0 -10
- package/.storybook/main.js +0 -25
- package/.storybook/preview-head.html +0 -6
- package/.storybook/preview.js +0 -33
- package/.storybook/theme.css +0 -34
- package/CHANGELOG.md +0 -0
- package/components.json +0 -16
- package/fix-server-hack.js +0 -54
- package/fullscreen.vite.config.ts +0 -9
- package/jest.config.js +0 -4
- package/postcss.config.js +0 -6
- package/rollup.config.js +0 -23
- package/server.vite.config.ts +0 -31
- package/src/App.tsx +0 -73
- package/src/assets/icons/Bold.tsx +0 -23
- package/src/assets/icons/Chevron.tsx +0 -28
- package/src/assets/icons/FontColor.tsx +0 -30
- package/src/assets/icons/ImageIcon.tsx +0 -29
- package/src/assets/icons/Italic.tsx +0 -24
- package/src/assets/icons/Logo.tsx +0 -103
- package/src/assets/icons/Section.tsx +0 -41
- package/src/assets/icons/Strikethrough.tsx +0 -22
- package/src/assets/icons/TextIcon.tsx +0 -20
- package/src/assets/icons/Underline.tsx +0 -22
- package/src/assets/icons/Undo.tsx +0 -20
- package/src/components/Button.tsx +0 -68
- package/src/components/Checkbox.tsx +0 -51
- package/src/components/DraggableList.stories.tsx +0 -20
- package/src/components/DraggableList.tsx +0 -95
- package/src/components/Dropdown.tsx +0 -101
- package/src/components/EditButton.tsx +0 -10
- package/src/components/ErrorText.tsx +0 -3
- package/src/components/ExpandLogo.tsx +0 -72
- package/src/components/Grid.stories.tsx +0 -43
- package/src/components/Grid.tsx +0 -139
- package/src/components/RichTextEditor/ContentEditable.tsx +0 -117
- package/src/components/RichTextEditor/Nodes/ImageNode.tsx +0 -100
- package/src/components/RichTextEditor/Plugins/AutoFocus.tsx +0 -12
- package/src/components/RichTextEditor/Plugins/ImagePlugin.tsx +0 -45
- package/src/components/RichTextEditor/Plugins/LinkEditorPlugin.tsx +0 -58
- package/src/components/RichTextEditor/Plugins/Toolbar.tsx +0 -412
- package/src/components/RichTextEditor/RichTextEditor.tsx +0 -105
- package/src/components/UploadModal.tsx +0 -109
- package/src/components/User.tsx +0 -17
- package/src/components/ValFormField.tsx +0 -574
- package/src/components/ValFullscreen.tsx +0 -1278
- package/src/components/ValMenu.tsx +0 -92
- package/src/components/ValOverlay.tsx +0 -488
- package/src/components/ValOverlayContext.tsx +0 -80
- package/src/components/ValWindow.stories.tsx +0 -146
- package/src/components/ValWindow.tsx +0 -220
- package/src/components/dashboard/DashboardButton.tsx +0 -25
- package/src/components/dashboard/DashboardDropdown.tsx +0 -59
- package/src/components/dashboard/Dropdown.stories.tsx +0 -11
- package/src/components/dashboard/Dropdown.tsx +0 -70
- package/src/components/dashboard/FormGroup.stories.tsx +0 -37
- package/src/components/dashboard/FormGroup.tsx +0 -42
- package/src/components/dashboard/Grid2.stories.tsx +0 -56
- package/src/components/dashboard/Grid2.tsx +0 -72
- package/src/components/dashboard/Tree.stories.tsx +0 -91
- package/src/components/dashboard/Tree.tsx +0 -72
- package/src/components/dashboard/ValDashboardEditor.tsx +0 -269
- package/src/components/dashboard/ValDashboardGrid.tsx +0 -142
- package/src/components/dashboard/ValTreeNavigator.tsx +0 -253
- package/src/components/forms/Form.tsx +0 -126
- package/src/components/forms/FormContainer.tsx +0 -24
- package/src/components/forms/ImageForm.tsx +0 -195
- package/src/components/forms/TextArea.tsx +0 -24
- package/src/components/ui/accordion.tsx +0 -58
- package/src/components/ui/alert-dialog.tsx +0 -139
- package/src/components/ui/avatar.tsx +0 -48
- package/src/components/ui/button.tsx +0 -56
- package/src/components/ui/calendar.tsx +0 -62
- package/src/components/ui/card.tsx +0 -86
- package/src/components/ui/checkbox.tsx +0 -28
- package/src/components/ui/command.tsx +0 -153
- package/src/components/ui/dialog.tsx +0 -120
- package/src/components/ui/dropdown-menu.tsx +0 -198
- package/src/components/ui/form.tsx +0 -177
- package/src/components/ui/input.tsx +0 -24
- package/src/components/ui/label.tsx +0 -24
- package/src/components/ui/popover.tsx +0 -29
- package/src/components/ui/progress.tsx +0 -26
- package/src/components/ui/radio-group.tsx +0 -42
- package/src/components/ui/scroll-area.tsx +0 -51
- package/src/components/ui/select.tsx +0 -119
- package/src/components/ui/switch.tsx +0 -27
- package/src/components/ui/tabs.tsx +0 -53
- package/src/components/ui/toggle.tsx +0 -43
- package/src/components/ui/tooltip.tsx +0 -28
- package/src/components/usePatch.ts +0 -86
- package/src/components/useTheme.ts +0 -45
- package/src/dto/SerializedSchema.ts +0 -69
- package/src/dto/Session.ts +0 -12
- package/src/dto/SessionMode.ts +0 -5
- package/src/dto/Tree.ts +0 -18
- package/src/exports.ts +0 -6
- package/src/index.css +0 -115
- package/src/index.tsx +0 -14
- package/src/lib/IValStore.ts +0 -6
- package/src/lib/utils.ts +0 -6
- package/src/main.jsx +0 -10
- package/src/richtext/conversion/conversion.test.ts +0 -146
- package/src/richtext/conversion/lexicalToRichTextSource.test.ts +0 -89
- package/src/richtext/conversion/lexicalToRichTextSource.ts +0 -285
- package/src/richtext/conversion/parseRichTextSource.test.ts +0 -469
- package/src/richtext/conversion/parseRichTextSource.ts +0 -233
- package/src/richtext/conversion/richTextSourceToLexical.test.ts +0 -381
- package/src/richtext/conversion/richTextSourceToLexical.ts +0 -293
- package/src/richtext/shadowRootPolyFill.js +0 -115
- package/src/server.ts +0 -70
- package/src/stories/Button.stories.tsx +0 -20
- package/src/stories/Checkbox.stories.tsx +0 -14
- package/src/stories/Dropdown.stories.tsx +0 -23
- package/src/stories/Introduction.mdx +0 -221
- package/src/stories/RichTextEditor.stories.tsx +0 -24
- package/src/stories/assets/code-brackets.svg +0 -1
- package/src/stories/assets/colors.svg +0 -1
- package/src/stories/assets/comments.svg +0 -1
- package/src/stories/assets/direction.svg +0 -1
- package/src/stories/assets/flow.svg +0 -1
- package/src/stories/assets/plugin.svg +0 -1
- package/src/stories/assets/repo.svg +0 -1
- package/src/stories/assets/stackalt.svg +0 -1
- package/src/utils/Remote.ts +0 -15
- package/src/utils/imageMimeType.ts +0 -23
- package/src/utils/readImage.ts +0 -54
- package/src/utils/resolvePath.ts +0 -32
- package/src/vite-env.d.ts +0 -1
- package/src/vite-index.tsx +0 -7
- package/src/vite-server.ts +0 -42
- package/tailwind.config.js +0 -83
- package/tsconfig.json +0 -19
- package/vite.config.ts +0 -43
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const files = JSON.parse(
|
|
4
|
-
`{"/assets/index-082e6676.css":"Kiw6YmVmb3JlLDphZnRlcntib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojZTVlN2VifTpiZWZvcmUsOmFmdGVyey0tdHctY29udGVudDogIiJ9aHRtbHtsaW5lLWhlaWdodDoxLjU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCU7LW1vei10YWItc2l6ZTo0Oy1vLXRhYi1zaXplOjQ7dGFiLXNpemU6NDtmb250LWZhbWlseTpSb2JvdG8sc2Fucy1zZXJpZjtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOm5vcm1hbH1ib2R5e21hcmdpbjowO2xpbmUtaGVpZ2h0OmluaGVyaXR9aHJ7aGVpZ2h0OjA7Y29sb3I6aW5oZXJpdDtib3JkZXItdG9wLXdpZHRoOjFweH1hYmJyOndoZXJlKFt0aXRsZV0pey13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdH1he2NvbG9yOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfWNvZGUsa2JkLHNhbXAscHJle2ZvbnQtZmFtaWx5OnVpLW1vbm9zcGFjZSxTRk1vbm8tUmVndWxhcixNZW5sbyxNb25hY28sQ29uc29sYXMsTGliZXJhdGlvbiBNb25vLENvdXJpZXIgTmV3LG1vbm9zcGFjZTtmb250LXNpemU6MWVtfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotLjI1ZW19c3Vwe3RvcDotLjVlbX10YWJsZXt0ZXh0LWluZGVudDowO2JvcmRlci1jb2xvcjppbmhlcml0O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOjEwMCU7Zm9udC13ZWlnaHQ6aW5oZXJpdDtsaW5lLWhlaWdodDppbmhlcml0O2NvbG9yOmluaGVyaXQ7bWFyZ2luOjA7cGFkZGluZzowfWJ1dHRvbixzZWxlY3R7dGV4dC10cmFuc2Zvcm06bm9uZX1idXR0b24sW3R5cGU9YnV0dG9uXSxbdHlwZT1yZXNldF0sW3R5cGU9c3VibWl0XXstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7YmFja2dyb3VuZC1pbWFnZTpub25lfTotbW96LWZvY3VzcmluZ3tvdXRsaW5lOmF1dG99Oi1tb3otdWktaW52YWxpZHtib3gtc2hhZG93Om5vbmV9cHJvZ3Jlc3N7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLDo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b31bdHlwZT1zZWFyY2hdey13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7b3V0bGluZS1vZmZzZXQ6LTJweH06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Ojotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2ZvbnQ6aW5oZXJpdH1zdW1tYXJ5e2Rpc3BsYXk6bGlzdC1pdGVtfWJsb2NrcXVvdGUsZGwsZGQsaDEsaDIsaDMsaDQsaDUsaDYsaHIsZmlndXJlLHAscHJle21hcmdpbjowfWZpZWxkc2V0e21hcmdpbjowO3BhZGRpbmc6MH1sZWdlbmR7cGFkZGluZzowfW9sLHVsLG1lbnV7bGlzdC1zdHlsZTpub25lO21hcmdpbjowO3BhZGRpbmc6MH10ZXh0YXJlYXtyZXNpemU6dmVydGljYWx9aW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIsdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXJ7b3BhY2l0eToxO2NvbG9yOiM5Y2EzYWZ9aW5wdXQ6OnBsYWNlaG9sZGVyLHRleHRhcmVhOjpwbGFjZWhvbGRlcntvcGFjaXR5OjE7Y29sb3I6IzljYTNhZn1idXR0b24sW3JvbGU9YnV0dG9uXXtjdXJzb3I6cG9pbnRlcn06ZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9aW1nLHN2Zyx2aWRlbyxjYW52YXMsYXVkaW8saWZyYW1lLGVtYmVkLG9iamVjdHtkaXNwbGF5OmJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX1pbWcsdmlkZW97bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OmF1dG99W2hpZGRlbl17ZGlzcGxheTpub25lfTpob3N0ey0tYmFja2dyb3VuZDogMCAwJSAxMDAlOy0tZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1jYXJkOiAwIDAlIDEwMCU7LS1jYXJkLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tcG9wb3ZlcjogMCAwJSAxMDAlOy0tcG9wb3Zlci1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLXByaW1hcnk6IDIyMi4yIDQ3LjQlIDExLjIlOy0tcHJpbWFyeS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLXNlY29uZGFyeTogMjEwIDQwJSA5Ni4xJTstLXNlY29uZGFyeS1mb3JlZ3JvdW5kOiAyMjIuMiA0Ny40JSAxMS4yJTstLW11dGVkOiAwIDAlIDU3LjMlOy0tbXV0ZWQtZm9yZWdyb3VuZDogMjE1LjQgMTYuMyUgNDYuOSU7LS1hY2NlbnQ6IDE1OSwgNjAlLCA1MSUsIDE7LS1hY2NlbnQtZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1kZXN0cnVjdGl2ZTogMCA4NC4yJSA2MC4yJTstLWRlc3RydWN0aXZlLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tYm9yZGVyOiAyMTQuMyAzMS44JSA5MS40JTstLWlucHV0OiAyMTQuMyAzMS44JSA5MS40JTstLXJpbmc6IDIyMi4yIDg0JSA0LjklOy0tcmFkaXVzOiAuNXJlbX06cm9vdHstLWJhY2tncm91bmQ6IDAgMCUgMTAwJTstLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tY2FyZDogMCAwJSAxMDAlOy0tY2FyZC1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLXBvcG92ZXI6IDAgMCUgMTAwJTstLXBvcG92ZXItZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1wcmltYXJ5OiAyMjIuMiA0Ny40JSAxMS4yJTstLXByaW1hcnktZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1zZWNvbmRhcnk6IDIxMCA0MCUgOTYuMSU7LS1zZWNvbmRhcnktZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1tdXRlZDogMCAwJSA1Ny4zJTstLW11dGVkLWZvcmVncm91bmQ6IDIxNS40IDE2LjMlIDQ2LjklOy0tYWNjZW50OiAxNTksIDYwJSwgNTElLCAxOy0tYWNjZW50LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tZGVzdHJ1Y3RpdmU6IDAgODQuMiUgNjAuMiU7LS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLWJvcmRlcjogMjE0LjMgMzEuOCUgOTEuNCU7LS1pbnB1dDogMjE0LjMgMzEuOCUgOTEuNCU7LS1yaW5nOiAyMjIuMiA4NCUgNC45JTstLXJhZGl1czogLjVyZW19KltkYXRhLW1vZGU9ZGFya117LS1iYWNrZ3JvdW5kOiAwIDAlIDQlOy0tZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1jYXJkOiAyMjIuMiA4NCUgNC45JTstLWNhcmQtZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1wb3BvdmVyOiAyMjIuMiA4NCUgNC45JTstLXBvcG92ZXItZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1wcmltYXJ5OiAyMTAgNDAlIDk4JTstLXByaW1hcnktZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1zZWNvbmRhcnk6IDIxNy4yIDMyLjYlIDE3LjUlOy0tc2Vjb25kYXJ5LWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tbXV0ZWQ6IDE3OCwgMjMlLCA3NiUsIDE7LS1tdXRlZC1mb3JlZ3JvdW5kOiAyMTUgMjAuMiUgNjUuMSU7LS1hY2NlbnQ6IDE1OSwgNjAlLCA1MSUsIDE7LS1hY2NlbnQtZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1kZXN0cnVjdGl2ZTogMCA2Mi44JSAzMC42JTstLWRlc3RydWN0aXZlLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tYm9yZGVyOiAyMTcuMiAzMi42JSAxNy41JTstLWlucHV0OiAyMTcuMiAzMi42JSAxNy41JTstLXJpbmc6IDIxMi43IDI2LjglIDgzLjklfSp7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1ib3JkZXIpKX1ib2R5e2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKTtjb2xvcjpoc2wodmFyKC0tZm9yZWdyb3VuZCkpfSosOmJlZm9yZSw6YWZ0ZXJ7LS10dy1ib3JkZXItc3BhY2luZy14OiAwOy0tdHctYm9yZGVyLXNwYWNpbmcteTogMDstLXR3LXRyYW5zbGF0ZS14OiAwOy0tdHctdHJhbnNsYXRlLXk6IDA7LS10dy1yb3RhdGU6IDA7LS10dy1za2V3LXg6IDA7LS10dy1za2V3LXk6IDA7LS10dy1zY2FsZS14OiAxOy0tdHctc2NhbGUteTogMTstLXR3LXBhbi14OiA7LS10dy1wYW4teTogOy0tdHctcGluY2gtem9vbTogOy0tdHctc2Nyb2xsLXNuYXAtc3RyaWN0bmVzczogcHJveGltaXR5Oy0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbjogOy0tdHctZ3JhZGllbnQtdmlhLXBvc2l0aW9uOiA7LS10dy1ncmFkaWVudC10by1wb3NpdGlvbjogOy0tdHctb3JkaW5hbDogOy0tdHctc2xhc2hlZC16ZXJvOiA7LS10dy1udW1lcmljLWZpZ3VyZTogOy0tdHctbnVtZXJpYy1zcGFjaW5nOiA7LS10dy1udW1lcmljLWZyYWN0aW9uOiA7LS10dy1yaW5nLWluc2V0OiA7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMHB4Oy0tdHctcmluZy1vZmZzZXQtY29sb3I6ICNmZmY7LS10dy1yaW5nLWNvbG9yOiByZ2IoNTkgMTMwIDI0NiAvIC41KTstLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogMCAwICMwMDAwOy0tdHctcmluZy1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXNoYWRvdzogMCAwICMwMDAwOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMCAjMDAwMDstLXR3LWJsdXI6IDstLXR3LWJyaWdodG5lc3M6IDstLXR3LWNvbnRyYXN0OiA7LS10dy1ncmF5c2NhbGU6IDstLXR3LWh1ZS1yb3RhdGU6IDstLXR3LWludmVydDogOy0tdHctc2F0dXJhdGU6IDstLXR3LXNlcGlhOiA7LS10dy1kcm9wLXNoYWRvdzogOy0tdHctYmFja2Ryb3AtYmx1cjogOy0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzczogOy0tdHctYmFja2Ryb3AtY29udHJhc3Q6IDstLXR3LWJhY2tkcm9wLWdyYXlzY2FsZTogOy0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZTogOy0tdHctYmFja2Ryb3AtaW52ZXJ0OiA7LS10dy1iYWNrZHJvcC1vcGFjaXR5OiA7LS10dy1iYWNrZHJvcC1zYXR1cmF0ZTogOy0tdHctYmFja2Ryb3Atc2VwaWE6IH06OmJhY2tkcm9wey0tdHctYm9yZGVyLXNwYWNpbmcteDogMDstLXR3LWJvcmRlci1zcGFjaW5nLXk6IDA7LS10dy10cmFuc2xhdGUteDogMDstLXR3LXRyYW5zbGF0ZS15OiAwOy0tdHctcm90YXRlOiAwOy0tdHctc2tldy14OiAwOy0tdHctc2tldy15OiAwOy0tdHctc2NhbGUteDogMTstLXR3LXNjYWxlLXk6IDE7LS10dy1wYW4teDogOy0tdHctcGFuLXk6IDstLXR3LXBpbmNoLXpvb206IDstLXR3LXNjcm9sbC1zbmFwLXN0cmljdG5lc3M6IHByb3hpbWl0eTstLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb246IDstLXR3LWdyYWRpZW50LXZpYS1wb3NpdGlvbjogOy0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb246IDstLXR3LW9yZGluYWw6IDstLXR3LXNsYXNoZWQtemVybzogOy0tdHctbnVtZXJpYy1maWd1cmU6IDstLXR3LW51bWVyaWMtc3BhY2luZzogOy0tdHctbnVtZXJpYy1mcmFjdGlvbjogOy0tdHctcmluZy1pbnNldDogOy0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDBweDstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiAjZmZmOy0tdHctcmluZy1jb2xvcjogcmdiKDU5IDEzMCAyNDYgLyAuNSk7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXJpbmctc2hhZG93OiAwIDAgIzAwMDA7LS10dy1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7LS10dy1ibHVyOiA7LS10dy1icmlnaHRuZXNzOiA7LS10dy1jb250cmFzdDogOy0tdHctZ3JheXNjYWxlOiA7LS10dy1odWUtcm90YXRlOiA7LS10dy1pbnZlcnQ6IDstLXR3LXNhdHVyYXRlOiA7LS10dy1zZXBpYTogOy0tdHctZHJvcC1zaGFkb3c6IDstLXR3LWJhY2tkcm9wLWJsdXI6IDstLXR3LWJhY2tkcm9wLWJyaWdodG5lc3M6IDstLXR3LWJhY2tkcm9wLWNvbnRyYXN0OiA7LS10dy1iYWNrZHJvcC1ncmF5c2NhbGU6IDstLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGU6IDstLXR3LWJhY2tkcm9wLWludmVydDogOy0tdHctYmFja2Ryb3Atb3BhY2l0eTogOy0tdHctYmFja2Ryb3Atc2F0dXJhdGU6IDstLXR3LWJhY2tkcm9wLXNlcGlhOiB9LnNyLW9ubHl7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O2hlaWdodDoxcHg7cGFkZGluZzowO21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtjbGlwOnJlY3QoMCwwLDAsMCk7d2hpdGUtc3BhY2U6bm93cmFwO2JvcmRlci13aWR0aDowfS5wb2ludGVyLWV2ZW50cy1ub25le3BvaW50ZXItZXZlbnRzOm5vbmV9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbn0uc3RhdGlje3Bvc2l0aW9uOnN0YXRpY30uZml4ZWR7cG9zaXRpb246Zml4ZWR9LmFic29sdXRle3Bvc2l0aW9uOmFic29sdXRlfS5yZWxhdGl2ZXtwb3NpdGlvbjpyZWxhdGl2ZX0uc3RpY2t5e3Bvc2l0aW9uOnN0aWNreX0uaW5zZXQtMHt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MH0uaW5zZXQteS0we3RvcDowO2JvdHRvbTowfS4tbGVmdC0ye2xlZnQ6LS41cmVtfS4tdG9wLVxbNHB4XF17dG9wOi00cHh9LmJvdHRvbS0we2JvdHRvbTowfS5ib3R0b20tNHtib3R0b206MXJlbX0ubGVmdC0we2xlZnQ6MH0ubGVmdC0xe2xlZnQ6LjI1cmVtfS5sZWZ0LTFcLzJ7bGVmdDo1MCV9LmxlZnQtMntsZWZ0Oi41cmVtfS5sZWZ0LVxbNTBcJVxde2xlZnQ6NTAlfS5yaWdodC0we3JpZ2h0OjB9LnJpZ2h0LTF7cmlnaHQ6LjI1cmVtfS5yaWdodC00e3JpZ2h0OjFyZW19LnJpZ2h0LVxbMTZweFxde3JpZ2h0OjE2cHh9LnRvcC0we3RvcDowfS50b3AtNHt0b3A6MXJlbX0udG9wLVxbNTBcJVxde3RvcDo1MCV9LnotNTB7ei1pbmRleDo1MH0uei1cWzVcXXt6LWluZGV4OjV9Lnotb3ZlcmxheXt6LWluZGV4OjR9Li1teC0xe21hcmdpbi1sZWZ0Oi0uMjVyZW07bWFyZ2luLXJpZ2h0Oi0uMjVyZW19Li1teS0ye21hcmdpbi10b3A6LS41cmVtO21hcmdpbi1ib3R0b206LS41cmVtfS4tbXktXFsxMDBweFxde21hcmdpbi10b3A6LTEwMHB4O21hcmdpbi1ib3R0b206LTEwMHB4fS5teC0ye21hcmdpbi1sZWZ0Oi41cmVtO21hcmdpbi1yaWdodDouNXJlbX0ubXktMXttYXJnaW4tdG9wOi4yNXJlbTttYXJnaW4tYm90dG9tOi4yNXJlbX0ubWItNHttYXJnaW4tYm90dG9tOjFyZW19Lm1sLTJ7bWFyZ2luLWxlZnQ6LjVyZW19Lm1sLTR7bWFyZ2luLWxlZnQ6MXJlbX0ubWwtXFsyMHB4XF17bWFyZ2luLWxlZnQ6MjBweH0ubWwtYXV0b3ttYXJnaW4tbGVmdDphdXRvfS5tci0ye21hcmdpbi1yaWdodDouNXJlbX0ubXQtMnttYXJnaW4tdG9wOi41cmVtfS5ibG9ja3tkaXNwbGF5OmJsb2NrfS5pbmxpbmV7ZGlzcGxheTppbmxpbmV9LmZsZXh7ZGlzcGxheTpmbGV4fS5pbmxpbmUtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4fS50YWJsZXtkaXNwbGF5OnRhYmxlfS5ncmlke2Rpc3BsYXk6Z3JpZH0uY29udGVudHN7ZGlzcGxheTpjb250ZW50c30uaGlkZGVue2Rpc3BsYXk6bm9uZX0uYXNwZWN0LXNxdWFyZXthc3BlY3QtcmF0aW86MSAvIDF9LmgtMTB7aGVpZ2h0OjIuNXJlbX0uaC0xMXtoZWlnaHQ6Mi43NXJlbX0uaC0ye2hlaWdodDouNXJlbX0uaC0yXC41e2hlaWdodDouNjI1cmVtfS5oLTN7aGVpZ2h0Oi43NXJlbX0uaC0zXC41e2hlaWdodDouODc1cmVtfS5oLTR7aGVpZ2h0OjFyZW19LmgtN3toZWlnaHQ6MS43NXJlbX0uaC05e2hlaWdodDoyLjI1cmVtfS5oLVxbMTRweFxde2hlaWdodDoxNHB4fS5oLVxbMThweFxde2hlaWdodDoxOHB4fS5oLVxbMXB4XF17aGVpZ2h0OjFweH0uaC1cWzIwcHhcXXtoZWlnaHQ6MjBweH0uaC1cWzIycHhcXXtoZWlnaHQ6MjJweH0uaC1cWzI0cHhcXXtoZWlnaHQ6MjRweH0uaC1cWzMycHhcXXtoZWlnaHQ6MzJweH0uaC1cWzUwcHhcXXtoZWlnaHQ6NTBweH0uaC1cWzc1cHhcXXtoZWlnaHQ6NzVweH0uaC1cWzlweFxde2hlaWdodDo5cHh9LmgtXFt2YXJcKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0XClcXXtoZWlnaHQ6dmFyKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0KX0uaC1mdWxse2hlaWdodDoxMDAlfS5oLXB4e2hlaWdodDoxcHh9Lmgtc2NyZWVue2hlaWdodDoxMDB2aH0ubWF4LWgtXFszMDBweFxde21heC1oZWlnaHQ6MzAwcHh9Lm1pbi1oLVxbMjAwcHhcXXttaW4taGVpZ2h0OjIwMHB4fS5taW4taC1cWzMwMHB4XF17bWluLWhlaWdodDozMDBweH0ubWluLWgtc2NyZWVue21pbi1oZWlnaHQ6MTAwdmh9LnctMVwvM3t3aWR0aDozMy4zMzMzMzMlfS53LTEwe3dpZHRoOjIuNXJlbX0udy0ye3dpZHRoOi41cmVtfS53LTJcLjV7d2lkdGg6LjYyNXJlbX0udy0ze3dpZHRoOi43NXJlbX0udy0zXC41e3dpZHRoOi44NzVyZW19LnctNHt3aWR0aDoxcmVtfS53LTV7d2lkdGg6MS4yNXJlbX0udy03e3dpZHRoOjEuNzVyZW19LnctNzJ7d2lkdGg6MThyZW19LnctOXt3aWR0aDoyLjI1cmVtfS53LVxbMTRweFxde3dpZHRoOjE0cHh9LnctXFsxcHhcXXt3aWR0aDoxcHh9LnctXFsyMHB4XF17d2lkdGg6MjBweH0udy1cWzI0cHhcXXt3aWR0aDoyNHB4fS53LVxbMzJweFxde3dpZHRoOjMycHh9LnctXFs0NHB4XF17d2lkdGg6NDRweH0udy1cWzlweFxde3dpZHRoOjlweH0udy1maXR7d2lkdGg6LW1vei1maXQtY29udGVudDt3aWR0aDpmaXQtY29udGVudH0udy1mdWxse3dpZHRoOjEwMCV9Lnctc2NyZWVue3dpZHRoOjEwMHZ3fS5taW4tdy0we21pbi13aWR0aDowcHh9Lm1pbi13LVxbMzIwcHhcXXttaW4td2lkdGg6MzIwcHh9Lm1pbi13LVxbNTAwcHhcXXttaW4td2lkdGg6NTAwcHh9Lm1pbi13LVxbOHJlbVxde21pbi13aWR0aDo4cmVtfS5taW4tdy1cW3ZhclwoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aFwpXF17bWluLXdpZHRoOnZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLXdpZHRoKX0ubWF4LXctNHhse21heC13aWR0aDo1NnJlbX0ubWF4LXctXFsxMDAwcHhcXXttYXgtd2lkdGg6MTAwMHB4fS5tYXgtdy1cWzEwdndcXXttYXgtd2lkdGg6MTB2d30ubWF4LXctXFszMDBweFxde21heC13aWR0aDozMDBweH0ubWF4LXctXFs5MHZ3XF17bWF4LXdpZHRoOjkwdnd9Lm1heC13LWxne21heC13aWR0aDozMnJlbX0uZmxleC0xe2ZsZXg6MSAxIDAlfS5mbGV4LWF1dG97ZmxleDoxIDEgYXV0b30uZmxleC1zaHJpbmstMCwuc2hyaW5rLTB7ZmxleC1zaHJpbms6MH0uZmxleC1ncm93e2ZsZXgtZ3JvdzoxfS5ib3JkZXItY29sbGFwc2V7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfS4tdHJhbnNsYXRlLXgtMVwvMiwudHJhbnNsYXRlLXgtXFstNTBcJVxdey0tdHctdHJhbnNsYXRlLXg6IC01MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnRyYW5zbGF0ZS15LVxbLTUwXCVcXXstLXR3LXRyYW5zbGF0ZS15OiAtNTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS4tcm90YXRlLTkwey0tdHctcm90YXRlOiAtOTBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnJvdGF0ZS05MHstLXR3LXJvdGF0ZTogOTBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnJvdGF0ZS1cWy05MGRlZ1xdey0tdHctcm90YXRlOiAtOTBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnJvdGF0ZS1cWzkwZGVnXF17LS10dy1yb3RhdGU6IDkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS50cmFuc2Zvcm17dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmN1cnNvci1jb2wtcmVzaXple2N1cnNvcjpjb2wtcmVzaXplfS5jdXJzb3ItZGVmYXVsdHtjdXJzb3I6ZGVmYXVsdH0uY3Vyc29yLWdyYWJ7Y3Vyc29yOmdyYWJ9LmN1cnNvci1wb2ludGVye2N1cnNvcjpwb2ludGVyfS5jdXJzb3Itc2UtcmVzaXple2N1cnNvcjpzZS1yZXNpemV9LnRvdWNoLW5vbmV7dG91Y2gtYWN0aW9uOm5vbmV9LnNlbGVjdC1ub25ley13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0ucmVzaXplLW5vbmV7cmVzaXplOm5vbmV9LnJlc2l6ZXtyZXNpemU6Ym90aH0ubGlzdC1kZWNpbWFse2xpc3Qtc3R5bGUtdHlwZTpkZWNpbWFsfS5saXN0LWRpc2N7bGlzdC1zdHlsZS10eXBlOmRpc2N9LmdyaWQtY29scy1cW21pbi1jb250ZW50XzFmclxde2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW4tY29udGVudCAxZnJ9LmdyaWQtcm93cy1cWzFmclwsX21pbi1jb250ZW50XF17Z3JpZC10ZW1wbGF0ZS1yb3dzOjFmciBtaW4tY29udGVudH0uZmxleC1yb3d7ZmxleC1kaXJlY3Rpb246cm93fS5mbGV4LWNvbHtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmZsZXgtY29sLXJldmVyc2V7ZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2V9Lml0ZW1zLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9Lml0ZW1zLWVuZHthbGlnbi1pdGVtczpmbGV4LWVuZH0uaXRlbXMtY2VudGVye2FsaWduLWl0ZW1zOmNlbnRlcn0uanVzdGlmeS1zdGFydHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uanVzdGlmeS1lbmR7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5qdXN0aWZ5LWNlbnRlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5qdXN0aWZ5LWJldHdlZW57anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59LmdhcC0xe2dhcDouMjVyZW19LmdhcC0ye2dhcDouNXJlbX0uZ2FwLTN7Z2FwOi43NXJlbX0uZ2FwLTR7Z2FwOjFyZW19LmdhcC01e2dhcDoxLjI1cmVtfS5nYXAtXFswXC41ZW1cXXtnYXA6LjVlbX0uZ2FwLVxbMzZweFxde2dhcDozNnB4fS5nYXAteC0zey1tb3otY29sdW1uLWdhcDouNzVyZW07Y29sdW1uLWdhcDouNzVyZW19LmdhcC14LTR7LW1vei1jb2x1bW4tZ2FwOjFyZW07Y29sdW1uLWdhcDoxcmVtfS5nYXAteS0ye3Jvdy1nYXA6LjVyZW19LmdhcC15LTR7cm93LWdhcDoxcmVtfS5nYXAteS02e3Jvdy1nYXA6MS41cmVtfS5nYXAteS04e3Jvdy1nYXA6MnJlbX0uc3BhY2UteC0xPjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteC1yZXZlcnNlOiAwO21hcmdpbi1yaWdodDpjYWxjKC4yNXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoLjI1cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSkpfS5zcGFjZS15LTE+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKC4yNXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoLjI1cmVtICogdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSl9LnNwYWNlLXktMVwuNT46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoLjM3NXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoLjM3NXJlbSAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5zcGFjZS15LTI+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKC41cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYyguNXJlbSAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5zcGFjZS15LTQ+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKDFyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKSk7bWFyZ2luLWJvdHRvbTpjYWxjKDFyZW0gKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0ub3ZlcmZsb3ctYXV0b3tvdmVyZmxvdzphdXRvfS5vdmVyZmxvdy1oaWRkZW57b3ZlcmZsb3c6aGlkZGVufS5vdmVyZmxvdy1jbGlwe292ZXJmbG93OmNsaXB9Lm92ZXJmbG93LXNjcm9sbHtvdmVyZmxvdzpzY3JvbGx9Lm92ZXJmbG93LXktYXV0b3tvdmVyZmxvdy15OmF1dG99Lm92ZXJmbG93LXgtaGlkZGVue292ZXJmbG93LXg6aGlkZGVufS5vdmVyZmxvdy15LXNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbH0udHJ1bmNhdGV7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwfS53aGl0ZXNwYWNlLW5vd3JhcHt3aGl0ZS1zcGFjZTpub3dyYXB9LnJvdW5kZWR7Ym9yZGVyLXJhZGl1czouMjVyZW19LnJvdW5kZWQtXFtpbmhlcml0XF17Ym9yZGVyLXJhZGl1czppbmhlcml0fS5yb3VuZGVkLWZ1bGx7Ym9yZGVyLXJhZGl1czo5OTk5cHh9LnJvdW5kZWQtbGd7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5yb3VuZGVkLW1ke2JvcmRlci1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KX0ucm91bmRlZC1zbXtib3JkZXItcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDRweCl9LmJvcmRlcntib3JkZXItd2lkdGg6MXB4fS5ib3JkZXItMiwuYm9yZGVyLVxbMnB4XF17Ym9yZGVyLXdpZHRoOjJweH0uYm9yZGVyLXl7Ym9yZGVyLXRvcC13aWR0aDoxcHg7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHh9LmJvcmRlci1ie2JvcmRlci1ib3R0b20td2lkdGg6MXB4fS5ib3JkZXItbHtib3JkZXItbGVmdC13aWR0aDoxcHh9LmJvcmRlci1sLTJ7Ym9yZGVyLWxlZnQtd2lkdGg6MnB4fS5ib3JkZXItcntib3JkZXItcmlnaHQtd2lkdGg6MXB4fS5ib3JkZXItdHtib3JkZXItdG9wLXdpZHRoOjFweH0uYm9yZGVyLWFjY2VudHtib3JkZXItY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5ib3JkZXItYm9yZGVye2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmJvcmRlci1jYXJke2JvcmRlci1jb2xvcjpoc2wodmFyKC0tY2FyZCkpfS5ib3JkZXItZ3JheS00MDB7LS10dy1ib3JkZXItb3BhY2l0eTogMTtib3JkZXItY29sb3I6cmdiKDE1NiAxNjMgMTc1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKX0uYm9yZGVyLWlucHV0e2JvcmRlci1jb2xvcjpoc2wodmFyKC0taW5wdXQpKX0uYm9yZGVyLXByaW1hcnl7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmJvcmRlci10cmFuc3BhcmVudHtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9LmJvcmRlci1sLXRyYW5zcGFyZW50e2JvcmRlci1sZWZ0LWNvbG9yOnRyYW5zcGFyZW50fS5ib3JkZXItdC10cmFuc3BhcmVudHtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50fS5iZy1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmJnLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5iZy1iYWNrZ3JvdW5kXC84MHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSAvIC44KX0uYmctYm9yZGVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJvcmRlcikpfS5iZy1jYXJke2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWNhcmQpKX0uYmctY2FyZC1mb3JlZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWNhcmQtZm9yZWdyb3VuZCkpfS5iZy1kZXN0cnVjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZSkpfS5iZy1ncmF5LTMwMHstLXR3LWJnLW9wYWNpdHk6IDE7YmFja2dyb3VuZC1jb2xvcjpyZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLWdyYXktNTAwey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigxMDcgMTE0IDEyOCAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKX0uYmctbXV0ZWR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tbXV0ZWQpKX0uYmctcG9wb3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wb3BvdmVyKSl9LmJnLXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5iZy1yZWQtNTAwey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigyMzkgNjggNjggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLXNlY29uZGFyeXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1zZWNvbmRhcnkpKX0uYmctdHJhbnNwYXJlbnR7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uYmctd2hpdGV7LS10dy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpfS5iZy1ncmFkaWVudC10by1ie2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSx2YXIoLS10dy1ncmFkaWVudC1zdG9wcykpfS5mcm9tLXRyYW5zcGFyZW50ey0tdHctZ3JhZGllbnQtZnJvbTogdHJhbnNwYXJlbnQgdmFyKC0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbik7LS10dy1ncmFkaWVudC10bzogcmdiKDAgMCAwIC8gMCkgdmFyKC0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb24pOy0tdHctZ3JhZGllbnQtc3RvcHM6IHZhcigtLXR3LWdyYWRpZW50LWZyb20pLCB2YXIoLS10dy1ncmFkaWVudC10byl9LnRvLWJhY2tncm91bmR7LS10dy1ncmFkaWVudC10bzogaHNsKHZhcigtLWJhY2tncm91bmQpKSB2YXIoLS10dy1ncmFkaWVudC10by1wb3NpdGlvbil9LmZpbGwtY3VycmVudHtmaWxsOmN1cnJlbnRDb2xvcn0uZmlsbC13aGl0ZXtmaWxsOiNmZmZ9LnN0cm9rZS1cWzJweFxde3N0cm9rZS13aWR0aDoycHh9LnN0cm9rZS1cWzNweFxde3N0cm9rZS13aWR0aDozcHh9Lm9iamVjdC1jb250YWluey1vLW9iamVjdC1maXQ6Y29udGFpbjtvYmplY3QtZml0OmNvbnRhaW59LnAtMHtwYWRkaW5nOjB9LnAtMXtwYWRkaW5nOi4yNXJlbX0ucC0xMHtwYWRkaW5nOjIuNXJlbX0ucC0ye3BhZGRpbmc6LjVyZW19LnAtM3twYWRkaW5nOi43NXJlbX0ucC00e3BhZGRpbmc6MXJlbX0ucC02e3BhZGRpbmc6MS41cmVtfS5wLVxbMXB4XF17cGFkZGluZzoxcHh9LnB4LTF7cGFkZGluZy1sZWZ0Oi4yNXJlbTtwYWRkaW5nLXJpZ2h0Oi4yNXJlbX0ucHgtMntwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0ucHgtMlwuNXtwYWRkaW5nLWxlZnQ6LjYyNXJlbTtwYWRkaW5nLXJpZ2h0Oi42MjVyZW19LnB4LTN7cGFkZGluZy1sZWZ0Oi43NXJlbTtwYWRkaW5nLXJpZ2h0Oi43NXJlbX0ucHgtNHtwYWRkaW5nLWxlZnQ6MXJlbTtwYWRkaW5nLXJpZ2h0OjFyZW19LnB4LTV7cGFkZGluZy1sZWZ0OjEuMjVyZW07cGFkZGluZy1yaWdodDoxLjI1cmVtfS5weC04e3BhZGRpbmctbGVmdDoycmVtO3BhZGRpbmctcmlnaHQ6MnJlbX0ucHgtXFsyNHB4XF17cGFkZGluZy1sZWZ0OjI0cHg7cGFkZGluZy1yaWdodDoyNHB4fS5weS0xe3BhZGRpbmctdG9wOi4yNXJlbTtwYWRkaW5nLWJvdHRvbTouMjVyZW19LnB5LTFcLjV7cGFkZGluZy10b3A6LjM3NXJlbTtwYWRkaW5nLWJvdHRvbTouMzc1cmVtfS5weS0ye3BhZGRpbmctdG9wOi41cmVtO3BhZGRpbmctYm90dG9tOi41cmVtfS5weS0ze3BhZGRpbmctdG9wOi43NXJlbTtwYWRkaW5nLWJvdHRvbTouNzVyZW19LnB5LTR7cGFkZGluZy10b3A6MXJlbTtwYWRkaW5nLWJvdHRvbToxcmVtfS5weS02e3BhZGRpbmctdG9wOjEuNXJlbTtwYWRkaW5nLWJvdHRvbToxLjVyZW19LnB5LTd7cGFkZGluZy10b3A6MS43NXJlbTtwYWRkaW5nLWJvdHRvbToxLjc1cmVtfS5weS1cWzJweFxde3BhZGRpbmctdG9wOjJweDtwYWRkaW5nLWJvdHRvbToycHh9LnBiLTB7cGFkZGluZy1ib3R0b206MH0ucGItMjB7cGFkZGluZy1ib3R0b206NXJlbX0ucGItNHtwYWRkaW5nLWJvdHRvbToxcmVtfS5wbC02e3BhZGRpbmctbGVmdDoxLjVyZW19LnBsLTh7cGFkZGluZy1sZWZ0OjJyZW19LnByLTF7cGFkZGluZy1yaWdodDouMjVyZW19LnByLTJ7cGFkZGluZy1yaWdodDouNXJlbX0ucHQtMHtwYWRkaW5nLXRvcDowfS5wdC0xe3BhZGRpbmctdG9wOi4yNXJlbX0ucHQtMntwYWRkaW5nLXRvcDouNXJlbX0ucHQtNHtwYWRkaW5nLXRvcDoxcmVtfS50ZXh0LWxlZnR7dGV4dC1hbGlnbjpsZWZ0fS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn0udGV4dC1zdGFydHt0ZXh0LWFsaWduOnN0YXJ0fS5mb250LXNhbnN7Zm9udC1mYW1pbHk6Um9ib3RvLHNhbnMtc2VyaWZ9LmZvbnQtc2VyaWZ7Zm9udC1mYW1pbHk6U3BhY2UgTW9ubyxtb25vc3BhY2V9LnRleHQtMnhse2ZvbnQtc2l6ZToxLjVyZW07bGluZS1oZWlnaHQ6MnJlbX0udGV4dC0zeGx7Zm9udC1zaXplOjEuODc1cmVtO2xpbmUtaGVpZ2h0OjIuMjVyZW19LnRleHQtNHhse2ZvbnQtc2l6ZToyLjI1cmVtO2xpbmUtaGVpZ2h0OjIuNXJlbX0udGV4dC1cWzBcLjhyZW1cXXtmb250LXNpemU6LjhyZW19LnRleHQtXFsxMnB4XF17Zm9udC1zaXplOjEycHh9LnRleHQtbGd7Zm9udC1zaXplOjEuMTI1cmVtO2xpbmUtaGVpZ2h0OjEuNzVyZW19LnRleHQtc217Zm9udC1zaXplOi44NzVyZW07bGluZS1oZWlnaHQ6MS4yNXJlbX0udGV4dC14bHtmb250LXNpemU6MS4yNXJlbTtsaW5lLWhlaWdodDoxLjc1cmVtfS50ZXh0LXhze2ZvbnQtc2l6ZTouNzVyZW07bGluZS1oZWlnaHQ6MXJlbX0uZm9udC1cWzEycHhcXXtmb250LXdlaWdodDoxMnB4fS5mb250LVxbNDAwXF17Zm9udC13ZWlnaHQ6NDAwfS5mb250LVxbNTAwXF17Zm9udC13ZWlnaHQ6NTAwfS5mb250LVxbNTUwXF17Zm9udC13ZWlnaHQ6NTUwfS5mb250LWJvbGR7Zm9udC13ZWlnaHQ6NzAwfS5mb250LWV4dHJhYm9sZHtmb250LXdlaWdodDo4MDB9LmZvbnQtbWVkaXVte2ZvbnQtd2VpZ2h0OjUwMH0uZm9udC1ub3JtYWx7Zm9udC13ZWlnaHQ6NDAwfS5mb250LXNlbWlib2xke2ZvbnQtd2VpZ2h0OjYwMH0udXBwZXJjYXNle3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0uaXRhbGlje2ZvbnQtc3R5bGU6aXRhbGljfS5sZWFkaW5nLTR7bGluZS1oZWlnaHQ6MXJlbX0ubGVhZGluZy1ub25le2xpbmUtaGVpZ2h0OjF9LnRyYWNraW5nLVxbMFwuMDRlbVxde2xldHRlci1zcGFjaW5nOi4wNGVtfS50cmFja2luZy10aWdodHtsZXR0ZXItc3BhY2luZzotLjAyNWVtfS50cmFja2luZy13aWRlcntsZXR0ZXItc3BhY2luZzouMDVlbX0udHJhY2tpbmctd2lkZXN0e2xldHRlci1zcGFjaW5nOi4xZW19LnRleHQtYWNjZW50e2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0udGV4dC1hY2NlbnQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0udGV4dC1iYWNrZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LnRleHQtY2FyZC1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1jYXJkLWZvcmVncm91bmQpKX0udGV4dC1jdXJyZW50e2NvbG9yOmN1cnJlbnRDb2xvcn0udGV4dC1kZXN0cnVjdGl2ZXtjb2xvcjpoc2wodmFyKC0tZGVzdHJ1Y3RpdmUpKX0udGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kKSl9LnRleHQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tZm9yZWdyb3VuZCkpfS50ZXh0LW11dGVke2NvbG9yOmhzbCh2YXIoLS1tdXRlZCkpfS50ZXh0LW11dGVkLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0udGV4dC1wb3BvdmVyLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLXBvcG92ZXItZm9yZWdyb3VuZCkpfS50ZXh0LXByaW1hcnl7Y29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0udGV4dC1wcmltYXJ5LWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLXByaW1hcnktZm9yZWdyb3VuZCkpfS50ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1zZWNvbmRhcnktZm9yZWdyb3VuZCkpfS50ZXh0LXdoaXRley0tdHctdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpfS51bmRlcmxpbmV7dGV4dC1kZWNvcmF0aW9uLWxpbmU6dW5kZXJsaW5lfS5saW5lLXRocm91Z2h7dGV4dC1kZWNvcmF0aW9uLWxpbmU6bGluZS10aHJvdWdofS51bmRlcmxpbmUtb2Zmc2V0LTR7dGV4dC11bmRlcmxpbmUtb2Zmc2V0OjRweH0uYW50aWFsaWFzZWR7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGV9Lm9wYWNpdHktMHtvcGFjaXR5OjB9Lm9wYWNpdHktMTAwe29wYWNpdHk6MX0ub3BhY2l0eS01MHtvcGFjaXR5Oi41fS5vcGFjaXR5LTYwe29wYWNpdHk6LjZ9Lm9wYWNpdHktNzB7b3BhY2l0eTouN30ub3BhY2l0eS03NXtvcGFjaXR5Oi43NX0uc2hhZG93ey0tdHctc2hhZG93OiAwIDFweCAzcHggMCByZ2IoMCAwIDAgLyAuMSksIDAgMXB4IDJweCAtMXB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAzcHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDFweCAycHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LnNoYWRvdy1sZ3stLXR3LXNoYWRvdzogMCAxMHB4IDE1cHggLTNweCByZ2IoMCAwIDAgLyAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDEwcHggMTVweCAtM3B4IHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgNHB4IDZweCAtNHB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0uc2hhZG93LW1key0tdHctc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAuMSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDRweCA2cHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDJweCA0cHggLTJweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LnNoYWRvdy1zbXstLXR3LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gLjA1KTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAycHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9Lm91dGxpbmUtbm9uZXtvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9Lm91dGxpbmV7b3V0bGluZS1zdHlsZTpzb2xpZH0ucmluZy0wey0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpOy0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMHB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksdmFyKC0tdHctcmluZy1zaGFkb3cpLHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKX0ucmluZy1vZmZzZXQtYmFja2dyb3VuZHstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiBoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5kcm9wLXNoYWRvdy0yeGx7LS10dy1kcm9wLXNoYWRvdzogZHJvcC1zaGFkb3coMCAyNXB4IDI1cHggcmdiKDAgMCAwIC8gLjE1KSk7ZmlsdGVyOnZhcigtLXR3LWJsdXIpIHZhcigtLXR3LWJyaWdodG5lc3MpIHZhcigtLXR3LWNvbnRyYXN0KSB2YXIoLS10dy1ncmF5c2NhbGUpIHZhcigtLXR3LWh1ZS1yb3RhdGUpIHZhcigtLXR3LWludmVydCkgdmFyKC0tdHctc2F0dXJhdGUpIHZhcigtLXR3LXNlcGlhKSB2YXIoLS10dy1kcm9wLXNoYWRvdyl9LmRyb3Atc2hhZG93LVxbMHB4XzBweF8xMnB4X3JnYmFcKDU2XCwyMDVcLDE1MlwsMFwuNjBcKVxdey0tdHctZHJvcC1zaGFkb3c6IGRyb3Atc2hhZG93KDBweCAwcHggMTJweCByZ2JhKDU2LDIwNSwxNTIsLjYpKTtmaWx0ZXI6dmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KX0uZmlsdGVye2ZpbHRlcjp2YXIoLS10dy1ibHVyKSB2YXIoLS10dy1icmlnaHRuZXNzKSB2YXIoLS10dy1jb250cmFzdCkgdmFyKC0tdHctZ3JheXNjYWxlKSB2YXIoLS10dy1odWUtcm90YXRlKSB2YXIoLS10dy1pbnZlcnQpIHZhcigtLXR3LXNhdHVyYXRlKSB2YXIoLS10dy1zZXBpYSkgdmFyKC0tdHctZHJvcC1zaGFkb3cpfS5iYWNrZHJvcC1ibHVyLXNtey0tdHctYmFja2Ryb3AtYmx1cjogYmx1cig0cHgpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOnZhcigtLXR3LWJhY2tkcm9wLWJsdXIpIHZhcigtLXR3LWJhY2tkcm9wLWJyaWdodG5lc3MpIHZhcigtLXR3LWJhY2tkcm9wLWNvbnRyYXN0KSB2YXIoLS10dy1iYWNrZHJvcC1ncmF5c2NhbGUpIHZhcigtLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGUpIHZhcigtLXR3LWJhY2tkcm9wLWludmVydCkgdmFyKC0tdHctYmFja2Ryb3Atb3BhY2l0eSkgdmFyKC0tdHctYmFja2Ryb3Atc2F0dXJhdGUpIHZhcigtLXR3LWJhY2tkcm9wLXNlcGlhKTtiYWNrZHJvcC1maWx0ZXI6dmFyKC0tdHctYmFja2Ryb3AtYmx1cikgdmFyKC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzcykgdmFyKC0tdHctYmFja2Ryb3AtY29udHJhc3QpIHZhcigtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZSkgdmFyKC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZSkgdmFyKC0tdHctYmFja2Ryb3AtaW52ZXJ0KSB2YXIoLS10dy1iYWNrZHJvcC1vcGFjaXR5KSB2YXIoLS10dy1iYWNrZHJvcC1zYXR1cmF0ZSkgdmFyKC0tdHctYmFja2Ryb3Atc2VwaWEpfS50cmFuc2l0aW9uLWFsbHt0cmFuc2l0aW9uLXByb3BlcnR5OmFsbDt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKTt0cmFuc2l0aW9uLWR1cmF0aW9uOi4xNXN9LnRyYW5zaXRpb24tY29sb3Jze3RyYW5zaXRpb24tcHJvcGVydHk6Y29sb3IsYmFja2dyb3VuZC1jb2xvcixib3JkZXItY29sb3IsdGV4dC1kZWNvcmF0aW9uLWNvbG9yLGZpbGwsc3Ryb2tlO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30udHJhbnNpdGlvbi1vcGFjaXR5e3RyYW5zaXRpb24tcHJvcGVydHk6b3BhY2l0eTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKTt0cmFuc2l0aW9uLWR1cmF0aW9uOi4xNXN9LnRyYW5zaXRpb24tdHJhbnNmb3Jte3RyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30uZHVyYXRpb24tMTUwe3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30uZHVyYXRpb24tMjAwe3RyYW5zaXRpb24tZHVyYXRpb246LjJzfS5lYXNlLWluLW91dHt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKX1Aa2V5ZnJhbWVzIGVudGVyezAle29wYWNpdHk6dmFyKC0tdHctZW50ZXItb3BhY2l0eSwgMSk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKHZhcigtLXR3LWVudGVyLXRyYW5zbGF0ZS14LCAwKSx2YXIoLS10dy1lbnRlci10cmFuc2xhdGUteSwgMCksMCkgc2NhbGUzZCh2YXIoLS10dy1lbnRlci1zY2FsZSwgMSksdmFyKC0tdHctZW50ZXItc2NhbGUsIDEpLHZhcigtLXR3LWVudGVyLXNjYWxlLCAxKSkgcm90YXRlKHZhcigtLXR3LWVudGVyLXJvdGF0ZSwgMCkpfX1Aa2V5ZnJhbWVzIGV4aXR7dG97b3BhY2l0eTp2YXIoLS10dy1leGl0LW9wYWNpdHksIDEpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCh2YXIoLS10dy1leGl0LXRyYW5zbGF0ZS14LCAwKSx2YXIoLS10dy1leGl0LXRyYW5zbGF0ZS15LCAwKSwwKSBzY2FsZTNkKHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpLHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpLHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpKSByb3RhdGUodmFyKC0tdHctZXhpdC1yb3RhdGUsIDApKX19LmFuaW1hdGUtaW57YW5pbWF0aW9uLW5hbWU6ZW50ZXI7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXM7LS10dy1lbnRlci1vcGFjaXR5OiBpbml0aWFsOy0tdHctZW50ZXItc2NhbGU6IGluaXRpYWw7LS10dy1lbnRlci1yb3RhdGU6IGluaXRpYWw7LS10dy1lbnRlci10cmFuc2xhdGUteDogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiBpbml0aWFsfS5mYWRlLWluLTB7LS10dy1lbnRlci1vcGFjaXR5OiAwfS56b29tLWluLTk1ey0tdHctZW50ZXItc2NhbGU6IC45NX0uZHVyYXRpb24tMTUwe2FuaW1hdGlvbi1kdXJhdGlvbjouMTVzfS5kdXJhdGlvbi0yMDB7YW5pbWF0aW9uLWR1cmF0aW9uOi4yc30uZWFzZS1pbi1vdXR7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKX0uZmlsZVw6Ym9yZGVyLTA6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JvcmRlci13aWR0aDowcHh9LmZpbGVcOmJnLXRyYW5zcGFyZW50OjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5maWxlXDp0ZXh0LXNtOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntmb250LXNpemU6Ljg3NXJlbTtsaW5lLWhlaWdodDoxLjI1cmVtfS5maWxlXDpmb250LW1lZGl1bTo6ZmlsZS1zZWxlY3Rvci1idXR0b257Zm9udC13ZWlnaHQ6NTAwfS5wbGFjZWhvbGRlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LnBsYWNlaG9sZGVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmQ6OnBsYWNlaG9sZGVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LmZvY3VzLXdpdGhpblw6cmVsYXRpdmU6Zm9jdXMtd2l0aGlue3Bvc2l0aW9uOnJlbGF0aXZlfS5ob3Zlclw6dy1cWzJweFxdOmhvdmVye3dpZHRoOjJweH0uaG92ZXJcOnctXFszcHhcXTpob3Zlcnt3aWR0aDozcHh9LmhvdmVyXDpjdXJzb3ItcG9pbnRlcjpob3ZlcntjdXJzb3I6cG9pbnRlcn0uaG92ZXJcOnJvdW5kZWQtbGc6aG92ZXJ7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5ob3Zlclw6YmctYWNjZW50OmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5ob3Zlclw6YmctYmFja2dyb3VuZDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LmhvdmVyXDpiZy1ib3JkZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmhvdmVyXDpiZy1kZXN0cnVjdGl2ZVwvOTA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tZGVzdHJ1Y3RpdmUpIC8gLjkpfS5ob3Zlclw6YmctbXV0ZWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tbXV0ZWQpKX0uaG92ZXJcOmJnLXByaW1hcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5ob3Zlclw6YmctcHJpbWFyeVwvOTA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkgLyAuOSl9LmhvdmVyXDpiZy1yZWQtNzAwOmhvdmVyey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigxODUgMjggMjggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmhvdmVyXDpiZy1zZWNvbmRhcnlcLzgwOmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXNlY29uZGFyeSkgLyAuOCl9LmhvdmVyXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kOmhvdmVye2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5ob3Zlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOmhvdmVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LmhvdmVyXDp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZDpob3Zlcntjb2xvcjpoc2wodmFyKC0tcHJpbWFyeS1mb3JlZ3JvdW5kKSl9LmhvdmVyXDp0ZXh0LXdoaXRlOmhvdmVyey0tdHctdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpfS5ob3Zlclw6dW5kZXJsaW5lOmhvdmVye3RleHQtZGVjb3JhdGlvbi1saW5lOnVuZGVybGluZX0uaG92ZXJcOm9wYWNpdHktMTAwOmhvdmVye29wYWNpdHk6MX0uZm9jdXNcOmJnLWFjY2VudDpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZm9jdXNcOmJnLXByaW1hcnk6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5mb2N1c1w6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZDpmb2N1c3tjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0uZm9jdXNcOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kOmZvY3Vze2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0uZm9jdXNcOm91dGxpbmUtbm9uZTpmb2N1c3tvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9LmZvY3VzXDpyaW5nLTI6Zm9jdXN7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7LS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygycHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSx2YXIoLS10dy1yaW5nLXNoYWRvdyksdmFyKC0tdHctc2hhZG93LCAwIDAgIzAwMDApfS5mb2N1c1w6cmluZy1yaW5nOmZvY3Vzey0tdHctcmluZy1jb2xvcjogaHNsKHZhcigtLXJpbmcpKX0uZm9jdXNcOnJpbmctb2Zmc2V0LTI6Zm9jdXN7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMnB4fS5mb2N1cy12aXNpYmxlXDpvdXRsaW5lLW5vbmU6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9LmZvY3VzLXZpc2libGVcOm91dGxpbmUtYWNjZW50OmZvY3VzLXZpc2libGV7b3V0bGluZS1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmZvY3VzLXZpc2libGVcOnJpbmctMjpmb2N1cy12aXNpYmxley0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpOy0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMnB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksdmFyKC0tdHctcmluZy1zaGFkb3cpLHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKX0uZm9jdXMtdmlzaWJsZVw6cmluZy1yaW5nOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLWNvbG9yOiBoc2wodmFyKC0tcmluZykpfS5mb2N1cy12aXNpYmxlXDpyaW5nLW9mZnNldC0yOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMnB4fS5mb2N1cy12aXNpYmxlXDpyaW5nLW9mZnNldC1iYWNrZ3JvdW5kOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLW9mZnNldC1jb2xvcjogaHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGlzYWJsZWRcOnBvaW50ZXItZXZlbnRzLW5vbmU6ZGlzYWJsZWR7cG9pbnRlci1ldmVudHM6bm9uZX0uZGlzYWJsZWRcOmN1cnNvci1ub3QtYWxsb3dlZDpkaXNhYmxlZHtjdXJzb3I6bm90LWFsbG93ZWR9LmRpc2FibGVkXDpib3JkZXItYm9yZGVyOmRpc2FibGVke2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmRpc2FibGVkXDp0ZXh0LWJhY2tncm91bmQ6ZGlzYWJsZWR7Y29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGlzYWJsZWRcOm9wYWNpdHktNTA6ZGlzYWJsZWR7b3BhY2l0eTouNX0ucGVlcjpkaXNhYmxlZH4ucGVlci1kaXNhYmxlZFw6Y3Vyc29yLW5vdC1hbGxvd2Vke2N1cnNvcjpub3QtYWxsb3dlZH0ucGVlcjpkaXNhYmxlZH4ucGVlci1kaXNhYmxlZFw6b3BhY2l0eS03MHtvcGFjaXR5Oi43fS5hcmlhLXNlbGVjdGVkXDpiZy1hY2NlbnRbYXJpYS1zZWxlY3RlZD10cnVlXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uYXJpYS1zZWxlY3RlZFw6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZFthcmlhLXNlbGVjdGVkPXRydWVde2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5hcmlhLXNlbGVjdGVkXDpvcGFjaXR5LTEwMFthcmlhLXNlbGVjdGVkPXRydWVde29wYWNpdHk6MX0uZGF0YS1cW2Rpc2FibGVkXF1cOnBvaW50ZXItZXZlbnRzLW5vbmVbZGF0YS1kaXNhYmxlZF17cG9pbnRlci1ldmVudHM6bm9uZX0uZGF0YS1cW3NpZGVcPWJvdHRvbVxdXDp0cmFuc2xhdGUteS0xW2RhdGEtc2lkZT1ib3R0b21dey0tdHctdHJhbnNsYXRlLXk6IC4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3NpZGVcPWxlZnRcXVw6LXRyYW5zbGF0ZS14LTFbZGF0YS1zaWRlPWxlZnRdey0tdHctdHJhbnNsYXRlLXg6IC0uMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzaWRlXD1yaWdodFxdXDp0cmFuc2xhdGUteC0xW2RhdGEtc2lkZT1yaWdodF17LS10dy10cmFuc2xhdGUteDogLjI1cmVtO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5kYXRhLVxbc2lkZVw9dG9wXF1cOi10cmFuc2xhdGUteS0xW2RhdGEtc2lkZT10b3Bdey0tdHctdHJhbnNsYXRlLXk6IC0uMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDp0cmFuc2xhdGUteC01W2RhdGEtc3RhdGU9Y2hlY2tlZF17LS10dy10cmFuc2xhdGUteDogMS4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3N0YXRlXD11bmNoZWNrZWRcXVw6dHJhbnNsYXRlLXgtMFtkYXRhLXN0YXRlPXVuY2hlY2tlZF17LS10dy10cmFuc2xhdGUteDogMHB4O3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfUBrZXlmcmFtZXMgYWNjb3JkaW9uLXVwezAle2hlaWdodDp2YXIoLS1yYWRpeC1hY2NvcmRpb24tY29udGVudC1oZWlnaHQpfXRve2hlaWdodDowfX0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6YW5pbWF0ZS1hY2NvcmRpb24tdXBbZGF0YS1zdGF0ZT1jbG9zZWRde2FuaW1hdGlvbjphY2NvcmRpb24tdXAgLjJzIGVhc2Utb3V0fUBrZXlmcmFtZXMgYWNjb3JkaW9uLWRvd257MCV7aGVpZ2h0OjB9dG97aGVpZ2h0OnZhcigtLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LWhlaWdodCl9fS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6YW5pbWF0ZS1hY2NvcmRpb24tZG93bltkYXRhLXN0YXRlPW9wZW5de2FuaW1hdGlvbjphY2NvcmRpb24tZG93biAuMnMgZWFzZS1vdXR9LmRhdGEtXFtzdGF0ZVw9YWN0aXZlXF1cOmJnLWJhY2tncm91bmRbZGF0YS1zdGF0ZT1hY3RpdmVde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1jaGVja2VkXF1cOmJnLWFjY2VudFtkYXRhLXN0YXRlPWNoZWNrZWRde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5kYXRhLVxbc3RhdGVcPWNoZWNrZWRcXVw6YmctcHJpbWFyeVtkYXRhLXN0YXRlPWNoZWNrZWRde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0uZGF0YS1cW3N0YXRlXD1vblxdXDpiZy1hY2NlbnRbZGF0YS1zdGF0ZT1vbl0sLmRhdGEtXFtzdGF0ZVw9b3BlblxdXDpiZy1hY2NlbnRbZGF0YS1zdGF0ZT1vcGVuXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZGF0YS1cW3N0YXRlXD11bmNoZWNrZWRcXVw6YmctcHJpbWFyeVtkYXRhLXN0YXRlPXVuY2hlY2tlZF17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5kYXRhLVxbc3RhdGVcPWFjdGl2ZVxdXDp0ZXh0LWZvcmVncm91bmRbZGF0YS1zdGF0ZT1hY3RpdmVde2NvbG9yOmhzbCh2YXIoLS1mb3JlZ3JvdW5kKSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZFtkYXRhLXN0YXRlPWNoZWNrZWRde2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1vblxdXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9b25de2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9b3Blbl17Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0uZGF0YS1cW2Rpc2FibGVkXF1cOm9wYWNpdHktNTBbZGF0YS1kaXNhYmxlZF17b3BhY2l0eTouNX0uZGF0YS1cW3N0YXRlXD1hY3RpdmVcXVw6c2hhZG93LXNtW2RhdGEtc3RhdGU9YWN0aXZlXXstLXR3LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gLjA1KTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAycHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDphbmltYXRlLWluW2RhdGEtc3RhdGU9b3Blbl17YW5pbWF0aW9uLW5hbWU6ZW50ZXI7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXM7LS10dy1lbnRlci1vcGFjaXR5OiBpbml0aWFsOy0tdHctZW50ZXItc2NhbGU6IGluaXRpYWw7LS10dy1lbnRlci1yb3RhdGU6IGluaXRpYWw7LS10dy1lbnRlci10cmFuc2xhdGUteDogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiBpbml0aWFsfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDphbmltYXRlLW91dFtkYXRhLXN0YXRlPWNsb3NlZF17YW5pbWF0aW9uLW5hbWU6ZXhpdDthbmltYXRpb24tZHVyYXRpb246LjE1czstLXR3LWV4aXQtb3BhY2l0eTogaW5pdGlhbDstLXR3LWV4aXQtc2NhbGU6IGluaXRpYWw7LS10dy1leGl0LXJvdGF0ZTogaW5pdGlhbDstLXR3LWV4aXQtdHJhbnNsYXRlLXg6IGluaXRpYWw7LS10dy1leGl0LXRyYW5zbGF0ZS15OiBpbml0aWFsfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDpmYWRlLW91dC0wW2RhdGEtc3RhdGU9Y2xvc2VkXXstLXR3LWV4aXQtb3BhY2l0eTogMH0uZGF0YS1cW3N0YXRlXD1vcGVuXF1cOmZhZGUtaW4tMFtkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItb3BhY2l0eTogMH0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6em9vbS1vdXQtOTVbZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC1zY2FsZTogLjk1fS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6em9vbS1pbi05NVtkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItc2NhbGU6IC45NX0uZGF0YS1cW3NpZGVcPWJvdHRvbVxdXDpzbGlkZS1pbi1mcm9tLXRvcC0yW2RhdGEtc2lkZT1ib3R0b21dey0tdHctZW50ZXItdHJhbnNsYXRlLXk6IC0uNXJlbX0uZGF0YS1cW3NpZGVcPWxlZnRcXVw6c2xpZGUtaW4tZnJvbS1yaWdodC0yW2RhdGEtc2lkZT1sZWZ0XXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiAuNXJlbX0uZGF0YS1cW3NpZGVcPXJpZ2h0XF1cOnNsaWRlLWluLWZyb20tbGVmdC0yW2RhdGEtc2lkZT1yaWdodF17LS10dy1lbnRlci10cmFuc2xhdGUteDogLS41cmVtfS5kYXRhLVxbc2lkZVw9dG9wXF1cOnNsaWRlLWluLWZyb20tYm90dG9tLTJbZGF0YS1zaWRlPXRvcF17LS10dy1lbnRlci10cmFuc2xhdGUteTogLjVyZW19LmRhdGEtXFtzdGF0ZVw9Y2xvc2VkXF1cOnNsaWRlLW91dC10by1sZWZ0LTFcLzJbZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC10cmFuc2xhdGUteDogLTUwJX0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6c2xpZGUtb3V0LXRvLXRvcC1cWzQ4XCVcXVtkYXRhLXN0YXRlPWNsb3NlZF17LS10dy1leGl0LXRyYW5zbGF0ZS15OiAtNDglfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6c2xpZGUtaW4tZnJvbS1sZWZ0LTFcLzJbZGF0YS1zdGF0ZT1vcGVuXXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiAtNTAlfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6c2xpZGUtaW4tZnJvbS10b3AtXFs0OFwlXF1bZGF0YS1zdGF0ZT1vcGVuXXstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiAtNDglfTppcyhbZGF0YS1tb2RlPWRhcmtdIC5kYXJrXDpib3JkZXItd2hpdGUpey0tdHctYm9yZGVyLW9wYWNpdHk6IDE7Ym9yZGVyLWNvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSl9QG1lZGlhIChtaW4td2lkdGg6IDY0MHB4KXsuc21cOm10LTB7bWFyZ2luLXRvcDowfS5zbVw6YmxvY2t7ZGlzcGxheTpibG9ja30uc21cOmZsZXgtcm93e2ZsZXgtZGlyZWN0aW9uOnJvd30uc21cOmp1c3RpZnktZW5ke2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uc21cOnNwYWNlLXgtMj46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXgtcmV2ZXJzZTogMDttYXJnaW4tcmlnaHQ6Y2FsYyguNXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoLjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKSl9LnNtXDpzcGFjZS14LTQ+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS14LXJldmVyc2U6IDA7bWFyZ2luLXJpZ2h0OmNhbGMoMXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoMXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpKX0uc21cOnNwYWNlLXktMD46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoMHB4ICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYygwcHggKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0uc21cOnJvdW5kZWQtbGd7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5zbVw6cC0we3BhZGRpbmc6MH0uc21cOnRleHQtbGVmdHt0ZXh0LWFsaWduOmxlZnR9fUBtZWRpYSAobWluLXdpZHRoOiA3NjhweCl7Lm1kXDp3LWZ1bGx7d2lkdGg6MTAwJX19LlxbXCZcOmhhc1woXFthcmlhLXNlbGVjdGVkXF1cKVxdXDpiZy1hY2NlbnQ6aGFzKFthcmlhLXNlbGVjdGVkXSl7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmZpcnN0XDpcW1wmXDpoYXNcKFxbYXJpYS1zZWxlY3RlZFxdXClcXVw6cm91bmRlZC1sLW1kOmhhcyhbYXJpYS1zZWxlY3RlZF0pOmZpcnN0LWNoaWxke2JvcmRlci10b3AtbGVmdC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCl9Lmxhc3RcOlxbXCZcOmhhc1woXFthcmlhLXNlbGVjdGVkXF1cKVxdXDpyb3VuZGVkLXItbWQ6aGFzKFthcmlhLXNlbGVjdGVkXSk6bGFzdC1jaGlsZHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSAycHgpO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCl9LlxbXCZcW2RhdGEtc3RhdGVcPW9wZW5cXVw+c3ZnXF1cOnJvdGF0ZS0xODBbZGF0YS1zdGF0ZT1vcGVuXT5zdmd7LS10dy1yb3RhdGU6IDE4MGRlZzt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnB4LTIgW2NtZGstZ3JvdXAtaGVhZGluZ117cGFkZGluZy1sZWZ0Oi41cmVtO3BhZGRpbmctcmlnaHQ6LjVyZW19LlxbXCZfXFtjbWRrLWdyb3VwLWhlYWRpbmdcXVxdXDpweS0xXC41IFtjbWRrLWdyb3VwLWhlYWRpbmdde3BhZGRpbmctdG9wOi4zNzVyZW07cGFkZGluZy1ib3R0b206LjM3NXJlbX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnRleHQteHMgW2NtZGstZ3JvdXAtaGVhZGluZ117Zm9udC1zaXplOi43NXJlbTtsaW5lLWhlaWdodDoxcmVtfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6Zm9udC1tZWRpdW0gW2NtZGstZ3JvdXAtaGVhZGluZ117Zm9udC13ZWlnaHQ6NTAwfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIFtjbWRrLWdyb3VwLWhlYWRpbmdde2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LlxbXCZfXFtjbWRrLWdyb3VwXF1cOm5vdFwoXFtoaWRkZW5cXVwpX1x+XFtjbWRrLWdyb3VwXF1cXVw6cHQtMCBbY21kay1ncm91cF06bm90KFtoaWRkZW5dKX5bY21kay1ncm91cF17cGFkZGluZy10b3A6MH0uXFtcJl9cW2NtZGstZ3JvdXBcXVxdXDpweC0yIFtjbWRrLWdyb3VwXXtwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0uXFtcJl9cW2NtZGstaW5wdXQtd3JhcHBlclxdX3N2Z1xdXDpoLTUgW2NtZGstaW5wdXQtd3JhcHBlcl0gc3Zne2hlaWdodDoxLjI1cmVtfS5cW1wmX1xbY21kay1pbnB1dC13cmFwcGVyXF1fc3ZnXF1cOnctNSBbY21kay1pbnB1dC13cmFwcGVyXSBzdmd7d2lkdGg6MS4yNXJlbX0uXFtcJl9cW2NtZGstaW5wdXRcXVxdXDpoLTEyIFtjbWRrLWlucHV0XXtoZWlnaHQ6M3JlbX0uXFtcJl9cW2NtZGstaXRlbVxdXF1cOnB4LTIgW2NtZGstaXRlbV17cGFkZGluZy1sZWZ0Oi41cmVtO3BhZGRpbmctcmlnaHQ6LjVyZW19LlxbXCZfXFtjbWRrLWl0ZW1cXVxdXDpweS0zIFtjbWRrLWl0ZW1de3BhZGRpbmctdG9wOi43NXJlbTtwYWRkaW5nLWJvdHRvbTouNzVyZW19LlxbXCZfXFtjbWRrLWl0ZW1cXV9zdmdcXVw6aC01IFtjbWRrLWl0ZW1dIHN2Z3toZWlnaHQ6MS4yNXJlbX0uXFtcJl9cW2NtZGstaXRlbVxdX3N2Z1xdXDp3LTUgW2NtZGstaXRlbV0gc3Zne3dpZHRoOjEuMjVyZW19Cg==","/assets/index-3108ab2a.js":"dmFyIENDPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgJEM9KGUsdCxuKT0+dCBpbiBlP0NDKGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOmVbdF09bjt2YXIgamU9KGUsdCxuKT0+KCRDKGUsdHlwZW9mIHQhPSJzeW1ib2wiP3QrIiI6dCxuKSxuKSxrQz0oZSx0LG4pPT57aWYoIXQuaGFzKGUpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrbil9O3ZhciBJZD0oZSx0LG4pPT57aWYodC5oYXMoZSkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7dCBpbnN0YW5jZW9mIFdlYWtTZXQ/dC5hZGQoZSk6dC5zZXQoZSxuKX07dmFyIEhhPShlLHQsbik9PihrQyhlLHQsImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLG4pO2Z1bmN0aW9uIFRDKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXTtpZih0eXBlb2YgciE9InN0cmluZyImJiFBcnJheS5pc0FycmF5KHIpKXtmb3IoY29uc3QgbyBpbiByKWlmKG8hPT0iZGVmYXVsdCImJiEobyBpbiBlKSl7Y29uc3QgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsbyk7aSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbyxpLmdldD9pOntlbnVtZXJhYmxlOiEwLGdldDooKT0+cltvXX0pfX19cmV0dXJuIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKX0oZnVuY3Rpb24oKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKS5yZWxMaXN0O2lmKHQmJnQuc3VwcG9ydHMmJnQuc3VwcG9ydHMoIm1vZHVsZXByZWxvYWQiKSlyZXR1cm47Zm9yKGNvbnN0IG8gb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9Im1vZHVsZXByZWxvYWQiXScpKXIobyk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIobz0+e2Zvcihjb25zdCBpIG9mIG8paWYoaS50eXBlPT09ImNoaWxkTGlzdCIpZm9yKGNvbnN0IGwgb2YgaS5hZGRlZE5vZGVzKWwudGFnTmFtZT09PSJMSU5LIiYmbC5yZWw9PT0ibW9kdWxlcHJlbG9hZCImJnIobCl9KS5vYnNlcnZlKGRvY3VtZW50LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO2Z1bmN0aW9uIG4obyl7Y29uc3QgaT17fTtyZXR1cm4gby5pbnRlZ3JpdHkmJihpLmludGVncml0eT1vLmludGVncml0eSksby5yZWZlcnJlclBvbGljeSYmKGkucmVmZXJyZXJQb2xpY3k9by5yZWZlcnJlclBvbGljeSksby5jcm9zc09yaWdpbj09PSJ1c2UtY3JlZGVudGlhbHMiP2kuY3JlZGVudGlhbHM9ImluY2x1ZGUiOm8uY3Jvc3NPcmlnaW49PT0iYW5vbnltb3VzIj9pLmNyZWRlbnRpYWxzPSJvbWl0IjppLmNyZWRlbnRpYWxzPSJzYW1lLW9yaWdpbiIsaX1mdW5jdGlvbiByKG8pe2lmKG8uZXApcmV0dXJuO28uZXA9ITA7Y29uc3QgaT1uKG8pO2ZldGNoKG8uaHJlZixpKX19KSgpO2Z1bmN0aW9uICRhKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9dmFyIFUwPXtleHBvcnRzOnt9fSxTZT17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBrYT1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksTkM9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksYkM9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxSQz1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLFBDPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksT0M9U3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKSxBQz1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0IiksTUM9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSxEQz1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLExDPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxJQz1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5Iiksam09U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIGpDKGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9am0mJmVbam1dfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIgVjA9e2lzTW91bnRlZDpmdW5jdGlvbigpe3JldHVybiExfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbigpe319LEgwPU9iamVjdC5hc3NpZ24sSzA9e307ZnVuY3Rpb24gUGwoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9SzAsdGhpcy51cGRhdGVyPW58fFYwfVBsLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O1BsLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0IiYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPW51bGwpdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxlLHQsInNldFN0YXRlIil9O1BsLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsZSwiZm9yY2VVcGRhdGUiKX07ZnVuY3Rpb24gRzAoKXt9RzAucHJvdG90eXBlPVBsLnByb3RvdHlwZTtmdW5jdGlvbiBicChlLHQsbil7dGhpcy5wcm9wcz1lLHRoaXMuY29udGV4dD10LHRoaXMucmVmcz1LMCx0aGlzLnVwZGF0ZXI9bnx8VjB9dmFyIFJwPWJwLnByb3RvdHlwZT1uZXcgRzA7UnAuY29uc3RydWN0b3I9YnA7SDAoUnAsUGwucHJvdG90eXBlKTtScC5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgem09QXJyYXkuaXNBcnJheSxZMD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFBwPXtjdXJyZW50Om51bGx9LFgwPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gUTAoZSx0LG4pe3ZhciByLG89e30saT1udWxsLGw9bnVsbDtpZih0IT1udWxsKWZvcihyIGluIHQucmVmIT09dm9pZCAwJiYobD10LnJlZiksdC5rZXkhPT12b2lkIDAmJihpPSIiK3Qua2V5KSx0KVkwLmNhbGwodCxyKSYmIVgwLmhhc093blByb3BlcnR5KHIpJiYob1tyXT10W3JdKTt2YXIgcz1hcmd1bWVudHMubGVuZ3RoLTI7aWYocz09PTEpby5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxzKXtmb3IodmFyIGE9QXJyYXkocyksdT0wO3U8czt1KyspYVt1XT1hcmd1bWVudHNbdSsyXTtvLmNoaWxkcmVuPWF9aWYoZSYmZS5kZWZhdWx0UHJvcHMpZm9yKHIgaW4gcz1lLmRlZmF1bHRQcm9wcyxzKW9bcl09PT12b2lkIDAmJihvW3JdPXNbcl0pO3JldHVybnskJHR5cGVvZjprYSx0eXBlOmUsa2V5OmkscmVmOmwscHJvcHM6byxfb3duZXI6UHAuY3VycmVudH19ZnVuY3Rpb24gekMoZSx0KXtyZXR1cm57JCR0eXBlb2Y6a2EsdHlwZTplLnR5cGUsa2V5OnQscmVmOmUucmVmLHByb3BzOmUucHJvcHMsX293bmVyOmUuX293bmVyfX1mdW5jdGlvbiBPcChlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS4kJHR5cGVvZj09PWthfWZ1bmN0aW9uIEZDKGUpe3ZhciB0PXsiPSI6Ij0wIiwiOiI6Ij0yIn07cmV0dXJuIiQiK2UucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0W25dfSl9dmFyIEZtPS9cLysvZztmdW5jdGlvbiBqZChlLHQpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsJiZlLmtleSE9bnVsbD9GQygiIitlLmtleSk6dC50b1N0cmluZygzNil9ZnVuY3Rpb24gU3UoZSx0LG4scixvKXt2YXIgaT10eXBlb2YgZTsoaT09PSJ1bmRlZmluZWQifHxpPT09ImJvb2xlYW4iKSYmKGU9bnVsbCk7dmFyIGw9ITE7aWYoZT09PW51bGwpbD0hMDtlbHNlIHN3aXRjaChpKXtjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOmw9ITA7YnJlYWs7Y2FzZSJvYmplY3QiOnN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIGthOmNhc2UgTkM6bD0hMH19aWYobClyZXR1cm4gbD1lLG89byhsKSxlPXI9PT0iIj8iLiIramQobCwwKTpyLHptKG8pPyhuPSIiLGUhPW51bGwmJihuPWUucmVwbGFjZShGbSwiJCYvIikrIi8iKSxTdShvLHQsbiwiIixmdW5jdGlvbih1KXtyZXR1cm4gdX0pKTpvIT1udWxsJiYoT3AobykmJihvPXpDKG8sbisoIW8ua2V5fHxsJiZsLmtleT09PW8ua2V5PyIiOigiIitvLmtleSkucmVwbGFjZShGbSwiJCYvIikrIi8iKStlKSksdC5wdXNoKG8pKSwxO2lmKGw9MCxyPXI9PT0iIj8iLiI6cisiOiIsem0oZSkpZm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKyspe2k9ZVtzXTt2YXIgYT1yK2pkKGkscyk7bCs9U3UoaSx0LG4sYSxvKX1lbHNlIGlmKGE9akMoZSksdHlwZW9mIGE9PSJmdW5jdGlvbiIpZm9yKGU9YS5jYWxsKGUpLHM9MDshKGk9ZS5uZXh0KCkpLmRvbmU7KWk9aS52YWx1ZSxhPXIramQoaSxzKyspLGwrPVN1KGksdCxuLGEsbyk7ZWxzZSBpZihpPT09Im9iamVjdCIpdGhyb3cgdD1TdHJpbmcoZSksRXJyb3IoIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogIisodD09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGUpLmpvaW4oIiwgIikrIn0iOnQpKyIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIik7cmV0dXJuIGx9ZnVuY3Rpb24gS2EoZSx0LG4pe2lmKGU9PW51bGwpcmV0dXJuIGU7dmFyIHI9W10sbz0wO3JldHVybiBTdShlLHIsIiIsIiIsZnVuY3Rpb24oaSl7cmV0dXJuIHQuY2FsbChuLGksbysrKX0pLHJ9ZnVuY3Rpb24gQkMoZSl7aWYoZS5fc3RhdHVzPT09LTEpe3ZhciB0PWUuX3Jlc3VsdDt0PXQoKSx0LnRoZW4oZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0xLGUuX3Jlc3VsdD1uKX0sZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0yLGUuX3Jlc3VsdD1uKX0pLGUuX3N0YXR1cz09PS0xJiYoZS5fc3RhdHVzPTAsZS5fcmVzdWx0PXQpfWlmKGUuX3N0YXR1cz09PTEpcmV0dXJuIGUuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IGUuX3Jlc3VsdH12YXIgcm49e2N1cnJlbnQ6bnVsbH0sRXU9e3RyYW5zaXRpb246bnVsbH0sV0M9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6cm4sUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6RXUsUmVhY3RDdXJyZW50T3duZXI6UHB9O1NlLkNoaWxkcmVuPXttYXA6S2EsZm9yRWFjaDpmdW5jdGlvbihlLHQsbil7S2EoZSxmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuKX0sY291bnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9MDtyZXR1cm4gS2EoZSxmdW5jdGlvbigpe3QrK30pLHR9LHRvQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIEthKGUsZnVuY3Rpb24odCl7cmV0dXJuIHR9KXx8W119LG9ubHk6ZnVuY3Rpb24oZSl7aWYoIU9wKGUpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gZX19O1NlLkNvbXBvbmVudD1QbDtTZS5GcmFnbWVudD1iQztTZS5Qcm9maWxlcj1QQztTZS5QdXJlQ29tcG9uZW50PWJwO1NlLlN0cmljdE1vZGU9UkM7U2UuU3VzcGVuc2U9REM7U2UuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9V0M7U2UuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXtpZihlPT1udWxsKXRocm93IEVycm9yKCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCAiK2UrIi4iKTt2YXIgcj1IMCh7fSxlLnByb3BzKSxvPWUua2V5LGk9ZS5yZWYsbD1lLl9vd25lcjtpZih0IT1udWxsKXtpZih0LnJlZiE9PXZvaWQgMCYmKGk9dC5yZWYsbD1QcC5jdXJyZW50KSx0LmtleSE9PXZvaWQgMCYmKG89IiIrdC5rZXkpLGUudHlwZSYmZS50eXBlLmRlZmF1bHRQcm9wcyl2YXIgcz1lLnR5cGUuZGVmYXVsdFByb3BzO2ZvcihhIGluIHQpWTAuY2FsbCh0LGEpJiYhWDAuaGFzT3duUHJvcGVydHkoYSkmJihyW2FdPXRbYV09PT12b2lkIDAmJnMhPT12b2lkIDA/c1thXTp0W2FdKX12YXIgYT1hcmd1bWVudHMubGVuZ3RoLTI7aWYoYT09PTEpci5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxhKXtzPUFycmF5KGEpO2Zvcih2YXIgdT0wO3U8YTt1Kyspc1t1XT1hcmd1bWVudHNbdSsyXTtyLmNoaWxkcmVuPXN9cmV0dXJueyQkdHlwZW9mOmthLHR5cGU6ZS50eXBlLGtleTpvLHJlZjppLHByb3BzOnIsX293bmVyOmx9fTtTZS5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBlPXskJHR5cGVvZjpBQyxfY3VycmVudFZhbHVlOmUsX2N1cnJlbnRWYWx1ZTI6ZSxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGwsX2RlZmF1bHRWYWx1ZTpudWxsLF9nbG9iYWxOYW1lOm51bGx9LGUuUHJvdmlkZXI9eyQkdHlwZW9mOk9DLF9jb250ZXh0OmV9LGUuQ29uc3VtZXI9ZX07U2UuY3JlYXRlRWxlbWVudD1RMDtTZS5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciB0PVEwLmJpbmQobnVsbCxlKTtyZXR1cm4gdC50eXBlPWUsdH07U2UuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O1NlLmZvcndhcmRSZWY9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOk1DLHJlbmRlcjplfX07U2UuaXNWYWxpZEVsZW1lbnQ9T3A7U2UubGF6eT1mdW5jdGlvbihlKXtyZXR1cm57JCR0eXBlb2Y6SUMsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDplfSxfaW5pdDpCQ319O1NlLm1lbW89ZnVuY3Rpb24oZSx0KXtyZXR1cm57JCR0eXBlb2Y6TEMsdHlwZTplLGNvbXBhcmU6dD09PXZvaWQgMD9udWxsOnR9fTtTZS5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9RXUudHJhbnNpdGlvbjtFdS50cmFuc2l0aW9uPXt9O3RyeXtlKCl9ZmluYWxseXtFdS50cmFuc2l0aW9uPXR9fTtTZS51bnN0YWJsZV9hY3Q9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiYWN0KC4uLikgaXMgbm90IHN1cHBvcnRlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBSZWFjdC4iKX07U2UudXNlQ2FsbGJhY2s9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcm4uY3VycmVudC51c2VDYWxsYmFjayhlLHQpfTtTZS51c2VDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBybi5jdXJyZW50LnVzZUNvbnRleHQoZSl9O1NlLnVzZURlYnVnVmFsdWU9ZnVuY3Rpb24oKXt9O1NlLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHJuLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZShlKX07U2UudXNlRWZmZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHJuLmN1cnJlbnQudXNlRWZmZWN0KGUsdCl9O1NlLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHJuLmN1cnJlbnQudXNlSWQoKX07U2UudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHJuLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZShlLHQsbil9O1NlLnVzZUluc2VydGlvbkVmZmVjdD1mdW5jdGlvbihlLHQpe3JldHVybiBybi5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChlLHQpfTtTZS51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcm4uY3VycmVudC51c2VMYXlvdXRFZmZlY3QoZSx0KX07U2UudXNlTWVtbz1mdW5jdGlvbihlLHQpe3JldHVybiBybi5jdXJyZW50LnVzZU1lbW8oZSx0KX07U2UudXNlUmVkdWNlcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHJuLmN1cnJlbnQudXNlUmVkdWNlcihlLHQsbil9O1NlLnVzZVJlZj1mdW5jdGlvbihlKXtyZXR1cm4gcm4uY3VycmVudC51c2VSZWYoZSl9O1NlLnVzZVN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBybi5jdXJyZW50LnVzZVN0YXRlKGUpfTtTZS51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHJuLmN1cnJlbnQudXNlU3luY0V4dGVybmFsU3RvcmUoZSx0LG4pfTtTZS51c2VUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHJuLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTtTZS52ZXJzaW9uPSIxOC4yLjAiO1UwLmV4cG9ydHM9U2U7dmFyIHA9VTAuZXhwb3J0cztjb25zdCBxPSRhKHApLEowPVRDKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0OnF9LFtwXSk7dmFyIERmPXt9LFowPXtleHBvcnRzOnt9fSxUbj17fSxxMD17ZXhwb3J0czp7fX0sZTE9e307LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcwogKgogKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoayxJKXt2YXIgTD1rLmxlbmd0aDtrLnB1c2goSSk7ZTpmb3IoOzA8TDspe3ZhciBWPUwtMT4+PjEsdGU9a1tWXTtpZigwPG8odGUsSSkpa1tWXT1JLGtbTF09dGUsTD1WO2Vsc2UgYnJlYWsgZX19ZnVuY3Rpb24gbihrKXtyZXR1cm4gay5sZW5ndGg9PT0wP251bGw6a1swXX1mdW5jdGlvbiByKGspe2lmKGsubGVuZ3RoPT09MClyZXR1cm4gbnVsbDt2YXIgST1rWzBdLEw9ay5wb3AoKTtpZihMIT09SSl7a1swXT1MO2U6Zm9yKHZhciBWPTAsdGU9ay5sZW5ndGgseWU9dGU+Pj4xO1Y8eWU7KXt2YXIgZmU9MiooVisxKS0xLE9lPWtbZmVdLGJlPWZlKzEsWj1rW2JlXTtpZigwPm8oT2UsTCkpYmU8dGUmJjA+byhaLE9lKT8oa1tWXT1aLGtbYmVdPUwsVj1iZSk6KGtbVl09T2Usa1tmZV09TCxWPWZlKTtlbHNlIGlmKGJlPHRlJiYwPm8oWixMKSlrW1ZdPVosa1tiZV09TCxWPWJlO2Vsc2UgYnJlYWsgZX19cmV0dXJuIEl9ZnVuY3Rpb24gbyhrLEkpe3ZhciBMPWsuc29ydEluZGV4LUkuc29ydEluZGV4O3JldHVybiBMIT09MD9MOmsuaWQtSS5pZH1pZih0eXBlb2YgcGVyZm9ybWFuY2U9PSJvYmplY3QiJiZ0eXBlb2YgcGVyZm9ybWFuY2Uubm93PT0iZnVuY3Rpb24iKXt2YXIgaT1wZXJmb3JtYW5jZTtlLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBpLm5vdygpfX1lbHNle3ZhciBsPURhdGUscz1sLm5vdygpO2UudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIGwubm93KCktc319dmFyIGE9W10sdT1bXSxjPTEsZD1udWxsLGY9MyxoPSExLGc9ITEsbT0hMSxTPXR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP3NldFRpbWVvdXQ6bnVsbCx2PXR5cGVvZiBjbGVhclRpbWVvdXQ9PSJmdW5jdGlvbiI/Y2xlYXJUaW1lb3V0Om51bGwseT10eXBlb2Ygc2V0SW1tZWRpYXRlPCJ1Ij9zZXRJbW1lZGlhdGU6bnVsbDt0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yLnNjaGVkdWxpbmchPT12b2lkIDAmJm5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nIT09dm9pZCAwJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKTtmdW5jdGlvbiB4KGspe2Zvcih2YXIgST1uKHUpO0khPT1udWxsOyl7aWYoSS5jYWxsYmFjaz09PW51bGwpcih1KTtlbHNlIGlmKEkuc3RhcnRUaW1lPD1rKXIodSksSS5zb3J0SW5kZXg9SS5leHBpcmF0aW9uVGltZSx0KGEsSSk7ZWxzZSBicmVhaztJPW4odSl9fWZ1bmN0aW9uIF8oayl7aWYobT0hMSx4KGspLCFnKWlmKG4oYSkhPT1udWxsKWc9ITAsUChFKTtlbHNle3ZhciBJPW4odSk7SSE9PW51bGwmJk8oXyxJLnN0YXJ0VGltZS1rKX19ZnVuY3Rpb24gRShrLEkpe2c9ITEsbSYmKG09ITEsdihUKSxUPS0xKSxoPSEwO3ZhciBMPWY7dHJ5e2Zvcih4KEkpLGQ9bihhKTtkIT09bnVsbCYmKCEoZC5leHBpcmF0aW9uVGltZT5JKXx8ayYmIWooKSk7KXt2YXIgVj1kLmNhbGxiYWNrO2lmKHR5cGVvZiBWPT0iZnVuY3Rpb24iKXtkLmNhbGxiYWNrPW51bGwsZj1kLnByaW9yaXR5TGV2ZWw7dmFyIHRlPVYoZC5leHBpcmF0aW9uVGltZTw9SSk7ST1lLnVuc3RhYmxlX25vdygpLHR5cGVvZiB0ZT09ImZ1bmN0aW9uIj9kLmNhbGxiYWNrPXRlOmQ9PT1uKGEpJiZyKGEpLHgoSSl9ZWxzZSByKGEpO2Q9bihhKX1pZihkIT09bnVsbCl2YXIgeWU9ITA7ZWxzZXt2YXIgZmU9bih1KTtmZSE9PW51bGwmJk8oXyxmZS5zdGFydFRpbWUtSSkseWU9ITF9cmV0dXJuIHllfWZpbmFsbHl7ZD1udWxsLGY9TCxoPSExfX12YXIgJD0hMSxDPW51bGwsVD0tMSxNPTUsUj0tMTtmdW5jdGlvbiBqKCl7cmV0dXJuIShlLnVuc3RhYmxlX25vdygpLVI8TSl9ZnVuY3Rpb24gRigpe2lmKEMhPT1udWxsKXt2YXIgaz1lLnVuc3RhYmxlX25vdygpO1I9azt2YXIgST0hMDt0cnl7ST1DKCEwLGspfWZpbmFsbHl7ST9hZSgpOigkPSExLEM9bnVsbCl9fWVsc2UgJD0hMX12YXIgYWU7aWYodHlwZW9mIHk9PSJmdW5jdGlvbiIpYWU9ZnVuY3Rpb24oKXt5KEYpfTtlbHNlIGlmKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbDwidSIpe3ZhciBIPW5ldyBNZXNzYWdlQ2hhbm5lbCxYPUgucG9ydDI7SC5wb3J0MS5vbm1lc3NhZ2U9RixhZT1mdW5jdGlvbigpe1gucG9zdE1lc3NhZ2UobnVsbCl9fWVsc2UgYWU9ZnVuY3Rpb24oKXtTKEYsMCl9O2Z1bmN0aW9uIFAoayl7Qz1rLCR8fCgkPSEwLGFlKCkpfWZ1bmN0aW9uIE8oayxJKXtUPVMoZnVuY3Rpb24oKXtrKGUudW5zdGFibGVfbm93KCkpfSxJKX1lLnVuc3RhYmxlX0lkbGVQcmlvcml0eT01LGUudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk9MSxlLnVuc3RhYmxlX0xvd1ByaW9yaXR5PTQsZS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eT0zLGUudW5zdGFibGVfUHJvZmlsaW5nPW51bGwsZS51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eT0yLGUudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oayl7ay5jYWxsYmFjaz1udWxsfSxlLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7Z3x8aHx8KGc9ITAsUChFKSl9LGUudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oayl7MD5rfHwxMjU8az9jb25zb2xlLmVycm9yKCJmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWQiKTpNPTA8az9NYXRoLmZsb29yKDFlMy9rKTo1fSxlLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIGZ9LGUudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gbihhKX0sZS51bnN0YWJsZV9uZXh0PWZ1bmN0aW9uKGspe3N3aXRjaChmKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgST0zO2JyZWFrO2RlZmF1bHQ6ST1mfXZhciBMPWY7Zj1JO3RyeXtyZXR1cm4gaygpfWZpbmFsbHl7Zj1MfX0sZS51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbj1mdW5jdGlvbigpe30sZS51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9ZnVuY3Rpb24oKXt9LGUudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5PWZ1bmN0aW9uKGssSSl7c3dpdGNoKGspe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpjYXNlIDU6YnJlYWs7ZGVmYXVsdDprPTN9dmFyIEw9ZjtmPWs7dHJ5e3JldHVybiBJKCl9ZmluYWxseXtmPUx9fSxlLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s9ZnVuY3Rpb24oayxJLEwpe3ZhciBWPWUudW5zdGFibGVfbm93KCk7c3dpdGNoKHR5cGVvZiBMPT0ib2JqZWN0IiYmTCE9PW51bGw/KEw9TC5kZWxheSxMPXR5cGVvZiBMPT0ibnVtYmVyIiYmMDxMP1YrTDpWKTpMPVYsayl7Y2FzZSAxOnZhciB0ZT0tMTticmVhaztjYXNlIDI6dGU9MjUwO2JyZWFrO2Nhc2UgNTp0ZT0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDp0ZT0xZTQ7YnJlYWs7ZGVmYXVsdDp0ZT01ZTN9cmV0dXJuIHRlPUwrdGUsaz17aWQ6YysrLGNhbGxiYWNrOkkscHJpb3JpdHlMZXZlbDprLHN0YXJ0VGltZTpMLGV4cGlyYXRpb25UaW1lOnRlLHNvcnRJbmRleDotMX0sTD5WPyhrLnNvcnRJbmRleD1MLHQodSxrKSxuKGEpPT09bnVsbCYmaz09PW4odSkmJihtPyh2KFQpLFQ9LTEpOm09ITAsTyhfLEwtVikpKTooay5zb3J0SW5kZXg9dGUsdChhLGspLGd8fGh8fChnPSEwLFAoRSkpKSxrfSxlLnVuc3RhYmxlX3Nob3VsZFlpZWxkPWosZS51bnN0YWJsZV93cmFwQ2FsbGJhY2s9ZnVuY3Rpb24oayl7dmFyIEk9ZjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgTD1mO2Y9STt0cnl7cmV0dXJuIGsuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7Zj1MfX19fSkoZTEpO3EwLmV4cG9ydHM9ZTE7dmFyIFVDPXEwLmV4cG9ydHM7LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHJlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcwogKgogKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovdmFyIHQxPXAsQ249VUM7ZnVuY3Rpb24gVyhlKXtmb3IodmFyIHQ9Imh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PSIrZSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0Kz0iJmFyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbbl0pO3JldHVybiJNaW5pZmllZCBSZWFjdCBlcnJvciAjIitlKyI7IHZpc2l0ICIrdCsiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4ifXZhciBuMT1uZXcgU2V0LEtzPXt9O2Z1bmN0aW9uIHlpKGUsdCl7Z2woZSx0KSxnbChlKyJDYXB0dXJlIix0KX1mdW5jdGlvbiBnbChlLHQpe2ZvcihLc1tlXT10LGU9MDtlPHQubGVuZ3RoO2UrKyluMS5hZGQodFtlXSl9dmFyIElyPSEodHlwZW9mIHdpbmRvdz4idSJ8fHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ+InUiKSxMZj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFZDPS9eWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRdWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRcLS4wLTlcdTAwQjdcdTAzMDAtXHUwMzZGXHUyMDNGLVx1MjA0MF0qJC8sQm09e30sV209e307ZnVuY3Rpb24gSEMoZSl7cmV0dXJuIExmLmNhbGwoV20sZSk/ITA6TGYuY2FsbChCbSxlKT8hMTpWQy50ZXN0KGUpP1dtW2VdPSEwOihCbVtlXT0hMCwhMSl9ZnVuY3Rpb24gS0MoZSx0LG4scil7aWYobiE9PW51bGwmJm4udHlwZT09PTApcmV0dXJuITE7c3dpdGNoKHR5cGVvZiB0KXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6cmV0dXJuITA7Y2FzZSJib29sZWFuIjpyZXR1cm4gcj8hMTpuIT09bnVsbD8hbi5hY2NlcHRzQm9vbGVhbnM6KGU9ZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSksZSE9PSJkYXRhLSImJmUhPT0iYXJpYS0iKTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBHQyhlLHQsbixyKXtpZih0PT09bnVsbHx8dHlwZW9mIHQ+InUifHxLQyhlLHQsbixyKSlyZXR1cm4hMDtpZihyKXJldHVybiExO2lmKG4hPT1udWxsKXN3aXRjaChuLnR5cGUpe2Nhc2UgMzpyZXR1cm4hdDtjYXNlIDQ6cmV0dXJuIHQ9PT0hMTtjYXNlIDU6cmV0dXJuIGlzTmFOKHQpO2Nhc2UgNjpyZXR1cm4gaXNOYU4odCl8fDE+dH1yZXR1cm4hMX1mdW5jdGlvbiBvbihlLHQsbixyLG8saSxsKXt0aGlzLmFjY2VwdHNCb29sZWFucz10PT09Mnx8dD09PTN8fHQ9PT00LHRoaXMuYXR0cmlidXRlTmFtZT1yLHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlPW8sdGhpcy5tdXN0VXNlUHJvcGVydHk9bix0aGlzLnByb3BlcnR5TmFtZT1lLHRoaXMudHlwZT10LHRoaXMuc2FuaXRpemVVUkw9aSx0aGlzLnJlbW92ZUVtcHR5U3RyaW5nPWx9dmFyIEx0PXt9OyJjaGlsZHJlbiBkYW5nZXJvdXNseVNldElubmVySFRNTCBkZWZhdWx0VmFsdWUgZGVmYXVsdENoZWNrZWQgaW5uZXJIVE1MIHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcgc3R5bGUiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXtMdFtlXT1uZXcgb24oZSwwLCExLGUsbnVsbCwhMSwhMSl9KTtbWyJhY2NlcHRDaGFyc2V0IiwiYWNjZXB0LWNoYXJzZXQiXSxbImNsYXNzTmFtZSIsImNsYXNzIl0sWyJodG1sRm9yIiwiZm9yIl0sWyJodHRwRXF1aXYiLCJodHRwLWVxdWl2Il1dLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtMdFt0XT1uZXcgb24odCwxLCExLGVbMV0sbnVsbCwhMSwhMSl9KTtbImNvbnRlbnRFZGl0YWJsZSIsImRyYWdnYWJsZSIsInNwZWxsQ2hlY2siLCJ2YWx1ZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7THRbZV09bmV3IG9uKGUsMiwhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtbImF1dG9SZXZlcnNlIiwiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCIsImZvY3VzYWJsZSIsInByZXNlcnZlQWxwaGEiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDIsITEsZSxudWxsLCExLCExKX0pOyJhbGxvd0Z1bGxTY3JlZW4gYXN5bmMgYXV0b0ZvY3VzIGF1dG9QbGF5IGNvbnRyb2xzIGRlZmF1bHQgZGVmZXIgZGlzYWJsZWQgZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgZGlzYWJsZVJlbW90ZVBsYXliYWNrIGZvcm1Ob1ZhbGlkYXRlIGhpZGRlbiBsb29wIG5vTW9kdWxlIG5vVmFsaWRhdGUgb3BlbiBwbGF5c0lubGluZSByZWFkT25seSByZXF1aXJlZCByZXZlcnNlZCBzY29wZWQgc2VhbWxlc3MgaXRlbVNjb3BlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7THRbZV09bmV3IG9uKGUsMywhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtbImNoZWNrZWQiLCJtdWx0aXBsZSIsIm11dGVkIiwic2VsZWN0ZWQiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDMsITAsZSxudWxsLCExLCExKX0pO1siY2FwdHVyZSIsImRvd25sb2FkIl0uZm9yRWFjaChmdW5jdGlvbihlKXtMdFtlXT1uZXcgb24oZSw0LCExLGUsbnVsbCwhMSwhMSl9KTtbImNvbHMiLCJyb3dzIiwic2l6ZSIsInNwYW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDYsITEsZSxudWxsLCExLCExKX0pO1sicm93U3BhbiIsInN0YXJ0Il0uZm9yRWFjaChmdW5jdGlvbihlKXtMdFtlXT1uZXcgb24oZSw1LCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO3ZhciBBcD0vW1wtOl0oW2Etel0pL2c7ZnVuY3Rpb24gTXAoZSl7cmV0dXJuIGVbMV0udG9VcHBlckNhc2UoKX0iYWNjZW50LWhlaWdodCBhbGlnbm1lbnQtYmFzZWxpbmUgYXJhYmljLWZvcm0gYmFzZWxpbmUtc2hpZnQgY2FwLWhlaWdodCBjbGlwLXBhdGggY2xpcC1ydWxlIGNvbG9yLWludGVycG9sYXRpb24gY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIGNvbG9yLXByb2ZpbGUgY29sb3ItcmVuZGVyaW5nIGRvbWluYW50LWJhc2VsaW5lIGVuYWJsZS1iYWNrZ3JvdW5kIGZpbGwtb3BhY2l0eSBmaWxsLXJ1bGUgZmxvb2QtY29sb3IgZmxvb2Qtb3BhY2l0eSBmb250LWZhbWlseSBmb250LXNpemUgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXZhcmlhbnQgZm9udC13ZWlnaHQgZ2x5cGgtbmFtZSBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIGhvcml6LWFkdi14IGhvcml6LW9yaWdpbi14IGltYWdlLXJlbmRlcmluZyBsZXR0ZXItc3BhY2luZyBsaWdodGluZy1jb2xvciBtYXJrZXItZW5kIG1hcmtlci1taWQgbWFya2VyLXN0YXJ0IG92ZXJsaW5lLXBvc2l0aW9uIG92ZXJsaW5lLXRoaWNrbmVzcyBwYWludC1vcmRlciBwYW5vc2UtMSBwb2ludGVyLWV2ZW50cyByZW5kZXJpbmctaW50ZW50IHNoYXBlLXJlbmRlcmluZyBzdG9wLWNvbG9yIHN0b3Atb3BhY2l0eSBzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIHN0cm9rZS1kYXNoYXJyYXkgc3Ryb2tlLWRhc2hvZmZzZXQgc3Ryb2tlLWxpbmVjYXAgc3Ryb2tlLWxpbmVqb2luIHN0cm9rZS1taXRlcmxpbWl0IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCB0ZXh0LWFuY2hvciB0ZXh0LWRlY29yYXRpb24gdGV4dC1yZW5kZXJpbmcgdW5kZXJsaW5lLXBvc2l0aW9uIHVuZGVybGluZS10aGlja25lc3MgdW5pY29kZS1iaWRpIHVuaWNvZGUtcmFuZ2UgdW5pdHMtcGVyLWVtIHYtYWxwaGFiZXRpYyB2LWhhbmdpbmcgdi1pZGVvZ3JhcGhpYyB2LW1hdGhlbWF0aWNhbCB2ZWN0b3ItZWZmZWN0IHZlcnQtYWR2LXkgdmVydC1vcmlnaW4teCB2ZXJ0LW9yaWdpbi15IHdvcmQtc3BhY2luZyB3cml0aW5nLW1vZGUgeG1sbnM6eGxpbmsgeC1oZWlnaHQiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoQXAsTXApO0x0W3RdPW5ldyBvbih0LDEsITEsZSxudWxsLCExLCExKX0pOyJ4bGluazphY3R1YXRlIHhsaW5rOmFyY3JvbGUgeGxpbms6cm9sZSB4bGluazpzaG93IHhsaW5rOnRpdGxlIHhsaW5rOnR5cGUiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoQXAsTXApO0x0W3RdPW5ldyBvbih0LDEsITEsZSwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsITEsITEpfSk7WyJ4bWw6YmFzZSIsInhtbDpsYW5nIiwieG1sOnNwYWNlIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoQXAsTXApO0x0W3RdPW5ldyBvbih0LDEsITEsZSwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwhMSwhMSl9KTtbInRhYkluZGV4IiwiY3Jvc3NPcmlnaW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDEsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7THQueGxpbmtIcmVmPW5ldyBvbigieGxpbmtIcmVmIiwxLCExLCJ4bGluazpocmVmIiwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsITAsITEpO1sic3JjIiwiaHJlZiIsImFjdGlvbiIsImZvcm1BY3Rpb24iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDEsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITAsITApfSk7ZnVuY3Rpb24gRHAoZSx0LG4scil7dmFyIG89THQuaGFzT3duUHJvcGVydHkodCk/THRbdF06bnVsbDsobyE9PW51bGw/by50eXBlIT09MDpyfHwhKDI8dC5sZW5ndGgpfHx0WzBdIT09Im8iJiZ0WzBdIT09Ik8ifHx0WzFdIT09Im4iJiZ0WzFdIT09Ik4iKSYmKEdDKHQsbixvLHIpJiYobj1udWxsKSxyfHxvPT09bnVsbD9IQyh0KSYmKG49PT1udWxsP2UucmVtb3ZlQXR0cmlidXRlKHQpOmUuc2V0QXR0cmlidXRlKHQsIiIrbikpOm8ubXVzdFVzZVByb3BlcnR5P2Vbby5wcm9wZXJ0eU5hbWVdPW49PT1udWxsP28udHlwZT09PTM/ITE6IiI6bjoodD1vLmF0dHJpYnV0ZU5hbWUscj1vLmF0dHJpYnV0ZU5hbWVzcGFjZSxuPT09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZSh0KToobz1vLnR5cGUsbj1vPT09M3x8bz09PTQmJm49PT0hMD8iIjoiIituLHI/ZS5zZXRBdHRyaWJ1dGVOUyhyLHQsbik6ZS5zZXRBdHRyaWJ1dGUodCxuKSkpKX12YXIgVnI9dDEuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQsR2E9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLFdpPVN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpLFVpPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksTHA9U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSxJZj1TeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLHIxPVN5bWJvbC5mb3IoInJlYWN0LnByb3ZpZGVyIiksbzE9U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLElwPVN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIiksamY9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSx6Zj1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZV9saXN0IiksanA9U3ltYm9sLmZvcigicmVhY3QubWVtbyIpLGxvPVN5bWJvbC5mb3IoInJlYWN0LmxhenkiKSxpMT1TeW1ib2wuZm9yKCJyZWFjdC5vZmZzY3JlZW4iKSxVbT1TeW1ib2wuaXRlcmF0b3I7ZnVuY3Rpb24gcWwoZSl7cmV0dXJuIGU9PT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCI/bnVsbDooZT1VbSYmZVtVbV18fGVbIkBAaXRlcmF0b3IiXSx0eXBlb2YgZT09ImZ1bmN0aW9uIj9lOm51bGwpfXZhciB0dD1PYmplY3QuYXNzaWduLHpkO2Z1bmN0aW9uIHBzKGUpe2lmKHpkPT09dm9pZCAwKXRyeXt0aHJvdyBFcnJvcigpfWNhdGNoKG4pe3ZhciB0PW4uc3RhY2sudHJpbSgpLm1hdGNoKC9cbiggKihhdCApPykvKTt6ZD10JiZ0WzFdfHwiIn1yZXR1cm5gCmAremQrZX12YXIgRmQ9ITE7ZnVuY3Rpb24gQmQoZSx0KXtpZighZXx8RmQpcmV0dXJuIiI7RmQ9ITA7dmFyIG49RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9dm9pZCAwO3RyeXtpZih0KWlmKHQ9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInByb3BzIix7c2V0OmZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX19KSx0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJlJlZmxlY3QuY29uc3RydWN0KXt0cnl7UmVmbGVjdC5jb25zdHJ1Y3QodCxbXSl9Y2F0Y2godSl7dmFyIHI9dX1SZWZsZWN0LmNvbnN0cnVjdChlLFtdLHQpfWVsc2V7dHJ5e3QuY2FsbCgpfWNhdGNoKHUpe3I9dX1lLmNhbGwodC5wcm90b3R5cGUpfWVsc2V7dHJ5e3Rocm93IEVycm9yKCl9Y2F0Y2godSl7cj11fWUoKX19Y2F0Y2godSl7aWYodSYmciYmdHlwZW9mIHUuc3RhY2s9PSJzdHJpbmciKXtmb3IodmFyIG89dS5zdGFjay5zcGxpdChgCmApLGk9ci5zdGFjay5zcGxpdChgCmApLGw9by5sZW5ndGgtMSxzPWkubGVuZ3RoLTE7MTw9bCYmMDw9cyYmb1tsXSE9PWlbc107KXMtLTtmb3IoOzE8PWwmJjA8PXM7bC0tLHMtLSlpZihvW2xdIT09aVtzXSl7aWYobCE9PTF8fHMhPT0xKWRvIGlmKGwtLSxzLS0sMD5zfHxvW2xdIT09aVtzXSl7dmFyIGE9YApgK29bbF0ucmVwbGFjZSgiIGF0IG5ldyAiLCIgYXQgIik7cmV0dXJuIGUuZGlzcGxheU5hbWUmJmEuaW5jbHVkZXMoIjxhbm9ueW1vdXM+IikmJihhPWEucmVwbGFjZSgiPGFub255bW91cz4iLGUuZGlzcGxheU5hbWUpKSxhfXdoaWxlKDE8PWwmJjA8PXMpO2JyZWFrfX19ZmluYWxseXtGZD0hMSxFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT1ufXJldHVybihlPWU/ZS5kaXNwbGF5TmFtZXx8ZS5uYW1lOiIiKT9wcyhlKToiIn1mdW5jdGlvbiBZQyhlKXtzd2l0Y2goZS50YWcpe2Nhc2UgNTpyZXR1cm4gcHMoZS50eXBlKTtjYXNlIDE2OnJldHVybiBwcygiTGF6eSIpO2Nhc2UgMTM6cmV0dXJuIHBzKCJTdXNwZW5zZSIpO2Nhc2UgMTk6cmV0dXJuIHBzKCJTdXNwZW5zZUxpc3QiKTtjYXNlIDA6Y2FzZSAyOmNhc2UgMTU6cmV0dXJuIGU9QmQoZS50eXBlLCExKSxlO2Nhc2UgMTE6cmV0dXJuIGU9QmQoZS50eXBlLnJlbmRlciwhMSksZTtjYXNlIDE6cmV0dXJuIGU9QmQoZS50eXBlLCEwKSxlO2RlZmF1bHQ6cmV0dXJuIiJ9fWZ1bmN0aW9uIEZmKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIGUuZGlzcGxheU5hbWV8fGUubmFtZXx8bnVsbDtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIGU7c3dpdGNoKGUpe2Nhc2UgVWk6cmV0dXJuIkZyYWdtZW50IjtjYXNlIFdpOnJldHVybiJQb3J0YWwiO2Nhc2UgSWY6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIExwOnJldHVybiJTdHJpY3RNb2RlIjtjYXNlIGpmOnJldHVybiJTdXNwZW5zZSI7Y2FzZSB6ZjpyZXR1cm4iU3VzcGVuc2VMaXN0In1pZih0eXBlb2YgZT09Im9iamVjdCIpc3dpdGNoKGUuJCR0eXBlb2Ype2Nhc2UgbzE6cmV0dXJuKGUuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Db25zdW1lciI7Y2FzZSByMTpyZXR1cm4oZS5fY29udGV4dC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLlByb3ZpZGVyIjtjYXNlIElwOnZhciB0PWUucmVuZGVyO3JldHVybiBlPWUuZGlzcGxheU5hbWUsZXx8KGU9dC5kaXNwbGF5TmFtZXx8dC5uYW1lfHwiIixlPWUhPT0iIj8iRm9yd2FyZFJlZigiK2UrIikiOiJGb3J3YXJkUmVmIiksZTtjYXNlIGpwOnJldHVybiB0PWUuZGlzcGxheU5hbWV8fG51bGwsdCE9PW51bGw/dDpGZihlLnR5cGUpfHwiTWVtbyI7Y2FzZSBsbzp0PWUuX3BheWxvYWQsZT1lLl9pbml0O3RyeXtyZXR1cm4gRmYoZSh0KSl9Y2F0Y2h7fX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBYQyhlKXt2YXIgdD1lLnR5cGU7c3dpdGNoKGUudGFnKXtjYXNlIDI0OnJldHVybiJDYWNoZSI7Y2FzZSA5OnJldHVybih0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuQ29uc3VtZXIiO2Nhc2UgMTA6cmV0dXJuKHQuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSAxODpyZXR1cm4iRGVoeWRyYXRlZEZyYWdtZW50IjtjYXNlIDExOnJldHVybiBlPXQucmVuZGVyLGU9ZS5kaXNwbGF5TmFtZXx8ZS5uYW1lfHwiIix0LmRpc3BsYXlOYW1lfHwoZSE9PSIiPyJGb3J3YXJkUmVmKCIrZSsiKSI6IkZvcndhcmRSZWYiKTtjYXNlIDc6cmV0dXJuIkZyYWdtZW50IjtjYXNlIDU6cmV0dXJuIHQ7Y2FzZSA0OnJldHVybiJQb3J0YWwiO2Nhc2UgMzpyZXR1cm4iUm9vdCI7Y2FzZSA2OnJldHVybiJUZXh0IjtjYXNlIDE2OnJldHVybiBGZih0KTtjYXNlIDg6cmV0dXJuIHQ9PT1McD8iU3RyaWN0TW9kZSI6Ik1vZGUiO2Nhc2UgMjI6cmV0dXJuIk9mZnNjcmVlbiI7Y2FzZSAxMjpyZXR1cm4iUHJvZmlsZXIiO2Nhc2UgMjE6cmV0dXJuIlNjb3BlIjtjYXNlIDEzOnJldHVybiJTdXNwZW5zZSI7Y2FzZSAxOTpyZXR1cm4iU3VzcGVuc2VMaXN0IjtjYXNlIDI1OnJldHVybiJUcmFjaW5nTWFya2VyIjtjYXNlIDE6Y2FzZSAwOmNhc2UgMTc6Y2FzZSAyOmNhc2UgMTQ6Y2FzZSAxNTppZih0eXBlb2YgdD09ImZ1bmN0aW9uIilyZXR1cm4gdC5kaXNwbGF5TmFtZXx8dC5uYW1lfHxudWxsO2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBUbyhlKXtzd2l0Y2godHlwZW9mIGUpe2Nhc2UiYm9vbGVhbiI6Y2FzZSJudW1iZXIiOmNhc2Uic3RyaW5nIjpjYXNlInVuZGVmaW5lZCI6cmV0dXJuIGU7Y2FzZSJvYmplY3QiOnJldHVybiBlO2RlZmF1bHQ6cmV0dXJuIiJ9fWZ1bmN0aW9uIGwxKGUpe3ZhciB0PWUudHlwZTtyZXR1cm4oZT1lLm5vZGVOYW1lKSYmZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmKHQ9PT0iY2hlY2tib3gifHx0PT09InJhZGlvIil9ZnVuY3Rpb24gUUMoZSl7dmFyIHQ9bDEoZSk/ImNoZWNrZWQiOiJ2YWx1ZSIsbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUuY29uc3RydWN0b3IucHJvdG90eXBlLHQpLHI9IiIrZVt0XTtpZighZS5oYXNPd25Qcm9wZXJ0eSh0KSYmdHlwZW9mIG48InUiJiZ0eXBlb2Ygbi5nZXQ9PSJmdW5jdGlvbiImJnR5cGVvZiBuLnNldD09ImZ1bmN0aW9uIil7dmFyIG89bi5nZXQsaT1uLnNldDtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvLmNhbGwodGhpcyl9LHNldDpmdW5jdGlvbihsKXtyPSIiK2wsaS5jYWxsKHRoaXMsbCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTpuLmVudW1lcmFibGV9KSx7Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sc2V0VmFsdWU6ZnVuY3Rpb24obCl7cj0iIitsfSxzdG9wVHJhY2tpbmc6ZnVuY3Rpb24oKXtlLl92YWx1ZVRyYWNrZXI9bnVsbCxkZWxldGUgZVt0XX19fX1mdW5jdGlvbiBZYShlKXtlLl92YWx1ZVRyYWNrZXJ8fChlLl92YWx1ZVRyYWNrZXI9UUMoZSkpfWZ1bmN0aW9uIHMxKGUpe2lmKCFlKXJldHVybiExO3ZhciB0PWUuX3ZhbHVlVHJhY2tlcjtpZighdClyZXR1cm4hMDt2YXIgbj10LmdldFZhbHVlKCkscj0iIjtyZXR1cm4gZSYmKHI9bDEoZSk/ZS5jaGVja2VkPyJ0cnVlIjoiZmFsc2UiOmUudmFsdWUpLGU9cixlIT09bj8odC5zZXRWYWx1ZShlKSwhMCk6ITF9ZnVuY3Rpb24gV3UoZSl7aWYoZT1lfHwodHlwZW9mIGRvY3VtZW50PCJ1Ij9kb2N1bWVudDp2b2lkIDApLHR5cGVvZiBlPiJ1IilyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGUuYWN0aXZlRWxlbWVudHx8ZS5ib2R5fWNhdGNoe3JldHVybiBlLmJvZHl9fWZ1bmN0aW9uIEJmKGUsdCl7dmFyIG49dC5jaGVja2VkO3JldHVybiB0dCh7fSx0LHtkZWZhdWx0Q2hlY2tlZDp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCx2YWx1ZTp2b2lkIDAsY2hlY2tlZDpuPz9lLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWR9KX1mdW5jdGlvbiBWbShlLHQpe3ZhciBuPXQuZGVmYXVsdFZhbHVlPT1udWxsPyIiOnQuZGVmYXVsdFZhbHVlLHI9dC5jaGVja2VkIT1udWxsP3QuY2hlY2tlZDp0LmRlZmF1bHRDaGVja2VkO249VG8odC52YWx1ZSE9bnVsbD90LnZhbHVlOm4pLGUuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbENoZWNrZWQ6cixpbml0aWFsVmFsdWU6bixjb250cm9sbGVkOnQudHlwZT09PSJjaGVja2JveCJ8fHQudHlwZT09PSJyYWRpbyI/dC5jaGVja2VkIT1udWxsOnQudmFsdWUhPW51bGx9fWZ1bmN0aW9uIGExKGUsdCl7dD10LmNoZWNrZWQsdCE9bnVsbCYmRHAoZSwiY2hlY2tlZCIsdCwhMSl9ZnVuY3Rpb24gV2YoZSx0KXthMShlLHQpO3ZhciBuPVRvKHQudmFsdWUpLHI9dC50eXBlO2lmKG4hPW51bGwpcj09PSJudW1iZXIiPyhuPT09MCYmZS52YWx1ZT09PSIifHxlLnZhbHVlIT1uKSYmKGUudmFsdWU9IiIrbik6ZS52YWx1ZSE9PSIiK24mJihlLnZhbHVlPSIiK24pO2Vsc2UgaWYocj09PSJzdWJtaXQifHxyPT09InJlc2V0Iil7ZS5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik7cmV0dXJufXQuaGFzT3duUHJvcGVydHkoInZhbHVlIik/VWYoZSx0LnR5cGUsbik6dC5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikmJlVmKGUsdC50eXBlLFRvKHQuZGVmYXVsdFZhbHVlKSksdC5jaGVja2VkPT1udWxsJiZ0LmRlZmF1bHRDaGVja2VkIT1udWxsJiYoZS5kZWZhdWx0Q2hlY2tlZD0hIXQuZGVmYXVsdENoZWNrZWQpfWZ1bmN0aW9uIEhtKGUsdCxuKXtpZih0Lmhhc093blByb3BlcnR5KCJ2YWx1ZSIpfHx0Lmhhc093blByb3BlcnR5KCJkZWZhdWx0VmFsdWUiKSl7dmFyIHI9dC50eXBlO2lmKCEociE9PSJzdWJtaXQiJiZyIT09InJlc2V0Inx8dC52YWx1ZSE9PXZvaWQgMCYmdC52YWx1ZSE9PW51bGwpKXJldHVybjt0PSIiK2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsbnx8dD09PWUudmFsdWV8fChlLnZhbHVlPXQpLGUuZGVmYXVsdFZhbHVlPXR9bj1lLm5hbWUsbiE9PSIiJiYoZS5uYW1lPSIiKSxlLmRlZmF1bHRDaGVja2VkPSEhZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkLG4hPT0iIiYmKGUubmFtZT1uKX1mdW5jdGlvbiBVZihlLHQsbil7KHQhPT0ibnVtYmVyInx8V3UoZS5vd25lckRvY3VtZW50KSE9PWUpJiYobj09bnVsbD9lLmRlZmF1bHRWYWx1ZT0iIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlOmUuZGVmYXVsdFZhbHVlIT09IiIrbiYmKGUuZGVmYXVsdFZhbHVlPSIiK24pKX12YXIgZ3M9QXJyYXkuaXNBcnJheTtmdW5jdGlvbiBvbChlLHQsbixyKXtpZihlPWUub3B0aW9ucyx0KXt0PXt9O2Zvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKXRbIiQiK25bb11dPSEwO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspbz10Lmhhc093blByb3BlcnR5KCIkIitlW25dLnZhbHVlKSxlW25dLnNlbGVjdGVkIT09byYmKGVbbl0uc2VsZWN0ZWQ9byksbyYmciYmKGVbbl0uZGVmYXVsdFNlbGVjdGVkPSEwKX1lbHNle2ZvcihuPSIiK1RvKG4pLHQ9bnVsbCxvPTA7bzxlLmxlbmd0aDtvKyspe2lmKGVbb10udmFsdWU9PT1uKXtlW29dLnNlbGVjdGVkPSEwLHImJihlW29dLmRlZmF1bHRTZWxlY3RlZD0hMCk7cmV0dXJufXQhPT1udWxsfHxlW29dLmRpc2FibGVkfHwodD1lW29dKX10IT09bnVsbCYmKHQuc2VsZWN0ZWQ9ITApfX1mdW5jdGlvbiBWZihlLHQpe2lmKHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpdGhyb3cgRXJyb3IoVyg5MSkpO3JldHVybiB0dCh7fSx0LHt2YWx1ZTp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCxjaGlsZHJlbjoiIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlfSl9ZnVuY3Rpb24gS20oZSx0KXt2YXIgbj10LnZhbHVlO2lmKG49PW51bGwpe2lmKG49dC5jaGlsZHJlbix0PXQuZGVmYXVsdFZhbHVlLG4hPW51bGwpe2lmKHQhPW51bGwpdGhyb3cgRXJyb3IoVyg5MikpO2lmKGdzKG4pKXtpZigxPG4ubGVuZ3RoKXRocm93IEVycm9yKFcoOTMpKTtuPW5bMF19dD1ufXQ9PW51bGwmJih0PSIiKSxuPXR9ZS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6VG8obil9fWZ1bmN0aW9uIHUxKGUsdCl7dmFyIG49VG8odC52YWx1ZSkscj1Ubyh0LmRlZmF1bHRWYWx1ZSk7biE9bnVsbCYmKG49IiIrbixuIT09ZS52YWx1ZSYmKGUudmFsdWU9biksdC5kZWZhdWx0VmFsdWU9PW51bGwmJmUuZGVmYXVsdFZhbHVlIT09biYmKGUuZGVmYXVsdFZhbHVlPW4pKSxyIT1udWxsJiYoZS5kZWZhdWx0VmFsdWU9IiIrcil9ZnVuY3Rpb24gR20oZSl7dmFyIHQ9ZS50ZXh0Q29udGVudDt0PT09ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSYmdCE9PSIiJiZ0IT09bnVsbCYmKGUudmFsdWU9dCl9ZnVuY3Rpb24gYzEoZSl7c3dpdGNoKGUpe2Nhc2Uic3ZnIjpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2Nhc2UibWF0aCI6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiO2RlZmF1bHQ6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwifX1mdW5jdGlvbiBIZihlLHQpe3JldHVybiBlPT1udWxsfHxlPT09Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiP2MxKHQpOmU9PT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciJiZ0PT09ImZvcmVpZ25PYmplY3QiPyJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjplfXZhciBYYSxkMT1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIE1TQXBwPCJ1IiYmTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24/ZnVuY3Rpb24odCxuLHIsbyl7TVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24oKXtyZXR1cm4gZSh0LG4scixvKX0pfTplfShmdW5jdGlvbihlLHQpe2lmKGUubmFtZXNwYWNlVVJJIT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnInx8ImlubmVySFRNTCJpbiBlKWUuaW5uZXJIVE1MPXQ7ZWxzZXtmb3IoWGE9WGF8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFhhLmlubmVySFRNTD0iPHN2Zz4iK3QudmFsdWVPZigpLnRvU3RyaW5nKCkrIjwvc3ZnPiIsdD1YYS5maXJzdENoaWxkO2UuZmlyc3RDaGlsZDspZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO2Zvcig7dC5maXJzdENoaWxkOyllLmFwcGVuZENoaWxkKHQuZmlyc3RDaGlsZCl9fSk7ZnVuY3Rpb24gR3MoZSx0KXtpZih0KXt2YXIgbj1lLmZpcnN0Q2hpbGQ7aWYobiYmbj09PWUubGFzdENoaWxkJiZuLm5vZGVUeXBlPT09Myl7bi5ub2RlVmFsdWU9dDtyZXR1cm59fWUudGV4dENvbnRlbnQ9dH12YXIgU3M9e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGFzcGVjdFJhdGlvOiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRlckltYWdlU2xpY2U6ITAsYm9yZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91cDohMCxib3hPcmRpbmFsR3JvdXA6ITAsY29sdW1uQ291bnQ6ITAsY29sdW1uczohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZEFyZWE6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTcGFuOiEwLGdyaWRSb3dTdGFydDohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblNwYW46ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHRhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLGZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VEYXNoYXJyYXk6ITAsc3Ryb2tlRGFzaG9mZnNldDohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6ITAsc3Ryb2tlV2lkdGg6ITB9LEpDPVsiV2Via2l0IiwibXMiLCJNb3oiLCJPIl07T2JqZWN0LmtleXMoU3MpLmZvckVhY2goZnVuY3Rpb24oZSl7SkMuZm9yRWFjaChmdW5jdGlvbih0KXt0PXQrZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnN1YnN0cmluZygxKSxTc1t0XT1Tc1tlXX0pfSk7ZnVuY3Rpb24gZjEoZSx0LG4pe3JldHVybiB0PT1udWxsfHx0eXBlb2YgdD09ImJvb2xlYW4ifHx0PT09IiI/IiI6bnx8dHlwZW9mIHQhPSJudW1iZXIifHx0PT09MHx8U3MuaGFzT3duUHJvcGVydHkoZSkmJlNzW2VdPygiIit0KS50cmltKCk6dCsicHgifWZ1bmN0aW9uIGgxKGUsdCl7ZT1lLnN0eWxlO2Zvcih2YXIgbiBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkobikpe3ZhciByPW4uaW5kZXhPZigiLS0iKT09PTAsbz1mMShuLHRbbl0scik7bj09PSJmbG9hdCImJihuPSJjc3NGbG9hdCIpLHI/ZS5zZXRQcm9wZXJ0eShuLG8pOmVbbl09b319dmFyIFpDPXR0KHttZW51aXRlbTohMH0se2FyZWE6ITAsYmFzZTohMCxicjohMCxjb2w6ITAsZW1iZWQ6ITAsaHI6ITAsaW1nOiEwLGlucHV0OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH0pO2Z1bmN0aW9uIEtmKGUsdCl7aWYodCl7aWYoWkNbZV0mJih0LmNoaWxkcmVuIT1udWxsfHx0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKSl0aHJvdyBFcnJvcihXKDEzNyxlKSk7aWYodC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCl7aWYodC5jaGlsZHJlbiE9bnVsbCl0aHJvdyBFcnJvcihXKDYwKSk7aWYodHlwZW9mIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPSJvYmplY3QifHwhKCJfX2h0bWwiaW4gdC5kYW5nZXJvdXNseVNldElubmVySFRNTCkpdGhyb3cgRXJyb3IoVyg2MSkpfWlmKHQuc3R5bGUhPW51bGwmJnR5cGVvZiB0LnN0eWxlIT0ib2JqZWN0Iil0aHJvdyBFcnJvcihXKDYyKSl9fWZ1bmN0aW9uIEdmKGUsdCl7aWYoZS5pbmRleE9mKCItIik9PT0tMSlyZXR1cm4gdHlwZW9mIHQuaXM9PSJzdHJpbmciO3N3aXRjaChlKXtjYXNlImFubm90YXRpb24teG1sIjpjYXNlImNvbG9yLXByb2ZpbGUiOmNhc2UiZm9udC1mYWNlIjpjYXNlImZvbnQtZmFjZS1zcmMiOmNhc2UiZm9udC1mYWNlLXVyaSI6Y2FzZSJmb250LWZhY2UtZm9ybWF0IjpjYXNlImZvbnQtZmFjZS1uYW1lIjpjYXNlIm1pc3NpbmctZ2x5cGgiOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITB9fXZhciBZZj1udWxsO2Z1bmN0aW9uIHpwKGUpe3JldHVybiBlPWUudGFyZ2V0fHxlLnNyY0VsZW1lbnR8fHdpbmRvdyxlLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYoZT1lLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSxlLm5vZGVUeXBlPT09Mz9lLnBhcmVudE5vZGU6ZX12YXIgWGY9bnVsbCxpbD1udWxsLGxsPW51bGw7ZnVuY3Rpb24gWW0oZSl7aWYoZT1iYShlKSl7aWYodHlwZW9mIFhmIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMjgwKSk7dmFyIHQ9ZS5zdGF0ZU5vZGU7dCYmKHQ9SGModCksWGYoZS5zdGF0ZU5vZGUsZS50eXBlLHQpKX19ZnVuY3Rpb24gcDEoZSl7aWw/bGw/bGwucHVzaChlKTpsbD1bZV06aWw9ZX1mdW5jdGlvbiBnMSgpe2lmKGlsKXt2YXIgZT1pbCx0PWxsO2lmKGxsPWlsPW51bGwsWW0oZSksdClmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKVltKHRbZV0pfX1mdW5jdGlvbiBtMShlLHQpe3JldHVybiBlKHQpfWZ1bmN0aW9uIHYxKCl7fXZhciBXZD0hMTtmdW5jdGlvbiB5MShlLHQsbil7aWYoV2QpcmV0dXJuIGUodCxuKTtXZD0hMDt0cnl7cmV0dXJuIG0xKGUsdCxuKX1maW5hbGx5e1dkPSExLChpbCE9PW51bGx8fGxsIT09bnVsbCkmJih2MSgpLGcxKCkpfX1mdW5jdGlvbiBZcyhlLHQpe3ZhciBuPWUuc3RhdGVOb2RlO2lmKG49PT1udWxsKXJldHVybiBudWxsO3ZhciByPUhjKG4pO2lmKHI9PT1udWxsKXJldHVybiBudWxsO249clt0XTtlOnN3aXRjaCh0KXtjYXNlIm9uQ2xpY2siOmNhc2Uib25DbGlja0NhcHR1cmUiOmNhc2Uib25Eb3VibGVDbGljayI6Y2FzZSJvbkRvdWJsZUNsaWNrQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRG93biI6Y2FzZSJvbk1vdXNlRG93bkNhcHR1cmUiOmNhc2Uib25Nb3VzZU1vdmUiOmNhc2Uib25Nb3VzZU1vdmVDYXB0dXJlIjpjYXNlIm9uTW91c2VVcCI6Y2FzZSJvbk1vdXNlVXBDYXB0dXJlIjpjYXNlIm9uTW91c2VFbnRlciI6KHI9IXIuZGlzYWJsZWQpfHwoZT1lLnR5cGUscj0hKGU9PT0iYnV0dG9uInx8ZT09PSJpbnB1dCJ8fGU9PT0ic2VsZWN0Inx8ZT09PSJ0ZXh0YXJlYSIpKSxlPSFyO2JyZWFrIGU7ZGVmYXVsdDplPSExfWlmKGUpcmV0dXJuIG51bGw7aWYobiYmdHlwZW9mIG4hPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoVygyMzEsdCx0eXBlb2YgbikpO3JldHVybiBufXZhciBRZj0hMTtpZihJcil0cnl7dmFyIGVzPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlcywicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe1FmPSEwfX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0Iixlcyxlcyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLGVzLGVzKX1jYXRjaHtRZj0hMX1mdW5jdGlvbiBxQyhlLHQsbixyLG8saSxsLHMsYSl7dmFyIHU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpO3RyeXt0LmFwcGx5KG4sdSl9Y2F0Y2goYyl7dGhpcy5vbkVycm9yKGMpfX12YXIgRXM9ITEsVXU9bnVsbCxWdT0hMSxKZj1udWxsLGUkPXtvbkVycm9yOmZ1bmN0aW9uKGUpe0VzPSEwLFV1PWV9fTtmdW5jdGlvbiB0JChlLHQsbixyLG8saSxsLHMsYSl7RXM9ITEsVXU9bnVsbCxxQy5hcHBseShlJCxhcmd1bWVudHMpfWZ1bmN0aW9uIG4kKGUsdCxuLHIsbyxpLGwscyxhKXtpZih0JC5hcHBseSh0aGlzLGFyZ3VtZW50cyksRXMpe2lmKEVzKXt2YXIgdT1VdTtFcz0hMSxVdT1udWxsfWVsc2UgdGhyb3cgRXJyb3IoVygxOTgpKTtWdXx8KFZ1PSEwLEpmPXUpfX1mdW5jdGlvbiB4aShlKXt2YXIgdD1lLG49ZTtpZihlLmFsdGVybmF0ZSlmb3IoO3QucmV0dXJuOyl0PXQucmV0dXJuO2Vsc2V7ZT10O2RvIHQ9ZSx0LmZsYWdzJjQwOTgmJihuPXQucmV0dXJuKSxlPXQucmV0dXJuO3doaWxlKGUpfXJldHVybiB0LnRhZz09PTM/bjpudWxsfWZ1bmN0aW9uIHgxKGUpe2lmKGUudGFnPT09MTMpe3ZhciB0PWUubWVtb2l6ZWRTdGF0ZTtpZih0PT09bnVsbCYmKGU9ZS5hbHRlcm5hdGUsZSE9PW51bGwmJih0PWUubWVtb2l6ZWRTdGF0ZSkpLHQhPT1udWxsKXJldHVybiB0LmRlaHlkcmF0ZWR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gWG0oZSl7aWYoeGkoZSkhPT1lKXRocm93IEVycm9yKFcoMTg4KSl9ZnVuY3Rpb24gciQoZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7aWYoIXQpe2lmKHQ9eGkoZSksdD09PW51bGwpdGhyb3cgRXJyb3IoVygxODgpKTtyZXR1cm4gdCE9PWU/bnVsbDplfWZvcih2YXIgbj1lLHI9dDs7KXt2YXIgbz1uLnJldHVybjtpZihvPT09bnVsbClicmVhazt2YXIgaT1vLmFsdGVybmF0ZTtpZihpPT09bnVsbCl7aWYocj1vLnJldHVybixyIT09bnVsbCl7bj1yO2NvbnRpbnVlfWJyZWFrfWlmKG8uY2hpbGQ9PT1pLmNoaWxkKXtmb3IoaT1vLmNoaWxkO2k7KXtpZihpPT09bilyZXR1cm4gWG0obyksZTtpZihpPT09cilyZXR1cm4gWG0obyksdDtpPWkuc2libGluZ310aHJvdyBFcnJvcihXKDE4OCkpfWlmKG4ucmV0dXJuIT09ci5yZXR1cm4pbj1vLHI9aTtlbHNle2Zvcih2YXIgbD0hMSxzPW8uY2hpbGQ7czspe2lmKHM9PT1uKXtsPSEwLG49byxyPWk7YnJlYWt9aWYocz09PXIpe2w9ITAscj1vLG49aTticmVha31zPXMuc2libGluZ31pZighbCl7Zm9yKHM9aS5jaGlsZDtzOyl7aWYocz09PW4pe2w9ITAsbj1pLHI9bzticmVha31pZihzPT09cil7bD0hMCxyPWksbj1vO2JyZWFrfXM9cy5zaWJsaW5nfWlmKCFsKXRocm93IEVycm9yKFcoMTg5KSl9fWlmKG4uYWx0ZXJuYXRlIT09cil0aHJvdyBFcnJvcihXKDE5MCkpfWlmKG4udGFnIT09Myl0aHJvdyBFcnJvcihXKDE4OCkpO3JldHVybiBuLnN0YXRlTm9kZS5jdXJyZW50PT09bj9lOnR9ZnVuY3Rpb24gXzEoZSl7cmV0dXJuIGU9ciQoZSksZSE9PW51bGw/dzEoZSk6bnVsbH1mdW5jdGlvbiB3MShlKXtpZihlLnRhZz09PTV8fGUudGFnPT09NilyZXR1cm4gZTtmb3IoZT1lLmNoaWxkO2UhPT1udWxsOyl7dmFyIHQ9dzEoZSk7aWYodCE9PW51bGwpcmV0dXJuIHQ7ZT1lLnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIFMxPUNuLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2ssUW09Q24udW5zdGFibGVfY2FuY2VsQ2FsbGJhY2ssbyQ9Q24udW5zdGFibGVfc2hvdWxkWWllbGQsaSQ9Q24udW5zdGFibGVfcmVxdWVzdFBhaW50LHV0PUNuLnVuc3RhYmxlX25vdyxsJD1Dbi51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCxGcD1Dbi51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSxFMT1Dbi51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxIdT1Dbi51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSxzJD1Dbi51bnN0YWJsZV9Mb3dQcmlvcml0eSxDMT1Dbi51bnN0YWJsZV9JZGxlUHJpb3JpdHksQmM9bnVsbCxwcj1udWxsO2Z1bmN0aW9uIGEkKGUpe2lmKHByJiZ0eXBlb2YgcHIub25Db21taXRGaWJlclJvb3Q9PSJmdW5jdGlvbiIpdHJ5e3ByLm9uQ29tbWl0RmliZXJSb290KEJjLGUsdm9pZCAwLChlLmN1cnJlbnQuZmxhZ3MmMTI4KT09PTEyOCl9Y2F0Y2h7fX12YXIgWm49TWF0aC5jbHozMj9NYXRoLmNsejMyOmQkLHUkPU1hdGgubG9nLGMkPU1hdGguTE4yO2Z1bmN0aW9uIGQkKGUpe3JldHVybiBlPj4+PTAsZT09PTA/MzI6MzEtKHUkKGUpL2MkfDApfDB9dmFyIFFhPTY0LEphPTQxOTQzMDQ7ZnVuY3Rpb24gbXMoZSl7c3dpdGNoKGUmLWUpe2Nhc2UgMTpyZXR1cm4gMTtjYXNlIDI6cmV0dXJuIDI7Y2FzZSA0OnJldHVybiA0O2Nhc2UgODpyZXR1cm4gODtjYXNlIDE2OnJldHVybiAxNjtjYXNlIDMyOnJldHVybiAzMjtjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiBlJjQxOTQyNDA7Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpyZXR1cm4gZSYxMzAwMjM0MjQ7Y2FzZSAxMzQyMTc3Mjg6cmV0dXJuIDEzNDIxNzcyODtjYXNlIDI2ODQzNTQ1NjpyZXR1cm4gMjY4NDM1NDU2O2Nhc2UgNTM2ODcwOTEyOnJldHVybiA1MzY4NzA5MTI7Y2FzZSAxMDczNzQxODI0OnJldHVybiAxMDczNzQxODI0O2RlZmF1bHQ6cmV0dXJuIGV9fWZ1bmN0aW9uIEt1KGUsdCl7dmFyIG49ZS5wZW5kaW5nTGFuZXM7aWYobj09PTApcmV0dXJuIDA7dmFyIHI9MCxvPWUuc3VzcGVuZGVkTGFuZXMsaT1lLnBpbmdlZExhbmVzLGw9biYyNjg0MzU0NTU7aWYobCE9PTApe3ZhciBzPWwmfm87cyE9PTA/cj1tcyhzKTooaSY9bCxpIT09MCYmKHI9bXMoaSkpKX1lbHNlIGw9biZ+byxsIT09MD9yPW1zKGwpOmkhPT0wJiYocj1tcyhpKSk7aWYocj09PTApcmV0dXJuIDA7aWYodCE9PTAmJnQhPT1yJiYhKHQmbykmJihvPXImLXIsaT10Ji10LG8+PWl8fG89PT0xNiYmKGkmNDE5NDI0MCkhPT0wKSlyZXR1cm4gdDtpZihyJjQmJihyfD1uJjE2KSx0PWUuZW50YW5nbGVkTGFuZXMsdCE9PTApZm9yKGU9ZS5lbnRhbmdsZW1lbnRzLHQmPXI7MDx0OyluPTMxLVpuKHQpLG89MTw8bixyfD1lW25dLHQmPX5vO3JldHVybiByfWZ1bmN0aW9uIGYkKGUsdCl7c3dpdGNoKGUpe2Nhc2UgMTpjYXNlIDI6Y2FzZSA0OnJldHVybiB0KzI1MDtjYXNlIDg6Y2FzZSAxNjpjYXNlIDMyOmNhc2UgNjQ6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6cmV0dXJuIHQrNWUzO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuLTE7Y2FzZSAxMzQyMTc3Mjg6Y2FzZSAyNjg0MzU0NTY6Y2FzZSA1MzY4NzA5MTI6Y2FzZSAxMDczNzQxODI0OnJldHVybi0xO2RlZmF1bHQ6cmV0dXJuLTF9fWZ1bmN0aW9uIGgkKGUsdCl7Zm9yKHZhciBuPWUuc3VzcGVuZGVkTGFuZXMscj1lLnBpbmdlZExhbmVzLG89ZS5leHBpcmF0aW9uVGltZXMsaT1lLnBlbmRpbmdMYW5lczswPGk7KXt2YXIgbD0zMS1abihpKSxzPTE8PGwsYT1vW2xdO2E9PT0tMT8oIShzJm4pfHxzJnIpJiYob1tsXT1mJChzLHQpKTphPD10JiYoZS5leHBpcmVkTGFuZXN8PXMpLGkmPX5zfX1mdW5jdGlvbiBaZihlKXtyZXR1cm4gZT1lLnBlbmRpbmdMYW5lcyYtMTA3Mzc0MTgyNSxlIT09MD9lOmUmMTA3Mzc0MTgyND8xMDczNzQxODI0OjB9ZnVuY3Rpb24gJDEoKXt2YXIgZT1RYTtyZXR1cm4gUWE8PD0xLCEoUWEmNDE5NDI0MCkmJihRYT02NCksZX1mdW5jdGlvbiBVZChlKXtmb3IodmFyIHQ9W10sbj0wOzMxPm47bisrKXQucHVzaChlKTtyZXR1cm4gdH1mdW5jdGlvbiBUYShlLHQsbil7ZS5wZW5kaW5nTGFuZXN8PXQsdCE9PTUzNjg3MDkxMiYmKGUuc3VzcGVuZGVkTGFuZXM9MCxlLnBpbmdlZExhbmVzPTApLGU9ZS5ldmVudFRpbWVzLHQ9MzEtWm4odCksZVt0XT1ufWZ1bmN0aW9uIHAkKGUsdCl7dmFyIG49ZS5wZW5kaW5nTGFuZXMmfnQ7ZS5wZW5kaW5nTGFuZXM9dCxlLnN1c3BlbmRlZExhbmVzPTAsZS5waW5nZWRMYW5lcz0wLGUuZXhwaXJlZExhbmVzJj10LGUubXV0YWJsZVJlYWRMYW5lcyY9dCxlLmVudGFuZ2xlZExhbmVzJj10LHQ9ZS5lbnRhbmdsZW1lbnRzO3ZhciByPWUuZXZlbnRUaW1lcztmb3IoZT1lLmV4cGlyYXRpb25UaW1lczswPG47KXt2YXIgbz0zMS1abihuKSxpPTE8PG87dFtvXT0wLHJbb109LTEsZVtvXT0tMSxuJj1+aX19ZnVuY3Rpb24gQnAoZSx0KXt2YXIgbj1lLmVudGFuZ2xlZExhbmVzfD10O2ZvcihlPWUuZW50YW5nbGVtZW50cztuOyl7dmFyIHI9MzEtWm4obiksbz0xPDxyO28mdHxlW3JdJnQmJihlW3JdfD10KSxuJj1+b319dmFyIFBlPTA7ZnVuY3Rpb24gazEoZSl7cmV0dXJuIGUmPS1lLDE8ZT80PGU/ZSYyNjg0MzU0NTU/MTY6NTM2ODcwOTEyOjQ6MX12YXIgVDEsV3AsTjEsYjEsUjEscWY9ITEsWmE9W10sdm89bnVsbCx5bz1udWxsLHhvPW51bGwsWHM9bmV3IE1hcCxRcz1uZXcgTWFwLHVvPVtdLGckPSJtb3VzZWRvd24gbW91c2V1cCB0b3VjaGNhbmNlbCB0b3VjaGVuZCB0b3VjaHN0YXJ0IGF1eGNsaWNrIGRibGNsaWNrIHBvaW50ZXJjYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlcnVwIGRyYWdlbmQgZHJhZ3N0YXJ0IGRyb3AgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb25zdGFydCBrZXlkb3duIGtleXByZXNzIGtleXVwIGlucHV0IHRleHRJbnB1dCBjb3B5IGN1dCBwYXN0ZSBjbGljayBjaGFuZ2UgY29udGV4dG1lbnUgcmVzZXQgc3VibWl0Ii5zcGxpdCgiICIpO2Z1bmN0aW9uIEptKGUsdCl7c3dpdGNoKGUpe2Nhc2UiZm9jdXNpbiI6Y2FzZSJmb2N1c291dCI6dm89bnVsbDticmVhaztjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnbGVhdmUiOnlvPW51bGw7YnJlYWs7Y2FzZSJtb3VzZW92ZXIiOmNhc2UibW91c2VvdXQiOnhvPW51bGw7YnJlYWs7Y2FzZSJwb2ludGVyb3ZlciI6Y2FzZSJwb2ludGVyb3V0IjpYcy5kZWxldGUodC5wb2ludGVySWQpO2JyZWFrO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOmNhc2UibG9zdHBvaW50ZXJjYXB0dXJlIjpRcy5kZWxldGUodC5wb2ludGVySWQpfX1mdW5jdGlvbiB0cyhlLHQsbixyLG8saSl7cmV0dXJuIGU9PT1udWxsfHxlLm5hdGl2ZUV2ZW50IT09aT8oZT17YmxvY2tlZE9uOnQsZG9tRXZlbnROYW1lOm4sZXZlbnRTeXN0ZW1GbGFnczpyLG5hdGl2ZUV2ZW50OmksdGFyZ2V0Q29udGFpbmVyczpbb119LHQhPT1udWxsJiYodD1iYSh0KSx0IT09bnVsbCYmV3AodCkpLGUpOihlLmV2ZW50U3lzdGVtRmxhZ3N8PXIsdD1lLnRhcmdldENvbnRhaW5lcnMsbyE9PW51bGwmJnQuaW5kZXhPZihvKT09PS0xJiZ0LnB1c2gobyksZSl9ZnVuY3Rpb24gbSQoZSx0LG4scixvKXtzd2l0Y2godCl7Y2FzZSJmb2N1c2luIjpyZXR1cm4gdm89dHModm8sZSx0LG4scixvKSwhMDtjYXNlImRyYWdlbnRlciI6cmV0dXJuIHlvPXRzKHlvLGUsdCxuLHIsbyksITA7Y2FzZSJtb3VzZW92ZXIiOnJldHVybiB4bz10cyh4byxlLHQsbixyLG8pLCEwO2Nhc2UicG9pbnRlcm92ZXIiOnZhciBpPW8ucG9pbnRlcklkO3JldHVybiBYcy5zZXQoaSx0cyhYcy5nZXQoaSl8fG51bGwsZSx0LG4scixvKSksITA7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6cmV0dXJuIGk9by5wb2ludGVySWQsUXMuc2V0KGksdHMoUXMuZ2V0KGkpfHxudWxsLGUsdCxuLHIsbykpLCEwfXJldHVybiExfWZ1bmN0aW9uIFAxKGUpe3ZhciB0PVFvKGUudGFyZ2V0KTtpZih0IT09bnVsbCl7dmFyIG49eGkodCk7aWYobiE9PW51bGwpe2lmKHQ9bi50YWcsdD09PTEzKXtpZih0PXgxKG4pLHQhPT1udWxsKXtlLmJsb2NrZWRPbj10LFIxKGUucHJpb3JpdHksZnVuY3Rpb24oKXtOMShuKX0pO3JldHVybn19ZWxzZSBpZih0PT09MyYmbi5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7ZS5ibG9ja2VkT249bi50YWc9PT0zP24uc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtyZXR1cm59fX1lLmJsb2NrZWRPbj1udWxsfWZ1bmN0aW9uIEN1KGUpe2lmKGUuYmxvY2tlZE9uIT09bnVsbClyZXR1cm4hMTtmb3IodmFyIHQ9ZS50YXJnZXRDb250YWluZXJzOzA8dC5sZW5ndGg7KXt2YXIgbj1laChlLmRvbUV2ZW50TmFtZSxlLmV2ZW50U3lzdGVtRmxhZ3MsdFswXSxlLm5hdGl2ZUV2ZW50KTtpZihuPT09bnVsbCl7bj1lLm5hdGl2ZUV2ZW50O3ZhciByPW5ldyBuLmNvbnN0cnVjdG9yKG4udHlwZSxuKTtZZj1yLG4udGFyZ2V0LmRpc3BhdGNoRXZlbnQociksWWY9bnVsbH1lbHNlIHJldHVybiB0PWJhKG4pLHQhPT1udWxsJiZXcCh0KSxlLmJsb2NrZWRPbj1uLCExO3Quc2hpZnQoKX1yZXR1cm4hMH1mdW5jdGlvbiBabShlLHQsbil7Q3UoZSkmJm4uZGVsZXRlKHQpfWZ1bmN0aW9uIHYkKCl7cWY9ITEsdm8hPT1udWxsJiZDdSh2bykmJih2bz1udWxsKSx5byE9PW51bGwmJkN1KHlvKSYmKHlvPW51bGwpLHhvIT09bnVsbCYmQ3UoeG8pJiYoeG89bnVsbCksWHMuZm9yRWFjaChabSksUXMuZm9yRWFjaChabSl9ZnVuY3Rpb24gbnMoZSx0KXtlLmJsb2NrZWRPbj09PXQmJihlLmJsb2NrZWRPbj1udWxsLHFmfHwocWY9ITAsQ24udW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhDbi51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSx2JCkpKX1mdW5jdGlvbiBKcyhlKXtmdW5jdGlvbiB0KG8pe3JldHVybiBucyhvLGUpfWlmKDA8WmEubGVuZ3RoKXtucyhaYVswXSxlKTtmb3IodmFyIG49MTtuPFphLmxlbmd0aDtuKyspe3ZhciByPVphW25dO3IuYmxvY2tlZE9uPT09ZSYmKHIuYmxvY2tlZE9uPW51bGwpfX1mb3Iodm8hPT1udWxsJiZucyh2byxlKSx5byE9PW51bGwmJm5zKHlvLGUpLHhvIT09bnVsbCYmbnMoeG8sZSksWHMuZm9yRWFjaCh0KSxRcy5mb3JFYWNoKHQpLG49MDtuPHVvLmxlbmd0aDtuKyspcj11b1tuXSxyLmJsb2NrZWRPbj09PWUmJihyLmJsb2NrZWRPbj1udWxsKTtmb3IoOzA8dW8ubGVuZ3RoJiYobj11b1swXSxuLmJsb2NrZWRPbj09PW51bGwpOylQMShuKSxuLmJsb2NrZWRPbj09PW51bGwmJnVvLnNoaWZ0KCl9dmFyIHNsPVZyLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLEd1PSEwO2Z1bmN0aW9uIHkkKGUsdCxuLHIpe3ZhciBvPVBlLGk9c2wudHJhbnNpdGlvbjtzbC50cmFuc2l0aW9uPW51bGw7dHJ5e1BlPTEsVXAoZSx0LG4scil9ZmluYWxseXtQZT1vLHNsLnRyYW5zaXRpb249aX19ZnVuY3Rpb24geCQoZSx0LG4scil7dmFyIG89UGUsaT1zbC50cmFuc2l0aW9uO3NsLnRyYW5zaXRpb249bnVsbDt0cnl7UGU9NCxVcChlLHQsbixyKX1maW5hbGx5e1BlPW8sc2wudHJhbnNpdGlvbj1pfX1mdW5jdGlvbiBVcChlLHQsbixyKXtpZihHdSl7dmFyIG89ZWgoZSx0LG4scik7aWYobz09PW51bGwpcWQoZSx0LHIsWXUsbiksSm0oZSxyKTtlbHNlIGlmKG0kKG8sZSx0LG4scikpci5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKEptKGUsciksdCY0JiYtMTxnJC5pbmRleE9mKGUpKXtmb3IoO28hPT1udWxsOyl7dmFyIGk9YmEobyk7aWYoaSE9PW51bGwmJlQxKGkpLGk9ZWgoZSx0LG4sciksaT09PW51bGwmJnFkKGUsdCxyLFl1LG4pLGk9PT1vKWJyZWFrO289aX1vIT09bnVsbCYmci5zdG9wUHJvcGFnYXRpb24oKX1lbHNlIHFkKGUsdCxyLG51bGwsbil9fXZhciBZdT1udWxsO2Z1bmN0aW9uIGVoKGUsdCxuLHIpe2lmKFl1PW51bGwsZT16cChyKSxlPVFvKGUpLGUhPT1udWxsKWlmKHQ9eGkoZSksdD09PW51bGwpZT1udWxsO2Vsc2UgaWYobj10LnRhZyxuPT09MTMpe2lmKGU9eDEodCksZSE9PW51bGwpcmV0dXJuIGU7ZT1udWxsfWVsc2UgaWYobj09PTMpe2lmKHQuc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpcmV0dXJuIHQudGFnPT09Mz90LnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7ZT1udWxsfWVsc2UgdCE9PWUmJihlPW51bGwpO3JldHVybiBZdT1lLG51bGx9ZnVuY3Rpb24gTzEoZSl7c3dpdGNoKGUpe2Nhc2UiY2FuY2VsIjpjYXNlImNsaWNrIjpjYXNlImNsb3NlIjpjYXNlImNvbnRleHRtZW51IjpjYXNlImNvcHkiOmNhc2UiY3V0IjpjYXNlImF1eGNsaWNrIjpjYXNlImRibGNsaWNrIjpjYXNlImRyYWdlbmQiOmNhc2UiZHJhZ3N0YXJ0IjpjYXNlImRyb3AiOmNhc2UiZm9jdXNpbiI6Y2FzZSJmb2N1c291dCI6Y2FzZSJpbnB1dCI6Y2FzZSJpbnZhbGlkIjpjYXNlImtleWRvd24iOmNhc2Uia2V5cHJlc3MiOmNhc2Uia2V5dXAiOmNhc2UibW91c2Vkb3duIjpjYXNlIm1vdXNldXAiOmNhc2UicGFzdGUiOmNhc2UicGF1c2UiOmNhc2UicGxheSI6Y2FzZSJwb2ludGVyY2FuY2VsIjpjYXNlInBvaW50ZXJkb3duIjpjYXNlInBvaW50ZXJ1cCI6Y2FzZSJyYXRlY2hhbmdlIjpjYXNlInJlc2V0IjpjYXNlInJlc2l6ZSI6Y2FzZSJzZWVrZWQiOmNhc2Uic3VibWl0IjpjYXNlInRvdWNoY2FuY2VsIjpjYXNlInRvdWNoZW5kIjpjYXNlInRvdWNoc3RhcnQiOmNhc2Uidm9sdW1lY2hhbmdlIjpjYXNlImNoYW5nZSI6Y2FzZSJzZWxlY3Rpb25jaGFuZ2UiOmNhc2UidGV4dElucHV0IjpjYXNlImNvbXBvc2l0aW9uc3RhcnQiOmNhc2UiY29tcG9zaXRpb25lbmQiOmNhc2UiY29tcG9zaXRpb251cGRhdGUiOmNhc2UiYmVmb3JlYmx1ciI6Y2FzZSJhZnRlcmJsdXIiOmNhc2UiYmVmb3JlaW5wdXQiOmNhc2UiYmx1ciI6Y2FzZSJmdWxsc2NyZWVuY2hhbmdlIjpjYXNlImZvY3VzIjpjYXNlImhhc2hjaGFuZ2UiOmNhc2UicG9wc3RhdGUiOmNhc2Uic2VsZWN0IjpjYXNlInNlbGVjdHN0YXJ0IjpyZXR1cm4gMTtjYXNlImRyYWciOmNhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdleGl0IjpjYXNlImRyYWdsZWF2ZSI6Y2FzZSJkcmFnb3ZlciI6Y2FzZSJtb3VzZW1vdmUiOmNhc2UibW91c2VvdXQiOmNhc2UibW91c2VvdmVyIjpjYXNlInBvaW50ZXJtb3ZlIjpjYXNlInBvaW50ZXJvdXQiOmNhc2UicG9pbnRlcm92ZXIiOmNhc2Uic2Nyb2xsIjpjYXNlInRvZ2dsZSI6Y2FzZSJ0b3VjaG1vdmUiOmNhc2Uid2hlZWwiOmNhc2UibW91c2VlbnRlciI6Y2FzZSJtb3VzZWxlYXZlIjpjYXNlInBvaW50ZXJlbnRlciI6Y2FzZSJwb2ludGVybGVhdmUiOnJldHVybiA0O2Nhc2UibWVzc2FnZSI6c3dpdGNoKGwkKCkpe2Nhc2UgRnA6cmV0dXJuIDE7Y2FzZSBFMTpyZXR1cm4gNDtjYXNlIEh1OmNhc2UgcyQ6cmV0dXJuIDE2O2Nhc2UgQzE6cmV0dXJuIDUzNjg3MDkxMjtkZWZhdWx0OnJldHVybiAxNn1kZWZhdWx0OnJldHVybiAxNn19dmFyIGhvPW51bGwsVnA9bnVsbCwkdT1udWxsO2Z1bmN0aW9uIEExKCl7aWYoJHUpcmV0dXJuICR1O3ZhciBlLHQ9VnAsbj10Lmxlbmd0aCxyLG89InZhbHVlImluIGhvP2hvLnZhbHVlOmhvLnRleHRDb250ZW50LGk9by5sZW5ndGg7Zm9yKGU9MDtlPG4mJnRbZV09PT1vW2VdO2UrKyk7dmFyIGw9bi1lO2ZvcihyPTE7cjw9bCYmdFtuLXJdPT09b1tpLXJdO3IrKyk7cmV0dXJuICR1PW8uc2xpY2UoZSwxPHI/MS1yOnZvaWQgMCl9ZnVuY3Rpb24ga3UoZSl7dmFyIHQ9ZS5rZXlDb2RlO3JldHVybiJjaGFyQ29kZSJpbiBlPyhlPWUuY2hhckNvZGUsZT09PTAmJnQ9PT0xMyYmKGU9MTMpKTplPXQsZT09PTEwJiYoZT0xMyksMzI8PWV8fGU9PT0xMz9lOjB9ZnVuY3Rpb24gcWEoKXtyZXR1cm4hMH1mdW5jdGlvbiBxbSgpe3JldHVybiExfWZ1bmN0aW9uIE5uKGUpe2Z1bmN0aW9uIHQobixyLG8saSxsKXt0aGlzLl9yZWFjdE5hbWU9bix0aGlzLl90YXJnZXRJbnN0PW8sdGhpcy50eXBlPXIsdGhpcy5uYXRpdmVFdmVudD1pLHRoaXMudGFyZ2V0PWwsdGhpcy5jdXJyZW50VGFyZ2V0PW51bGw7Zm9yKHZhciBzIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShzKSYmKG49ZVtzXSx0aGlzW3NdPW4/bihpKTppW3NdKTtyZXR1cm4gdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9KGkuZGVmYXVsdFByZXZlbnRlZCE9bnVsbD9pLmRlZmF1bHRQcmV2ZW50ZWQ6aS5yZXR1cm5WYWx1ZT09PSExKT9xYTpxbSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXFtLHRoaXN9cmV0dXJuIHR0KHQucHJvdG90eXBlLHtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMDt2YXIgbj10aGlzLm5hdGl2ZUV2ZW50O24mJihuLnByZXZlbnREZWZhdWx0P24ucHJldmVudERlZmF1bHQoKTp0eXBlb2Ygbi5yZXR1cm5WYWx1ZSE9InVua25vd24iJiYobi5yZXR1cm5WYWx1ZT0hMSksdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cWEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgbj10aGlzLm5hdGl2ZUV2ZW50O24mJihuLnN0b3BQcm9wYWdhdGlvbj9uLnN0b3BQcm9wYWdhdGlvbigpOnR5cGVvZiBuLmNhbmNlbEJ1YmJsZSE9InVua25vd24iJiYobi5jYW5jZWxCdWJibGU9ITApLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cWEpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7fSxpc1BlcnNpc3RlbnQ6cWF9KSx0fXZhciBPbD17ZXZlbnRQaGFzZTowLGJ1YmJsZXM6MCxjYW5jZWxhYmxlOjAsdGltZVN0YW1wOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDowLGlzVHJ1c3RlZDowfSxIcD1ObihPbCksTmE9dHQoe30sT2wse3ZpZXc6MCxkZXRhaWw6MH0pLF8kPU5uKE5hKSxWZCxIZCxycyxXYz10dCh7fSxOYSx7c2NyZWVuWDowLHNjcmVlblk6MCxjbGllbnRYOjAsY2xpZW50WTowLHBhZ2VYOjAscGFnZVk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTpLcCxidXR0b246MCxidXR0b25zOjAscmVsYXRlZFRhcmdldDpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWxhdGVkVGFyZ2V0PT09dm9pZCAwP2UuZnJvbUVsZW1lbnQ9PT1lLnNyY0VsZW1lbnQ/ZS50b0VsZW1lbnQ6ZS5mcm9tRWxlbWVudDplLnJlbGF0ZWRUYXJnZXR9LG1vdmVtZW50WDpmdW5jdGlvbihlKXtyZXR1cm4ibW92ZW1lbnRYImluIGU/ZS5tb3ZlbWVudFg6KGUhPT1ycyYmKHJzJiZlLnR5cGU9PT0ibW91c2Vtb3ZlIj8oVmQ9ZS5zY3JlZW5YLXJzLnNjcmVlblgsSGQ9ZS5zY3JlZW5ZLXJzLnNjcmVlblkpOkhkPVZkPTAscnM9ZSksVmQpfSxtb3ZlbWVudFk6ZnVuY3Rpb24oZSl7cmV0dXJuIm1vdmVtZW50WSJpbiBlP2UubW92ZW1lbnRZOkhkfX0pLGV2PU5uKFdjKSx3JD10dCh7fSxXYyx7ZGF0YVRyYW5zZmVyOjB9KSxTJD1Obih3JCksRSQ9dHQoe30sTmEse3JlbGF0ZWRUYXJnZXQ6MH0pLEtkPU5uKEUkKSxDJD10dCh7fSxPbCx7YW5pbWF0aW9uTmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksJCQ9Tm4oQyQpLGskPXR0KHt9LE9sLHtjbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGUpe3JldHVybiJjbGlwYm9hcmREYXRhImluIGU/ZS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX0pLFQkPU5uKGskKSxOJD10dCh7fSxPbCx7ZGF0YTowfSksdHY9Tm4oTiQpLGIkPXtFc2M6IkVzY2FwZSIsU3BhY2ViYXI6IiAiLExlZnQ6IkFycm93TGVmdCIsVXA6IkFycm93VXAiLFJpZ2h0OiJBcnJvd1JpZ2h0IixEb3duOiJBcnJvd0Rvd24iLERlbDoiRGVsZXRlIixXaW46Ik9TIixNZW51OiJDb250ZXh0TWVudSIsQXBwczoiQ29udGV4dE1lbnUiLFNjcm9sbDoiU2Nyb2xsTG9jayIsTW96UHJpbnRhYmxlS2V5OiJVbmlkZW50aWZpZWQifSxSJD17ODoiQmFja3NwYWNlIiw5OiJUYWIiLDEyOiJDbGVhciIsMTM6IkVudGVyIiwxNjoiU2hpZnQiLDE3OiJDb250cm9sIiwxODoiQWx0IiwxOToiUGF1c2UiLDIwOiJDYXBzTG9jayIsMjc6IkVzY2FwZSIsMzI6IiAiLDMzOiJQYWdlVXAiLDM0OiJQYWdlRG93biIsMzU6IkVuZCIsMzY6IkhvbWUiLDM3OiJBcnJvd0xlZnQiLDM4OiJBcnJvd1VwIiwzOToiQXJyb3dSaWdodCIsNDA6IkFycm93RG93biIsNDU6Ikluc2VydCIsNDY6IkRlbGV0ZSIsMTEyOiJGMSIsMTEzOiJGMiIsMTE0OiJGMyIsMTE1OiJGNCIsMTE2OiJGNSIsMTE3OiJGNiIsMTE4OiJGNyIsMTE5OiJGOCIsMTIwOiJGOSIsMTIxOiJGMTAiLDEyMjoiRjExIiwxMjM6IkYxMiIsMTQ0OiJOdW1Mb2NrIiwxNDU6IlNjcm9sbExvY2siLDIyNDoiTWV0YSJ9LFAkPXtBbHQ6ImFsdEtleSIsQ29udHJvbDoiY3RybEtleSIsTWV0YToibWV0YUtleSIsU2hpZnQ6InNoaWZ0S2V5In07ZnVuY3Rpb24gTyQoZSl7dmFyIHQ9dGhpcy5uYXRpdmVFdmVudDtyZXR1cm4gdC5nZXRNb2RpZmllclN0YXRlP3QuZ2V0TW9kaWZpZXJTdGF0ZShlKTooZT1QJFtlXSk/ISF0W2VdOiExfWZ1bmN0aW9uIEtwKCl7cmV0dXJuIE8kfXZhciBBJD10dCh7fSxOYSx7a2V5OmZ1bmN0aW9uKGUpe2lmKGUua2V5KXt2YXIgdD1iJFtlLmtleV18fGUua2V5O2lmKHQhPT0iVW5pZGVudGlmaWVkIilyZXR1cm4gdH1yZXR1cm4gZS50eXBlPT09ImtleXByZXNzIj8oZT1rdShlKSxlPT09MTM/IkVudGVyIjpTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKTplLnR5cGU9PT0ia2V5ZG93biJ8fGUudHlwZT09PSJrZXl1cCI/UiRbZS5rZXlDb2RlXXx8IlVuaWRlbnRpZmllZCI6IiJ9LGNvZGU6MCxsb2NhdGlvbjowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxyZXBlYXQ6MCxsb2NhbGU6MCxnZXRNb2RpZmllclN0YXRlOktwLGNoYXJDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5cHJlc3MiP2t1KGUpOjB9LGtleUNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PSJrZXlkb3duInx8ZS50eXBlPT09ImtleXVwIj9lLmtleUNvZGU6MH0sd2hpY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PSJrZXlwcmVzcyI/a3UoZSk6ZS50eXBlPT09ImtleWRvd24ifHxlLnR5cGU9PT0ia2V5dXAiP2Uua2V5Q29kZTowfX0pLE0kPU5uKEEkKSxEJD10dCh7fSxXYyx7cG9pbnRlcklkOjAsd2lkdGg6MCxoZWlnaHQ6MCxwcmVzc3VyZTowLHRhbmdlbnRpYWxQcmVzc3VyZTowLHRpbHRYOjAsdGlsdFk6MCx0d2lzdDowLHBvaW50ZXJUeXBlOjAsaXNQcmltYXJ5OjB9KSxudj1ObihEJCksTCQ9dHQoe30sTmEse3RvdWNoZXM6MCx0YXJnZXRUb3VjaGVzOjAsY2hhbmdlZFRvdWNoZXM6MCxhbHRLZXk6MCxtZXRhS2V5OjAsY3RybEtleTowLHNoaWZ0S2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTpLcH0pLEkkPU5uKEwkKSxqJD10dCh7fSxPbCx7cHJvcGVydHlOYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSx6JD1ObihqJCksRiQ9dHQoe30sV2Mse2RlbHRhWDpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFYImluIGU/ZS5kZWx0YVg6IndoZWVsRGVsdGFYImluIGU/LWUud2hlZWxEZWx0YVg6MH0sZGVsdGFZOmZ1bmN0aW9uKGUpe3JldHVybiJkZWx0YVkiaW4gZT9lLmRlbHRhWToid2hlZWxEZWx0YVkiaW4gZT8tZS53aGVlbERlbHRhWToid2hlZWxEZWx0YSJpbiBlPy1lLndoZWVsRGVsdGE6MH0sZGVsdGFaOjAsZGVsdGFNb2RlOjB9KSxCJD1ObihGJCksVyQ9WzksMTMsMjcsMzJdLEdwPUlyJiYiQ29tcG9zaXRpb25FdmVudCJpbiB3aW5kb3csQ3M9bnVsbDtJciYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmKENzPWRvY3VtZW50LmRvY3VtZW50TW9kZSk7dmFyIFUkPUlyJiYiVGV4dEV2ZW50ImluIHdpbmRvdyYmIUNzLE0xPUlyJiYoIUdwfHxDcyYmODxDcyYmMTE+PUNzKSxydj1TdHJpbmcuZnJvbUNoYXJDb2RlKDMyKSxvdj0hMTtmdW5jdGlvbiBEMShlLHQpe3N3aXRjaChlKXtjYXNlImtleXVwIjpyZXR1cm4gVyQuaW5kZXhPZih0LmtleUNvZGUpIT09LTE7Y2FzZSJrZXlkb3duIjpyZXR1cm4gdC5rZXlDb2RlIT09MjI5O2Nhc2Uia2V5cHJlc3MiOmNhc2UibW91c2Vkb3duIjpjYXNlImZvY3Vzb3V0IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBMMShlKXtyZXR1cm4gZT1lLmRldGFpbCx0eXBlb2YgZT09Im9iamVjdCImJiJkYXRhImluIGU/ZS5kYXRhOm51bGx9dmFyIFZpPSExO2Z1bmN0aW9uIFYkKGUsdCl7c3dpdGNoKGUpe2Nhc2UiY29tcG9zaXRpb25lbmQiOnJldHVybiBMMSh0KTtjYXNlImtleXByZXNzIjpyZXR1cm4gdC53aGljaCE9PTMyP251bGw6KG92PSEwLHJ2KTtjYXNlInRleHRJbnB1dCI6cmV0dXJuIGU9dC5kYXRhLGU9PT1ydiYmb3Y/bnVsbDplO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIEgkKGUsdCl7aWYoVmkpcmV0dXJuIGU9PT0iY29tcG9zaXRpb25lbmQifHwhR3AmJkQxKGUsdCk/KGU9QTEoKSwkdT1WcD1obz1udWxsLFZpPSExLGUpOm51bGw7c3dpdGNoKGUpe2Nhc2UicGFzdGUiOnJldHVybiBudWxsO2Nhc2Uia2V5cHJlc3MiOmlmKCEodC5jdHJsS2V5fHx0LmFsdEtleXx8dC5tZXRhS2V5KXx8dC5jdHJsS2V5JiZ0LmFsdEtleSl7aWYodC5jaGFyJiYxPHQuY2hhci5sZW5ndGgpcmV0dXJuIHQuY2hhcjtpZih0LndoaWNoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQud2hpY2gpfXJldHVybiBudWxsO2Nhc2UiY29tcG9zaXRpb25lbmQiOnJldHVybiBNMSYmdC5sb2NhbGUhPT0ia28iP251bGw6dC5kYXRhO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciBLJD17Y29sb3I6ITAsZGF0ZTohMCxkYXRldGltZTohMCwiZGF0ZXRpbWUtbG9jYWwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZnVuY3Rpb24gaXYoZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0PT09ImlucHV0Ij8hIUskW2UudHlwZV06dD09PSJ0ZXh0YXJlYSJ9ZnVuY3Rpb24gSTEoZSx0LG4scil7cDEociksdD1YdSh0LCJvbkNoYW5nZSIpLDA8dC5sZW5ndGgmJihuPW5ldyBIcCgib25DaGFuZ2UiLCJjaGFuZ2UiLG51bGwsbixyKSxlLnB1c2goe2V2ZW50Om4sbGlzdGVuZXJzOnR9KSl9dmFyICRzPW51bGwsWnM9bnVsbDtmdW5jdGlvbiBHJChlKXtZMShlLDApfWZ1bmN0aW9uIFVjKGUpe3ZhciB0PUdpKGUpO2lmKHMxKHQpKXJldHVybiBlfWZ1bmN0aW9uIFkkKGUsdCl7aWYoZT09PSJjaGFuZ2UiKXJldHVybiB0fXZhciBqMT0hMTtpZihJcil7dmFyIEdkO2lmKElyKXt2YXIgWWQ9Im9uaW5wdXQiaW4gZG9jdW1lbnQ7aWYoIVlkKXt2YXIgbHY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7bHYuc2V0QXR0cmlidXRlKCJvbmlucHV0IiwicmV0dXJuOyIpLFlkPXR5cGVvZiBsdi5vbmlucHV0PT0iZnVuY3Rpb24ifUdkPVlkfWVsc2UgR2Q9ITE7ajE9R2QmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSl9ZnVuY3Rpb24gc3YoKXskcyYmKCRzLmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIix6MSksWnM9JHM9bnVsbCl9ZnVuY3Rpb24gejEoZSl7aWYoZS5wcm9wZXJ0eU5hbWU9PT0idmFsdWUiJiZVYyhacykpe3ZhciB0PVtdO0kxKHQsWnMsZSx6cChlKSkseTEoRyQsdCl9fWZ1bmN0aW9uIFgkKGUsdCxuKXtlPT09ImZvY3VzaW4iPyhzdigpLCRzPXQsWnM9biwkcy5hdHRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsejEpKTplPT09ImZvY3Vzb3V0IiYmc3YoKX1mdW5jdGlvbiBRJChlKXtpZihlPT09InNlbGVjdGlvbmNoYW5nZSJ8fGU9PT0ia2V5dXAifHxlPT09ImtleWRvd24iKXJldHVybiBVYyhacyl9ZnVuY3Rpb24gSiQoZSx0KXtpZihlPT09ImNsaWNrIilyZXR1cm4gVWModCl9ZnVuY3Rpb24gWiQoZSx0KXtpZihlPT09ImlucHV0Inx8ZT09PSJjaGFuZ2UiKXJldHVybiBVYyh0KX1mdW5jdGlvbiBxJChlLHQpe3JldHVybiBlPT09dCYmKGUhPT0wfHwxL2U9PT0xL3QpfHxlIT09ZSYmdCE9PXR9dmFyIGVyPXR5cGVvZiBPYmplY3QuaXM9PSJmdW5jdGlvbiI/T2JqZWN0LmlzOnEkO2Z1bmN0aW9uIHFzKGUsdCl7aWYoZXIoZSx0KSlyZXR1cm4hMDtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsfHx0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsKXJldHVybiExO3ZhciBuPU9iamVjdC5rZXlzKGUpLHI9T2JqZWN0LmtleXModCk7aWYobi5sZW5ndGghPT1yLmxlbmd0aClyZXR1cm4hMTtmb3Iocj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdO2lmKCFMZi5jYWxsKHQsbyl8fCFlcihlW29dLHRbb10pKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGF2KGUpe2Zvcig7ZSYmZS5maXJzdENoaWxkOyllPWUuZmlyc3RDaGlsZDtyZXR1cm4gZX1mdW5jdGlvbiB1dihlLHQpe3ZhciBuPWF2KGUpO2U9MDtmb3IodmFyIHI7bjspe2lmKG4ubm9kZVR5cGU9PT0zKXtpZihyPWUrbi50ZXh0Q29udGVudC5sZW5ndGgsZTw9dCYmcj49dClyZXR1cm57bm9kZTpuLG9mZnNldDp0LWV9O2U9cn1lOntmb3IoO247KXtpZihuLm5leHRTaWJsaW5nKXtuPW4ubmV4dFNpYmxpbmc7YnJlYWsgZX1uPW4ucGFyZW50Tm9kZX1uPXZvaWQgMH1uPWF2KG4pfX1mdW5jdGlvbiBGMShlLHQpe3JldHVybiBlJiZ0P2U9PT10PyEwOmUmJmUubm9kZVR5cGU9PT0zPyExOnQmJnQubm9kZVR5cGU9PT0zP0YxKGUsdC5wYXJlbnROb2RlKToiY29udGFpbnMiaW4gZT9lLmNvbnRhaW5zKHQpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSYxNik6ITE6ITF9ZnVuY3Rpb24gQjEoKXtmb3IodmFyIGU9d2luZG93LHQ9V3UoKTt0IGluc3RhbmNlb2YgZS5IVE1MSUZyYW1lRWxlbWVudDspe3RyeXt2YXIgbj10eXBlb2YgdC5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWY9PSJzdHJpbmcifWNhdGNoe249ITF9aWYobillPXQuY29udGVudFdpbmRvdztlbHNlIGJyZWFrO3Q9V3UoZS5kb2N1bWVudCl9cmV0dXJuIHR9ZnVuY3Rpb24gWXAoZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0JiYodD09PSJpbnB1dCImJihlLnR5cGU9PT0idGV4dCJ8fGUudHlwZT09PSJzZWFyY2gifHxlLnR5cGU9PT0idGVsInx8ZS50eXBlPT09InVybCJ8fGUudHlwZT09PSJwYXNzd29yZCIpfHx0PT09InRleHRhcmVhInx8ZS5jb250ZW50RWRpdGFibGU9PT0idHJ1ZSIpfWZ1bmN0aW9uIGVrKGUpe3ZhciB0PUIxKCksbj1lLmZvY3VzZWRFbGVtLHI9ZS5zZWxlY3Rpb25SYW5nZTtpZih0IT09biYmbiYmbi5vd25lckRvY3VtZW50JiZGMShuLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG4pKXtpZihyIT09bnVsbCYmWXAobikpe2lmKHQ9ci5zdGFydCxlPXIuZW5kLGU9PT12b2lkIDAmJihlPXQpLCJzZWxlY3Rpb25TdGFydCJpbiBuKW4uc2VsZWN0aW9uU3RhcnQ9dCxuLnNlbGVjdGlvbkVuZD1NYXRoLm1pbihlLG4udmFsdWUubGVuZ3RoKTtlbHNlIGlmKGU9KHQ9bi5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJnQuZGVmYXVsdFZpZXd8fHdpbmRvdyxlLmdldFNlbGVjdGlvbil7ZT1lLmdldFNlbGVjdGlvbigpO3ZhciBvPW4udGV4dENvbnRlbnQubGVuZ3RoLGk9TWF0aC5taW4oci5zdGFydCxvKTtyPXIuZW5kPT09dm9pZCAwP2k6TWF0aC5taW4oci5lbmQsbyksIWUuZXh0ZW5kJiZpPnImJihvPXIscj1pLGk9byksbz11dihuLGkpO3ZhciBsPXV2KG4scik7byYmbCYmKGUucmFuZ2VDb3VudCE9PTF8fGUuYW5jaG9yTm9kZSE9PW8ubm9kZXx8ZS5hbmNob3JPZmZzZXQhPT1vLm9mZnNldHx8ZS5mb2N1c05vZGUhPT1sLm5vZGV8fGUuZm9jdXNPZmZzZXQhPT1sLm9mZnNldCkmJih0PXQuY3JlYXRlUmFuZ2UoKSx0LnNldFN0YXJ0KG8ubm9kZSxvLm9mZnNldCksZS5yZW1vdmVBbGxSYW5nZXMoKSxpPnI/KGUuYWRkUmFuZ2UodCksZS5leHRlbmQobC5ub2RlLGwub2Zmc2V0KSk6KHQuc2V0RW5kKGwubm9kZSxsLm9mZnNldCksZS5hZGRSYW5nZSh0KSkpfX1mb3IodD1bXSxlPW47ZT1lLnBhcmVudE5vZGU7KWUubm9kZVR5cGU9PT0xJiZ0LnB1c2goe2VsZW1lbnQ6ZSxsZWZ0OmUuc2Nyb2xsTGVmdCx0b3A6ZS5zY3JvbGxUb3B9KTtmb3IodHlwZW9mIG4uZm9jdXM9PSJmdW5jdGlvbiImJm4uZm9jdXMoKSxuPTA7bjx0Lmxlbmd0aDtuKyspZT10W25dLGUuZWxlbWVudC5zY3JvbGxMZWZ0PWUubGVmdCxlLmVsZW1lbnQuc2Nyb2xsVG9wPWUudG9wfX12YXIgdGs9SXImJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJjExPj1kb2N1bWVudC5kb2N1bWVudE1vZGUsSGk9bnVsbCx0aD1udWxsLGtzPW51bGwsbmg9ITE7ZnVuY3Rpb24gY3YoZSx0LG4pe3ZhciByPW4ud2luZG93PT09bj9uLmRvY3VtZW50Om4ubm9kZVR5cGU9PT05P246bi5vd25lckRvY3VtZW50O25ofHxIaT09bnVsbHx8SGkhPT1XdShyKXx8KHI9SGksInNlbGVjdGlvblN0YXJ0ImluIHImJllwKHIpP3I9e3N0YXJ0OnIuc2VsZWN0aW9uU3RhcnQsZW5kOnIuc2VsZWN0aW9uRW5kfToocj0oci5vd25lckRvY3VtZW50JiZyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCkscj17YW5jaG9yTm9kZTpyLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OnIuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTpyLmZvY3VzTm9kZSxmb2N1c09mZnNldDpyLmZvY3VzT2Zmc2V0fSksa3MmJnFzKGtzLHIpfHwoa3M9cixyPVh1KHRoLCJvblNlbGVjdCIpLDA8ci5sZW5ndGgmJih0PW5ldyBIcCgib25TZWxlY3QiLCJzZWxlY3QiLG51bGwsdCxuKSxlLnB1c2goe2V2ZW50OnQsbGlzdGVuZXJzOnJ9KSx0LnRhcmdldD1IaSkpKX1mdW5jdGlvbiBldShlLHQpe3ZhciBuPXt9O3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV09dC50b0xvd2VyQ2FzZSgpLG5bIldlYmtpdCIrZV09IndlYmtpdCIrdCxuWyJNb3oiK2VdPSJtb3oiK3Qsbn12YXIgS2k9e2FuaW1hdGlvbmVuZDpldSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uRW5kIiksYW5pbWF0aW9uaXRlcmF0aW9uOmV1KCJBbmltYXRpb24iLCJBbmltYXRpb25JdGVyYXRpb24iKSxhbmltYXRpb25zdGFydDpldSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uU3RhcnQiKSx0cmFuc2l0aW9uZW5kOmV1KCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvbkVuZCIpfSxYZD17fSxXMT17fTtJciYmKFcxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJBbmltYXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUgS2kuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixkZWxldGUgS2kuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgS2kuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvd3x8ZGVsZXRlIEtpLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7ZnVuY3Rpb24gVmMoZSl7aWYoWGRbZV0pcmV0dXJuIFhkW2VdO2lmKCFLaVtlXSlyZXR1cm4gZTt2YXIgdD1LaVtlXSxuO2ZvcihuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSYmbiBpbiBXMSlyZXR1cm4gWGRbZV09dFtuXTtyZXR1cm4gZX12YXIgVTE9VmMoImFuaW1hdGlvbmVuZCIpLFYxPVZjKCJhbmltYXRpb25pdGVyYXRpb24iKSxIMT1WYygiYW5pbWF0aW9uc3RhcnQiKSxLMT1WYygidHJhbnNpdGlvbmVuZCIpLEcxPW5ldyBNYXAsZHY9ImFib3J0IGF1eENsaWNrIGNhbmNlbCBjYW5QbGF5IGNhblBsYXlUaHJvdWdoIGNsaWNrIGNsb3NlIGNvbnRleHRNZW51IGNvcHkgY3V0IGRyYWcgZHJhZ0VuZCBkcmFnRW50ZXIgZHJhZ0V4aXQgZHJhZ0xlYXZlIGRyYWdPdmVyIGRyYWdTdGFydCBkcm9wIGR1cmF0aW9uQ2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGdvdFBvaW50ZXJDYXB0dXJlIGlucHV0IGludmFsaWQga2V5RG93biBrZXlQcmVzcyBrZXlVcCBsb2FkIGxvYWRlZERhdGEgbG9hZGVkTWV0YWRhdGEgbG9hZFN0YXJ0IGxvc3RQb2ludGVyQ2FwdHVyZSBtb3VzZURvd24gbW91c2VNb3ZlIG1vdXNlT3V0IG1vdXNlT3ZlciBtb3VzZVVwIHBhc3RlIHBhdXNlIHBsYXkgcGxheWluZyBwb2ludGVyQ2FuY2VsIHBvaW50ZXJEb3duIHBvaW50ZXJNb3ZlIHBvaW50ZXJPdXQgcG9pbnRlck92ZXIgcG9pbnRlclVwIHByb2dyZXNzIHJhdGVDaGFuZ2UgcmVzZXQgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VibWl0IHN1c3BlbmQgdGltZVVwZGF0ZSB0b3VjaENhbmNlbCB0b3VjaEVuZCB0b3VjaFN0YXJ0IHZvbHVtZUNoYW5nZSBzY3JvbGwgdG9nZ2xlIHRvdWNoTW92ZSB3YWl0aW5nIHdoZWVsIi5zcGxpdCgiICIpO2Z1bmN0aW9uIElvKGUsdCl7RzEuc2V0KGUsdCkseWkodCxbZV0pfWZvcih2YXIgUWQ9MDtRZDxkdi5sZW5ndGg7UWQrKyl7dmFyIEpkPWR2W1FkXSxuaz1KZC50b0xvd2VyQ2FzZSgpLHJrPUpkWzBdLnRvVXBwZXJDYXNlKCkrSmQuc2xpY2UoMSk7SW8obmssIm9uIityayl9SW8oVTEsIm9uQW5pbWF0aW9uRW5kIik7SW8oVjEsIm9uQW5pbWF0aW9uSXRlcmF0aW9uIik7SW8oSDEsIm9uQW5pbWF0aW9uU3RhcnQiKTtJbygiZGJsY2xpY2siLCJvbkRvdWJsZUNsaWNrIik7SW8oImZvY3VzaW4iLCJvbkZvY3VzIik7SW8oImZvY3Vzb3V0Iiwib25CbHVyIik7SW8oSzEsIm9uVHJhbnNpdGlvbkVuZCIpO2dsKCJvbk1vdXNlRW50ZXIiLFsibW91c2VvdXQiLCJtb3VzZW92ZXIiXSk7Z2woIm9uTW91c2VMZWF2ZSIsWyJtb3VzZW91dCIsIm1vdXNlb3ZlciJdKTtnbCgib25Qb2ludGVyRW50ZXIiLFsicG9pbnRlcm91dCIsInBvaW50ZXJvdmVyIl0pO2dsKCJvblBvaW50ZXJMZWF2ZSIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSk7eWkoIm9uQ2hhbmdlIiwiY2hhbmdlIGNsaWNrIGZvY3VzaW4gZm9jdXNvdXQgaW5wdXQga2V5ZG93biBrZXl1cCBzZWxlY3Rpb25jaGFuZ2UiLnNwbGl0KCIgIikpO3lpKCJvblNlbGVjdCIsImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSk7eWkoIm9uQmVmb3JlSW5wdXQiLFsiY29tcG9zaXRpb25lbmQiLCJrZXlwcmVzcyIsInRleHRJbnB1dCIsInBhc3RlIl0pO3lpKCJvbkNvbXBvc2l0aW9uRW5kIiwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO3lpKCJvbkNvbXBvc2l0aW9uU3RhcnQiLCJjb21wb3NpdGlvbnN0YXJ0IGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTt5aSgib25Db21wb3NpdGlvblVwZGF0ZSIsImNvbXBvc2l0aW9udXBkYXRlIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTt2YXIgdnM9ImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nIi5zcGxpdCgiICIpLG9rPW5ldyBTZXQoImNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHRvZ2dsZSIuc3BsaXQoIiAiKS5jb25jYXQodnMpKTtmdW5jdGlvbiBmdihlLHQsbil7dmFyIHI9ZS50eXBlfHwidW5rbm93bi1ldmVudCI7ZS5jdXJyZW50VGFyZ2V0PW4sbiQocix0LHZvaWQgMCxlKSxlLmN1cnJlbnRUYXJnZXQ9bnVsbH1mdW5jdGlvbiBZMShlLHQpe3Q9KHQmNCkhPT0wO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLG89ci5ldmVudDtyPXIubGlzdGVuZXJzO2U6e3ZhciBpPXZvaWQgMDtpZih0KWZvcih2YXIgbD1yLmxlbmd0aC0xOzA8PWw7bC0tKXt2YXIgcz1yW2xdLGE9cy5pbnN0YW5jZSx1PXMuY3VycmVudFRhcmdldDtpZihzPXMubGlzdGVuZXIsYSE9PWkmJm8uaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBlO2Z2KG8scyx1KSxpPWF9ZWxzZSBmb3IobD0wO2w8ci5sZW5ndGg7bCsrKXtpZihzPXJbbF0sYT1zLmluc3RhbmNlLHU9cy5jdXJyZW50VGFyZ2V0LHM9cy5saXN0ZW5lcixhIT09aSYmby5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGU7ZnYobyxzLHUpLGk9YX19fWlmKFZ1KXRocm93IGU9SmYsVnU9ITEsSmY9bnVsbCxlfWZ1bmN0aW9uIFVlKGUsdCl7dmFyIG49dFtzaF07bj09PXZvaWQgMCYmKG49dFtzaF09bmV3IFNldCk7dmFyIHI9ZSsiX19idWJibGUiO24uaGFzKHIpfHwoWDEodCxlLDIsITEpLG4uYWRkKHIpKX1mdW5jdGlvbiBaZChlLHQsbil7dmFyIHI9MDt0JiYocnw9NCksWDEobixlLHIsdCl9dmFyIHR1PSJfcmVhY3RMaXN0ZW5pbmciK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO2Z1bmN0aW9uIGVhKGUpe2lmKCFlW3R1XSl7ZVt0dV09ITAsbjEuZm9yRWFjaChmdW5jdGlvbihuKXtuIT09InNlbGVjdGlvbmNoYW5nZSImJihvay5oYXMobil8fFpkKG4sITEsZSksWmQobiwhMCxlKSl9KTt2YXIgdD1lLm5vZGVUeXBlPT09OT9lOmUub3duZXJEb2N1bWVudDt0PT09bnVsbHx8dFt0dV18fCh0W3R1XT0hMCxaZCgic2VsZWN0aW9uY2hhbmdlIiwhMSx0KSl9fWZ1bmN0aW9uIFgxKGUsdCxuLHIpe3N3aXRjaChPMSh0KSl7Y2FzZSAxOnZhciBvPXkkO2JyZWFrO2Nhc2UgNDpvPXgkO2JyZWFrO2RlZmF1bHQ6bz1VcH1uPW8uYmluZChudWxsLHQsbixlKSxvPXZvaWQgMCwhUWZ8fHQhPT0idG91Y2hzdGFydCImJnQhPT0idG91Y2htb3ZlIiYmdCE9PSJ3aGVlbCJ8fChvPSEwKSxyP28hPT12b2lkIDA/ZS5hZGRFdmVudExpc3RlbmVyKHQsbix7Y2FwdHVyZTohMCxwYXNzaXZlOm99KTplLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKTpvIT09dm9pZCAwP2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4se3Bhc3NpdmU6b30pOmUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpfWZ1bmN0aW9uIHFkKGUsdCxuLHIsbyl7dmFyIGk9cjtpZighKHQmMSkmJiEodCYyKSYmciE9PW51bGwpZTpmb3IoOzspe2lmKHI9PT1udWxsKXJldHVybjt2YXIgbD1yLnRhZztpZihsPT09M3x8bD09PTQpe3ZhciBzPXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87aWYocz09PW98fHMubm9kZVR5cGU9PT04JiZzLnBhcmVudE5vZGU9PT1vKWJyZWFrO2lmKGw9PT00KWZvcihsPXIucmV0dXJuO2whPT1udWxsOyl7dmFyIGE9bC50YWc7aWYoKGE9PT0zfHxhPT09NCkmJihhPWwuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sYT09PW98fGEubm9kZVR5cGU9PT04JiZhLnBhcmVudE5vZGU9PT1vKSlyZXR1cm47bD1sLnJldHVybn1mb3IoO3MhPT1udWxsOyl7aWYobD1RbyhzKSxsPT09bnVsbClyZXR1cm47aWYoYT1sLnRhZyxhPT09NXx8YT09PTYpe3I9aT1sO2NvbnRpbnVlIGV9cz1zLnBhcmVudE5vZGV9fXI9ci5yZXR1cm59eTEoZnVuY3Rpb24oKXt2YXIgdT1pLGM9enAobiksZD1bXTtlOnt2YXIgZj1HMS5nZXQoZSk7aWYoZiE9PXZvaWQgMCl7dmFyIGg9SHAsZz1lO3N3aXRjaChlKXtjYXNlImtleXByZXNzIjppZihrdShuKT09PTApYnJlYWsgZTtjYXNlImtleWRvd24iOmNhc2Uia2V5dXAiOmg9TSQ7YnJlYWs7Y2FzZSJmb2N1c2luIjpnPSJmb2N1cyIsaD1LZDticmVhaztjYXNlImZvY3Vzb3V0IjpnPSJibHVyIixoPUtkO2JyZWFrO2Nhc2UiYmVmb3JlYmx1ciI6Y2FzZSJhZnRlcmJsdXIiOmg9S2Q7YnJlYWs7Y2FzZSJjbGljayI6aWYobi5idXR0b249PT0yKWJyZWFrIGU7Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJtb3VzZWRvd24iOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNldXAiOmNhc2UibW91c2VvdXQiOmNhc2UibW91c2VvdmVyIjpjYXNlImNvbnRleHRtZW51IjpoPWV2O2JyZWFrO2Nhc2UiZHJhZyI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UiZHJhZ3N0YXJ0IjpjYXNlImRyb3AiOmg9UyQ7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaG1vdmUiOmNhc2UidG91Y2hzdGFydCI6aD1JJDticmVhaztjYXNlIFUxOmNhc2UgVjE6Y2FzZSBIMTpoPSQkO2JyZWFrO2Nhc2UgSzE6aD16JDticmVhaztjYXNlInNjcm9sbCI6aD1fJDticmVhaztjYXNlIndoZWVsIjpoPUIkO2JyZWFrO2Nhc2UiY29weSI6Y2FzZSJjdXQiOmNhc2UicGFzdGUiOmg9VCQ7YnJlYWs7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJsb3N0cG9pbnRlcmNhcHR1cmUiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInBvaW50ZXJ1cCI6aD1udn12YXIgbT0odCY0KSE9PTAsUz0hbSYmZT09PSJzY3JvbGwiLHY9bT9mIT09bnVsbD9mKyJDYXB0dXJlIjpudWxsOmY7bT1bXTtmb3IodmFyIHk9dSx4O3khPT1udWxsOyl7eD15O3ZhciBfPXguc3RhdGVOb2RlO2lmKHgudGFnPT09NSYmXyE9PW51bGwmJih4PV8sdiE9PW51bGwmJihfPVlzKHksdiksXyE9bnVsbCYmbS5wdXNoKHRhKHksXyx4KSkpKSxTKWJyZWFrO3k9eS5yZXR1cm59MDxtLmxlbmd0aCYmKGY9bmV3IGgoZixnLG51bGwsbixjKSxkLnB1c2goe2V2ZW50OmYsbGlzdGVuZXJzOm19KSl9fWlmKCEodCY3KSl7ZTp7aWYoZj1lPT09Im1vdXNlb3ZlciJ8fGU9PT0icG9pbnRlcm92ZXIiLGg9ZT09PSJtb3VzZW91dCJ8fGU9PT0icG9pbnRlcm91dCIsZiYmbiE9PVlmJiYoZz1uLnJlbGF0ZWRUYXJnZXR8fG4uZnJvbUVsZW1lbnQpJiYoUW8oZyl8fGdbanJdKSlicmVhayBlO2lmKChofHxmKSYmKGY9Yy53aW5kb3c9PT1jP2M6KGY9Yy5vd25lckRvY3VtZW50KT9mLmRlZmF1bHRWaWV3fHxmLnBhcmVudFdpbmRvdzp3aW5kb3csaD8oZz1uLnJlbGF0ZWRUYXJnZXR8fG4udG9FbGVtZW50LGg9dSxnPWc/UW8oZyk6bnVsbCxnIT09bnVsbCYmKFM9eGkoZyksZyE9PVN8fGcudGFnIT09NSYmZy50YWchPT02KSYmKGc9bnVsbCkpOihoPW51bGwsZz11KSxoIT09Zykpe2lmKG09ZXYsXz0ib25Nb3VzZUxlYXZlIix2PSJvbk1vdXNlRW50ZXIiLHk9Im1vdXNlIiwoZT09PSJwb2ludGVyb3V0Inx8ZT09PSJwb2ludGVyb3ZlciIpJiYobT1udixfPSJvblBvaW50ZXJMZWF2ZSIsdj0ib25Qb2ludGVyRW50ZXIiLHk9InBvaW50ZXIiKSxTPWg9PW51bGw/ZjpHaShoKSx4PWc9PW51bGw/ZjpHaShnKSxmPW5ldyBtKF8seSsibGVhdmUiLGgsbixjKSxmLnRhcmdldD1TLGYucmVsYXRlZFRhcmdldD14LF89bnVsbCxRbyhjKT09PXUmJihtPW5ldyBtKHYseSsiZW50ZXIiLGcsbixjKSxtLnRhcmdldD14LG0ucmVsYXRlZFRhcmdldD1TLF89bSksUz1fLGgmJmcpdDp7Zm9yKG09aCx2PWcseT0wLHg9bTt4O3g9UGkoeCkpeSsrO2Zvcih4PTAsXz12O187Xz1QaShfKSl4Kys7Zm9yKDswPHkteDspbT1QaShtKSx5LS07Zm9yKDswPHgteTspdj1QaSh2KSx4LS07Zm9yKDt5LS07KXtpZihtPT09dnx8diE9PW51bGwmJm09PT12LmFsdGVybmF0ZSlicmVhayB0O209UGkobSksdj1QaSh2KX1tPW51bGx9ZWxzZSBtPW51bGw7aCE9PW51bGwmJmh2KGQsZixoLG0sITEpLGchPT1udWxsJiZTIT09bnVsbCYmaHYoZCxTLGcsbSwhMCl9fWU6e2lmKGY9dT9HaSh1KTp3aW5kb3csaD1mLm5vZGVOYW1lJiZmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksaD09PSJzZWxlY3QifHxoPT09ImlucHV0IiYmZi50eXBlPT09ImZpbGUiKXZhciBFPVkkO2Vsc2UgaWYoaXYoZikpaWYoajEpRT1aJDtlbHNle0U9USQ7dmFyICQ9WCR9ZWxzZShoPWYubm9kZU5hbWUpJiZoLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYoZi50eXBlPT09ImNoZWNrYm94Inx8Zi50eXBlPT09InJhZGlvIikmJihFPUokKTtpZihFJiYoRT1FKGUsdSkpKXtJMShkLEUsbixjKTticmVhayBlfSQmJiQoZSxmLHUpLGU9PT0iZm9jdXNvdXQiJiYoJD1mLl93cmFwcGVyU3RhdGUpJiYkLmNvbnRyb2xsZWQmJmYudHlwZT09PSJudW1iZXIiJiZVZihmLCJudW1iZXIiLGYudmFsdWUpfXN3aXRjaCgkPXU/R2kodSk6d2luZG93LGUpe2Nhc2UiZm9jdXNpbiI6KGl2KCQpfHwkLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIikmJihIaT0kLHRoPXUsa3M9bnVsbCk7YnJlYWs7Y2FzZSJmb2N1c291dCI6a3M9dGg9SGk9bnVsbDticmVhaztjYXNlIm1vdXNlZG93biI6bmg9ITA7YnJlYWs7Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJtb3VzZXVwIjpjYXNlImRyYWdlbmQiOm5oPSExLGN2KGQsbixjKTticmVhaztjYXNlInNlbGVjdGlvbmNoYW5nZSI6aWYodGspYnJlYWs7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjpjdihkLG4sYyl9dmFyIEM7aWYoR3ApZTp7c3dpdGNoKGUpe2Nhc2UiY29tcG9zaXRpb25zdGFydCI6dmFyIFQ9Im9uQ29tcG9zaXRpb25TdGFydCI7YnJlYWsgZTtjYXNlImNvbXBvc2l0aW9uZW5kIjpUPSJvbkNvbXBvc2l0aW9uRW5kIjticmVhayBlO2Nhc2UiY29tcG9zaXRpb251cGRhdGUiOlQ9Im9uQ29tcG9zaXRpb25VcGRhdGUiO2JyZWFrIGV9VD12b2lkIDB9ZWxzZSBWaT9EMShlLG4pJiYoVD0ib25Db21wb3NpdGlvbkVuZCIpOmU9PT0ia2V5ZG93biImJm4ua2V5Q29kZT09PTIyOSYmKFQ9Im9uQ29tcG9zaXRpb25TdGFydCIpO1QmJihNMSYmbi5sb2NhbGUhPT0ia28iJiYoVml8fFQhPT0ib25Db21wb3NpdGlvblN0YXJ0Ij9UPT09Im9uQ29tcG9zaXRpb25FbmQiJiZWaSYmKEM9QTEoKSk6KGhvPWMsVnA9InZhbHVlImluIGhvP2hvLnZhbHVlOmhvLnRleHRDb250ZW50LFZpPSEwKSksJD1YdSh1LFQpLDA8JC5sZW5ndGgmJihUPW5ldyB0dihULGUsbnVsbCxuLGMpLGQucHVzaCh7ZXZlbnQ6VCxsaXN0ZW5lcnM6JH0pLEM/VC5kYXRhPUM6KEM9TDEobiksQyE9PW51bGwmJihULmRhdGE9QykpKSksKEM9VSQ/ViQoZSxuKTpIJChlLG4pKSYmKHU9WHUodSwib25CZWZvcmVJbnB1dCIpLDA8dS5sZW5ndGgmJihjPW5ldyB0digib25CZWZvcmVJbnB1dCIsImJlZm9yZWlucHV0IixudWxsLG4sYyksZC5wdXNoKHtldmVudDpjLGxpc3RlbmVyczp1fSksYy5kYXRhPUMpKX1ZMShkLHQpfSl9ZnVuY3Rpb24gdGEoZSx0LG4pe3JldHVybntpbnN0YW5jZTplLGxpc3RlbmVyOnQsY3VycmVudFRhcmdldDpufX1mdW5jdGlvbiBYdShlLHQpe2Zvcih2YXIgbj10KyJDYXB0dXJlIixyPVtdO2UhPT1udWxsOyl7dmFyIG89ZSxpPW8uc3RhdGVOb2RlO28udGFnPT09NSYmaSE9PW51bGwmJihvPWksaT1ZcyhlLG4pLGkhPW51bGwmJnIudW5zaGlmdCh0YShlLGksbykpLGk9WXMoZSx0KSxpIT1udWxsJiZyLnB1c2godGEoZSxpLG8pKSksZT1lLnJldHVybn1yZXR1cm4gcn1mdW5jdGlvbiBQaShlKXtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtkbyBlPWUucmV0dXJuO3doaWxlKGUmJmUudGFnIT09NSk7cmV0dXJuIGV8fG51bGx9ZnVuY3Rpb24gaHYoZSx0LG4scixvKXtmb3IodmFyIGk9dC5fcmVhY3ROYW1lLGw9W107biE9PW51bGwmJm4hPT1yOyl7dmFyIHM9bixhPXMuYWx0ZXJuYXRlLHU9cy5zdGF0ZU5vZGU7aWYoYSE9PW51bGwmJmE9PT1yKWJyZWFrO3MudGFnPT09NSYmdSE9PW51bGwmJihzPXUsbz8oYT1ZcyhuLGkpLGEhPW51bGwmJmwudW5zaGlmdCh0YShuLGEscykpKTpvfHwoYT1ZcyhuLGkpLGEhPW51bGwmJmwucHVzaCh0YShuLGEscykpKSksbj1uLnJldHVybn1sLmxlbmd0aCE9PTAmJmUucHVzaCh7ZXZlbnQ6dCxsaXN0ZW5lcnM6bH0pfXZhciBpaz0vXHJcbj8vZyxsaz0vXHUwMDAwfFx1RkZGRC9nO2Z1bmN0aW9uIHB2KGUpe3JldHVybih0eXBlb2YgZT09InN0cmluZyI/ZToiIitlKS5yZXBsYWNlKGlrLGAKYCkucmVwbGFjZShsaywiIil9ZnVuY3Rpb24gbnUoZSx0LG4pe2lmKHQ9cHYodCkscHYoZSkhPT10JiZuKXRocm93IEVycm9yKFcoNDI1KSl9ZnVuY3Rpb24gUXUoKXt9dmFyIHJoPW51bGwsb2g9bnVsbDtmdW5jdGlvbiBpaChlLHQpe3JldHVybiBlPT09InRleHRhcmVhInx8ZT09PSJub3NjcmlwdCJ8fHR5cGVvZiB0LmNoaWxkcmVuPT0ic3RyaW5nInx8dHlwZW9mIHQuY2hpbGRyZW49PSJudW1iZXIifHx0eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTD09Im9iamVjdCImJnQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPT1udWxsJiZ0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCE9bnVsbH12YXIgbGg9dHlwZW9mIHNldFRpbWVvdXQ9PSJmdW5jdGlvbiI/c2V0VGltZW91dDp2b2lkIDAsc2s9dHlwZW9mIGNsZWFyVGltZW91dD09ImZ1bmN0aW9uIj9jbGVhclRpbWVvdXQ6dm9pZCAwLGd2PXR5cGVvZiBQcm9taXNlPT0iZnVuY3Rpb24iP1Byb21pc2U6dm9pZCAwLGFrPXR5cGVvZiBxdWV1ZU1pY3JvdGFzaz09ImZ1bmN0aW9uIj9xdWV1ZU1pY3JvdGFzazp0eXBlb2YgZ3Y8InUiP2Z1bmN0aW9uKGUpe3JldHVybiBndi5yZXNvbHZlKG51bGwpLnRoZW4oZSkuY2F0Y2godWspfTpsaDtmdW5jdGlvbiB1ayhlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfWZ1bmN0aW9uIGVmKGUsdCl7dmFyIG49dCxyPTA7ZG97dmFyIG89bi5uZXh0U2libGluZztpZihlLnJlbW92ZUNoaWxkKG4pLG8mJm8ubm9kZVR5cGU9PT04KWlmKG49by5kYXRhLG49PT0iLyQiKXtpZihyPT09MCl7ZS5yZW1vdmVDaGlsZChvKSxKcyh0KTtyZXR1cm59ci0tfWVsc2UgbiE9PSIkIiYmbiE9PSIkPyImJm4hPT0iJCEifHxyKys7bj1vfXdoaWxlKG4pO0pzKHQpfWZ1bmN0aW9uIF9vKGUpe2Zvcig7ZSE9bnVsbDtlPWUubmV4dFNpYmxpbmcpe3ZhciB0PWUubm9kZVR5cGU7aWYodD09PTF8fHQ9PT0zKWJyZWFrO2lmKHQ9PT04KXtpZih0PWUuZGF0YSx0PT09IiQifHx0PT09IiQhInx8dD09PSIkPyIpYnJlYWs7aWYodD09PSIvJCIpcmV0dXJuIG51bGx9fXJldHVybiBlfWZ1bmN0aW9uIG12KGUpe2U9ZS5wcmV2aW91c1NpYmxpbmc7Zm9yKHZhciB0PTA7ZTspe2lmKGUubm9kZVR5cGU9PT04KXt2YXIgbj1lLmRhdGE7aWYobj09PSIkInx8bj09PSIkISJ8fG49PT0iJD8iKXtpZih0PT09MClyZXR1cm4gZTt0LS19ZWxzZSBuPT09Ii8kIiYmdCsrfWU9ZS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIEFsPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLHVyPSJfX3JlYWN0RmliZXIkIitBbCxuYT0iX19yZWFjdFByb3BzJCIrQWwsanI9Il9fcmVhY3RDb250YWluZXIkIitBbCxzaD0iX19yZWFjdEV2ZW50cyQiK0FsLGNrPSJfX3JlYWN0TGlzdGVuZXJzJCIrQWwsZGs9Il9fcmVhY3RIYW5kbGVzJCIrQWw7ZnVuY3Rpb24gUW8oZSl7dmFyIHQ9ZVt1cl07aWYodClyZXR1cm4gdDtmb3IodmFyIG49ZS5wYXJlbnROb2RlO247KXtpZih0PW5banJdfHxuW3VyXSl7aWYobj10LmFsdGVybmF0ZSx0LmNoaWxkIT09bnVsbHx8biE9PW51bGwmJm4uY2hpbGQhPT1udWxsKWZvcihlPW12KGUpO2UhPT1udWxsOyl7aWYobj1lW3VyXSlyZXR1cm4gbjtlPW12KGUpfXJldHVybiB0fWU9bixuPWUucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBiYShlKXtyZXR1cm4gZT1lW3VyXXx8ZVtqcl0sIWV8fGUudGFnIT09NSYmZS50YWchPT02JiZlLnRhZyE9PTEzJiZlLnRhZyE9PTM/bnVsbDplfWZ1bmN0aW9uIEdpKGUpe2lmKGUudGFnPT09NXx8ZS50YWc9PT02KXJldHVybiBlLnN0YXRlTm9kZTt0aHJvdyBFcnJvcihXKDMzKSl9ZnVuY3Rpb24gSGMoZSl7cmV0dXJuIGVbbmFdfHxudWxsfXZhciBhaD1bXSxZaT0tMTtmdW5jdGlvbiBqbyhlKXtyZXR1cm57Y3VycmVudDplfX1mdW5jdGlvbiBHZShlKXswPllpfHwoZS5jdXJyZW50PWFoW1lpXSxhaFtZaV09bnVsbCxZaS0tKX1mdW5jdGlvbiBGZShlLHQpe1lpKyssYWhbWWldPWUuY3VycmVudCxlLmN1cnJlbnQ9dH12YXIgTm89e30sS3Q9am8oTm8pLGNuPWpvKCExKSxzaT1ObztmdW5jdGlvbiBtbChlLHQpe3ZhciBuPWUudHlwZS5jb250ZXh0VHlwZXM7aWYoIW4pcmV0dXJuIE5vO3ZhciByPWUuc3RhdGVOb2RlO2lmKHImJnIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD09PXQpcmV0dXJuIHIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7dmFyIG89e30saTtmb3IoaSBpbiBuKW9baV09dFtpXTtyZXR1cm4gciYmKGU9ZS5zdGF0ZU5vZGUsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PXQsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1vKSxvfWZ1bmN0aW9uIGRuKGUpe3JldHVybiBlPWUuY2hpbGRDb250ZXh0VHlwZXMsZSE9bnVsbH1mdW5jdGlvbiBKdSgpe0dlKGNuKSxHZShLdCl9ZnVuY3Rpb24gdnYoZSx0LG4pe2lmKEt0LmN1cnJlbnQhPT1Obyl0aHJvdyBFcnJvcihXKDE2OCkpO0ZlKEt0LHQpLEZlKGNuLG4pfWZ1bmN0aW9uIFExKGUsdCxuKXt2YXIgcj1lLnN0YXRlTm9kZTtpZih0PXQuY2hpbGRDb250ZXh0VHlwZXMsdHlwZW9mIHIuZ2V0Q2hpbGRDb250ZXh0IT0iZnVuY3Rpb24iKXJldHVybiBuO3I9ci5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIG8gaW4gcilpZighKG8gaW4gdCkpdGhyb3cgRXJyb3IoVygxMDgsWEMoZSl8fCJVbmtub3duIixvKSk7cmV0dXJuIHR0KHt9LG4scil9ZnVuY3Rpb24gWnUoZSl7cmV0dXJuIGU9KGU9ZS5zdGF0ZU5vZGUpJiZlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0fHxObyxzaT1LdC5jdXJyZW50LEZlKEt0LGUpLEZlKGNuLGNuLmN1cnJlbnQpLCEwfWZ1bmN0aW9uIHl2KGUsdCxuKXt2YXIgcj1lLnN0YXRlTm9kZTtpZighcil0aHJvdyBFcnJvcihXKDE2OSkpO24/KGU9UTEoZSx0LHNpKSxyLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0PWUsR2UoY24pLEdlKEt0KSxGZShLdCxlKSk6R2UoY24pLEZlKGNuLG4pfXZhciBQcj1udWxsLEtjPSExLHRmPSExO2Z1bmN0aW9uIEoxKGUpe1ByPT09bnVsbD9Qcj1bZV06UHIucHVzaChlKX1mdW5jdGlvbiBmayhlKXtLYz0hMCxKMShlKX1mdW5jdGlvbiB6bygpe2lmKCF0ZiYmUHIhPT1udWxsKXt0Zj0hMDt2YXIgZT0wLHQ9UGU7dHJ5e3ZhciBuPVByO2ZvcihQZT0xO2U8bi5sZW5ndGg7ZSsrKXt2YXIgcj1uW2VdO2RvIHI9cighMCk7d2hpbGUociE9PW51bGwpfVByPW51bGwsS2M9ITF9Y2F0Y2gobyl7dGhyb3cgUHIhPT1udWxsJiYoUHI9UHIuc2xpY2UoZSsxKSksUzEoRnAsem8pLG99ZmluYWxseXtQZT10LHRmPSExfX1yZXR1cm4gbnVsbH12YXIgWGk9W10sUWk9MCxxdT1udWxsLGVjPTAsUG49W10sT249MCxhaT1udWxsLE1yPTEsRHI9IiI7ZnVuY3Rpb24gS28oZSx0KXtYaVtRaSsrXT1lYyxYaVtRaSsrXT1xdSxxdT1lLGVjPXR9ZnVuY3Rpb24gWjEoZSx0LG4pe1BuW09uKytdPU1yLFBuW09uKytdPURyLFBuW09uKytdPWFpLGFpPWU7dmFyIHI9TXI7ZT1Ecjt2YXIgbz0zMi1abihyKS0xO3ImPX4oMTw8byksbis9MTt2YXIgaT0zMi1abih0KStvO2lmKDMwPGkpe3ZhciBsPW8tbyU1O2k9KHImKDE8PGwpLTEpLnRvU3RyaW5nKDMyKSxyPj49bCxvLT1sLE1yPTE8PDMyLVpuKHQpK298bjw8b3xyLERyPWkrZX1lbHNlIE1yPTE8PGl8bjw8b3xyLERyPWV9ZnVuY3Rpb24gWHAoZSl7ZS5yZXR1cm4hPT1udWxsJiYoS28oZSwxKSxaMShlLDEsMCkpfWZ1bmN0aW9uIFFwKGUpe2Zvcig7ZT09PXF1OylxdT1YaVstLVFpXSxYaVtRaV09bnVsbCxlYz1YaVstLVFpXSxYaVtRaV09bnVsbDtmb3IoO2U9PT1haTspYWk9UG5bLS1Pbl0sUG5bT25dPW51bGwsRHI9UG5bLS1Pbl0sUG5bT25dPW51bGwsTXI9UG5bLS1Pbl0sUG5bT25dPW51bGx9dmFyIHhuPW51bGwseW49bnVsbCxZZT0hMSxYbj1udWxsO2Z1bmN0aW9uIHExKGUsdCl7dmFyIG49RG4oNSxudWxsLG51bGwsMCk7bi5lbGVtZW50VHlwZT0iREVMRVRFRCIsbi5zdGF0ZU5vZGU9dCxuLnJldHVybj1lLHQ9ZS5kZWxldGlvbnMsdD09PW51bGw/KGUuZGVsZXRpb25zPVtuXSxlLmZsYWdzfD0xNik6dC5wdXNoKG4pfWZ1bmN0aW9uIHh2KGUsdCl7c3dpdGNoKGUudGFnKXtjYXNlIDU6dmFyIG49ZS50eXBlO3JldHVybiB0PXQubm9kZVR5cGUhPT0xfHxuLnRvTG93ZXJDYXNlKCkhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/bnVsbDp0LHQhPT1udWxsPyhlLnN0YXRlTm9kZT10LHhuPWUseW49X28odC5maXJzdENoaWxkKSwhMCk6ITE7Y2FzZSA2OnJldHVybiB0PWUucGVuZGluZ1Byb3BzPT09IiJ8fHQubm9kZVR5cGUhPT0zP251bGw6dCx0IT09bnVsbD8oZS5zdGF0ZU5vZGU9dCx4bj1lLHluPW51bGwsITApOiExO2Nhc2UgMTM6cmV0dXJuIHQ9dC5ub2RlVHlwZSE9PTg/bnVsbDp0LHQhPT1udWxsPyhuPWFpIT09bnVsbD97aWQ6TXIsb3ZlcmZsb3c6RHJ9Om51bGwsZS5tZW1vaXplZFN0YXRlPXtkZWh5ZHJhdGVkOnQsdHJlZUNvbnRleHQ6bixyZXRyeUxhbmU6MTA3Mzc0MTgyNH0sbj1EbigxOCxudWxsLG51bGwsMCksbi5zdGF0ZU5vZGU9dCxuLnJldHVybj1lLGUuY2hpbGQ9bix4bj1lLHluPW51bGwsITApOiExO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIHVoKGUpe3JldHVybihlLm1vZGUmMSkhPT0wJiYoZS5mbGFncyYxMjgpPT09MH1mdW5jdGlvbiBjaChlKXtpZihZZSl7dmFyIHQ9eW47aWYodCl7dmFyIG49dDtpZigheHYoZSx0KSl7aWYodWgoZSkpdGhyb3cgRXJyb3IoVyg0MTgpKTt0PV9vKG4ubmV4dFNpYmxpbmcpO3ZhciByPXhuO3QmJnh2KGUsdCk/cTEocixuKTooZS5mbGFncz1lLmZsYWdzJi00MDk3fDIsWWU9ITEseG49ZSl9fWVsc2V7aWYodWgoZSkpdGhyb3cgRXJyb3IoVyg0MTgpKTtlLmZsYWdzPWUuZmxhZ3MmLTQwOTd8MixZZT0hMSx4bj1lfX19ZnVuY3Rpb24gX3YoZSl7Zm9yKGU9ZS5yZXR1cm47ZSE9PW51bGwmJmUudGFnIT09NSYmZS50YWchPT0zJiZlLnRhZyE9PTEzOyllPWUucmV0dXJuO3huPWV9ZnVuY3Rpb24gcnUoZSl7aWYoZSE9PXhuKXJldHVybiExO2lmKCFZZSlyZXR1cm4gX3YoZSksWWU9ITAsITE7dmFyIHQ7aWYoKHQ9ZS50YWchPT0zKSYmISh0PWUudGFnIT09NSkmJih0PWUudHlwZSx0PXQhPT0iaGVhZCImJnQhPT0iYm9keSImJiFpaChlLnR5cGUsZS5tZW1vaXplZFByb3BzKSksdCYmKHQ9eW4pKXtpZih1aChlKSl0aHJvdyBleCgpLEVycm9yKFcoNDE4KSk7Zm9yKDt0OylxMShlLHQpLHQ9X28odC5uZXh0U2libGluZyl9aWYoX3YoZSksZS50YWc9PT0xMyl7aWYoZT1lLm1lbW9pemVkU3RhdGUsZT1lIT09bnVsbD9lLmRlaHlkcmF0ZWQ6bnVsbCwhZSl0aHJvdyBFcnJvcihXKDMxNykpO2U6e2ZvcihlPWUubmV4dFNpYmxpbmcsdD0wO2U7KXtpZihlLm5vZGVUeXBlPT09OCl7dmFyIG49ZS5kYXRhO2lmKG49PT0iLyQiKXtpZih0PT09MCl7eW49X28oZS5uZXh0U2libGluZyk7YnJlYWsgZX10LS19ZWxzZSBuIT09IiQiJiZuIT09IiQhIiYmbiE9PSIkPyJ8fHQrK31lPWUubmV4dFNpYmxpbmd9eW49bnVsbH19ZWxzZSB5bj14bj9fbyhlLnN0YXRlTm9kZS5uZXh0U2libGluZyk6bnVsbDtyZXR1cm4hMH1mdW5jdGlvbiBleCgpe2Zvcih2YXIgZT15bjtlOyllPV9vKGUubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIHZsKCl7eW49eG49bnVsbCxZZT0hMX1mdW5jdGlvbiBKcChlKXtYbj09PW51bGw/WG49W2VdOlhuLnB1c2goZSl9dmFyIGhrPVZyLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO2Z1bmN0aW9uIEtuKGUsdCl7aWYoZSYmZS5kZWZhdWx0UHJvcHMpe3Q9dHQoe30sdCksZT1lLmRlZmF1bHRQcm9wcztmb3IodmFyIG4gaW4gZSl0W25dPT09dm9pZCAwJiYodFtuXT1lW25dKTtyZXR1cm4gdH1yZXR1cm4gdH12YXIgdGM9am8obnVsbCksbmM9bnVsbCxKaT1udWxsLFpwPW51bGw7ZnVuY3Rpb24gcXAoKXtacD1KaT1uYz1udWxsfWZ1bmN0aW9uIGVnKGUpe3ZhciB0PXRjLmN1cnJlbnQ7R2UodGMpLGUuX2N1cnJlbnRWYWx1ZT10fWZ1bmN0aW9uIGRoKGUsdCxuKXtmb3IoO2UhPT1udWxsOyl7dmFyIHI9ZS5hbHRlcm5hdGU7aWYoKGUuY2hpbGRMYW5lcyZ0KSE9PXQ/KGUuY2hpbGRMYW5lc3w9dCxyIT09bnVsbCYmKHIuY2hpbGRMYW5lc3w9dCkpOnIhPT1udWxsJiYoci5jaGlsZExhbmVzJnQpIT09dCYmKHIuY2hpbGRMYW5lc3w9dCksZT09PW4pYnJlYWs7ZT1lLnJldHVybn19ZnVuY3Rpb24gYWwoZSx0KXtuYz1lLFpwPUppPW51bGwsZT1lLmRlcGVuZGVuY2llcyxlIT09bnVsbCYmZS5maXJzdENvbnRleHQhPT1udWxsJiYoZS5sYW5lcyZ0JiYodW49ITApLGUuZmlyc3RDb250ZXh0PW51bGwpfWZ1bmN0aW9uIGpuKGUpe3ZhciB0PWUuX2N1cnJlbnRWYWx1ZTtpZihacCE9PWUpaWYoZT17Y29udGV4dDplLG1lbW9pemVkVmFsdWU6dCxuZXh0Om51bGx9LEppPT09bnVsbCl7aWYobmM9PT1udWxsKXRocm93IEVycm9yKFcoMzA4KSk7Smk9ZSxuYy5kZXBlbmRlbmNpZXM9e2xhbmVzOjAsZmlyc3RDb250ZXh0OmV9fWVsc2UgSmk9SmkubmV4dD1lO3JldHVybiB0fXZhciBKbz1udWxsO2Z1bmN0aW9uIHRnKGUpe0pvPT09bnVsbD9Kbz1bZV06Sm8ucHVzaChlKX1mdW5jdGlvbiB0eChlLHQsbixyKXt2YXIgbz10LmludGVybGVhdmVkO3JldHVybiBvPT09bnVsbD8obi5uZXh0PW4sdGcodCkpOihuLm5leHQ9by5uZXh0LG8ubmV4dD1uKSx0LmludGVybGVhdmVkPW4senIoZSxyKX1mdW5jdGlvbiB6cihlLHQpe2UubGFuZXN8PXQ7dmFyIG49ZS5hbHRlcm5hdGU7Zm9yKG4hPT1udWxsJiYobi5sYW5lc3w9dCksbj1lLGU9ZS5yZXR1cm47ZSE9PW51bGw7KWUuY2hpbGRMYW5lc3w9dCxuPWUuYWx0ZXJuYXRlLG4hPT1udWxsJiYobi5jaGlsZExhbmVzfD10KSxuPWUsZT1lLnJldHVybjtyZXR1cm4gbi50YWc9PT0zP24uc3RhdGVOb2RlOm51bGx9dmFyIHNvPSExO2Z1bmN0aW9uIG5nKGUpe2UudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTplLm1lbW9pemVkU3RhdGUsZmlyc3RCYXNlVXBkYXRlOm51bGwsbGFzdEJhc2VVcGRhdGU6bnVsbCxzaGFyZWQ6e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjB9LGVmZmVjdHM6bnVsbH19ZnVuY3Rpb24gbngoZSx0KXtlPWUudXBkYXRlUXVldWUsdC51cGRhdGVRdWV1ZT09PWUmJih0LnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6ZS5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmUuZmlyc3RCYXNlVXBkYXRlLGxhc3RCYXNlVXBkYXRlOmUubGFzdEJhc2VVcGRhdGUsc2hhcmVkOmUuc2hhcmVkLGVmZmVjdHM6ZS5lZmZlY3RzfSl9ZnVuY3Rpb24gTHIoZSx0KXtyZXR1cm57ZXZlbnRUaW1lOmUsbGFuZTp0LHRhZzowLHBheWxvYWQ6bnVsbCxjYWxsYmFjazpudWxsLG5leHQ6bnVsbH19ZnVuY3Rpb24gd28oZSx0LG4pe3ZhciByPWUudXBkYXRlUXVldWU7aWYocj09PW51bGwpcmV0dXJuIG51bGw7aWYocj1yLnNoYXJlZCxDZSYyKXt2YXIgbz1yLnBlbmRpbmc7cmV0dXJuIG89PT1udWxsP3QubmV4dD10Oih0Lm5leHQ9by5uZXh0LG8ubmV4dD10KSxyLnBlbmRpbmc9dCx6cihlLG4pfXJldHVybiBvPXIuaW50ZXJsZWF2ZWQsbz09PW51bGw/KHQubmV4dD10LHRnKHIpKToodC5uZXh0PW8ubmV4dCxvLm5leHQ9dCksci5pbnRlcmxlYXZlZD10LHpyKGUsbil9ZnVuY3Rpb24gVHUoZSx0LG4pe2lmKHQ9dC51cGRhdGVRdWV1ZSx0IT09bnVsbCYmKHQ9dC5zaGFyZWQsKG4mNDE5NDI0MCkhPT0wKSl7dmFyIHI9dC5sYW5lcztyJj1lLnBlbmRpbmdMYW5lcyxufD1yLHQubGFuZXM9bixCcChlLG4pfX1mdW5jdGlvbiB3dihlLHQpe3ZhciBuPWUudXBkYXRlUXVldWUscj1lLmFsdGVybmF0ZTtpZihyIT09bnVsbCYmKHI9ci51cGRhdGVRdWV1ZSxuPT09cikpe3ZhciBvPW51bGwsaT1udWxsO2lmKG49bi5maXJzdEJhc2VVcGRhdGUsbiE9PW51bGwpe2Rve3ZhciBsPXtldmVudFRpbWU6bi5ldmVudFRpbWUsbGFuZTpuLmxhbmUsdGFnOm4udGFnLHBheWxvYWQ6bi5wYXlsb2FkLGNhbGxiYWNrOm4uY2FsbGJhY2ssbmV4dDpudWxsfTtpPT09bnVsbD9vPWk9bDppPWkubmV4dD1sLG49bi5uZXh0fXdoaWxlKG4hPT1udWxsKTtpPT09bnVsbD9vPWk9dDppPWkubmV4dD10fWVsc2Ugbz1pPXQ7bj17YmFzZVN0YXRlOnIuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpvLGxhc3RCYXNlVXBkYXRlOmksc2hhcmVkOnIuc2hhcmVkLGVmZmVjdHM6ci5lZmZlY3RzfSxlLnVwZGF0ZVF1ZXVlPW47cmV0dXJufWU9bi5sYXN0QmFzZVVwZGF0ZSxlPT09bnVsbD9uLmZpcnN0QmFzZVVwZGF0ZT10OmUubmV4dD10LG4ubGFzdEJhc2VVcGRhdGU9dH1mdW5jdGlvbiByYyhlLHQsbixyKXt2YXIgbz1lLnVwZGF0ZVF1ZXVlO3NvPSExO3ZhciBpPW8uZmlyc3RCYXNlVXBkYXRlLGw9by5sYXN0QmFzZVVwZGF0ZSxzPW8uc2hhcmVkLnBlbmRpbmc7aWYocyE9PW51bGwpe28uc2hhcmVkLnBlbmRpbmc9bnVsbDt2YXIgYT1zLHU9YS5uZXh0O2EubmV4dD1udWxsLGw9PT1udWxsP2k9dTpsLm5leHQ9dSxsPWE7dmFyIGM9ZS5hbHRlcm5hdGU7YyE9PW51bGwmJihjPWMudXBkYXRlUXVldWUscz1jLmxhc3RCYXNlVXBkYXRlLHMhPT1sJiYocz09PW51bGw/Yy5maXJzdEJhc2VVcGRhdGU9dTpzLm5leHQ9dSxjLmxhc3RCYXNlVXBkYXRlPWEpKX1pZihpIT09bnVsbCl7dmFyIGQ9by5iYXNlU3RhdGU7bD0wLGM9dT1hPW51bGwscz1pO2Rve3ZhciBmPXMubGFuZSxoPXMuZXZlbnRUaW1lO2lmKChyJmYpPT09Zil7YyE9PW51bGwmJihjPWMubmV4dD17ZXZlbnRUaW1lOmgsbGFuZTowLHRhZzpzLnRhZyxwYXlsb2FkOnMucGF5bG9hZCxjYWxsYmFjazpzLmNhbGxiYWNrLG5leHQ6bnVsbH0pO2U6e3ZhciBnPWUsbT1zO3N3aXRjaChmPXQsaD1uLG0udGFnKXtjYXNlIDE6aWYoZz1tLnBheWxvYWQsdHlwZW9mIGc9PSJmdW5jdGlvbiIpe2Q9Zy5jYWxsKGgsZCxmKTticmVhayBlfWQ9ZzticmVhayBlO2Nhc2UgMzpnLmZsYWdzPWcuZmxhZ3MmLTY1NTM3fDEyODtjYXNlIDA6aWYoZz1tLnBheWxvYWQsZj10eXBlb2YgZz09ImZ1bmN0aW9uIj9nLmNhbGwoaCxkLGYpOmcsZj09bnVsbClicmVhayBlO2Q9dHQoe30sZCxmKTticmVhayBlO2Nhc2UgMjpzbz0hMH19cy5jYWxsYmFjayE9PW51bGwmJnMubGFuZSE9PTAmJihlLmZsYWdzfD02NCxmPW8uZWZmZWN0cyxmPT09bnVsbD9vLmVmZmVjdHM9W3NdOmYucHVzaChzKSl9ZWxzZSBoPXtldmVudFRpbWU6aCxsYW5lOmYsdGFnOnMudGFnLHBheWxvYWQ6cy5wYXlsb2FkLGNhbGxiYWNrOnMuY2FsbGJhY2ssbmV4dDpudWxsfSxjPT09bnVsbD8odT1jPWgsYT1kKTpjPWMubmV4dD1oLGx8PWY7aWYocz1zLm5leHQscz09PW51bGwpe2lmKHM9by5zaGFyZWQucGVuZGluZyxzPT09bnVsbClicmVhaztmPXMscz1mLm5leHQsZi5uZXh0PW51bGwsby5sYXN0QmFzZVVwZGF0ZT1mLG8uc2hhcmVkLnBlbmRpbmc9bnVsbH19d2hpbGUoMSk7aWYoYz09PW51bGwmJihhPWQpLG8uYmFzZVN0YXRlPWEsby5maXJzdEJhc2VVcGRhdGU9dSxvLmxhc3RCYXNlVXBkYXRlPWMsdD1vLnNoYXJlZC5pbnRlcmxlYXZlZCx0IT09bnVsbCl7bz10O2RvIGx8PW8ubGFuZSxvPW8ubmV4dDt3aGlsZShvIT09dCl9ZWxzZSBpPT09bnVsbCYmKG8uc2hhcmVkLmxhbmVzPTApO2NpfD1sLGUubGFuZXM9bCxlLm1lbW9pemVkU3RhdGU9ZH19ZnVuY3Rpb24gU3YoZSx0LG4pe2lmKGU9dC5lZmZlY3RzLHQuZWZmZWN0cz1udWxsLGUhPT1udWxsKWZvcih0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF0sbz1yLmNhbGxiYWNrO2lmKG8hPT1udWxsKXtpZihyLmNhbGxiYWNrPW51bGwscj1uLHR5cGVvZiBvIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMTkxLG8pKTtvLmNhbGwocil9fX12YXIgcng9bmV3IHQxLkNvbXBvbmVudCgpLnJlZnM7ZnVuY3Rpb24gZmgoZSx0LG4scil7dD1lLm1lbW9pemVkU3RhdGUsbj1uKHIsdCksbj1uPT1udWxsP3Q6dHQoe30sdCxuKSxlLm1lbW9pemVkU3RhdGU9bixlLmxhbmVzPT09MCYmKGUudXBkYXRlUXVldWUuYmFzZVN0YXRlPW4pfXZhciBHYz17aXNNb3VudGVkOmZ1bmN0aW9uKGUpe3JldHVybihlPWUuX3JlYWN0SW50ZXJuYWxzKT94aShlKT09PWU6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihlLHQsbil7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgcj10bigpLG89RW8oZSksaT1McihyLG8pO2kucGF5bG9hZD10LG4hPW51bGwmJihpLmNhbGxiYWNrPW4pLHQ9d28oZSxpLG8pLHQhPT1udWxsJiYocW4odCxlLG8sciksVHUodCxlLG8pKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihlLHQsbil7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgcj10bigpLG89RW8oZSksaT1McihyLG8pO2kudGFnPTEsaS5wYXlsb2FkPXQsbiE9bnVsbCYmKGkuY2FsbGJhY2s9biksdD13byhlLGksbyksdCE9PW51bGwmJihxbih0LGUsbyxyKSxUdSh0LGUsbykpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oZSx0KXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciBuPXRuKCkscj1FbyhlKSxvPUxyKG4scik7by50YWc9Mix0IT1udWxsJiYoby5jYWxsYmFjaz10KSx0PXdvKGUsbyxyKSx0IT09bnVsbCYmKHFuKHQsZSxyLG4pLFR1KHQsZSxyKSl9fTtmdW5jdGlvbiBFdihlLHQsbixyLG8saSxsKXtyZXR1cm4gZT1lLnN0YXRlTm9kZSx0eXBlb2YgZS5zaG91bGRDb21wb25lbnRVcGRhdGU9PSJmdW5jdGlvbiI/ZS5zaG91bGRDb21wb25lbnRVcGRhdGUocixpLGwpOnQucHJvdG90eXBlJiZ0LnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD8hcXMobixyKXx8IXFzKG8saSk6ITB9ZnVuY3Rpb24gb3goZSx0LG4pe3ZhciByPSExLG89Tm8saT10LmNvbnRleHRUeXBlO3JldHVybiB0eXBlb2YgaT09Im9iamVjdCImJmkhPT1udWxsP2k9am4oaSk6KG89ZG4odCk/c2k6S3QuY3VycmVudCxyPXQuY29udGV4dFR5cGVzLGk9KHI9ciE9bnVsbCk/bWwoZSxvKTpObyksdD1uZXcgdChuLGkpLGUubWVtb2l6ZWRTdGF0ZT10LnN0YXRlIT09bnVsbCYmdC5zdGF0ZSE9PXZvaWQgMD90LnN0YXRlOm51bGwsdC51cGRhdGVyPUdjLGUuc3RhdGVOb2RlPXQsdC5fcmVhY3RJbnRlcm5hbHM9ZSxyJiYoZT1lLnN0YXRlTm9kZSxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9byxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWkpLHR9ZnVuY3Rpb24gQ3YoZSx0LG4scil7ZT10LnN0YXRlLHR5cGVvZiB0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM9PSJmdW5jdGlvbiImJnQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuLHIpLHR5cGVvZiB0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPT0iZnVuY3Rpb24iJiZ0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG4sciksdC5zdGF0ZSE9PWUmJkdjLmVucXVldWVSZXBsYWNlU3RhdGUodCx0LnN0YXRlLG51bGwpfWZ1bmN0aW9uIGhoKGUsdCxuLHIpe3ZhciBvPWUuc3RhdGVOb2RlO28ucHJvcHM9bixvLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxvLnJlZnM9cngsbmcoZSk7dmFyIGk9dC5jb250ZXh0VHlwZTt0eXBlb2YgaT09Im9iamVjdCImJmkhPT1udWxsP28uY29udGV4dD1qbihpKTooaT1kbih0KT9zaTpLdC5jdXJyZW50LG8uY29udGV4dD1tbChlLGkpKSxvLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxpPXQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHR5cGVvZiBpPT0iZnVuY3Rpb24iJiYoZmgoZSx0LGksbiksby5zdGF0ZT1lLm1lbW9pemVkU3RhdGUpLHR5cGVvZiB0LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz09ImZ1bmN0aW9uInx8dHlwZW9mIG8uZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiJ8fHR5cGVvZiBvLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiImJnR5cGVvZiBvLmNvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uInx8KHQ9by5zdGF0ZSx0eXBlb2Ygby5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJm8uY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIG8uVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmby5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksdCE9PW8uc3RhdGUmJkdjLmVucXVldWVSZXBsYWNlU3RhdGUobyxvLnN0YXRlLG51bGwpLHJjKGUsbixvLHIpLG8uc3RhdGU9ZS5tZW1vaXplZFN0YXRlKSx0eXBlb2Ygby5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKGUuZmxhZ3N8PTQxOTQzMDgpfWZ1bmN0aW9uIG9zKGUsdCxuKXtpZihlPW4ucmVmLGUhPT1udWxsJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uIiYmdHlwZW9mIGUhPSJvYmplY3QiKXtpZihuLl9vd25lcil7aWYobj1uLl9vd25lcixuKXtpZihuLnRhZyE9PTEpdGhyb3cgRXJyb3IoVygzMDkpKTt2YXIgcj1uLnN0YXRlTm9kZX1pZighcil0aHJvdyBFcnJvcihXKDE0NyxlKSk7dmFyIG89cixpPSIiK2U7cmV0dXJuIHQhPT1udWxsJiZ0LnJlZiE9PW51bGwmJnR5cGVvZiB0LnJlZj09ImZ1bmN0aW9uIiYmdC5yZWYuX3N0cmluZ1JlZj09PWk/dC5yZWY6KHQ9ZnVuY3Rpb24obCl7dmFyIHM9by5yZWZzO3M9PT1yeCYmKHM9by5yZWZzPXt9KSxsPT09bnVsbD9kZWxldGUgc1tpXTpzW2ldPWx9LHQuX3N0cmluZ1JlZj1pLHQpfWlmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBFcnJvcihXKDI4NCkpO2lmKCFuLl9vd25lcil0aHJvdyBFcnJvcihXKDI5MCxlKSl9cmV0dXJuIGV9ZnVuY3Rpb24gb3UoZSx0KXt0aHJvdyBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSxFcnJvcihXKDMxLGU9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyh0KS5qb2luKCIsICIpKyJ9IjplKSl9ZnVuY3Rpb24gJHYoZSl7dmFyIHQ9ZS5faW5pdDtyZXR1cm4gdChlLl9wYXlsb2FkKX1mdW5jdGlvbiBpeChlKXtmdW5jdGlvbiB0KHYseSl7aWYoZSl7dmFyIHg9di5kZWxldGlvbnM7eD09PW51bGw/KHYuZGVsZXRpb25zPVt5XSx2LmZsYWdzfD0xNik6eC5wdXNoKHkpfX1mdW5jdGlvbiBuKHYseSl7aWYoIWUpcmV0dXJuIG51bGw7Zm9yKDt5IT09bnVsbDspdCh2LHkpLHk9eS5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHIodix5KXtmb3Iodj1uZXcgTWFwO3khPT1udWxsOyl5LmtleSE9PW51bGw/di5zZXQoeS5rZXkseSk6di5zZXQoeS5pbmRleCx5KSx5PXkuc2libGluZztyZXR1cm4gdn1mdW5jdGlvbiBvKHYseSl7cmV0dXJuIHY9Q28odix5KSx2LmluZGV4PTAsdi5zaWJsaW5nPW51bGwsdn1mdW5jdGlvbiBpKHYseSx4KXtyZXR1cm4gdi5pbmRleD14LGU/KHg9di5hbHRlcm5hdGUseCE9PW51bGw/KHg9eC5pbmRleCx4PHk/KHYuZmxhZ3N8PTIseSk6eCk6KHYuZmxhZ3N8PTIseSkpOih2LmZsYWdzfD0xMDQ4NTc2LHkpfWZ1bmN0aW9uIGwodil7cmV0dXJuIGUmJnYuYWx0ZXJuYXRlPT09bnVsbCYmKHYuZmxhZ3N8PTIpLHZ9ZnVuY3Rpb24gcyh2LHkseCxfKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nj8oeT11Zih4LHYubW9kZSxfKSx5LnJldHVybj12LHkpOih5PW8oeSx4KSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGEodix5LHgsXyl7dmFyIEU9eC50eXBlO3JldHVybiBFPT09VWk/Yyh2LHkseC5wcm9wcy5jaGlsZHJlbixfLHgua2V5KTp5IT09bnVsbCYmKHkuZWxlbWVudFR5cGU9PT1FfHx0eXBlb2YgRT09Im9iamVjdCImJkUhPT1udWxsJiZFLiQkdHlwZW9mPT09bG8mJiR2KEUpPT09eS50eXBlKT8oXz1vKHkseC5wcm9wcyksXy5yZWY9b3Modix5LHgpLF8ucmV0dXJuPXYsXyk6KF89QXUoeC50eXBlLHgua2V5LHgucHJvcHMsbnVsbCx2Lm1vZGUsXyksXy5yZWY9b3Modix5LHgpLF8ucmV0dXJuPXYsXyl9ZnVuY3Rpb24gdSh2LHkseCxfKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09NHx8eS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PXguY29udGFpbmVySW5mb3x8eS5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT14LmltcGxlbWVudGF0aW9uPyh5PWNmKHgsdi5tb2RlLF8pLHkucmV0dXJuPXYseSk6KHk9byh5LHguY2hpbGRyZW58fFtdKSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGModix5LHgsXyxFKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nz8oeT1uaSh4LHYubW9kZSxfLEUpLHkucmV0dXJuPXYseSk6KHk9byh5LHgpLHkucmV0dXJuPXYseSl9ZnVuY3Rpb24gZCh2LHkseCl7aWYodHlwZW9mIHk9PSJzdHJpbmciJiZ5IT09IiJ8fHR5cGVvZiB5PT0ibnVtYmVyIilyZXR1cm4geT11ZigiIit5LHYubW9kZSx4KSx5LnJldHVybj12LHk7aWYodHlwZW9mIHk9PSJvYmplY3QiJiZ5IT09bnVsbCl7c3dpdGNoKHkuJCR0eXBlb2Ype2Nhc2UgR2E6cmV0dXJuIHg9QXUoeS50eXBlLHkua2V5LHkucHJvcHMsbnVsbCx2Lm1vZGUseCkseC5yZWY9b3ModixudWxsLHkpLHgucmV0dXJuPXYseDtjYXNlIFdpOnJldHVybiB5PWNmKHksdi5tb2RlLHgpLHkucmV0dXJuPXYseTtjYXNlIGxvOnZhciBfPXkuX2luaXQ7cmV0dXJuIGQodixfKHkuX3BheWxvYWQpLHgpfWlmKGdzKHkpfHxxbCh5KSlyZXR1cm4geT1uaSh5LHYubW9kZSx4LG51bGwpLHkucmV0dXJuPXYseTtvdSh2LHkpfXJldHVybiBudWxsfWZ1bmN0aW9uIGYodix5LHgsXyl7dmFyIEU9eSE9PW51bGw/eS5rZXk6bnVsbDtpZih0eXBlb2YgeD09InN0cmluZyImJnghPT0iInx8dHlwZW9mIHg9PSJudW1iZXIiKXJldHVybiBFIT09bnVsbD9udWxsOnModix5LCIiK3gsXyk7aWYodHlwZW9mIHg9PSJvYmplY3QiJiZ4IT09bnVsbCl7c3dpdGNoKHguJCR0eXBlb2Ype2Nhc2UgR2E6cmV0dXJuIHgua2V5PT09RT9hKHYseSx4LF8pOm51bGw7Y2FzZSBXaTpyZXR1cm4geC5rZXk9PT1FP3Uodix5LHgsXyk6bnVsbDtjYXNlIGxvOnJldHVybiBFPXguX2luaXQsZih2LHksRSh4Ll9wYXlsb2FkKSxfKX1pZihncyh4KXx8cWwoeCkpcmV0dXJuIEUhPT1udWxsP251bGw6Yyh2LHkseCxfLG51bGwpO291KHYseCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaCh2LHkseCxfLEUpe2lmKHR5cGVvZiBfPT0ic3RyaW5nIiYmXyE9PSIifHx0eXBlb2YgXz09Im51bWJlciIpcmV0dXJuIHY9di5nZXQoeCl8fG51bGwscyh5LHYsIiIrXyxFKTtpZih0eXBlb2YgXz09Im9iamVjdCImJl8hPT1udWxsKXtzd2l0Y2goXy4kJHR5cGVvZil7Y2FzZSBHYTpyZXR1cm4gdj12LmdldChfLmtleT09PW51bGw/eDpfLmtleSl8fG51bGwsYSh5LHYsXyxFKTtjYXNlIFdpOnJldHVybiB2PXYuZ2V0KF8ua2V5PT09bnVsbD94Ol8ua2V5KXx8bnVsbCx1KHksdixfLEUpO2Nhc2UgbG86dmFyICQ9Xy5faW5pdDtyZXR1cm4gaCh2LHkseCwkKF8uX3BheWxvYWQpLEUpfWlmKGdzKF8pfHxxbChfKSlyZXR1cm4gdj12LmdldCh4KXx8bnVsbCxjKHksdixfLEUsbnVsbCk7b3UoeSxfKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBnKHYseSx4LF8pe2Zvcih2YXIgRT1udWxsLCQ9bnVsbCxDPXksVD15PTAsTT1udWxsO0MhPT1udWxsJiZUPHgubGVuZ3RoO1QrKyl7Qy5pbmRleD5UPyhNPUMsQz1udWxsKTpNPUMuc2libGluZzt2YXIgUj1mKHYsQyx4W1RdLF8pO2lmKFI9PT1udWxsKXtDPT09bnVsbCYmKEM9TSk7YnJlYWt9ZSYmQyYmUi5hbHRlcm5hdGU9PT1udWxsJiZ0KHYsQykseT1pKFIseSxUKSwkPT09bnVsbD9FPVI6JC5zaWJsaW5nPVIsJD1SLEM9TX1pZihUPT09eC5sZW5ndGgpcmV0dXJuIG4odixDKSxZZSYmS28odixUKSxFO2lmKEM9PT1udWxsKXtmb3IoO1Q8eC5sZW5ndGg7VCsrKUM9ZCh2LHhbVF0sXyksQyE9PW51bGwmJih5PWkoQyx5LFQpLCQ9PT1udWxsP0U9QzokLnNpYmxpbmc9QywkPUMpO3JldHVybiBZZSYmS28odixUKSxFfWZvcihDPXIodixDKTtUPHgubGVuZ3RoO1QrKylNPWgoQyx2LFQseFtUXSxfKSxNIT09bnVsbCYmKGUmJk0uYWx0ZXJuYXRlIT09bnVsbCYmQy5kZWxldGUoTS5rZXk9PT1udWxsP1Q6TS5rZXkpLHk9aShNLHksVCksJD09PW51bGw/RT1NOiQuc2libGluZz1NLCQ9TSk7cmV0dXJuIGUmJkMuZm9yRWFjaChmdW5jdGlvbihqKXtyZXR1cm4gdCh2LGopfSksWWUmJktvKHYsVCksRX1mdW5jdGlvbiBtKHYseSx4LF8pe3ZhciBFPXFsKHgpO2lmKHR5cGVvZiBFIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMTUwKSk7aWYoeD1FLmNhbGwoeCkseD09bnVsbCl0aHJvdyBFcnJvcihXKDE1MSkpO2Zvcih2YXIgJD1FPW51bGwsQz15LFQ9eT0wLE09bnVsbCxSPXgubmV4dCgpO0MhPT1udWxsJiYhUi5kb25lO1QrKyxSPXgubmV4dCgpKXtDLmluZGV4PlQ/KE09QyxDPW51bGwpOk09Qy5zaWJsaW5nO3ZhciBqPWYodixDLFIudmFsdWUsXyk7aWYoaj09PW51bGwpe0M9PT1udWxsJiYoQz1NKTticmVha31lJiZDJiZqLmFsdGVybmF0ZT09PW51bGwmJnQodixDKSx5PWkoaix5LFQpLCQ9PT1udWxsP0U9ajokLnNpYmxpbmc9aiwkPWosQz1NfWlmKFIuZG9uZSlyZXR1cm4gbih2LEMpLFllJiZLbyh2LFQpLEU7aWYoQz09PW51bGwpe2Zvcig7IVIuZG9uZTtUKyssUj14Lm5leHQoKSlSPWQodixSLnZhbHVlLF8pLFIhPT1udWxsJiYoeT1pKFIseSxUKSwkPT09bnVsbD9FPVI6JC5zaWJsaW5nPVIsJD1SKTtyZXR1cm4gWWUmJktvKHYsVCksRX1mb3IoQz1yKHYsQyk7IVIuZG9uZTtUKyssUj14Lm5leHQoKSlSPWgoQyx2LFQsUi52YWx1ZSxfKSxSIT09bnVsbCYmKGUmJlIuYWx0ZXJuYXRlIT09bnVsbCYmQy5kZWxldGUoUi5rZXk9PT1udWxsP1Q6Ui5rZXkpLHk9aShSLHksVCksJD09PW51bGw/RT1SOiQuc2libGluZz1SLCQ9Uik7cmV0dXJuIGUmJkMuZm9yRWFjaChmdW5jdGlvbihGKXtyZXR1cm4gdCh2LEYpfSksWWUmJktvKHYsVCksRX1mdW5jdGlvbiBTKHYseSx4LF8pe2lmKHR5cGVvZiB4PT0ib2JqZWN0IiYmeCE9PW51bGwmJngudHlwZT09PVVpJiZ4LmtleT09PW51bGwmJih4PXgucHJvcHMuY2hpbGRyZW4pLHR5cGVvZiB4PT0ib2JqZWN0IiYmeCE9PW51bGwpe3N3aXRjaCh4LiQkdHlwZW9mKXtjYXNlIEdhOmU6e2Zvcih2YXIgRT14LmtleSwkPXk7JCE9PW51bGw7KXtpZigkLmtleT09PUUpe2lmKEU9eC50eXBlLEU9PT1VaSl7aWYoJC50YWc9PT03KXtuKHYsJC5zaWJsaW5nKSx5PW8oJCx4LnByb3BzLmNoaWxkcmVuKSx5LnJldHVybj12LHY9eTticmVhayBlfX1lbHNlIGlmKCQuZWxlbWVudFR5cGU9PT1FfHx0eXBlb2YgRT09Im9iamVjdCImJkUhPT1udWxsJiZFLiQkdHlwZW9mPT09bG8mJiR2KEUpPT09JC50eXBlKXtuKHYsJC5zaWJsaW5nKSx5PW8oJCx4LnByb3BzKSx5LnJlZj1vcyh2LCQseCkseS5yZXR1cm49dix2PXk7YnJlYWsgZX1uKHYsJCk7YnJlYWt9ZWxzZSB0KHYsJCk7JD0kLnNpYmxpbmd9eC50eXBlPT09VWk/KHk9bmkoeC5wcm9wcy5jaGlsZHJlbix2Lm1vZGUsXyx4LmtleSkseS5yZXR1cm49dix2PXkpOihfPUF1KHgudHlwZSx4LmtleSx4LnByb3BzLG51bGwsdi5tb2RlLF8pLF8ucmVmPW9zKHYseSx4KSxfLnJldHVybj12LHY9Xyl9cmV0dXJuIGwodik7Y2FzZSBXaTplOntmb3IoJD14LmtleTt5IT09bnVsbDspe2lmKHkua2V5PT09JClpZih5LnRhZz09PTQmJnkuc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT14LmNvbnRhaW5lckluZm8mJnkuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09eC5pbXBsZW1lbnRhdGlvbil7bih2LHkuc2libGluZykseT1vKHkseC5jaGlsZHJlbnx8W10pLHkucmV0dXJuPXYsdj15O2JyZWFrIGV9ZWxzZXtuKHYseSk7YnJlYWt9ZWxzZSB0KHYseSk7eT15LnNpYmxpbmd9eT1jZih4LHYubW9kZSxfKSx5LnJldHVybj12LHY9eX1yZXR1cm4gbCh2KTtjYXNlIGxvOnJldHVybiAkPXguX2luaXQsUyh2LHksJCh4Ll9wYXlsb2FkKSxfKX1pZihncyh4KSlyZXR1cm4gZyh2LHkseCxfKTtpZihxbCh4KSlyZXR1cm4gbSh2LHkseCxfKTtvdSh2LHgpfXJldHVybiB0eXBlb2YgeD09InN0cmluZyImJnghPT0iInx8dHlwZW9mIHg9PSJudW1iZXIiPyh4PSIiK3gseSE9PW51bGwmJnkudGFnPT09Nj8obih2LHkuc2libGluZykseT1vKHkseCkseS5yZXR1cm49dix2PXkpOihuKHYseSkseT11Zih4LHYubW9kZSxfKSx5LnJldHVybj12LHY9eSksbCh2KSk6bih2LHkpfXJldHVybiBTfXZhciB5bD1peCghMCksbHg9aXgoITEpLFJhPXt9LGdyPWpvKFJhKSxyYT1qbyhSYSksb2E9am8oUmEpO2Z1bmN0aW9uIFpvKGUpe2lmKGU9PT1SYSl0aHJvdyBFcnJvcihXKDE3NCkpO3JldHVybiBlfWZ1bmN0aW9uIHJnKGUsdCl7c3dpdGNoKEZlKG9hLHQpLEZlKHJhLGUpLEZlKGdyLFJhKSxlPXQubm9kZVR5cGUsZSl7Y2FzZSA5OmNhc2UgMTE6dD0odD10LmRvY3VtZW50RWxlbWVudCk/dC5uYW1lc3BhY2VVUkk6SGYobnVsbCwiIik7YnJlYWs7ZGVmYXVsdDplPWU9PT04P3QucGFyZW50Tm9kZTp0LHQ9ZS5uYW1lc3BhY2VVUkl8fG51bGwsZT1lLnRhZ05hbWUsdD1IZih0LGUpfUdlKGdyKSxGZShncix0KX1mdW5jdGlvbiB4bCgpe0dlKGdyKSxHZShyYSksR2Uob2EpfWZ1bmN0aW9uIHN4KGUpe1pvKG9hLmN1cnJlbnQpO3ZhciB0PVpvKGdyLmN1cnJlbnQpLG49SGYodCxlLnR5cGUpO3QhPT1uJiYoRmUocmEsZSksRmUoZ3IsbikpfWZ1bmN0aW9uIG9nKGUpe3JhLmN1cnJlbnQ9PT1lJiYoR2UoZ3IpLEdlKHJhKSl9dmFyIEplPWpvKDApO2Z1bmN0aW9uIG9jKGUpe2Zvcih2YXIgdD1lO3QhPT1udWxsOyl7aWYodC50YWc9PT0xMyl7dmFyIG49dC5tZW1vaXplZFN0YXRlO2lmKG4hPT1udWxsJiYobj1uLmRlaHlkcmF0ZWQsbj09PW51bGx8fG4uZGF0YT09PSIkPyJ8fG4uZGF0YT09PSIkISIpKXJldHVybiB0fWVsc2UgaWYodC50YWc9PT0xOSYmdC5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyIT09dm9pZCAwKXtpZih0LmZsYWdzJjEyOClyZXR1cm4gdH1lbHNlIGlmKHQuY2hpbGQhPT1udWxsKXt0LmNoaWxkLnJldHVybj10LHQ9dC5jaGlsZDtjb250aW51ZX1pZih0PT09ZSlicmVhaztmb3IoO3Quc2libGluZz09PW51bGw7KXtpZih0LnJldHVybj09PW51bGx8fHQucmV0dXJuPT09ZSlyZXR1cm4gbnVsbDt0PXQucmV0dXJufXQuc2libGluZy5yZXR1cm49dC5yZXR1cm4sdD10LnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIG5mPVtdO2Z1bmN0aW9uIGlnKCl7Zm9yKHZhciBlPTA7ZTxuZi5sZW5ndGg7ZSsrKW5mW2VdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7bmYubGVuZ3RoPTB9dmFyIE51PVZyLlJlYWN0Q3VycmVudERpc3BhdGNoZXIscmY9VnIuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsdWk9MCxxZT1udWxsLG10PW51bGwsQ3Q9bnVsbCxpYz0hMSxUcz0hMSxpYT0wLHBrPTA7ZnVuY3Rpb24gRnQoKXt0aHJvdyBFcnJvcihXKDMyMSkpfWZ1bmN0aW9uIGxnKGUsdCl7aWYodD09PW51bGwpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aCYmbjxlLmxlbmd0aDtuKyspaWYoIWVyKGVbbl0sdFtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gc2coZSx0LG4scixvLGkpe2lmKHVpPWkscWU9dCx0Lm1lbW9pemVkU3RhdGU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsdC5sYW5lcz0wLE51LmN1cnJlbnQ9ZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZT09PW51bGw/eWs6eGssZT1uKHIsbyksVHMpe2k9MDtkb3tpZihUcz0hMSxpYT0wLDI1PD1pKXRocm93IEVycm9yKFcoMzAxKSk7aSs9MSxDdD1tdD1udWxsLHQudXBkYXRlUXVldWU9bnVsbCxOdS5jdXJyZW50PV9rLGU9bihyLG8pfXdoaWxlKFRzKX1pZihOdS5jdXJyZW50PWxjLHQ9bXQhPT1udWxsJiZtdC5uZXh0IT09bnVsbCx1aT0wLEN0PW10PXFlPW51bGwsaWM9ITEsdCl0aHJvdyBFcnJvcihXKDMwMCkpO3JldHVybiBlfWZ1bmN0aW9uIGFnKCl7dmFyIGU9aWEhPT0wO3JldHVybiBpYT0wLGV9ZnVuY3Rpb24gc3IoKXt2YXIgZT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtyZXR1cm4gQ3Q9PT1udWxsP3FlLm1lbW9pemVkU3RhdGU9Q3Q9ZTpDdD1DdC5uZXh0PWUsQ3R9ZnVuY3Rpb24gem4oKXtpZihtdD09PW51bGwpe3ZhciBlPXFlLmFsdGVybmF0ZTtlPWUhPT1udWxsP2UubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgZT1tdC5uZXh0O3ZhciB0PUN0PT09bnVsbD9xZS5tZW1vaXplZFN0YXRlOkN0Lm5leHQ7aWYodCE9PW51bGwpQ3Q9dCxtdD1lO2Vsc2V7aWYoZT09PW51bGwpdGhyb3cgRXJyb3IoVygzMTApKTttdD1lLGU9e21lbW9pemVkU3RhdGU6bXQubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6bXQuYmFzZVN0YXRlLGJhc2VRdWV1ZTptdC5iYXNlUXVldWUscXVldWU6bXQucXVldWUsbmV4dDpudWxsfSxDdD09PW51bGw/cWUubWVtb2l6ZWRTdGF0ZT1DdD1lOkN0PUN0Lm5leHQ9ZX1yZXR1cm4gQ3R9ZnVuY3Rpb24gbGEoZSx0KXtyZXR1cm4gdHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlKTp0fWZ1bmN0aW9uIG9mKGUpe3ZhciB0PXpuKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFcoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9bXQsbz1yLmJhc2VRdWV1ZSxpPW4ucGVuZGluZztpZihpIT09bnVsbCl7aWYobyE9PW51bGwpe3ZhciBsPW8ubmV4dDtvLm5leHQ9aS5uZXh0LGkubmV4dD1sfXIuYmFzZVF1ZXVlPW89aSxuLnBlbmRpbmc9bnVsbH1pZihvIT09bnVsbCl7aT1vLm5leHQscj1yLmJhc2VTdGF0ZTt2YXIgcz1sPW51bGwsYT1udWxsLHU9aTtkb3t2YXIgYz11LmxhbmU7aWYoKHVpJmMpPT09YylhIT09bnVsbCYmKGE9YS5uZXh0PXtsYW5lOjAsYWN0aW9uOnUuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6dS5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6dS5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLHI9dS5oYXNFYWdlclN0YXRlP3UuZWFnZXJTdGF0ZTplKHIsdS5hY3Rpb24pO2Vsc2V7dmFyIGQ9e2xhbmU6YyxhY3Rpb246dS5hY3Rpb24saGFzRWFnZXJTdGF0ZTp1Lmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTp1LmVhZ2VyU3RhdGUsbmV4dDpudWxsfTthPT09bnVsbD8ocz1hPWQsbD1yKTphPWEubmV4dD1kLHFlLmxhbmVzfD1jLGNpfD1jfXU9dS5uZXh0fXdoaWxlKHUhPT1udWxsJiZ1IT09aSk7YT09PW51bGw/bD1yOmEubmV4dD1zLGVyKHIsdC5tZW1vaXplZFN0YXRlKXx8KHVuPSEwKSx0Lm1lbW9pemVkU3RhdGU9cix0LmJhc2VTdGF0ZT1sLHQuYmFzZVF1ZXVlPWEsbi5sYXN0UmVuZGVyZWRTdGF0ZT1yfWlmKGU9bi5pbnRlcmxlYXZlZCxlIT09bnVsbCl7bz1lO2RvIGk9by5sYW5lLHFlLmxhbmVzfD1pLGNpfD1pLG89by5uZXh0O3doaWxlKG8hPT1lKX1lbHNlIG89PT1udWxsJiYobi5sYW5lcz0wKTtyZXR1cm5bdC5tZW1vaXplZFN0YXRlLG4uZGlzcGF0Y2hdfWZ1bmN0aW9uIGxmKGUpe3ZhciB0PXpuKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFcoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9bi5kaXNwYXRjaCxvPW4ucGVuZGluZyxpPXQubWVtb2l6ZWRTdGF0ZTtpZihvIT09bnVsbCl7bi5wZW5kaW5nPW51bGw7dmFyIGw9bz1vLm5leHQ7ZG8gaT1lKGksbC5hY3Rpb24pLGw9bC5uZXh0O3doaWxlKGwhPT1vKTtlcihpLHQubWVtb2l6ZWRTdGF0ZSl8fCh1bj0hMCksdC5tZW1vaXplZFN0YXRlPWksdC5iYXNlUXVldWU9PT1udWxsJiYodC5iYXNlU3RhdGU9aSksbi5sYXN0UmVuZGVyZWRTdGF0ZT1pfXJldHVybltpLHJdfWZ1bmN0aW9uIGF4KCl7fWZ1bmN0aW9uIHV4KGUsdCl7dmFyIG49cWUscj16bigpLG89dCgpLGk9IWVyKHIubWVtb2l6ZWRTdGF0ZSxvKTtpZihpJiYoci5tZW1vaXplZFN0YXRlPW8sdW49ITApLHI9ci5xdWV1ZSx1ZyhmeC5iaW5kKG51bGwsbixyLGUpLFtlXSksci5nZXRTbmFwc2hvdCE9PXR8fGl8fEN0IT09bnVsbCYmQ3QubWVtb2l6ZWRTdGF0ZS50YWcmMSl7aWYobi5mbGFnc3w9MjA0OCxzYSg5LGR4LmJpbmQobnVsbCxuLHIsbyx0KSx2b2lkIDAsbnVsbCksYnQ9PT1udWxsKXRocm93IEVycm9yKFcoMzQ5KSk7dWkmMzB8fGN4KG4sdCxvKX1yZXR1cm4gb31mdW5jdGlvbiBjeChlLHQsbil7ZS5mbGFnc3w9MTYzODQsZT17Z2V0U25hcHNob3Q6dCx2YWx1ZTpufSx0PXFlLnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LHFlLnVwZGF0ZVF1ZXVlPXQsdC5zdG9yZXM9W2VdKToobj10LnN0b3JlcyxuPT09bnVsbD90LnN0b3Jlcz1bZV06bi5wdXNoKGUpKX1mdW5jdGlvbiBkeChlLHQsbixyKXt0LnZhbHVlPW4sdC5nZXRTbmFwc2hvdD1yLGh4KHQpJiZweChlKX1mdW5jdGlvbiBmeChlLHQsbil7cmV0dXJuIG4oZnVuY3Rpb24oKXtoeCh0KSYmcHgoZSl9KX1mdW5jdGlvbiBoeChlKXt2YXIgdD1lLmdldFNuYXBzaG90O2U9ZS52YWx1ZTt0cnl7dmFyIG49dCgpO3JldHVybiFlcihlLG4pfWNhdGNoe3JldHVybiEwfX1mdW5jdGlvbiBweChlKXt2YXIgdD16cihlLDEpO3QhPT1udWxsJiZxbih0LGUsMSwtMSl9ZnVuY3Rpb24ga3YoZSl7dmFyIHQ9c3IoKTtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiImJihlPWUoKSksdC5tZW1vaXplZFN0YXRlPXQuYmFzZVN0YXRlPWUsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6bGEsbGFzdFJlbmRlcmVkU3RhdGU6ZX0sdC5xdWV1ZT1lLGU9ZS5kaXNwYXRjaD12ay5iaW5kKG51bGwscWUsZSksW3QubWVtb2l6ZWRTdGF0ZSxlXX1mdW5jdGlvbiBzYShlLHQsbixyKXtyZXR1cm4gZT17dGFnOmUsY3JlYXRlOnQsZGVzdHJveTpuLGRlcHM6cixuZXh0Om51bGx9LHQ9cWUudXBkYXRlUXVldWUsdD09PW51bGw/KHQ9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0scWUudXBkYXRlUXVldWU9dCx0Lmxhc3RFZmZlY3Q9ZS5uZXh0PWUpOihuPXQubGFzdEVmZmVjdCxuPT09bnVsbD90Lmxhc3RFZmZlY3Q9ZS5uZXh0PWU6KHI9bi5uZXh0LG4ubmV4dD1lLGUubmV4dD1yLHQubGFzdEVmZmVjdD1lKSksZX1mdW5jdGlvbiBneCgpe3JldHVybiB6bigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gYnUoZSx0LG4scil7dmFyIG89c3IoKTtxZS5mbGFnc3w9ZSxvLm1lbW9pemVkU3RhdGU9c2EoMXx0LG4sdm9pZCAwLHI9PT12b2lkIDA/bnVsbDpyKX1mdW5jdGlvbiBZYyhlLHQsbixyKXt2YXIgbz16bigpO3I9cj09PXZvaWQgMD9udWxsOnI7dmFyIGk9dm9pZCAwO2lmKG10IT09bnVsbCl7dmFyIGw9bXQubWVtb2l6ZWRTdGF0ZTtpZihpPWwuZGVzdHJveSxyIT09bnVsbCYmbGcocixsLmRlcHMpKXtvLm1lbW9pemVkU3RhdGU9c2EodCxuLGkscik7cmV0dXJufX1xZS5mbGFnc3w9ZSxvLm1lbW9pemVkU3RhdGU9c2EoMXx0LG4saSxyKX1mdW5jdGlvbiBUdihlLHQpe3JldHVybiBidSg4MzkwNjU2LDgsZSx0KX1mdW5jdGlvbiB1ZyhlLHQpe3JldHVybiBZYygyMDQ4LDgsZSx0KX1mdW5jdGlvbiBteChlLHQpe3JldHVybiBZYyg0LDIsZSx0KX1mdW5jdGlvbiB2eChlLHQpe3JldHVybiBZYyg0LDQsZSx0KX1mdW5jdGlvbiB5eChlLHQpe2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBlPWUoKSx0KGUpLGZ1bmN0aW9uKCl7dChudWxsKX07aWYodCE9bnVsbClyZXR1cm4gZT1lKCksdC5jdXJyZW50PWUsZnVuY3Rpb24oKXt0LmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24geHgoZSx0LG4pe3JldHVybiBuPW4hPW51bGw/bi5jb25jYXQoW2VdKTpudWxsLFljKDQsNCx5eC5iaW5kKG51bGwsdCxlKSxuKX1mdW5jdGlvbiBjZygpe31mdW5jdGlvbiBfeChlLHQpe3ZhciBuPXpuKCk7dD10PT09dm9pZCAwP251bGw6dDt2YXIgcj1uLm1lbW9pemVkU3RhdGU7cmV0dXJuIHIhPT1udWxsJiZ0IT09bnVsbCYmbGcodCxyWzFdKT9yWzBdOihuLm1lbW9pemVkU3RhdGU9W2UsdF0sZSl9ZnVuY3Rpb24gd3goZSx0KXt2YXIgbj16bigpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIHI9bi5tZW1vaXplZFN0YXRlO3JldHVybiByIT09bnVsbCYmdCE9PW51bGwmJmxnKHQsclsxXSk/clswXTooZT1lKCksbi5tZW1vaXplZFN0YXRlPVtlLHRdLGUpfWZ1bmN0aW9uIFN4KGUsdCxuKXtyZXR1cm4gdWkmMjE/KGVyKG4sdCl8fChuPSQxKCkscWUubGFuZXN8PW4sY2l8PW4sZS5iYXNlU3RhdGU9ITApLHQpOihlLmJhc2VTdGF0ZSYmKGUuYmFzZVN0YXRlPSExLHVuPSEwKSxlLm1lbW9pemVkU3RhdGU9bil9ZnVuY3Rpb24gZ2soZSx0KXt2YXIgbj1QZTtQZT1uIT09MCYmND5uP246NCxlKCEwKTt2YXIgcj1yZi50cmFuc2l0aW9uO3JmLnRyYW5zaXRpb249e307dHJ5e2UoITEpLHQoKX1maW5hbGx5e1BlPW4scmYudHJhbnNpdGlvbj1yfX1mdW5jdGlvbiBFeCgpe3JldHVybiB6bigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gbWsoZSx0LG4pe3ZhciByPUVvKGUpO2lmKG49e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9LEN4KGUpKSR4KHQsbik7ZWxzZSBpZihuPXR4KGUsdCxuLHIpLG4hPT1udWxsKXt2YXIgbz10bigpO3FuKG4sZSxyLG8pLGt4KG4sdCxyKX19ZnVuY3Rpb24gdmsoZSx0LG4pe3ZhciByPUVvKGUpLG89e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKEN4KGUpKSR4KHQsbyk7ZWxzZXt2YXIgaT1lLmFsdGVybmF0ZTtpZihlLmxhbmVzPT09MCYmKGk9PT1udWxsfHxpLmxhbmVzPT09MCkmJihpPXQubGFzdFJlbmRlcmVkUmVkdWNlcixpIT09bnVsbCkpdHJ5e3ZhciBsPXQubGFzdFJlbmRlcmVkU3RhdGUscz1pKGwsbik7aWYoby5oYXNFYWdlclN0YXRlPSEwLG8uZWFnZXJTdGF0ZT1zLGVyKHMsbCkpe3ZhciBhPXQuaW50ZXJsZWF2ZWQ7YT09PW51bGw/KG8ubmV4dD1vLHRnKHQpKTooby5uZXh0PWEubmV4dCxhLm5leHQ9byksdC5pbnRlcmxlYXZlZD1vO3JldHVybn19Y2F0Y2h7fWZpbmFsbHl7fW49dHgoZSx0LG8sciksbiE9PW51bGwmJihvPXRuKCkscW4obixlLHIsbyksa3gobix0LHIpKX19ZnVuY3Rpb24gQ3goZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7cmV0dXJuIGU9PT1xZXx8dCE9PW51bGwmJnQ9PT1xZX1mdW5jdGlvbiAkeChlLHQpe1RzPWljPSEwO3ZhciBuPWUucGVuZGluZztuPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PW4ubmV4dCxuLm5leHQ9dCksZS5wZW5kaW5nPXR9ZnVuY3Rpb24ga3goZSx0LG4pe2lmKG4mNDE5NDI0MCl7dmFyIHI9dC5sYW5lcztyJj1lLnBlbmRpbmdMYW5lcyxufD1yLHQubGFuZXM9bixCcChlLG4pfX12YXIgbGM9e3JlYWRDb250ZXh0OmpuLHVzZUNhbGxiYWNrOkZ0LHVzZUNvbnRleHQ6RnQsdXNlRWZmZWN0OkZ0LHVzZUltcGVyYXRpdmVIYW5kbGU6RnQsdXNlSW5zZXJ0aW9uRWZmZWN0OkZ0LHVzZUxheW91dEVmZmVjdDpGdCx1c2VNZW1vOkZ0LHVzZVJlZHVjZXI6RnQsdXNlUmVmOkZ0LHVzZVN0YXRlOkZ0LHVzZURlYnVnVmFsdWU6RnQsdXNlRGVmZXJyZWRWYWx1ZTpGdCx1c2VUcmFuc2l0aW9uOkZ0LHVzZU11dGFibGVTb3VyY2U6RnQsdXNlU3luY0V4dGVybmFsU3RvcmU6RnQsdXNlSWQ6RnQsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSx5az17cmVhZENvbnRleHQ6am4sdXNlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gc3IoKS5tZW1vaXplZFN0YXRlPVtlLHQ9PT12b2lkIDA/bnVsbDp0XSxlfSx1c2VDb250ZXh0OmpuLHVzZUVmZmVjdDpUdix1c2VJbXBlcmF0aXZlSGFuZGxlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFtlXSk6bnVsbCxidSg0MTk0MzA4LDQseXguYmluZChudWxsLHQsZSksbil9LHVzZUxheW91dEVmZmVjdDpmdW5jdGlvbihlLHQpe3JldHVybiBidSg0MTk0MzA4LDQsZSx0KX0sdXNlSW5zZXJ0aW9uRWZmZWN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGJ1KDQsMixlLHQpfSx1c2VNZW1vOmZ1bmN0aW9uKGUsdCl7dmFyIG49c3IoKTtyZXR1cm4gdD10PT09dm9pZCAwP251bGw6dCxlPWUoKSxuLm1lbW9pemVkU3RhdGU9W2UsdF0sZX0sdXNlUmVkdWNlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9c3IoKTtyZXR1cm4gdD1uIT09dm9pZCAwP24odCk6dCxyLm1lbW9pemVkU3RhdGU9ci5iYXNlU3RhdGU9dCxlPXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjplLGxhc3RSZW5kZXJlZFN0YXRlOnR9LHIucXVldWU9ZSxlPWUuZGlzcGF0Y2g9bWsuYmluZChudWxsLHFlLGUpLFtyLm1lbW9pemVkU3RhdGUsZV19LHVzZVJlZjpmdW5jdGlvbihlKXt2YXIgdD1zcigpO3JldHVybiBlPXtjdXJyZW50OmV9LHQubWVtb2l6ZWRTdGF0ZT1lfSx1c2VTdGF0ZTprdix1c2VEZWJ1Z1ZhbHVlOmNnLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHNyKCkubWVtb2l6ZWRTdGF0ZT1lfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9a3YoITEpLHQ9ZVswXTtyZXR1cm4gZT1nay5iaW5kKG51bGwsZVsxXSksc3IoKS5tZW1vaXplZFN0YXRlPWUsW3QsZV19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oKXt9LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1xZSxvPXNyKCk7aWYoWWUpe2lmKG49PT12b2lkIDApdGhyb3cgRXJyb3IoVyg0MDcpKTtuPW4oKX1lbHNle2lmKG49dCgpLGJ0PT09bnVsbCl0aHJvdyBFcnJvcihXKDM0OSkpO3VpJjMwfHxjeChyLHQsbil9by5tZW1vaXplZFN0YXRlPW47dmFyIGk9e3ZhbHVlOm4sZ2V0U25hcHNob3Q6dH07cmV0dXJuIG8ucXVldWU9aSxUdihmeC5iaW5kKG51bGwscixpLGUpLFtlXSksci5mbGFnc3w9MjA0OCxzYSg5LGR4LmJpbmQobnVsbCxyLGksbix0KSx2b2lkIDAsbnVsbCksbn0sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgZT1zcigpLHQ9YnQuaWRlbnRpZmllclByZWZpeDtpZihZZSl7dmFyIG49RHIscj1NcjtuPShyJn4oMTw8MzItWm4ociktMSkpLnRvU3RyaW5nKDMyKStuLHQ9IjoiK3QrIlIiK24sbj1pYSsrLDA8biYmKHQrPSJIIituLnRvU3RyaW5nKDMyKSksdCs9IjoifWVsc2Ugbj1waysrLHQ9IjoiK3QrInIiK24udG9TdHJpbmcoMzIpKyI6IjtyZXR1cm4gZS5tZW1vaXplZFN0YXRlPXR9LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0seGs9e3JlYWRDb250ZXh0OmpuLHVzZUNhbGxiYWNrOl94LHVzZUNvbnRleHQ6am4sdXNlRWZmZWN0OnVnLHVzZUltcGVyYXRpdmVIYW5kbGU6eHgsdXNlSW5zZXJ0aW9uRWZmZWN0Om14LHVzZUxheW91dEVmZmVjdDp2eCx1c2VNZW1vOnd4LHVzZVJlZHVjZXI6b2YsdXNlUmVmOmd4LHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG9mKGxhKX0sdXNlRGVidWdWYWx1ZTpjZyx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXpuKCk7cmV0dXJuIFN4KHQsbXQubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPW9mKGxhKVswXSx0PXpuKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bZSx0XX0sdXNlTXV0YWJsZVNvdXJjZTpheCx1c2VTeW5jRXh0ZXJuYWxTdG9yZTp1eCx1c2VJZDpFeCx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LF9rPXtyZWFkQ29udGV4dDpqbix1c2VDYWxsYmFjazpfeCx1c2VDb250ZXh0OmpuLHVzZUVmZmVjdDp1Zyx1c2VJbXBlcmF0aXZlSGFuZGxlOnh4LHVzZUluc2VydGlvbkVmZmVjdDpteCx1c2VMYXlvdXRFZmZlY3Q6dngsdXNlTWVtbzp3eCx1c2VSZWR1Y2VyOmxmLHVzZVJlZjpneCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBsZihsYSl9LHVzZURlYnVnVmFsdWU6Y2csdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD16bigpO3JldHVybiBtdD09PW51bGw/dC5tZW1vaXplZFN0YXRlPWU6U3godCxtdC5tZW1vaXplZFN0YXRlLGUpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9bGYobGEpWzBdLHQ9em4oKS5tZW1vaXplZFN0YXRlO3JldHVybltlLHRdfSx1c2VNdXRhYmxlU291cmNlOmF4LHVzZVN5bmNFeHRlcm5hbFN0b3JlOnV4LHVzZUlkOkV4LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gX2woZSx0KXt0cnl7dmFyIG49IiIscj10O2RvIG4rPVlDKHIpLHI9ci5yZXR1cm47d2hpbGUocik7dmFyIG89bn1jYXRjaChpKXtvPWAKRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogYCtpLm1lc3NhZ2UrYApgK2kuc3RhY2t9cmV0dXJue3ZhbHVlOmUsc291cmNlOnQsc3RhY2s6byxkaWdlc3Q6bnVsbH19ZnVuY3Rpb24gc2YoZSx0LG4pe3JldHVybnt2YWx1ZTplLHNvdXJjZTpudWxsLHN0YWNrOm4/P251bGwsZGlnZXN0OnQ/P251bGx9fWZ1bmN0aW9uIHBoKGUsdCl7dHJ5e2NvbnNvbGUuZXJyb3IodC52YWx1ZSl9Y2F0Y2gobil7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IG59KX19dmFyIHdrPXR5cGVvZiBXZWFrTWFwPT0iZnVuY3Rpb24iP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIFR4KGUsdCxuKXtuPUxyKC0xLG4pLG4udGFnPTMsbi5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciByPXQudmFsdWU7cmV0dXJuIG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXthY3x8KGFjPSEwLENoPXIpLHBoKGUsdCl9LG59ZnVuY3Rpb24gTngoZSx0LG4pe249THIoLTEsbiksbi50YWc9Mzt2YXIgcj1lLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgbz10LnZhbHVlO24ucGF5bG9hZD1mdW5jdGlvbigpe3JldHVybiByKG8pfSxuLmNhbGxiYWNrPWZ1bmN0aW9uKCl7cGgoZSx0KX19dmFyIGk9ZS5zdGF0ZU5vZGU7cmV0dXJuIGkhPT1udWxsJiZ0eXBlb2YgaS5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtwaChlLHQpLHR5cGVvZiByIT0iZnVuY3Rpb24iJiYoU289PT1udWxsP1NvPW5ldyBTZXQoW3RoaXNdKTpTby5hZGQodGhpcykpO3ZhciBsPXQuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaCh0LnZhbHVlLHtjb21wb25lbnRTdGFjazpsIT09bnVsbD9sOiIifSl9KSxufWZ1bmN0aW9uIE52KGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtpZihyPT09bnVsbCl7cj1lLnBpbmdDYWNoZT1uZXcgd2s7dmFyIG89bmV3IFNldDtyLnNldCh0LG8pfWVsc2Ugbz1yLmdldCh0KSxvPT09dm9pZCAwJiYobz1uZXcgU2V0LHIuc2V0KHQsbykpO28uaGFzKG4pfHwoby5hZGQobiksZT1Eay5iaW5kKG51bGwsZSx0LG4pLHQudGhlbihlLGUpKX1mdW5jdGlvbiBidihlKXtkb3t2YXIgdDtpZigodD1lLnRhZz09PTEzKSYmKHQ9ZS5tZW1vaXplZFN0YXRlLHQ9dCE9PW51bGw/dC5kZWh5ZHJhdGVkIT09bnVsbDohMCksdClyZXR1cm4gZTtlPWUucmV0dXJufXdoaWxlKGUhPT1udWxsKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBSdihlLHQsbixyLG8pe3JldHVybiBlLm1vZGUmMT8oZS5mbGFnc3w9NjU1MzYsZS5sYW5lcz1vLGUpOihlPT09dD9lLmZsYWdzfD02NTUzNjooZS5mbGFnc3w9MTI4LG4uZmxhZ3N8PTEzMTA3MixuLmZsYWdzJj0tNTI4MDUsbi50YWc9PT0xJiYobi5hbHRlcm5hdGU9PT1udWxsP24udGFnPTE3Oih0PUxyKC0xLDEpLHQudGFnPTIsd28obix0LDEpKSksbi5sYW5lc3w9MSksZSl9dmFyIFNrPVZyLlJlYWN0Q3VycmVudE93bmVyLHVuPSExO2Z1bmN0aW9uIEd0KGUsdCxuLHIpe3QuY2hpbGQ9ZT09PW51bGw/bHgodCxudWxsLG4scik6eWwodCxlLmNoaWxkLG4scil9ZnVuY3Rpb24gUHYoZSx0LG4scixvKXtuPW4ucmVuZGVyO3ZhciBpPXQucmVmO3JldHVybiBhbCh0LG8pLHI9c2coZSx0LG4scixpLG8pLG49YWcoKSxlIT09bnVsbCYmIXVuPyh0LnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdC5mbGFncyY9LTIwNTMsZS5sYW5lcyY9fm8sRnIoZSx0LG8pKTooWWUmJm4mJlhwKHQpLHQuZmxhZ3N8PTEsR3QoZSx0LHIsbyksdC5jaGlsZCl9ZnVuY3Rpb24gT3YoZSx0LG4scixvKXtpZihlPT09bnVsbCl7dmFyIGk9bi50eXBlO3JldHVybiB0eXBlb2YgaT09ImZ1bmN0aW9uIiYmIXlnKGkpJiZpLmRlZmF1bHRQcm9wcz09PXZvaWQgMCYmbi5jb21wYXJlPT09bnVsbCYmbi5kZWZhdWx0UHJvcHM9PT12b2lkIDA/KHQudGFnPTE1LHQudHlwZT1pLGJ4KGUsdCxpLHIsbykpOihlPUF1KG4udHlwZSxudWxsLHIsdCx0Lm1vZGUsbyksZS5yZWY9dC5yZWYsZS5yZXR1cm49dCx0LmNoaWxkPWUpfWlmKGk9ZS5jaGlsZCwhKGUubGFuZXMmbykpe3ZhciBsPWkubWVtb2l6ZWRQcm9wcztpZihuPW4uY29tcGFyZSxuPW4hPT1udWxsP246cXMsbihsLHIpJiZlLnJlZj09PXQucmVmKXJldHVybiBGcihlLHQsbyl9cmV0dXJuIHQuZmxhZ3N8PTEsZT1DbyhpLHIpLGUucmVmPXQucmVmLGUucmV0dXJuPXQsdC5jaGlsZD1lfWZ1bmN0aW9uIGJ4KGUsdCxuLHIsbyl7aWYoZSE9PW51bGwpe3ZhciBpPWUubWVtb2l6ZWRQcm9wcztpZihxcyhpLHIpJiZlLnJlZj09PXQucmVmKWlmKHVuPSExLHQucGVuZGluZ1Byb3BzPXI9aSwoZS5sYW5lcyZvKSE9PTApZS5mbGFncyYxMzEwNzImJih1bj0hMCk7ZWxzZSByZXR1cm4gdC5sYW5lcz1lLmxhbmVzLEZyKGUsdCxvKX1yZXR1cm4gZ2goZSx0LG4scixvKX1mdW5jdGlvbiBSeChlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHMsbz1yLmNoaWxkcmVuLGk9ZSE9PW51bGw/ZS5tZW1vaXplZFN0YXRlOm51bGw7aWYoci5tb2RlPT09ImhpZGRlbiIpaWYoISh0Lm1vZGUmMSkpdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxGZShxaSxnbiksZ258PW47ZWxzZXtpZighKG4mMTA3Mzc0MTgyNCkpcmV0dXJuIGU9aSE9PW51bGw/aS5iYXNlTGFuZXN8bjpuLHQubGFuZXM9dC5jaGlsZExhbmVzPTEwNzM3NDE4MjQsdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6ZSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSx0LnVwZGF0ZVF1ZXVlPW51bGwsRmUocWksZ24pLGdufD1lLG51bGw7dC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxyPWkhPT1udWxsP2kuYmFzZUxhbmVzOm4sRmUocWksZ24pLGdufD1yfWVsc2UgaSE9PW51bGw/KHI9aS5iYXNlTGFuZXN8bix0Lm1lbW9pemVkU3RhdGU9bnVsbCk6cj1uLEZlKHFpLGduKSxnbnw9cjtyZXR1cm4gR3QoZSx0LG8sbiksdC5jaGlsZH1mdW5jdGlvbiBQeChlLHQpe3ZhciBuPXQucmVmOyhlPT09bnVsbCYmbiE9PW51bGx8fGUhPT1udWxsJiZlLnJlZiE9PW4pJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpfWZ1bmN0aW9uIGdoKGUsdCxuLHIsbyl7dmFyIGk9ZG4obik/c2k6S3QuY3VycmVudDtyZXR1cm4gaT1tbCh0LGkpLGFsKHQsbyksbj1zZyhlLHQsbixyLGksbykscj1hZygpLGUhPT1udWxsJiYhdW4/KHQudXBkYXRlUXVldWU9ZS51cGRhdGVRdWV1ZSx0LmZsYWdzJj0tMjA1MyxlLmxhbmVzJj1+byxGcihlLHQsbykpOihZZSYmciYmWHAodCksdC5mbGFnc3w9MSxHdChlLHQsbixvKSx0LmNoaWxkKX1mdW5jdGlvbiBBdihlLHQsbixyLG8pe2lmKGRuKG4pKXt2YXIgaT0hMDtadSh0KX1lbHNlIGk9ITE7aWYoYWwodCxvKSx0LnN0YXRlTm9kZT09PW51bGwpUnUoZSx0KSxveCh0LG4sciksaGgodCxuLHIsbykscj0hMDtlbHNlIGlmKGU9PT1udWxsKXt2YXIgbD10LnN0YXRlTm9kZSxzPXQubWVtb2l6ZWRQcm9wcztsLnByb3BzPXM7dmFyIGE9bC5jb250ZXh0LHU9bi5jb250ZXh0VHlwZTt0eXBlb2YgdT09Im9iamVjdCImJnUhPT1udWxsP3U9am4odSk6KHU9ZG4obik/c2k6S3QuY3VycmVudCx1PW1sKHQsdSkpO3ZhciBjPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLGQ9dHlwZW9mIGM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iO2R8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PXJ8fGEhPT11KSYmQ3YodCxsLHIsdSksc289ITE7dmFyIGY9dC5tZW1vaXplZFN0YXRlO2wuc3RhdGU9ZixyYyh0LHIsbCxvKSxhPXQubWVtb2l6ZWRTdGF0ZSxzIT09cnx8ZiE9PWF8fGNuLmN1cnJlbnR8fHNvPyh0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKGZoKHQsbixjLHIpLGE9dC5tZW1vaXplZFN0YXRlKSwocz1zb3x8RXYodCxuLHMscixmLGEsdSkpPyhkfHx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmwuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkpOih0eXBlb2YgbC5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpLHQubWVtb2l6ZWRQcm9wcz1yLHQubWVtb2l6ZWRTdGF0ZT1hKSxsLnByb3BzPXIsbC5zdGF0ZT1hLGwuY29udGV4dD11LHI9cyk6KHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkscj0hMSl9ZWxzZXtsPXQuc3RhdGVOb2RlLG54KGUsdCkscz10Lm1lbW9pemVkUHJvcHMsdT10LnR5cGU9PT10LmVsZW1lbnRUeXBlP3M6S24odC50eXBlLHMpLGwucHJvcHM9dSxkPXQucGVuZGluZ1Byb3BzLGY9bC5jb250ZXh0LGE9bi5jb250ZXh0VHlwZSx0eXBlb2YgYT09Im9iamVjdCImJmEhPT1udWxsP2E9am4oYSk6KGE9ZG4obik/c2k6S3QuY3VycmVudCxhPW1sKHQsYSkpO3ZhciBoPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhjPXR5cGVvZiBoPT0iZnVuY3Rpb24ifHx0eXBlb2YgbC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIil8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PWR8fGYhPT1hKSYmQ3YodCxsLHIsYSksc289ITEsZj10Lm1lbW9pemVkU3RhdGUsbC5zdGF0ZT1mLHJjKHQscixsLG8pO3ZhciBnPXQubWVtb2l6ZWRTdGF0ZTtzIT09ZHx8ZiE9PWd8fGNuLmN1cnJlbnR8fHNvPyh0eXBlb2YgaD09ImZ1bmN0aW9uIiYmKGZoKHQsbixoLHIpLGc9dC5tZW1vaXplZFN0YXRlKSwodT1zb3x8RXYodCxuLHUscixmLGcsYSl8fCExKT8oY3x8dHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiImJnR5cGVvZiBsLmNvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLmNvbXBvbmVudFdpbGxVcGRhdGUocixnLGEpLHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKHIsZyxhKSksdHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlPT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiImJih0LmZsYWdzfD0xMDI0KSk6KHR5cGVvZiBsLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmZj09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTQpLHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZmPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9MTAyNCksdC5tZW1vaXplZFByb3BzPXIsdC5tZW1vaXplZFN0YXRlPWcpLGwucHJvcHM9cixsLnN0YXRlPWcsbC5jb250ZXh0PWEscj11KToodHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZmPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJmY9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD0xMDI0KSxyPSExKX1yZXR1cm4gbWgoZSx0LG4scixpLG8pfWZ1bmN0aW9uIG1oKGUsdCxuLHIsbyxpKXtQeChlLHQpO3ZhciBsPSh0LmZsYWdzJjEyOCkhPT0wO2lmKCFyJiYhbClyZXR1cm4gbyYmeXYodCxuLCExKSxGcihlLHQsaSk7cj10LnN0YXRlTm9kZSxTay5jdXJyZW50PXQ7dmFyIHM9bCYmdHlwZW9mIG4uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT0iZnVuY3Rpb24iP251bGw6ci5yZW5kZXIoKTtyZXR1cm4gdC5mbGFnc3w9MSxlIT09bnVsbCYmbD8odC5jaGlsZD15bCh0LGUuY2hpbGQsbnVsbCxpKSx0LmNoaWxkPXlsKHQsbnVsbCxzLGkpKTpHdChlLHQscyxpKSx0Lm1lbW9pemVkU3RhdGU9ci5zdGF0ZSxvJiZ5dih0LG4sITApLHQuY2hpbGR9ZnVuY3Rpb24gT3goZSl7dmFyIHQ9ZS5zdGF0ZU5vZGU7dC5wZW5kaW5nQ29udGV4dD92dihlLHQucGVuZGluZ0NvbnRleHQsdC5wZW5kaW5nQ29udGV4dCE9PXQuY29udGV4dCk6dC5jb250ZXh0JiZ2dihlLHQuY29udGV4dCwhMSkscmcoZSx0LmNvbnRhaW5lckluZm8pfWZ1bmN0aW9uIE12KGUsdCxuLHIsbyl7cmV0dXJuIHZsKCksSnAobyksdC5mbGFnc3w9MjU2LEd0KGUsdCxuLHIpLHQuY2hpbGR9dmFyIHZoPXtkZWh5ZHJhdGVkOm51bGwsdHJlZUNvbnRleHQ6bnVsbCxyZXRyeUxhbmU6MH07ZnVuY3Rpb24geWgoZSl7cmV0dXJue2Jhc2VMYW5lczplLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9fWZ1bmN0aW9uIEF4KGUsdCxuKXt2YXIgcj10LnBlbmRpbmdQcm9wcyxvPUplLmN1cnJlbnQsaT0hMSxsPSh0LmZsYWdzJjEyOCkhPT0wLHM7aWYoKHM9bCl8fChzPWUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGU9PT1udWxsPyExOihvJjIpIT09MCkscz8oaT0hMCx0LmZsYWdzJj0tMTI5KTooZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiYob3w9MSksRmUoSmUsbyYxKSxlPT09bnVsbClyZXR1cm4gY2godCksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJihlPWUuZGVoeWRyYXRlZCxlIT09bnVsbCk/KHQubW9kZSYxP2UuZGF0YT09PSIkISI/dC5sYW5lcz04OnQubGFuZXM9MTA3Mzc0MTgyNDp0LmxhbmVzPTEsbnVsbCk6KGw9ci5jaGlsZHJlbixlPXIuZmFsbGJhY2ssaT8ocj10Lm1vZGUsaT10LmNoaWxkLGw9e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46bH0sIShyJjEpJiZpIT09bnVsbD8oaS5jaGlsZExhbmVzPTAsaS5wZW5kaW5nUHJvcHM9bCk6aT1KYyhsLHIsMCxudWxsKSxlPW5pKGUscixuLG51bGwpLGkucmV0dXJuPXQsZS5yZXR1cm49dCxpLnNpYmxpbmc9ZSx0LmNoaWxkPWksdC5jaGlsZC5tZW1vaXplZFN0YXRlPXloKG4pLHQubWVtb2l6ZWRTdGF0ZT12aCxlKTpkZyh0LGwpKTtpZihvPWUubWVtb2l6ZWRTdGF0ZSxvIT09bnVsbCYmKHM9by5kZWh5ZHJhdGVkLHMhPT1udWxsKSlyZXR1cm4gRWsoZSx0LGwscixzLG8sbik7aWYoaSl7aT1yLmZhbGxiYWNrLGw9dC5tb2RlLG89ZS5jaGlsZCxzPW8uc2libGluZzt2YXIgYT17bW9kZToiaGlkZGVuIixjaGlsZHJlbjpyLmNoaWxkcmVufTtyZXR1cm4hKGwmMSkmJnQuY2hpbGQhPT1vPyhyPXQuY2hpbGQsci5jaGlsZExhbmVzPTAsci5wZW5kaW5nUHJvcHM9YSx0LmRlbGV0aW9ucz1udWxsKToocj1DbyhvLGEpLHIuc3VidHJlZUZsYWdzPW8uc3VidHJlZUZsYWdzJjE0NjgwMDY0KSxzIT09bnVsbD9pPUNvKHMsaSk6KGk9bmkoaSxsLG4sbnVsbCksaS5mbGFnc3w9MiksaS5yZXR1cm49dCxyLnJldHVybj10LHIuc2libGluZz1pLHQuY2hpbGQ9cixyPWksaT10LmNoaWxkLGw9ZS5jaGlsZC5tZW1vaXplZFN0YXRlLGw9bD09PW51bGw/eWgobik6e2Jhc2VMYW5lczpsLmJhc2VMYW5lc3xuLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOmwudHJhbnNpdGlvbnN9LGkubWVtb2l6ZWRTdGF0ZT1sLGkuY2hpbGRMYW5lcz1lLmNoaWxkTGFuZXMmfm4sdC5tZW1vaXplZFN0YXRlPXZoLHJ9cmV0dXJuIGk9ZS5jaGlsZCxlPWkuc2libGluZyxyPUNvKGkse21vZGU6InZpc2libGUiLGNoaWxkcmVuOnIuY2hpbGRyZW59KSwhKHQubW9kZSYxKSYmKHIubGFuZXM9biksci5yZXR1cm49dCxyLnNpYmxpbmc9bnVsbCxlIT09bnVsbCYmKG49dC5kZWxldGlvbnMsbj09PW51bGw/KHQuZGVsZXRpb25zPVtlXSx0LmZsYWdzfD0xNik6bi5wdXNoKGUpKSx0LmNoaWxkPXIsdC5tZW1vaXplZFN0YXRlPW51bGwscn1mdW5jdGlvbiBkZyhlLHQpe3JldHVybiB0PUpjKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjp0fSxlLm1vZGUsMCxudWxsKSx0LnJldHVybj1lLGUuY2hpbGQ9dH1mdW5jdGlvbiBpdShlLHQsbixyKXtyZXR1cm4gciE9PW51bGwmJkpwKHIpLHlsKHQsZS5jaGlsZCxudWxsLG4pLGU9ZGcodCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbiksZS5mbGFnc3w9Mix0Lm1lbW9pemVkU3RhdGU9bnVsbCxlfWZ1bmN0aW9uIEVrKGUsdCxuLHIsbyxpLGwpe2lmKG4pcmV0dXJuIHQuZmxhZ3MmMjU2Pyh0LmZsYWdzJj0tMjU3LHI9c2YoRXJyb3IoVyg0MjIpKSksaXUoZSx0LGwscikpOnQubWVtb2l6ZWRTdGF0ZSE9PW51bGw/KHQuY2hpbGQ9ZS5jaGlsZCx0LmZsYWdzfD0xMjgsbnVsbCk6KGk9ci5mYWxsYmFjayxvPXQubW9kZSxyPUpjKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpyLmNoaWxkcmVufSxvLDAsbnVsbCksaT1uaShpLG8sbCxudWxsKSxpLmZsYWdzfD0yLHIucmV0dXJuPXQsaS5yZXR1cm49dCxyLnNpYmxpbmc9aSx0LmNoaWxkPXIsdC5tb2RlJjEmJnlsKHQsZS5jaGlsZCxudWxsLGwpLHQuY2hpbGQubWVtb2l6ZWRTdGF0ZT15aChsKSx0Lm1lbW9pemVkU3RhdGU9dmgsaSk7aWYoISh0Lm1vZGUmMSkpcmV0dXJuIGl1KGUsdCxsLG51bGwpO2lmKG8uZGF0YT09PSIkISIpe2lmKHI9by5uZXh0U2libGluZyYmby5uZXh0U2libGluZy5kYXRhc2V0LHIpdmFyIHM9ci5kZ3N0O3JldHVybiByPXMsaT1FcnJvcihXKDQxOSkpLHI9c2YoaSxyLHZvaWQgMCksaXUoZSx0LGwscil9aWYocz0obCZlLmNoaWxkTGFuZXMpIT09MCx1bnx8cyl7aWYocj1idCxyIT09bnVsbCl7c3dpdGNoKGwmLWwpe2Nhc2UgNDpvPTI7YnJlYWs7Y2FzZSAxNjpvPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0Om89MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bz0yNjg0MzU0NTY7YnJlYWs7ZGVmYXVsdDpvPTB9bz1vJihyLnN1c3BlbmRlZExhbmVzfGwpPzA6byxvIT09MCYmbyE9PWkucmV0cnlMYW5lJiYoaS5yZXRyeUxhbmU9byx6cihlLG8pLHFuKHIsZSxvLC0xKSl9cmV0dXJuIHZnKCkscj1zZihFcnJvcihXKDQyMSkpKSxpdShlLHQsbCxyKX1yZXR1cm4gby5kYXRhPT09IiQ/Ij8odC5mbGFnc3w9MTI4LHQuY2hpbGQ9ZS5jaGlsZCx0PUxrLmJpbmQobnVsbCxlKSxvLl9yZWFjdFJldHJ5PXQsbnVsbCk6KGU9aS50cmVlQ29udGV4dCx5bj1fbyhvLm5leHRTaWJsaW5nKSx4bj10LFllPSEwLFhuPW51bGwsZSE9PW51bGwmJihQbltPbisrXT1NcixQbltPbisrXT1EcixQbltPbisrXT1haSxNcj1lLmlkLERyPWUub3ZlcmZsb3csYWk9dCksdD1kZyh0LHIuY2hpbGRyZW4pLHQuZmxhZ3N8PTQwOTYsdCl9ZnVuY3Rpb24gRHYoZSx0LG4pe2UubGFuZXN8PXQ7dmFyIHI9ZS5hbHRlcm5hdGU7ciE9PW51bGwmJihyLmxhbmVzfD10KSxkaChlLnJldHVybix0LG4pfWZ1bmN0aW9uIGFmKGUsdCxuLHIsbyl7dmFyIGk9ZS5tZW1vaXplZFN0YXRlO2k9PT1udWxsP2UubWVtb2l6ZWRTdGF0ZT17aXNCYWNrd2FyZHM6dCxyZW5kZXJpbmc6bnVsbCxyZW5kZXJpbmdTdGFydFRpbWU6MCxsYXN0OnIsdGFpbDpuLHRhaWxNb2RlOm99OihpLmlzQmFja3dhcmRzPXQsaS5yZW5kZXJpbmc9bnVsbCxpLnJlbmRlcmluZ1N0YXJ0VGltZT0wLGkubGFzdD1yLGkudGFpbD1uLGkudGFpbE1vZGU9byl9ZnVuY3Rpb24gTXgoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzLG89ci5yZXZlYWxPcmRlcixpPXIudGFpbDtpZihHdChlLHQsci5jaGlsZHJlbixuKSxyPUplLmN1cnJlbnQsciYyKXI9ciYxfDIsdC5mbGFnc3w9MTI4O2Vsc2V7aWYoZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWU6Zm9yKGU9dC5jaGlsZDtlIT09bnVsbDspe2lmKGUudGFnPT09MTMpZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmRHYoZSxuLHQpO2Vsc2UgaWYoZS50YWc9PT0xOSlEdihlLG4sdCk7ZWxzZSBpZihlLmNoaWxkIT09bnVsbCl7ZS5jaGlsZC5yZXR1cm49ZSxlPWUuY2hpbGQ7Y29udGludWV9aWYoZT09PXQpYnJlYWsgZTtmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fGUucmV0dXJuPT09dClicmVhayBlO2U9ZS5yZXR1cm59ZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZ31yJj0xfWlmKEZlKEplLHIpLCEodC5tb2RlJjEpKXQubWVtb2l6ZWRTdGF0ZT1udWxsO2Vsc2Ugc3dpdGNoKG8pe2Nhc2UiZm9yd2FyZHMiOmZvcihuPXQuY2hpbGQsbz1udWxsO24hPT1udWxsOyllPW4uYWx0ZXJuYXRlLGUhPT1udWxsJiZvYyhlKT09PW51bGwmJihvPW4pLG49bi5zaWJsaW5nO249byxuPT09bnVsbD8obz10LmNoaWxkLHQuY2hpbGQ9bnVsbCk6KG89bi5zaWJsaW5nLG4uc2libGluZz1udWxsKSxhZih0LCExLG8sbixpKTticmVhaztjYXNlImJhY2t3YXJkcyI6Zm9yKG49bnVsbCxvPXQuY2hpbGQsdC5jaGlsZD1udWxsO28hPT1udWxsOyl7aWYoZT1vLmFsdGVybmF0ZSxlIT09bnVsbCYmb2MoZSk9PT1udWxsKXt0LmNoaWxkPW87YnJlYWt9ZT1vLnNpYmxpbmcsby5zaWJsaW5nPW4sbj1vLG89ZX1hZih0LCEwLG4sbnVsbCxpKTticmVhaztjYXNlInRvZ2V0aGVyIjphZih0LCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6dC5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIHQuY2hpbGR9ZnVuY3Rpb24gUnUoZSx0KXshKHQubW9kZSYxKSYmZSE9PW51bGwmJihlLmFsdGVybmF0ZT1udWxsLHQuYWx0ZXJuYXRlPW51bGwsdC5mbGFnc3w9Mil9ZnVuY3Rpb24gRnIoZSx0LG4pe2lmKGUhPT1udWxsJiYodC5kZXBlbmRlbmNpZXM9ZS5kZXBlbmRlbmNpZXMpLGNpfD10LmxhbmVzLCEobiZ0LmNoaWxkTGFuZXMpKXJldHVybiBudWxsO2lmKGUhPT1udWxsJiZ0LmNoaWxkIT09ZS5jaGlsZCl0aHJvdyBFcnJvcihXKDE1MykpO2lmKHQuY2hpbGQhPT1udWxsKXtmb3IoZT10LmNoaWxkLG49Q28oZSxlLnBlbmRpbmdQcm9wcyksdC5jaGlsZD1uLG4ucmV0dXJuPXQ7ZS5zaWJsaW5nIT09bnVsbDspZT1lLnNpYmxpbmcsbj1uLnNpYmxpbmc9Q28oZSxlLnBlbmRpbmdQcm9wcyksbi5yZXR1cm49dDtuLnNpYmxpbmc9bnVsbH1yZXR1cm4gdC5jaGlsZH1mdW5jdGlvbiBDayhlLHQsbil7c3dpdGNoKHQudGFnKXtjYXNlIDM6T3godCksdmwoKTticmVhaztjYXNlIDU6c3godCk7YnJlYWs7Y2FzZSAxOmRuKHQudHlwZSkmJlp1KHQpO2JyZWFrO2Nhc2UgNDpyZyh0LHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6dmFyIHI9dC50eXBlLl9jb250ZXh0LG89dC5tZW1vaXplZFByb3BzLnZhbHVlO0ZlKHRjLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPW87YnJlYWs7Y2FzZSAxMzppZihyPXQubWVtb2l6ZWRTdGF0ZSxyIT09bnVsbClyZXR1cm4gci5kZWh5ZHJhdGVkIT09bnVsbD8oRmUoSmUsSmUuY3VycmVudCYxKSx0LmZsYWdzfD0xMjgsbnVsbCk6biZ0LmNoaWxkLmNoaWxkTGFuZXM/QXgoZSx0LG4pOihGZShKZSxKZS5jdXJyZW50JjEpLGU9RnIoZSx0LG4pLGUhPT1udWxsP2Uuc2libGluZzpudWxsKTtGZShKZSxKZS5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6aWYocj0obiZ0LmNoaWxkTGFuZXMpIT09MCxlLmZsYWdzJjEyOCl7aWYocilyZXR1cm4gTXgoZSx0LG4pO3QuZmxhZ3N8PTEyOH1pZihvPXQubWVtb2l6ZWRTdGF0ZSxvIT09bnVsbCYmKG8ucmVuZGVyaW5nPW51bGwsby50YWlsPW51bGwsby5sYXN0RWZmZWN0PW51bGwpLEZlKEplLEplLmN1cnJlbnQpLHIpYnJlYWs7cmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiB0LmxhbmVzPTAsUngoZSx0LG4pfXJldHVybiBGcihlLHQsbil9dmFyIER4LHhoLEx4LEl4O0R4PWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQuY2hpbGQ7biE9PW51bGw7KXtpZihuLnRhZz09PTV8fG4udGFnPT09NillLmFwcGVuZENoaWxkKG4uc3RhdGVOb2RlKTtlbHNlIGlmKG4udGFnIT09NCYmbi5jaGlsZCE9PW51bGwpe24uY2hpbGQucmV0dXJuPW4sbj1uLmNoaWxkO2NvbnRpbnVlfWlmKG49PT10KWJyZWFrO2Zvcig7bi5zaWJsaW5nPT09bnVsbDspe2lmKG4ucmV0dXJuPT09bnVsbHx8bi5yZXR1cm49PT10KXJldHVybjtuPW4ucmV0dXJufW4uc2libGluZy5yZXR1cm49bi5yZXR1cm4sbj1uLnNpYmxpbmd9fTt4aD1mdW5jdGlvbigpe307THg9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZS5tZW1vaXplZFByb3BzO2lmKG8hPT1yKXtlPXQuc3RhdGVOb2RlLFpvKGdyLmN1cnJlbnQpO3ZhciBpPW51bGw7c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOm89QmYoZSxvKSxyPUJmKGUsciksaT1bXTticmVhaztjYXNlInNlbGVjdCI6bz10dCh7fSxvLHt2YWx1ZTp2b2lkIDB9KSxyPXR0KHt9LHIse3ZhbHVlOnZvaWQgMH0pLGk9W107YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6bz1WZihlLG8pLHI9VmYoZSxyKSxpPVtdO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIG8ub25DbGljayE9ImZ1bmN0aW9uIiYmdHlwZW9mIHIub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz1RdSl9S2YobixyKTt2YXIgbDtuPW51bGw7Zm9yKHUgaW4gbylpZighci5oYXNPd25Qcm9wZXJ0eSh1KSYmby5oYXNPd25Qcm9wZXJ0eSh1KSYmb1t1XSE9bnVsbClpZih1PT09InN0eWxlIil7dmFyIHM9b1t1XTtmb3IobCBpbiBzKXMuaGFzT3duUHJvcGVydHkobCkmJihufHwobj17fSksbltsXT0iIil9ZWxzZSB1IT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiYmdSE9PSJjaGlsZHJlbiImJnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZ1IT09ImF1dG9Gb2N1cyImJihLcy5oYXNPd25Qcm9wZXJ0eSh1KT9pfHwoaT1bXSk6KGk9aXx8W10pLnB1c2godSxudWxsKSk7Zm9yKHUgaW4gcil7dmFyIGE9clt1XTtpZihzPW8hPW51bGw/b1t1XTp2b2lkIDAsci5oYXNPd25Qcm9wZXJ0eSh1KSYmYSE9PXMmJihhIT1udWxsfHxzIT1udWxsKSlpZih1PT09InN0eWxlIilpZihzKXtmb3IobCBpbiBzKSFzLmhhc093blByb3BlcnR5KGwpfHxhJiZhLmhhc093blByb3BlcnR5KGwpfHwobnx8KG49e30pLG5bbF09IiIpO2ZvcihsIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShsKSYmc1tsXSE9PWFbbF0mJihufHwobj17fSksbltsXT1hW2xdKX1lbHNlIG58fChpfHwoaT1bXSksaS5wdXNoKHUsbikpLG49YTtlbHNlIHU9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyhhPWE/YS5fX2h0bWw6dm9pZCAwLHM9cz9zLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmcyE9PWEmJihpPWl8fFtdKS5wdXNoKHUsYSkpOnU9PT0iY2hpbGRyZW4iP3R5cGVvZiBhIT0ic3RyaW5nIiYmdHlwZW9mIGEhPSJudW1iZXIifHwoaT1pfHxbXSkucHVzaCh1LCIiK2EpOnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiYoS3MuaGFzT3duUHJvcGVydHkodSk/KGEhPW51bGwmJnU9PT0ib25TY3JvbGwiJiZVZSgic2Nyb2xsIixlKSxpfHxzPT09YXx8KGk9W10pKTooaT1pfHxbXSkucHVzaCh1LGEpKX1uJiYoaT1pfHxbXSkucHVzaCgic3R5bGUiLG4pO3ZhciB1PWk7KHQudXBkYXRlUXVldWU9dSkmJih0LmZsYWdzfD00KX19O0l4PWZ1bmN0aW9uKGUsdCxuLHIpe24hPT1yJiYodC5mbGFnc3w9NCl9O2Z1bmN0aW9uIGlzKGUsdCl7aWYoIVllKXN3aXRjaChlLnRhaWxNb2RlKXtjYXNlImhpZGRlbiI6dD1lLnRhaWw7Zm9yKHZhciBuPW51bGw7dCE9PW51bGw7KXQuYWx0ZXJuYXRlIT09bnVsbCYmKG49dCksdD10LnNpYmxpbmc7bj09PW51bGw/ZS50YWlsPW51bGw6bi5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSJjb2xsYXBzZWQiOm49ZS50YWlsO2Zvcih2YXIgcj1udWxsO24hPT1udWxsOyluLmFsdGVybmF0ZSE9PW51bGwmJihyPW4pLG49bi5zaWJsaW5nO3I9PT1udWxsP3R8fGUudGFpbD09PW51bGw/ZS50YWlsPW51bGw6ZS50YWlsLnNpYmxpbmc9bnVsbDpyLnNpYmxpbmc9bnVsbH19ZnVuY3Rpb24gQnQoZSl7dmFyIHQ9ZS5hbHRlcm5hdGUhPT1udWxsJiZlLmFsdGVybmF0ZS5jaGlsZD09PWUuY2hpbGQsbj0wLHI9MDtpZih0KWZvcih2YXIgbz1lLmNoaWxkO28hPT1udWxsOylufD1vLmxhbmVzfG8uY2hpbGRMYW5lcyxyfD1vLnN1YnRyZWVGbGFncyYxNDY4MDA2NCxyfD1vLmZsYWdzJjE0NjgwMDY0LG8ucmV0dXJuPWUsbz1vLnNpYmxpbmc7ZWxzZSBmb3Iobz1lLmNoaWxkO28hPT1udWxsOylufD1vLmxhbmVzfG8uY2hpbGRMYW5lcyxyfD1vLnN1YnRyZWVGbGFncyxyfD1vLmZsYWdzLG8ucmV0dXJuPWUsbz1vLnNpYmxpbmc7cmV0dXJuIGUuc3VidHJlZUZsYWdzfD1yLGUuY2hpbGRMYW5lcz1uLHR9ZnVuY3Rpb24gJGsoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzO3N3aXRjaChRcCh0KSx0LnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIEJ0KHQpLG51bGw7Y2FzZSAxOnJldHVybiBkbih0LnR5cGUpJiZKdSgpLEJ0KHQpLG51bGw7Y2FzZSAzOnJldHVybiByPXQuc3RhdGVOb2RlLHhsKCksR2UoY24pLEdlKEt0KSxpZygpLHIucGVuZGluZ0NvbnRleHQmJihyLmNvbnRleHQ9ci5wZW5kaW5nQ29udGV4dCxyLnBlbmRpbmdDb250ZXh0PW51bGwpLChlPT09bnVsbHx8ZS5jaGlsZD09PW51bGwpJiYocnUodCk/dC5mbGFnc3w9NDplPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmISh0LmZsYWdzJjI1Nil8fCh0LmZsYWdzfD0xMDI0LFhuIT09bnVsbCYmKFRoKFhuKSxYbj1udWxsKSkpLHhoKGUsdCksQnQodCksbnVsbDtjYXNlIDU6b2codCk7dmFyIG89Wm8ob2EuY3VycmVudCk7aWYobj10LnR5cGUsZSE9PW51bGwmJnQuc3RhdGVOb2RlIT1udWxsKUx4KGUsdCxuLHIsbyksZS5yZWYhPT10LnJlZiYmKHQuZmxhZ3N8PTUxMix0LmZsYWdzfD0yMDk3MTUyKTtlbHNle2lmKCFyKXtpZih0LnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoVygxNjYpKTtyZXR1cm4gQnQodCksbnVsbH1pZihlPVpvKGdyLmN1cnJlbnQpLHJ1KHQpKXtyPXQuc3RhdGVOb2RlLG49dC50eXBlO3ZhciBpPXQubWVtb2l6ZWRQcm9wcztzd2l0Y2goclt1cl09dCxyW25hXT1pLGU9KHQubW9kZSYxKSE9PTAsbil7Y2FzZSJkaWFsb2ciOlVlKCJjYW5jZWwiLHIpLFVlKCJjbG9zZSIscik7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjpVZSgibG9hZCIscik7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKG89MDtvPHZzLmxlbmd0aDtvKyspVWUodnNbb10scik7YnJlYWs7Y2FzZSJzb3VyY2UiOlVlKCJlcnJvciIscik7YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6VWUoImVycm9yIixyKSxVZSgibG9hZCIscik7YnJlYWs7Y2FzZSJkZXRhaWxzIjpVZSgidG9nZ2xlIixyKTticmVhaztjYXNlImlucHV0IjpWbShyLGkpLFVlKCJpbnZhbGlkIixyKTticmVhaztjYXNlInNlbGVjdCI6ci5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIWkubXVsdGlwbGV9LFVlKCJpbnZhbGlkIixyKTticmVhaztjYXNlInRleHRhcmVhIjpLbShyLGkpLFVlKCJpbnZhbGlkIixyKX1LZihuLGkpLG89bnVsbDtmb3IodmFyIGwgaW4gaSlpZihpLmhhc093blByb3BlcnR5KGwpKXt2YXIgcz1pW2xdO2w9PT0iY2hpbGRyZW4iP3R5cGVvZiBzPT0ic3RyaW5nIj9yLnRleHRDb250ZW50IT09cyYmKGkuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJm51KHIudGV4dENvbnRlbnQscyxlKSxvPVsiY2hpbGRyZW4iLHNdKTp0eXBlb2Ygcz09Im51bWJlciImJnIudGV4dENvbnRlbnQhPT0iIitzJiYoaS5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmbnUoci50ZXh0Q29udGVudCxzLGUpLG89WyJjaGlsZHJlbiIsIiIrc10pOktzLmhhc093blByb3BlcnR5KGwpJiZzIT1udWxsJiZsPT09Im9uU2Nyb2xsIiYmVWUoInNjcm9sbCIscil9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOllhKHIpLEhtKHIsaSwhMCk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6WWEociksR20ocik7YnJlYWs7Y2FzZSJzZWxlY3QiOmNhc2Uib3B0aW9uIjpicmVhaztkZWZhdWx0OnR5cGVvZiBpLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihyLm9uY2xpY2s9UXUpfXI9byx0LnVwZGF0ZVF1ZXVlPXIsciE9PW51bGwmJih0LmZsYWdzfD00KX1lbHNle2w9by5ub2RlVHlwZT09PTk/bzpvLm93bmVyRG9jdW1lbnQsZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiYmKGU9YzEobikpLGU9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI/bj09PSJzY3JpcHQiPyhlPWwuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5pbm5lckhUTUw9IjxzY3JpcHQ+PFwvc2NyaXB0PiIsZT1lLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCkpOnR5cGVvZiByLmlzPT0ic3RyaW5nIj9lPWwuY3JlYXRlRWxlbWVudChuLHtpczpyLmlzfSk6KGU9bC5jcmVhdGVFbGVtZW50KG4pLG49PT0ic2VsZWN0IiYmKGw9ZSxyLm11bHRpcGxlP2wubXVsdGlwbGU9ITA6ci5zaXplJiYobC5zaXplPXIuc2l6ZSkpKTplPWwuY3JlYXRlRWxlbWVudE5TKGUsbiksZVt1cl09dCxlW25hXT1yLER4KGUsdCwhMSwhMSksdC5zdGF0ZU5vZGU9ZTtlOntzd2l0Y2gobD1HZihuLHIpLG4pe2Nhc2UiZGlhbG9nIjpVZSgiY2FuY2VsIixlKSxVZSgiY2xvc2UiLGUpLG89cjticmVhaztjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiZW1iZWQiOlVlKCJsb2FkIixlKSxvPXI7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKG89MDtvPHZzLmxlbmd0aDtvKyspVWUodnNbb10sZSk7bz1yO2JyZWFrO2Nhc2Uic291cmNlIjpVZSgiZXJyb3IiLGUpLG89cjticmVhaztjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJsaW5rIjpVZSgiZXJyb3IiLGUpLFVlKCJsb2FkIixlKSxvPXI7YnJlYWs7Y2FzZSJkZXRhaWxzIjpVZSgidG9nZ2xlIixlKSxvPXI7YnJlYWs7Y2FzZSJpbnB1dCI6Vm0oZSxyKSxvPUJmKGUsciksVWUoImludmFsaWQiLGUpO2JyZWFrO2Nhc2Uib3B0aW9uIjpvPXI7YnJlYWs7Y2FzZSJzZWxlY3QiOmUuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFyLm11bHRpcGxlfSxvPXR0KHt9LHIse3ZhbHVlOnZvaWQgMH0pLFVlKCJpbnZhbGlkIixlKTticmVhaztjYXNlInRleHRhcmVhIjpLbShlLHIpLG89VmYoZSxyKSxVZSgiaW52YWxpZCIsZSk7YnJlYWs7ZGVmYXVsdDpvPXJ9S2YobixvKSxzPW87Zm9yKGkgaW4gcylpZihzLmhhc093blByb3BlcnR5KGkpKXt2YXIgYT1zW2ldO2k9PT0ic3R5bGUiP2gxKGUsYSk6aT09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/KGE9YT9hLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmZDEoZSxhKSk6aT09PSJjaGlsZHJlbiI/dHlwZW9mIGE9PSJzdHJpbmciPyhuIT09InRleHRhcmVhInx8YSE9PSIiKSYmR3MoZSxhKTp0eXBlb2YgYT09Im51bWJlciImJkdzKGUsIiIrYSk6aSE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZpIT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJmkhPT0iYXV0b0ZvY3VzIiYmKEtzLmhhc093blByb3BlcnR5KGkpP2EhPW51bGwmJmk9PT0ib25TY3JvbGwiJiZVZSgic2Nyb2xsIixlKTphIT1udWxsJiZEcChlLGksYSxsKSl9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOllhKGUpLEhtKGUsciwhMSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6WWEoZSksR20oZSk7YnJlYWs7Y2FzZSJvcHRpb24iOnIudmFsdWUhPW51bGwmJmUuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIrVG8oci52YWx1ZSkpO2JyZWFrO2Nhc2Uic2VsZWN0IjplLm11bHRpcGxlPSEhci5tdWx0aXBsZSxpPXIudmFsdWUsaSE9bnVsbD9vbChlLCEhci5tdWx0aXBsZSxpLCExKTpyLmRlZmF1bHRWYWx1ZSE9bnVsbCYmb2woZSwhIXIubXVsdGlwbGUsci5kZWZhdWx0VmFsdWUsITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIG8ub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz1RdSl9c3dpdGNoKG4pe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6cj0hIXIuYXV0b0ZvY3VzO2JyZWFrIGU7Y2FzZSJpbWciOnI9ITA7YnJlYWsgZTtkZWZhdWx0OnI9ITF9fXImJih0LmZsYWdzfD00KX10LnJlZiE9PW51bGwmJih0LmZsYWdzfD01MTIsdC5mbGFnc3w9MjA5NzE1Mil9cmV0dXJuIEJ0KHQpLG51bGw7Y2FzZSA2OmlmKGUmJnQuc3RhdGVOb2RlIT1udWxsKUl4KGUsdCxlLm1lbW9pemVkUHJvcHMscik7ZWxzZXtpZih0eXBlb2YgciE9InN0cmluZyImJnQuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihXKDE2NikpO2lmKG49Wm8ob2EuY3VycmVudCksWm8oZ3IuY3VycmVudCkscnUodCkpe2lmKHI9dC5zdGF0ZU5vZGUsbj10Lm1lbW9pemVkUHJvcHMsclt1cl09dCwoaT1yLm5vZGVWYWx1ZSE9PW4pJiYoZT14bixlIT09bnVsbCkpc3dpdGNoKGUudGFnKXtjYXNlIDM6bnUoci5ub2RlVmFsdWUsbiwoZS5tb2RlJjEpIT09MCk7YnJlYWs7Y2FzZSA1OmUubWVtb2l6ZWRQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmbnUoci5ub2RlVmFsdWUsbiwoZS5tb2RlJjEpIT09MCl9aSYmKHQuZmxhZ3N8PTQpfWVsc2Ugcj0obi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKHIpLHJbdXJdPXQsdC5zdGF0ZU5vZGU9cn1yZXR1cm4gQnQodCksbnVsbDtjYXNlIDEzOmlmKEdlKEplKSxyPXQubWVtb2l6ZWRTdGF0ZSxlPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihZZSYmeW4hPT1udWxsJiZ0Lm1vZGUmMSYmISh0LmZsYWdzJjEyOCkpZXgoKSx2bCgpLHQuZmxhZ3N8PTk4NTYwLGk9ITE7ZWxzZSBpZihpPXJ1KHQpLHIhPT1udWxsJiZyLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihlPT09bnVsbCl7aWYoIWkpdGhyb3cgRXJyb3IoVygzMTgpKTtpZihpPXQubWVtb2l6ZWRTdGF0ZSxpPWkhPT1udWxsP2kuZGVoeWRyYXRlZDpudWxsLCFpKXRocm93IEVycm9yKFcoMzE3KSk7aVt1cl09dH1lbHNlIHZsKCksISh0LmZsYWdzJjEyOCkmJih0Lm1lbW9pemVkU3RhdGU9bnVsbCksdC5mbGFnc3w9NDtCdCh0KSxpPSExfWVsc2UgWG4hPT1udWxsJiYoVGgoWG4pLFhuPW51bGwpLGk9ITA7aWYoIWkpcmV0dXJuIHQuZmxhZ3MmNjU1MzY/dDpudWxsfXJldHVybiB0LmZsYWdzJjEyOD8odC5sYW5lcz1uLHQpOihyPXIhPT1udWxsLHIhPT0oZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiZyJiYodC5jaGlsZC5mbGFnc3w9ODE5Mix0Lm1vZGUmMSYmKGU9PT1udWxsfHxKZS5jdXJyZW50JjE/eHQ9PT0wJiYoeHQ9Myk6dmcoKSkpLHQudXBkYXRlUXVldWUhPT1udWxsJiYodC5mbGFnc3w9NCksQnQodCksbnVsbCk7Y2FzZSA0OnJldHVybiB4bCgpLHhoKGUsdCksZT09PW51bGwmJmVhKHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLEJ0KHQpLG51bGw7Y2FzZSAxMDpyZXR1cm4gZWcodC50eXBlLl9jb250ZXh0KSxCdCh0KSxudWxsO2Nhc2UgMTc6cmV0dXJuIGRuKHQudHlwZSkmJkp1KCksQnQodCksbnVsbDtjYXNlIDE5OmlmKEdlKEplKSxpPXQubWVtb2l6ZWRTdGF0ZSxpPT09bnVsbClyZXR1cm4gQnQodCksbnVsbDtpZihyPSh0LmZsYWdzJjEyOCkhPT0wLGw9aS5yZW5kZXJpbmcsbD09PW51bGwpaWYocilpcyhpLCExKTtlbHNle2lmKHh0IT09MHx8ZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWZvcihlPXQuY2hpbGQ7ZSE9PW51bGw7KXtpZihsPW9jKGUpLGwhPT1udWxsKXtmb3IodC5mbGFnc3w9MTI4LGlzKGksITEpLHI9bC51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKHQudXBkYXRlUXVldWU9cix0LmZsYWdzfD00KSx0LnN1YnRyZWVGbGFncz0wLHI9bixuPXQuY2hpbGQ7biE9PW51bGw7KWk9bixlPXIsaS5mbGFncyY9MTQ2ODAwNjYsbD1pLmFsdGVybmF0ZSxsPT09bnVsbD8oaS5jaGlsZExhbmVzPTAsaS5sYW5lcz1lLGkuY2hpbGQ9bnVsbCxpLnN1YnRyZWVGbGFncz0wLGkubWVtb2l6ZWRQcm9wcz1udWxsLGkubWVtb2l6ZWRTdGF0ZT1udWxsLGkudXBkYXRlUXVldWU9bnVsbCxpLmRlcGVuZGVuY2llcz1udWxsLGkuc3RhdGVOb2RlPW51bGwpOihpLmNoaWxkTGFuZXM9bC5jaGlsZExhbmVzLGkubGFuZXM9bC5sYW5lcyxpLmNoaWxkPWwuY2hpbGQsaS5zdWJ0cmVlRmxhZ3M9MCxpLmRlbGV0aW9ucz1udWxsLGkubWVtb2l6ZWRQcm9wcz1sLm1lbW9pemVkUHJvcHMsaS5tZW1vaXplZFN0YXRlPWwubWVtb2l6ZWRTdGF0ZSxpLnVwZGF0ZVF1ZXVlPWwudXBkYXRlUXVldWUsaS50eXBlPWwudHlwZSxlPWwuZGVwZW5kZW5jaWVzLGkuZGVwZW5kZW5jaWVzPWU9PT1udWxsP251bGw6e2xhbmVzOmUubGFuZXMsZmlyc3RDb250ZXh0OmUuZmlyc3RDb250ZXh0fSksbj1uLnNpYmxpbmc7cmV0dXJuIEZlKEplLEplLmN1cnJlbnQmMXwyKSx0LmNoaWxkfWU9ZS5zaWJsaW5nfWkudGFpbCE9PW51bGwmJnV0KCk+d2wmJih0LmZsYWdzfD0xMjgscj0hMCxpcyhpLCExKSx0LmxhbmVzPTQxOTQzMDQpfWVsc2V7aWYoIXIpaWYoZT1vYyhsKSxlIT09bnVsbCl7aWYodC5mbGFnc3w9MTI4LHI9ITAsbj1lLnVwZGF0ZVF1ZXVlLG4hPT1udWxsJiYodC51cGRhdGVRdWV1ZT1uLHQuZmxhZ3N8PTQpLGlzKGksITApLGkudGFpbD09PW51bGwmJmkudGFpbE1vZGU9PT0iaGlkZGVuIiYmIWwuYWx0ZXJuYXRlJiYhWWUpcmV0dXJuIEJ0KHQpLG51bGx9ZWxzZSAyKnV0KCktaS5yZW5kZXJpbmdTdGFydFRpbWU+d2wmJm4hPT0xMDczNzQxODI0JiYodC5mbGFnc3w9MTI4LHI9ITAsaXMoaSwhMSksdC5sYW5lcz00MTk0MzA0KTtpLmlzQmFja3dhcmRzPyhsLnNpYmxpbmc9dC5jaGlsZCx0LmNoaWxkPWwpOihuPWkubGFzdCxuIT09bnVsbD9uLnNpYmxpbmc9bDp0LmNoaWxkPWwsaS5sYXN0PWwpfXJldHVybiBpLnRhaWwhPT1udWxsPyh0PWkudGFpbCxpLnJlbmRlcmluZz10LGkudGFpbD10LnNpYmxpbmcsaS5yZW5kZXJpbmdTdGFydFRpbWU9dXQoKSx0LnNpYmxpbmc9bnVsbCxuPUplLmN1cnJlbnQsRmUoSmUscj9uJjF8MjpuJjEpLHQpOihCdCh0KSxudWxsKTtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIG1nKCkscj10Lm1lbW9pemVkU3RhdGUhPT1udWxsLGUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGUhPT1udWxsIT09ciYmKHQuZmxhZ3N8PTgxOTIpLHImJnQubW9kZSYxP2duJjEwNzM3NDE4MjQmJihCdCh0KSx0LnN1YnRyZWVGbGFncyY2JiYodC5mbGFnc3w9ODE5MikpOkJ0KHQpLG51bGw7Y2FzZSAyNDpyZXR1cm4gbnVsbDtjYXNlIDI1OnJldHVybiBudWxsfXRocm93IEVycm9yKFcoMTU2LHQudGFnKSl9ZnVuY3Rpb24ga2soZSx0KXtzd2l0Y2goUXAodCksdC50YWcpe2Nhc2UgMTpyZXR1cm4gZG4odC50eXBlKSYmSnUoKSxlPXQuZmxhZ3MsZSY2NTUzNj8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDM6cmV0dXJuIHhsKCksR2UoY24pLEdlKEt0KSxpZygpLGU9dC5mbGFncyxlJjY1NTM2JiYhKGUmMTI4KT8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDU6cmV0dXJuIG9nKHQpLG51bGw7Y2FzZSAxMzppZihHZShKZSksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJmUuZGVoeWRyYXRlZCE9PW51bGwpe2lmKHQuYWx0ZXJuYXRlPT09bnVsbCl0aHJvdyBFcnJvcihXKDM0MCkpO3ZsKCl9cmV0dXJuIGU9dC5mbGFncyxlJjY1NTM2Pyh0LmZsYWdzPWUmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgMTk6cmV0dXJuIEdlKEplKSxudWxsO2Nhc2UgNDpyZXR1cm4geGwoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIGVnKHQudHlwZS5fY29udGV4dCksbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIG1nKCksbnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciBsdT0hMSxVdD0hMSxUaz10eXBlb2YgV2Vha1NldD09ImZ1bmN0aW9uIj9XZWFrU2V0OlNldCxKPW51bGw7ZnVuY3Rpb24gWmkoZSx0KXt2YXIgbj1lLnJlZjtpZihuIT09bnVsbClpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIil0cnl7bihudWxsKX1jYXRjaChyKXtudChlLHQscil9ZWxzZSBuLmN1cnJlbnQ9bnVsbH1mdW5jdGlvbiBfaChlLHQsbil7dHJ5e24oKX1jYXRjaChyKXtudChlLHQscil9fXZhciBMdj0hMTtmdW5jdGlvbiBOayhlLHQpe2lmKHJoPUd1LGU9QjEoKSxZcChlKSl7aWYoInNlbGVjdGlvblN0YXJ0ImluIGUpdmFyIG49e3N0YXJ0OmUuc2VsZWN0aW9uU3RhcnQsZW5kOmUuc2VsZWN0aW9uRW5kfTtlbHNlIGU6e249KG49ZS5vd25lckRvY3VtZW50KSYmbi5kZWZhdWx0Vmlld3x8d2luZG93O3ZhciByPW4uZ2V0U2VsZWN0aW9uJiZuLmdldFNlbGVjdGlvbigpO2lmKHImJnIucmFuZ2VDb3VudCE9PTApe249ci5hbmNob3JOb2RlO3ZhciBvPXIuYW5jaG9yT2Zmc2V0LGk9ci5mb2N1c05vZGU7cj1yLmZvY3VzT2Zmc2V0O3RyeXtuLm5vZGVUeXBlLGkubm9kZVR5cGV9Y2F0Y2h7bj1udWxsO2JyZWFrIGV9dmFyIGw9MCxzPS0xLGE9LTEsdT0wLGM9MCxkPWUsZj1udWxsO3Q6Zm9yKDs7KXtmb3IodmFyIGg7ZCE9PW58fG8hPT0wJiZkLm5vZGVUeXBlIT09M3x8KHM9bCtvKSxkIT09aXx8ciE9PTAmJmQubm9kZVR5cGUhPT0zfHwoYT1sK3IpLGQubm9kZVR5cGU9PT0zJiYobCs9ZC5ub2RlVmFsdWUubGVuZ3RoKSwoaD1kLmZpcnN0Q2hpbGQpIT09bnVsbDspZj1kLGQ9aDtmb3IoOzspe2lmKGQ9PT1lKWJyZWFrIHQ7aWYoZj09PW4mJisrdT09PW8mJihzPWwpLGY9PT1pJiYrK2M9PT1yJiYoYT1sKSwoaD1kLm5leHRTaWJsaW5nKSE9PW51bGwpYnJlYWs7ZD1mLGY9ZC5wYXJlbnROb2RlfWQ9aH1uPXM9PT0tMXx8YT09PS0xP251bGw6e3N0YXJ0OnMsZW5kOmF9fWVsc2Ugbj1udWxsfW49bnx8e3N0YXJ0OjAsZW5kOjB9fWVsc2Ugbj1udWxsO2ZvcihvaD17Zm9jdXNlZEVsZW06ZSxzZWxlY3Rpb25SYW5nZTpufSxHdT0hMSxKPXQ7SiE9PW51bGw7KWlmKHQ9SixlPXQuY2hpbGQsKHQuc3VidHJlZUZsYWdzJjEwMjgpIT09MCYmZSE9PW51bGwpZS5yZXR1cm49dCxKPWU7ZWxzZSBmb3IoO0ohPT1udWxsOyl7dD1KO3RyeXt2YXIgZz10LmFsdGVybmF0ZTtpZih0LmZsYWdzJjEwMjQpc3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmJyZWFrO2Nhc2UgMTppZihnIT09bnVsbCl7dmFyIG09Zy5tZW1vaXplZFByb3BzLFM9Zy5tZW1vaXplZFN0YXRlLHY9dC5zdGF0ZU5vZGUseT12LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKHQuZWxlbWVudFR5cGU9PT10LnR5cGU/bTpLbih0LnR5cGUsbSksUyk7di5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZT15fWJyZWFrO2Nhc2UgMzp2YXIgeD10LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO3gubm9kZVR5cGU9PT0xP3gudGV4dENvbnRlbnQ9IiI6eC5ub2RlVHlwZT09PTkmJnguZG9jdW1lbnRFbGVtZW50JiZ4LnJlbW92ZUNoaWxkKHguZG9jdW1lbnRFbGVtZW50KTticmVhaztjYXNlIDU6Y2FzZSA2OmNhc2UgNDpjYXNlIDE3OmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoVygxNjMpKX19Y2F0Y2goXyl7bnQodCx0LnJldHVybixfKX1pZihlPXQuc2libGluZyxlIT09bnVsbCl7ZS5yZXR1cm49dC5yZXR1cm4sSj1lO2JyZWFrfUo9dC5yZXR1cm59cmV0dXJuIGc9THYsTHY9ITEsZ31mdW5jdGlvbiBOcyhlLHQsbil7dmFyIHI9dC51cGRhdGVRdWV1ZTtpZihyPXIhPT1udWxsP3IubGFzdEVmZmVjdDpudWxsLHIhPT1udWxsKXt2YXIgbz1yPXIubmV4dDtkb3tpZigoby50YWcmZSk9PT1lKXt2YXIgaT1vLmRlc3Ryb3k7by5kZXN0cm95PXZvaWQgMCxpIT09dm9pZCAwJiZfaCh0LG4saSl9bz1vLm5leHR9d2hpbGUobyE9PXIpfX1mdW5jdGlvbiBYYyhlLHQpe2lmKHQ9dC51cGRhdGVRdWV1ZSx0PXQhPT1udWxsP3QubGFzdEVmZmVjdDpudWxsLHQhPT1udWxsKXt2YXIgbj10PXQubmV4dDtkb3tpZigobi50YWcmZSk9PT1lKXt2YXIgcj1uLmNyZWF0ZTtuLmRlc3Ryb3k9cigpfW49bi5uZXh0fXdoaWxlKG4hPT10KX19ZnVuY3Rpb24gd2goZSl7dmFyIHQ9ZS5yZWY7aWYodCE9PW51bGwpe3ZhciBuPWUuc3RhdGVOb2RlO3N3aXRjaChlLnRhZyl7Y2FzZSA1OmU9bjticmVhaztkZWZhdWx0OmU9bn10eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUpOnQuY3VycmVudD1lfX1mdW5jdGlvbiBqeChlKXt2YXIgdD1lLmFsdGVybmF0ZTt0IT09bnVsbCYmKGUuYWx0ZXJuYXRlPW51bGwsangodCkpLGUuY2hpbGQ9bnVsbCxlLmRlbGV0aW9ucz1udWxsLGUuc2libGluZz1udWxsLGUudGFnPT09NSYmKHQ9ZS5zdGF0ZU5vZGUsdCE9PW51bGwmJihkZWxldGUgdFt1cl0sZGVsZXRlIHRbbmFdLGRlbGV0ZSB0W3NoXSxkZWxldGUgdFtja10sZGVsZXRlIHRbZGtdKSksZS5zdGF0ZU5vZGU9bnVsbCxlLnJldHVybj1udWxsLGUuZGVwZW5kZW5jaWVzPW51bGwsZS5tZW1vaXplZFByb3BzPW51bGwsZS5tZW1vaXplZFN0YXRlPW51bGwsZS5wZW5kaW5nUHJvcHM9bnVsbCxlLnN0YXRlTm9kZT1udWxsLGUudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiB6eChlKXtyZXR1cm4gZS50YWc9PT01fHxlLnRhZz09PTN8fGUudGFnPT09NH1mdW5jdGlvbiBJdihlKXtlOmZvcig7Oyl7Zm9yKDtlLnNpYmxpbmc9PT1udWxsOyl7aWYoZS5yZXR1cm49PT1udWxsfHx6eChlLnJldHVybikpcmV0dXJuIG51bGw7ZT1lLnJldHVybn1mb3IoZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZztlLnRhZyE9PTUmJmUudGFnIT09NiYmZS50YWchPT0xODspe2lmKGUuZmxhZ3MmMnx8ZS5jaGlsZD09PW51bGx8fGUudGFnPT09NCljb250aW51ZSBlO2UuY2hpbGQucmV0dXJuPWUsZT1lLmNoaWxkfWlmKCEoZS5mbGFncyYyKSlyZXR1cm4gZS5zdGF0ZU5vZGV9fWZ1bmN0aW9uIFNoKGUsdCxuKXt2YXIgcj1lLnRhZztpZihyPT09NXx8cj09PTYpZT1lLnN0YXRlTm9kZSx0P24ubm9kZVR5cGU9PT04P24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0KTpuLmluc2VydEJlZm9yZShlLHQpOihuLm5vZGVUeXBlPT09OD8odD1uLnBhcmVudE5vZGUsdC5pbnNlcnRCZWZvcmUoZSxuKSk6KHQ9bix0LmFwcGVuZENoaWxkKGUpKSxuPW4uX3JlYWN0Um9vdENvbnRhaW5lcixuIT1udWxsfHx0Lm9uY2xpY2shPT1udWxsfHwodC5vbmNsaWNrPVF1KSk7ZWxzZSBpZihyIT09NCYmKGU9ZS5jaGlsZCxlIT09bnVsbCkpZm9yKFNoKGUsdCxuKSxlPWUuc2libGluZztlIT09bnVsbDspU2goZSx0LG4pLGU9ZS5zaWJsaW5nfWZ1bmN0aW9uIEVoKGUsdCxuKXt2YXIgcj1lLnRhZztpZihyPT09NXx8cj09PTYpZT1lLnN0YXRlTm9kZSx0P24uaW5zZXJ0QmVmb3JlKGUsdCk6bi5hcHBlbmRDaGlsZChlKTtlbHNlIGlmKHIhPT00JiYoZT1lLmNoaWxkLGUhPT1udWxsKSlmb3IoRWgoZSx0LG4pLGU9ZS5zaWJsaW5nO2UhPT1udWxsOylFaChlLHQsbiksZT1lLnNpYmxpbmd9dmFyIEF0PW51bGwsR249ITE7ZnVuY3Rpb24gZW8oZSx0LG4pe2ZvcihuPW4uY2hpbGQ7biE9PW51bGw7KUZ4KGUsdCxuKSxuPW4uc2libGluZ31mdW5jdGlvbiBGeChlLHQsbil7aWYocHImJnR5cGVvZiBwci5vbkNvbW1pdEZpYmVyVW5tb3VudD09ImZ1bmN0aW9uIil0cnl7cHIub25Db21taXRGaWJlclVubW91bnQoQmMsbil9Y2F0Y2h7fXN3aXRjaChuLnRhZyl7Y2FzZSA1OlV0fHxaaShuLHQpO2Nhc2UgNjp2YXIgcj1BdCxvPUduO0F0PW51bGwsZW8oZSx0LG4pLEF0PXIsR249byxBdCE9PW51bGwmJihHbj8oZT1BdCxuPW4uc3RhdGVOb2RlLGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTplLnJlbW92ZUNoaWxkKG4pKTpBdC5yZW1vdmVDaGlsZChuLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgMTg6QXQhPT1udWxsJiYoR24/KGU9QXQsbj1uLnN0YXRlTm9kZSxlLm5vZGVUeXBlPT09OD9lZihlLnBhcmVudE5vZGUsbik6ZS5ub2RlVHlwZT09PTEmJmVmKGUsbiksSnMoZSkpOmVmKEF0LG4uc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSA0OnI9QXQsbz1HbixBdD1uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLEduPSEwLGVvKGUsdCxuKSxBdD1yLEduPW87YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKCFVdCYmKHI9bi51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKHI9ci5sYXN0RWZmZWN0LHIhPT1udWxsKSkpe289cj1yLm5leHQ7ZG97dmFyIGk9byxsPWkuZGVzdHJveTtpPWkudGFnLGwhPT12b2lkIDAmJihpJjJ8fGkmNCkmJl9oKG4sdCxsKSxvPW8ubmV4dH13aGlsZShvIT09cil9ZW8oZSx0LG4pO2JyZWFrO2Nhc2UgMTppZighVXQmJihaaShuLHQpLHI9bi5zdGF0ZU5vZGUsdHlwZW9mIHIuY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiIpKXRyeXtyLnByb3BzPW4ubWVtb2l6ZWRQcm9wcyxyLnN0YXRlPW4ubWVtb2l6ZWRTdGF0ZSxyLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2gocyl7bnQobix0LHMpfWVvKGUsdCxuKTticmVhaztjYXNlIDIxOmVvKGUsdCxuKTticmVhaztjYXNlIDIyOm4ubW9kZSYxPyhVdD0ocj1VdCl8fG4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsZW8oZSx0LG4pLFV0PXIpOmVvKGUsdCxuKTticmVhaztkZWZhdWx0OmVvKGUsdCxuKX19ZnVuY3Rpb24ganYoZSl7dmFyIHQ9ZS51cGRhdGVRdWV1ZTtpZih0IT09bnVsbCl7ZS51cGRhdGVRdWV1ZT1udWxsO3ZhciBuPWUuc3RhdGVOb2RlO249PT1udWxsJiYobj1lLnN0YXRlTm9kZT1uZXcgVGspLHQuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgbz1Jay5iaW5kKG51bGwsZSxyKTtuLmhhcyhyKXx8KG4uYWRkKHIpLHIudGhlbihvLG8pKX0pfX1mdW5jdGlvbiBVbihlLHQpe3ZhciBuPXQuZGVsZXRpb25zO2lmKG4hPT1udWxsKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdO3RyeXt2YXIgaT1lLGw9dCxzPWw7ZTpmb3IoO3MhPT1udWxsOyl7c3dpdGNoKHMudGFnKXtjYXNlIDU6QXQ9cy5zdGF0ZU5vZGUsR249ITE7YnJlYWsgZTtjYXNlIDM6QXQ9cy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxHbj0hMDticmVhayBlO2Nhc2UgNDpBdD1zLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLEduPSEwO2JyZWFrIGV9cz1zLnJldHVybn1pZihBdD09PW51bGwpdGhyb3cgRXJyb3IoVygxNjApKTtGeChpLGwsbyksQXQ9bnVsbCxHbj0hMTt2YXIgYT1vLmFsdGVybmF0ZTthIT09bnVsbCYmKGEucmV0dXJuPW51bGwpLG8ucmV0dXJuPW51bGx9Y2F0Y2godSl7bnQobyx0LHUpfX1pZih0LnN1YnRyZWVGbGFncyYxMjg1NClmb3IodD10LmNoaWxkO3QhPT1udWxsOylCeCh0LGUpLHQ9dC5zaWJsaW5nfWZ1bmN0aW9uIEJ4KGUsdCl7dmFyIG49ZS5hbHRlcm5hdGUscj1lLmZsYWdzO3N3aXRjaChlLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKFVuKHQsZSksbHIoZSksciY0KXt0cnl7TnMoMyxlLGUucmV0dXJuKSxYYygzLGUpfWNhdGNoKG0pe250KGUsZS5yZXR1cm4sbSl9dHJ5e05zKDUsZSxlLnJldHVybil9Y2F0Y2gobSl7bnQoZSxlLnJldHVybixtKX19YnJlYWs7Y2FzZSAxOlVuKHQsZSksbHIoZSksciY1MTImJm4hPT1udWxsJiZaaShuLG4ucmV0dXJuKTticmVhaztjYXNlIDU6aWYoVW4odCxlKSxscihlKSxyJjUxMiYmbiE9PW51bGwmJlppKG4sbi5yZXR1cm4pLGUuZmxhZ3MmMzIpe3ZhciBvPWUuc3RhdGVOb2RlO3RyeXtHcyhvLCIiKX1jYXRjaChtKXtudChlLGUucmV0dXJuLG0pfX1pZihyJjQmJihvPWUuc3RhdGVOb2RlLG8hPW51bGwpKXt2YXIgaT1lLm1lbW9pemVkUHJvcHMsbD1uIT09bnVsbD9uLm1lbW9pemVkUHJvcHM6aSxzPWUudHlwZSxhPWUudXBkYXRlUXVldWU7aWYoZS51cGRhdGVRdWV1ZT1udWxsLGEhPT1udWxsKXRyeXtzPT09ImlucHV0IiYmaS50eXBlPT09InJhZGlvIiYmaS5uYW1lIT1udWxsJiZhMShvLGkpLEdmKHMsbCk7dmFyIHU9R2YocyxpKTtmb3IobD0wO2w8YS5sZW5ndGg7bCs9Mil7dmFyIGM9YVtsXSxkPWFbbCsxXTtjPT09InN0eWxlIj9oMShvLGQpOmM9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP2QxKG8sZCk6Yz09PSJjaGlsZHJlbiI/R3MobyxkKTpEcChvLGMsZCx1KX1zd2l0Y2gocyl7Y2FzZSJpbnB1dCI6V2YobyxpKTticmVhaztjYXNlInRleHRhcmVhIjp1MShvLGkpO2JyZWFrO2Nhc2Uic2VsZWN0Ijp2YXIgZj1vLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7by5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhaS5tdWx0aXBsZTt2YXIgaD1pLnZhbHVlO2ghPW51bGw/b2wobywhIWkubXVsdGlwbGUsaCwhMSk6ZiE9PSEhaS5tdWx0aXBsZSYmKGkuZGVmYXVsdFZhbHVlIT1udWxsP29sKG8sISFpLm11bHRpcGxlLGkuZGVmYXVsdFZhbHVlLCEwKTpvbChvLCEhaS5tdWx0aXBsZSxpLm11bHRpcGxlP1tdOiIiLCExKSl9b1tuYV09aX1jYXRjaChtKXtudChlLGUucmV0dXJuLG0pfX1icmVhaztjYXNlIDY6aWYoVW4odCxlKSxscihlKSxyJjQpe2lmKGUuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihXKDE2MikpO289ZS5zdGF0ZU5vZGUsaT1lLm1lbW9pemVkUHJvcHM7dHJ5e28ubm9kZVZhbHVlPWl9Y2F0Y2gobSl7bnQoZSxlLnJldHVybixtKX19YnJlYWs7Y2FzZSAzOmlmKFVuKHQsZSksbHIoZSksciY0JiZuIT09bnVsbCYmbi5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl0cnl7SnModC5jb250YWluZXJJbmZvKX1jYXRjaChtKXtudChlLGUucmV0dXJuLG0pfWJyZWFrO2Nhc2UgNDpVbih0LGUpLGxyKGUpO2JyZWFrO2Nhc2UgMTM6VW4odCxlKSxscihlKSxvPWUuY2hpbGQsby5mbGFncyY4MTkyJiYoaT1vLm1lbW9pemVkU3RhdGUhPT1udWxsLG8uc3RhdGVOb2RlLmlzSGlkZGVuPWksIWl8fG8uYWx0ZXJuYXRlIT09bnVsbCYmby5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fChwZz11dCgpKSksciY0JiZqdihlKTticmVhaztjYXNlIDIyOmlmKGM9biE9PW51bGwmJm4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsZS5tb2RlJjE/KFV0PSh1PVV0KXx8YyxVbih0LGUpLFV0PXUpOlVuKHQsZSksbHIoZSksciY4MTkyKXtpZih1PWUubWVtb2l6ZWRTdGF0ZSE9PW51bGwsKGUuc3RhdGVOb2RlLmlzSGlkZGVuPXUpJiYhYyYmZS5tb2RlJjEpZm9yKEo9ZSxjPWUuY2hpbGQ7YyE9PW51bGw7KXtmb3IoZD1KPWM7SiE9PW51bGw7KXtzd2l0Y2goZj1KLGg9Zi5jaGlsZCxmLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1Ok5zKDQsZixmLnJldHVybik7YnJlYWs7Y2FzZSAxOlppKGYsZi5yZXR1cm4pO3ZhciBnPWYuc3RhdGVOb2RlO2lmKHR5cGVvZiBnLmNvbXBvbmVudFdpbGxVbm1vdW50PT0iZnVuY3Rpb24iKXtyPWYsbj1mLnJldHVybjt0cnl7dD1yLGcucHJvcHM9dC5tZW1vaXplZFByb3BzLGcuc3RhdGU9dC5tZW1vaXplZFN0YXRlLGcuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChtKXtudChyLG4sbSl9fWJyZWFrO2Nhc2UgNTpaaShmLGYucmV0dXJuKTticmVhaztjYXNlIDIyOmlmKGYubWVtb2l6ZWRTdGF0ZSE9PW51bGwpe0Z2KGQpO2NvbnRpbnVlfX1oIT09bnVsbD8oaC5yZXR1cm49ZixKPWgpOkZ2KGQpfWM9Yy5zaWJsaW5nfWU6Zm9yKGM9bnVsbCxkPWU7Oyl7aWYoZC50YWc9PT01KXtpZihjPT09bnVsbCl7Yz1kO3RyeXtvPWQuc3RhdGVOb2RlLHU/KGk9by5zdHlsZSx0eXBlb2YgaS5zZXRQcm9wZXJ0eT09ImZ1bmN0aW9uIj9pLnNldFByb3BlcnR5KCJkaXNwbGF5Iiwibm9uZSIsImltcG9ydGFudCIpOmkuZGlzcGxheT0ibm9uZSIpOihzPWQuc3RhdGVOb2RlLGE9ZC5tZW1vaXplZFByb3BzLnN0eWxlLGw9YSE9bnVsbCYmYS5oYXNPd25Qcm9wZXJ0eSgiZGlzcGxheSIpP2EuZGlzcGxheTpudWxsLHMuc3R5bGUuZGlzcGxheT1mMSgiZGlzcGxheSIsbCkpfWNhdGNoKG0pe250KGUsZS5yZXR1cm4sbSl9fX1lbHNlIGlmKGQudGFnPT09Nil7aWYoYz09PW51bGwpdHJ5e2Quc3RhdGVOb2RlLm5vZGVWYWx1ZT11PyIiOmQubWVtb2l6ZWRQcm9wc31jYXRjaChtKXtudChlLGUucmV0dXJuLG0pfX1lbHNlIGlmKChkLnRhZyE9PTIyJiZkLnRhZyE9PTIzfHxkLm1lbW9pemVkU3RhdGU9PT1udWxsfHxkPT09ZSkmJmQuY2hpbGQhPT1udWxsKXtkLmNoaWxkLnJldHVybj1kLGQ9ZC5jaGlsZDtjb250aW51ZX1pZihkPT09ZSlicmVhayBlO2Zvcig7ZC5zaWJsaW5nPT09bnVsbDspe2lmKGQucmV0dXJuPT09bnVsbHx8ZC5yZXR1cm49PT1lKWJyZWFrIGU7Yz09PWQmJihjPW51bGwpLGQ9ZC5yZXR1cm59Yz09PWQmJihjPW51bGwpLGQuc2libGluZy5yZXR1cm49ZC5yZXR1cm4sZD1kLnNpYmxpbmd9fWJyZWFrO2Nhc2UgMTk6VW4odCxlKSxscihlKSxyJjQmJmp2KGUpO2JyZWFrO2Nhc2UgMjE6YnJlYWs7ZGVmYXVsdDpVbih0LGUpLGxyKGUpfX1mdW5jdGlvbiBscihlKXt2YXIgdD1lLmZsYWdzO2lmKHQmMil7dHJ5e2U6e2Zvcih2YXIgbj1lLnJldHVybjtuIT09bnVsbDspe2lmKHp4KG4pKXt2YXIgcj1uO2JyZWFrIGV9bj1uLnJldHVybn10aHJvdyBFcnJvcihXKDE2MCkpfXN3aXRjaChyLnRhZyl7Y2FzZSA1OnZhciBvPXIuc3RhdGVOb2RlO3IuZmxhZ3MmMzImJihHcyhvLCIiKSxyLmZsYWdzJj0tMzMpO3ZhciBpPUl2KGUpO0VoKGUsaSxvKTticmVhaztjYXNlIDM6Y2FzZSA0OnZhciBsPXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8scz1JdihlKTtTaChlLHMsbCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihXKDE2MSkpfX1jYXRjaChhKXtudChlLGUucmV0dXJuLGEpfWUuZmxhZ3MmPS0zfXQmNDA5NiYmKGUuZmxhZ3MmPS00MDk3KX1mdW5jdGlvbiBiayhlLHQsbil7Sj1lLFd4KGUpfWZ1bmN0aW9uIFd4KGUsdCxuKXtmb3IodmFyIHI9KGUubW9kZSYxKSE9PTA7SiE9PW51bGw7KXt2YXIgbz1KLGk9by5jaGlsZDtpZihvLnRhZz09PTIyJiZyKXt2YXIgbD1vLm1lbW9pemVkU3RhdGUhPT1udWxsfHxsdTtpZighbCl7dmFyIHM9by5hbHRlcm5hdGUsYT1zIT09bnVsbCYmcy5tZW1vaXplZFN0YXRlIT09bnVsbHx8VXQ7cz1sdTt2YXIgdT1VdDtpZihsdT1sLChVdD1hKSYmIXUpZm9yKEo9bztKIT09bnVsbDspbD1KLGE9bC5jaGlsZCxsLnRhZz09PTIyJiZsLm1lbW9pemVkU3RhdGUhPT1udWxsP0J2KG8pOmEhPT1udWxsPyhhLnJldHVybj1sLEo9YSk6QnYobyk7Zm9yKDtpIT09bnVsbDspSj1pLFd4KGkpLGk9aS5zaWJsaW5nO0o9byxsdT1zLFV0PXV9enYoZSl9ZWxzZSBvLnN1YnRyZWVGbGFncyY4NzcyJiZpIT09bnVsbD8oaS5yZXR1cm49byxKPWkpOnp2KGUpfX1mdW5jdGlvbiB6dihlKXtmb3IoO0ohPT1udWxsOyl7dmFyIHQ9SjtpZih0LmZsYWdzJjg3NzIpe3ZhciBuPXQuYWx0ZXJuYXRlO3RyeXtpZih0LmZsYWdzJjg3NzIpc3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OlV0fHxYYyg1LHQpO2JyZWFrO2Nhc2UgMTp2YXIgcj10LnN0YXRlTm9kZTtpZih0LmZsYWdzJjQmJiFVdClpZihuPT09bnVsbClyLmNvbXBvbmVudERpZE1vdW50KCk7ZWxzZXt2YXIgbz10LmVsZW1lbnRUeXBlPT09dC50eXBlP24ubWVtb2l6ZWRQcm9wczpLbih0LnR5cGUsbi5tZW1vaXplZFByb3BzKTtyLmNvbXBvbmVudERpZFVwZGF0ZShvLG4ubWVtb2l6ZWRTdGF0ZSxyLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKX12YXIgaT10LnVwZGF0ZVF1ZXVlO2khPT1udWxsJiZTdih0LGkscik7YnJlYWs7Y2FzZSAzOnZhciBsPXQudXBkYXRlUXVldWU7aWYobCE9PW51bGwpe2lmKG49bnVsbCx0LmNoaWxkIT09bnVsbClzd2l0Y2godC5jaGlsZC50YWcpe2Nhc2UgNTpuPXQuY2hpbGQuc3RhdGVOb2RlO2JyZWFrO2Nhc2UgMTpuPXQuY2hpbGQuc3RhdGVOb2RlfVN2KHQsbCxuKX1icmVhaztjYXNlIDU6dmFyIHM9dC5zdGF0ZU5vZGU7aWYobj09PW51bGwmJnQuZmxhZ3MmNCl7bj1zO3ZhciBhPXQubWVtb2l6ZWRQcm9wcztzd2l0Y2godC50eXBlKXtjYXNlImJ1dHRvbiI6Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmEuYXV0b0ZvY3VzJiZuLmZvY3VzKCk7YnJlYWs7Y2FzZSJpbWciOmEuc3JjJiYobi5zcmM9YS5zcmMpfX1icmVhaztjYXNlIDY6YnJlYWs7Y2FzZSA0OmJyZWFrO2Nhc2UgMTI6YnJlYWs7Y2FzZSAxMzppZih0Lm1lbW9pemVkU3RhdGU9PT1udWxsKXt2YXIgdT10LmFsdGVybmF0ZTtpZih1IT09bnVsbCl7dmFyIGM9dS5tZW1vaXplZFN0YXRlO2lmKGMhPT1udWxsKXt2YXIgZD1jLmRlaHlkcmF0ZWQ7ZCE9PW51bGwmJkpzKGQpfX19YnJlYWs7Y2FzZSAxOTpjYXNlIDE3OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDIzOmNhc2UgMjU6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihXKDE2MykpfVV0fHx0LmZsYWdzJjUxMiYmd2godCl9Y2F0Y2goZil7bnQodCx0LnJldHVybixmKX19aWYodD09PWUpe0o9bnVsbDticmVha31pZihuPXQuc2libGluZyxuIT09bnVsbCl7bi5yZXR1cm49dC5yZXR1cm4sSj1uO2JyZWFrfUo9dC5yZXR1cm59fWZ1bmN0aW9uIEZ2KGUpe2Zvcig7SiE9PW51bGw7KXt2YXIgdD1KO2lmKHQ9PT1lKXtKPW51bGw7YnJlYWt9dmFyIG49dC5zaWJsaW5nO2lmKG4hPT1udWxsKXtuLnJldHVybj10LnJldHVybixKPW47YnJlYWt9Sj10LnJldHVybn19ZnVuY3Rpb24gQnYoZSl7Zm9yKDtKIT09bnVsbDspe3ZhciB0PUo7dHJ5e3N3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp2YXIgbj10LnJldHVybjt0cnl7WGMoNCx0KX1jYXRjaChhKXtudCh0LG4sYSl9YnJlYWs7Y2FzZSAxOnZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiByLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iKXt2YXIgbz10LnJldHVybjt0cnl7ci5jb21wb25lbnREaWRNb3VudCgpfWNhdGNoKGEpe250KHQsbyxhKX19dmFyIGk9dC5yZXR1cm47dHJ5e3doKHQpfWNhdGNoKGEpe250KHQsaSxhKX1icmVhaztjYXNlIDU6dmFyIGw9dC5yZXR1cm47dHJ5e3doKHQpfWNhdGNoKGEpe250KHQsbCxhKX19fWNhdGNoKGEpe250KHQsdC5yZXR1cm4sYSl9aWYodD09PWUpe0o9bnVsbDticmVha312YXIgcz10LnNpYmxpbmc7aWYocyE9PW51bGwpe3MucmV0dXJuPXQucmV0dXJuLEo9czticmVha31KPXQucmV0dXJufX12YXIgUms9TWF0aC5jZWlsLHNjPVZyLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmc9VnIuUmVhY3RDdXJyZW50T3duZXIsSW49VnIuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsQ2U9MCxidD1udWxsLGN0PW51bGwsRHQ9MCxnbj0wLHFpPWpvKDApLHh0PTAsYWE9bnVsbCxjaT0wLFFjPTAsaGc9MCxicz1udWxsLGFuPW51bGwscGc9MCx3bD0xLzAsTnI9bnVsbCxhYz0hMSxDaD1udWxsLFNvPW51bGwsc3U9ITEscG89bnVsbCx1Yz0wLFJzPTAsJGg9bnVsbCxQdT0tMSxPdT0wO2Z1bmN0aW9uIHRuKCl7cmV0dXJuIENlJjY/dXQoKTpQdSE9PS0xP1B1OlB1PXV0KCl9ZnVuY3Rpb24gRW8oZSl7cmV0dXJuIGUubW9kZSYxP0NlJjImJkR0IT09MD9EdCYtRHQ6aGsudHJhbnNpdGlvbiE9PW51bGw/KE91PT09MCYmKE91PSQxKCkpLE91KTooZT1QZSxlIT09MHx8KGU9d2luZG93LmV2ZW50LGU9ZT09PXZvaWQgMD8xNjpPMShlLnR5cGUpKSxlKToxfWZ1bmN0aW9uIHFuKGUsdCxuLHIpe2lmKDUwPFJzKXRocm93IFJzPTAsJGg9bnVsbCxFcnJvcihXKDE4NSkpO1RhKGUsbixyKSwoIShDZSYyKXx8ZSE9PWJ0KSYmKGU9PT1idCYmKCEoQ2UmMikmJihRY3w9bikseHQ9PT00JiZjbyhlLER0KSksZm4oZSxyKSxuPT09MSYmQ2U9PT0wJiYhKHQubW9kZSYxKSYmKHdsPXV0KCkrNTAwLEtjJiZ6bygpKSl9ZnVuY3Rpb24gZm4oZSx0KXt2YXIgbj1lLmNhbGxiYWNrTm9kZTtoJChlLHQpO3ZhciByPUt1KGUsZT09PWJ0P0R0OjApO2lmKHI9PT0wKW4hPT1udWxsJiZRbShuKSxlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO2Vsc2UgaWYodD1yJi1yLGUuY2FsbGJhY2tQcmlvcml0eSE9PXQpe2lmKG4hPW51bGwmJlFtKG4pLHQ9PT0xKWUudGFnPT09MD9mayhXdi5iaW5kKG51bGwsZSkpOkoxKFd2LmJpbmQobnVsbCxlKSksYWsoZnVuY3Rpb24oKXshKENlJjYpJiZ6bygpfSksbj1udWxsO2Vsc2V7c3dpdGNoKGsxKHIpKXtjYXNlIDE6bj1GcDticmVhaztjYXNlIDQ6bj1FMTticmVhaztjYXNlIDE2Om49SHU7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bj1DMTticmVhaztkZWZhdWx0Om49SHV9bj1ReChuLFV4LmJpbmQobnVsbCxlKSl9ZS5jYWxsYmFja1ByaW9yaXR5PXQsZS5jYWxsYmFja05vZGU9bn19ZnVuY3Rpb24gVXgoZSx0KXtpZihQdT0tMSxPdT0wLENlJjYpdGhyb3cgRXJyb3IoVygzMjcpKTt2YXIgbj1lLmNhbGxiYWNrTm9kZTtpZih1bCgpJiZlLmNhbGxiYWNrTm9kZSE9PW4pcmV0dXJuIG51bGw7dmFyIHI9S3UoZSxlPT09YnQ/RHQ6MCk7aWYocj09PTApcmV0dXJuIG51bGw7aWYociYzMHx8ciZlLmV4cGlyZWRMYW5lc3x8dCl0PWNjKGUscik7ZWxzZXt0PXI7dmFyIG89Q2U7Q2V8PTI7dmFyIGk9SHgoKTsoYnQhPT1lfHxEdCE9PXQpJiYoTnI9bnVsbCx3bD11dCgpKzUwMCx0aShlLHQpKTtkbyB0cnl7QWsoKTticmVha31jYXRjaChzKXtWeChlLHMpfXdoaWxlKDEpO3FwKCksc2MuY3VycmVudD1pLENlPW8sY3QhPT1udWxsP3Q9MDooYnQ9bnVsbCxEdD0wLHQ9eHQpfWlmKHQhPT0wKXtpZih0PT09MiYmKG89WmYoZSksbyE9PTAmJihyPW8sdD1raChlLG8pKSksdD09PTEpdGhyb3cgbj1hYSx0aShlLDApLGNvKGUsciksZm4oZSx1dCgpKSxuO2lmKHQ9PT02KWNvKGUscik7ZWxzZXtpZihvPWUuY3VycmVudC5hbHRlcm5hdGUsIShyJjMwKSYmIVBrKG8pJiYodD1jYyhlLHIpLHQ9PT0yJiYoaT1aZihlKSxpIT09MCYmKHI9aSx0PWtoKGUsaSkpKSx0PT09MSkpdGhyb3cgbj1hYSx0aShlLDApLGNvKGUsciksZm4oZSx1dCgpKSxuO3N3aXRjaChlLmZpbmlzaGVkV29yaz1vLGUuZmluaXNoZWRMYW5lcz1yLHQpe2Nhc2UgMDpjYXNlIDE6dGhyb3cgRXJyb3IoVygzNDUpKTtjYXNlIDI6R28oZSxhbixOcik7YnJlYWs7Y2FzZSAzOmlmKGNvKGUsciksKHImMTMwMDIzNDI0KT09PXImJih0PXBnKzUwMC11dCgpLDEwPHQpKXtpZihLdShlLDApIT09MClicmVhaztpZihvPWUuc3VzcGVuZGVkTGFuZXMsKG8mcikhPT1yKXt0bigpLGUucGluZ2VkTGFuZXN8PWUuc3VzcGVuZGVkTGFuZXMmbzticmVha31lLnRpbWVvdXRIYW5kbGU9bGgoR28uYmluZChudWxsLGUsYW4sTnIpLHQpO2JyZWFrfUdvKGUsYW4sTnIpO2JyZWFrO2Nhc2UgNDppZihjbyhlLHIpLChyJjQxOTQyNDApPT09cilicmVhaztmb3IodD1lLmV2ZW50VGltZXMsbz0tMTswPHI7KXt2YXIgbD0zMS1abihyKTtpPTE8PGwsbD10W2xdLGw+byYmKG89bCksciY9fml9aWYocj1vLHI9dXQoKS1yLHI9KDEyMD5yPzEyMDo0ODA+cj80ODA6MTA4MD5yPzEwODA6MTkyMD5yPzE5MjA6M2UzPnI/M2UzOjQzMjA+cj80MzIwOjE5NjAqUmsoci8xOTYwKSktciwxMDxyKXtlLnRpbWVvdXRIYW5kbGU9bGgoR28uYmluZChudWxsLGUsYW4sTnIpLHIpO2JyZWFrfUdvKGUsYW4sTnIpO2JyZWFrO2Nhc2UgNTpHbyhlLGFuLE5yKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKFcoMzI5KSl9fX1yZXR1cm4gZm4oZSx1dCgpKSxlLmNhbGxiYWNrTm9kZT09PW4/VXguYmluZChudWxsLGUpOm51bGx9ZnVuY3Rpb24ga2goZSx0KXt2YXIgbj1icztyZXR1cm4gZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYodGkoZSx0KS5mbGFnc3w9MjU2KSxlPWNjKGUsdCksZSE9PTImJih0PWFuLGFuPW4sdCE9PW51bGwmJlRoKHQpKSxlfWZ1bmN0aW9uIFRoKGUpe2FuPT09bnVsbD9hbj1lOmFuLnB1c2guYXBwbHkoYW4sZSl9ZnVuY3Rpb24gUGsoZSl7Zm9yKHZhciB0PWU7Oyl7aWYodC5mbGFncyYxNjM4NCl7dmFyIG49dC51cGRhdGVRdWV1ZTtpZihuIT09bnVsbCYmKG49bi5zdG9yZXMsbiE9PW51bGwpKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdLGk9by5nZXRTbmFwc2hvdDtvPW8udmFsdWU7dHJ5e2lmKCFlcihpKCksbykpcmV0dXJuITF9Y2F0Y2h7cmV0dXJuITF9fX1pZihuPXQuY2hpbGQsdC5zdWJ0cmVlRmxhZ3MmMTYzODQmJm4hPT1udWxsKW4ucmV0dXJuPXQsdD1uO2Vsc2V7aWYodD09PWUpYnJlYWs7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHx0LnJldHVybj09PWUpcmV0dXJuITA7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfX1yZXR1cm4hMH1mdW5jdGlvbiBjbyhlLHQpe2Zvcih0Jj1+aGcsdCY9flFjLGUuc3VzcGVuZGVkTGFuZXN8PXQsZS5waW5nZWRMYW5lcyY9fnQsZT1lLmV4cGlyYXRpb25UaW1lczswPHQ7KXt2YXIgbj0zMS1abih0KSxyPTE8PG47ZVtuXT0tMSx0Jj1+cn19ZnVuY3Rpb24gV3YoZSl7aWYoQ2UmNil0aHJvdyBFcnJvcihXKDMyNykpO3VsKCk7dmFyIHQ9S3UoZSwwKTtpZighKHQmMSkpcmV0dXJuIGZuKGUsdXQoKSksbnVsbDt2YXIgbj1jYyhlLHQpO2lmKGUudGFnIT09MCYmbj09PTIpe3ZhciByPVpmKGUpO3IhPT0wJiYodD1yLG49a2goZSxyKSl9aWYobj09PTEpdGhyb3cgbj1hYSx0aShlLDApLGNvKGUsdCksZm4oZSx1dCgpKSxuO2lmKG49PT02KXRocm93IEVycm9yKFcoMzQ1KSk7cmV0dXJuIGUuZmluaXNoZWRXb3JrPWUuY3VycmVudC5hbHRlcm5hdGUsZS5maW5pc2hlZExhbmVzPXQsR28oZSxhbixOciksZm4oZSx1dCgpKSxudWxsfWZ1bmN0aW9uIGdnKGUsdCl7dmFyIG49Q2U7Q2V8PTE7dHJ5e3JldHVybiBlKHQpfWZpbmFsbHl7Q2U9bixDZT09PTAmJih3bD11dCgpKzUwMCxLYyYmem8oKSl9fWZ1bmN0aW9uIGRpKGUpe3BvIT09bnVsbCYmcG8udGFnPT09MCYmIShDZSY2KSYmdWwoKTt2YXIgdD1DZTtDZXw9MTt2YXIgbj1Jbi50cmFuc2l0aW9uLHI9UGU7dHJ5e2lmKEluLnRyYW5zaXRpb249bnVsbCxQZT0xLGUpcmV0dXJuIGUoKX1maW5hbGx5e1BlPXIsSW4udHJhbnNpdGlvbj1uLENlPXQsIShDZSY2KSYmem8oKX19ZnVuY3Rpb24gbWcoKXtnbj1xaS5jdXJyZW50LEdlKHFpKX1mdW5jdGlvbiB0aShlLHQpe2UuZmluaXNoZWRXb3JrPW51bGwsZS5maW5pc2hlZExhbmVzPTA7dmFyIG49ZS50aW1lb3V0SGFuZGxlO2lmKG4hPT0tMSYmKGUudGltZW91dEhhbmRsZT0tMSxzayhuKSksY3QhPT1udWxsKWZvcihuPWN0LnJldHVybjtuIT09bnVsbDspe3ZhciByPW47c3dpdGNoKFFwKHIpLHIudGFnKXtjYXNlIDE6cj1yLnR5cGUuY2hpbGRDb250ZXh0VHlwZXMsciE9bnVsbCYmSnUoKTticmVhaztjYXNlIDM6eGwoKSxHZShjbiksR2UoS3QpLGlnKCk7YnJlYWs7Y2FzZSA1Om9nKHIpO2JyZWFrO2Nhc2UgNDp4bCgpO2JyZWFrO2Nhc2UgMTM6R2UoSmUpO2JyZWFrO2Nhc2UgMTk6R2UoSmUpO2JyZWFrO2Nhc2UgMTA6ZWcoci50eXBlLl9jb250ZXh0KTticmVhaztjYXNlIDIyOmNhc2UgMjM6bWcoKX1uPW4ucmV0dXJufWlmKGJ0PWUsY3Q9ZT1DbyhlLmN1cnJlbnQsbnVsbCksRHQ9Z249dCx4dD0wLGFhPW51bGwsaGc9UWM9Y2k9MCxhbj1icz1udWxsLEpvIT09bnVsbCl7Zm9yKHQ9MDt0PEpvLmxlbmd0aDt0KyspaWYobj1Kb1t0XSxyPW4uaW50ZXJsZWF2ZWQsciE9PW51bGwpe24uaW50ZXJsZWF2ZWQ9bnVsbDt2YXIgbz1yLm5leHQsaT1uLnBlbmRpbmc7aWYoaSE9PW51bGwpe3ZhciBsPWkubmV4dDtpLm5leHQ9byxyLm5leHQ9bH1uLnBlbmRpbmc9cn1Kbz1udWxsfXJldHVybiBlfWZ1bmN0aW9uIFZ4KGUsdCl7ZG97dmFyIG49Y3Q7dHJ5e2lmKHFwKCksTnUuY3VycmVudD1sYyxpYyl7Zm9yKHZhciByPXFlLm1lbW9pemVkU3RhdGU7ciE9PW51bGw7KXt2YXIgbz1yLnF1ZXVlO28hPT1udWxsJiYoby5wZW5kaW5nPW51bGwpLHI9ci5uZXh0fWljPSExfWlmKHVpPTAsQ3Q9bXQ9cWU9bnVsbCxUcz0hMSxpYT0wLGZnLmN1cnJlbnQ9bnVsbCxuPT09bnVsbHx8bi5yZXR1cm49PT1udWxsKXt4dD0xLGFhPXQsY3Q9bnVsbDticmVha31lOnt2YXIgaT1lLGw9bi5yZXR1cm4scz1uLGE9dDtpZih0PUR0LHMuZmxhZ3N8PTMyNzY4LGEhPT1udWxsJiZ0eXBlb2YgYT09Im9iamVjdCImJnR5cGVvZiBhLnRoZW49PSJmdW5jdGlvbiIpe3ZhciB1PWEsYz1zLGQ9Yy50YWc7aWYoIShjLm1vZGUmMSkmJihkPT09MHx8ZD09PTExfHxkPT09MTUpKXt2YXIgZj1jLmFsdGVybmF0ZTtmPyhjLnVwZGF0ZVF1ZXVlPWYudXBkYXRlUXVldWUsYy5tZW1vaXplZFN0YXRlPWYubWVtb2l6ZWRTdGF0ZSxjLmxhbmVzPWYubGFuZXMpOihjLnVwZGF0ZVF1ZXVlPW51bGwsYy5tZW1vaXplZFN0YXRlPW51bGwpfXZhciBoPWJ2KGwpO2lmKGghPT1udWxsKXtoLmZsYWdzJj0tMjU3LFJ2KGgsbCxzLGksdCksaC5tb2RlJjEmJk52KGksdSx0KSx0PWgsYT11O3ZhciBnPXQudXBkYXRlUXVldWU7aWYoZz09PW51bGwpe3ZhciBtPW5ldyBTZXQ7bS5hZGQoYSksdC51cGRhdGVRdWV1ZT1tfWVsc2UgZy5hZGQoYSk7YnJlYWsgZX1lbHNle2lmKCEodCYxKSl7TnYoaSx1LHQpLHZnKCk7YnJlYWsgZX1hPUVycm9yKFcoNDI2KSl9fWVsc2UgaWYoWWUmJnMubW9kZSYxKXt2YXIgUz1idihsKTtpZihTIT09bnVsbCl7IShTLmZsYWdzJjY1NTM2KSYmKFMuZmxhZ3N8PTI1NiksUnYoUyxsLHMsaSx0KSxKcChfbChhLHMpKTticmVhayBlfX1pPWE9X2woYSxzKSx4dCE9PTQmJih4dD0yKSxicz09PW51bGw/YnM9W2ldOmJzLnB1c2goaSksaT1sO2Rve3N3aXRjaChpLnRhZyl7Y2FzZSAzOmkuZmxhZ3N8PTY1NTM2LHQmPS10LGkubGFuZXN8PXQ7dmFyIHY9VHgoaSxhLHQpO3d2KGksdik7YnJlYWsgZTtjYXNlIDE6cz1hO3ZhciB5PWkudHlwZSx4PWkuc3RhdGVOb2RlO2lmKCEoaS5mbGFncyYxMjgpJiYodHlwZW9mIHkuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yPT0iZnVuY3Rpb24ifHx4IT09bnVsbCYmdHlwZW9mIHguY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihTbz09PW51bGx8fCFTby5oYXMoeCkpKSl7aS5mbGFnc3w9NjU1MzYsdCY9LXQsaS5sYW5lc3w9dDt2YXIgXz1OeChpLHMsdCk7d3YoaSxfKTticmVhayBlfX1pPWkucmV0dXJufXdoaWxlKGkhPT1udWxsKX1HeChuKX1jYXRjaChFKXt0PUUsY3Q9PT1uJiZuIT09bnVsbCYmKGN0PW49bi5yZXR1cm4pO2NvbnRpbnVlfWJyZWFrfXdoaWxlKDEpfWZ1bmN0aW9uIEh4KCl7dmFyIGU9c2MuY3VycmVudDtyZXR1cm4gc2MuY3VycmVudD1sYyxlPT09bnVsbD9sYzplfWZ1bmN0aW9uIHZnKCl7KHh0PT09MHx8eHQ9PT0zfHx4dD09PTIpJiYoeHQ9NCksYnQ9PT1udWxsfHwhKGNpJjI2ODQzNTQ1NSkmJiEoUWMmMjY4NDM1NDU1KXx8Y28oYnQsRHQpfWZ1bmN0aW9uIGNjKGUsdCl7dmFyIG49Q2U7Q2V8PTI7dmFyIHI9SHgoKTsoYnQhPT1lfHxEdCE9PXQpJiYoTnI9bnVsbCx0aShlLHQpKTtkbyB0cnl7T2soKTticmVha31jYXRjaChvKXtWeChlLG8pfXdoaWxlKDEpO2lmKHFwKCksQ2U9bixzYy5jdXJyZW50PXIsY3QhPT1udWxsKXRocm93IEVycm9yKFcoMjYxKSk7cmV0dXJuIGJ0PW51bGwsRHQ9MCx4dH1mdW5jdGlvbiBPaygpe2Zvcig7Y3QhPT1udWxsOylLeChjdCl9ZnVuY3Rpb24gQWsoKXtmb3IoO2N0IT09bnVsbCYmIW8kKCk7KUt4KGN0KX1mdW5jdGlvbiBLeChlKXt2YXIgdD1YeChlLmFsdGVybmF0ZSxlLGduKTtlLm1lbW9pemVkUHJvcHM9ZS5wZW5kaW5nUHJvcHMsdD09PW51bGw/R3goZSk6Y3Q9dCxmZy5jdXJyZW50PW51bGx9ZnVuY3Rpb24gR3goZSl7dmFyIHQ9ZTtkb3t2YXIgbj10LmFsdGVybmF0ZTtpZihlPXQucmV0dXJuLHQuZmxhZ3MmMzI3Njgpe2lmKG49a2sobix0KSxuIT09bnVsbCl7bi5mbGFncyY9MzI3NjcsY3Q9bjtyZXR1cm59aWYoZSE9PW51bGwpZS5mbGFnc3w9MzI3NjgsZS5zdWJ0cmVlRmxhZ3M9MCxlLmRlbGV0aW9ucz1udWxsO2Vsc2V7eHQ9NixjdD1udWxsO3JldHVybn19ZWxzZSBpZihuPSRrKG4sdCxnbiksbiE9PW51bGwpe2N0PW47cmV0dXJufWlmKHQ9dC5zaWJsaW5nLHQhPT1udWxsKXtjdD10O3JldHVybn1jdD10PWV9d2hpbGUodCE9PW51bGwpO3h0PT09MCYmKHh0PTUpfWZ1bmN0aW9uIEdvKGUsdCxuKXt2YXIgcj1QZSxvPUluLnRyYW5zaXRpb247dHJ5e0luLnRyYW5zaXRpb249bnVsbCxQZT0xLE1rKGUsdCxuLHIpfWZpbmFsbHl7SW4udHJhbnNpdGlvbj1vLFBlPXJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gTWsoZSx0LG4scil7ZG8gdWwoKTt3aGlsZShwbyE9PW51bGwpO2lmKENlJjYpdGhyb3cgRXJyb3IoVygzMjcpKTtuPWUuZmluaXNoZWRXb3JrO3ZhciBvPWUuZmluaXNoZWRMYW5lcztpZihuPT09bnVsbClyZXR1cm4gbnVsbDtpZihlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wLG49PT1lLmN1cnJlbnQpdGhyb3cgRXJyb3IoVygxNzcpKTtlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBpPW4ubGFuZXN8bi5jaGlsZExhbmVzO2lmKHAkKGUsaSksZT09PWJ0JiYoY3Q9YnQ9bnVsbCxEdD0wKSwhKG4uc3VidHJlZUZsYWdzJjIwNjQpJiYhKG4uZmxhZ3MmMjA2NCl8fHN1fHwoc3U9ITAsUXgoSHUsZnVuY3Rpb24oKXtyZXR1cm4gdWwoKSxudWxsfSkpLGk9KG4uZmxhZ3MmMTU5OTApIT09MCxuLnN1YnRyZWVGbGFncyYxNTk5MHx8aSl7aT1Jbi50cmFuc2l0aW9uLEluLnRyYW5zaXRpb249bnVsbDt2YXIgbD1QZTtQZT0xO3ZhciBzPUNlO0NlfD00LGZnLmN1cnJlbnQ9bnVsbCxOayhlLG4pLEJ4KG4sZSksZWsob2gpLEd1PSEhcmgsb2g9cmg9bnVsbCxlLmN1cnJlbnQ9bixiayhuKSxpJCgpLENlPXMsUGU9bCxJbi50cmFuc2l0aW9uPWl9ZWxzZSBlLmN1cnJlbnQ9bjtpZihzdSYmKHN1PSExLHBvPWUsdWM9byksaT1lLnBlbmRpbmdMYW5lcyxpPT09MCYmKFNvPW51bGwpLGEkKG4uc3RhdGVOb2RlKSxmbihlLHV0KCkpLHQhPT1udWxsKWZvcihyPWUub25SZWNvdmVyYWJsZUVycm9yLG49MDtuPHQubGVuZ3RoO24rKylvPXRbbl0scihvLnZhbHVlLHtjb21wb25lbnRTdGFjazpvLnN0YWNrLGRpZ2VzdDpvLmRpZ2VzdH0pO2lmKGFjKXRocm93IGFjPSExLGU9Q2gsQ2g9bnVsbCxlO3JldHVybiB1YyYxJiZlLnRhZyE9PTAmJnVsKCksaT1lLnBlbmRpbmdMYW5lcyxpJjE/ZT09PSRoP1JzKys6KFJzPTAsJGg9ZSk6UnM9MCx6bygpLG51bGx9ZnVuY3Rpb24gdWwoKXtpZihwbyE9PW51bGwpe3ZhciBlPWsxKHVjKSx0PUluLnRyYW5zaXRpb24sbj1QZTt0cnl7aWYoSW4udHJhbnNpdGlvbj1udWxsLFBlPTE2PmU/MTY6ZSxwbz09PW51bGwpdmFyIHI9ITE7ZWxzZXtpZihlPXBvLHBvPW51bGwsdWM9MCxDZSY2KXRocm93IEVycm9yKFcoMzMxKSk7dmFyIG89Q2U7Zm9yKENlfD00LEo9ZS5jdXJyZW50O0ohPT1udWxsOyl7dmFyIGk9SixsPWkuY2hpbGQ7aWYoSi5mbGFncyYxNil7dmFyIHM9aS5kZWxldGlvbnM7aWYocyE9PW51bGwpe2Zvcih2YXIgYT0wO2E8cy5sZW5ndGg7YSsrKXt2YXIgdT1zW2FdO2ZvcihKPXU7SiE9PW51bGw7KXt2YXIgYz1KO3N3aXRjaChjLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpOcyg4LGMsaSl9dmFyIGQ9Yy5jaGlsZDtpZihkIT09bnVsbClkLnJldHVybj1jLEo9ZDtlbHNlIGZvcig7SiE9PW51bGw7KXtjPUo7dmFyIGY9Yy5zaWJsaW5nLGg9Yy5yZXR1cm47aWYoangoYyksYz09PXUpe0o9bnVsbDticmVha31pZihmIT09bnVsbCl7Zi5yZXR1cm49aCxKPWY7YnJlYWt9Sj1ofX19dmFyIGc9aS5hbHRlcm5hdGU7aWYoZyE9PW51bGwpe3ZhciBtPWcuY2hpbGQ7aWYobSE9PW51bGwpe2cuY2hpbGQ9bnVsbDtkb3t2YXIgUz1tLnNpYmxpbmc7bS5zaWJsaW5nPW51bGwsbT1TfXdoaWxlKG0hPT1udWxsKX19Sj1pfX1pZihpLnN1YnRyZWVGbGFncyYyMDY0JiZsIT09bnVsbClsLnJldHVybj1pLEo9bDtlbHNlIGU6Zm9yKDtKIT09bnVsbDspe2lmKGk9SixpLmZsYWdzJjIwNDgpc3dpdGNoKGkudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1Ok5zKDksaSxpLnJldHVybil9dmFyIHY9aS5zaWJsaW5nO2lmKHYhPT1udWxsKXt2LnJldHVybj1pLnJldHVybixKPXY7YnJlYWsgZX1KPWkucmV0dXJufX12YXIgeT1lLmN1cnJlbnQ7Zm9yKEo9eTtKIT09bnVsbDspe2w9Sjt2YXIgeD1sLmNoaWxkO2lmKGwuc3VidHJlZUZsYWdzJjIwNjQmJnghPT1udWxsKXgucmV0dXJuPWwsSj14O2Vsc2UgZTpmb3IobD15O0ohPT1udWxsOyl7aWYocz1KLHMuZmxhZ3MmMjA0OCl0cnl7c3dpdGNoKHMudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OlhjKDkscyl9fWNhdGNoKEUpe250KHMscy5yZXR1cm4sRSl9aWYocz09PWwpe0o9bnVsbDticmVhayBlfXZhciBfPXMuc2libGluZztpZihfIT09bnVsbCl7Xy5yZXR1cm49cy5yZXR1cm4sSj1fO2JyZWFrIGV9Sj1zLnJldHVybn19aWYoQ2U9byx6bygpLHByJiZ0eXBlb2YgcHIub25Qb3N0Q29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXtwci5vblBvc3RDb21taXRGaWJlclJvb3QoQmMsZSl9Y2F0Y2h7fXI9ITB9cmV0dXJuIHJ9ZmluYWxseXtQZT1uLEluLnRyYW5zaXRpb249dH19cmV0dXJuITF9ZnVuY3Rpb24gVXYoZSx0LG4pe3Q9X2wobix0KSx0PVR4KGUsdCwxKSxlPXdvKGUsdCwxKSx0PXRuKCksZSE9PW51bGwmJihUYShlLDEsdCksZm4oZSx0KSl9ZnVuY3Rpb24gbnQoZSx0LG4pe2lmKGUudGFnPT09MylVdihlLGUsbik7ZWxzZSBmb3IoO3QhPT1udWxsOyl7aWYodC50YWc9PT0zKXtVdih0LGUsbik7YnJlYWt9ZWxzZSBpZih0LnRhZz09PTEpe3ZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiB0LnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yPT0iZnVuY3Rpb24ifHx0eXBlb2Ygci5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKFNvPT09bnVsbHx8IVNvLmhhcyhyKSkpe2U9X2wobixlKSxlPU54KHQsZSwxKSx0PXdvKHQsZSwxKSxlPXRuKCksdCE9PW51bGwmJihUYSh0LDEsZSksZm4odCxlKSk7YnJlYWt9fXQ9dC5yZXR1cm59fWZ1bmN0aW9uIERrKGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtyIT09bnVsbCYmci5kZWxldGUodCksdD10bigpLGUucGluZ2VkTGFuZXN8PWUuc3VzcGVuZGVkTGFuZXMmbixidD09PWUmJihEdCZuKT09PW4mJih4dD09PTR8fHh0PT09MyYmKER0JjEzMDAyMzQyNCk9PT1EdCYmNTAwPnV0KCktcGc/dGkoZSwwKTpoZ3w9biksZm4oZSx0KX1mdW5jdGlvbiBZeChlLHQpe3Q9PT0wJiYoZS5tb2RlJjE/KHQ9SmEsSmE8PD0xLCEoSmEmMTMwMDIzNDI0KSYmKEphPTQxOTQzMDQpKTp0PTEpO3ZhciBuPXRuKCk7ZT16cihlLHQpLGUhPT1udWxsJiYoVGEoZSx0LG4pLGZuKGUsbikpfWZ1bmN0aW9uIExrKGUpe3ZhciB0PWUubWVtb2l6ZWRTdGF0ZSxuPTA7dCE9PW51bGwmJihuPXQucmV0cnlMYW5lKSxZeChlLG4pfWZ1bmN0aW9uIElrKGUsdCl7dmFyIG49MDtzd2l0Y2goZS50YWcpe2Nhc2UgMTM6dmFyIHI9ZS5zdGF0ZU5vZGUsbz1lLm1lbW9pemVkU3RhdGU7byE9PW51bGwmJihuPW8ucmV0cnlMYW5lKTticmVhaztjYXNlIDE5OnI9ZS5zdGF0ZU5vZGU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihXKDMxNCkpfXIhPT1udWxsJiZyLmRlbGV0ZSh0KSxZeChlLG4pfXZhciBYeDtYeD1mdW5jdGlvbihlLHQsbil7aWYoZSE9PW51bGwpaWYoZS5tZW1vaXplZFByb3BzIT09dC5wZW5kaW5nUHJvcHN8fGNuLmN1cnJlbnQpdW49ITA7ZWxzZXtpZighKGUubGFuZXMmbikmJiEodC5mbGFncyYxMjgpKXJldHVybiB1bj0hMSxDayhlLHQsbik7dW49ISEoZS5mbGFncyYxMzEwNzIpfWVsc2UgdW49ITEsWWUmJnQuZmxhZ3MmMTA0ODU3NiYmWjEodCxlYyx0LmluZGV4KTtzd2l0Y2godC5sYW5lcz0wLHQudGFnKXtjYXNlIDI6dmFyIHI9dC50eXBlO1J1KGUsdCksZT10LnBlbmRpbmdQcm9wczt2YXIgbz1tbCh0LEt0LmN1cnJlbnQpO2FsKHQsbiksbz1zZyhudWxsLHQscixlLG8sbik7dmFyIGk9YWcoKTtyZXR1cm4gdC5mbGFnc3w9MSx0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsJiZ0eXBlb2Ygby5yZW5kZXI9PSJmdW5jdGlvbiImJm8uJCR0eXBlb2Y9PT12b2lkIDA/KHQudGFnPTEsdC5tZW1vaXplZFN0YXRlPW51bGwsdC51cGRhdGVRdWV1ZT1udWxsLGRuKHIpPyhpPSEwLFp1KHQpKTppPSExLHQubWVtb2l6ZWRTdGF0ZT1vLnN0YXRlIT09bnVsbCYmby5zdGF0ZSE9PXZvaWQgMD9vLnN0YXRlOm51bGwsbmcodCksby51cGRhdGVyPUdjLHQuc3RhdGVOb2RlPW8sby5fcmVhY3RJbnRlcm5hbHM9dCxoaCh0LHIsZSxuKSx0PW1oKG51bGwsdCxyLCEwLGksbikpOih0LnRhZz0wLFllJiZpJiZYcCh0KSxHdChudWxsLHQsbyxuKSx0PXQuY2hpbGQpLHQ7Y2FzZSAxNjpyPXQuZWxlbWVudFR5cGU7ZTp7c3dpdGNoKFJ1KGUsdCksZT10LnBlbmRpbmdQcm9wcyxvPXIuX2luaXQscj1vKHIuX3BheWxvYWQpLHQudHlwZT1yLG89dC50YWc9emsociksZT1LbihyLGUpLG8pe2Nhc2UgMDp0PWdoKG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDE6dD1BdihudWxsLHQscixlLG4pO2JyZWFrIGU7Y2FzZSAxMTp0PVB2KG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDE0OnQ9T3YobnVsbCx0LHIsS24oci50eXBlLGUpLG4pO2JyZWFrIGV9dGhyb3cgRXJyb3IoVygzMDYsciwiIikpfXJldHVybiB0O2Nhc2UgMDpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286S24ocixvKSxnaChlLHQscixvLG4pO2Nhc2UgMTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286S24ocixvKSxBdihlLHQscixvLG4pO2Nhc2UgMzplOntpZihPeCh0KSxlPT09bnVsbCl0aHJvdyBFcnJvcihXKDM4NykpO3I9dC5wZW5kaW5nUHJvcHMsaT10Lm1lbW9pemVkU3RhdGUsbz1pLmVsZW1lbnQsbngoZSx0KSxyYyh0LHIsbnVsbCxuKTt2YXIgbD10Lm1lbW9pemVkU3RhdGU7aWYocj1sLmVsZW1lbnQsaS5pc0RlaHlkcmF0ZWQpaWYoaT17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDohMSxjYWNoZTpsLmNhY2hlLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6bC5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLHRyYW5zaXRpb25zOmwudHJhbnNpdGlvbnN9LHQudXBkYXRlUXVldWUuYmFzZVN0YXRlPWksdC5tZW1vaXplZFN0YXRlPWksdC5mbGFncyYyNTYpe289X2woRXJyb3IoVyg0MjMpKSx0KSx0PU12KGUsdCxyLG4sbyk7YnJlYWsgZX1lbHNlIGlmKHIhPT1vKXtvPV9sKEVycm9yKFcoNDI0KSksdCksdD1NdihlLHQscixuLG8pO2JyZWFrIGV9ZWxzZSBmb3IoeW49X28odC5zdGF0ZU5vZGUuY29udGFpbmVySW5mby5maXJzdENoaWxkKSx4bj10LFllPSEwLFhuPW51bGwsbj1seCh0LG51bGwscixuKSx0LmNoaWxkPW47bjspbi5mbGFncz1uLmZsYWdzJi0zfDQwOTYsbj1uLnNpYmxpbmc7ZWxzZXtpZih2bCgpLHI9PT1vKXt0PUZyKGUsdCxuKTticmVhayBlfUd0KGUsdCxyLG4pfXQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDU6cmV0dXJuIHN4KHQpLGU9PT1udWxsJiZjaCh0KSxyPXQudHlwZSxvPXQucGVuZGluZ1Byb3BzLGk9ZSE9PW51bGw/ZS5tZW1vaXplZFByb3BzOm51bGwsbD1vLmNoaWxkcmVuLGloKHIsbyk/bD1udWxsOmkhPT1udWxsJiZpaChyLGkpJiYodC5mbGFnc3w9MzIpLFB4KGUsdCksR3QoZSx0LGwsbiksdC5jaGlsZDtjYXNlIDY6cmV0dXJuIGU9PT1udWxsJiZjaCh0KSxudWxsO2Nhc2UgMTM6cmV0dXJuIEF4KGUsdCxuKTtjYXNlIDQ6cmV0dXJuIHJnKHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbykscj10LnBlbmRpbmdQcm9wcyxlPT09bnVsbD90LmNoaWxkPXlsKHQsbnVsbCxyLG4pOkd0KGUsdCxyLG4pLHQuY2hpbGQ7Y2FzZSAxMTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286S24ocixvKSxQdihlLHQscixvLG4pO2Nhc2UgNzpyZXR1cm4gR3QoZSx0LHQucGVuZGluZ1Byb3BzLG4pLHQuY2hpbGQ7Y2FzZSA4OnJldHVybiBHdChlLHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sbiksdC5jaGlsZDtjYXNlIDEyOnJldHVybiBHdChlLHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sbiksdC5jaGlsZDtjYXNlIDEwOmU6e2lmKHI9dC50eXBlLl9jb250ZXh0LG89dC5wZW5kaW5nUHJvcHMsaT10Lm1lbW9pemVkUHJvcHMsbD1vLnZhbHVlLEZlKHRjLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPWwsaSE9PW51bGwpaWYoZXIoaS52YWx1ZSxsKSl7aWYoaS5jaGlsZHJlbj09PW8uY2hpbGRyZW4mJiFjbi5jdXJyZW50KXt0PUZyKGUsdCxuKTticmVhayBlfX1lbHNlIGZvcihpPXQuY2hpbGQsaSE9PW51bGwmJihpLnJldHVybj10KTtpIT09bnVsbDspe3ZhciBzPWkuZGVwZW5kZW5jaWVzO2lmKHMhPT1udWxsKXtsPWkuY2hpbGQ7Zm9yKHZhciBhPXMuZmlyc3RDb250ZXh0O2EhPT1udWxsOyl7aWYoYS5jb250ZXh0PT09cil7aWYoaS50YWc9PT0xKXthPUxyKC0xLG4mLW4pLGEudGFnPTI7dmFyIHU9aS51cGRhdGVRdWV1ZTtpZih1IT09bnVsbCl7dT11LnNoYXJlZDt2YXIgYz11LnBlbmRpbmc7Yz09PW51bGw/YS5uZXh0PWE6KGEubmV4dD1jLm5leHQsYy5uZXh0PWEpLHUucGVuZGluZz1hfX1pLmxhbmVzfD1uLGE9aS5hbHRlcm5hdGUsYSE9PW51bGwmJihhLmxhbmVzfD1uKSxkaChpLnJldHVybixuLHQpLHMubGFuZXN8PW47YnJlYWt9YT1hLm5leHR9fWVsc2UgaWYoaS50YWc9PT0xMClsPWkudHlwZT09PXQudHlwZT9udWxsOmkuY2hpbGQ7ZWxzZSBpZihpLnRhZz09PTE4KXtpZihsPWkucmV0dXJuLGw9PT1udWxsKXRocm93IEVycm9yKFcoMzQxKSk7bC5sYW5lc3w9bixzPWwuYWx0ZXJuYXRlLHMhPT1udWxsJiYocy5sYW5lc3w9biksZGgobCxuLHQpLGw9aS5zaWJsaW5nfWVsc2UgbD1pLmNoaWxkO2lmKGwhPT1udWxsKWwucmV0dXJuPWk7ZWxzZSBmb3IobD1pO2whPT1udWxsOyl7aWYobD09PXQpe2w9bnVsbDticmVha31pZihpPWwuc2libGluZyxpIT09bnVsbCl7aS5yZXR1cm49bC5yZXR1cm4sbD1pO2JyZWFrfWw9bC5yZXR1cm59aT1sfUd0KGUsdCxvLmNoaWxkcmVuLG4pLHQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDk6cmV0dXJuIG89dC50eXBlLHI9dC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sYWwodCxuKSxvPWpuKG8pLHI9cihvKSx0LmZsYWdzfD0xLEd0KGUsdCxyLG4pLHQuY2hpbGQ7Y2FzZSAxNDpyZXR1cm4gcj10LnR5cGUsbz1LbihyLHQucGVuZGluZ1Byb3BzKSxvPUtuKHIudHlwZSxvKSxPdihlLHQscixvLG4pO2Nhc2UgMTU6cmV0dXJuIGJ4KGUsdCx0LnR5cGUsdC5wZW5kaW5nUHJvcHMsbik7Y2FzZSAxNzpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286S24ocixvKSxSdShlLHQpLHQudGFnPTEsZG4ocik/KGU9ITAsWnUodCkpOmU9ITEsYWwodCxuKSxveCh0LHIsbyksaGgodCxyLG8sbiksbWgobnVsbCx0LHIsITAsZSxuKTtjYXNlIDE5OnJldHVybiBNeChlLHQsbik7Y2FzZSAyMjpyZXR1cm4gUngoZSx0LG4pfXRocm93IEVycm9yKFcoMTU2LHQudGFnKSl9O2Z1bmN0aW9uIFF4KGUsdCl7cmV0dXJuIFMxKGUsdCl9ZnVuY3Rpb24gamsoZSx0LG4scil7dGhpcy50YWc9ZSx0aGlzLmtleT1uLHRoaXMuc2libGluZz10aGlzLmNoaWxkPXRoaXMucmV0dXJuPXRoaXMuc3RhdGVOb2RlPXRoaXMudHlwZT10aGlzLmVsZW1lbnRUeXBlPW51bGwsdGhpcy5pbmRleD0wLHRoaXMucmVmPW51bGwsdGhpcy5wZW5kaW5nUHJvcHM9dCx0aGlzLmRlcGVuZGVuY2llcz10aGlzLm1lbW9pemVkU3RhdGU9dGhpcy51cGRhdGVRdWV1ZT10aGlzLm1lbW9pemVkUHJvcHM9bnVsbCx0aGlzLm1vZGU9cix0aGlzLnN1YnRyZWVGbGFncz10aGlzLmZsYWdzPTAsdGhpcy5kZWxldGlvbnM9bnVsbCx0aGlzLmNoaWxkTGFuZXM9dGhpcy5sYW5lcz0wLHRoaXMuYWx0ZXJuYXRlPW51bGx9ZnVuY3Rpb24gRG4oZSx0LG4scil7cmV0dXJuIG5ldyBqayhlLHQsbixyKX1mdW5jdGlvbiB5ZyhlKXtyZXR1cm4gZT1lLnByb3RvdHlwZSwhKCFlfHwhZS5pc1JlYWN0Q29tcG9uZW50KX1mdW5jdGlvbiB6ayhlKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIilyZXR1cm4geWcoZSk/MTowO2lmKGUhPW51bGwpe2lmKGU9ZS4kJHR5cGVvZixlPT09SXApcmV0dXJuIDExO2lmKGU9PT1qcClyZXR1cm4gMTR9cmV0dXJuIDJ9ZnVuY3Rpb24gQ28oZSx0KXt2YXIgbj1lLmFsdGVybmF0ZTtyZXR1cm4gbj09PW51bGw/KG49RG4oZS50YWcsdCxlLmtleSxlLm1vZGUpLG4uZWxlbWVudFR5cGU9ZS5lbGVtZW50VHlwZSxuLnR5cGU9ZS50eXBlLG4uc3RhdGVOb2RlPWUuc3RhdGVOb2RlLG4uYWx0ZXJuYXRlPWUsZS5hbHRlcm5hdGU9bik6KG4ucGVuZGluZ1Byb3BzPXQsbi50eXBlPWUudHlwZSxuLmZsYWdzPTAsbi5zdWJ0cmVlRmxhZ3M9MCxuLmRlbGV0aW9ucz1udWxsKSxuLmZsYWdzPWUuZmxhZ3MmMTQ2ODAwNjQsbi5jaGlsZExhbmVzPWUuY2hpbGRMYW5lcyxuLmxhbmVzPWUubGFuZXMsbi5jaGlsZD1lLmNoaWxkLG4ubWVtb2l6ZWRQcm9wcz1lLm1lbW9pemVkUHJvcHMsbi5tZW1vaXplZFN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxuLnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdD1lLmRlcGVuZGVuY2llcyxuLmRlcGVuZGVuY2llcz10PT09bnVsbD9udWxsOntsYW5lczp0LmxhbmVzLGZpcnN0Q29udGV4dDp0LmZpcnN0Q29udGV4dH0sbi5zaWJsaW5nPWUuc2libGluZyxuLmluZGV4PWUuaW5kZXgsbi5yZWY9ZS5yZWYsbn1mdW5jdGlvbiBBdShlLHQsbixyLG8saSl7dmFyIGw9MjtpZihyPWUsdHlwZW9mIGU9PSJmdW5jdGlvbiIpeWcoZSkmJihsPTEpO2Vsc2UgaWYodHlwZW9mIGU9PSJzdHJpbmciKWw9NTtlbHNlIGU6c3dpdGNoKGUpe2Nhc2UgVWk6cmV0dXJuIG5pKG4uY2hpbGRyZW4sbyxpLHQpO2Nhc2UgTHA6bD04LG98PTg7YnJlYWs7Y2FzZSBJZjpyZXR1cm4gZT1EbigxMixuLHQsb3wyKSxlLmVsZW1lbnRUeXBlPUlmLGUubGFuZXM9aSxlO2Nhc2UgamY6cmV0dXJuIGU9RG4oMTMsbix0LG8pLGUuZWxlbWVudFR5cGU9amYsZS5sYW5lcz1pLGU7Y2FzZSB6ZjpyZXR1cm4gZT1EbigxOSxuLHQsbyksZS5lbGVtZW50VHlwZT16ZixlLmxhbmVzPWksZTtjYXNlIGkxOnJldHVybiBKYyhuLG8saSx0KTtkZWZhdWx0OmlmKHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwpc3dpdGNoKGUuJCR0eXBlb2Ype2Nhc2UgcjE6bD0xMDticmVhayBlO2Nhc2UgbzE6bD05O2JyZWFrIGU7Y2FzZSBJcDpsPTExO2JyZWFrIGU7Y2FzZSBqcDpsPTE0O2JyZWFrIGU7Y2FzZSBsbzpsPTE2LHI9bnVsbDticmVhayBlfXRocm93IEVycm9yKFcoMTMwLGU9PW51bGw/ZTp0eXBlb2YgZSwiIikpfXJldHVybiB0PURuKGwsbix0LG8pLHQuZWxlbWVudFR5cGU9ZSx0LnR5cGU9cix0LmxhbmVzPWksdH1mdW5jdGlvbiBuaShlLHQsbixyKXtyZXR1cm4gZT1Ebig3LGUscix0KSxlLmxhbmVzPW4sZX1mdW5jdGlvbiBKYyhlLHQsbixyKXtyZXR1cm4gZT1EbigyMixlLHIsdCksZS5lbGVtZW50VHlwZT1pMSxlLmxhbmVzPW4sZS5zdGF0ZU5vZGU9e2lzSGlkZGVuOiExfSxlfWZ1bmN0aW9uIHVmKGUsdCxuKXtyZXR1cm4gZT1Ebig2LGUsbnVsbCx0KSxlLmxhbmVzPW4sZX1mdW5jdGlvbiBjZihlLHQsbil7cmV0dXJuIHQ9RG4oNCxlLmNoaWxkcmVuIT09bnVsbD9lLmNoaWxkcmVuOltdLGUua2V5LHQpLHQubGFuZXM9bix0LnN0YXRlTm9kZT17Y29udGFpbmVySW5mbzplLmNvbnRhaW5lckluZm8scGVuZGluZ0NoaWxkcmVuOm51bGwsaW1wbGVtZW50YXRpb246ZS5pbXBsZW1lbnRhdGlvbn0sdH1mdW5jdGlvbiBGayhlLHQsbixyLG8pe3RoaXMudGFnPXQsdGhpcy5jb250YWluZXJJbmZvPWUsdGhpcy5maW5pc2hlZFdvcms9dGhpcy5waW5nQ2FjaGU9dGhpcy5jdXJyZW50PXRoaXMucGVuZGluZ0NoaWxkcmVuPW51bGwsdGhpcy50aW1lb3V0SGFuZGxlPS0xLHRoaXMuY2FsbGJhY2tOb2RlPXRoaXMucGVuZGluZ0NvbnRleHQ9dGhpcy5jb250ZXh0PW51bGwsdGhpcy5jYWxsYmFja1ByaW9yaXR5PTAsdGhpcy5ldmVudFRpbWVzPVVkKDApLHRoaXMuZXhwaXJhdGlvblRpbWVzPVVkKC0xKSx0aGlzLmVudGFuZ2xlZExhbmVzPXRoaXMuZmluaXNoZWRMYW5lcz10aGlzLm11dGFibGVSZWFkTGFuZXM9dGhpcy5leHBpcmVkTGFuZXM9dGhpcy5waW5nZWRMYW5lcz10aGlzLnN1c3BlbmRlZExhbmVzPXRoaXMucGVuZGluZ0xhbmVzPTAsdGhpcy5lbnRhbmdsZW1lbnRzPVVkKDApLHRoaXMuaWRlbnRpZmllclByZWZpeD1yLHRoaXMub25SZWNvdmVyYWJsZUVycm9yPW8sdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPW51bGx9ZnVuY3Rpb24geGcoZSx0LG4scixvLGksbCxzLGEpe3JldHVybiBlPW5ldyBGayhlLHQsbixzLGEpLHQ9PT0xPyh0PTEsaT09PSEwJiYodHw9OCkpOnQ9MCxpPURuKDMsbnVsbCxudWxsLHQpLGUuY3VycmVudD1pLGkuc3RhdGVOb2RlPWUsaS5tZW1vaXplZFN0YXRlPXtlbGVtZW50OnIsaXNEZWh5ZHJhdGVkOm4sY2FjaGU6bnVsbCx0cmFuc2l0aW9uczpudWxsLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6bnVsbH0sbmcoaSksZX1mdW5jdGlvbiBCayhlLHQsbil7dmFyIHI9Mzxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOldpLGtleTpyPT1udWxsP251bGw6IiIrcixjaGlsZHJlbjplLGNvbnRhaW5lckluZm86dCxpbXBsZW1lbnRhdGlvbjpufX1mdW5jdGlvbiBKeChlKXtpZighZSlyZXR1cm4gTm87ZT1lLl9yZWFjdEludGVybmFscztlOntpZih4aShlKSE9PWV8fGUudGFnIT09MSl0aHJvdyBFcnJvcihXKDE3MCkpO3ZhciB0PWU7ZG97c3dpdGNoKHQudGFnKXtjYXNlIDM6dD10LnN0YXRlTm9kZS5jb250ZXh0O2JyZWFrIGU7Y2FzZSAxOmlmKGRuKHQudHlwZSkpe3Q9dC5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7YnJlYWsgZX19dD10LnJldHVybn13aGlsZSh0IT09bnVsbCk7dGhyb3cgRXJyb3IoVygxNzEpKX1pZihlLnRhZz09PTEpe3ZhciBuPWUudHlwZTtpZihkbihuKSlyZXR1cm4gUTEoZSxuLHQpfXJldHVybiB0fWZ1bmN0aW9uIFp4KGUsdCxuLHIsbyxpLGwscyxhKXtyZXR1cm4gZT14ZyhuLHIsITAsZSxvLGksbCxzLGEpLGUuY29udGV4dD1KeChudWxsKSxuPWUuY3VycmVudCxyPXRuKCksbz1FbyhuKSxpPUxyKHIsbyksaS5jYWxsYmFjaz10Pz9udWxsLHdvKG4saSxvKSxlLmN1cnJlbnQubGFuZXM9byxUYShlLG8sciksZm4oZSxyKSxlfWZ1bmN0aW9uIFpjKGUsdCxuLHIpe3ZhciBvPXQuY3VycmVudCxpPXRuKCksbD1FbyhvKTtyZXR1cm4gbj1KeChuKSx0LmNvbnRleHQ9PT1udWxsP3QuY29udGV4dD1uOnQucGVuZGluZ0NvbnRleHQ9bix0PUxyKGksbCksdC5wYXlsb2FkPXtlbGVtZW50OmV9LHI9cj09PXZvaWQgMD9udWxsOnIsciE9PW51bGwmJih0LmNhbGxiYWNrPXIpLGU9d28obyx0LGwpLGUhPT1udWxsJiYocW4oZSxvLGwsaSksVHUoZSxvLGwpKSxsfWZ1bmN0aW9uIGRjKGUpe2lmKGU9ZS5jdXJyZW50LCFlLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChlLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBlLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBlLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gVnYoZSx0KXtpZihlPWUubWVtb2l6ZWRTdGF0ZSxlIT09bnVsbCYmZS5kZWh5ZHJhdGVkIT09bnVsbCl7dmFyIG49ZS5yZXRyeUxhbmU7ZS5yZXRyeUxhbmU9biE9PTAmJm48dD9uOnR9fWZ1bmN0aW9uIF9nKGUsdCl7VnYoZSx0KSwoZT1lLmFsdGVybmF0ZSkmJlZ2KGUsdCl9ZnVuY3Rpb24gV2soKXtyZXR1cm4gbnVsbH12YXIgcXg9dHlwZW9mIHJlcG9ydEVycm9yPT0iZnVuY3Rpb24iP3JlcG9ydEVycm9yOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSl9O2Z1bmN0aW9uIHdnKGUpe3RoaXMuX2ludGVybmFsUm9vdD1lfXFjLnByb3RvdHlwZS5yZW5kZXI9d2cucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pbnRlcm5hbFJvb3Q7aWYodD09PW51bGwpdGhyb3cgRXJyb3IoVyg0MDkpKTtaYyhlLHQsbnVsbCxudWxsKX07cWMucHJvdG90eXBlLnVubW91bnQ9d2cucHJvdG90eXBlLnVubW91bnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9pbnRlcm5hbFJvb3Q7aWYoZSE9PW51bGwpe3RoaXMuX2ludGVybmFsUm9vdD1udWxsO3ZhciB0PWUuY29udGFpbmVySW5mbztkaShmdW5jdGlvbigpe1pjKG51bGwsZSxudWxsLG51bGwpfSksdFtqcl09bnVsbH19O2Z1bmN0aW9uIHFjKGUpe3RoaXMuX2ludGVybmFsUm9vdD1lfXFjLnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbj1mdW5jdGlvbihlKXtpZihlKXt2YXIgdD1iMSgpO2U9e2Jsb2NrZWRPbjpudWxsLHRhcmdldDplLHByaW9yaXR5OnR9O2Zvcih2YXIgbj0wO248dW8ubGVuZ3RoJiZ0IT09MCYmdDx1b1tuXS5wcmlvcml0eTtuKyspO3VvLnNwbGljZShuLDAsZSksbj09PTAmJlAxKGUpfX07ZnVuY3Rpb24gU2coZSl7cmV0dXJuISghZXx8ZS5ub2RlVHlwZSE9PTEmJmUubm9kZVR5cGUhPT05JiZlLm5vZGVUeXBlIT09MTEpfWZ1bmN0aW9uIGVkKGUpe3JldHVybiEoIWV8fGUubm9kZVR5cGUhPT0xJiZlLm5vZGVUeXBlIT09OSYmZS5ub2RlVHlwZSE9PTExJiYoZS5ub2RlVHlwZSE9PTh8fGUubm9kZVZhbHVlIT09IiByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAiKSl9ZnVuY3Rpb24gSHYoKXt9ZnVuY3Rpb24gVWsoZSx0LG4scixvKXtpZihvKXtpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7dmFyIGk9cjtyPWZ1bmN0aW9uKCl7dmFyIHU9ZGMobCk7aS5jYWxsKHUpfX12YXIgbD1aeCh0LHIsZSwwLG51bGwsITEsITEsIiIsSHYpO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI9bCxlW2pyXT1sLmN1cnJlbnQsZWEoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLGRpKCksbH1mb3IoO289ZS5sYXN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQobyk7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3ZhciBzPXI7cj1mdW5jdGlvbigpe3ZhciB1PWRjKGEpO3MuY2FsbCh1KX19dmFyIGE9eGcoZSwwLCExLG51bGwsbnVsbCwhMSwhMSwiIixIdik7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj1hLGVbanJdPWEuY3VycmVudCxlYShlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGU6ZSksZGkoZnVuY3Rpb24oKXtaYyh0LGEsbixyKX0pLGF9ZnVuY3Rpb24gdGQoZSx0LG4scixvKXt2YXIgaT1uLl9yZWFjdFJvb3RDb250YWluZXI7aWYoaSl7dmFyIGw9aTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIil7dmFyIHM9bztvPWZ1bmN0aW9uKCl7dmFyIGE9ZGMobCk7cy5jYWxsKGEpfX1aYyh0LGwsZSxvKX1lbHNlIGw9VWsobix0LGUsbyxyKTtyZXR1cm4gZGMobCl9VDE9ZnVuY3Rpb24oZSl7c3dpdGNoKGUudGFnKXtjYXNlIDM6dmFyIHQ9ZS5zdGF0ZU5vZGU7aWYodC5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXt2YXIgbj1tcyh0LnBlbmRpbmdMYW5lcyk7biE9PTAmJihCcCh0LG58MSksZm4odCx1dCgpKSwhKENlJjYpJiYod2w9dXQoKSs1MDAsem8oKSkpfWJyZWFrO2Nhc2UgMTM6ZGkoZnVuY3Rpb24oKXt2YXIgcj16cihlLDEpO2lmKHIhPT1udWxsKXt2YXIgbz10bigpO3FuKHIsZSwxLG8pfX0pLF9nKGUsMSl9fTtXcD1mdW5jdGlvbihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD16cihlLDEzNDIxNzcyOCk7aWYodCE9PW51bGwpe3ZhciBuPXRuKCk7cW4odCxlLDEzNDIxNzcyOCxuKX1fZyhlLDEzNDIxNzcyOCl9fTtOMT1mdW5jdGlvbihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1FbyhlKSxuPXpyKGUsdCk7aWYobiE9PW51bGwpe3ZhciByPXRuKCk7cW4obixlLHQscil9X2coZSx0KX19O2IxPWZ1bmN0aW9uKCl7cmV0dXJuIFBlfTtSMT1mdW5jdGlvbihlLHQpe3ZhciBuPVBlO3RyeXtyZXR1cm4gUGU9ZSx0KCl9ZmluYWxseXtQZT1ufX07WGY9ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaCh0KXtjYXNlImlucHV0IjppZihXZihlLG4pLHQ9bi5uYW1lLG4udHlwZT09PSJyYWRpbyImJnQhPW51bGwpe2ZvcihuPWU7bi5wYXJlbnROb2RlOyluPW4ucGFyZW50Tm9kZTtmb3Iobj1uLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9IitKU09OLnN0cmluZ2lmeSgiIit0KSsnXVt0eXBlPSJyYWRpbyJdJyksdD0wO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdO2lmKHIhPT1lJiZyLmZvcm09PT1lLmZvcm0pe3ZhciBvPUhjKHIpO2lmKCFvKXRocm93IEVycm9yKFcoOTApKTtzMShyKSxXZihyLG8pfX19YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6dTEoZSxuKTticmVhaztjYXNlInNlbGVjdCI6dD1uLnZhbHVlLHQhPW51bGwmJm9sKGUsISFuLm11bHRpcGxlLHQsITEpfX07bTE9Z2c7djE9ZGk7dmFyIFZrPXt1c2luZ0NsaWVudEVudHJ5UG9pbnQ6ITEsRXZlbnRzOltiYSxHaSxIYyxwMSxnMSxnZ119LGxzPXtmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTpRbyxidW5kbGVUeXBlOjAsdmVyc2lvbjoiMTguMi4wIixyZW5kZXJlclBhY2thZ2VOYW1lOiJyZWFjdC1kb20ifSxIaz17YnVuZGxlVHlwZTpscy5idW5kbGVUeXBlLHZlcnNpb246bHMudmVyc2lvbixyZW5kZXJlclBhY2thZ2VOYW1lOmxzLnJlbmRlcmVyUGFja2FnZU5hbWUscmVuZGVyZXJDb25maWc6bHMucmVuZGVyZXJDb25maWcsb3ZlcnJpZGVIb29rU3RhdGU6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzOm51bGwsb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzUmVuYW1lUGF0aDpudWxsLHNldEVycm9ySGFuZGxlcjpudWxsLHNldFN1c3BlbnNlSGFuZGxlcjpudWxsLHNjaGVkdWxlVXBkYXRlOm51bGwsY3VycmVudERpc3BhdGNoZXJSZWY6VnIuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1fMShlKSxlPT09bnVsbD9udWxsOmUuc3RhdGVOb2RlfSxmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTpscy5maW5kRmliZXJCeUhvc3RJbnN0YW5jZXx8V2ssZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOm51bGwsc2NoZWR1bGVSZWZyZXNoOm51bGwsc2NoZWR1bGVSb290Om51bGwsc2V0UmVmcmVzaEhhbmRsZXI6bnVsbCxnZXRDdXJyZW50RmliZXI6bnVsbCxyZWNvbmNpbGVyVmVyc2lvbjoiMTguMi4wLW5leHQtOWUzYjc3MmI4LTIwMjIwNjA4In07aWYodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXzwidSIpe3ZhciBhdT1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187aWYoIWF1LmlzRGlzYWJsZWQmJmF1LnN1cHBvcnRzRmliZXIpdHJ5e0JjPWF1LmluamVjdChIaykscHI9YXV9Y2F0Y2h7fX1Ubi5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRD1WaztUbi5jcmVhdGVQb3J0YWw9ZnVuY3Rpb24oZSx0KXt2YXIgbj0yPGFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbDtpZighU2codCkpdGhyb3cgRXJyb3IoVygyMDApKTtyZXR1cm4gQmsoZSx0LG51bGwsbil9O1RuLmNyZWF0ZVJvb3Q9ZnVuY3Rpb24oZSx0KXtpZighU2coZSkpdGhyb3cgRXJyb3IoVygyOTkpKTt2YXIgbj0hMSxyPSIiLG89cXg7cmV0dXJuIHQhPW51bGwmJih0LnVuc3RhYmxlX3N0cmljdE1vZGU9PT0hMCYmKG49ITApLHQuaWRlbnRpZmllclByZWZpeCE9PXZvaWQgMCYmKHI9dC5pZGVudGlmaWVyUHJlZml4KSx0Lm9uUmVjb3ZlcmFibGVFcnJvciE9PXZvaWQgMCYmKG89dC5vblJlY292ZXJhYmxlRXJyb3IpKSx0PXhnKGUsMSwhMSxudWxsLG51bGwsbiwhMSxyLG8pLGVbanJdPXQuY3VycmVudCxlYShlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGU6ZSksbmV3IHdnKHQpfTtUbi5maW5kRE9NTm9kZT1mdW5jdGlvbihlKXtpZihlPT1udWxsKXJldHVybiBudWxsO2lmKGUubm9kZVR5cGU9PT0xKXJldHVybiBlO3ZhciB0PWUuX3JlYWN0SW50ZXJuYWxzO2lmKHQ9PT12b2lkIDApdGhyb3cgdHlwZW9mIGUucmVuZGVyPT0iZnVuY3Rpb24iP0Vycm9yKFcoMTg4KSk6KGU9T2JqZWN0LmtleXMoZSkuam9pbigiLCIpLEVycm9yKFcoMjY4LGUpKSk7cmV0dXJuIGU9XzEodCksZT1lPT09bnVsbD9udWxsOmUuc3RhdGVOb2RlLGV9O1RuLmZsdXNoU3luYz1mdW5jdGlvbihlKXtyZXR1cm4gZGkoZSl9O1RuLmh5ZHJhdGU9ZnVuY3Rpb24oZSx0LG4pe2lmKCFlZCh0KSl0aHJvdyBFcnJvcihXKDIwMCkpO3JldHVybiB0ZChudWxsLGUsdCwhMCxuKX07VG4uaHlkcmF0ZVJvb3Q9ZnVuY3Rpb24oZSx0LG4pe2lmKCFTZyhlKSl0aHJvdyBFcnJvcihXKDQwNSkpO3ZhciByPW4hPW51bGwmJm4uaHlkcmF0ZWRTb3VyY2VzfHxudWxsLG89ITEsaT0iIixsPXF4O2lmKG4hPW51bGwmJihuLnVuc3RhYmxlX3N0cmljdE1vZGU9PT0hMCYmKG89ITApLG4uaWRlbnRpZmllclByZWZpeCE9PXZvaWQgMCYmKGk9bi5pZGVudGlmaWVyUHJlZml4KSxuLm9uUmVjb3ZlcmFibGVFcnJvciE9PXZvaWQgMCYmKGw9bi5vblJlY292ZXJhYmxlRXJyb3IpKSx0PVp4KHQsbnVsbCxlLDEsbj8/bnVsbCxvLCExLGksbCksZVtqcl09dC5jdXJyZW50LGVhKGUpLHIpZm9yKGU9MDtlPHIubGVuZ3RoO2UrKyluPXJbZV0sbz1uLl9nZXRWZXJzaW9uLG89byhuLl9zb3VyY2UpLHQubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT09bnVsbD90Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9W24sb106dC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2gobixvKTtyZXR1cm4gbmV3IHFjKHQpfTtUbi5yZW5kZXI9ZnVuY3Rpb24oZSx0LG4pe2lmKCFlZCh0KSl0aHJvdyBFcnJvcihXKDIwMCkpO3JldHVybiB0ZChudWxsLGUsdCwhMSxuKX07VG4udW5tb3VudENvbXBvbmVudEF0Tm9kZT1mdW5jdGlvbihlKXtpZighZWQoZSkpdGhyb3cgRXJyb3IoVyg0MCkpO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI/KGRpKGZ1bmN0aW9uKCl7dGQobnVsbCxudWxsLGUsITEsZnVuY3Rpb24oKXtlLl9yZWFjdFJvb3RDb250YWluZXI9bnVsbCxlW2pyXT1udWxsfSl9KSwhMCk6ITF9O1RuLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzPWdnO1RuLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlZChuKSl0aHJvdyBFcnJvcihXKDIwMCkpO2lmKGU9PW51bGx8fGUuX3JlYWN0SW50ZXJuYWxzPT09dm9pZCAwKXRocm93IEVycm9yKFcoMzgpKTtyZXR1cm4gdGQoZSx0LG4sITEscil9O1RuLnZlcnNpb249IjE4LjIuMC1uZXh0LTllM2I3NzJiOC0yMDIyMDYwOCI7ZnVuY3Rpb24gZV8oKXtpZighKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18+InUifHx0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFIT0iZnVuY3Rpb24iKSl0cnl7X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKGVfKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX1lXygpLFowLmV4cG9ydHM9VG47dmFyIEhyPVowLmV4cG9ydHM7Y29uc3QgS2s9JGEoSHIpO3ZhciBLdj1IcjtEZi5jcmVhdGVSb290PUt2LmNyZWF0ZVJvb3QsRGYuaHlkcmF0ZVJvb3Q9S3YuaHlkcmF0ZVJvb3Q7dmFyIHRfPXtleHBvcnRzOnt9fSxuZD17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QtanN4LXJ1bnRpbWUucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBHaz1wLFlrPVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxYaz1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLFFrPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksSms9R2suX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQuUmVhY3RDdXJyZW50T3duZXIsWms9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtmdW5jdGlvbiBuXyhlLHQsbil7dmFyIHIsbz17fSxpPW51bGwsbD1udWxsO24hPT12b2lkIDAmJihpPSIiK24pLHQua2V5IT09dm9pZCAwJiYoaT0iIit0LmtleSksdC5yZWYhPT12b2lkIDAmJihsPXQucmVmKTtmb3IociBpbiB0KVFrLmNhbGwodCxyKSYmIVprLmhhc093blByb3BlcnR5KHIpJiYob1tyXT10W3JdKTtpZihlJiZlLmRlZmF1bHRQcm9wcylmb3IociBpbiB0PWUuZGVmYXVsdFByb3BzLHQpb1tyXT09PXZvaWQgMCYmKG9bcl09dFtyXSk7cmV0dXJueyQkdHlwZW9mOllrLHR5cGU6ZSxrZXk6aSxyZWY6bCxwcm9wczpvLF9vd25lcjpKay5jdXJyZW50fX1uZC5GcmFnbWVudD1YaztuZC5qc3g9bl87bmQuanN4cz1uXzt0Xy5leHBvcnRzPW5kO3ZhciB3PXRfLmV4cG9ydHM7ZnVuY3Rpb24gTmgoZSx0KXsodD09bnVsbHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheSh0KTtuPHQ7bisrKXJbbl09ZVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBFZyhlLHQpe2lmKGUpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gTmgoZSx0KTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7aWYobj09PSJPYmplY3QiJiZlLmNvbnN0cnVjdG9yJiYobj1lLmNvbnN0cnVjdG9yLm5hbWUpLG49PT0iTWFwInx8bj09PSJTZXQiKXJldHVybiBBcnJheS5mcm9tKGUpO2lmKG49PT0iQXJndW1lbnRzInx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIE5oKGUsdCl9fWZ1bmN0aW9uIENnKGUsdCl7dmFyIG49dHlwZW9mIFN5bWJvbDwidSImJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KGUpfHwobj1FZyhlKSl8fHQmJmUmJnR5cGVvZiBlLmxlbmd0aD09Im51bWJlciIpe24mJihlPW4pO3ZhciByPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PWUubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTplW3IrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGF9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9dmFyIGk9ITAsbD0hMSxzO3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwoZSl9LG46ZnVuY3Rpb24oKXt2YXIgYT1uLm5leHQoKTtyZXR1cm4gaT1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtsPSEwLHM9YX0sZjpmdW5jdGlvbigpe3RyeXshaSYmbi5yZXR1cm4hPW51bGwmJm4ucmV0dXJuKCl9ZmluYWxseXtpZihsKXRocm93IHN9fX19ZnVuY3Rpb24gcl8oZSl7cmV0dXJuIGUubGVuZ3RoPjB9dmFyIFBhPU9iamVjdC5mcmVlemUoe2tpbmQ6Im9rIix2YWx1ZTp2b2lkIDB9KTtmdW5jdGlvbiBPYShlKXtyZXR1cm4gZT09PXZvaWQgMD9QYTp7a2luZDoib2siLHZhbHVlOmV9fWZ1bmN0aW9uIF9pKGUpe3JldHVybntraW5kOiJlcnIiLGVycm9yOmV9fWZ1bmN0aW9uIE1sKGUpe3JldHVybiBlPT09UGF8fGUua2luZD09PSJvayJ9ZnVuY3Rpb24gJGcoZSl7cmV0dXJuIGUhPT1QYSYmZS5raW5kPT09ImVyciJ9ZnVuY3Rpb24gb18oZSl7dmFyIHQ9W10sbj1bXSxyPUNnKGUpLG87dHJ5e2ZvcihyLnMoKTshKG89ci5uKCkpLmRvbmU7KXt2YXIgaT1vLnZhbHVlO01sKGkpP3QucHVzaChpLnZhbHVlKTpuLnB1c2goaS5lcnJvcil9fWNhdGNoKGwpe3IuZShsKX1maW5hbGx5e3IuZigpfXJldHVybiByXyhuKT9faShuKTpPYSh0KX1mdW5jdGlvbiBxayhlKXtyZXR1cm4gb18oZSl9ZnVuY3Rpb24gZVQoZSl7dmFyIHQ9W10sbj1DZyhlKSxyO3RyeXtmb3Iobi5zKCk7IShyPW4ubigpKS5kb25lOyl7dmFyIG89ci52YWx1ZTskZyhvKSYmdC5wdXNoKG8uZXJyb3IpfX1jYXRjaChpKXtuLmUoaSl9ZmluYWxseXtuLmYoKX1yZXR1cm4gcl8odCk/X2kodCk6UGF9ZnVuY3Rpb24gdFQoZSx0KXtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKHZhciByPU9hKHQpLG89MDtvPG4ubGVuZ3RoJiZNbChyKTsrK28pcj1lKHIudmFsdWUsbltvXSxvKTtyZXR1cm4gcn19ZnVuY3Rpb24gblQoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNbCh0KT9PYShlKHQudmFsdWUpKTp0fX1mdW5jdGlvbiByVChlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIE1sKHQpP2UodC52YWx1ZSk6dH19ZnVuY3Rpb24gb1QoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAkZyh0KT9faShlKHQuZXJyb3IpKTp0fX1mdW5jdGlvbiBpVChlLHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gZShuKT9PYShuKTpfaSh0KG4pKX19dmFyIGxUPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBNbChyKT90KHIudmFsdWUpP3I6X2kobihyLnZhbHVlKSk6cn19LFBzPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHZvaWRPazpQYSxvazpPYSxlcnI6X2ksaXNPazpNbCxpc0VycjokZyxhbGxUOm9fLGFsbDpxayxhbGxWOmVULGZsYXRNYXBSZWR1Y2U6dFQsbWFwOm5ULGZsYXRNYXA6clQsbWFwRXJyOm9ULGZyb21QcmVkaWNhdGU6aVQsZmlsdGVyT3JFbHNlOmxUfSk7ZnVuY3Rpb24gc1QoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihuIT09dm9pZCAwKXt2YXIgcj1uLmNhbGwoZSx0fHwiZGVmYXVsdCIpO2lmKHR5cGVvZiByIT0ib2JqZWN0IilyZXR1cm4gcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybih0PT09InN0cmluZyI/U3RyaW5nOk51bWJlcikoZSl9ZnVuY3Rpb24gaV8oZSl7dmFyIHQ9c1QoZSwic3RyaW5nIik7cmV0dXJuIHR5cGVvZiB0PT0ic3ltYm9sIj90OlN0cmluZyh0KX1mdW5jdGlvbiB2dChlLHQsbil7cmV0dXJuIHQ9aV8odCksdCBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX1mdW5jdGlvbiBHdihlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24obyl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxvKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIFNsKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP0d2KE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXt2dChlLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpHdihPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGV9ZnVuY3Rpb24gYVQoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gTmgoZSl9ZnVuY3Rpb24gdVQoZSl7aWYodHlwZW9mIFN5bWJvbDwidSImJmVbU3ltYm9sLml0ZXJhdG9yXSE9bnVsbHx8ZVsiQEBpdGVyYXRvciJdIT1udWxsKXJldHVybiBBcnJheS5mcm9tKGUpfWZ1bmN0aW9uIGNUKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBkVChlKXtyZXR1cm4gYVQoZSl8fHVUKGUpfHxFZyhlKXx8Y1QoKX1mdW5jdGlvbiBwZShlKXsiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiO3JldHVybiBwZT10eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiZ0eXBlb2YgU3ltYm9sLml0ZXJhdG9yPT0ic3ltYm9sIj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0scGUoZSl9ZnVuY3Rpb24gZlQoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZX1mdW5jdGlvbiBoVChlLHQpe3ZhciBuPWU9PW51bGw/bnVsbDp0eXBlb2YgU3ltYm9sPCJ1IiYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlWyJAQGl0ZXJhdG9yIl07aWYobiE9bnVsbCl7dmFyIHIsbyxpLGwscz1bXSxhPSEwLHU9ITE7dHJ5e2lmKGk9KG49bi5jYWxsKGUpKS5uZXh0LHQ9PT0wKXtpZihPYmplY3QobikhPT1uKXJldHVybjthPSExfWVsc2UgZm9yKDshKGE9KHI9aS5jYWxsKG4pKS5kb25lKSYmKHMucHVzaChyLnZhbHVlKSxzLmxlbmd0aCE9PXQpO2E9ITApO31jYXRjaChjKXt1PSEwLG89Y31maW5hbGx5e3RyeXtpZighYSYmbi5yZXR1cm4hPW51bGwmJihsPW4ucmV0dXJuKCksT2JqZWN0KGwpIT09bCkpcmV0dXJufWZpbmFsbHl7aWYodSl0aHJvdyBvfX1yZXR1cm4gc319ZnVuY3Rpb24gcFQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gcmkoZSx0KXtyZXR1cm4gZlQoZSl8fGhUKGUsdCl8fEVnKGUsdCl8fHBUKCl9ZnVuY3Rpb24gX3IoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBZdihlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsaV8oci5rZXkpLHIpfX1mdW5jdGlvbiB3cihlLHQsbil7cmV0dXJuIHQmJll2KGUucHJvdG90eXBlLHQpLG4mJll2KGUsbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZX1mdW5jdGlvbiBiaChlLHQpe3JldHVybiBiaD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLG8pe3JldHVybiByLl9fcHJvdG9fXz1vLHJ9LGJoKGUsdCl9ZnVuY3Rpb24gd2koZSx0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIiYmdCE9PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksdCYmYmgoZSx0KX1mdW5jdGlvbiBmYyhlKXtyZXR1cm4gZmM9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24obil7cmV0dXJuIG4uX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2Yobil9LGZjKGUpfWZ1bmN0aW9uIGdUKCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIGxfKGUpe2lmKGU9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBtVChlLHQpe2lmKHQmJih0eXBlb2YgdD09Im9iamVjdCJ8fHR5cGVvZiB0PT0iZnVuY3Rpb24iKSlyZXR1cm4gdDtpZih0IT09dm9pZCAwKXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7cmV0dXJuIGxfKGUpfWZ1bmN0aW9uIFNpKGUpe3ZhciB0PWdUKCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9ZmMoZSksbztpZih0KXt2YXIgaT1mYyh0aGlzKS5jb25zdHJ1Y3RvcjtvPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbz1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbVQodGhpcyxvKX19dmFyIEVpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe19yKHRoaXMsZSl9cmV0dXJuIHdyKGUsW3trZXk6ImFwcGVuZFZhbGlkYXRpb25FcnJvciIsdmFsdWU6ZnVuY3Rpb24obixyLG8saSl7cmV0dXJuIG4/KG5bcl0/bltyXS5wdXNoKHttZXNzYWdlOm8sdmFsdWU6aX0pOm5bcl09W3ttZXNzYWdlOm8sdmFsdWU6aX1dLG4pOnZ0KHt9LHIsW3ttZXNzYWdlOm8sdmFsdWU6aX1dKX19XSksZX0oKSxNdT1TeW1ib2woIkdldFNjaGVtYSIpLFp0PVN5bWJvbCgiUGF0aCIpLHl0PVN5bWJvbCgiR2V0U291cmNlIik7ZnVuY3Rpb24gdlQoZSl7cmV0dXJuIGVbTXVdfXZhciBrZz13cihmdW5jdGlvbiBlKHQpe19yKHRoaXMsZSksdGhpcy5zcGFuPXR9KSx5VD1mdW5jdGlvbihlKXt3aShuLGUpO3ZhciB0PVNpKG4pO2Z1bmN0aW9uIG4ocixvKXt2YXIgaTtyZXR1cm4gX3IodGhpcyxuKSxpPXQuY2FsbCh0aGlzLG8pLHZ0KGxfKGkpLCJ0eXBlIiwiU3ltIiksaS52YWx1ZT1yLGl9cmV0dXJuIHdyKG4sW3trZXk6InRyYW5zcGlsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX19XSksbn0oa2cpO25ldyB5VCgiKCkiKTt2YXIgbm49Il90eXBlIixfbj0iX3JlZiIseFQ9ZnVuY3Rpb24oZSl7d2kobixlKTt2YXIgdD1TaShuKTtmdW5jdGlvbiBuKHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBfcih0aGlzLG4pLG89dC5jYWxsKHRoaXMpLG8ub3B0aW9ucz1yLG8ub3B0PWksb31yZXR1cm4gd3Iobixbe2tleToidmFsaWRhdGUiLHZhbHVlOmZ1bmN0aW9uKG8saSl7cmV0dXJuIHRoaXMub3B0JiZpPT1udWxsPyExOmk9PW51bGw/dnQoe30sbyxbe21lc3NhZ2U6Ik5vbi1vcHRpb25hbCBpbWFnZSB3YXMgbnVsbCBvciB1bmRlZmluZWQuIix2YWx1ZTppfV0pOnR5cGVvZiBpW19uXSE9InN0cmluZyI/dnQoe30sbyxbe21lc3NhZ2U6IkltYWdlIGRpZCBub3QgaGF2ZSBhIGZpbGUgcmVmZXJlbmNlIHN0cmluZy4gR290OiAiLmNvbmNhdChwZShpW19uXSkpLHZhbHVlOml9XSk6aVtubl0hPT0iZmlsZSI/dnQoe30sbyxbe21lc3NhZ2U6IkltYWdlIGRpZCBub3QgaGF2ZSB0aGUgdmFsaWQgZmlsZSBleHRlbnNpb24gdHlwZS4gR290OiAiLmNvbmNhdChpW25uXSksdmFsdWU6aX1dKTppLm1ldGFkYXRhP3Z0KHt9LG8sW3ttZXNzYWdlOiJGb3VuZCBtZXRhZGF0YSwgYnV0IGl0IGNvdWxkIG5vdCBiZSB2YWxpZGF0ZWQuIEltYWdlIG1ldGFkYXRhIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggdGhlIHJlcXVpcmVkIHByb3BzOiB3aWR0aCAocG9zaXRpdmUgbnVtYmVyKSwgaGVpZ2h0IChwb3NpdGl2ZSBudW1iZXIpIGFuZCBzaGEyNTYgKHN0cmluZyBvZiBsZW5ndGggNjQgb2YgdGhlIGJhc2UxNiBoYXNoKS4iLHZhbHVlOmksZml4ZXM6WyJpbWFnZTpyZXBsYWNlLW1ldGFkYXRhIl19XSk6dnQoe30sbyxbe21lc3NhZ2U6IkNvdWxkIG5vdCB2YWxpZGF0ZSBJbWFnZSBtZXRhZGF0YS4iLHZhbHVlOmksZml4ZXM6WyJpbWFnZTphZGQtbWV0YWRhdGEiXX1dKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7cmV0dXJuIHRoaXMub3B0JiZvPT1udWxsPyEwOihvPT1udWxsP3ZvaWQgMDpvW19uXSk9PT0iaW1hZ2UiJiYobz09bnVsbD92b2lkIDA6b1tubl0pPT09ImZpbGUifX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMub3B0aW9ucywhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6ImltYWdlIixvcHRpb25zOnRoaXMub3B0aW9ucyxvcHQ6dGhpcy5vcHR9fX1dKSxufShFaSksc189ZnVuY3Rpb24odCl7dmFyIG47aWYoIXRbX25dLnN0YXJ0c1dpdGgoIi9wdWJsaWMiKSl7dmFyIHI7cmV0dXJue3VybDp0W19uXSsiP3NoYTI1Nj0iLmNvbmNhdCgocj10Lm1ldGFkYXRhKT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIuc2hhMjU2KSxtZXRhZGF0YTp0Lm1ldGFkYXRhfX1yZXR1cm57dXJsOnRbX25dLnNsaWNlKDcpKyI/c2hhMjU2PSIuY29uY2F0KChuPXQubWV0YWRhdGEpPT09bnVsbHx8bj09PXZvaWQgMD92b2lkIDA6bi5zaGEyNTYpLG1ldGFkYXRhOnQubWV0YWRhdGF9fTtmdW5jdGlvbiBhXyhlKXtyZXR1cm4gcGUoZSk9PT0ib2JqZWN0IiYmZSE9PW51bGwmJmUhPT12b2lkIDAmJigidmFsImluIGV8fCJ2YWxQYXRoImluIGUpfWZ1bmN0aW9uIF9UKGUpe3JldHVybiBwZShlKT09PSJvYmplY3QiJiZlIT09bnVsbCYmZSE9PXZvaWQgMCYmWnQgaW4gZSYmInZhbCJpbiBlfWZ1bmN0aW9uIHdUKGUpe3JldHVybiBlW1p0XX1mdW5jdGlvbiBTVChlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX1mdW5jdGlvbiBYdihlLHQsbil7cmV0dXJuIHQ/U3QoZShTdCh0LG4pKSk6U3QodCxuKX1mdW5jdGlvbiAkbyhlKXtyZXR1cm4gcGUoZSk9PT0ib2JqZWN0IiYmZSE9PW51bGwmJih5dCBpbiBlfHxadCBpbiBlKX1mdW5jdGlvbiBTdChlLHQsbil7dmFyIHI7aWYocGUoZSk9PT0ib2JqZWN0Iil7aWYoJG8oZSkpcmV0dXJuIGU7aWYoYV8oZSkpcmV0dXJuIFN0KGUudmFsLGUudmFsUGF0aCl9aWYoZSYmZVtfbl0mJmVbbm5dPT09ImZpbGUiKXt2YXIgbz1lW19uXTtpZih0eXBlb2YgbyE9InN0cmluZyIpdGhyb3cgRXJyb3IoIkludmFsaWQgZmlsZSByZWY6ICIrbyk7cmV0dXJuIFN0KHNfKGUpLHQsbil9c3dpdGNoKHBlKGUpKXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6dGhyb3cgRXJyb3IoIkludmFsaWQgc2VsZWN0b3IgdHlwZTogIi5jb25jYXQocGUoZSksIjogIikuY29uY2F0KGUpKTtjYXNlIm9iamVjdCI6aWYoZSE9PW51bGwpcmV0dXJuIG5ldyBQcm94eShlLHtoYXM6ZnVuY3Rpb24obCxzKXtyZXR1cm4gcz09PXl0fHxzPT09WnR8fHM9PT0iYW5kVGhlbiJ8fHM9PT1NdT8hMDpzIGluIGx9LGdldDpmdW5jdGlvbihsLHMpe2lmKHM9PT15dClyZXR1cm4gZTtpZihzPT09WnQpcmV0dXJuIHQ7aWYocz09PU11KXJldHVybiBuO2lmKHM9PT0iYW5kVGhlbiIpcmV0dXJuIGZ1bmN0aW9uKHUpe3JldHVybiBYdih1LGUsdCl9O2lmKEFycmF5LmlzQXJyYXkobCkpe2lmKHM9PT0iZmlsdGVyIilyZXR1cm4gZnVuY3Rpb24odSl7dmFyIGM9bC5tYXAoZnVuY3Rpb24oZCxmKXtyZXR1cm4gU3QoZCxRbih0LGYpLG49PW51bGw/dm9pZCAwOm4uaXRlbSl9KS5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIHUmJnUgaW5zdGFuY2VvZiBFaT91LmFzc2VydChRdihkKSk6UXYodShkKSl9KTtyZXR1cm4gU3QoYyx0LG4pfTtpZihzPT09Im1hcCIpcmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciBjPWwubWFwKGZ1bmN0aW9uKGQsZil7dmFyIGg9dShTdChkLFFuKHQsZiksbj09bnVsbD92b2lkIDA6bi5pdGVtKSxTdChmKSk7cmV0dXJuICRvKGgpP2g6U3QoaCl9KTtyZXR1cm4gU3QoYyx0LG4pfX1pZihBcnJheS5pc0FycmF5KGwpJiZzPT09Imxlbmd0aCIpcmV0dXJuIFN0KGwubGVuZ3RoKTt2YXIgYT1SZWZsZWN0LmdldChsLHMpO3JldHVybiBTVChlLHMpP051bWJlci5pc05hTihOdW1iZXIocykpP1N0KGEsUW4odCxzKSxuPT1udWxsP3ZvaWQgMDpuLml0ZW1zW3NdKTpTdChhLFFuKHQsTnVtYmVyKHMpKSxuPT1udWxsP3ZvaWQgMDpuLml0ZW0pOmF9fSk7ZGVmYXVsdDpyZXR1cm4gcj17ZXE6ZnVuY3Rpb24obCl7dmFyIHM9bDtpZigkbyhsKSYmKHM9bFt5dF0scyBpbnN0YW5jZW9mIGtnKSl0aHJvdyBFcnJvcigiVE9ETzogQ2Fubm90IGV2YWx1YXRlIGVxdWFsaXR5IHdpdGggYW4gRXhwciIpO3JldHVybiBTdChlPT09cyx2b2lkIDApfSxhbmRUaGVuOmZ1bmN0aW9uKGwpe3JldHVybiBYdihsLGU9PT12b2lkIDA/bnVsbDplLHQpfX0sdnQocix5dCxlPT09dm9pZCAwP251bGw6ZSksdnQocixadCx0KSx2dChyLE11LG4pLHJ9fWZ1bmN0aW9uIFFuKGUsdCl7aWYocGUodCk9PT0ic3ltYm9sIil0aHJvdyBFcnJvcigiQ2Fubm90IGNyZWF0ZSB2YWwgcGF0aCBvZiBhcnJheSBpdGVtIHdpdGggc3ltYm9sIHByb3A6ICIuY29uY2F0KHQudG9TdHJpbmcoKSkpO3JldHVybiBlJiYiIi5jb25jYXQoZSwiLiIpLmNvbmNhdChKU09OLnN0cmluZ2lmeSh0KSl9ZnVuY3Rpb24gUXYoZSl7aWYocGUoZSk9PT0ib2JqZWN0IiYmKHl0IGluIGV8fFp0IGluIGUpKXt2YXIgdD1lW3l0XTtyZXR1cm4gdH1yZXR1cm4gZX12YXIgRVQ9ZnVuY3Rpb24oZSl7d2kobixlKTt2YXIgdD1TaShuKTtmdW5jdGlvbiBuKHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBfcih0aGlzLG4pLG89dC5jYWxsKHRoaXMpLG8uaXRlbXM9cixvLm9wdD1pLG99cmV0dXJuIHdyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihvLGkpe3ZhciBsPXRoaXMscz0hMTtyZXR1cm4gdGhpcy5vcHQmJmk9PW51bGw/ITE6cGUoaSkhPT0ib2JqZWN0Ij92dCh7fSxvLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnIi5jb25jYXQocGUoaSksIiciKX1dKTpBcnJheS5pc0FycmF5KGkpP3Z0KHt9LG8sW3ttZXNzYWdlOiJFeHBlY3RlZCAnb2JqZWN0JywgZ290ICdhcnJheScifV0pOihPYmplY3QuZW50cmllcyh0aGlzLml0ZW1zKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciB1PXJpKGEsMiksYz11WzBdLGQ9dVsxXSxmPVFuKG8sYyk7aWYoIWYpcz1sLmFwcGVuZFZhbGlkYXRpb25FcnJvcihzLG8sIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIHBhdGggYXQgIi5jb25jYXQoIW8mJnR5cGVvZiBvPT0ic3RyaW5nIj8iPGVtcHR5IHN0cmluZz4iOm8sIiBhdCBrZXkgIikuY29uY2F0KGMpLGkpO2Vsc2V7dmFyIGg9ZC52YWxpZGF0ZShmLGlbY10pO2gmJnM/cz1TbChTbCh7fSxoKSxzKTpoJiYocz1oKX19KSxzKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7aWYodGhpcy5vcHQmJm89PW51bGwpcmV0dXJuITA7aWYoIW8pcmV0dXJuITE7Zm9yKHZhciBpPTAsbD1PYmplY3QuZW50cmllcyh0aGlzLml0ZW1zKTtpPGwubGVuZ3RoO2krKyl7dmFyIHM9cmkobFtpXSwyKSxhPXNbMF0sdT1zWzFdO2lmKCF1LmFzc2VydChvW2FdKSlyZXR1cm4hMX1yZXR1cm4gcGUobyk9PT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkobyl9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5pdGVtcywhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6Im9iamVjdCIsaXRlbXM6T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRoaXMuaXRlbXMpLm1hcChmdW5jdGlvbihvKXt2YXIgaT1yaShvLDIpLGw9aVswXSxzPWlbMV07cmV0dXJuW2wscy5zZXJpYWxpemUoKV19KSksb3B0OnRoaXMub3B0fX19XSksbn0oRWkpLENUPWZ1bmN0aW9uKGUpe3dpKG4sZSk7dmFyIHQ9U2kobik7ZnVuY3Rpb24gbihyKXt2YXIgbyxpPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gX3IodGhpcyxuKSxvPXQuY2FsbCh0aGlzKSxvLml0ZW09cixvLm9wdD1pLG99cmV0dXJuIHdyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihvLGkpe3ZhciBsPXRoaXMscz0hMTtyZXR1cm4gdGhpcy5vcHQmJmk9PW51bGw/ITE6cGUoaSkhPT0ib2JqZWN0Inx8IUFycmF5LmlzQXJyYXkoaSk/dnQoe30sbyxbe21lc3NhZ2U6IkV4cGVjdGVkICdhcnJheScsIGdvdCAnIi5jb25jYXQocGUoaSksIiciKX1dKTooaS5mb3JFYWNoKGZ1bmN0aW9uKGEsdSl7dmFyIGM9UW4obyx1KTtpZighYylzPWwuYXBwZW5kVmFsaWRhdGlvbkVycm9yKHMsbywiSW50ZXJuYWwgZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgcGF0aCBhdCAiLmNvbmNhdCghbyYmdHlwZW9mIG89PSJzdHJpbmciPyI8ZW1wdHkgc3RyaW5nPiI6bywiIGF0IGluZGV4ICIpLmNvbmNhdCh1KSxpKTtlbHNle3ZhciBkPWwuaXRlbS52YWxpZGF0ZShjLGEpO2QmJnM/cz1TbChTbCh7fSxkKSxzKTpkJiYocz1kKX19KSxzKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7aWYodGhpcy5vcHQmJm89PW51bGwpcmV0dXJuITA7aWYoIW8pcmV0dXJuITE7dmFyIGk9Q2cobyksbDt0cnl7Zm9yKGkucygpOyEobD1pLm4oKSkuZG9uZTspe3ZhciBzPWwudmFsdWU7aWYoIXRoaXMuaXRlbS5hc3NlcnQocykpcmV0dXJuITF9fWNhdGNoKGEpe2kuZShhKX1maW5hbGx5e2kuZigpfXJldHVybiBwZShvKT09PSJvYmplY3QiJiZBcnJheS5pc0FycmF5KG8pfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuaXRlbSwhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6ImFycmF5IixpdGVtOnRoaXMuaXRlbS5zZXJpYWxpemUoKSxvcHQ6dGhpcy5vcHR9fX1dKSxufShFaSksJFQ9ZnVuY3Rpb24oZSl7d2kobixlKTt2YXIgdD1TaShuKTtmdW5jdGlvbiBuKHIsbyl7dmFyIGksbD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITE7cmV0dXJuIF9yKHRoaXMsbiksaT10LmNhbGwodGhpcyksaS5rZXk9cixpLml0ZW1zPW8saS5vcHQ9bCxpfXJldHVybiB3cihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24obyxpKXt0aHJvdyBuZXcgRXJyb3IoIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuIil9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKG8pe3Rocm93IG5ldyBFcnJvcigiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4iKX19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4iKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToidW5pb24iLGtleTp0aGlzLmtleSxpdGVtczp0aGlzLml0ZW1zLm1hcChmdW5jdGlvbihvKXtyZXR1cm4gby5zZXJpYWxpemUoKX0pLG9wdDp0aGlzLm9wdH19fV0pLG59KEVpKSxrVD1mdW5jdGlvbihlKXt3aShuLGUpO3ZhciB0PVNpKG4pO2Z1bmN0aW9uIG4ocil7dmFyIG8saT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIF9yKHRoaXMsbiksbz10LmNhbGwodGhpcyksby5vcHRpb25zPXIsby5vcHQ9aSxvfXJldHVybiB3cihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24obyxpKXtyZXR1cm4hMX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7cmV0dXJuITB9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5vcHRpb25zLCEwKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToicmljaHRleHQiLG9wdDp0aGlzLm9wdH19fV0pLG59KEVpKSxUVD1mdW5jdGlvbihlKXt3aShuLGUpO3ZhciB0PVNpKG4pO2Z1bmN0aW9uIG4ocil7dmFyIG8saT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIF9yKHRoaXMsbiksbz10LmNhbGwodGhpcyksby5pdGVtPXIsby5vcHQ9aSxvfXJldHVybiB3cihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24obyxpKXt2YXIgbD10aGlzLHM9ITE7cmV0dXJuIHRoaXMub3B0JiZpPT1udWxsPyExOnBlKGkpIT09Im9iamVjdCI/dnQoe30sbyxbe21lc3NhZ2U6IkV4cGVjdGVkICdvYmplY3QnLCBnb3QgJyIuY29uY2F0KHBlKGkpLCInIil9XSk6QXJyYXkuaXNBcnJheShpKT92dCh7fSxvLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnYXJyYXknIn1dKTooT2JqZWN0LmVudHJpZXMoaSkuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgdT1yaShhLDIpLGM9dVswXSxkPXVbMV0sZj1RbihvLGMpO2lmKCFmKXM9bC5hcHBlbmRWYWxpZGF0aW9uRXJyb3IocyxvLCJJbnRlcm5hbCBlcnJvcjogY291bGQgbm90IGNyZWF0ZSBwYXRoIGF0ICIuY29uY2F0KCFvJiZ0eXBlb2Ygbz09InN0cmluZyI/IjxlbXB0eSBzdHJpbmc+IjpvLCIgYXQga2V5ICIpLmNvbmNhdChkKSxpKTtlbHNle3ZhciBoPWwuaXRlbS52YWxpZGF0ZShmLGQpO2gmJnM/cz1TbChTbCh7fSxoKSxzKTpoJiYocz1oKX19KSxzKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7aWYodGhpcy5vcHQmJm89PW51bGwpcmV0dXJuITA7aWYoIW8pcmV0dXJuITE7Zm9yKHZhciBpPTAsbD1PYmplY3QuZW50cmllcyhvKTtpPGwubGVuZ3RoO2krKyl7dmFyIHM9cmkobFtpXSwyKSxhPXNbMV07aWYoIXRoaXMuaXRlbS5hc3NlcnQoYSkpcmV0dXJuITF9cmV0dXJuIHBlKG8pPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KG8pfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuaXRlbSwhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6InJlY29yZCIsaXRlbTp0aGlzLml0ZW0uc2VyaWFsaXplKCksb3B0OnRoaXMub3B0fX19XSksbn0oRWkpO2Z1bmN0aW9uIE5UKGUpe3ZhciB0PWVbeXRdO2lmKHQgaW5zdGFuY2VvZiBrZyl0aHJvdyBFcnJvcigiQ2Fubm90IGdldCByYXcgc291cmNlIG9mIGFuIEV4cHIiKTt2YXIgbj10O3JldHVybiBufWZ1bmN0aW9uIGJUKGUpe3JldHVybiBlLmluZGV4T2YoIi4iKT09PS0xP1tlLCIiXTpbZS5zbGljZSgwLGUuaW5kZXhPZigiLiIpKSxlLnNsaWNlKGUuaW5kZXhPZigiLiIpKzEpXX1mdW5jdGlvbiBSVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEVUfHxwZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0ib2JqZWN0In1mdW5jdGlvbiBQVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFRUfHxwZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0icmVjb3JkIn1mdW5jdGlvbiBPVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIENUfHxwZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0iYXJyYXkifWZ1bmN0aW9uIEFUKGUpe3JldHVybiBlIGluc3RhbmNlb2YgJFR8fHBlKGUpPT09Im9iamVjdCImJiJ0eXBlImluIGUmJmUudHlwZT09PSJ1bmlvbiJ9ZnVuY3Rpb24gTVQoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBrVHx8cGUoZSk9PT0ib2JqZWN0IiYmInR5cGUiaW4gZSYmZS50eXBlPT09InJpY2h0ZXh0In1mdW5jdGlvbiBEVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHhUfHxwZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0iaW1hZ2UifWZ1bmN0aW9uIExUKGUsdCxuKXtmb3IodmFyIHI9SVQoZSksbz1kVChyKSxpPW4sbD10LHM9ZnVuY3Rpb24oKXt2YXIgYz1yLnNoaWZ0KCk7aWYoYz09PXZvaWQgMCl0aHJvdyBFcnJvcigiVW5leHBlY3RlZCB1bmRlZmluZWQgcGFydCIpO2lmKE9UKGkpKXtpZihOdW1iZXIuaXNOYU4oTnVtYmVyKGMpKSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiBhcnJheSBzY2hlbWEgIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkoaSksIiBtdXN0IGhhdmUgYSBudW1iZXIgYXMgcGF0aCwgYnV0IGdvdCAiKS5jb25jYXQoYywiLiBQYXRoOiAiKS5jb25jYXQoZSkpO2lmKHBlKGwpIT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGwpKXRocm93IEVycm9yKCJTY2hlbWEgdHlwZSBlcnJvcjogZXhwZWN0ZWQgc291cmNlIHRvIGJlIHR5cGUgb2YgYXJyYXksIGJ1dCBnb3QgIi5jb25jYXQocGUobCkpKTtpZighbFtjXSl7dmFyIGQ7dGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogYXJyYXkgc291cmNlIChsZW5ndGg6ICIuY29uY2F0KChkPWwpPT09bnVsbHx8ZD09PXZvaWQgMD92b2lkIDA6ZC5sZW5ndGgsIikgZGlkIG5vdCBoYXZlIGluZGV4ICIpLmNvbmNhdChjLCIgZnJvbSBwYXRoOiAiKS5jb25jYXQoZSkpfWw9bFtjXSxpPWkuaXRlbX1lbHNlIGlmKFBUKGkpKXtpZih0eXBlb2YgYyE9InN0cmluZyIpdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogcmVjb3JkIHNjaGVtYSAiLmNvbmNhdChpLCIgbXVzdCBoYXZlIHBhdGg6ICIpLmNvbmNhdChjLCIgYXMgc3RyaW5nIikpO2lmKHBlKGwpIT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGwpKXRocm93IEVycm9yKCJTY2hlbWEgdHlwZSBlcnJvcjogZXhwZWN0ZWQgc291cmNlIHRvIGJlIHR5cGUgb2YgcmVjb3JkLCBidXQgZ290ICIuY29uY2F0KHBlKGwpKSk7aWYoIWxbY10pdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogcmVjb3JkIHNvdXJjZSBkaWQgbm90IGhhdmUga2V5ICIuY29uY2F0KGMsIiBmcm9tIHBhdGg6ICIpLmNvbmNhdChlKSk7bD1sW2NdLGk9aS5pdGVtfWVsc2UgaWYoUlQoaSkpe2lmKHBlKGwpIT09Im9iamVjdCIpdGhyb3cgRXJyb3IoIlNjaGVtYSB0eXBlIGVycm9yOiBleHBlY3RlZCBzb3VyY2UgdG8gYmUgdHlwZSBvZiBvYmplY3QsIGJ1dCBnb3QgIi5jb25jYXQocGUobCkpKTtpZighbFtjXSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiBvYmplY3Qgc291cmNlIGRpZCBub3QgaGF2ZSBrZXkgIi5jb25jYXQoYywiIGZyb20gcGF0aDogIikuY29uY2F0KGUpKTtsPWxbY10saT1pLml0ZW1zW2NdfWVsc2V7aWYoRFQoaSkpcmV0dXJue3Y6e3BhdGg6by5zbGljZSgwLG8ubGVuZ3RoLXIubGVuZ3RoLTEpLm1hcChmdW5jdGlvbihtKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobSl9KS5qb2luKCIuIiksc2NoZW1hOmksc291cmNlOmx9fTtpZihBVChpKSl7dmFyIGY9aS5rZXksaD1sW2ZdO2lmKCFoKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IHVuaW9uIHNvdXJjZSAiLmNvbmNhdChpLCIgZGlkIG5vdCBoYXZlIHJlcXVpcmVkIGtleSAiKS5jb25jYXQoZiwiIGluIHBhdGg6ICIpLmNvbmNhdChlKSk7dmFyIGc9aS5pdGVtcy5maW5kKGZ1bmN0aW9uKG0pe3ZhciBTLHY7cmV0dXJuKG09PW51bGx8fChTPW0uaXRlbXMpPT09bnVsbHx8Uz09PXZvaWQgMHx8KHY9U1tmXSk9PT1udWxsfHx2PT09dm9pZCAwP3ZvaWQgMDp2LnZhbHVlKT09PWh9KTtpZighZyl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiB1bmlvbiBzY2hlbWEgIi5jb25jYXQoaSwiIGRpZCBub3QgaGF2ZSBhIGNoaWxkIG9iamVjdCB3aXRoICIpLmNvbmNhdChmLCIgb2YgdmFsdWUgIikuY29uY2F0KGgsIiBpbiBwYXRoOiAiKS5jb25jYXQoZSkpO2k9Zy5pdGVtc1tjXSxsPWxbY119ZWxzZXtpZihNVChpKSlyZXR1cm57djp7cGF0aDpvLnNsaWNlKDAsby5sZW5ndGgtci5sZW5ndGgtMSkubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBKU09OLnN0cmluZ2lmeShtKX0pLmpvaW4oIi4iKSxzY2hlbWE6aSxzb3VyY2U6bH19O3Rocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6ICIuY29uY2F0KGMsIiByZXNvbHZlZCB0byBhbiB1bmV4cGVjdGVkIHNjaGVtYSAiKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkoaSkpKX19fTtyLmxlbmd0aD4wOyl7dmFyIGE9cygpO2lmKHBlKGEpPT09Im9iamVjdCIpcmV0dXJuIGEudn1pZihyLmxlbmd0aD4wKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6ICIuY29uY2F0KHIuam9pbigiLiIpLCIgaXMgbm90IGEgdmFsaWQgcGF0aCIpKTtyZXR1cm57cGF0aDpvLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gTnVtYmVyLmlzTmFOKE51bWJlcih1KSk/SlNPTi5zdHJpbmdpZnkodSk6dX0pLmpvaW4oIi4iKSxzY2hlbWE6aSxzb3VyY2U6bH19ZnVuY3Rpb24gSVQoZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOyl7dmFyIHI9IiI7aWYoZVtuXT09PSciJyl7Zm9yKG4rKztuPGUubGVuZ3RoJiZlW25dIT09JyInOyllW25dPT09IlxcIiYmZVtuKzFdPT09JyInPyhyKz0nIicsbisrKTpyKz1lW25dLG4rKztpZihlW25dIT09JyInKXt2YXIgbzt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgKCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGUpLCIpOiBNaXNzaW5nIGNsb3NpbmcgZG91YmxlIHF1b3RlOiAiKS5jb25jYXQoKG89ZVtuXSkhPT1udWxsJiZvIT09dm9pZCAwP286ImF0IGVuZCBvZiBzdHJpbmciLCIgKGNoYXI6ICIpLmNvbmNhdChuLCI7IGxlbmd0aDogIikuY29uY2F0KGUubGVuZ3RoLCIpIikpfX1lbHNlIGZvcig7bjxlLmxlbmd0aCYmZVtuXSE9PSIuIjspcis9ZVtuXSxuKys7ciE9PSIiJiZ0LnB1c2gociksbisrfXJldHVybiB0fWZ1bmN0aW9uIGpUKGUpe3JldHVybiB1XyhCVChlKSl9ZnVuY3Rpb24gelQoZSl7cmV0dXJuICRvKGUpP3BlKGVbeXRdKT09PSJvYmplY3QiJiZwZShlW3l0XSkhPT1udWxsJiZBcnJheS5pc0FycmF5KGVbeXRdKTpBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIEZUKGUpe3JldHVybiAkbyhlKT9wZShlW3l0XSk9PT0ib2JqZWN0IiYmcGUoZVt5dF0pIT09bnVsbCYmIUFycmF5LmlzQXJyYXkoZVt5dF0pOnBlKGUpPT09Im9iamVjdCJ9ZnVuY3Rpb24gQlQoZSl7dmFyIHQ9U3QoZSk7ZnVuY3Rpb24gbihyKXt2YXIgbz16VChyKSxpPUZUKHIpO2lmKG8pe3ZhciBsPXl0IGluIHI/clt5dF06cixzPVp0IGluIHI/cltadF06dm9pZCAwO3JldHVybnt2YWw6bC5tYXAoZnVuY3Rpb24oYyxkKXtyZXR1cm4gbigkbyhjKT9jOlN0KGMsUW4ocyxkKSkpfSksdmFsUGF0aDpzfX1lbHNlIGlmKGkpe3ZhciBhPXl0IGluIHI/clt5dF06cix1PVp0IGluIHI/cltadF06dm9pZCAwO3JldHVybnt2YWw6YSE9PW51bGwmJk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhKS5tYXAoZnVuY3Rpb24oYyl7dmFyIGQ9cmkoYywyKSxmPWRbMF0saD1kWzFdO3JldHVybltmLG4oJG8oaCk/aDpTdChoLFFuKHUsZikpKV19KSksdmFsUGF0aDp1fX1lbHNlIHJldHVybiAkbyhyKT97dmFsOm4oclt5dF0pLHZhbFBhdGg6cltadF19OnJ9cmV0dXJuIG4odCl9ZnVuY3Rpb24gUmgoZSl7dmFyIHQ9YV8oZSk/ZS52YWw6ZTtzd2l0Y2gocGUodCkpe2Nhc2UiZnVuY3Rpb24iOmNhc2Uic3ltYm9sIjp0aHJvdyBFcnJvcigiSW52YWxpZCB2YWwgdHlwZTogIi5jb25jYXQocGUodCkpKTtjYXNlIm9iamVjdCI6cmV0dXJuIHQ9PT1udWxsP251bGw6QXJyYXkuaXNBcnJheSh0KT90Lm1hcChSaCk6T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpLm1hcChmdW5jdGlvbihuKXt2YXIgcj1yaShuLDIpLG89clswXSxpPXJbMV07cmV0dXJuW28saSYmUmgoaSldfSkpO2RlZmF1bHQ6cmV0dXJuIHR9fWZ1bmN0aW9uIHVfKGUpe3ZhciB0LG49ZS52YWw7c3dpdGNoKHBlKG4pKXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6dGhyb3cgRXJyb3IoIkludmFsaWQgdmFsIHR5cGU6ICIuY29uY2F0KHBlKG4pKSk7Y2FzZSJvYmplY3QiOmlmKG4hPT1udWxsKXJldHVybiBuZXcgUHJveHkobix7aGFzOmZ1bmN0aW9uKG8saSl7cmV0dXJuIGk9PT0idmFsInx8aT09PVp0PyEwOkp2KG8saSl9LGdldDpmdW5jdGlvbihvLGkpe2lmKGk9PT1adClyZXR1cm4gZS52YWxQYXRoO2lmKGk9PT0idmFsIilyZXR1cm4gUmgoZSk7aWYoQXJyYXkuaXNBcnJheShvKSYmaT09PSJsZW5ndGgiKXJldHVybiBvLmxlbmd0aDtpZihKdihuLGkpKXt2YXIgbCxzO3JldHVybiB1Xyh7dmFsOlJlZmxlY3QuZ2V0KG8saSkudmFsLHZhbFBhdGg6KGw9KHM9UmVmbGVjdC5nZXQobyxpKSk9PT1udWxsfHxzPT09dm9pZCAwP3ZvaWQgMDpzLnZhbFBhdGgpIT09bnVsbCYmbCE9PXZvaWQgMD9sOlFuKGUudmFsUGF0aCxBcnJheS5pc0FycmF5KG8pP051bWJlcihpKTppKX0pfXJldHVybiBSZWZsZWN0LmdldChvLGkpfX0pO2RlZmF1bHQ6cmV0dXJuIHQ9e30sdnQodCxadCxlLnZhbFBhdGgpLHZ0KHQsInZhbCIsZS52YWwpLHR9fWZ1bmN0aW9uIEp2KGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfWZ1bmN0aW9uIHVhKCl7dWE9ZnVuY3Rpb24oKXtyZXR1cm4gdH07dmFyIGUsdD17fSxuPU9iamVjdC5wcm90b3R5cGUscj1uLmhhc093blByb3BlcnR5LG89T2JqZWN0LmRlZmluZVByb3BlcnR5fHxmdW5jdGlvbihQLE8sayl7UFtPXT1rLnZhbHVlfSxpPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiI/U3ltYm9sOnt9LGw9aS5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLHM9aS5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixhPWkudG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiB1KFAsTyxrKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFAsTyx7dmFsdWU6ayxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLFBbT119dHJ5e3Uoe30sIiIpfWNhdGNoe3U9ZnVuY3Rpb24oTyxrLEkpe3JldHVybiBPW2tdPUl9fWZ1bmN0aW9uIGMoUCxPLGssSSl7dmFyIEw9TyYmTy5wcm90b3R5cGUgaW5zdGFuY2VvZiB2P086dixWPU9iamVjdC5jcmVhdGUoTC5wcm90b3R5cGUpLHRlPW5ldyBIKEl8fFtdKTtyZXR1cm4gbyhWLCJfaW52b2tlIix7dmFsdWU6UihQLGssdGUpfSksVn1mdW5jdGlvbiBkKFAsTyxrKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOlAuY2FsbChPLGspfX1jYXRjaChJKXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzpJfX19dC53cmFwPWM7dmFyIGY9InN1c3BlbmRlZFN0YXJ0IixoPSJzdXNwZW5kZWRZaWVsZCIsZz0iZXhlY3V0aW5nIixtPSJjb21wbGV0ZWQiLFM9e307ZnVuY3Rpb24gdigpe31mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIHgoKXt9dmFyIF89e307dShfLGwsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3ZhciBFPU9iamVjdC5nZXRQcm90b3R5cGVPZiwkPUUmJkUoRShYKFtdKSkpOyQmJiQhPT1uJiZyLmNhbGwoJCxsKSYmKF89JCk7dmFyIEM9eC5wcm90b3R5cGU9di5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShfKTtmdW5jdGlvbiBUKFApe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbihPKXt1KFAsTyxmdW5jdGlvbihrKXtyZXR1cm4gdGhpcy5faW52b2tlKE8sayl9KX0pfWZ1bmN0aW9uIE0oUCxPKXtmdW5jdGlvbiBrKEwsVix0ZSx5ZSl7dmFyIGZlPWQoUFtMXSxQLFYpO2lmKGZlLnR5cGUhPT0idGhyb3ciKXt2YXIgT2U9ZmUuYXJnLGJlPU9lLnZhbHVlO3JldHVybiBiZSYmdHlwZW9mIGJlPT0ib2JqZWN0IiYmci5jYWxsKGJlLCJfX2F3YWl0Iik/Ty5yZXNvbHZlKGJlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24oWil7aygibmV4dCIsWix0ZSx5ZSl9LGZ1bmN0aW9uKFope2soInRocm93IixaLHRlLHllKX0pOk8ucmVzb2x2ZShiZSkudGhlbihmdW5jdGlvbihaKXtPZS52YWx1ZT1aLHRlKE9lKX0sZnVuY3Rpb24oWil7cmV0dXJuIGsoInRocm93IixaLHRlLHllKX0pfXllKGZlLmFyZyl9dmFyIEk7byh0aGlzLCJfaW52b2tlIix7dmFsdWU6ZnVuY3Rpb24oTCxWKXtmdW5jdGlvbiB0ZSgpe3JldHVybiBuZXcgTyhmdW5jdGlvbih5ZSxmZSl7ayhMLFYseWUsZmUpfSl9cmV0dXJuIEk9ST9JLnRoZW4odGUsdGUpOnRlKCl9fSl9ZnVuY3Rpb24gUihQLE8sayl7dmFyIEk9ZjtyZXR1cm4gZnVuY3Rpb24oTCxWKXtpZihJPT09Zyl0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZihJPT09bSl7aWYoTD09PSJ0aHJvdyIpdGhyb3cgVjtyZXR1cm57dmFsdWU6ZSxkb25lOiEwfX1mb3Ioay5tZXRob2Q9TCxrLmFyZz1WOzspe3ZhciB0ZT1rLmRlbGVnYXRlO2lmKHRlKXt2YXIgeWU9aih0ZSxrKTtpZih5ZSl7aWYoeWU9PT1TKWNvbnRpbnVlO3JldHVybiB5ZX19aWYoay5tZXRob2Q9PT0ibmV4dCIpay5zZW50PWsuX3NlbnQ9ay5hcmc7ZWxzZSBpZihrLm1ldGhvZD09PSJ0aHJvdyIpe2lmKEk9PT1mKXRocm93IEk9bSxrLmFyZztrLmRpc3BhdGNoRXhjZXB0aW9uKGsuYXJnKX1lbHNlIGsubWV0aG9kPT09InJldHVybiImJmsuYWJydXB0KCJyZXR1cm4iLGsuYXJnKTtJPWc7dmFyIGZlPWQoUCxPLGspO2lmKGZlLnR5cGU9PT0ibm9ybWFsIil7aWYoST1rLmRvbmU/bTpoLGZlLmFyZz09PVMpY29udGludWU7cmV0dXJue3ZhbHVlOmZlLmFyZyxkb25lOmsuZG9uZX19ZmUudHlwZT09PSJ0aHJvdyImJihJPW0say5tZXRob2Q9InRocm93IixrLmFyZz1mZS5hcmcpfX19ZnVuY3Rpb24gaihQLE8pe3ZhciBrPU8ubWV0aG9kLEk9UC5pdGVyYXRvcltrXTtpZihJPT09ZSlyZXR1cm4gTy5kZWxlZ2F0ZT1udWxsLGs9PT0idGhyb3ciJiZQLml0ZXJhdG9yLnJldHVybiYmKE8ubWV0aG9kPSJyZXR1cm4iLE8uYXJnPWUsaihQLE8pLE8ubWV0aG9kPT09InRocm93Iil8fGshPT0icmV0dXJuIiYmKE8ubWV0aG9kPSJ0aHJvdyIsTy5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnIitrKyInIG1ldGhvZCIpKSxTO3ZhciBMPWQoSSxQLml0ZXJhdG9yLE8uYXJnKTtpZihMLnR5cGU9PT0idGhyb3ciKXJldHVybiBPLm1ldGhvZD0idGhyb3ciLE8uYXJnPUwuYXJnLE8uZGVsZWdhdGU9bnVsbCxTO3ZhciBWPUwuYXJnO3JldHVybiBWP1YuZG9uZT8oT1tQLnJlc3VsdE5hbWVdPVYudmFsdWUsTy5uZXh0PVAubmV4dExvYyxPLm1ldGhvZCE9PSJyZXR1cm4iJiYoTy5tZXRob2Q9Im5leHQiLE8uYXJnPWUpLE8uZGVsZWdhdGU9bnVsbCxTKTpWOihPLm1ldGhvZD0idGhyb3ciLE8uYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksTy5kZWxlZ2F0ZT1udWxsLFMpfWZ1bmN0aW9uIEYoUCl7dmFyIE89e3RyeUxvYzpQWzBdfTsxIGluIFAmJihPLmNhdGNoTG9jPVBbMV0pLDIgaW4gUCYmKE8uZmluYWxseUxvYz1QWzJdLE8uYWZ0ZXJMb2M9UFszXSksdGhpcy50cnlFbnRyaWVzLnB1c2goTyl9ZnVuY3Rpb24gYWUoUCl7dmFyIE89UC5jb21wbGV0aW9ufHx7fTtPLnR5cGU9Im5vcm1hbCIsZGVsZXRlIE8uYXJnLFAuY29tcGxldGlvbj1PfWZ1bmN0aW9uIEgoUCl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLFAuZm9yRWFjaChGLHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIFgoUCl7aWYoUHx8UD09PSIiKXt2YXIgTz1QW2xdO2lmKE8pcmV0dXJuIE8uY2FsbChQKTtpZih0eXBlb2YgUC5uZXh0PT0iZnVuY3Rpb24iKXJldHVybiBQO2lmKCFpc05hTihQLmxlbmd0aCkpe3ZhciBrPS0xLEk9ZnVuY3Rpb24gTCgpe2Zvcig7KytrPFAubGVuZ3RoOylpZihyLmNhbGwoUCxrKSlyZXR1cm4gTC52YWx1ZT1QW2tdLEwuZG9uZT0hMSxMO3JldHVybiBMLnZhbHVlPWUsTC5kb25lPSEwLEx9O3JldHVybiBJLm5leHQ9SX19dGhyb3cgbmV3IFR5cGVFcnJvcih0eXBlb2YgUCsiIGlzIG5vdCBpdGVyYWJsZSIpfXJldHVybiB5LnByb3RvdHlwZT14LG8oQywiY29uc3RydWN0b3IiLHt2YWx1ZTp4LGNvbmZpZ3VyYWJsZTohMH0pLG8oeCwiY29uc3RydWN0b3IiLHt2YWx1ZTp5LGNvbmZpZ3VyYWJsZTohMH0pLHkuZGlzcGxheU5hbWU9dSh4LGEsIkdlbmVyYXRvckZ1bmN0aW9uIiksdC5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKFApe3ZhciBPPXR5cGVvZiBQPT0iZnVuY3Rpb24iJiZQLmNvbnN0cnVjdG9yO3JldHVybiEhTyYmKE89PT15fHwoTy5kaXNwbGF5TmFtZXx8Ty5uYW1lKT09PSJHZW5lcmF0b3JGdW5jdGlvbiIpfSx0Lm1hcms9ZnVuY3Rpb24oUCl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoUCx4KTooUC5fX3Byb3RvX189eCx1KFAsYSwiR2VuZXJhdG9yRnVuY3Rpb24iKSksUC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShDKSxQfSx0LmF3cmFwPWZ1bmN0aW9uKFApe3JldHVybntfX2F3YWl0OlB9fSxUKE0ucHJvdG90eXBlKSx1KE0ucHJvdG90eXBlLHMsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHQuQXN5bmNJdGVyYXRvcj1NLHQuYXN5bmM9ZnVuY3Rpb24oUCxPLGssSSxMKXtMPT09dm9pZCAwJiYoTD1Qcm9taXNlKTt2YXIgVj1uZXcgTShjKFAsTyxrLEkpLEwpO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24oTyk/VjpWLm5leHQoKS50aGVuKGZ1bmN0aW9uKHRlKXtyZXR1cm4gdGUuZG9uZT90ZS52YWx1ZTpWLm5leHQoKX0pfSxUKEMpLHUoQyxhLCJHZW5lcmF0b3IiKSx1KEMsbCxmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdShDLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0pLHQua2V5cz1mdW5jdGlvbihQKXt2YXIgTz1PYmplY3QoUCksaz1bXTtmb3IodmFyIEkgaW4gTylrLnB1c2goSSk7cmV0dXJuIGsucmV2ZXJzZSgpLGZ1bmN0aW9uIEwoKXtmb3IoO2subGVuZ3RoOyl7dmFyIFY9ay5wb3AoKTtpZihWIGluIE8pcmV0dXJuIEwudmFsdWU9VixMLmRvbmU9ITEsTH1yZXR1cm4gTC5kb25lPSEwLEx9fSx0LnZhbHVlcz1YLEgucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILHJlc2V0OmZ1bmN0aW9uKFApe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PWUsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9ZSx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChhZSksIVApZm9yKHZhciBPIGluIHRoaXMpTy5jaGFyQXQoMCk9PT0idCImJnIuY2FsbCh0aGlzLE8pJiYhaXNOYU4oK08uc2xpY2UoMSkpJiYodGhpc1tPXT1lKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgUD10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZihQLnR5cGU9PT0idGhyb3ciKXRocm93IFAuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKFApe2lmKHRoaXMuZG9uZSl0aHJvdyBQO3ZhciBPPXRoaXM7ZnVuY3Rpb24gayhmZSxPZSl7cmV0dXJuIFYudHlwZT0idGhyb3ciLFYuYXJnPVAsTy5uZXh0PWZlLE9lJiYoTy5tZXRob2Q9Im5leHQiLE8uYXJnPWUpLCEhT2V9Zm9yKHZhciBJPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtJPj0wOy0tSSl7dmFyIEw9dGhpcy50cnlFbnRyaWVzW0ldLFY9TC5jb21wbGV0aW9uO2lmKEwudHJ5TG9jPT09InJvb3QiKXJldHVybiBrKCJlbmQiKTtpZihMLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgdGU9ci5jYWxsKEwsImNhdGNoTG9jIikseWU9ci5jYWxsKEwsImZpbmFsbHlMb2MiKTtpZih0ZSYmeWUpe2lmKHRoaXMucHJldjxMLmNhdGNoTG9jKXJldHVybiBrKEwuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxMLmZpbmFsbHlMb2MpcmV0dXJuIGsoTC5maW5hbGx5TG9jKX1lbHNlIGlmKHRlKXtpZih0aGlzLnByZXY8TC5jYXRjaExvYylyZXR1cm4gayhMLmNhdGNoTG9jLCEwKX1lbHNle2lmKCF5ZSl0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PEwuZmluYWxseUxvYylyZXR1cm4gayhMLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24oUCxPKXtmb3IodmFyIGs9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2s+PTA7LS1rKXt2YXIgST10aGlzLnRyeUVudHJpZXNba107aWYoSS50cnlMb2M8PXRoaXMucHJldiYmci5jYWxsKEksImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PEkuZmluYWxseUxvYyl7dmFyIEw9STticmVha319TCYmKFA9PT0iYnJlYWsifHxQPT09ImNvbnRpbnVlIikmJkwudHJ5TG9jPD1PJiZPPD1MLmZpbmFsbHlMb2MmJihMPW51bGwpO3ZhciBWPUw/TC5jb21wbGV0aW9uOnt9O3JldHVybiBWLnR5cGU9UCxWLmFyZz1PLEw/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9TC5maW5hbGx5TG9jLFMpOnRoaXMuY29tcGxldGUoVil9LGNvbXBsZXRlOmZ1bmN0aW9uKFAsTyl7aWYoUC50eXBlPT09InRocm93Iil0aHJvdyBQLmFyZztyZXR1cm4gUC50eXBlPT09ImJyZWFrInx8UC50eXBlPT09ImNvbnRpbnVlIj90aGlzLm5leHQ9UC5hcmc6UC50eXBlPT09InJldHVybiI/KHRoaXMucnZhbD10aGlzLmFyZz1QLmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOlAudHlwZT09PSJub3JtYWwiJiZPJiYodGhpcy5uZXh0PU8pLFN9LGZpbmlzaDpmdW5jdGlvbihQKXtmb3IodmFyIE89dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO08+PTA7LS1PKXt2YXIgaz10aGlzLnRyeUVudHJpZXNbT107aWYoay5maW5hbGx5TG9jPT09UClyZXR1cm4gdGhpcy5jb21wbGV0ZShrLmNvbXBsZXRpb24say5hZnRlckxvYyksYWUoayksU319LGNhdGNoOmZ1bmN0aW9uKFApe2Zvcih2YXIgTz10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7Tz49MDstLU8pe3ZhciBrPXRoaXMudHJ5RW50cmllc1tPXTtpZihrLnRyeUxvYz09PVApe3ZhciBJPWsuY29tcGxldGlvbjtpZihJLnR5cGU9PT0idGhyb3ciKXt2YXIgTD1JLmFyZzthZShrKX1yZXR1cm4gTH19dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbihQLE8sayl7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOlgoUCkscmVzdWx0TmFtZTpPLG5leHRMb2M6a30sdGhpcy5tZXRob2Q9PT0ibmV4dCImJih0aGlzLmFyZz1lKSxTfX0sdH1mdW5jdGlvbiBadihlLHQsbixyLG8saSxsKXt0cnl7dmFyIHM9ZVtpXShsKSxhPXMudmFsdWV9Y2F0Y2godSl7bih1KTtyZXR1cm59cy5kb25lP3QoYSk6UHJvbWlzZS5yZXNvbHZlKGEpLnRoZW4ocixvKX1mdW5jdGlvbiBjXyhlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyLG8pe3ZhciBpPWUuYXBwbHkodCxuKTtmdW5jdGlvbiBsKGEpe1p2KGkscixvLGwscywibmV4dCIsYSl9ZnVuY3Rpb24gcyhhKXtadihpLHIsbyxsLHMsInRocm93IixhKX1sKHZvaWQgMCl9KX19dmFyIFdUPWZ1bmN0aW9uKCl7dmFyIGU9Y18odWEoKS5tYXJrKGZ1bmN0aW9uIHQobil7dmFyIHIsbyxpO3JldHVybiB1YSgpLndyYXAoZnVuY3Rpb24ocyl7Zm9yKDs7KXN3aXRjaChzLnByZXY9cy5uZXh0KXtjYXNlIDA6cmV0dXJuIHMubmV4dD0yLGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IixuKTtjYXNlIDI6cmV0dXJuIHI9cy5zZW50LG89QXJyYXkuZnJvbShuZXcgVWludDhBcnJheShyKSksaT1vLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfSkuam9pbigiIikscy5hYnJ1cHQoInJldHVybiIsaSk7Y2FzZSA2OmNhc2UiZW5kIjpyZXR1cm4gcy5zdG9wKCl9fSx0KX0pKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSxVVD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7X3IodGhpcyxlKSx0aGlzLmhvc3Q9dH1yZXR1cm4gd3IoZSxbe2tleToiZ2V0RGlzYWJsZVVybCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvZGlzYWJsZSIpfX0se2tleToiZ2V0RWRpdFVybCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvc3RhdGljL2VkaXQiKX19LHtrZXk6InBvc3RQYXRjaGVzIix2YWx1ZTpmdW5jdGlvbihuLHIsbyl7cmV0dXJuIGZldGNoKCIiLmNvbmNhdCh0aGlzLmhvc3QsIi9wYXRjaGVzL34iKSx7aGVhZGVyczpvfHx7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxtZXRob2Q6IlBPU1QiLGJvZHk6SlNPTi5zdHJpbmdpZnkodnQoe30sbixyKSl9KS50aGVuKGZ1bmN0aW9uKGkpe3JldHVybiBkZihpKX0pfX0se2tleToiZ2V0U2Vzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3Nlc3Npb24iKSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4gZGYobil9KX19LHtrZXk6ImdldE1vZHVsZXMiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPW4ucGF0Y2gsbz1yPT09dm9pZCAwPyExOnIsaT1uLmluY2x1ZGVTY2hlbWEsbD1pPT09dm9pZCAwPyExOmkscz1uLmluY2x1ZGVTb3VyY2UsYT1zPT09dm9pZCAwPyExOnMsdT1uLnRyZWVQYXRoLGM9dT09PXZvaWQgMD8iLyI6dSxkPW4uaGVhZGVycyxmPW5ldyBVUkxTZWFyY2hQYXJhbXM7cmV0dXJuIGYuc2V0KCJwYXRjaCIsby50b1N0cmluZygpKSxmLnNldCgic2NoZW1hIixsLnRvU3RyaW5nKCkpLGYuc2V0KCJzb3VyY2UiLGEudG9TdHJpbmcoKSksZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3RyZWUvfiIpLmNvbmNhdChjLCI/IikuY29uY2F0KGYudG9TdHJpbmcoKSkse2hlYWRlcnM6ZH0pLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIGRmKGgpfSl9fV0pLGV9KCk7ZnVuY3Rpb24gZGYoZSl7cmV0dXJuIFBoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBQaCgpe3JldHVybiBQaD1jXyh1YSgpLm1hcmsoZnVuY3Rpb24gZSh0KXtyZXR1cm4gdWEoKS53cmFwKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOmlmKHIucHJldj0wLCF0Lm9rKXtyLm5leHQ9OTticmVha31yZXR1cm4gci50MD1QcyxyLm5leHQ9NSx0Lmpzb24oKTtjYXNlIDU6cmV0dXJuIHIudDE9ci5zZW50LHIuYWJydXB0KCJyZXR1cm4iLHIudDAub2suY2FsbChyLnQwLHIudDEpKTtjYXNlIDk6cmV0dXJuIHIudDI9UHMsci50Mz10LnN0YXR1cyxyLm5leHQ9MTMsdC50ZXh0KCk7Y2FzZSAxMzpyZXR1cm4gci50ND1yLnNlbnQsci50NT17c3RhdHVzQ29kZTpyLnQzLG1lc3NhZ2U6ci50NH0sci5hYnJ1cHQoInJldHVybiIsci50Mi5lcnIuY2FsbChyLnQyLHIudDUpKTtjYXNlIDE2OnIubmV4dD0yMTticmVhaztjYXNlIDE4OnJldHVybiByLnByZXY9MTgsci50Nj1yLmNhdGNoKDApLHIuYWJydXB0KCJyZXR1cm4iLF9pKHttZXNzYWdlOnIudDYgaW5zdGFuY2VvZiBFcnJvcj9yLnQ2Lm1lc3NhZ2U6IlVua25vd24gZXJyb3IifSkpO2Nhc2UgMjE6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19LGUsbnVsbCxbWzAsMThdXSl9KSksUGguYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciB3bj17Y29udmVydEZpbGVTb3VyY2U6c18sZ2V0U2NoZW1hOnZULGdldFZhbFBhdGg6d1QsZ2V0VmFsOmpULGdldFNvdXJjZTpOVCxyZXNvbHZlUGF0aDpMVCxzcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aDpiVCxpc1ZhbDpfVCxjcmVhdGVWYWxQYXRoT2ZJdGVtOlFuLGdldFNIQTI1Nkhhc2g6V1QsY3JlYXRlUGF0Y2hKU09OUGF0aDpmdW5jdGlvbih0KXtyZXR1cm4iLyIuY29uY2F0KHQuc3BsaXQoIi4iKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIEpTT04ucGFyc2Uobil9KS5qb2luKCIvIikpfSxWQUxfRFJBRlRfTU9ERV9DT09LSUU6InZhbF9kcmFmdF9tb2RlIixWQUxfRU5BQkxFX0NPT0tJRV9OQU1FOiJ2YWxfZW5hYmxlIixWQUxfU1RBVEVfQ09PS0lFOiJ2YWxfc3RhdGUiLFZBTF9TRVNTSU9OX0NPT0tJRToidmFsX3Nlc3Npb24ifSxkXz17ZXhwb3J0czp7fX07LyohCglDb3B5cmlnaHQgKGMpIDIwMTggSmVkIFdhdHNvbi4KCUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlCglodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzCiovKGZ1bmN0aW9uKGUpeyhmdW5jdGlvbigpe3ZhciB0PXt9Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIG4oKXtmb3IodmFyIHI9W10sbz0wO288YXJndW1lbnRzLmxlbmd0aDtvKyspe3ZhciBpPWFyZ3VtZW50c1tvXTtpZihpKXt2YXIgbD10eXBlb2YgaTtpZihsPT09InN0cmluZyJ8fGw9PT0ibnVtYmVyIilyLnB1c2goaSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGkpKXtpZihpLmxlbmd0aCl7dmFyIHM9bi5hcHBseShudWxsLGkpO3MmJnIucHVzaChzKX19ZWxzZSBpZihsPT09Im9iamVjdCIpe2lmKGkudG9TdHJpbmchPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJiYhaS50b1N0cmluZy50b1N0cmluZygpLmluY2x1ZGVzKCJbbmF0aXZlIGNvZGVdIikpe3IucHVzaChpLnRvU3RyaW5nKCkpO2NvbnRpbnVlfWZvcih2YXIgYSBpbiBpKXQuY2FsbChpLGEpJiZpW2FdJiZyLnB1c2goYSl9fX1yZXR1cm4gci5qb2luKCIgIil9ZS5leHBvcnRzPyhuLmRlZmF1bHQ9bixlLmV4cG9ydHM9bik6d2luZG93LmNsYXNzTmFtZXM9bn0pKCl9KShkXyk7dmFyIFZUPWRfLmV4cG9ydHM7Y29uc3QgcmQ9JGEoVlQpO2Z1bmN0aW9uIGVlKCl7cmV0dXJuIGVlPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sZWUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEhUKGUsdCl7dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZSh0KTplIT1udWxsJiYoZS5jdXJyZW50PXQpfWZ1bmN0aW9uIGZfKC4uLmUpe3JldHVybiB0PT5lLmZvckVhY2gobj0+SFQobix0KSl9ZnVuY3Rpb24gWGUoLi4uZSl7cmV0dXJuIHAudXNlQ2FsbGJhY2soZl8oLi4uZSksZSl9Y29uc3QgRWw9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Y2hpbGRyZW46biwuLi5yfT1lLG89cC5DaGlsZHJlbi50b0FycmF5KG4pLGk9by5maW5kKEdUKTtpZihpKXtjb25zdCBsPWkucHJvcHMuY2hpbGRyZW4scz1vLm1hcChhPT5hPT09aT9wLkNoaWxkcmVuLmNvdW50KGwpPjE/cC5DaGlsZHJlbi5vbmx5KG51bGwpOnAuaXNWYWxpZEVsZW1lbnQobCk/bC5wcm9wcy5jaGlsZHJlbjpudWxsOmEpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoT2gsZWUoe30scix7cmVmOnR9KSxwLmlzVmFsaWRFbGVtZW50KGwpP3AuY2xvbmVFbGVtZW50KGwsdm9pZCAwLHMpOm51bGwpfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoT2gsZWUoe30scix7cmVmOnR9KSxuKX0pO0VsLmRpc3BsYXlOYW1lPSJTbG90Ijtjb25zdCBPaD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtjaGlsZHJlbjpuLC4uLnJ9PWU7cmV0dXJuIHAuaXNWYWxpZEVsZW1lbnQobik/cC5jbG9uZUVsZW1lbnQobix7Li4uWVQocixuLnByb3BzKSxyZWY6dD9mXyh0LG4ucmVmKTpuLnJlZn0pOnAuQ2hpbGRyZW4uY291bnQobik+MT9wLkNoaWxkcmVuLm9ubHkobnVsbCk6bnVsbH0pO09oLmRpc3BsYXlOYW1lPSJTbG90Q2xvbmUiO2NvbnN0IEtUPSh7Y2hpbGRyZW46ZX0pPT5wLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLGUpO2Z1bmN0aW9uIEdUKGUpe3JldHVybiBwLmlzVmFsaWRFbGVtZW50KGUpJiZlLnR5cGU9PT1LVH1mdW5jdGlvbiBZVChlLHQpe2NvbnN0IG49ey4uLnR9O2Zvcihjb25zdCByIGluIHQpe2NvbnN0IG89ZVtyXSxpPXRbcl07L15vbltBLVpdLy50ZXN0KHIpP28mJmk/bltyXT0oLi4ucyk9PntpKC4uLnMpLG8oLi4ucyl9Om8mJihuW3JdPW8pOnI9PT0ic3R5bGUiP25bcl09ey4uLm8sLi4uaX06cj09PSJjbGFzc05hbWUiJiYobltyXT1bbyxpXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpKX1yZXR1cm57Li4uZSwuLi5ufX1jb25zdCBYVD1bImEiLCJidXR0b24iLCJkaXYiLCJmb3JtIiwiaDIiLCJoMyIsImltZyIsImlucHV0IiwibGFiZWwiLCJsaSIsIm5hdiIsIm9sIiwicCIsInNwYW4iLCJzdmciLCJ1bCJdLERlPVhULnJlZHVjZSgoZSx0KT0+e2NvbnN0IG49cC5mb3J3YXJkUmVmKChyLG8pPT57Y29uc3R7YXNDaGlsZDppLC4uLmx9PXIscz1pP0VsOnQ7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57d2luZG93W1N5bWJvbC5mb3IoInJhZGl4LXVpIildPSEwfSxbXSkscC5jcmVhdGVFbGVtZW50KHMsZWUoe30sbCx7cmVmOm99KSl9KTtyZXR1cm4gbi5kaXNwbGF5TmFtZT1gUHJpbWl0aXZlLiR7dH1gLHsuLi5lLFt0XTpufX0se30pO2Z1bmN0aW9uIFFUKGUsdCl7ZSYmSHIuZmx1c2hTeW5jKCgpPT5lLmRpc3BhdGNoRXZlbnQodCkpfWNvbnN0ICRuPWdsb2JhbFRoaXMhPW51bGwmJmdsb2JhbFRoaXMuZG9jdW1lbnQ/cC51c2VMYXlvdXRFZmZlY3Q6KCk9Pnt9O2Z1bmN0aW9uIEpUKGUsdCl7cmV0dXJuIHAudXNlUmVkdWNlcigobixyKT0+e2NvbnN0IG89dFtuXVtyXTtyZXR1cm4gbz8/bn0sZSl9Y29uc3QgRGw9ZT0+e2NvbnN0e3ByZXNlbnQ6dCxjaGlsZHJlbjpufT1lLHI9WlQodCksbz10eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKHtwcmVzZW50OnIuaXNQcmVzZW50fSk6cC5DaGlsZHJlbi5vbmx5KG4pLGk9WGUoci5yZWYsby5yZWYpO3JldHVybiB0eXBlb2Ygbj09ImZ1bmN0aW9uInx8ci5pc1ByZXNlbnQ/cC5jbG9uZUVsZW1lbnQobyx7cmVmOml9KTpudWxsfTtEbC5kaXNwbGF5TmFtZT0iUHJlc2VuY2UiO2Z1bmN0aW9uIFpUKGUpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZSgpLHI9cC51c2VSZWYoe30pLG89cC51c2VSZWYoZSksaT1wLnVzZVJlZigibm9uZSIpLGw9ZT8ibW91bnRlZCI6InVubW91bnRlZCIsW3MsYV09SlQobCx7bW91bnRlZDp7VU5NT1VOVDoidW5tb3VudGVkIixBTklNQVRJT05fT1VUOiJ1bm1vdW50U3VzcGVuZGVkIn0sdW5tb3VudFN1c3BlbmRlZDp7TU9VTlQ6Im1vdW50ZWQiLEFOSU1BVElPTl9FTkQ6InVubW91bnRlZCJ9LHVubW91bnRlZDp7TU9VTlQ6Im1vdW50ZWQifX0pO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHU9dXUoci5jdXJyZW50KTtpLmN1cnJlbnQ9cz09PSJtb3VudGVkIj91OiJub25lIn0sW3NdKSwkbigoKT0+e2NvbnN0IHU9ci5jdXJyZW50LGM9by5jdXJyZW50O2lmKGMhPT1lKXtjb25zdCBmPWkuY3VycmVudCxoPXV1KHUpO2U/YSgiTU9VTlQiKTpoPT09Im5vbmUifHwodT09bnVsbD92b2lkIDA6dS5kaXNwbGF5KT09PSJub25lIj9hKCJVTk1PVU5UIik6YShjJiZmIT09aD8iQU5JTUFUSU9OX09VVCI6IlVOTU9VTlQiKSxvLmN1cnJlbnQ9ZX19LFtlLGFdKSwkbigoKT0+e2lmKHQpe2NvbnN0IHU9ZD0+e2NvbnN0IGg9dXUoci5jdXJyZW50KS5pbmNsdWRlcyhkLmFuaW1hdGlvbk5hbWUpO2QudGFyZ2V0PT09dCYmaCYmSHIuZmx1c2hTeW5jKCgpPT5hKCJBTklNQVRJT05fRU5EIikpfSxjPWQ9PntkLnRhcmdldD09PXQmJihpLmN1cnJlbnQ9dXUoci5jdXJyZW50KSl9O3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbnN0YXJ0IixjKSx0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmNhbmNlbCIsdSksdC5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHUpLCgpPT57dC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25zdGFydCIsYyksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25jYW5jZWwiLHUpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix1KX19ZWxzZSBhKCJBTklNQVRJT05fRU5EIil9LFt0LGFdKSx7aXNQcmVzZW50OlsibW91bnRlZCIsInVubW91bnRTdXNwZW5kZWQiXS5pbmNsdWRlcyhzKSxyZWY6cC51c2VDYWxsYmFjayh1PT57dSYmKHIuY3VycmVudD1nZXRDb21wdXRlZFN0eWxlKHUpKSxuKHUpfSxbXSl9fWZ1bmN0aW9uIHV1KGUpe3JldHVybihlPT1udWxsP3ZvaWQgMDplLmFuaW1hdGlvbk5hbWUpfHwibm9uZSJ9ZnVuY3Rpb24gQ2koZSx0PVtdKXtsZXQgbj1bXTtmdW5jdGlvbiByKGksbCl7Y29uc3Qgcz1wLmNyZWF0ZUNvbnRleHQobCksYT1uLmxlbmd0aDtuPVsuLi5uLGxdO2Z1bmN0aW9uIHUoZCl7Y29uc3R7c2NvcGU6ZixjaGlsZHJlbjpoLC4uLmd9PWQsbT0oZj09bnVsbD92b2lkIDA6ZltlXVthXSl8fHMsUz1wLnVzZU1lbW8oKCk9PmcsT2JqZWN0LnZhbHVlcyhnKSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChtLlByb3ZpZGVyLHt2YWx1ZTpTfSxoKX1mdW5jdGlvbiBjKGQsZil7Y29uc3QgaD0oZj09bnVsbD92b2lkIDA6ZltlXVthXSl8fHMsZz1wLnVzZUNvbnRleHQoaCk7aWYoZylyZXR1cm4gZztpZihsIT09dm9pZCAwKXJldHVybiBsO3Rocm93IG5ldyBFcnJvcihgXGAke2R9XGAgbXVzdCBiZSB1c2VkIHdpdGhpbiBcYCR7aX1cYGApfXJldHVybiB1LmRpc3BsYXlOYW1lPWkrIlByb3ZpZGVyIixbdSxjXX1jb25zdCBvPSgpPT57Y29uc3QgaT1uLm1hcChsPT5wLmNyZWF0ZUNvbnRleHQobCkpO3JldHVybiBmdW5jdGlvbihzKXtjb25zdCBhPShzPT1udWxsP3ZvaWQgMDpzW2VdKXx8aTtyZXR1cm4gcC51c2VNZW1vKCgpPT4oe1tgX19zY29wZSR7ZX1gXTp7Li4ucyxbZV06YX19KSxbcyxhXSl9fTtyZXR1cm4gby5zY29wZU5hbWU9ZSxbcixxVChvLC4uLnQpXX1mdW5jdGlvbiBxVCguLi5lKXtjb25zdCB0PWVbMF07aWYoZS5sZW5ndGg9PT0xKXJldHVybiB0O2NvbnN0IG49KCk9Pntjb25zdCByPWUubWFwKG89Pih7dXNlU2NvcGU6bygpLHNjb3BlTmFtZTpvLnNjb3BlTmFtZX0pKTtyZXR1cm4gZnVuY3Rpb24oaSl7Y29uc3QgbD1yLnJlZHVjZSgocyx7dXNlU2NvcGU6YSxzY29wZU5hbWU6dX0pPT57Y29uc3QgZD1hKGkpW2BfX3Njb3BlJHt1fWBdO3JldHVybnsuLi5zLC4uLmR9fSx7fSk7cmV0dXJuIHAudXNlTWVtbygoKT0+KHtbYF9fc2NvcGUke3Quc2NvcGVOYW1lfWBdOmx9KSxbbF0pfX07cmV0dXJuIG4uc2NvcGVOYW1lPXQuc2NvcGVOYW1lLG59ZnVuY3Rpb24gVnQoZSl7Y29uc3QgdD1wLnVzZVJlZihlKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pnt0LmN1cnJlbnQ9ZX0pLHAudXNlTWVtbygoKT0+KC4uLm4pPT57dmFyIHI7cmV0dXJuKHI9dC5jdXJyZW50KT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIuY2FsbCh0LC4uLm4pfSxbXSl9Y29uc3QgZU49cC5jcmVhdGVDb250ZXh0KHZvaWQgMCk7ZnVuY3Rpb24gVGcoZSl7Y29uc3QgdD1wLnVzZUNvbnRleHQoZU4pO3JldHVybiBlfHx0fHwibHRyIn1mdW5jdGlvbiBBaChlLFt0LG5dKXtyZXR1cm4gTWF0aC5taW4obixNYXRoLm1heCh0LGUpKX1mdW5jdGlvbiBIZShlLHQse2NoZWNrRm9yRGVmYXVsdFByZXZlbnRlZDpuPSEwfT17fSl7cmV0dXJuIGZ1bmN0aW9uKG8pe2lmKGU9PW51bGx8fGUobyksbj09PSExfHwhby5kZWZhdWx0UHJldmVudGVkKXJldHVybiB0PT1udWxsP3ZvaWQgMDp0KG8pfX1mdW5jdGlvbiB0TihlLHQpe3JldHVybiBwLnVzZVJlZHVjZXIoKG4scik9Pntjb25zdCBvPXRbbl1bcl07cmV0dXJuIG8/P259LGUpfWNvbnN0IGhfPSJTY3JvbGxBcmVhIixbcF8scDRdPUNpKGhfKSxbbk4sQm5dPXBfKGhfKSxyTj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2Nyb2xsQXJlYTpuLHR5cGU6cj0iaG92ZXIiLGRpcjpvLHNjcm9sbEhpZGVEZWxheTppPTYwMCwuLi5sfT1lLFtzLGFdPXAudXNlU3RhdGUobnVsbCksW3UsY109cC51c2VTdGF0ZShudWxsKSxbZCxmXT1wLnVzZVN0YXRlKG51bGwpLFtoLGddPXAudXNlU3RhdGUobnVsbCksW20sU109cC51c2VTdGF0ZShudWxsKSxbdix5XT1wLnVzZVN0YXRlKDApLFt4LF9dPXAudXNlU3RhdGUoMCksW0UsJF09cC51c2VTdGF0ZSghMSksW0MsVF09cC51c2VTdGF0ZSghMSksTT1YZSh0LGo9PmEoaikpLFI9VGcobyk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChuTix7c2NvcGU6bix0eXBlOnIsZGlyOlIsc2Nyb2xsSGlkZURlbGF5Omksc2Nyb2xsQXJlYTpzLHZpZXdwb3J0OnUsb25WaWV3cG9ydENoYW5nZTpjLGNvbnRlbnQ6ZCxvbkNvbnRlbnRDaGFuZ2U6ZixzY3JvbGxiYXJYOmgsb25TY3JvbGxiYXJYQ2hhbmdlOmcsc2Nyb2xsYmFyWEVuYWJsZWQ6RSxvblNjcm9sbGJhclhFbmFibGVkQ2hhbmdlOiQsc2Nyb2xsYmFyWTptLG9uU2Nyb2xsYmFyWUNoYW5nZTpTLHNjcm9sbGJhcllFbmFibGVkOkMsb25TY3JvbGxiYXJZRW5hYmxlZENoYW5nZTpULG9uQ29ybmVyV2lkdGhDaGFuZ2U6eSxvbkNvcm5lckhlaWdodENoYW5nZTpffSxwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHtkaXI6Un0sbCx7cmVmOk0sc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsIi0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLXdpZHRoIjp2KyJweCIsIi0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLWhlaWdodCI6eCsicHgiLC4uLmUuc3R5bGV9fSkpKX0pLG9OPSJTY3JvbGxBcmVhVmlld3BvcnQiLGlOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sY2hpbGRyZW46ciwuLi5vfT1lLGk9Qm4ob04sbiksbD1wLnVzZVJlZihudWxsKSxzPVhlKHQsbCxpLm9uVmlld3BvcnRDaGFuZ2UpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLHAuY3JlYXRlRWxlbWVudCgic3R5bGUiLHtkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOiJbZGF0YS1yYWRpeC1zY3JvbGwtYXJlYS12aWV3cG9ydF17c2Nyb2xsYmFyLXdpZHRoOm5vbmU7LW1zLW92ZXJmbG93LXN0eWxlOm5vbmU7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7fVtkYXRhLXJhZGl4LXNjcm9sbC1hcmVhLXZpZXdwb3J0XTo6LXdlYmtpdC1zY3JvbGxiYXJ7ZGlzcGxheTpub25lfSJ9fSkscC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7ImRhdGEtcmFkaXgtc2Nyb2xsLWFyZWEtdmlld3BvcnQiOiIifSxvLHtyZWY6cyxzdHlsZTp7b3ZlcmZsb3dYOmkuc2Nyb2xsYmFyWEVuYWJsZWQ/InNjcm9sbCI6ImhpZGRlbiIsb3ZlcmZsb3dZOmkuc2Nyb2xsYmFyWUVuYWJsZWQ/InNjcm9sbCI6ImhpZGRlbiIsLi4uZS5zdHlsZX19KSxwLmNyZWF0ZUVsZW1lbnQoImRpdiIse3JlZjppLm9uQ29udGVudENoYW5nZSxzdHlsZTp7bWluV2lkdGg6IjEwMCUiLGRpc3BsYXk6InRhYmxlIn19LHIpKSl9KSxLcj0iU2Nyb2xsQXJlYVNjcm9sbGJhciIsZ189cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PWUsbz1CbihLcixlLl9fc2NvcGVTY3JvbGxBcmVhKSx7b25TY3JvbGxiYXJYRW5hYmxlZENoYW5nZTppLG9uU2Nyb2xsYmFyWUVuYWJsZWRDaGFuZ2U6bH09byxzPWUub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4ocz9pKCEwKTpsKCEwKSwoKT0+e3M/aSghMSk6bCghMSl9KSxbcyxpLGxdKSxvLnR5cGU9PT0iaG92ZXIiP3AuY3JlYXRlRWxlbWVudChsTixlZSh7fSxyLHtyZWY6dCxmb3JjZU1vdW50Om59KSk6by50eXBlPT09InNjcm9sbCI/cC5jcmVhdGVFbGVtZW50KHNOLGVlKHt9LHIse3JlZjp0LGZvcmNlTW91bnQ6bn0pKTpvLnR5cGU9PT0iYXV0byI/cC5jcmVhdGVFbGVtZW50KG1fLGVlKHt9LHIse3JlZjp0LGZvcmNlTW91bnQ6bn0pKTpvLnR5cGU9PT0iYWx3YXlzIj9wLmNyZWF0ZUVsZW1lbnQoTmcsZWUoe30scix7cmVmOnR9KSk6bnVsbH0pLGxOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e2ZvcmNlTW91bnQ6biwuLi5yfT1lLG89Qm4oS3IsZS5fX3Njb3BlU2Nyb2xsQXJlYSksW2ksbF09cC51c2VTdGF0ZSghMSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3Qgcz1vLnNjcm9sbEFyZWE7bGV0IGE9MDtpZihzKXtjb25zdCB1PSgpPT57d2luZG93LmNsZWFyVGltZW91dChhKSxsKCEwKX0sYz0oKT0+e2E9d2luZG93LnNldFRpbWVvdXQoKCk9PmwoITEpLG8uc2Nyb2xsSGlkZURlbGF5KX07cmV0dXJuIHMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmVudGVyIix1KSxzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJsZWF2ZSIsYyksKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGEpLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmVudGVyIix1KSxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJsZWF2ZSIsYyl9fX0sW28uc2Nyb2xsQXJlYSxvLnNjcm9sbEhpZGVEZWxheV0pLHAuY3JlYXRlRWxlbWVudChEbCx7cHJlc2VudDpufHxpfSxwLmNyZWF0ZUVsZW1lbnQobV8sZWUoeyJkYXRhLXN0YXRlIjppPyJ2aXNpYmxlIjoiaGlkZGVuIn0scix7cmVmOnR9KSkpfSksc049cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PWUsbz1CbihLcixlLl9fc2NvcGVTY3JvbGxBcmVhKSxpPWUub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCIsbD1pZCgoKT0+YSgiU0NST0xMX0VORCIpLDEwMCksW3MsYV09dE4oImhpZGRlbiIse2hpZGRlbjp7U0NST0xMOiJzY3JvbGxpbmcifSxzY3JvbGxpbmc6e1NDUk9MTF9FTkQ6ImlkbGUiLFBPSU5URVJfRU5URVI6ImludGVyYWN0aW5nIn0saW50ZXJhY3Rpbmc6e1NDUk9MTDoiaW50ZXJhY3RpbmciLFBPSU5URVJfTEVBVkU6ImlkbGUifSxpZGxlOntISURFOiJoaWRkZW4iLFNDUk9MTDoic2Nyb2xsaW5nIixQT0lOVEVSX0VOVEVSOiJpbnRlcmFjdGluZyJ9fSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57aWYocz09PSJpZGxlIil7Y29uc3QgdT13aW5kb3cuc2V0VGltZW91dCgoKT0+YSgiSElERSIpLG8uc2Nyb2xsSGlkZURlbGF5KTtyZXR1cm4oKT0+d2luZG93LmNsZWFyVGltZW91dCh1KX19LFtzLG8uc2Nyb2xsSGlkZURlbGF5LGFdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHU9by52aWV3cG9ydCxjPWk/InNjcm9sbExlZnQiOiJzY3JvbGxUb3AiO2lmKHUpe2xldCBkPXVbY107Y29uc3QgZj0oKT0+e2NvbnN0IGg9dVtjXTtkIT09aCYmKGEoIlNDUk9MTCIpLGwoKSksZD1ofTtyZXR1cm4gdS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGYpLCgpPT51LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZil9fSxbby52aWV3cG9ydCxpLGEsbF0pLHAuY3JlYXRlRWxlbWVudChEbCx7cHJlc2VudDpufHxzIT09ImhpZGRlbiJ9LHAuY3JlYXRlRWxlbWVudChOZyxlZSh7ImRhdGEtc3RhdGUiOnM9PT0iaGlkZGVuIj8iaGlkZGVuIjoidmlzaWJsZSJ9LHIse3JlZjp0LG9uUG9pbnRlckVudGVyOkhlKGUub25Qb2ludGVyRW50ZXIsKCk9PmEoIlBPSU5URVJfRU5URVIiKSksb25Qb2ludGVyTGVhdmU6SGUoZS5vblBvaW50ZXJMZWF2ZSwoKT0+YSgiUE9JTlRFUl9MRUFWRSIpKX0pKSl9KSxtXz1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdCBuPUJuKEtyLGUuX19zY29wZVNjcm9sbEFyZWEpLHtmb3JjZU1vdW50OnIsLi4ub309ZSxbaSxsXT1wLnVzZVN0YXRlKCExKSxzPWUub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCIsYT1pZCgoKT0+e2lmKG4udmlld3BvcnQpe2NvbnN0IHU9bi52aWV3cG9ydC5vZmZzZXRXaWR0aDxuLnZpZXdwb3J0LnNjcm9sbFdpZHRoLGM9bi52aWV3cG9ydC5vZmZzZXRIZWlnaHQ8bi52aWV3cG9ydC5zY3JvbGxIZWlnaHQ7bChzP3U6Yyl9fSwxMCk7cmV0dXJuIENsKG4udmlld3BvcnQsYSksQ2wobi5jb250ZW50LGEpLHAuY3JlYXRlRWxlbWVudChEbCx7cHJlc2VudDpyfHxpfSxwLmNyZWF0ZUVsZW1lbnQoTmcsZWUoeyJkYXRhLXN0YXRlIjppPyJ2aXNpYmxlIjoiaGlkZGVuIn0sbyx7cmVmOnR9KSkpfSksTmc9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7b3JpZW50YXRpb246bj0idmVydGljYWwiLC4uLnJ9PWUsbz1CbihLcixlLl9fc2NvcGVTY3JvbGxBcmVhKSxpPXAudXNlUmVmKG51bGwpLGw9cC51c2VSZWYoMCksW3MsYV09cC51c2VTdGF0ZSh7Y29udGVudDowLHZpZXdwb3J0OjAsc2Nyb2xsYmFyOntzaXplOjAscGFkZGluZ1N0YXJ0OjAscGFkZGluZ0VuZDowfX0pLHU9X18ocy52aWV3cG9ydCxzLmNvbnRlbnQpLGM9ey4uLnIsc2l6ZXM6cyxvblNpemVzQ2hhbmdlOmEsaGFzVGh1bWI6dT4wJiZ1PDEsb25UaHVtYkNoYW5nZTpmPT5pLmN1cnJlbnQ9ZixvblRodW1iUG9pbnRlclVwOigpPT5sLmN1cnJlbnQ9MCxvblRodW1iUG9pbnRlckRvd246Zj0+bC5jdXJyZW50PWZ9O2Z1bmN0aW9uIGQoZixoKXtyZXR1cm4gZ04oZixsLmN1cnJlbnQscyxoKX1yZXR1cm4gbj09PSJob3Jpem9udGFsIj9wLmNyZWF0ZUVsZW1lbnQoYU4sZWUoe30sYyx7cmVmOnQsb25UaHVtYlBvc2l0aW9uQ2hhbmdlOigpPT57aWYoby52aWV3cG9ydCYmaS5jdXJyZW50KXtjb25zdCBmPW8udmlld3BvcnQuc2Nyb2xsTGVmdCxoPXF2KGYscyxvLmRpcik7aS5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybT1gdHJhbnNsYXRlM2QoJHtofXB4LCAwLCAwKWB9fSxvbldoZWVsU2Nyb2xsOmY9PntvLnZpZXdwb3J0JiYoby52aWV3cG9ydC5zY3JvbGxMZWZ0PWYpfSxvbkRyYWdTY3JvbGw6Zj0+e28udmlld3BvcnQmJihvLnZpZXdwb3J0LnNjcm9sbExlZnQ9ZChmLG8uZGlyKSl9fSkpOm49PT0idmVydGljYWwiP3AuY3JlYXRlRWxlbWVudCh1TixlZSh7fSxjLHtyZWY6dCxvblRodW1iUG9zaXRpb25DaGFuZ2U6KCk9PntpZihvLnZpZXdwb3J0JiZpLmN1cnJlbnQpe2NvbnN0IGY9by52aWV3cG9ydC5zY3JvbGxUb3AsaD1xdihmLHMpO2kuY3VycmVudC5zdHlsZS50cmFuc2Zvcm09YHRyYW5zbGF0ZTNkKDAsICR7aH1weCwgMClgfX0sb25XaGVlbFNjcm9sbDpmPT57by52aWV3cG9ydCYmKG8udmlld3BvcnQuc2Nyb2xsVG9wPWYpfSxvbkRyYWdTY3JvbGw6Zj0+e28udmlld3BvcnQmJihvLnZpZXdwb3J0LnNjcm9sbFRvcD1kKGYpKX19KSk6bnVsbH0pLGFOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e3NpemVzOm4sb25TaXplc0NoYW5nZTpyLC4uLm99PWUsaT1CbihLcixlLl9fc2NvcGVTY3JvbGxBcmVhKSxbbCxzXT1wLnVzZVN0YXRlKCksYT1wLnVzZVJlZihudWxsKSx1PVhlKHQsYSxpLm9uU2Nyb2xsYmFyWENoYW5nZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57YS5jdXJyZW50JiZzKGdldENvbXB1dGVkU3R5bGUoYS5jdXJyZW50KSl9LFthXSkscC5jcmVhdGVFbGVtZW50KHlfLGVlKHsiZGF0YS1vcmllbnRhdGlvbiI6Imhvcml6b250YWwifSxvLHtyZWY6dSxzaXplczpuLHN0eWxlOntib3R0b206MCxsZWZ0OmkuZGlyPT09InJ0bCI/InZhcigtLXJhZGl4LXNjcm9sbC1hcmVhLWNvcm5lci13aWR0aCkiOjAscmlnaHQ6aS5kaXI9PT0ibHRyIj8idmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLXdpZHRoKSI6MCwiLS1yYWRpeC1zY3JvbGwtYXJlYS10aHVtYi13aWR0aCI6b2QobikrInB4IiwuLi5lLnN0eWxlfSxvblRodW1iUG9pbnRlckRvd246Yz0+ZS5vblRodW1iUG9pbnRlckRvd24oYy54KSxvbkRyYWdTY3JvbGw6Yz0+ZS5vbkRyYWdTY3JvbGwoYy54KSxvbldoZWVsU2Nyb2xsOihjLGQpPT57aWYoaS52aWV3cG9ydCl7Y29uc3QgZj1pLnZpZXdwb3J0LnNjcm9sbExlZnQrYy5kZWx0YVg7ZS5vbldoZWVsU2Nyb2xsKGYpLFNfKGYsZCkmJmMucHJldmVudERlZmF1bHQoKX19LG9uUmVzaXplOigpPT57YS5jdXJyZW50JiZpLnZpZXdwb3J0JiZsJiZyKHtjb250ZW50Omkudmlld3BvcnQuc2Nyb2xsV2lkdGgsdmlld3BvcnQ6aS52aWV3cG9ydC5vZmZzZXRXaWR0aCxzY3JvbGxiYXI6e3NpemU6YS5jdXJyZW50LmNsaWVudFdpZHRoLHBhZGRpbmdTdGFydDpoYyhsLnBhZGRpbmdMZWZ0KSxwYWRkaW5nRW5kOmhjKGwucGFkZGluZ1JpZ2h0KX19KX19KSl9KSx1Tj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtzaXplczpuLG9uU2l6ZXNDaGFuZ2U6ciwuLi5vfT1lLGk9Qm4oS3IsZS5fX3Njb3BlU2Nyb2xsQXJlYSksW2wsc109cC51c2VTdGF0ZSgpLGE9cC51c2VSZWYobnVsbCksdT1YZSh0LGEsaS5vblNjcm9sbGJhcllDaGFuZ2UpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2EuY3VycmVudCYmcyhnZXRDb21wdXRlZFN0eWxlKGEuY3VycmVudCkpfSxbYV0pLHAuY3JlYXRlRWxlbWVudCh5XyxlZSh7ImRhdGEtb3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCJ9LG8se3JlZjp1LHNpemVzOm4sc3R5bGU6e3RvcDowLHJpZ2h0OmkuZGlyPT09Imx0ciI/MDp2b2lkIDAsbGVmdDppLmRpcj09PSJydGwiPzA6dm9pZCAwLGJvdHRvbToidmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLWhlaWdodCkiLCItLXJhZGl4LXNjcm9sbC1hcmVhLXRodW1iLWhlaWdodCI6b2QobikrInB4IiwuLi5lLnN0eWxlfSxvblRodW1iUG9pbnRlckRvd246Yz0+ZS5vblRodW1iUG9pbnRlckRvd24oYy55KSxvbkRyYWdTY3JvbGw6Yz0+ZS5vbkRyYWdTY3JvbGwoYy55KSxvbldoZWVsU2Nyb2xsOihjLGQpPT57aWYoaS52aWV3cG9ydCl7Y29uc3QgZj1pLnZpZXdwb3J0LnNjcm9sbFRvcCtjLmRlbHRhWTtlLm9uV2hlZWxTY3JvbGwoZiksU18oZixkKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sb25SZXNpemU6KCk9PnthLmN1cnJlbnQmJmkudmlld3BvcnQmJmwmJnIoe2NvbnRlbnQ6aS52aWV3cG9ydC5zY3JvbGxIZWlnaHQsdmlld3BvcnQ6aS52aWV3cG9ydC5vZmZzZXRIZWlnaHQsc2Nyb2xsYmFyOntzaXplOmEuY3VycmVudC5jbGllbnRIZWlnaHQscGFkZGluZ1N0YXJ0OmhjKGwucGFkZGluZ1RvcCkscGFkZGluZ0VuZDpoYyhsLnBhZGRpbmdCb3R0b20pfX0pfX0pKX0pLFtjTix2X109cF8oS3IpLHlfPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sc2l6ZXM6cixoYXNUaHVtYjpvLG9uVGh1bWJDaGFuZ2U6aSxvblRodW1iUG9pbnRlclVwOmwsb25UaHVtYlBvaW50ZXJEb3duOnMsb25UaHVtYlBvc2l0aW9uQ2hhbmdlOmEsb25EcmFnU2Nyb2xsOnUsb25XaGVlbFNjcm9sbDpjLG9uUmVzaXplOmQsLi4uZn09ZSxoPUJuKEtyLG4pLFtnLG1dPXAudXNlU3RhdGUobnVsbCksUz1YZSh0LE09Pm0oTSkpLHY9cC51c2VSZWYobnVsbCkseT1wLnVzZVJlZigiIikseD1oLnZpZXdwb3J0LF89ci5jb250ZW50LXIudmlld3BvcnQsRT1WdChjKSwkPVZ0KGEpLEM9aWQoZCwxMCk7ZnVuY3Rpb24gVChNKXtpZih2LmN1cnJlbnQpe2NvbnN0IFI9TS5jbGllbnRYLXYuY3VycmVudC5sZWZ0LGo9TS5jbGllbnRZLXYuY3VycmVudC50b3A7dSh7eDpSLHk6an0pfX1yZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBNPVI9Pntjb25zdCBqPVIudGFyZ2V0OyhnPT1udWxsP3ZvaWQgMDpnLmNvbnRhaW5zKGopKSYmRShSLF8pfTtyZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLE0se3Bhc3NpdmU6ITF9KSwoKT0+ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLE0se3Bhc3NpdmU6ITF9KX0sW3gsZyxfLEVdKSxwLnVzZUVmZmVjdCgkLFtyLCRdKSxDbChnLEMpLENsKGguY29udGVudCxDKSxwLmNyZWF0ZUVsZW1lbnQoY04se3Njb3BlOm4sc2Nyb2xsYmFyOmcsaGFzVGh1bWI6byxvblRodW1iQ2hhbmdlOlZ0KGkpLG9uVGh1bWJQb2ludGVyVXA6VnQobCksb25UaHVtYlBvc2l0aW9uQ2hhbmdlOiQsb25UaHVtYlBvaW50ZXJEb3duOlZ0KHMpfSxwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHt9LGYse3JlZjpTLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLC4uLmYuc3R5bGV9LG9uUG9pbnRlckRvd246SGUoZS5vblBvaW50ZXJEb3duLE09PntNLmJ1dHRvbj09PTAmJihNLnRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShNLnBvaW50ZXJJZCksdi5jdXJyZW50PWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseS5jdXJyZW50PWRvY3VtZW50LmJvZHkuc3R5bGUud2Via2l0VXNlclNlbGVjdCxkb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLGgudmlld3BvcnQmJihoLnZpZXdwb3J0LnN0eWxlLnNjcm9sbEJlaGF2aW9yPSJhdXRvIiksVChNKSl9KSxvblBvaW50ZXJNb3ZlOkhlKGUub25Qb2ludGVyTW92ZSxUKSxvblBvaW50ZXJVcDpIZShlLm9uUG9pbnRlclVwLE09Pntjb25zdCBSPU0udGFyZ2V0O1IuaGFzUG9pbnRlckNhcHR1cmUoTS5wb2ludGVySWQpJiZSLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShNLnBvaW50ZXJJZCksZG9jdW1lbnQuYm9keS5zdHlsZS53ZWJraXRVc2VyU2VsZWN0PXkuY3VycmVudCxoLnZpZXdwb3J0JiYoaC52aWV3cG9ydC5zdHlsZS5zY3JvbGxCZWhhdmlvcj0iIiksdi5jdXJyZW50PW51bGx9KX0pKSl9KSxNaD0iU2Nyb2xsQXJlYVRodW1iIixkTj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09ZSxvPXZfKE1oLGUuX19zY29wZVNjcm9sbEFyZWEpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoRGwse3ByZXNlbnQ6bnx8by5oYXNUaHVtYn0scC5jcmVhdGVFbGVtZW50KGZOLGVlKHtyZWY6dH0scikpKX0pLGZOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sc3R5bGU6ciwuLi5vfT1lLGk9Qm4oTWgsbiksbD12XyhNaCxuKSx7b25UaHVtYlBvc2l0aW9uQ2hhbmdlOnN9PWwsYT1YZSh0LGQ9Pmwub25UaHVtYkNoYW5nZShkKSksdT1wLnVzZVJlZigpLGM9aWQoKCk9Pnt1LmN1cnJlbnQmJih1LmN1cnJlbnQoKSx1LmN1cnJlbnQ9dm9pZCAwKX0sMTAwKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBkPWkudmlld3BvcnQ7aWYoZCl7Y29uc3QgZj0oKT0+e2lmKGMoKSwhdS5jdXJyZW50KXtjb25zdCBoPW1OKGQscyk7dS5jdXJyZW50PWgscygpfX07cmV0dXJuIHMoKSxkLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZiksKCk9PmQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmKX19LFtpLnZpZXdwb3J0LGMsc10pLHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoeyJkYXRhLXN0YXRlIjpsLmhhc1RodW1iPyJ2aXNpYmxlIjoiaGlkZGVuIn0sbyx7cmVmOmEsc3R5bGU6e3dpZHRoOiJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS10aHVtYi13aWR0aCkiLGhlaWdodDoidmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtdGh1bWItaGVpZ2h0KSIsLi4ucn0sb25Qb2ludGVyRG93bkNhcHR1cmU6SGUoZS5vblBvaW50ZXJEb3duQ2FwdHVyZSxkPT57Y29uc3QgaD1kLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxnPWQuY2xpZW50WC1oLmxlZnQsbT1kLmNsaWVudFktaC50b3A7bC5vblRodW1iUG9pbnRlckRvd24oe3g6Zyx5Om19KX0pLG9uUG9pbnRlclVwOkhlKGUub25Qb2ludGVyVXAsbC5vblRodW1iUG9pbnRlclVwKX0pKX0pLHhfPSJTY3JvbGxBcmVhQ29ybmVyIixoTj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdCBuPUJuKHhfLGUuX19zY29wZVNjcm9sbEFyZWEpLHI9ISEobi5zY3JvbGxiYXJYJiZuLnNjcm9sbGJhclkpO3JldHVybiBuLnR5cGUhPT0ic2Nyb2xsIiYmcj9wLmNyZWF0ZUVsZW1lbnQocE4sZWUoe30sZSx7cmVmOnR9KSk6bnVsbH0pLHBOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sLi4ucn09ZSxvPUJuKHhfLG4pLFtpLGxdPXAudXNlU3RhdGUoMCksW3MsYV09cC51c2VTdGF0ZSgwKSx1PSEhKGkmJnMpO3JldHVybiBDbChvLnNjcm9sbGJhclgsKCk9Pnt2YXIgYztjb25zdCBkPSgoYz1vLnNjcm9sbGJhclgpPT09bnVsbHx8Yz09PXZvaWQgMD92b2lkIDA6Yy5vZmZzZXRIZWlnaHQpfHwwO28ub25Db3JuZXJIZWlnaHRDaGFuZ2UoZCksYShkKX0pLENsKG8uc2Nyb2xsYmFyWSwoKT0+e3ZhciBjO2NvbnN0IGQ9KChjPW8uc2Nyb2xsYmFyWSk9PT1udWxsfHxjPT09dm9pZCAwP3ZvaWQgMDpjLm9mZnNldFdpZHRoKXx8MDtvLm9uQ29ybmVyV2lkdGhDaGFuZ2UoZCksbChkKX0pLHU/cC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7fSxyLHtyZWY6dCxzdHlsZTp7d2lkdGg6aSxoZWlnaHQ6cyxwb3NpdGlvbjoiYWJzb2x1dGUiLHJpZ2h0Om8uZGlyPT09Imx0ciI/MDp2b2lkIDAsbGVmdDpvLmRpcj09PSJydGwiPzA6dm9pZCAwLGJvdHRvbTowLC4uLmUuc3R5bGV9fSkpOm51bGx9KTtmdW5jdGlvbiBoYyhlKXtyZXR1cm4gZT9wYXJzZUludChlLDEwKTowfWZ1bmN0aW9uIF9fKGUsdCl7Y29uc3Qgbj1lL3Q7cmV0dXJuIGlzTmFOKG4pPzA6bn1mdW5jdGlvbiBvZChlKXtjb25zdCB0PV9fKGUudmlld3BvcnQsZS5jb250ZW50KSxuPWUuc2Nyb2xsYmFyLnBhZGRpbmdTdGFydCtlLnNjcm9sbGJhci5wYWRkaW5nRW5kLHI9KGUuc2Nyb2xsYmFyLnNpemUtbikqdDtyZXR1cm4gTWF0aC5tYXgociwxOCl9ZnVuY3Rpb24gZ04oZSx0LG4scj0ibHRyIil7Y29uc3Qgbz1vZChuKSxpPW8vMixsPXR8fGkscz1vLWwsYT1uLnNjcm9sbGJhci5wYWRkaW5nU3RhcnQrbCx1PW4uc2Nyb2xsYmFyLnNpemUtbi5zY3JvbGxiYXIucGFkZGluZ0VuZC1zLGM9bi5jb250ZW50LW4udmlld3BvcnQsZD1yPT09Imx0ciI/WzAsY106W2MqLTEsMF07cmV0dXJuIHdfKFthLHVdLGQpKGUpfWZ1bmN0aW9uIHF2KGUsdCxuPSJsdHIiKXtjb25zdCByPW9kKHQpLG89dC5zY3JvbGxiYXIucGFkZGluZ1N0YXJ0K3Quc2Nyb2xsYmFyLnBhZGRpbmdFbmQsaT10LnNjcm9sbGJhci5zaXplLW8sbD10LmNvbnRlbnQtdC52aWV3cG9ydCxzPWktcixhPW49PT0ibHRyIj9bMCxsXTpbbCotMSwwXSx1PUFoKGUsYSk7cmV0dXJuIHdfKFswLGxdLFswLHNdKSh1KX1mdW5jdGlvbiB3XyhlLHQpe3JldHVybiBuPT57aWYoZVswXT09PWVbMV18fHRbMF09PT10WzFdKXJldHVybiB0WzBdO2NvbnN0IHI9KHRbMV0tdFswXSkvKGVbMV0tZVswXSk7cmV0dXJuIHRbMF0rcioobi1lWzBdKX19ZnVuY3Rpb24gU18oZSx0KXtyZXR1cm4gZT4wJiZlPHR9Y29uc3QgbU49KGUsdD0oKT0+e30pPT57bGV0IG49e2xlZnQ6ZS5zY3JvbGxMZWZ0LHRvcDplLnNjcm9sbFRvcH0scj0wO3JldHVybiBmdW5jdGlvbiBvKCl7Y29uc3QgaT17bGVmdDplLnNjcm9sbExlZnQsdG9wOmUuc2Nyb2xsVG9wfSxsPW4ubGVmdCE9PWkubGVmdCxzPW4udG9wIT09aS50b3A7KGx8fHMpJiZ0KCksbj1pLHI9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShvKX0oKSwoKT0+d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHIpfTtmdW5jdGlvbiBpZChlLHQpe2NvbnN0IG49VnQoZSkscj1wLnVzZVJlZigwKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PigpPT53aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksW10pLHAudXNlQ2FsbGJhY2soKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksci5jdXJyZW50PXdpbmRvdy5zZXRUaW1lb3V0KG4sdCl9LFtuLHRdKX1mdW5jdGlvbiBDbChlLHQpe2NvbnN0IG49VnQodCk7JG4oKCk9PntsZXQgcj0wO2lmKGUpe2NvbnN0IG89bmV3IFJlc2l6ZU9ic2VydmVyKCgpPT57Y2FuY2VsQW5pbWF0aW9uRnJhbWUocikscj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKG4pfSk7cmV0dXJuIG8ub2JzZXJ2ZShlKSwoKT0+e3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShyKSxvLnVub2JzZXJ2ZShlKX19fSxbZSxuXSl9Y29uc3QgRV89ck4sdk49aU4seU49aE47ZnVuY3Rpb24gQ18oZSl7dmFyIHQsbixyPSIiO2lmKHR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJudW1iZXIiKXIrPWU7ZWxzZSBpZih0eXBlb2YgZT09Im9iamVjdCIpaWYoQXJyYXkuaXNBcnJheShlKSlmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0mJihuPUNfKGVbdF0pKSYmKHImJihyKz0iICIpLHIrPW4pO2Vsc2UgZm9yKHQgaW4gZSllW3RdJiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9ZnVuY3Rpb24geE4oKXtmb3IodmFyIGUsdCxuPTAscj0iIjtuPGFyZ3VtZW50cy5sZW5ndGg7KShlPWFyZ3VtZW50c1tuKytdKSYmKHQ9Q18oZSkpJiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9Y29uc3QgYmc9Ii0iO2Z1bmN0aW9uIF9OKGUpe2NvbnN0IHQ9U04oZSkse2NvbmZsaWN0aW5nQ2xhc3NHcm91cHM6bixjb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnM6cn09ZTtmdW5jdGlvbiBvKGwpe2NvbnN0IHM9bC5zcGxpdChiZyk7cmV0dXJuIHNbMF09PT0iIiYmcy5sZW5ndGghPT0xJiZzLnNoaWZ0KCksJF8ocyx0KXx8d04obCl9ZnVuY3Rpb24gaShsLHMpe2NvbnN0IGE9bltsXXx8W107cmV0dXJuIHMmJnJbbF0/Wy4uLmEsLi4ucltsXV06YX1yZXR1cm57Z2V0Q2xhc3NHcm91cElkOm8sZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzOml9fWZ1bmN0aW9uICRfKGUsdCl7dmFyIGw7aWYoZS5sZW5ndGg9PT0wKXJldHVybiB0LmNsYXNzR3JvdXBJZDtjb25zdCBuPWVbMF0scj10Lm5leHRQYXJ0LmdldChuKSxvPXI/JF8oZS5zbGljZSgxKSxyKTp2b2lkIDA7aWYobylyZXR1cm4gbztpZih0LnZhbGlkYXRvcnMubGVuZ3RoPT09MClyZXR1cm47Y29uc3QgaT1lLmpvaW4oYmcpO3JldHVybihsPXQudmFsaWRhdG9ycy5maW5kKCh7dmFsaWRhdG9yOnN9KT0+cyhpKSkpPT1udWxsP3ZvaWQgMDpsLmNsYXNzR3JvdXBJZH1jb25zdCBleT0vXlxbKC4rKVxdJC87ZnVuY3Rpb24gd04oZSl7aWYoZXkudGVzdChlKSl7Y29uc3QgdD1leS5leGVjKGUpWzFdLG49dD09bnVsbD92b2lkIDA6dC5zdWJzdHJpbmcoMCx0LmluZGV4T2YoIjoiKSk7aWYobilyZXR1cm4iYXJiaXRyYXJ5Li4iK259fWZ1bmN0aW9uIFNOKGUpe2NvbnN0e3RoZW1lOnQscHJlZml4Om59PWUscj17bmV4dFBhcnQ6bmV3IE1hcCx2YWxpZGF0b3JzOltdfTtyZXR1cm4gQ04oT2JqZWN0LmVudHJpZXMoZS5jbGFzc0dyb3VwcyksbikuZm9yRWFjaCgoW2ksbF0pPT57RGgobCxyLGksdCl9KSxyfWZ1bmN0aW9uIERoKGUsdCxuLHIpe2UuZm9yRWFjaChvPT57aWYodHlwZW9mIG89PSJzdHJpbmciKXtjb25zdCBpPW89PT0iIj90OnR5KHQsbyk7aS5jbGFzc0dyb3VwSWQ9bjtyZXR1cm59aWYodHlwZW9mIG89PSJmdW5jdGlvbiIpe2lmKEVOKG8pKXtEaChvKHIpLHQsbixyKTtyZXR1cm59dC52YWxpZGF0b3JzLnB1c2goe3ZhbGlkYXRvcjpvLGNsYXNzR3JvdXBJZDpufSk7cmV0dXJufU9iamVjdC5lbnRyaWVzKG8pLmZvckVhY2goKFtpLGxdKT0+e0RoKGwsdHkodCxpKSxuLHIpfSl9KX1mdW5jdGlvbiB0eShlLHQpe2xldCBuPWU7cmV0dXJuIHQuc3BsaXQoYmcpLmZvckVhY2gocj0+e24ubmV4dFBhcnQuaGFzKHIpfHxuLm5leHRQYXJ0LnNldChyLHtuZXh0UGFydDpuZXcgTWFwLHZhbGlkYXRvcnM6W119KSxuPW4ubmV4dFBhcnQuZ2V0KHIpfSksbn1mdW5jdGlvbiBFTihlKXtyZXR1cm4gZS5pc1RoZW1lR2V0dGVyfWZ1bmN0aW9uIENOKGUsdCl7cmV0dXJuIHQ/ZS5tYXAoKFtuLHJdKT0+e2NvbnN0IG89ci5tYXAoaT0+dHlwZW9mIGk9PSJzdHJpbmciP3QraTp0eXBlb2YgaT09Im9iamVjdCI/T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGkpLm1hcCgoW2wsc10pPT5bdCtsLHNdKSk6aSk7cmV0dXJuW24sb119KTplfWZ1bmN0aW9uICROKGUpe2lmKGU8MSlyZXR1cm57Z2V0OigpPT57fSxzZXQ6KCk9Pnt9fTtsZXQgdD0wLG49bmV3IE1hcCxyPW5ldyBNYXA7ZnVuY3Rpb24gbyhpLGwpe24uc2V0KGksbCksdCsrLHQ+ZSYmKHQ9MCxyPW4sbj1uZXcgTWFwKX1yZXR1cm57Z2V0KGkpe2xldCBsPW4uZ2V0KGkpO2lmKGwhPT12b2lkIDApcmV0dXJuIGw7aWYoKGw9ci5nZXQoaSkpIT09dm9pZCAwKXJldHVybiBvKGksbCksbH0sc2V0KGksbCl7bi5oYXMoaSk/bi5zZXQoaSxsKTpvKGksbCl9fX1jb25zdCBrXz0iISI7ZnVuY3Rpb24ga04oZSl7Y29uc3QgdD1lLnNlcGFyYXRvcixuPXQubGVuZ3RoPT09MSxyPXRbMF0sbz10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24obCl7Y29uc3Qgcz1bXTtsZXQgYT0wLHU9MCxjO2ZvcihsZXQgbT0wO208bC5sZW5ndGg7bSsrKXtsZXQgUz1sW21dO2lmKGE9PT0wKXtpZihTPT09ciYmKG58fGwuc2xpY2UobSxtK28pPT09dCkpe3MucHVzaChsLnNsaWNlKHUsbSkpLHU9bStvO2NvbnRpbnVlfWlmKFM9PT0iLyIpe2M9bTtjb250aW51ZX19Uz09PSJbIj9hKys6Uz09PSJdIiYmYS0tfWNvbnN0IGQ9cy5sZW5ndGg9PT0wP2w6bC5zdWJzdHJpbmcodSksZj1kLnN0YXJ0c1dpdGgoa18pLGg9Zj9kLnN1YnN0cmluZygxKTpkLGc9YyYmYz51P2MtdTp2b2lkIDA7cmV0dXJue21vZGlmaWVyczpzLGhhc0ltcG9ydGFudE1vZGlmaWVyOmYsYmFzZUNsYXNzTmFtZTpoLG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb246Z319fWZ1bmN0aW9uIFROKGUpe2lmKGUubGVuZ3RoPD0xKXJldHVybiBlO2NvbnN0IHQ9W107bGV0IG49W107cmV0dXJuIGUuZm9yRWFjaChyPT57clswXT09PSJbIj8odC5wdXNoKC4uLm4uc29ydCgpLHIpLG49W10pOm4ucHVzaChyKX0pLHQucHVzaCguLi5uLnNvcnQoKSksdH1mdW5jdGlvbiBOTihlKXtyZXR1cm57Y2FjaGU6JE4oZS5jYWNoZVNpemUpLHNwbGl0TW9kaWZpZXJzOmtOKGUpLC4uLl9OKGUpfX1jb25zdCBiTj0vXHMrLztmdW5jdGlvbiBSTihlLHQpe2NvbnN0e3NwbGl0TW9kaWZpZXJzOm4sZ2V0Q2xhc3NHcm91cElkOnIsZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzOm99PXQsaT1uZXcgU2V0O3JldHVybiBlLnRyaW0oKS5zcGxpdChiTikubWFwKGw9Pntjb25zdHttb2RpZmllcnM6cyxoYXNJbXBvcnRhbnRNb2RpZmllcjphLGJhc2VDbGFzc05hbWU6dSxtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uOmN9PW4obCk7bGV0IGQ9cihjP3Uuc3Vic3RyaW5nKDAsYyk6dSksZj0hIWM7aWYoIWQpe2lmKCFjKXJldHVybntpc1RhaWx3aW5kQ2xhc3M6ITEsb3JpZ2luYWxDbGFzc05hbWU6bH07aWYoZD1yKHUpLCFkKXJldHVybntpc1RhaWx3aW5kQ2xhc3M6ITEsb3JpZ2luYWxDbGFzc05hbWU6bH07Zj0hMX1jb25zdCBoPVROKHMpLmpvaW4oIjoiKTtyZXR1cm57aXNUYWlsd2luZENsYXNzOiEwLG1vZGlmaWVySWQ6YT9oK2tfOmgsY2xhc3NHcm91cElkOmQsb3JpZ2luYWxDbGFzc05hbWU6bCxoYXNQb3N0Zml4TW9kaWZpZXI6Zn19KS5yZXZlcnNlKCkuZmlsdGVyKGw9PntpZighbC5pc1RhaWx3aW5kQ2xhc3MpcmV0dXJuITA7Y29uc3R7bW9kaWZpZXJJZDpzLGNsYXNzR3JvdXBJZDphLGhhc1Bvc3RmaXhNb2RpZmllcjp1fT1sLGM9cythO3JldHVybiBpLmhhcyhjKT8hMTooaS5hZGQoYyksbyhhLHUpLmZvckVhY2goZD0+aS5hZGQocytkKSksITApfSkucmV2ZXJzZSgpLm1hcChsPT5sLm9yaWdpbmFsQ2xhc3NOYW1lKS5qb2luKCIgIil9ZnVuY3Rpb24gUE4oKXtsZXQgZT0wLHQsbixyPSIiO2Zvcig7ZTxhcmd1bWVudHMubGVuZ3RoOykodD1hcmd1bWVudHNbZSsrXSkmJihuPVRfKHQpKSYmKHImJihyKz0iICIpLHIrPW4pO3JldHVybiByfWZ1bmN0aW9uIFRfKGUpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gZTtsZXQgdCxuPSIiO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJih0PVRfKGVbcl0pKSYmKG4mJihuKz0iICIpLG4rPXQpO3JldHVybiBufWZ1bmN0aW9uIE9OKGUsLi4udCl7bGV0IG4scixvLGk9bDtmdW5jdGlvbiBsKGEpe2NvbnN0IHU9dC5yZWR1Y2UoKGMsZCk9PmQoYyksZSgpKTtyZXR1cm4gbj1OTih1KSxyPW4uY2FjaGUuZ2V0LG89bi5jYWNoZS5zZXQsaT1zLHMoYSl9ZnVuY3Rpb24gcyhhKXtjb25zdCB1PXIoYSk7aWYodSlyZXR1cm4gdTtjb25zdCBjPVJOKGEsbik7cmV0dXJuIG8oYSxjKSxjfXJldHVybiBmdW5jdGlvbigpe3JldHVybiBpKFBOLmFwcGx5KG51bGwsYXJndW1lbnRzKSl9fWZ1bmN0aW9uIFdlKGUpe2NvbnN0IHQ9bj0+bltlXXx8W107cmV0dXJuIHQuaXNUaGVtZUdldHRlcj0hMCx0fWNvbnN0IE5fPS9eXFsoPzooW2Etei1dKyk6KT8oLispXF0kL2ksQU49L15cZCtcL1xkKyQvLE1OPW5ldyBTZXQoWyJweCIsImZ1bGwiLCJzY3JlZW4iXSksRE49L14oXGQrKFwuXGQrKT8pPyh4c3xzbXxtZHxsZ3x4bCkkLyxMTj0vXGQrKCV8cHh8cj9lbXxbc2RsXT92KFtod2liXXxtaW58bWF4KXxwdHxwY3xpbnxjbXxtbXxjYXB8Y2h8ZXh8cj9saHxjcSh3fGh8aXxifG1pbnxtYXgpKXxcYihjYWxjfG1pbnxtYXh8Y2xhbXApXCguK1wpfF4wJC8sSU49L14tPygoXGQrKT9cLj8oXGQrKVthLXpdK3wwKV8tPygoXGQrKT9cLj8oXGQrKVthLXpdK3wwKS8sak49L14odXJsfGltYWdlfGltYWdlLXNldHxjcm9zcy1mYWRlfGVsZW1lbnR8KHJlcGVhdGluZy0pPyhsaW5lYXJ8cmFkaWFsfGNvbmljKS1ncmFkaWVudClcKC4rXCkkLztmdW5jdGlvbiBWbihlKXtyZXR1cm4gcW8oZSl8fE1OLmhhcyhlKXx8QU4udGVzdChlKX1mdW5jdGlvbiB0byhlKXtyZXR1cm4gTGwoZSwibGVuZ3RoIixLTil9ZnVuY3Rpb24gcW8oZSl7cmV0dXJuISFlJiYhTnVtYmVyLmlzTmFOKE51bWJlcihlKSl9ZnVuY3Rpb24gY3UoZSl7cmV0dXJuIExsKGUsIm51bWJlciIscW8pfWZ1bmN0aW9uIHNzKGUpe3JldHVybiEhZSYmTnVtYmVyLmlzSW50ZWdlcihOdW1iZXIoZSkpfWZ1bmN0aW9uIHpOKGUpe3JldHVybiBlLmVuZHNXaXRoKCIlIikmJnFvKGUuc2xpY2UoMCwtMSkpfWZ1bmN0aW9uIHZlKGUpe3JldHVybiBOXy50ZXN0KGUpfWZ1bmN0aW9uIG5vKGUpe3JldHVybiBETi50ZXN0KGUpfWNvbnN0IEZOPW5ldyBTZXQoWyJsZW5ndGgiLCJzaXplIiwicGVyY2VudGFnZSJdKTtmdW5jdGlvbiBCTihlKXtyZXR1cm4gTGwoZSxGTixiXyl9ZnVuY3Rpb24gV04oZSl7cmV0dXJuIExsKGUsInBvc2l0aW9uIixiXyl9Y29uc3QgVU49bmV3IFNldChbImltYWdlIiwidXJsIl0pO2Z1bmN0aW9uIFZOKGUpe3JldHVybiBMbChlLFVOLFlOKX1mdW5jdGlvbiBITihlKXtyZXR1cm4gTGwoZSwiIixHTil9ZnVuY3Rpb24gYXMoKXtyZXR1cm4hMH1mdW5jdGlvbiBMbChlLHQsbil7Y29uc3Qgcj1OXy5leGVjKGUpO3JldHVybiByP3JbMV0/dHlwZW9mIHQ9PSJzdHJpbmciP3JbMV09PT10OnQuaGFzKHJbMV0pOm4oclsyXSk6ITF9ZnVuY3Rpb24gS04oZSl7cmV0dXJuIExOLnRlc3QoZSl9ZnVuY3Rpb24gYl8oKXtyZXR1cm4hMX1mdW5jdGlvbiBHTihlKXtyZXR1cm4gSU4udGVzdChlKX1mdW5jdGlvbiBZTihlKXtyZXR1cm4gak4udGVzdChlKX1mdW5jdGlvbiBYTigpe2NvbnN0IGU9V2UoImNvbG9ycyIpLHQ9V2UoInNwYWNpbmciKSxuPVdlKCJibHVyIikscj1XZSgiYnJpZ2h0bmVzcyIpLG89V2UoImJvcmRlckNvbG9yIiksaT1XZSgiYm9yZGVyUmFkaXVzIiksbD1XZSgiYm9yZGVyU3BhY2luZyIpLHM9V2UoImJvcmRlcldpZHRoIiksYT1XZSgiY29udHJhc3QiKSx1PVdlKCJncmF5c2NhbGUiKSxjPVdlKCJodWVSb3RhdGUiKSxkPVdlKCJpbnZlcnQiKSxmPVdlKCJnYXAiKSxoPVdlKCJncmFkaWVudENvbG9yU3RvcHMiKSxnPVdlKCJncmFkaWVudENvbG9yU3RvcFBvc2l0aW9ucyIpLG09V2UoImluc2V0IiksUz1XZSgibWFyZ2luIiksdj1XZSgib3BhY2l0eSIpLHk9V2UoInBhZGRpbmciKSx4PVdlKCJzYXR1cmF0ZSIpLF89V2UoInNjYWxlIiksRT1XZSgic2VwaWEiKSwkPVdlKCJza2V3IiksQz1XZSgic3BhY2UiKSxUPVdlKCJ0cmFuc2xhdGUiKSxNPSgpPT5bImF1dG8iLCJjb250YWluIiwibm9uZSJdLFI9KCk9PlsiYXV0byIsImhpZGRlbiIsImNsaXAiLCJ2aXNpYmxlIiwic2Nyb2xsIl0saj0oKT0+WyJhdXRvIix2ZSx0XSxGPSgpPT5bdmUsdF0sYWU9KCk9PlsiIixWbix0b10sSD0oKT0+WyJhdXRvIixxbyx2ZV0sWD0oKT0+WyJib3R0b20iLCJjZW50ZXIiLCJsZWZ0IiwibGVmdC1ib3R0b20iLCJsZWZ0LXRvcCIsInJpZ2h0IiwicmlnaHQtYm90dG9tIiwicmlnaHQtdG9wIiwidG9wIl0sUD0oKT0+WyJzb2xpZCIsImRhc2hlZCIsImRvdHRlZCIsImRvdWJsZSIsIm5vbmUiXSxPPSgpPT5bIm5vcm1hbCIsIm11bHRpcGx5Iiwic2NyZWVuIiwib3ZlcmxheSIsImRhcmtlbiIsImxpZ2h0ZW4iLCJjb2xvci1kb2RnZSIsImNvbG9yLWJ1cm4iLCJoYXJkLWxpZ2h0Iiwic29mdC1saWdodCIsImRpZmZlcmVuY2UiLCJleGNsdXNpb24iLCJodWUiLCJzYXR1cmF0aW9uIiwiY29sb3IiLCJsdW1pbm9zaXR5IiwicGx1cy1saWdodGVyIl0saz0oKT0+WyJzdGFydCIsImVuZCIsImNlbnRlciIsImJldHdlZW4iLCJhcm91bmQiLCJldmVubHkiLCJzdHJldGNoIl0sST0oKT0+WyIiLCIwIix2ZV0sTD0oKT0+WyJhdXRvIiwiYXZvaWQiLCJhbGwiLCJhdm9pZC1wYWdlIiwicGFnZSIsImxlZnQiLCJyaWdodCIsImNvbHVtbiJdLFY9KCk9PltxbyxjdV0sdGU9KCk9Pltxbyx2ZV07cmV0dXJue2NhY2hlU2l6ZTo1MDAsc2VwYXJhdG9yOiI6Iix0aGVtZTp7Y29sb3JzOlthc10sc3BhY2luZzpbVm4sdG9dLGJsdXI6WyJub25lIiwiIixubyx2ZV0sYnJpZ2h0bmVzczpWKCksYm9yZGVyQ29sb3I6W2VdLGJvcmRlclJhZGl1czpbIm5vbmUiLCIiLCJmdWxsIixubyx2ZV0sYm9yZGVyU3BhY2luZzpGKCksYm9yZGVyV2lkdGg6YWUoKSxjb250cmFzdDpWKCksZ3JheXNjYWxlOkkoKSxodWVSb3RhdGU6dGUoKSxpbnZlcnQ6SSgpLGdhcDpGKCksZ3JhZGllbnRDb2xvclN0b3BzOltlXSxncmFkaWVudENvbG9yU3RvcFBvc2l0aW9uczpbek4sdG9dLGluc2V0OmooKSxtYXJnaW46aigpLG9wYWNpdHk6VigpLHBhZGRpbmc6RigpLHNhdHVyYXRlOlYoKSxzY2FsZTpWKCksc2VwaWE6SSgpLHNrZXc6dGUoKSxzcGFjZTpGKCksdHJhbnNsYXRlOkYoKX0sY2xhc3NHcm91cHM6e2FzcGVjdDpbe2FzcGVjdDpbImF1dG8iLCJzcXVhcmUiLCJ2aWRlbyIsdmVdfV0sY29udGFpbmVyOlsiY29udGFpbmVyIl0sY29sdW1uczpbe2NvbHVtbnM6W25vXX1dLCJicmVhay1hZnRlciI6W3siYnJlYWstYWZ0ZXIiOkwoKX1dLCJicmVhay1iZWZvcmUiOlt7ImJyZWFrLWJlZm9yZSI6TCgpfV0sImJyZWFrLWluc2lkZSI6W3siYnJlYWstaW5zaWRlIjpbImF1dG8iLCJhdm9pZCIsImF2b2lkLXBhZ2UiLCJhdm9pZC1jb2x1bW4iXX1dLCJib3gtZGVjb3JhdGlvbiI6W3siYm94LWRlY29yYXRpb24iOlsic2xpY2UiLCJjbG9uZSJdfV0sYm94Olt7Ym94OlsiYm9yZGVyIiwiY29udGVudCJdfV0sZGlzcGxheTpbImJsb2NrIiwiaW5saW5lLWJsb2NrIiwiaW5saW5lIiwiZmxleCIsImlubGluZS1mbGV4IiwidGFibGUiLCJpbmxpbmUtdGFibGUiLCJ0YWJsZS1jYXB0aW9uIiwidGFibGUtY2VsbCIsInRhYmxlLWNvbHVtbiIsInRhYmxlLWNvbHVtbi1ncm91cCIsInRhYmxlLWZvb3Rlci1ncm91cCIsInRhYmxlLWhlYWRlci1ncm91cCIsInRhYmxlLXJvdy1ncm91cCIsInRhYmxlLXJvdyIsImZsb3ctcm9vdCIsImdyaWQiLCJpbmxpbmUtZ3JpZCIsImNvbnRlbnRzIiwibGlzdC1pdGVtIiwiaGlkZGVuIl0sZmxvYXQ6W3tmbG9hdDpbInJpZ2h0IiwibGVmdCIsIm5vbmUiXX1dLGNsZWFyOlt7Y2xlYXI6WyJsZWZ0IiwicmlnaHQiLCJib3RoIiwibm9uZSJdfV0saXNvbGF0aW9uOlsiaXNvbGF0ZSIsImlzb2xhdGlvbi1hdXRvIl0sIm9iamVjdC1maXQiOlt7b2JqZWN0OlsiY29udGFpbiIsImNvdmVyIiwiZmlsbCIsIm5vbmUiLCJzY2FsZS1kb3duIl19XSwib2JqZWN0LXBvc2l0aW9uIjpbe29iamVjdDpbLi4uWCgpLHZlXX1dLG92ZXJmbG93Olt7b3ZlcmZsb3c6UigpfV0sIm92ZXJmbG93LXgiOlt7Im92ZXJmbG93LXgiOlIoKX1dLCJvdmVyZmxvdy15IjpbeyJvdmVyZmxvdy15IjpSKCl9XSxvdmVyc2Nyb2xsOlt7b3ZlcnNjcm9sbDpNKCl9XSwib3ZlcnNjcm9sbC14IjpbeyJvdmVyc2Nyb2xsLXgiOk0oKX1dLCJvdmVyc2Nyb2xsLXkiOlt7Im92ZXJzY3JvbGwteSI6TSgpfV0scG9zaXRpb246WyJzdGF0aWMiLCJmaXhlZCIsImFic29sdXRlIiwicmVsYXRpdmUiLCJzdGlja3kiXSxpbnNldDpbe2luc2V0OlttXX1dLCJpbnNldC14IjpbeyJpbnNldC14IjpbbV19XSwiaW5zZXQteSI6W3siaW5zZXQteSI6W21dfV0sc3RhcnQ6W3tzdGFydDpbbV19XSxlbmQ6W3tlbmQ6W21dfV0sdG9wOlt7dG9wOlttXX1dLHJpZ2h0Olt7cmlnaHQ6W21dfV0sYm90dG9tOlt7Ym90dG9tOlttXX1dLGxlZnQ6W3tsZWZ0OlttXX1dLHZpc2liaWxpdHk6WyJ2aXNpYmxlIiwiaW52aXNpYmxlIiwiY29sbGFwc2UiXSx6Olt7ejpbImF1dG8iLHNzLHZlXX1dLGJhc2lzOlt7YmFzaXM6aigpfV0sImZsZXgtZGlyZWN0aW9uIjpbe2ZsZXg6WyJyb3ciLCJyb3ctcmV2ZXJzZSIsImNvbCIsImNvbC1yZXZlcnNlIl19XSwiZmxleC13cmFwIjpbe2ZsZXg6WyJ3cmFwIiwid3JhcC1yZXZlcnNlIiwibm93cmFwIl19XSxmbGV4Olt7ZmxleDpbIjEiLCJhdXRvIiwiaW5pdGlhbCIsIm5vbmUiLHZlXX1dLGdyb3c6W3tncm93OkkoKX1dLHNocmluazpbe3NocmluazpJKCl9XSxvcmRlcjpbe29yZGVyOlsiZmlyc3QiLCJsYXN0Iiwibm9uZSIsc3MsdmVdfV0sImdyaWQtY29scyI6W3siZ3JpZC1jb2xzIjpbYXNdfV0sImNvbC1zdGFydC1lbmQiOlt7Y29sOlsiYXV0byIse3NwYW46WyJmdWxsIixzcyx2ZV19LHZlXX1dLCJjb2wtc3RhcnQiOlt7ImNvbC1zdGFydCI6SCgpfV0sImNvbC1lbmQiOlt7ImNvbC1lbmQiOkgoKX1dLCJncmlkLXJvd3MiOlt7ImdyaWQtcm93cyI6W2FzXX1dLCJyb3ctc3RhcnQtZW5kIjpbe3JvdzpbImF1dG8iLHtzcGFuOltzcyx2ZV19LHZlXX1dLCJyb3ctc3RhcnQiOlt7InJvdy1zdGFydCI6SCgpfV0sInJvdy1lbmQiOlt7InJvdy1lbmQiOkgoKX1dLCJncmlkLWZsb3ciOlt7ImdyaWQtZmxvdyI6WyJyb3ciLCJjb2wiLCJkZW5zZSIsInJvdy1kZW5zZSIsImNvbC1kZW5zZSJdfV0sImF1dG8tY29scyI6W3siYXV0by1jb2xzIjpbImF1dG8iLCJtaW4iLCJtYXgiLCJmciIsdmVdfV0sImF1dG8tcm93cyI6W3siYXV0by1yb3dzIjpbImF1dG8iLCJtaW4iLCJtYXgiLCJmciIsdmVdfV0sZ2FwOlt7Z2FwOltmXX1dLCJnYXAteCI6W3siZ2FwLXgiOltmXX1dLCJnYXAteSI6W3siZ2FwLXkiOltmXX1dLCJqdXN0aWZ5LWNvbnRlbnQiOlt7anVzdGlmeTpbIm5vcm1hbCIsLi4uaygpXX1dLCJqdXN0aWZ5LWl0ZW1zIjpbeyJqdXN0aWZ5LWl0ZW1zIjpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCJdfV0sImp1c3RpZnktc2VsZiI6W3sianVzdGlmeS1zZWxmIjpbImF1dG8iLCJzdGFydCIsImVuZCIsImNlbnRlciIsInN0cmV0Y2giXX1dLCJhbGlnbi1jb250ZW50Ijpbe2NvbnRlbnQ6WyJub3JtYWwiLC4uLmsoKSwiYmFzZWxpbmUiXX1dLCJhbGlnbi1pdGVtcyI6W3tpdGVtczpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYmFzZWxpbmUiLCJzdHJldGNoIl19XSwiYWxpZ24tc2VsZiI6W3tzZWxmOlsiYXV0byIsInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCIsImJhc2VsaW5lIl19XSwicGxhY2UtY29udGVudCI6W3sicGxhY2UtY29udGVudCI6Wy4uLmsoKSwiYmFzZWxpbmUiXX1dLCJwbGFjZS1pdGVtcyI6W3sicGxhY2UtaXRlbXMiOlsic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJiYXNlbGluZSIsInN0cmV0Y2giXX1dLCJwbGFjZS1zZWxmIjpbeyJwbGFjZS1zZWxmIjpbImF1dG8iLCJzdGFydCIsImVuZCIsImNlbnRlciIsInN0cmV0Y2giXX1dLHA6W3twOlt5XX1dLHB4Olt7cHg6W3ldfV0scHk6W3tweTpbeV19XSxwczpbe3BzOlt5XX1dLHBlOlt7cGU6W3ldfV0scHQ6W3twdDpbeV19XSxwcjpbe3ByOlt5XX1dLHBiOlt7cGI6W3ldfV0scGw6W3twbDpbeV19XSxtOlt7bTpbU119XSxteDpbe214OltTXX1dLG15Olt7bXk6W1NdfV0sbXM6W3ttczpbU119XSxtZTpbe21lOltTXX1dLG10Olt7bXQ6W1NdfV0sbXI6W3ttcjpbU119XSxtYjpbe21iOltTXX1dLG1sOlt7bWw6W1NdfV0sInNwYWNlLXgiOlt7InNwYWNlLXgiOltDXX1dLCJzcGFjZS14LXJldmVyc2UiOlsic3BhY2UteC1yZXZlcnNlIl0sInNwYWNlLXkiOlt7InNwYWNlLXkiOltDXX1dLCJzcGFjZS15LXJldmVyc2UiOlsic3BhY2UteS1yZXZlcnNlIl0sdzpbe3c6WyJhdXRvIiwibWluIiwibWF4IiwiZml0Iix2ZSx0XX1dLCJtaW4tdyI6W3sibWluLXciOlsibWluIiwibWF4IiwiZml0Iix2ZSxWbl19XSwibWF4LXciOlt7Im1heC13IjpbIjAiLCJub25lIiwiZnVsbCIsIm1pbiIsIm1heCIsImZpdCIsInByb3NlIix7c2NyZWVuOltub119LG5vLHZlXX1dLGg6W3toOlt2ZSx0LCJhdXRvIiwibWluIiwibWF4IiwiZml0Il19XSwibWluLWgiOlt7Im1pbi1oIjpbIm1pbiIsIm1heCIsImZpdCIsVm4sdmVdfV0sIm1heC1oIjpbeyJtYXgtaCI6W3ZlLHQsIm1pbiIsIm1heCIsImZpdCJdfV0sImZvbnQtc2l6ZSI6W3t0ZXh0OlsiYmFzZSIsbm8sdG9dfV0sImZvbnQtc21vb3RoaW5nIjpbImFudGlhbGlhc2VkIiwic3VicGl4ZWwtYW50aWFsaWFzZWQiXSwiZm9udC1zdHlsZSI6WyJpdGFsaWMiLCJub3QtaXRhbGljIl0sImZvbnQtd2VpZ2h0Ijpbe2ZvbnQ6WyJ0aGluIiwiZXh0cmFsaWdodCIsImxpZ2h0Iiwibm9ybWFsIiwibWVkaXVtIiwic2VtaWJvbGQiLCJib2xkIiwiZXh0cmFib2xkIiwiYmxhY2siLGN1XX1dLCJmb250LWZhbWlseSI6W3tmb250Olthc119XSwiZnZuLW5vcm1hbCI6WyJub3JtYWwtbnVtcyJdLCJmdm4tb3JkaW5hbCI6WyJvcmRpbmFsIl0sImZ2bi1zbGFzaGVkLXplcm8iOlsic2xhc2hlZC16ZXJvIl0sImZ2bi1maWd1cmUiOlsibGluaW5nLW51bXMiLCJvbGRzdHlsZS1udW1zIl0sImZ2bi1zcGFjaW5nIjpbInByb3BvcnRpb25hbC1udW1zIiwidGFidWxhci1udW1zIl0sImZ2bi1mcmFjdGlvbiI6WyJkaWFnb25hbC1mcmFjdGlvbnMiLCJzdGFja2VkLWZyYWN0b25zIl0sdHJhY2tpbmc6W3t0cmFja2luZzpbInRpZ2h0ZXIiLCJ0aWdodCIsIm5vcm1hbCIsIndpZGUiLCJ3aWRlciIsIndpZGVzdCIsdmVdfV0sImxpbmUtY2xhbXAiOlt7ImxpbmUtY2xhbXAiOlsibm9uZSIscW8sY3VdfV0sbGVhZGluZzpbe2xlYWRpbmc6WyJub25lIiwidGlnaHQiLCJzbnVnIiwibm9ybWFsIiwicmVsYXhlZCIsImxvb3NlIixWbix2ZV19XSwibGlzdC1pbWFnZSI6W3sibGlzdC1pbWFnZSI6WyJub25lIix2ZV19XSwibGlzdC1zdHlsZS10eXBlIjpbe2xpc3Q6WyJub25lIiwiZGlzYyIsImRlY2ltYWwiLHZlXX1dLCJsaXN0LXN0eWxlLXBvc2l0aW9uIjpbe2xpc3Q6WyJpbnNpZGUiLCJvdXRzaWRlIl19XSwicGxhY2Vob2xkZXItY29sb3IiOlt7cGxhY2Vob2xkZXI6W2VdfV0sInBsYWNlaG9sZGVyLW9wYWNpdHkiOlt7InBsYWNlaG9sZGVyLW9wYWNpdHkiOlt2XX1dLCJ0ZXh0LWFsaWdubWVudCI6W3t0ZXh0OlsibGVmdCIsImNlbnRlciIsInJpZ2h0IiwianVzdGlmeSIsInN0YXJ0IiwiZW5kIl19XSwidGV4dC1jb2xvciI6W3t0ZXh0OltlXX1dLCJ0ZXh0LW9wYWNpdHkiOlt7InRleHQtb3BhY2l0eSI6W3ZdfV0sInRleHQtZGVjb3JhdGlvbiI6WyJ1bmRlcmxpbmUiLCJvdmVybGluZSIsImxpbmUtdGhyb3VnaCIsIm5vLXVuZGVybGluZSJdLCJ0ZXh0LWRlY29yYXRpb24tc3R5bGUiOlt7ZGVjb3JhdGlvbjpbLi4uUCgpLCJ3YXZ5Il19XSwidGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzcyI6W3tkZWNvcmF0aW9uOlsiYXV0byIsImZyb20tZm9udCIsVm4sdG9dfV0sInVuZGVybGluZS1vZmZzZXQiOlt7InVuZGVybGluZS1vZmZzZXQiOlsiYXV0byIsVm4sdmVdfV0sInRleHQtZGVjb3JhdGlvbi1jb2xvciI6W3tkZWNvcmF0aW9uOltlXX1dLCJ0ZXh0LXRyYW5zZm9ybSI6WyJ1cHBlcmNhc2UiLCJsb3dlcmNhc2UiLCJjYXBpdGFsaXplIiwibm9ybWFsLWNhc2UiXSwidGV4dC1vdmVyZmxvdyI6WyJ0cnVuY2F0ZSIsInRleHQtZWxsaXBzaXMiLCJ0ZXh0LWNsaXAiXSxpbmRlbnQ6W3tpbmRlbnQ6RigpfV0sInZlcnRpY2FsLWFsaWduIjpbe2FsaWduOlsiYmFzZWxpbmUiLCJ0b3AiLCJtaWRkbGUiLCJib3R0b20iLCJ0ZXh0LXRvcCIsInRleHQtYm90dG9tIiwic3ViIiwic3VwZXIiLHZlXX1dLHdoaXRlc3BhY2U6W3t3aGl0ZXNwYWNlOlsibm9ybWFsIiwibm93cmFwIiwicHJlIiwicHJlLWxpbmUiLCJwcmUtd3JhcCIsImJyZWFrLXNwYWNlcyJdfV0sYnJlYWs6W3ticmVhazpbIm5vcm1hbCIsIndvcmRzIiwiYWxsIiwia2VlcCJdfV0saHlwaGVuczpbe2h5cGhlbnM6WyJub25lIiwibWFudWFsIiwiYXV0byJdfV0sY29udGVudDpbe2NvbnRlbnQ6WyJub25lIix2ZV19XSwiYmctYXR0YWNobWVudCI6W3tiZzpbImZpeGVkIiwibG9jYWwiLCJzY3JvbGwiXX1dLCJiZy1jbGlwIjpbeyJiZy1jbGlwIjpbImJvcmRlciIsInBhZGRpbmciLCJjb250ZW50IiwidGV4dCJdfV0sImJnLW9wYWNpdHkiOlt7ImJnLW9wYWNpdHkiOlt2XX1dLCJiZy1vcmlnaW4iOlt7ImJnLW9yaWdpbiI6WyJib3JkZXIiLCJwYWRkaW5nIiwiY29udGVudCJdfV0sImJnLXBvc2l0aW9uIjpbe2JnOlsuLi5YKCksV05dfV0sImJnLXJlcGVhdCI6W3tiZzpbIm5vLXJlcGVhdCIse3JlcGVhdDpbIiIsIngiLCJ5Iiwicm91bmQiLCJzcGFjZSJdfV19XSwiYmctc2l6ZSI6W3tiZzpbImF1dG8iLCJjb3ZlciIsImNvbnRhaW4iLEJOXX1dLCJiZy1pbWFnZSI6W3tiZzpbIm5vbmUiLHsiZ3JhZGllbnQtdG8iOlsidCIsInRyIiwiciIsImJyIiwiYiIsImJsIiwibCIsInRsIl19LFZOXX1dLCJiZy1jb2xvciI6W3tiZzpbZV19XSwiZ3JhZGllbnQtZnJvbS1wb3MiOlt7ZnJvbTpbZ119XSwiZ3JhZGllbnQtdmlhLXBvcyI6W3t2aWE6W2ddfV0sImdyYWRpZW50LXRvLXBvcyI6W3t0bzpbZ119XSwiZ3JhZGllbnQtZnJvbSI6W3tmcm9tOltoXX1dLCJncmFkaWVudC12aWEiOlt7dmlhOltoXX1dLCJncmFkaWVudC10byI6W3t0bzpbaF19XSxyb3VuZGVkOlt7cm91bmRlZDpbaV19XSwicm91bmRlZC1zIjpbeyJyb3VuZGVkLXMiOltpXX1dLCJyb3VuZGVkLWUiOlt7InJvdW5kZWQtZSI6W2ldfV0sInJvdW5kZWQtdCI6W3sicm91bmRlZC10IjpbaV19XSwicm91bmRlZC1yIjpbeyJyb3VuZGVkLXIiOltpXX1dLCJyb3VuZGVkLWIiOlt7InJvdW5kZWQtYiI6W2ldfV0sInJvdW5kZWQtbCI6W3sicm91bmRlZC1sIjpbaV19XSwicm91bmRlZC1zcyI6W3sicm91bmRlZC1zcyI6W2ldfV0sInJvdW5kZWQtc2UiOlt7InJvdW5kZWQtc2UiOltpXX1dLCJyb3VuZGVkLWVlIjpbeyJyb3VuZGVkLWVlIjpbaV19XSwicm91bmRlZC1lcyI6W3sicm91bmRlZC1lcyI6W2ldfV0sInJvdW5kZWQtdGwiOlt7InJvdW5kZWQtdGwiOltpXX1dLCJyb3VuZGVkLXRyIjpbeyJyb3VuZGVkLXRyIjpbaV19XSwicm91bmRlZC1iciI6W3sicm91bmRlZC1iciI6W2ldfV0sInJvdW5kZWQtYmwiOlt7InJvdW5kZWQtYmwiOltpXX1dLCJib3JkZXItdyI6W3tib3JkZXI6W3NdfV0sImJvcmRlci13LXgiOlt7ImJvcmRlci14Ijpbc119XSwiYm9yZGVyLXcteSI6W3siYm9yZGVyLXkiOltzXX1dLCJib3JkZXItdy1zIjpbeyJib3JkZXItcyI6W3NdfV0sImJvcmRlci13LWUiOlt7ImJvcmRlci1lIjpbc119XSwiYm9yZGVyLXctdCI6W3siYm9yZGVyLXQiOltzXX1dLCJib3JkZXItdy1yIjpbeyJib3JkZXItciI6W3NdfV0sImJvcmRlci13LWIiOlt7ImJvcmRlci1iIjpbc119XSwiYm9yZGVyLXctbCI6W3siYm9yZGVyLWwiOltzXX1dLCJib3JkZXItb3BhY2l0eSI6W3siYm9yZGVyLW9wYWNpdHkiOlt2XX1dLCJib3JkZXItc3R5bGUiOlt7Ym9yZGVyOlsuLi5QKCksImhpZGRlbiJdfV0sImRpdmlkZS14IjpbeyJkaXZpZGUteCI6W3NdfV0sImRpdmlkZS14LXJldmVyc2UiOlsiZGl2aWRlLXgtcmV2ZXJzZSJdLCJkaXZpZGUteSI6W3siZGl2aWRlLXkiOltzXX1dLCJkaXZpZGUteS1yZXZlcnNlIjpbImRpdmlkZS15LXJldmVyc2UiXSwiZGl2aWRlLW9wYWNpdHkiOlt7ImRpdmlkZS1vcGFjaXR5Ijpbdl19XSwiZGl2aWRlLXN0eWxlIjpbe2RpdmlkZTpQKCl9XSwiYm9yZGVyLWNvbG9yIjpbe2JvcmRlcjpbb119XSwiYm9yZGVyLWNvbG9yLXgiOlt7ImJvcmRlci14Ijpbb119XSwiYm9yZGVyLWNvbG9yLXkiOlt7ImJvcmRlci15Ijpbb119XSwiYm9yZGVyLWNvbG9yLXQiOlt7ImJvcmRlci10Ijpbb119XSwiYm9yZGVyLWNvbG9yLXIiOlt7ImJvcmRlci1yIjpbb119XSwiYm9yZGVyLWNvbG9yLWIiOlt7ImJvcmRlci1iIjpbb119XSwiYm9yZGVyLWNvbG9yLWwiOlt7ImJvcmRlci1sIjpbb119XSwiZGl2aWRlLWNvbG9yIjpbe2RpdmlkZTpbb119XSwib3V0bGluZS1zdHlsZSI6W3tvdXRsaW5lOlsiIiwuLi5QKCldfV0sIm91dGxpbmUtb2Zmc2V0IjpbeyJvdXRsaW5lLW9mZnNldCI6W1ZuLHZlXX1dLCJvdXRsaW5lLXciOlt7b3V0bGluZTpbVm4sdG9dfV0sIm91dGxpbmUtY29sb3IiOlt7b3V0bGluZTpbZV19XSwicmluZy13Ijpbe3Jpbmc6YWUoKX1dLCJyaW5nLXctaW5zZXQiOlsicmluZy1pbnNldCJdLCJyaW5nLWNvbG9yIjpbe3Jpbmc6W2VdfV0sInJpbmctb3BhY2l0eSI6W3sicmluZy1vcGFjaXR5Ijpbdl19XSwicmluZy1vZmZzZXQtdyI6W3sicmluZy1vZmZzZXQiOltWbix0b119XSwicmluZy1vZmZzZXQtY29sb3IiOlt7InJpbmctb2Zmc2V0IjpbZV19XSxzaGFkb3c6W3tzaGFkb3c6WyIiLCJpbm5lciIsIm5vbmUiLG5vLEhOXX1dLCJzaGFkb3ctY29sb3IiOlt7c2hhZG93Olthc119XSxvcGFjaXR5Olt7b3BhY2l0eTpbdl19XSwibWl4LWJsZW5kIjpbeyJtaXgtYmxlbmQiOk8oKX1dLCJiZy1ibGVuZCI6W3siYmctYmxlbmQiOk8oKX1dLGZpbHRlcjpbe2ZpbHRlcjpbIiIsIm5vbmUiXX1dLGJsdXI6W3tibHVyOltuXX1dLGJyaWdodG5lc3M6W3ticmlnaHRuZXNzOltyXX1dLGNvbnRyYXN0Olt7Y29udHJhc3Q6W2FdfV0sImRyb3Atc2hhZG93IjpbeyJkcm9wLXNoYWRvdyI6WyIiLCJub25lIixubyx2ZV19XSxncmF5c2NhbGU6W3tncmF5c2NhbGU6W3VdfV0sImh1ZS1yb3RhdGUiOlt7Imh1ZS1yb3RhdGUiOltjXX1dLGludmVydDpbe2ludmVydDpbZF19XSxzYXR1cmF0ZTpbe3NhdHVyYXRlOlt4XX1dLHNlcGlhOlt7c2VwaWE6W0VdfV0sImJhY2tkcm9wLWZpbHRlciI6W3siYmFja2Ryb3AtZmlsdGVyIjpbIiIsIm5vbmUiXX1dLCJiYWNrZHJvcC1ibHVyIjpbeyJiYWNrZHJvcC1ibHVyIjpbbl19XSwiYmFja2Ryb3AtYnJpZ2h0bmVzcyI6W3siYmFja2Ryb3AtYnJpZ2h0bmVzcyI6W3JdfV0sImJhY2tkcm9wLWNvbnRyYXN0IjpbeyJiYWNrZHJvcC1jb250cmFzdCI6W2FdfV0sImJhY2tkcm9wLWdyYXlzY2FsZSI6W3siYmFja2Ryb3AtZ3JheXNjYWxlIjpbdV19XSwiYmFja2Ryb3AtaHVlLXJvdGF0ZSI6W3siYmFja2Ryb3AtaHVlLXJvdGF0ZSI6W2NdfV0sImJhY2tkcm9wLWludmVydCI6W3siYmFja2Ryb3AtaW52ZXJ0IjpbZF19XSwiYmFja2Ryb3Atb3BhY2l0eSI6W3siYmFja2Ryb3Atb3BhY2l0eSI6W3ZdfV0sImJhY2tkcm9wLXNhdHVyYXRlIjpbeyJiYWNrZHJvcC1zYXR1cmF0ZSI6W3hdfV0sImJhY2tkcm9wLXNlcGlhIjpbeyJiYWNrZHJvcC1zZXBpYSI6W0VdfV0sImJvcmRlci1jb2xsYXBzZSI6W3tib3JkZXI6WyJjb2xsYXBzZSIsInNlcGFyYXRlIl19XSwiYm9yZGVyLXNwYWNpbmciOlt7ImJvcmRlci1zcGFjaW5nIjpbbF19XSwiYm9yZGVyLXNwYWNpbmcteCI6W3siYm9yZGVyLXNwYWNpbmcteCI6W2xdfV0sImJvcmRlci1zcGFjaW5nLXkiOlt7ImJvcmRlci1zcGFjaW5nLXkiOltsXX1dLCJ0YWJsZS1sYXlvdXQiOlt7dGFibGU6WyJhdXRvIiwiZml4ZWQiXX1dLGNhcHRpb246W3tjYXB0aW9uOlsidG9wIiwiYm90dG9tIl19XSx0cmFuc2l0aW9uOlt7dHJhbnNpdGlvbjpbIm5vbmUiLCJhbGwiLCIiLCJjb2xvcnMiLCJvcGFjaXR5Iiwic2hhZG93IiwidHJhbnNmb3JtIix2ZV19XSxkdXJhdGlvbjpbe2R1cmF0aW9uOnRlKCl9XSxlYXNlOlt7ZWFzZTpbImxpbmVhciIsImluIiwib3V0IiwiaW4tb3V0Iix2ZV19XSxkZWxheTpbe2RlbGF5OnRlKCl9XSxhbmltYXRlOlt7YW5pbWF0ZTpbIm5vbmUiLCJzcGluIiwicGluZyIsInB1bHNlIiwiYm91bmNlIix2ZV19XSx0cmFuc2Zvcm06W3t0cmFuc2Zvcm06WyIiLCJncHUiLCJub25lIl19XSxzY2FsZTpbe3NjYWxlOltfXX1dLCJzY2FsZS14IjpbeyJzY2FsZS14IjpbX119XSwic2NhbGUteSI6W3sic2NhbGUteSI6W19dfV0scm90YXRlOlt7cm90YXRlOltzcyx2ZV19XSwidHJhbnNsYXRlLXgiOlt7InRyYW5zbGF0ZS14IjpbVF19XSwidHJhbnNsYXRlLXkiOlt7InRyYW5zbGF0ZS15IjpbVF19XSwic2tldy14IjpbeyJza2V3LXgiOlskXX1dLCJza2V3LXkiOlt7InNrZXcteSI6WyRdfV0sInRyYW5zZm9ybS1vcmlnaW4iOlt7b3JpZ2luOlsiY2VudGVyIiwidG9wIiwidG9wLXJpZ2h0IiwicmlnaHQiLCJib3R0b20tcmlnaHQiLCJib3R0b20iLCJib3R0b20tbGVmdCIsImxlZnQiLCJ0b3AtbGVmdCIsdmVdfV0sYWNjZW50Olt7YWNjZW50OlsiYXV0byIsZV19XSxhcHBlYXJhbmNlOlsiYXBwZWFyYW5jZS1ub25lIl0sY3Vyc29yOlt7Y3Vyc29yOlsiYXV0byIsImRlZmF1bHQiLCJwb2ludGVyIiwid2FpdCIsInRleHQiLCJtb3ZlIiwiaGVscCIsIm5vdC1hbGxvd2VkIiwibm9uZSIsImNvbnRleHQtbWVudSIsInByb2dyZXNzIiwiY2VsbCIsImNyb3NzaGFpciIsInZlcnRpY2FsLXRleHQiLCJhbGlhcyIsImNvcHkiLCJuby1kcm9wIiwiZ3JhYiIsImdyYWJiaW5nIiwiYWxsLXNjcm9sbCIsImNvbC1yZXNpemUiLCJyb3ctcmVzaXplIiwibi1yZXNpemUiLCJlLXJlc2l6ZSIsInMtcmVzaXplIiwidy1yZXNpemUiLCJuZS1yZXNpemUiLCJudy1yZXNpemUiLCJzZS1yZXNpemUiLCJzdy1yZXNpemUiLCJldy1yZXNpemUiLCJucy1yZXNpemUiLCJuZXN3LXJlc2l6ZSIsIm53c2UtcmVzaXplIiwiem9vbS1pbiIsInpvb20tb3V0Iix2ZV19XSwiY2FyZXQtY29sb3IiOlt7Y2FyZXQ6W2VdfV0sInBvaW50ZXItZXZlbnRzIjpbeyJwb2ludGVyLWV2ZW50cyI6WyJub25lIiwiYXV0byJdfV0scmVzaXplOlt7cmVzaXplOlsibm9uZSIsInkiLCJ4IiwiIl19XSwic2Nyb2xsLWJlaGF2aW9yIjpbe3Njcm9sbDpbImF1dG8iLCJzbW9vdGgiXX1dLCJzY3JvbGwtbSI6W3sic2Nyb2xsLW0iOkYoKX1dLCJzY3JvbGwtbXgiOlt7InNjcm9sbC1teCI6RigpfV0sInNjcm9sbC1teSI6W3sic2Nyb2xsLW15IjpGKCl9XSwic2Nyb2xsLW1zIjpbeyJzY3JvbGwtbXMiOkYoKX1dLCJzY3JvbGwtbWUiOlt7InNjcm9sbC1tZSI6RigpfV0sInNjcm9sbC1tdCI6W3sic2Nyb2xsLW10IjpGKCl9XSwic2Nyb2xsLW1yIjpbeyJzY3JvbGwtbXIiOkYoKX1dLCJzY3JvbGwtbWIiOlt7InNjcm9sbC1tYiI6RigpfV0sInNjcm9sbC1tbCI6W3sic2Nyb2xsLW1sIjpGKCl9XSwic2Nyb2xsLXAiOlt7InNjcm9sbC1wIjpGKCl9XSwic2Nyb2xsLXB4IjpbeyJzY3JvbGwtcHgiOkYoKX1dLCJzY3JvbGwtcHkiOlt7InNjcm9sbC1weSI6RigpfV0sInNjcm9sbC1wcyI6W3sic2Nyb2xsLXBzIjpGKCl9XSwic2Nyb2xsLXBlIjpbeyJzY3JvbGwtcGUiOkYoKX1dLCJzY3JvbGwtcHQiOlt7InNjcm9sbC1wdCI6RigpfV0sInNjcm9sbC1wciI6W3sic2Nyb2xsLXByIjpGKCl9XSwic2Nyb2xsLXBiIjpbeyJzY3JvbGwtcGIiOkYoKX1dLCJzY3JvbGwtcGwiOlt7InNjcm9sbC1wbCI6RigpfV0sInNuYXAtYWxpZ24iOlt7c25hcDpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYWxpZ24tbm9uZSJdfV0sInNuYXAtc3RvcCI6W3tzbmFwOlsibm9ybWFsIiwiYWx3YXlzIl19XSwic25hcC10eXBlIjpbe3NuYXA6WyJub25lIiwieCIsInkiLCJib3RoIl19XSwic25hcC1zdHJpY3RuZXNzIjpbe3NuYXA6WyJtYW5kYXRvcnkiLCJwcm94aW1pdHkiXX1dLHRvdWNoOlt7dG91Y2g6WyJhdXRvIiwibm9uZSIsIm1hbmlwdWxhdGlvbiJdfV0sInRvdWNoLXgiOlt7InRvdWNoLXBhbiI6WyJ4IiwibGVmdCIsInJpZ2h0Il19XSwidG91Y2gteSI6W3sidG91Y2gtcGFuIjpbInkiLCJ1cCIsImRvd24iXX1dLCJ0b3VjaC1weiI6WyJ0b3VjaC1waW5jaC16b29tIl0sc2VsZWN0Olt7c2VsZWN0Olsibm9uZSIsInRleHQiLCJhbGwiLCJhdXRvIl19XSwid2lsbC1jaGFuZ2UiOlt7IndpbGwtY2hhbmdlIjpbImF1dG8iLCJzY3JvbGwiLCJjb250ZW50cyIsInRyYW5zZm9ybSIsdmVdfV0sZmlsbDpbe2ZpbGw6W2UsIm5vbmUiXX1dLCJzdHJva2UtdyI6W3tzdHJva2U6W1ZuLHRvLGN1XX1dLHN0cm9rZTpbe3N0cm9rZTpbZSwibm9uZSJdfV0sc3I6WyJzci1vbmx5Iiwibm90LXNyLW9ubHkiXX0sY29uZmxpY3RpbmdDbGFzc0dyb3Vwczp7b3ZlcmZsb3c6WyJvdmVyZmxvdy14Iiwib3ZlcmZsb3cteSJdLG92ZXJzY3JvbGw6WyJvdmVyc2Nyb2xsLXgiLCJvdmVyc2Nyb2xsLXkiXSxpbnNldDpbImluc2V0LXgiLCJpbnNldC15Iiwic3RhcnQiLCJlbmQiLCJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXSwiaW5zZXQteCI6WyJyaWdodCIsImxlZnQiXSwiaW5zZXQteSI6WyJ0b3AiLCJib3R0b20iXSxmbGV4OlsiYmFzaXMiLCJncm93Iiwic2hyaW5rIl0sZ2FwOlsiZ2FwLXgiLCJnYXAteSJdLHA6WyJweCIsInB5IiwicHMiLCJwZSIsInB0IiwicHIiLCJwYiIsInBsIl0scHg6WyJwciIsInBsIl0scHk6WyJwdCIsInBiIl0sbTpbIm14IiwibXkiLCJtcyIsIm1lIiwibXQiLCJtciIsIm1iIiwibWwiXSxteDpbIm1yIiwibWwiXSxteTpbIm10IiwibWIiXSwiZm9udC1zaXplIjpbImxlYWRpbmciXSwiZnZuLW5vcm1hbCI6WyJmdm4tb3JkaW5hbCIsImZ2bi1zbGFzaGVkLXplcm8iLCJmdm4tZmlndXJlIiwiZnZuLXNwYWNpbmciLCJmdm4tZnJhY3Rpb24iXSwiZnZuLW9yZGluYWwiOlsiZnZuLW5vcm1hbCJdLCJmdm4tc2xhc2hlZC16ZXJvIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZpZ3VyZSI6WyJmdm4tbm9ybWFsIl0sImZ2bi1zcGFjaW5nIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZyYWN0aW9uIjpbImZ2bi1ub3JtYWwiXSxyb3VuZGVkOlsicm91bmRlZC1zIiwicm91bmRlZC1lIiwicm91bmRlZC10Iiwicm91bmRlZC1yIiwicm91bmRlZC1iIiwicm91bmRlZC1sIiwicm91bmRlZC1zcyIsInJvdW5kZWQtc2UiLCJyb3VuZGVkLWVlIiwicm91bmRlZC1lcyIsInJvdW5kZWQtdGwiLCJyb3VuZGVkLXRyIiwicm91bmRlZC1iciIsInJvdW5kZWQtYmwiXSwicm91bmRlZC1zIjpbInJvdW5kZWQtc3MiLCJyb3VuZGVkLWVzIl0sInJvdW5kZWQtZSI6WyJyb3VuZGVkLXNlIiwicm91bmRlZC1lZSJdLCJyb3VuZGVkLXQiOlsicm91bmRlZC10bCIsInJvdW5kZWQtdHIiXSwicm91bmRlZC1yIjpbInJvdW5kZWQtdHIiLCJyb3VuZGVkLWJyIl0sInJvdW5kZWQtYiI6WyJyb3VuZGVkLWJyIiwicm91bmRlZC1ibCJdLCJyb3VuZGVkLWwiOlsicm91bmRlZC10bCIsInJvdW5kZWQtYmwiXSwiYm9yZGVyLXNwYWNpbmciOlsiYm9yZGVyLXNwYWNpbmcteCIsImJvcmRlci1zcGFjaW5nLXkiXSwiYm9yZGVyLXciOlsiYm9yZGVyLXctcyIsImJvcmRlci13LWUiLCJib3JkZXItdy10IiwiYm9yZGVyLXctciIsImJvcmRlci13LWIiLCJib3JkZXItdy1sIl0sImJvcmRlci13LXgiOlsiYm9yZGVyLXctciIsImJvcmRlci13LWwiXSwiYm9yZGVyLXcteSI6WyJib3JkZXItdy10IiwiYm9yZGVyLXctYiJdLCJib3JkZXItY29sb3IiOlsiYm9yZGVyLWNvbG9yLXQiLCJib3JkZXItY29sb3ItciIsImJvcmRlci1jb2xvci1iIiwiYm9yZGVyLWNvbG9yLWwiXSwiYm9yZGVyLWNvbG9yLXgiOlsiYm9yZGVyLWNvbG9yLXIiLCJib3JkZXItY29sb3ItbCJdLCJib3JkZXItY29sb3IteSI6WyJib3JkZXItY29sb3ItdCIsImJvcmRlci1jb2xvci1iIl0sInNjcm9sbC1tIjpbInNjcm9sbC1teCIsInNjcm9sbC1teSIsInNjcm9sbC1tcyIsInNjcm9sbC1tZSIsInNjcm9sbC1tdCIsInNjcm9sbC1tciIsInNjcm9sbC1tYiIsInNjcm9sbC1tbCJdLCJzY3JvbGwtbXgiOlsic2Nyb2xsLW1yIiwic2Nyb2xsLW1sIl0sInNjcm9sbC1teSI6WyJzY3JvbGwtbXQiLCJzY3JvbGwtbWIiXSwic2Nyb2xsLXAiOlsic2Nyb2xsLXB4Iiwic2Nyb2xsLXB5Iiwic2Nyb2xsLXBzIiwic2Nyb2xsLXBlIiwic2Nyb2xsLXB0Iiwic2Nyb2xsLXByIiwic2Nyb2xsLXBiIiwic2Nyb2xsLXBsIl0sInNjcm9sbC1weCI6WyJzY3JvbGwtcHIiLCJzY3JvbGwtcGwiXSwic2Nyb2xsLXB5IjpbInNjcm9sbC1wdCIsInNjcm9sbC1wYiJdLHRvdWNoOlsidG91Y2gteCIsInRvdWNoLXkiLCJ0b3VjaC1weiJdLCJ0b3VjaC14IjpbInRvdWNoIl0sInRvdWNoLXkiOlsidG91Y2giXSwidG91Y2gtcHoiOlsidG91Y2giXX0sY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzOnsiZm9udC1zaXplIjpbImxlYWRpbmciXX19fWNvbnN0IFFOPU9OKFhOKTtmdW5jdGlvbiBvdCguLi5lKXtyZXR1cm4gUU4oeE4oZSkpfWNvbnN0IE9zPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9PncuanN4cyhFXyx7cmVmOnIsY2xhc3NOYW1lOm90KCJyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4iLGUpLC4uLm4sY2hpbGRyZW46W3cuanN4KHZOLHtjbGFzc05hbWU6ImgtZnVsbCB3LWZ1bGwgcm91bmRlZC1baW5oZXJpdF0iLGNoaWxkcmVuOnR9KSx3LmpzeChSXyx7fSksdy5qc3goeU4se30pXX0pKTtPcy5kaXNwbGF5TmFtZT1FXy5kaXNwbGF5TmFtZTtjb25zdCBSXz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxvcmllbnRhdGlvbjp0PSJ2ZXJ0aWNhbCIsLi4ubn0scik9PncuanN4KGdfLHtyZWY6cixvcmllbnRhdGlvbjp0LGNsYXNzTmFtZTpvdCgiZmxleCB0b3VjaC1ub25lIHNlbGVjdC1ub25lIHRyYW5zaXRpb24tY29sb3JzIix0PT09InZlcnRpY2FsIiYmImgtZnVsbCB3LTIuNSBib3JkZXItbCBib3JkZXItbC10cmFuc3BhcmVudCBwLVsxcHhdIix0PT09Imhvcml6b250YWwiJiYiaC0yLjUgZmxleC1jb2wgYm9yZGVyLXQgYm9yZGVyLXQtdHJhbnNwYXJlbnQgcC1bMXB4XSIsZSksLi4ubixjaGlsZHJlbjp3LmpzeChkTix7Y2xhc3NOYW1lOm90KCJyZWxhdGl2ZSByb3VuZGVkLWZ1bGwgYmctYm9yZGVyIix0PT09InZlcnRpY2FsIiYmImZsZXgtMSIpfSl9KSk7Ul8uZGlzcGxheU5hbWU9Z18uZGlzcGxheU5hbWU7ZnVuY3Rpb24gQXMoe2NoaWxkcmVuOmV9KXtjb25zdCB0PXAudXNlUmVmKG51bGwpLG49cC51c2VSZWYobnVsbCkscj1wLnVzZVJlZighMSksbz1wLnVzZVJlZigwKSxpPXAudXNlUmVmKG51bGwpLGw9cC51c2VSZWYoMCkscz0oKT0+e3IuY3VycmVudD0hMSxpLmN1cnJlbnQ9bnVsbCxvLmN1cnJlbnQ9MCxsLmN1cnJlbnQ9MH0sYT1TPT57Uy5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IHY9aS5jdXJyZW50PT09ImxlZnQiP3Q6bjtpZih2LmN1cnJlbnQmJnIuY3VycmVudCl7Y29uc3QgeT1pLmN1cnJlbnQ9PT0ibGVmdCI/Uy5zY3JlZW5YLW8uY3VycmVudDpvLmN1cnJlbnQtUy5zY3JlZW5YO3YuY3VycmVudC5zdHlsZS53aWR0aD1gJHtNYXRoLm1heChsLmN1cnJlbnQreSwxNTApfXB4YH19LHU9Uz0+dj0+e2lmKHYudGFyZ2V0KXtjb25zdCB4PVM9PT0ibGVmdCI/dDpTPT09InJpZ2h0Ij9uOm51bGw7ci5jdXJyZW50PSEwLHgmJnguY3VycmVudCYmKG8uY3VycmVudD12LnNjcmVlblgsaS5jdXJyZW50PVMseC5jdXJyZW50JiYobC5jdXJyZW50PXguY3VycmVudC5vZmZzZXRXaWR0aCkpfX0sW2MsZCxmLGgsZyxtXT1wLkNoaWxkcmVuLnRvQXJyYXkoZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4oZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIscyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixhKSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHMpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsYSl9KSxbXSksdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaC1zY3JlZW4iLGNoaWxkcmVuOlt3LmpzeHMoImRpdiIse3JlZjp0LGNsYXNzTmFtZToicmVsYXRpdmUgYm9yZGVyLXIgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W3cuanN4cyhBcy5Db2x1bW4se2NoaWxkcmVuOltjLHcuanN4KE9zLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpkfSldfSksdy5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgaW5zZXQteS0wIHJpZ2h0LTAgY3Vyc29yLWNvbC1yZXNpemUgdy1bMXB4XSBob3Zlcjp3LVszcHhdIGgtZnVsbCBob3ZlcjpiZy1ib3JkZXIiLG9uTW91c2VEb3duOnUoImxlZnQiKX0pXX0pLHcuanN4KCJkaXYiLHtjbGFzc05hbWU6cmQoIiIseyJ3LWZ1bGwiOiFnJiYhbX0pLGNoaWxkcmVuOncuanN4cyhBcy5Db2x1bW4se2NoaWxkcmVuOltmLHcuanN4KE9zLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpofSldfSl9KSxnfHxtJiZ3LmpzeHMoImRpdiIse3JlZjpuLGNsYXNzTmFtZToicmVsYXRpdmUgaC1zY3JlZW4gYm9yZGVyLWwgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W3cuanN4cyhBcy5Db2x1bW4se2NoaWxkcmVuOltnLHcuanN4KE9zLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjptfSldfSksdy5qc3goImRpdiIse29uTW91c2VEb3duOnUoInJpZ2h0IiksY2xhc3NOYW1lOiJhYnNvbHV0ZSBpbnNldC15LTAgbGVmdC0wIGN1cnNvci1jb2wtcmVzaXplIHctWzFweF0gYmctYm9yZGVyIGhvdmVyOnctWzNweF0gaG92ZXI6YmctYm9yZGVyIn0pXX0pXX0pfUFzLkNvbHVtbj0oe2NoaWxkcmVuOmV9KT0+e2NvbnN0W3Qsbl09cC5DaGlsZHJlbi50b0FycmF5KGUpO3JldHVybiB3LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCIsY2hpbGRyZW46W3cuanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGJvcmRlci1iIGJvcmRlci1ib3JkZXIiLGNoaWxkcmVuOnR9KSxuXX0pfTtjb25zdCBKTj0oe2NsYXNzTmFtZTplfSk9PncuanN4cygic3ZnIix7d2lkdGg6IjEyIixoZWlnaHQ6IjEyIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjbGFzc05hbWU6ZSxjaGlsZHJlbjpbdy5qc3hzKCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyNV8xNjM4KSIsY2hpbGRyZW46W3cuanN4KCJyZWN0Iix7eToiMC41Iix3aWR0aDoiOSIsaGVpZ2h0OiI5In0pLHcuanN4KCJwYXRoIix7ZDoiTTAgN0w4LjUgNSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IifSksdy5qc3goImNpcmNsZSIse2N4OiIzIixjeToiMy41IixyOiIxIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSksdy5qc3goInJlY3QiLHt4OiIwLjUiLHk6IjEiLHdpZHRoOiI4IixoZWlnaHQ6IjgiLHN0cm9rZToiY3VycmVudENvbG9yIn0pLHcuanN4KCJkZWZzIix7Y2hpbGRyZW46dy5qc3goImNsaXBQYXRoIix7aWQ6ImNsaXAwXzEyMjVfMTYzOCIsY2hpbGRyZW46dy5qc3goInJlY3QiLHt5OiIwLjUiLHdpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIn0pfSl9KV19KSxQXz1KTixaTj0oe2NsYXNzTmFtZTplfSk9PncuanN4cygic3ZnIix7d2lkdGg6IjkiLGhlaWdodDoiMTAiLHZpZXdCb3g6IjAgMCA5IDEwIixjbGFzc05hbWU6ZSxmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46W3cuanN4cygiZyIse2NsaXBQYXRoOiJ1cmwoI2NsaXAwXzEyMjJfMTYxOCkiLGNoaWxkcmVuOlt3LmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCIsZDoiTTkgMS41SDBWMC41SDlWMS41WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLHcuanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNOSA5LjVIMFY4LjVIOVY5LjVaIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSksdy5qc3goImRlZnMiLHtjaGlsZHJlbjp3LmpzeCgiY2xpcFBhdGgiLHtpZDoiY2xpcDBfMTIyMl8xNjE4IixjaGlsZHJlbjp3LmpzeCgicmVjdCIse3dpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgwIDAuNSkifSl9KX0pXX0pLHFOPVpOLGViPSh7Y2xhc3NOYW1lOmV9KT0+dy5qc3goInN2ZyIse3dpZHRoOiI5IixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoiY3VycmVudENvbG9yIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTplLGNoaWxkcmVuOncuanN4KCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyOV8xNjI1KSIsY2hpbGRyZW46dy5qc3goInBhdGgiLHtkOiJNMC4wMTQ1NTEzIDAuNUg4Ljk4NTQ1TDkgMy4xODU2OUg4LjU3MDc0QzguNDMwMDcgMi4yMjc2IDguMDI3NDkgMS41Nzk0OCA3LjM2Mjk4IDEuMjQxMzNDNi45ODk0OSAxLjA1NDkxIDYuNDMxNjkgMC45NTMwMzUgNS42ODk1NyAwLjkzNTY5NFY3Ljk0NTgxQzUuNjg5NTcgOC40MzU2OSA1Ljc4NDE2IDguNzYwODQgNS45NzMzMiA4LjkyMTI0QzYuMTY3MzQgOS4wODE2NSA2LjU2NzUgOS4xNjE4NSA3LjE3MzgxIDkuMTYxODVWOS41SDEuODYyNTdWOS4xNjE4NUMyLjQ0NDYyIDkuMTYxODUgMi44MzAyMyA5LjA4MTY1IDMuMDE5NCA4LjkyMTI0QzMuMjEzNDIgOC43NTY1IDMuMzEwNDMgOC40MzEzNiAzLjMxMDQzIDcuOTQ1ODFWMC45MzU2OTRDMi41ODI4NiAwLjk1MzAzNSAyLjAyNTA2IDEuMDU0OTEgMS42MzcwMyAxLjI0MTMzQzAuOTI0MDEgMS41ODgxNSAwLjUyMTQyMyAyLjIzNjI3IDAuNDI5MjY0IDMuMTg1NjlIMEwwLjAxNDU1MTMgMC41WiJ9KX0pfSksdGI9ZWI7ZnVuY3Rpb24gT18oe2NoaWxkcmVuOmUscm9vdFBhdGg6dH0pe3JldHVybiB3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIHctZnVsbCBweS0yIHRleHQteHMiLGNoaWxkcmVuOnAuQ2hpbGRyZW4ubWFwKGUsbj0+cC5jbG9uZUVsZW1lbnQobix7cGF0aHM6W3RdfSkpfSl9T18uTm9kZT0oe2NoaWxkcmVuOmUscGF0aHM6dD1bXSxwYXRoOm4sbGV2ZWw6cj0xLHR5cGU6byxzZXRBY3RpdmVQYXRoOml9KT0+e2NvbnN0IGw9ciozMCxzPW89PT0ic3RyaW5nIj93LmpzeCh0Yix7fSk6bz09PSJpbWFnZSI/dy5qc3goUF8se2NsYXNzTmFtZToiaC1bOXB4XSB3LVs5cHhdIn0pOncuanN4KHFOLHt9KTtyZXR1cm4gdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCIsY2hpbGRyZW46W3cuanN4KCJidXR0b24iLHtjbGFzc05hbWU6ImZsZXgganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBncm91cCBweS0yIHRleHQteHMgZm9udC1bNDAwXSBzaHJpbmstMCIsb25DbGljazooKT0+e2kmJmkobil9LHN0eWxlOntwYWRkaW5nTGVmdDpsfSxjaGlsZHJlbjp3LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltzLHcuanN4KCJwIix7Y2hpbGRyZW46bn0pXX0pfSksZSYmdy5qc3gody5GcmFnbWVudCx7Y2hpbGRyZW46cC5DaGlsZHJlbi5tYXAoZSxhPT5wLmNsb25lRWxlbWVudChhLHtsZXZlbDpyKzEscGF0aHM6Wy4uLnQsbl19KSl9KV19KX07dmFyIGxuPXt9LEQ9e307bGV0IGxkPXt9LEFfPXt9LGNhPXt9LE1zPXt9LExoPXt9LGNsPXt9LFJnPXt9LEloPXt9LGRhPXt9LGZhPXt9LGdvPXt9LFBnPXt9LE9nPXt9LE1fPXt9LERfPXt9LExfPXt9LElfPXt9LGpfPXt9LHpfPXt9LEZfPXt9LHBjPXt9LEJfPXt9LFdfPXt9LFVfPXt9LFZfPXt9LEhfPXt9LEtfPXt9LEdfPXt9LFlfPXt9LFhfPXt9LEFnPXt9LE1nPXt9LGpoPXt9LFFfPXt9LEpfPXt9LFpfPXt9O2Z1bmN0aW9uIFUoZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWxldCBHcj10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIsbmI9R3ImJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQ/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOm51bGwsV3Q9R3ImJi9NYWN8aVBvZHxpUGhvbmV8aVBhZC8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pLGJvPUdyJiYvXig/IS4qU2VhbW9ua2V5KSg/PS4qRmlyZWZveCkuKi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksZ2M9R3ImJiJJbnB1dEV2ZW50ImluIHdpbmRvdyYmIW5iPyJnZXRUYXJnZXRSYW5nZXMiaW4gbmV3IHdpbmRvdy5JbnB1dEV2ZW50KCJpbnB1dCIpOiExLERnPUdyJiYvVmVyc2lvblwvW1xkLl0rLipTYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksc2Q9R3ImJi9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhd2luZG93Lk1TU3RyZWFtLHJiPUdyJiYvXig/PS4qQ2hyb21lKS4qL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxMZz1HciYmL0FwcGxlV2ViS2l0XC9bXGQuXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFyYixhZD1EZ3x8c2R8fExnPyLCoCI6IuKAiyIsb2I9Ym8/IsKgIjphZCxpYj0vXlteQS1aYS16XHUwMGMwLVx1MDBkNlx1MDBkOC1cdTAwZjZcdTAwZjgtXHUwMmI4XHUwMzAwLVx1MDU5MFx1MDgwMC1cdTFmZmZcdTIwMGVcdTJjMDAtXHVmYjFjXHVmZTAwLVx1ZmU2Zlx1ZmVmZC1cdWZmZmZdKltcdTA1OTEtXHUwN2ZmXHVmYjFkLVx1ZmRmZFx1ZmU3MC1cdWZlZmNdLyxsYj0vXlteXHUwNTkxLVx1MDdmZlx1ZmIxZC1cdWZkZmRcdWZlNzAtXHVmZWZjXSpbQS1aYS16XHUwMGMwLVx1MDBkNlx1MDBkOC1cdTAwZjZcdTAwZjgtXHUwMmI4XHUwMzAwLVx1MDU5MFx1MDgwMC1cdTFmZmZcdTIwMGVcdTJjMDAtXHVmYjFjXHVmZTAwLVx1ZmU2Zlx1ZmVmZC1cdWZmZmZdLyxvaT17Ym9sZDoxLGNvZGU6MTYsaGlnaGxpZ2h0OjEyOCxpdGFsaWM6MixzdHJpa2V0aHJvdWdoOjQsc3Vic2NyaXB0OjMyLHN1cGVyc2NyaXB0OjY0LHVuZGVybGluZTo4fSxzYj17ZGlyZWN0aW9ubGVzczoxLHVubWVyZ2VhYmxlOjJ9LG55PXtjZW50ZXI6MixlbmQ6NixqdXN0aWZ5OjQsbGVmdDoxLHJpZ2h0OjMsc3RhcnQ6NX0sYWI9ezI6ImNlbnRlciIsNjoiZW5kIiw0OiJqdXN0aWZ5IiwxOiJsZWZ0IiwzOiJyaWdodCIsNToic3RhcnQifSx1Yj17bm9ybWFsOjAsc2VnbWVudGVkOjIsdG9rZW46MX0sY2I9ezA6Im5vcm1hbCIsMjoic2VnbWVudGVkIiwxOiJ0b2tlbiJ9LHpoPSExLElnPTA7ZnVuY3Rpb24gZGIoZSl7SWc9ZS50aW1lU3RhbXB9ZnVuY3Rpb24gZmYoZSx0LG4pe3JldHVybiB0Ll9fbGV4aWNhbExpbmVCcmVhaz09PWV8fGVbYF9fbGV4aWNhbEtleV8ke24uX2tleX1gXSE9PXZvaWQgMH1mdW5jdGlvbiBmYihlKXtyZXR1cm4gZS5nZXRFZGl0b3JTdGF0ZSgpLnJlYWQoKCk9PntsZXQgdD1LZSgpO3JldHVybiB0IT09bnVsbD90LmNsb25lKCk6bnVsbH0pfWZ1bmN0aW9uIHFfKGUsdCxuKXt6aD0hMDtsZXQgcj0xMDA8cGVyZm9ybWFuY2Uubm93KCktSWc7dHJ5e2tuKGUsKCk9PntsZXQgbz1LZSgpfHxmYihlKTt2YXIgaT1uZXcgTWFwLGw9ZS5nZXRSb290RWxlbWVudCgpLHM9ZS5fZWRpdG9yU3RhdGUsYT1lLl9ibG9ja0N1cnNvckVsZW1lbnQ7bGV0IHU9ITEsYz0iIjtmb3IodmFyIGQ9MDtkPHQubGVuZ3RoO2QrKyl7dmFyIGY9dFtkXSxoPWYudHlwZSxnPWYudGFyZ2V0LG09TWEoZyxzKTtpZighKG09PT1udWxsJiZnIT09bHx8VmUobSkpKXtpZihoPT09ImNoYXJhY3RlckRhdGEiKXtpZihmPXImJlEobSkpZTp7Zj1vLGg9Zzt2YXIgUz1tO2lmKGRlKGYpKXt2YXIgdj1mLmFuY2hvci5nZXROb2RlKCk7aWYodi5pcyhTKSYmZi5mb3JtYXQhPT12LmdldEZvcm1hdCgpKXtmPSExO2JyZWFrIGV9fWY9aC5ub2RlVHlwZT09PTMmJlMuaXNBdHRhY2hlZCgpfWYmJihTPUVyKGUuX3dpbmRvdyksaD1mPW51bGwsUyE9PW51bGwmJlMuYW5jaG9yTm9kZT09PWcmJihmPVMuYW5jaG9yT2Zmc2V0LGg9Uy5mb2N1c09mZnNldCksZz1nLm5vZGVWYWx1ZSxnIT09bnVsbCYmVWcobSxnLGYsaCwhMSkpfWVsc2UgaWYoaD09PSJjaGlsZExpc3QiKXtmb3IodT0hMCxoPWYuYWRkZWROb2RlcyxTPTA7UzxoLmxlbmd0aDtTKyspe3Y9aFtTXTt2YXIgeT1sdyh2KSx4PXYucGFyZW50Tm9kZTt4PT1udWxsfHx2PT09YXx8eSE9PW51bGx8fHYubm9kZU5hbWU9PT0iQlIiJiZmZih2LHgsZSl8fChibyYmKHk9di5pbm5lclRleHR8fHYubm9kZVZhbHVlKSYmKGMrPXkpLHgucmVtb3ZlQ2hpbGQodikpfWlmKGY9Zi5yZW1vdmVkTm9kZXMsaD1mLmxlbmd0aCwwPGgpe2ZvcihTPTAsdj0wO3Y8aDt2KyspeD1mW3ZdLCh4Lm5vZGVOYW1lPT09IkJSIiYmZmYoeCxnLGUpfHxhPT09eCkmJihnLmFwcGVuZENoaWxkKHgpLFMrKyk7aCE9PVMmJihnPT09bCYmKG09cy5fbm9kZU1hcC5nZXQoInJvb3QiKSksaS5zZXQoZyxtKSl9fX19aWYoMDxpLnNpemUpZm9yKGxldFtfLEVdb2YgaSlpZihCKEUpKWZvcihpPUUuZ2V0Q2hpbGRyZW5LZXlzKCksbD1fLmZpcnN0Q2hpbGQscz0wO3M8aS5sZW5ndGg7cysrKWE9ZS5nZXRFbGVtZW50QnlLZXkoaVtzXSksYSE9PW51bGwmJihsPT1udWxsPyhfLmFwcGVuZENoaWxkKGEpLGw9YSk6bCE9PWEmJl8ucmVwbGFjZUNoaWxkKGEsbCksbD1sLm5leHRTaWJsaW5nKTtlbHNlIFEoRSkmJkUubWFya0RpcnR5KCk7aWYoaT1uLnRha2VSZWNvcmRzKCksMDxpLmxlbmd0aCl7Zm9yKGw9MDtsPGkubGVuZ3RoO2wrKylmb3IoYT1pW2xdLHM9YS5hZGRlZE5vZGVzLGE9YS50YXJnZXQsZD0wO2Q8cy5sZW5ndGg7ZCsrKW09c1tkXSxnPW0ucGFyZW50Tm9kZSxnPT1udWxsfHxtLm5vZGVOYW1lIT09IkJSInx8ZmYobSxhLGUpfHxnLnJlbW92ZUNoaWxkKG0pO24udGFrZVJlY29yZHMoKX1vIT09bnVsbCYmKHUmJihvLmRpcnR5PSEwLHZyKG8pKSxibyYmY3coZSkmJm8uaW5zZXJ0UmF3VGV4dChjKSl9KX1maW5hbGx5e3poPSExfX1mdW5jdGlvbiBldyhlKXtsZXQgdD1lLl9vYnNlcnZlcjtpZih0IT09bnVsbCl7bGV0IG49dC50YWtlUmVjb3JkcygpO3FfKGUsbix0KX19ZnVuY3Rpb24gdHcoZSl7SWc9PT0wJiZjZChlKS5hZGRFdmVudExpc3RlbmVyKCJ0ZXh0SW5wdXQiLGRiLCEwKSxlLl9vYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcigodCxuKT0+e3FfKGUsdCxuKX0pfWZ1bmN0aW9uIHJ5KGUsdCl7bGV0IG49ZS5fX21vZGUscj1lLl9fZm9ybWF0O2U9ZS5fX3N0eWxlO2xldCBvPXQuX19tb2RlLGk9dC5fX2Zvcm1hdDtyZXR1cm4gdD10Ll9fc3R5bGUsKG49PT1udWxsfHxuPT09bykmJihyPT09bnVsbHx8cj09PWkpJiYoZT09PW51bGx8fGU9PT10KX1mdW5jdGlvbiBveShlLHQpe2xldCBuPWUubWVyZ2VXaXRoU2libGluZyh0KSxyPWV0KCkuX25vcm1hbGl6ZWROb2RlcztyZXR1cm4gci5hZGQoZS5fX2tleSksci5hZGQodC5fX2tleSksbn1mdW5jdGlvbiBudyhlKXtpZihlLl9fdGV4dD09PSIiJiZlLmlzU2ltcGxlVGV4dCgpJiYhZS5pc1VubWVyZ2VhYmxlKCkpZS5yZW1vdmUoKTtlbHNle2Zvcih2YXIgdDsodD1lLmdldFByZXZpb3VzU2libGluZygpKSE9PW51bGwmJlEodCkmJnQuaXNTaW1wbGVUZXh0KCkmJiF0LmlzVW5tZXJnZWFibGUoKTspaWYodC5fX3RleHQ9PT0iIil0LnJlbW92ZSgpO2Vsc2V7cnkodCxlKSYmKGU9b3kodCxlKSk7YnJlYWt9Zm9yKHZhciBuOyhuPWUuZ2V0TmV4dFNpYmxpbmcoKSkhPT1udWxsJiZRKG4pJiZuLmlzU2ltcGxlVGV4dCgpJiYhbi5pc1VubWVyZ2VhYmxlKCk7KWlmKG4uX190ZXh0PT09IiIpbi5yZW1vdmUoKTtlbHNle3J5KGUsbikmJm95KGUsbik7YnJlYWt9fX1mdW5jdGlvbiBqZyhlKXtyZXR1cm4gaXkoZS5hbmNob3IpLGl5KGUuZm9jdXMpLGV9ZnVuY3Rpb24gaXkoZSl7Zm9yKDtlLnR5cGU9PT0iZWxlbWVudCI7KXt2YXIgdD1lLmdldE5vZGUoKSxuPWUub2Zmc2V0O2lmKG49PT10LmdldENoaWxkcmVuU2l6ZSgpPyh0PXQuZ2V0Q2hpbGRBdEluZGV4KG4tMSksbj0hMCk6KHQ9dC5nZXRDaGlsZEF0SW5kZXgobiksbj0hMSksUSh0KSl7ZS5zZXQodC5fX2tleSxuP3QuZ2V0VGV4dENvbnRlbnRTaXplKCk6MCwidGV4dCIpO2JyZWFrfWVsc2UgaWYoIUIodCkpYnJlYWs7ZS5zZXQodC5fX2tleSxuP3QuZ2V0Q2hpbGRyZW5TaXplKCk6MCwiZWxlbWVudCIpfX1sZXQgaGI9MSxwYj10eXBlb2YgcXVldWVNaWNyb3Rhc2s9PSJmdW5jdGlvbiI/cXVldWVNaWNyb3Rhc2s6ZT0+e1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oZSl9O2Z1bmN0aW9uIHpnKGUpe2xldCB0PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYodD09PW51bGwpcmV0dXJuITE7bGV0IG49dC5ub2RlTmFtZTtyZXR1cm4gVmUoTWEoZSkpJiYobj09PSJJTlBVVCJ8fG49PT0iVEVYVEFSRUEifHx0LmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIiYmdC5fX2xleGljYWxFZGl0b3I9PW51bGwpfWZ1bmN0aW9uIEFhKGUsdCxuKXtsZXQgcj1lLmdldFJvb3RFbGVtZW50KCk7dHJ5e3JldHVybiByIT09bnVsbCYmci5jb250YWlucyh0KSYmci5jb250YWlucyhuKSYmdCE9PW51bGwmJiF6Zyh0KSYmRmcodCk9PT1lfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBGZyhlKXtmb3IoO2UhPW51bGw7KXtsZXQgdD1lLl9fbGV4aWNhbEVkaXRvcjtpZih0IT1udWxsKXJldHVybiB0O2U9dWQoZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gRmgoZSl7cmV0dXJuIGUuaXNUb2tlbigpfHxlLmlzU2VnbWVudGVkKCl9ZnVuY3Rpb24gbWMoZSl7Zm9yKDtlIT1udWxsOyl7aWYoZS5ub2RlVHlwZT09PTMpcmV0dXJuIGU7ZT1lLmZpcnN0Q2hpbGR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gcncoZSx0LG4pe3JldHVybiB0PW9pW3RdLGUmdCYmKG49PT1udWxsfHwhKG4mdCkpP2VedDpuPT09bnVsbHx8biZ0P2V8dDplfWZ1bmN0aW9uIG93KGUpe3JldHVybiBRKGUpfHxtYShlKXx8VmUoZSl9ZnVuY3Rpb24gaXcoZSx0KXtpZih0IT1udWxsKWUuX19rZXk9dDtlbHNle0p0KCksOTk8dmEmJlUoMTQpLHQ9ZXQoKTt2YXIgbj1DcigpLHI9IiIraGIrKztuLl9ub2RlTWFwLnNldChyLGUpLEIoZSk/dC5fZGlydHlFbGVtZW50cy5zZXQociwhMCk6dC5fZGlydHlMZWF2ZXMuYWRkKHIpLHQuX2Nsb25lTm90TmVlZGVkLmFkZChyKSx0Ll9kaXJ0eVR5cGU9MSxlLl9fa2V5PXJ9fWZ1bmN0aW9uIGlpKGUpe3ZhciB0PWUuZ2V0UGFyZW50KCk7aWYodCE9PW51bGwpe2xldCBvPWUuZ2V0V3JpdGFibGUoKTt0PXQuZ2V0V3JpdGFibGUoKTt2YXIgbj1lLmdldFByZXZpb3VzU2libGluZygpO2lmKGU9ZS5nZXROZXh0U2libGluZygpLG49PT1udWxsKWlmKGUhPT1udWxsKXt2YXIgcj1lLmdldFdyaXRhYmxlKCk7dC5fX2ZpcnN0PWUuX19rZXksci5fX3ByZXY9bnVsbH1lbHNlIHQuX19maXJzdD1udWxsO2Vsc2V7aWYocj1uLmdldFdyaXRhYmxlKCksZSE9PW51bGwpe2xldCBpPWUuZ2V0V3JpdGFibGUoKTtpLl9fcHJldj1yLl9fa2V5LHIuX19uZXh0PWkuX19rZXl9ZWxzZSByLl9fbmV4dD1udWxsO28uX19wcmV2PW51bGx9ZT09PW51bGw/biE9PW51bGw/KGU9bi5nZXRXcml0YWJsZSgpLHQuX19sYXN0PW4uX19rZXksZS5fX25leHQ9bnVsbCk6dC5fX2xhc3Q9bnVsbDooZT1lLmdldFdyaXRhYmxlKCksbiE9PW51bGw/KG49bi5nZXRXcml0YWJsZSgpLG4uX19uZXh0PWUuX19rZXksZS5fX3ByZXY9bi5fX2tleSk6ZS5fX3ByZXY9bnVsbCxvLl9fbmV4dD1udWxsKSx0Ll9fc2l6ZS0tLG8uX19wYXJlbnQ9bnVsbH19ZnVuY3Rpb24gdmMoZSl7OTk8dmEmJlUoMTQpO3ZhciB0PWUuZ2V0TGF0ZXN0KCksbj10Ll9fcGFyZW50LHI9Q3IoKTtsZXQgbz1ldCgpLGk9ci5fbm9kZU1hcDtpZihyPW8uX2RpcnR5RWxlbWVudHMsbiE9PW51bGwpZTpmb3IoO24hPT1udWxsOyl7aWYoci5oYXMobikpYnJlYWsgZTtsZXQgbD1pLmdldChuKTtpZihsPT09dm9pZCAwKWJyZWFrO3Iuc2V0KG4sITEpLG49bC5fX3BhcmVudH10PXQuX19rZXksby5fZGlydHlUeXBlPTEsQihlKT9yLnNldCh0LCEwKTpvLl9kaXJ0eUxlYXZlcy5hZGQodCl9ZnVuY3Rpb24gTXQoZSl7SnQoKTt2YXIgdD1ldCgpO2xldCBuPXQuX2NvbXBvc2l0aW9uS2V5O2UhPT1uJiYodC5fY29tcG9zaXRpb25LZXk9ZSxuIT09bnVsbCYmKHQ9JHQobiksdCE9PW51bGwmJnQuZ2V0V3JpdGFibGUoKSksZSE9PW51bGwmJihlPSR0KGUpLGUhPT1udWxsJiZlLmdldFdyaXRhYmxlKCkpKX1mdW5jdGlvbiBtbygpe3JldHVybiBCbCgpP251bGw6ZXQoKS5fY29tcG9zaXRpb25LZXl9ZnVuY3Rpb24gJHQoZSx0KXtyZXR1cm4gZT0odHx8Q3IoKSkuX25vZGVNYXAuZ2V0KGUpLGU9PT12b2lkIDA/bnVsbDplfWZ1bmN0aW9uIGx3KGUsdCl7bGV0IG49ZXQoKTtyZXR1cm4gZT1lW2BfX2xleGljYWxLZXlfJHtuLl9rZXl9YF0sZSE9PXZvaWQgMD8kdChlLHQpOm51bGx9ZnVuY3Rpb24gTWEoZSx0KXtmb3IoO2UhPW51bGw7KXtsZXQgbj1sdyhlLHQpO2lmKG4hPT1udWxsKXJldHVybiBuO2U9dWQoZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gc3coZSl7bGV0IHQ9T2JqZWN0LmFzc2lnbih7fSxlLl9kZWNvcmF0b3JzKTtyZXR1cm4gZS5fcGVuZGluZ0RlY29yYXRvcnM9dH1mdW5jdGlvbiBseShlKXtyZXR1cm4gZS5yZWFkKCgpPT5TcigpLmdldFRleHRDb250ZW50KCkpfWZ1bmN0aW9uIGdiKGUsdCl7a24oZSwoKT0+e3ZhciBuPUNyKCk7aWYoIW4uaXNFbXB0eSgpKWlmKHQ9PT0icm9vdCIpU3IoKS5tYXJrRGlydHkoKTtlbHNle249bi5fbm9kZU1hcDtmb3IobGV0WyxyXW9mIG4pci5tYXJrRGlydHkoKX19LGUuX3BlbmRpbmdFZGl0b3JTdGF0ZT09PW51bGw/e3RhZzoiaGlzdG9yeS1tZXJnZSJ9OnZvaWQgMCl9ZnVuY3Rpb24gU3IoKXtyZXR1cm4gQ3IoKS5fbm9kZU1hcC5nZXQoInJvb3QiKX1mdW5jdGlvbiB2cihlKXtKdCgpO2xldCB0PUNyKCk7ZSE9PW51bGwmJihlLmRpcnR5PSEwLGUuX2NhY2hlZE5vZGVzPW51bGwpLHQuX3NlbGVjdGlvbj1lfWZ1bmN0aW9uIGVsKGUpe3ZhciB0PWV0KCksbjtlOntmb3Iobj1lO24hPW51bGw7KXtsZXQgcj1uW2BfX2xleGljYWxLZXlfJHt0Ll9rZXl9YF07aWYociE9PXZvaWQgMCl7bj1yO2JyZWFrIGV9bj11ZChuKX1uPW51bGx9cmV0dXJuIG49PT1udWxsPyh0PXQuZ2V0Um9vdEVsZW1lbnQoKSxlPT09dD8kdCgicm9vdCIpOm51bGwpOiR0KG4pfWZ1bmN0aW9uIGF3KGUpe3JldHVybi9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0vZy50ZXN0KGUpfWZ1bmN0aW9uIEJnKGUpe2xldCB0PVtdO2Zvcig7ZSE9PW51bGw7KXQucHVzaChlKSxlPWUuX3BhcmVudEVkaXRvcjtyZXR1cm4gdH1mdW5jdGlvbiB1dygpe3JldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKC9bXmEtel0rL2csIiIpLnN1YnN0cigwLDUpfWZ1bmN0aW9uIFdnKGUsdCxuKXtpZih0PUVyKHQuX3dpbmRvdyksdCE9PW51bGwpe3ZhciByPXQuYW5jaG9yTm9kZSx7YW5jaG9yT2Zmc2V0Om8sZm9jdXNPZmZzZXQ6aX09dDtpZihyIT09bnVsbCYmKHQ9ci5ub2RlVHlwZT09PTM/ci5ub2RlVmFsdWU6bnVsbCxyPU1hKHIpLHQhPT1udWxsJiZRKHIpKSl7aWYodD09PWFkJiZuKXtsZXQgbD1uLmxlbmd0aDt0PW4saT1vPWx9dCE9PW51bGwmJlVnKHIsdCxvLGksZSl9fX1mdW5jdGlvbiBVZyhlLHQsbixyLG8pe2xldCBpPWU7aWYoaS5pc0F0dGFjaGVkKCkmJihvfHwhaS5pc0RpcnR5KCkpKXtsZXQgdT1pLmlzQ29tcG9zaW5nKCksYz10O2lmKCh1fHxvKSYmdFt0Lmxlbmd0aC0xXT09PWFkJiYoYz10LnNsaWNlKDAsLTEpKSx0PWkuZ2V0VGV4dENvbnRlbnQoKSxvfHxjIT09dClpZihjPT09IiIpaWYoTXQobnVsbCksRGd8fHNkfHxMZylpLnJlbW92ZSgpO2Vsc2V7bGV0IGQ9ZXQoKTtzZXRUaW1lb3V0KCgpPT57ZC51cGRhdGUoKCk9PntpLmlzQXR0YWNoZWQoKSYmaS5yZW1vdmUoKX0pfSwyMCl9ZWxzZXtvPWkuZ2V0UGFyZW50KCksdD1GbCgpO3ZhciBsPWkuZ2V0VGV4dENvbnRlbnRTaXplKCkscz1tbygpLGE9aS5nZXRLZXkoKTtpLmlzVG9rZW4oKXx8cyE9PW51bGwmJmE9PT1zJiYhdXx8ZGUodCkmJihvIT09bnVsbCYmIW8uY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZ0LmFuY2hvci5vZmZzZXQ9PT0wfHx0LmFuY2hvci5rZXk9PT1lLl9fa2V5JiZ0LmFuY2hvci5vZmZzZXQ9PT0wJiYhaS5jYW5JbnNlcnRUZXh0QmVmb3JlKCl8fHQuZm9jdXMua2V5PT09ZS5fX2tleSYmdC5mb2N1cy5vZmZzZXQ9PT1sJiYhaS5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSk/aS5tYXJrRGlydHkoKTooZT1LZSgpLGRlKGUpJiZuIT09bnVsbCYmciE9PW51bGwmJihlLnNldFRleHROb2RlUmFuZ2UoaSxuLGksciksaS5pc1NlZ21lbnRlZCgpJiYobj1pLmdldFRleHRDb250ZW50KCksbj1FdChuKSxpLnJlcGxhY2UobiksaT1uKSksaS5zZXRUZXh0Q29udGVudChjKSl9fX1mdW5jdGlvbiBtYihlLHQpe2lmKHQuaXNTZWdtZW50ZWQoKSlyZXR1cm4hMDtpZighZS5pc0NvbGxhcHNlZCgpKXJldHVybiExO2U9ZS5hbmNob3Iub2Zmc2V0O2xldCBuPXQuZ2V0UGFyZW50T3JUaHJvdygpLHI9dC5pc1Rva2VuKCk7cmV0dXJuIGU9PT0wPygoZT0hdC5jYW5JbnNlcnRUZXh0QmVmb3JlKCl8fCFuLmNhbkluc2VydFRleHRCZWZvcmUoKXx8cil8fCh0PXQuZ2V0UHJldmlvdXNTaWJsaW5nKCksZT0oUSh0KXx8Qih0KSYmdC5pc0lubGluZSgpKSYmIXQuY2FuSW5zZXJ0VGV4dEFmdGVyKCkpLGUpOmU9PT10LmdldFRleHRDb250ZW50U2l6ZSgpPyF0LmNhbkluc2VydFRleHRBZnRlcigpfHwhbi5jYW5JbnNlcnRUZXh0QWZ0ZXIoKXx8cjohMX1mdW5jdGlvbiBEcyhlLHQpe2UuX19sZXhpY2FsQ2xhc3NOYW1lQ2FjaGU9PT12b2lkIDAmJihlLl9fbGV4aWNhbENsYXNzTmFtZUNhY2hlPXt9KTtsZXQgbj1lLl9fbGV4aWNhbENsYXNzTmFtZUNhY2hlLHI9blt0XTtyZXR1cm4gciE9PXZvaWQgMD9yOihlPWVbdF0sdHlwZW9mIGU9PSJzdHJpbmciPyhlPWUuc3BsaXQoIiAiKSxuW3RdPWUpOmUpfWZ1bmN0aW9uIFZnKGUsdCxuLHIsbyl7bi5zaXplIT09MCYmKG49ci5fX3R5cGUscj1yLl9fa2V5LHQ9dC5nZXQobiksdD09PXZvaWQgMCYmVSgzMyxuKSxuPXQua2xhc3MsdD1lLmdldChuKSx0PT09dm9pZCAwJiYodD1uZXcgTWFwLGUuc2V0KG4sdCkpLGU9dC5nZXQociksbj1lPT09ImRlc3Ryb3llZCImJm89PT0iY3JlYXRlZCIsKGU9PT12b2lkIDB8fG4pJiZ0LnNldChyLG4/InVwZGF0ZWQiOm8pKX1mdW5jdGlvbiBzeShlLHQsbil7bGV0IHI9ZS5nZXRQYXJlbnQoKSxvPW47cmV0dXJuIHIhPT1udWxsJiYodCYmbj09PTA/KG89ZS5nZXRJbmRleFdpdGhpblBhcmVudCgpLGU9cik6dHx8biE9PWUuZ2V0Q2hpbGRyZW5TaXplKCl8fChvPWUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLGU9cikpLGUuZ2V0Q2hpbGRBdEluZGV4KHQ/by0xOm8pfWZ1bmN0aW9uIEJoKGUsdCl7dmFyIG49ZS5vZmZzZXQ7cmV0dXJuIGUudHlwZT09PSJlbGVtZW50Ij8oZT1lLmdldE5vZGUoKSxzeShlLHQsbikpOihlPWUuZ2V0Tm9kZSgpLHQmJm49PT0wfHwhdCYmbj09PWUuZ2V0VGV4dENvbnRlbnRTaXplKCk/KG49dD9lLmdldFByZXZpb3VzU2libGluZygpOmUuZ2V0TmV4dFNpYmxpbmcoKSxuPT09bnVsbD9zeShlLmdldFBhcmVudE9yVGhyb3coKSx0LGUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsodD8wOjEpKTpuKTpudWxsKX1mdW5jdGlvbiBjdyhlKXtyZXR1cm4gZT0oZT1jZChlKS5ldmVudCkmJmUuaW5wdXRUeXBlLGU9PT0iaW5zZXJ0RnJvbVBhc3RlInx8ZT09PSJpbnNlcnRGcm9tUGFzdGVBc1F1b3RhdGlvbiJ9ZnVuY3Rpb24geWMoZSl7cmV0dXJuIXF0KGUpJiYhZS5pc0xhc3RDaGlsZCgpJiYhZS5pc0lubGluZSgpfWZ1bmN0aW9uIHhjKGUsdCl7cmV0dXJuIGU9ZS5fa2V5VG9ET01NYXAuZ2V0KHQpLGU9PT12b2lkIDAmJlUoNzUsdCksZX1mdW5jdGlvbiB1ZChlKXtyZXR1cm4gZT1lLmFzc2lnbmVkU2xvdHx8ZS5wYXJlbnRFbGVtZW50LGUhPT1udWxsJiZlLm5vZGVUeXBlPT09MTE/ZS5ob3N0OmV9ZnVuY3Rpb24gX2MoZSx0KXtmb3IoZT1lLmdldFBhcmVudCgpO2UhPT1udWxsOyl7aWYoZS5pcyh0KSlyZXR1cm4hMDtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuITF9ZnVuY3Rpb24gY2QoZSl7cmV0dXJuIGU9ZS5fd2luZG93LGU9PT1udWxsJiZVKDc4KSxlfWZ1bmN0aW9uIGR3KGUpe2ZvcihlPWUuZ2V0UGFyZW50T3JUaHJvdygpO2UhPT1udWxsJiYhSm4oZSk7KWU9ZS5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIGV9ZnVuY3Rpb24gSm4oZSl7cmV0dXJuIHF0KGUpfHxCKGUpJiZlLmlzU2hhZG93Um9vdCgpfWZ1bmN0aW9uIGZ3KGUpe3JldHVybiBlPWUuY29uc3RydWN0b3IuY2xvbmUoZSksaXcoZSxudWxsKSxlfWZ1bmN0aW9uIERhKGUpe3ZhciB0PWV0KCk7bGV0IG49ZS5jb25zdHJ1Y3Rvci5nZXRUeXBlKCk7cmV0dXJuIHQ9dC5fbm9kZXMuZ2V0KG4pLHQ9PT12b2lkIDAmJlUoOTcpLHQ9dC5yZXBsYWNlLHQhPT1udWxsPyh0PXQoZSksdCBpbnN0YW5jZW9mIGUuY29uc3RydWN0b3J8fFUoOTgpLHQpOmV9ZnVuY3Rpb24gaGYoZSx0KXtlPWUuZ2V0UGFyZW50KCksIXF0KGUpfHxCKHQpfHxWZSh0KXx8VSg5OSl9ZnVuY3Rpb24gcGYoZSl7cmV0dXJuKFZlKGUpfHxCKGUpJiYhZS5jYW5CZUVtcHR5KCkpJiYhZS5pc0lubGluZSgpfWZ1bmN0aW9uIFdoKGUsdCxuKXtuLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJjYXJldC1jb2xvciIpLHQuX2Jsb2NrQ3Vyc29yRWxlbWVudD1udWxsLHQ9ZS5wYXJlbnRFbGVtZW50LHQhPT1udWxsJiZ0LnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIEVyKGUpe3JldHVybiBHcj8oZXx8d2luZG93KS5nZXRTZWxlY3Rpb24oKTpudWxsfWZ1bmN0aW9uIGh3KGUsdCl7bGV0IG49ZS5nZXRDaGlsZEF0SW5kZXgodCk7bj09bnVsbCYmKG49ZSksSm4oZSkmJlUoMTAyKTtsZXQgcj1sPT57Y29uc3Qgcz1sLmdldFBhcmVudE9yVGhyb3coKSxhPUpuKHMpLHU9bCE9PW58fGE/ZncobCk6bDtpZihhKXJldHVybiBsLmluc2VydEFmdGVyKHUpLFtsLHUsdV07Y29uc3RbYyxkLGZdPXIocyk7cmV0dXJuIGw9bC5nZXROZXh0U2libGluZ3MoKSxmLmFwcGVuZCh1LC4uLmwpLFtjLGQsdV19LFtvLGldPXIobik7cmV0dXJuW28saV19ZnVuY3Rpb24gd2MoZSx0KXtmb3IoO2UhPT1TcigpJiZlIT1udWxsOyl7aWYodChlKSlyZXR1cm4gZTtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdmIoZSl7bGV0IHQ9W10sbj1bZV07Zm9yKDswPG4ubGVuZ3RoOyl7bGV0IHI9bi5wb3AoKTtyPT09dm9pZCAwJiZVKDExMiksQihyKSYmbi51bnNoaWZ0KC4uLnIuZ2V0Q2hpbGRyZW4oKSksciE9PWUmJnQucHVzaChyKX1yZXR1cm4gdH1mdW5jdGlvbiBkZChlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTF9ZnVuY3Rpb24gcHcoZSx0LG4scixvLGkpe2ZvcihlPWUuZ2V0Rmlyc3RDaGlsZCgpO2UhPT1udWxsOyl7bGV0IGw9ZS5fX2tleTtlLl9fcGFyZW50PT09dCYmKEIoZSkmJnB3KGUsbCxuLHIsbyxpKSxuLmhhcyhsKXx8aS5kZWxldGUobCksby5wdXNoKGwpKSxlPWUuZ2V0TmV4dFNpYmxpbmcoKX19ZnVuY3Rpb24geWIoZSx0LG4scil7ZT1lLl9ub2RlTWFwLHQ9dC5fbm9kZU1hcDtsZXQgbz1bXTtmb3IobGV0W2ldb2Ygcil7bGV0IGw9dC5nZXQoaSk7bD09PXZvaWQgMHx8bC5pc0F0dGFjaGVkKCl8fChCKGwpJiZwdyhsLGksZSx0LG8sciksZS5oYXMoaSl8fHIuZGVsZXRlKGkpLG8ucHVzaChpKSl9Zm9yKGxldCBpIG9mIG8pdC5kZWxldGUoaSk7Zm9yKGxldCBpIG9mIG4pcj10LmdldChpKSxyPT09dm9pZCAwfHxyLmlzQXR0YWNoZWQoKXx8KGUuaGFzKGkpfHxuLmRlbGV0ZShpKSx0LmRlbGV0ZShpKSl9bGV0IGd0PSIiLFF0PSIiLE9yPSIiLFJvLEh0LGhhLGd3PSExLEhnPSExLGZkLER1PW51bGwsVWgsVmgsZmksUG8sSGgscGE7ZnVuY3Rpb24gTHUoZSx0KXtsZXQgbj1maS5nZXQoZSk7aWYodCE9PW51bGwpe2xldCByPVloKGUpO3IucGFyZW50Tm9kZT09PXQmJnQucmVtb3ZlQ2hpbGQocil9UG8uaGFzKGUpfHxIdC5fa2V5VG9ET01NYXAuZGVsZXRlKGUpLEIobikmJihlPVNjKG4sZmkpLEtoKGUsMCxlLmxlbmd0aC0xLG51bGwpKSxuIT09dm9pZCAwJiZWZyhwYSxoYSxmZCxuLCJkZXN0cm95ZWQiKX1mdW5jdGlvbiBLaChlLHQsbixyKXtmb3IoO3Q8PW47Kyt0KXtsZXQgbz1lW3RdO28hPT12b2lkIDAmJkx1KG8scil9fWZ1bmN0aW9uIEhvKGUsdCl7ZS5zZXRQcm9wZXJ0eSgidGV4dC1hbGlnbiIsdCl9ZnVuY3Rpb24gbXcoZSx0KXt2YXIgbj1Sby50aGVtZS5pbmRlbnQ7aWYodHlwZW9mIG49PSJzdHJpbmciKXtsZXQgcj1lLmNsYXNzTGlzdC5jb250YWlucyhuKTswPHQmJiFyP2UuY2xhc3NMaXN0LmFkZChuKToxPnQmJnImJmUuY2xhc3NMaXN0LnJlbW92ZShuKX1uPWdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgiLS1sZXhpY2FsLWluZGVudC1iYXNlLXZhbHVlIil8fCI0MHB4IixlLnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLWlubGluZS1zdGFydCIsdD09PTA/IiI6YGNhbGMoJHt0fSAqICR7bn0pYCl9ZnVuY3Rpb24gdncoZSx0KXtlPWUuc3R5bGUsdD09PTA/SG8oZSwiIik6dD09PTE/SG8oZSwibGVmdCIpOnQ9PT0yP0hvKGUsImNlbnRlciIpOnQ9PT0zP0hvKGUsInJpZ2h0Iik6dD09PTQ/SG8oZSwianVzdGlmeSIpOnQ9PT01P0hvKGUsInN0YXJ0Iik6dD09PTYmJkhvKGUsImVuZCIpfWZ1bmN0aW9uIEl1KGUsdCxuKXtsZXQgcj1Qby5nZXQoZSk7cj09PXZvaWQgMCYmVSg2MCk7bGV0IG89ci5jcmVhdGVET00oUm8sSHQpO3ZhciBpPUh0Ll9rZXlUb0RPTU1hcDtpZihvWyJfX2xleGljYWxLZXlfIitIdC5fa2V5XT1lLGkuc2V0KGUsbyksUShyKT9vLnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLXRleHQiLCJ0cnVlIik6VmUocikmJm8uc2V0QXR0cmlidXRlKCJkYXRhLWxleGljYWwtZGVjb3JhdG9yIiwidHJ1ZSIpLEIocikpe2lmKGU9ci5fX2luZGVudCxpPXIuX19zaXplLGUhPT0wJiZtdyhvLGUpLGkhPT0wKXstLWksZT1TYyhyLFBvKTt2YXIgbD1RdDtRdD0iIixHaChlLHIsMCxpLG8sbnVsbCkseHcocixvKSxRdD1sfWU9ci5fX2Zvcm1hdCxlIT09MCYmdncobyxlKSxyLmlzSW5saW5lKCl8fHl3KG51bGwscixvKSx5YyhyKSYmKGd0Kz1gCgpgLE9yKz1gCgpgKX1lbHNlIGk9ci5nZXRUZXh0Q29udGVudCgpLFZlKHIpPyhsPXIuZGVjb3JhdGUoSHQsUm8pLGwhPT1udWxsJiZfdyhlLGwpLG8uY29udGVudEVkaXRhYmxlPSJmYWxzZSIpOlEocikmJihyLmlzRGlyZWN0aW9ubGVzcygpfHwoUXQrPWkpKSxndCs9aSxPcis9aTtyZXR1cm4gdCE9PW51bGwmJihuIT1udWxsP3QuaW5zZXJ0QmVmb3JlKG8sbik6KG49dC5fX2xleGljYWxMaW5lQnJlYWssbiE9bnVsbD90Lmluc2VydEJlZm9yZShvLG4pOnQuYXBwZW5kQ2hpbGQobykpKSxWZyhwYSxoYSxmZCxyLCJjcmVhdGVkIiksb31mdW5jdGlvbiBHaChlLHQsbixyLG8saSl7bGV0IGw9Z3Q7Zm9yKGd0PSIiO248PXI7KytuKUl1KGVbbl0sbyxpKTt5Yyh0KSYmKGd0Kz1gCgpgKSxvLl9fbGV4aWNhbFRleHRDb250ZW50PWd0LGd0PWwrZ3R9ZnVuY3Rpb24gYXkoZSx0KXtyZXR1cm4gZT10LmdldChlKSxtYShlKXx8VmUoZSkmJmUuaXNJbmxpbmUoKX1mdW5jdGlvbiB5dyhlLHQsbil7ZT1lIT09bnVsbCYmKGUuX19zaXplPT09MHx8YXkoZS5fX2xhc3QsZmkpKSx0PXQuX19zaXplPT09MHx8YXkodC5fX2xhc3QsUG8pLGU/dHx8KHQ9bi5fX2xleGljYWxMaW5lQnJlYWssdCE9bnVsbCYmbi5yZW1vdmVDaGlsZCh0KSxuLl9fbGV4aWNhbExpbmVCcmVhaz1udWxsKTp0JiYodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpLG4uX19sZXhpY2FsTGluZUJyZWFrPXQsbi5hcHBlbmRDaGlsZCh0KSl9ZnVuY3Rpb24geHcoZSx0KXt2YXIgbj10Ll9fbGV4aWNhbERpcjtpZih0Ll9fbGV4aWNhbERpclRleHRDb250ZW50IT09UXR8fG4hPT1EdSl7bGV0IGk9UXQ9PT0iIjtpZihpKXZhciByPUR1O2Vsc2Ugcj1RdCxyPWliLnRlc3Qocik/InJ0bCI6bGIudGVzdChyKT8ibHRyIjpudWxsO2lmKHIhPT1uKXtsZXQgbD10LmNsYXNzTGlzdCxzPVJvLnRoZW1lO3ZhciBvPW4hPT1udWxsP3Nbbl06dm9pZCAwO2xldCBhPXIhPT1udWxsP3Nbcl06dm9pZCAwO28hPT12b2lkIDAmJih0eXBlb2Ygbz09InN0cmluZyImJihvPW8uc3BsaXQoIiAiKSxvPXNbbl09byksbC5yZW1vdmUoLi4ubykpLHI9PT1udWxsfHxpJiZyPT09Imx0ciI/dC5yZW1vdmVBdHRyaWJ1dGUoImRpciIpOihhIT09dm9pZCAwJiYodHlwZW9mIGE9PSJzdHJpbmciJiYobj1hLnNwbGl0KCIgIiksYT1zW3JdPW4pLGEhPT12b2lkIDAmJmwuYWRkKC4uLmEpKSx0LmRpcj1yKSxIZ3x8KGUuZ2V0V3JpdGFibGUoKS5fX2Rpcj1yKX1EdT1yLHQuX19sZXhpY2FsRGlyVGV4dENvbnRlbnQ9UXQsdC5fX2xleGljYWxEaXI9cn19ZnVuY3Rpb24gU2MoZSx0KXtsZXQgbj1bXTtmb3IoZT1lLl9fZmlyc3Q7ZSE9PW51bGw7KXtsZXQgcj10LmdldChlKTtyPT09dm9pZCAwJiZVKDEwMSksbi5wdXNoKGUpLGU9ci5fX25leHR9cmV0dXJuIG59ZnVuY3Rpb24geXMoZSx0KXt2YXIgbj1maS5nZXQoZSkscj1Qby5nZXQoZSk7biE9PXZvaWQgMCYmciE9PXZvaWQgMHx8VSg2MSk7dmFyIG89Z3d8fFZoLmhhcyhlKXx8VWguaGFzKGUpO2xldCBpPXhjKEh0LGUpO2lmKG49PT1yJiYhbylyZXR1cm4gQihuKT8ocj1pLl9fbGV4aWNhbFRleHRDb250ZW50LHIhPT12b2lkIDAmJihndCs9cixPcis9cikscj1pLl9fbGV4aWNhbERpclRleHRDb250ZW50LHIhPT12b2lkIDAmJihRdCs9cikpOihyPW4uZ2V0VGV4dENvbnRlbnQoKSxRKG4pJiYhbi5pc0RpcmVjdGlvbmxlc3MoKSYmKFF0Kz1yKSxPcis9cixndCs9ciksaTtpZihuIT09ciYmbyYmVmcocGEsaGEsZmQsciwidXBkYXRlZCIpLHIudXBkYXRlRE9NKG4saSxSbykpcmV0dXJuIHI9SXUoZSxudWxsLG51bGwpLHQ9PT1udWxsJiZVKDYyKSx0LnJlcGxhY2VDaGlsZChyLGkpLEx1KGUsbnVsbCkscjtpZihCKG4pJiZCKHIpKXtpZihlPXIuX19pbmRlbnQsZSE9PW4uX19pbmRlbnQmJm13KGksZSksZT1yLl9fZm9ybWF0LGUhPT1uLl9fZm9ybWF0JiZ2dyhpLGUpLG8pe2U9cixvPVF0LFF0PSIiLHQ9Z3Q7dmFyIGw9bi5fX3NpemUscz1lLl9fc2l6ZTtpZihndD0iIixsPT09MSYmcz09PTEpe3ZhciBhPW4uX19maXJzdCx1PWUuX19maXJzdDtpZihhPT09dSl5cyhhLGkpO2Vsc2V7dmFyIGM9WWgoYSk7dT1JdSh1LG51bGwsbnVsbCksaS5yZXBsYWNlQ2hpbGQodSxjKSxMdShhLG51bGwpfX1lbHNle3U9U2MobixmaSk7dmFyIGQ9U2MoZSxQbyk7aWYobD09PTApcyE9PTAmJkdoKGQsZSwwLHMtMSxpLG51bGwpO2Vsc2UgaWYocz09PTApbCE9PTAmJihhPWkuX19sZXhpY2FsTGluZUJyZWFrPT1udWxsLEtoKHUsMCxsLTEsYT9udWxsOmkpLGEmJihpLnRleHRDb250ZW50PSIiKSk7ZWxzZXt2YXIgZj11O3U9ZCxkPWwtMSxsPXMtMTtsZXQgZz1pLmZpcnN0Q2hpbGQsbT0wO2ZvcihzPTA7bTw9ZCYmczw9bDspe3ZhciBoPWZbbV07bGV0IFM9dVtzXTtpZihoPT09UylnPWdmKHlzKFMsaSkpLG0rKyxzKys7ZWxzZXthPT09dm9pZCAwJiYoYT1uZXcgU2V0KGYpKSxjPT09dm9pZCAwJiYoYz1uZXcgU2V0KHUpKTtsZXQgdj1jLmhhcyhoKSx5PWEuaGFzKFMpO3Y/KHk/KGg9eGMoSHQsUyksaD09PWc/Zz1nZih5cyhTLGkpKTooZyE9bnVsbD9pLmluc2VydEJlZm9yZShoLGcpOmkuYXBwZW5kQ2hpbGQoaCkseXMoUyxpKSksbSsrKTpJdShTLGksZykscysrKTooZz1nZihZaChoKSksTHUoaCxpKSxtKyspfX1hPW0+ZCxjPXM+bCxhJiYhYz8oYT11W2wrMV0sYT1hPT09dm9pZCAwP251bGw6SHQuZ2V0RWxlbWVudEJ5S2V5KGEpLEdoKHUsZSxzLGwsaSxhKSk6YyYmIWEmJktoKGYsbSxkLGkpfX15YyhlKSYmKGd0Kz1gCgpgKSxpLl9fbGV4aWNhbFRleHRDb250ZW50PWd0LGd0PXQrZ3QseHcoZSxpKSxRdD1vLHF0KHIpfHxyLmlzSW5saW5lKCl8fHl3KG4scixpKX15YyhyKSYmKGd0Kz1gCgpgLE9yKz1gCgpgKX1lbHNlIG49ci5nZXRUZXh0Q29udGVudCgpLFZlKHIpPyhvPXIuZGVjb3JhdGUoSHQsUm8pLG8hPT1udWxsJiZfdyhlLG8pKTpRKHIpJiYhci5pc0RpcmVjdGlvbmxlc3MoKSYmKFF0Kz1uKSxndCs9bixPcis9bjtyZXR1cm4hSGcmJnF0KHIpJiZyLl9fY2FjaGVkVGV4dCE9PU9yJiYocj1yLmdldFdyaXRhYmxlKCksci5fX2NhY2hlZFRleHQ9T3IpLGl9ZnVuY3Rpb24gX3coZSx0KXtsZXQgbj1IdC5fcGVuZGluZ0RlY29yYXRvcnMscj1IdC5fZGVjb3JhdG9ycztpZihuPT09bnVsbCl7aWYocltlXT09PXQpcmV0dXJuO249c3coSHQpfW5bZV09dH1mdW5jdGlvbiBnZihlKXtyZXR1cm4gZT1lLm5leHRTaWJsaW5nLGUhPT1udWxsJiZlPT09SHQuX2Jsb2NrQ3Vyc29yRWxlbWVudCYmKGU9ZS5uZXh0U2libGluZyksZX1mdW5jdGlvbiBZaChlKXtsZXQgdD1IaC5nZXQoZSk7cmV0dXJuIHQ9PT12b2lkIDAmJlUoNzUsZSksdH1sZXQgVHI9T2JqZWN0LmZyZWV6ZSh7fSksWGg9W1sia2V5ZG93biIsa2JdLFsicG9pbnRlcmRvd24iLF9iXSxbImNvbXBvc2l0aW9uc3RhcnQiLENiXSxbImNvbXBvc2l0aW9uZW5kIiwkYl0sWyJpbnB1dCIsRWJdLFsiY2xpY2siLHhiXSxbImN1dCIsVHJdLFsiY29weSIsVHJdLFsiZHJhZ3N0YXJ0IixUcl0sWyJkcmFnb3ZlciIsVHJdLFsiZHJhZ2VuZCIsVHJdLFsicGFzdGUiLFRyXSxbImZvY3VzIixUcl0sWyJibHVyIixUcl0sWyJkcm9wIixUcl1dO2djJiZYaC5wdXNoKFsiYmVmb3JlaW5wdXQiLChlLHQpPT5TYihlLHQpXSk7bGV0IGdhPTAsd3c9MCxTdz0wLEJpPW51bGwsTHM9MCxRaD0hMSxKaD0hMSxJcz0hMSx4cz0hMSxFdz1bMCwiIiwwLCJyb290IiwwXTtmdW5jdGlvbiBDdyhlLHQsbixyLG8pe2xldCBpPWUuYW5jaG9yLGw9ZS5mb2N1cyxzPWkuZ2V0Tm9kZSgpO3ZhciBhPWV0KCk7bGV0IHU9RXIoYS5fd2luZG93KSxjPXUhPT1udWxsP3UuYW5jaG9yTm9kZTpudWxsLGQ9aS5rZXk7YT1hLmdldEVsZW1lbnRCeUtleShkKTtsZXQgZj1uLmxlbmd0aDtyZXR1cm4gZCE9PWwua2V5fHwhUShzKXx8KCFvJiYoIWdjfHxTdzxyKzUwKXx8cy5pc0RpcnR5KCkmJjI+Znx8YXcobikpJiZpLm9mZnNldCE9PWwub2Zmc2V0JiYhcy5pc0NvbXBvc2luZygpfHxGaChzKXx8cy5pc0RpcnR5KCkmJjE8Znx8KG98fCFnYykmJmEhPT1udWxsJiYhcy5pc0NvbXBvc2luZygpJiZjIT09bWMoYSl8fHUhPT1udWxsJiZ0IT09bnVsbCYmKCF0LmNvbGxhcHNlZHx8dC5zdGFydENvbnRhaW5lciE9PXUuYW5jaG9yTm9kZXx8dC5zdGFydE9mZnNldCE9PXUuYW5jaG9yT2Zmc2V0KXx8cy5nZXRGb3JtYXQoKSE9PWUuZm9ybWF0fHxzLmdldFN0eWxlKCkhPT1lLnN0eWxlfHxtYihlLHMpfWZ1bmN0aW9uIHV5KGUsdCl7cmV0dXJuIGUhPT1udWxsJiZlLm5vZGVWYWx1ZSE9PW51bGwmJmUubm9kZVR5cGU9PT0zJiZ0IT09MCYmdCE9PWUubm9kZVZhbHVlLmxlbmd0aH1mdW5jdGlvbiBjeShlLHQsbil7bGV0e2FuY2hvck5vZGU6cixhbmNob3JPZmZzZXQ6byxmb2N1c05vZGU6aSxmb2N1c09mZnNldDpsfT1lO1FoJiYoUWg9ITEsdXkocixvKSYmdXkoaSxsKSl8fGtuKHQsKCk9PntpZighbil2cihudWxsKTtlbHNlIGlmKEFhKHQscixpKSl7dmFyIHM9S2UoKTtpZihkZShzKSl7dmFyIGE9cy5hbmNob3IsdT1hLmdldE5vZGUoKTtpZihzLmlzQ29sbGFwc2VkKCkpe2UudHlwZT09PSJSYW5nZSImJmUuYW5jaG9yTm9kZT09PWUuZm9jdXNOb2RlJiYocy5kaXJ0eT0hMCk7dmFyIGM9Y2QodCkuZXZlbnQ7Yz1jP2MudGltZVN0YW1wOnBlcmZvcm1hbmNlLm5vdygpO2xldFtkLGYsaCxnLG1dPUV3O2M8bSsyMDAmJmEub2Zmc2V0PT09aCYmYS5rZXk9PT1nPyhzLmZvcm1hdD1kLHMuc3R5bGU9Zik6YS50eXBlPT09InRleHQiPyhzLmZvcm1hdD11LmdldEZvcm1hdCgpLHMuc3R5bGU9dS5nZXRTdHlsZSgpKTphLnR5cGU9PT0iZWxlbWVudCImJihzLmZvcm1hdD0wLHMuc3R5bGU9IiIpfWVsc2V7YT0yNTUsdT0hMSxjPXMuZ2V0Tm9kZXMoKTtsZXQgZD1jLmxlbmd0aDtmb3IobGV0IGY9MDtmPGQ7ZisrKXtsZXQgaD1jW2ZdO2lmKFEoaCkmJih1PSEwLGEmPWguZ2V0Rm9ybWF0KCksYT09PTApKWJyZWFrfXMuZm9ybWF0PXU/YTowfX1ZKHQsbGQsdm9pZCAwKX19KX1mdW5jdGlvbiB4YihlLHQpe2tuKHQsKCk9PntsZXQgbj1LZSgpO3ZhciByPUVyKHQuX3dpbmRvdyk7bGV0IG89RmwoKTtpZihyKWlmKGRlKG4pKXtsZXQgbD1uLmFuY2hvcjt2YXIgaT1sLmdldE5vZGUoKTtsLnR5cGU9PT0iZWxlbWVudCImJmwub2Zmc2V0PT09MCYmbi5pc0NvbGxhcHNlZCgpJiYhcXQoaSkmJlNyKCkuZ2V0Q2hpbGRyZW5TaXplKCk9PT0xJiZpLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5pc0VtcHR5KCkmJm8hPT1udWxsJiZuLmlzKG8pPyhyLnJlbW92ZUFsbFJhbmdlcygpLG4uZGlydHk9ITApOmUuZGV0YWlsIT09M3x8bi5pc0NvbGxhcHNlZCgpfHwocj1uLmZvY3VzLmdldE5vZGUoKSxpIT09ciYmKEIoaSk/aS5zZWxlY3QoMCk6aS5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0KDApKSl9ZWxzZSBlLnBvaW50ZXJUeXBlPT09InRvdWNoIiYmKGk9ci5hbmNob3JOb2RlLGkhPT1udWxsJiYoaT1pLm5vZGVUeXBlLGk9PT0xfHxpPT09MykpJiYocj1HZyhvLHIsdCksdnIocikpO1kodCxBXyxlKX0pfWZ1bmN0aW9uIF9iKGUsdCl7bGV0IG49ZS50YXJnZXQ7ZT1lLnBvaW50ZXJUeXBlLG4gaW5zdGFuY2VvZiBOb2RlJiZlIT09InRvdWNoIiYma24odCwoKT0+e1ZlKE1hKG4pKXx8KEpoPSEwKX0pfWZ1bmN0aW9uICR3KGUpe3JldHVybiBlLmdldFRhcmdldFJhbmdlcz8oZT1lLmdldFRhcmdldFJhbmdlcygpLGUubGVuZ3RoPT09MD9udWxsOmVbMF0pOm51bGx9ZnVuY3Rpb24gd2IoZSx0KXtyZXR1cm4gZSE9PXR8fEIoZSl8fEIodCl8fCFlLmlzVG9rZW4oKXx8IXQuaXNUb2tlbigpfWZ1bmN0aW9uIFNiKGUsdCl7bGV0IG49ZS5pbnB1dFR5cGUscj0kdyhlKTtuPT09ImRlbGV0ZUNvbXBvc2l0aW9uVGV4dCJ8fGJvJiZjdyh0KXx8biE9PSJpbnNlcnRDb21wb3NpdGlvblRleHQiJiZrbih0LCgpPT57bGV0IG89S2UoKTtpZihuPT09ImRlbGV0ZUNvbnRlbnRCYWNrd2FyZCIpe2lmKG89PT1udWxsKXt2YXIgaT1GbCgpO2lmKCFkZShpKSlyZXR1cm47dnIoaS5jbG9uZSgpKX1pZihkZShvKSl7d3c9PT0yMjkmJmUudGltZVN0YW1wPGdhKzMwJiZ0LmlzQ29tcG9zaW5nKCkmJm8uYW5jaG9yLmtleT09PW8uZm9jdXMua2V5PyhNdChudWxsKSxnYT0wLHNldFRpbWVvdXQoKCk9Pntrbih0LCgpPT57TXQobnVsbCl9KX0sMzApLGRlKG8pJiYoaT1vLmFuY2hvci5nZXROb2RlKCksaS5tYXJrRGlydHkoKSxvLmZvcm1hdD1pLmdldEZvcm1hdCgpLG8uc3R5bGU9aS5nZXRTdHlsZSgpKSk6KGUucHJldmVudERlZmF1bHQoKSxZKHQsY2EsITApKTtyZXR1cm59fWlmKGRlKG8pKXtpPWUuZGF0YSxCaSE9PW51bGwmJldnKCExLHQsQmkpLG8uZGlydHkmJkJpPT09bnVsbHx8IW8uaXNDb2xsYXBzZWQoKXx8cXQoby5hbmNob3IuZ2V0Tm9kZSgpKXx8cj09PW51bGx8fG8uYXBwbHlET01SYW5nZShyKSxCaT1udWxsO3ZhciBsPW8uZm9jdXMscz1vLmFuY2hvci5nZXROb2RlKCk7aWYobD1sLmdldE5vZGUoKSxuPT09Imluc2VydFRleHQifHxuPT09Imluc2VydFRyYW5zcG9zZSIpaT09PWAKYD8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxNcywhMSkpOmk9PT1gCgpgPyhlLnByZXZlbnREZWZhdWx0KCksWSh0LExoLHZvaWQgMCkpOmk9PW51bGwmJmUuZGF0YVRyYW5zZmVyPyhpPWUuZGF0YVRyYW5zZmVyLmdldERhdGEoInRleHQvcGxhaW4iKSxlLnByZXZlbnREZWZhdWx0KCksby5pbnNlcnRSYXdUZXh0KGkpKTppIT1udWxsJiZDdyhvLHIsaSxlLnRpbWVTdGFtcCwhMCk/KGUucHJldmVudERlZmF1bHQoKSxZKHQsY2wsaSkpOkJpPWksU3c9ZS50aW1lU3RhbXA7ZWxzZSBzd2l0Y2goZS5wcmV2ZW50RGVmYXVsdCgpLG4pe2Nhc2UiaW5zZXJ0RnJvbVlhbmsiOmNhc2UiaW5zZXJ0RnJvbURyb3AiOmNhc2UiaW5zZXJ0UmVwbGFjZW1lbnRUZXh0IjpZKHQsY2wsZSk7YnJlYWs7Y2FzZSJpbnNlcnRGcm9tQ29tcG9zaXRpb24iOk10KG51bGwpLFkodCxjbCxlKTticmVhaztjYXNlImluc2VydExpbmVCcmVhayI6TXQobnVsbCksWSh0LE1zLCExKTticmVhaztjYXNlImluc2VydFBhcmFncmFwaCI6TXQobnVsbCksSXMmJiFzZD8oSXM9ITEsWSh0LE1zLCExKSk6WSh0LExoLHZvaWQgMCk7YnJlYWs7Y2FzZSJpbnNlcnRGcm9tUGFzdGUiOmNhc2UiaW5zZXJ0RnJvbVBhc3RlQXNRdW90YXRpb24iOlkodCxSZyxlKTticmVhaztjYXNlImRlbGV0ZUJ5Q29tcG9zaXRpb24iOndiKHMsbCkmJlkodCxJaCxlKTticmVhaztjYXNlImRlbGV0ZUJ5RHJhZyI6Y2FzZSJkZWxldGVCeUN1dCI6WSh0LEloLGUpO2JyZWFrO2Nhc2UiZGVsZXRlQ29udGVudCI6WSh0LGNhLCExKTticmVhaztjYXNlImRlbGV0ZVdvcmRCYWNrd2FyZCI6WSh0LGRhLCEwKTticmVhaztjYXNlImRlbGV0ZVdvcmRGb3J3YXJkIjpZKHQsZGEsITEpO2JyZWFrO2Nhc2UiZGVsZXRlSGFyZExpbmVCYWNrd2FyZCI6Y2FzZSJkZWxldGVTb2Z0TGluZUJhY2t3YXJkIjpZKHQsZmEsITApO2JyZWFrO2Nhc2UiZGVsZXRlQ29udGVudEZvcndhcmQiOmNhc2UiZGVsZXRlSGFyZExpbmVGb3J3YXJkIjpjYXNlImRlbGV0ZVNvZnRMaW5lRm9yd2FyZCI6WSh0LGZhLCExKTticmVhaztjYXNlImZvcm1hdFN0cmlrZVRocm91Z2giOlkodCxnbywic3RyaWtldGhyb3VnaCIpO2JyZWFrO2Nhc2UiZm9ybWF0Qm9sZCI6WSh0LGdvLCJib2xkIik7YnJlYWs7Y2FzZSJmb3JtYXRJdGFsaWMiOlkodCxnbywiaXRhbGljIik7YnJlYWs7Y2FzZSJmb3JtYXRVbmRlcmxpbmUiOlkodCxnbywidW5kZXJsaW5lIik7YnJlYWs7Y2FzZSJoaXN0b3J5VW5kbyI6WSh0LFBnLHZvaWQgMCk7YnJlYWs7Y2FzZSJoaXN0b3J5UmVkbyI6WSh0LE9nLHZvaWQgMCl9fX0pfWZ1bmN0aW9uIEViKGUsdCl7ZS5zdG9wUHJvcGFnYXRpb24oKSxrbih0LCgpPT57dmFyIG49S2UoKSxyPWUuZGF0YSxvPSR3KGUpO2lmKHIhPW51bGwmJmRlKG4pJiZDdyhuLG8scixlLnRpbWVTdGFtcCwhMSkpe3hzJiYoWmgodCxyKSx4cz0hMSk7dmFyIGk9bi5hbmNob3IsbD1pLmdldE5vZGUoKTtpZihvPUVyKHQuX3dpbmRvdyksbz09PW51bGwpcmV0dXJuO2xldCBzPWkub2Zmc2V0OyhpPWdjJiYhbi5pc0NvbGxhcHNlZCgpJiZRKGwpJiZvLmFuY2hvck5vZGUhPT1udWxsKSYmKGw9bC5nZXRUZXh0Q29udGVudCgpLnNsaWNlKDAscykrcitsLmdldFRleHRDb250ZW50KCkuc2xpY2UocytuLmZvY3VzLm9mZnNldCksbz1vLmFuY2hvck5vZGUsaT1sPT09KG8ubm9kZVR5cGU9PT0zP28ubm9kZVZhbHVlOm51bGwpKSxpfHxZKHQsY2wscikscj1yLmxlbmd0aCxibyYmMTxyJiZlLmlucHV0VHlwZT09PSJpbnNlcnRDb21wb3NpdGlvblRleHQiJiYhdC5pc0NvbXBvc2luZygpJiYobi5hbmNob3Iub2Zmc2V0LT1yKSxEZ3x8c2R8fExnfHwhdC5pc0NvbXBvc2luZygpfHwoZ2E9MCxNdChudWxsKSl9ZWxzZSBXZyghMSx0LHIhPT1udWxsP3I6dm9pZCAwKSx4cyYmKFpoKHQscnx8dm9pZCAwKSx4cz0hMSk7SnQoKSxuPWV0KCksZXcobil9KSxCaT1udWxsfWZ1bmN0aW9uIENiKGUsdCl7a24odCwoKT0+e2xldCBuPUtlKCk7aWYoZGUobikmJiF0LmlzQ29tcG9zaW5nKCkpe2xldCByPW4uYW5jaG9yLG89bi5hbmNob3IuZ2V0Tm9kZSgpO010KHIua2V5KSwoZS50aW1lU3RhbXA8Z2ErMzB8fHIudHlwZT09PSJlbGVtZW50Inx8IW4uaXNDb2xsYXBzZWQoKXx8by5nZXRGb3JtYXQoKSE9PW4uZm9ybWF0fHxvLmdldFN0eWxlKCkhPT1uLnN0eWxlKSYmWSh0LGNsLG9iKX19KX1mdW5jdGlvbiBaaChlLHQpe3ZhciBuPWUuX2NvbXBvc2l0aW9uS2V5O2lmKE10KG51bGwpLG4hPT1udWxsJiZ0IT1udWxsKXtpZih0PT09IiIpe3Q9JHQobiksZT1tYyhlLmdldEVsZW1lbnRCeUtleShuKSksZSE9PW51bGwmJmUubm9kZVZhbHVlIT09bnVsbCYmUSh0KSYmVWcodCxlLm5vZGVWYWx1ZSxudWxsLG51bGwsITApO3JldHVybn1pZih0W3QubGVuZ3RoLTFdPT09YApgJiYobj1LZSgpLGRlKG4pKSl7dD1uLmZvY3VzLG4uYW5jaG9yLnNldCh0LmtleSx0Lm9mZnNldCx0LnR5cGUpLFkoZSxwYyxudWxsKTtyZXR1cm59fVdnKCEwLGUsdCl9ZnVuY3Rpb24gJGIoZSx0KXtibz94cz0hMDprbih0LCgpPT57WmgodCxlLmRhdGEpfSl9ZnVuY3Rpb24ga2IoZSx0KXtpZihnYT1lLnRpbWVTdGFtcCx3dz1lLmtleUNvZGUsIXQuaXNDb21wb3NpbmcoKSl7dmFye2tleUNvZGU6bixzaGlmdEtleTpyLGN0cmxLZXk6byxtZXRhS2V5OmksYWx0S2V5Omx9PWU7aWYoIVkodCxNXyxlKSl7aWYobiE9PTM5fHxvfHxpfHxsKWlmKG4hPT0zOXx8bHx8cnx8IW8mJiFpKWlmKG4hPT0zN3x8b3x8aXx8bClpZihuIT09Mzd8fGx8fHJ8fCFvJiYhaSlpZihuIT09Mzh8fG98fGkpaWYobiE9PTQwfHxvfHxpKWlmKG49PT0xMyYmcilJcz0hMCxZKHQscGMsZSk7ZWxzZSBpZihuPT09MzIpWSh0LEJfLGUpO2Vsc2UgaWYoV3QmJm8mJm49PT03OSllLnByZXZlbnREZWZhdWx0KCksSXM9ITAsWSh0LE1zLCEwKTtlbHNlIGlmKG4hPT0xM3x8cil7dmFyIHM9V3Q/bHx8aT8hMTpuPT09OHx8bj09PTcyJiZvOm98fGx8fGk/ITE6bj09PTg7cz9uPT09OD9ZKHQsV18sZSk6KGUucHJldmVudERlZmF1bHQoKSxZKHQsY2EsITApKTpuPT09Mjc/WSh0LFVfLGUpOihzPVd0P3J8fGx8fGk/ITE6bj09PTQ2fHxuPT09NjgmJm86b3x8bHx8aT8hMTpuPT09NDYscz9uPT09NDY/WSh0LFZfLGUpOihlLnByZXZlbnREZWZhdWx0KCksWSh0LGNhLCExKSk6bj09PTgmJihXdD9sOm8pPyhlLnByZXZlbnREZWZhdWx0KCksWSh0LGRhLCEwKSk6bj09PTQ2JiYoV3Q/bDpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxkYSwhMSkpOld0JiZpJiZuPT09OD8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxmYSwhMCkpOld0JiZpJiZuPT09NDY/KGUucHJldmVudERlZmF1bHQoKSxZKHQsZmEsITEpKTpuPT09NjYmJiFsJiYoV3Q/aTpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxnbywiYm9sZCIpKTpuPT09ODUmJiFsJiYoV3Q/aTpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxnbywidW5kZXJsaW5lIikpOm49PT03MyYmIWwmJihXdD9pOm8pPyhlLnByZXZlbnREZWZhdWx0KCksWSh0LGdvLCJpdGFsaWMiKSk6biE9PTl8fGx8fG98fGk/bj09PTkwJiYhciYmKFd0P2k6byk/KGUucHJldmVudERlZmF1bHQoKSxZKHQsUGcsdm9pZCAwKSk6KHM9V3Q/bj09PTkwJiZpJiZyOm49PT04OSYmb3x8bj09PTkwJiZvJiZyLHM/KGUucHJldmVudERlZmF1bHQoKSxZKHQsT2csdm9pZCAwKSk6emwodC5fZWRpdG9yU3RhdGUuX3NlbGVjdGlvbik/KHM9cj8hMTpuPT09Njc/V3Q/aTpvOiExLHM/KGUucHJldmVudERlZmF1bHQoKSxZKHQsQWcsZSkpOihzPXI/ITE6bj09PTg4P1d0P2k6bzohMSxzPyhlLnByZXZlbnREZWZhdWx0KCksWSh0LE1nLGUpKTpuPT09NjUmJihXdD9pOm8pJiYoZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxqaCxlKSkpKTohYm8mJm49PT02NSYmKFd0P2k6bykmJihlLnByZXZlbnREZWZhdWx0KCksWSh0LGpoLGUpKSk6WSh0LEhfLGUpKX1lbHNlIElzPSExLFkodCxwYyxlKTtlbHNlIFkodCxGXyxlKTtlbHNlIFkodCx6XyxlKTtlbHNlIFkodCxqXyxlKTtlbHNlIFkodCxJXyxlKTtlbHNlIFkodCxMXyxlKTtlbHNlIFkodCxEXyxlKTsob3x8cnx8bHx8aSkmJlkodCxaXyxlKX19fWZ1bmN0aW9uIGt3KGUpe2xldCB0PWUuX19sZXhpY2FsRXZlbnRIYW5kbGVzO3JldHVybiB0PT09dm9pZCAwJiYodD1bXSxlLl9fbGV4aWNhbEV2ZW50SGFuZGxlcz10KSx0fWxldCBkbD1uZXcgTWFwO2Z1bmN0aW9uIFR3KGUpe2U9ZS50YXJnZXQ7bGV0IHQ9RXIoZT09bnVsbD9udWxsOmUubm9kZVR5cGU9PT05P2UuZGVmYXVsdFZpZXc6ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KTtpZih0IT09bnVsbCl7dmFyIG49RmcodC5hbmNob3JOb2RlKTtpZihuIT09bnVsbCl7SmgmJihKaD0hMSxrbihuLCgpPT57dmFyIGw9RmwoKSxzPXQuYW5jaG9yTm9kZTtzIT09bnVsbCYmKHM9cy5ub2RlVHlwZSxzPT09MXx8cz09PTMpJiYobD1HZyhsLHQsbiksdnIobCkpfSkpLGU9QmcobiksZT1lW2UubGVuZ3RoLTFdO3ZhciByPWUuX2tleSxvPWRsLmdldChyKSxpPW98fGU7aSE9PW4mJmN5KHQsaSwhMSksY3kodCxuLCEwKSxuIT09ZT9kbC5zZXQocixuKTpvJiZkbC5kZWxldGUocil9fX1mdW5jdGlvbiBUYihlLHQpe0xzPT09MCYmZS5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsVHcpLExzKyssZS5fX2xleGljYWxFZGl0b3I9dDtsZXQgbj1rdyhlKTtmb3IobGV0IHI9MDtyPFhoLmxlbmd0aDtyKyspe2xldFtvLGldPVhoW3JdLGw9dHlwZW9mIGk9PSJmdW5jdGlvbiI/cz0+e3MuX2xleGljYWxIYW5kbGVkIT09ITAmJihzLl9sZXhpY2FsSGFuZGxlZD0hMCx0LmlzRWRpdGFibGUoKSYmaShzLHQpKX06cz0+e2lmKHMuX2xleGljYWxIYW5kbGVkIT09ITAmJihzLl9sZXhpY2FsSGFuZGxlZD0hMCx0LmlzRWRpdGFibGUoKSkpc3dpdGNoKG8pe2Nhc2UiY3V0IjpyZXR1cm4gWSh0LE1nLHMpO2Nhc2UiY29weSI6cmV0dXJuIFkodCxBZyxzKTtjYXNlInBhc3RlIjpyZXR1cm4gWSh0LFJnLHMpO2Nhc2UiZHJhZ3N0YXJ0IjpyZXR1cm4gWSh0LEdfLHMpO2Nhc2UiZHJhZ292ZXIiOnJldHVybiBZKHQsWV8scyk7Y2FzZSJkcmFnZW5kIjpyZXR1cm4gWSh0LFhfLHMpO2Nhc2UiZm9jdXMiOnJldHVybiBZKHQsUV8scyk7Y2FzZSJibHVyIjpyZXR1cm4gWSh0LEpfLHMpO2Nhc2UiZHJvcCI6cmV0dXJuIFkodCxLXyxzKX19O2UuYWRkRXZlbnRMaXN0ZW5lcihvLGwpLG4ucHVzaCgoKT0+e2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLGwpfSl9fWZ1bmN0aW9uIHFoKGUsdCxuKXtKdCgpO3ZhciByPWUuX19rZXk7bGV0IG89ZS5nZXRQYXJlbnQoKTtpZihvIT09bnVsbCl7dmFyIGk9S2UoKTtpZihkZShpKSYmQihlKSl7dmFye2FuY2hvcjpsLGZvY3VzOnN9PWksYT1sLmdldE5vZGUoKSx1PXMuZ2V0Tm9kZSgpO19jKGEsZSkmJmwuc2V0KGUuX19rZXksMCwiZWxlbWVudCIpLF9jKHUsZSkmJnMuc2V0KGUuX19rZXksMCwiZWxlbWVudCIpfWlmKGE9aSx1PSExLGRlKGEpJiZ0KXtpPWEuYW5jaG9yO2xldCBjPWEuZm9jdXM7aS5rZXk9PT1yJiYoQ2MoaSxlLG8sZS5nZXRQcmV2aW91c1NpYmxpbmcoKSxlLmdldE5leHRTaWJsaW5nKCkpLHU9ITApLGMua2V5PT09ciYmKENjKGMsZSxvLGUuZ2V0UHJldmlvdXNTaWJsaW5nKCksZS5nZXROZXh0U2libGluZygpKSx1PSEwKX1lbHNlIHpsKGEpJiZ0JiZlLmlzU2VsZWN0ZWQoKSYmZS5zZWxlY3RQcmV2aW91cygpO2RlKGEpJiZ0JiYhdT8ocj1lLmdldEluZGV4V2l0aGluUGFyZW50KCksaWkoZSksRWMoYSxvLHIsLTEpKTppaShlKSxufHxKbihvKXx8by5jYW5CZUVtcHR5KCl8fCFvLmlzRW1wdHkoKXx8cWgobyx0KSx0JiZxdChvKSYmby5pc0VtcHR5KCkmJm8uc2VsZWN0RW5kKCl9fWNsYXNzIExhe3N0YXRpYyBnZXRUeXBlKCl7VSg2NCx0aGlzLm5hbWUpfXN0YXRpYyBjbG9uZSgpe1UoNjUsdGhpcy5uYW1lKX1jb25zdHJ1Y3Rvcih0KXt0aGlzLl9fdHlwZT10aGlzLmNvbnN0cnVjdG9yLmdldFR5cGUoKSx0aGlzLl9fbmV4dD10aGlzLl9fcHJldj10aGlzLl9fcGFyZW50PW51bGwsaXcodGhpcyx0KX1nZXRUeXBlKCl7cmV0dXJuIHRoaXMuX190eXBlfWlzQXR0YWNoZWQoKXtmb3IodmFyIHQ9dGhpcy5fX2tleTt0IT09bnVsbDspe2lmKHQ9PT0icm9vdCIpcmV0dXJuITA7aWYodD0kdCh0KSx0PT09bnVsbClicmVhazt0PXQuX19wYXJlbnR9cmV0dXJuITF9aXNTZWxlY3RlZCh0KXtpZih0PXR8fEtlKCksdD09bnVsbClyZXR1cm4hMTtsZXQgbj10LmdldE5vZGVzKCkuc29tZShyPT5yLl9fa2V5PT09dGhpcy5fX2tleSk7cmV0dXJuIFEodGhpcyk/bjpkZSh0KSYmdC5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmdC5mb2N1cy50eXBlPT09ImVsZW1lbnQiJiZ0LmFuY2hvci5rZXk9PT10LmZvY3VzLmtleSYmdC5hbmNob3Iub2Zmc2V0PT09dC5mb2N1cy5vZmZzZXQ/ITE6bn1nZXRLZXkoKXtyZXR1cm4gdGhpcy5fX2tleX1nZXRJbmRleFdpdGhpblBhcmVudCgpe3ZhciB0PXRoaXMuZ2V0UGFyZW50KCk7aWYodD09PW51bGwpcmV0dXJuLTE7dD10LmdldEZpcnN0Q2hpbGQoKTtsZXQgbj0wO2Zvcig7dCE9PW51bGw7KXtpZih0aGlzLmlzKHQpKXJldHVybiBuO24rKyx0PXQuZ2V0TmV4dFNpYmxpbmcoKX1yZXR1cm4tMX1nZXRQYXJlbnQoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLl9fcGFyZW50O3JldHVybiB0PT09bnVsbD9udWxsOiR0KHQpfWdldFBhcmVudE9yVGhyb3coKXtsZXQgdD10aGlzLmdldFBhcmVudCgpO3JldHVybiB0PT09bnVsbCYmVSg2Nix0aGlzLl9fa2V5KSx0fWdldFRvcExldmVsRWxlbWVudCgpe2xldCB0PXRoaXM7Zm9yKDt0IT09bnVsbDspe2xldCBuPXQuZ2V0UGFyZW50KCk7aWYoSm4obikpcmV0dXJuIHQ7dD1ufXJldHVybiBudWxsfWdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKXtsZXQgdD10aGlzLmdldFRvcExldmVsRWxlbWVudCgpO3JldHVybiB0PT09bnVsbCYmVSg2Nyx0aGlzLl9fa2V5KSx0fWdldFBhcmVudHMoKXtsZXQgdD1bXSxuPXRoaXMuZ2V0UGFyZW50KCk7Zm9yKDtuIT09bnVsbDspdC5wdXNoKG4pLG49bi5nZXRQYXJlbnQoKTtyZXR1cm4gdH1nZXRQYXJlbnRLZXlzKCl7bGV0IHQ9W10sbj10aGlzLmdldFBhcmVudCgpO2Zvcig7biE9PW51bGw7KXQucHVzaChuLl9fa2V5KSxuPW4uZ2V0UGFyZW50KCk7cmV0dXJuIHR9Z2V0UHJldmlvdXNTaWJsaW5nKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX3ByZXY7cmV0dXJuIHQ9PT1udWxsP251bGw6JHQodCl9Z2V0UHJldmlvdXNTaWJsaW5ncygpe2xldCB0PVtdO3ZhciBuPXRoaXMuZ2V0UGFyZW50KCk7aWYobj09PW51bGwpcmV0dXJuIHQ7Zm9yKG49bi5nZXRGaXJzdENoaWxkKCk7biE9PW51bGwmJiFuLmlzKHRoaXMpOyl0LnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0TmV4dFNpYmxpbmcoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLl9fbmV4dDtyZXR1cm4gdD09PW51bGw/bnVsbDokdCh0KX1nZXROZXh0U2libGluZ3MoKXtsZXQgdD1bXSxuPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q29tbW9uQW5jZXN0b3IodCl7bGV0IG49dGhpcy5nZXRQYXJlbnRzKCk7dmFyIHI9dC5nZXRQYXJlbnRzKCk7Qih0aGlzKSYmbi51bnNoaWZ0KHRoaXMpLEIodCkmJnIudW5zaGlmdCh0KSx0PW4ubGVuZ3RoO3ZhciBvPXIubGVuZ3RoO2lmKHQ9PT0wfHxvPT09MHx8blt0LTFdIT09cltvLTFdKXJldHVybiBudWxsO2ZvcihyPW5ldyBTZXQociksbz0wO288dDtvKyspe2xldCBpPW5bb107aWYoci5oYXMoaSkpcmV0dXJuIGl9cmV0dXJuIG51bGx9aXModCl7cmV0dXJuIHQ9PW51bGw/ITE6dGhpcy5fX2tleT09PXQuX19rZXl9aXNCZWZvcmUodCl7aWYodGhpcz09PXQpcmV0dXJuITE7aWYodC5pc1BhcmVudE9mKHRoaXMpKXJldHVybiEwO2lmKHRoaXMuaXNQYXJlbnRPZih0KSlyZXR1cm4hMTt2YXIgbj10aGlzLmdldENvbW1vbkFuY2VzdG9yKHQpO2xldCByPXRoaXM7Zm9yKDs7KXt2YXIgbz1yLmdldFBhcmVudE9yVGhyb3coKTtpZihvPT09bil7bz1yLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9cj1vfWZvcihyPXQ7Oyl7aWYodD1yLmdldFBhcmVudE9yVGhyb3coKSx0PT09bil7bj1yLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9cj10fXJldHVybiBvPG59aXNQYXJlbnRPZih0KXtsZXQgbj10aGlzLl9fa2V5O2lmKG49PT10Ll9fa2V5KXJldHVybiExO2Zvcig7dCE9PW51bGw7KXtpZih0Ll9fa2V5PT09bilyZXR1cm4hMDt0PXQuZ2V0UGFyZW50KCl9cmV0dXJuITF9Z2V0Tm9kZXNCZXR3ZWVuKHQpe2xldCBuPXRoaXMuaXNCZWZvcmUodCkscj1bXSxvPW5ldyBTZXQ7Zm9yKHZhciBpPXRoaXM7Oyl7dmFyIGw9aS5fX2tleTtpZihvLmhhcyhsKXx8KG8uYWRkKGwpLHIucHVzaChpKSksaT09PXQpYnJlYWs7aWYobD1CKGkpP24/aS5nZXRGaXJzdENoaWxkKCk6aS5nZXRMYXN0Q2hpbGQoKTpudWxsLGwhPT1udWxsKWk9bDtlbHNlIGlmKGw9bj9pLmdldE5leHRTaWJsaW5nKCk6aS5nZXRQcmV2aW91c1NpYmxpbmcoKSxsIT09bnVsbClpPWw7ZWxzZXtpZihpPWkuZ2V0UGFyZW50T3JUaHJvdygpLG8uaGFzKGkuX19rZXkpfHxyLnB1c2goaSksaT09PXQpYnJlYWs7bD1pO2RvIGw9PT1udWxsJiZVKDY4KSxpPW4/bC5nZXROZXh0U2libGluZygpOmwuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD1sLmdldFBhcmVudCgpLGwhPT1udWxsJiYoaSE9PW51bGx8fG8uaGFzKGwuX19rZXkpfHxyLnB1c2gobCkpO3doaWxlKGk9PT1udWxsKX19cmV0dXJuIG58fHIucmV2ZXJzZSgpLHJ9aXNEaXJ0eSgpe2xldCB0PWV0KCkuX2RpcnR5TGVhdmVzO3JldHVybiB0IT09bnVsbCYmdC5oYXModGhpcy5fX2tleSl9Z2V0TGF0ZXN0KCl7bGV0IHQ9JHQodGhpcy5fX2tleSk7cmV0dXJuIHQ9PT1udWxsJiZVKDExMyksdH1nZXRXcml0YWJsZSgpe0p0KCk7dmFyIHQ9Q3IoKSxuPWV0KCk7dD10Ll9ub2RlTWFwO2xldCByPXRoaXMuX19rZXksbz10aGlzLmdldExhdGVzdCgpLGk9by5fX3BhcmVudDtuPW4uX2Nsb25lTm90TmVlZGVkO3ZhciBsPUtlKCk7cmV0dXJuIGwhPT1udWxsJiYobC5fY2FjaGVkTm9kZXM9bnVsbCksbi5oYXMocik/KHZjKG8pLG8pOihsPW8uY29uc3RydWN0b3IuY2xvbmUobyksbC5fX3BhcmVudD1pLGwuX19uZXh0PW8uX19uZXh0LGwuX19wcmV2PW8uX19wcmV2LEIobykmJkIobCk/KGwuX19maXJzdD1vLl9fZmlyc3QsbC5fX2xhc3Q9by5fX2xhc3QsbC5fX3NpemU9by5fX3NpemUsbC5fX2luZGVudD1vLl9faW5kZW50LGwuX19mb3JtYXQ9by5fX2Zvcm1hdCxsLl9fZGlyPW8uX19kaXIpOlEobykmJlEobCkmJihsLl9fZm9ybWF0PW8uX19mb3JtYXQsbC5fX3N0eWxlPW8uX19zdHlsZSxsLl9fbW9kZT1vLl9fbW9kZSxsLl9fZGV0YWlsPW8uX19kZXRhaWwpLG4uYWRkKHIpLGwuX19rZXk9cix2YyhsKSx0LnNldChyLGwpLGwpfWdldFRleHRDb250ZW50KCl7cmV0dXJuIiJ9Z2V0VGV4dENvbnRlbnRTaXplKCl7cmV0dXJuIHRoaXMuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9Y3JlYXRlRE9NKCl7VSg3MCl9dXBkYXRlRE9NKCl7VSg3MSl9ZXhwb3J0RE9NKHQpe3JldHVybntlbGVtZW50OnRoaXMuY3JlYXRlRE9NKHQuX2NvbmZpZyx0KX19ZXhwb3J0SlNPTigpe1UoNzIpfXN0YXRpYyBpbXBvcnRKU09OKCl7VSgxOCx0aGlzLm5hbWUpfXN0YXRpYyB0cmFuc2Zvcm0oKXtyZXR1cm4gbnVsbH1yZW1vdmUodCl7cWgodGhpcywhMCx0KX1yZXBsYWNlKHQsbil7SnQoKTt2YXIgcj1LZSgpO3IhPT1udWxsJiYocj1yLmNsb25lKCkpLGhmKHRoaXMsdCk7bGV0IG89dGhpcy5nZXRMYXRlc3QoKSxpPXRoaXMuX19rZXksbD10Ll9fa2V5LHM9dC5nZXRXcml0YWJsZSgpO3Q9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0V3JpdGFibGUoKTtsZXQgYT10Ll9fc2l6ZTtpaShzKTtsZXQgdT1vLmdldFByZXZpb3VzU2libGluZygpLGM9by5nZXROZXh0U2libGluZygpLGQ9by5fX3ByZXYsZj1vLl9fbmV4dCxoPW8uX19wYXJlbnQ7cmV0dXJuIHFoKG8sITEsITApLHU9PT1udWxsP3QuX19maXJzdD1sOnUuZ2V0V3JpdGFibGUoKS5fX25leHQ9bCxzLl9fcHJldj1kLGM9PT1udWxsP3QuX19sYXN0PWw6Yy5nZXRXcml0YWJsZSgpLl9fcHJldj1sLHMuX19uZXh0PWYscy5fX3BhcmVudD1oLHQuX19zaXplPWEsbiYmdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2goZz0+e3MuYXBwZW5kKGcpfSksZGUocikmJih2cihyKSxuPXIuYW5jaG9yLHI9ci5mb2N1cyxuLmtleT09PWkmJmh5KG4scyksci5rZXk9PT1pJiZoeShyLHMpKSxtbygpPT09aSYmTXQobCksc31pbnNlcnRBZnRlcih0LG49ITApe0p0KCksaGYodGhpcyx0KTt2YXIgcj10aGlzLmdldFdyaXRhYmxlKCk7bGV0IG89dC5nZXRXcml0YWJsZSgpO3ZhciBpPW8uZ2V0UGFyZW50KCk7bGV0IGw9S2UoKTt2YXIgcz0hMSxhPSExO2lmKGkhPT1udWxsKXt2YXIgdT10LmdldEluZGV4V2l0aGluUGFyZW50KCk7aWkobyksZGUobCkmJihhPWkuX19rZXkscz1sLmFuY2hvcixpPWwuZm9jdXMscz1zLnR5cGU9PT0iZWxlbWVudCImJnMua2V5PT09YSYmcy5vZmZzZXQ9PT11KzEsYT1pLnR5cGU9PT0iZWxlbWVudCImJmkua2V5PT09YSYmaS5vZmZzZXQ9PT11KzEpfWk9dGhpcy5nZXROZXh0U2libGluZygpLHU9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0V3JpdGFibGUoKTtsZXQgYz1vLl9fa2V5LGQ9ci5fX25leHQ7cmV0dXJuIGk9PT1udWxsP3UuX19sYXN0PWM6aS5nZXRXcml0YWJsZSgpLl9fcHJldj1jLHUuX19zaXplKyssci5fX25leHQ9YyxvLl9fbmV4dD1kLG8uX19wcmV2PXIuX19rZXksby5fX3BhcmVudD1yLl9fcGFyZW50LG4mJmRlKGwpJiYobj10aGlzLmdldEluZGV4V2l0aGluUGFyZW50KCksRWMobCx1LG4rMSkscj11Ll9fa2V5LHMmJmwuYW5jaG9yLnNldChyLG4rMiwiZWxlbWVudCIpLGEmJmwuZm9jdXMuc2V0KHIsbisyLCJlbGVtZW50IikpLHR9aW5zZXJ0QmVmb3JlKHQsbj0hMCl7SnQoKSxoZih0aGlzLHQpO3ZhciByPXRoaXMuZ2V0V3JpdGFibGUoKTtsZXQgbz10LmdldFdyaXRhYmxlKCksaT1vLl9fa2V5O2lpKG8pO2xldCBsPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkscz10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRXcml0YWJsZSgpLGE9ci5fX3ByZXYsdT10aGlzLmdldEluZGV4V2l0aGluUGFyZW50KCk7cmV0dXJuIGw9PT1udWxsP3MuX19maXJzdD1pOmwuZ2V0V3JpdGFibGUoKS5fX25leHQ9aSxzLl9fc2l6ZSsrLHIuX19wcmV2PWksby5fX3ByZXY9YSxvLl9fbmV4dD1yLl9fa2V5LG8uX19wYXJlbnQ9ci5fX3BhcmVudCxyPUtlKCksbiYmZGUocikmJihuPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLEVjKHIsbix1KSksdH1pc1BhcmVudFJlcXVpcmVkKCl7cmV0dXJuITF9Y3JlYXRlUGFyZW50RWxlbWVudE5vZGUoKXtyZXR1cm4gaGkoKX1zZWxlY3RQcmV2aW91cyh0LG4pe0p0KCk7bGV0IHI9dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSxvPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpO3JldHVybiByPT09bnVsbD9vLnNlbGVjdCgwLDApOkIocik/ci5zZWxlY3QoKTpRKHIpP3Iuc2VsZWN0KHQsbik6KHQ9ci5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsby5zZWxlY3QodCx0KSl9c2VsZWN0TmV4dCh0LG4pe0p0KCk7bGV0IHI9dGhpcy5nZXROZXh0U2libGluZygpLG89dGhpcy5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIHI9PT1udWxsP28uc2VsZWN0KCk6QihyKT9yLnNlbGVjdCgwLDApOlEocik/ci5zZWxlY3QodCxuKToodD1yLmdldEluZGV4V2l0aGluUGFyZW50KCksby5zZWxlY3QodCx0KSl9bWFya0RpcnR5KCl7dGhpcy5nZXRXcml0YWJsZSgpfX1jbGFzcyBJbCBleHRlbmRzIExhe3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImxpbmVicmVhayJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgSWwodC5fX2tleSl9Y29uc3RydWN0b3IodCl7c3VwZXIodCl9Z2V0VGV4dENvbnRlbnQoKXtyZXR1cm5gCmB9Y3JlYXRlRE9NKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIil9dXBkYXRlRE9NKCl7cmV0dXJuITF9c3RhdGljIGltcG9ydERPTSgpe3JldHVybnticjp0PT57bGV0IG49dC5wYXJlbnRFbGVtZW50LHIsbztyZXR1cm4gbiE9PW51bGwmJigocj1uLmZpcnN0Q2hpbGQpPT09dHx8ci5uZXh0U2libGluZz09PXQmJnIubm9kZVR5cGU9PT0zJiYoci50ZXh0Q29udGVudHx8IiIpLm1hdGNoKC9eKCB8XHR8XHI/XG4pKyQvKSE9PW51bGwpJiYoKG89bi5sYXN0Q2hpbGQpPT09dHx8by5wcmV2aW91c1NpYmxpbmc9PT10JiZvLm5vZGVUeXBlPT09MyYmKG8udGV4dENvbnRlbnR8fCIiKS5tYXRjaCgvXiggfFx0fFxyP1xuKSskLykhPT1udWxsKT9udWxsOntjb252ZXJzaW9uOk5iLHByaW9yaXR5OjB9fX19c3RhdGljIGltcG9ydEpTT04oKXtyZXR1cm4gJGwoKX1leHBvcnRKU09OKCl7cmV0dXJue3R5cGU6ImxpbmVicmVhayIsdmVyc2lvbjoxfX19ZnVuY3Rpb24gTmIoKXtyZXR1cm57bm9kZTokbCgpfX1mdW5jdGlvbiAkbCgpe3JldHVybiBEYShuZXcgSWwpfWZ1bmN0aW9uIG1hKGUpe3JldHVybiBlIGluc3RhbmNlb2YgSWx9ZnVuY3Rpb24gbWYoZSx0KXtyZXR1cm4gdCYxNj8iY29kZSI6dCYxMjg/Im1hcmsiOnQmMzI/InN1YiI6dCY2ND8ic3VwIjpudWxsfWZ1bmN0aW9uIHZmKGUsdCl7cmV0dXJuIHQmMT8ic3Ryb25nIjp0JjI/ImVtIjoic3BhbiJ9ZnVuY3Rpb24geWYoZSx0LG4scixvKXtlPXIuY2xhc3NMaXN0LHI9RHMobywiYmFzZSIpLHIhPT12b2lkIDAmJmUuYWRkKC4uLnIpLHI9RHMobywidW5kZXJsaW5lU3RyaWtldGhyb3VnaCIpO2xldCBpPSExLGw9dCY4JiZ0JjQ7dmFyIHM9biY4JiZuJjQ7ciE9PXZvaWQgMCYmKHM/KGk9ITAsbHx8ZS5hZGQoLi4ucikpOmwmJmUucmVtb3ZlKC4uLnIpKTtmb3IobGV0IGEgaW4gb2kpcz1vaVthXSxyPURzKG8sYSksciE9PXZvaWQgMCYmKG4mcz8haXx8YSE9PSJ1bmRlcmxpbmUiJiZhIT09InN0cmlrZXRocm91Z2giPyghKHQmcyl8fGwmJmE9PT0idW5kZXJsaW5lInx8YT09PSJzdHJpa2V0aHJvdWdoIikmJmUuYWRkKC4uLnIpOnQmcyYmZS5yZW1vdmUoLi4ucik6dCZzJiZlLnJlbW92ZSguLi5yKSl9ZnVuY3Rpb24geGYoZSx0LG4pe2xldCByPXQuZmlyc3RDaGlsZDtpZihuPW4uaXNDb21wb3NpbmcoKSxlKz1uP2FkOiIiLHI9PW51bGwpdC50ZXh0Q29udGVudD1lO2Vsc2UgaWYodD1yLm5vZGVWYWx1ZSx0IT09ZSlpZihufHxibyl7bj10Lmxlbmd0aDtsZXQgbz1lLmxlbmd0aCxpPTAsbD0wO2Zvcig7aTxuJiZpPG8mJnRbaV09PT1lW2ldOylpKys7Zm9yKDtsK2k8biYmbCtpPG8mJnRbbi1sLTFdPT09ZVtvLWwtMV07KWwrKztlPVtpLG4taS1sLGUuc2xpY2UoaSxvLWwpXTtsZXRbcyxhLHVdPWU7YSE9PTAmJnIuZGVsZXRlRGF0YShzLGEpLHIuaW5zZXJ0RGF0YShzLHUpfWVsc2Ugci5ub2RlVmFsdWU9ZX1mdW5jdGlvbiBkdShlLHQpe3JldHVybiB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCksdC5hcHBlbmRDaGlsZChlKSx0fWNsYXNzICRpIGV4dGVuZHMgTGF7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4idGV4dCJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgJGkodC5fX3RleHQsdC5fX2tleSl9Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLl9fdGV4dD10LHRoaXMuX19mb3JtYXQ9MCx0aGlzLl9fc3R5bGU9IiIsdGhpcy5fX2RldGFpbD10aGlzLl9fbW9kZT0wfWdldEZvcm1hdCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fZm9ybWF0fWdldERldGFpbCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fZGV0YWlsfWdldE1vZGUoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpO3JldHVybiBjYlt0Ll9fbW9kZV19Z2V0U3R5bGUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3N0eWxlfWlzVG9rZW4oKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX21vZGU9PT0xfWlzQ29tcG9zaW5nKCl7cmV0dXJuIHRoaXMuX19rZXk9PT1tbygpfWlzU2VnbWVudGVkKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19tb2RlPT09Mn1pc0RpcmVjdGlvbmxlc3MoKXtyZXR1cm4odGhpcy5nZXRMYXRlc3QoKS5fX2RldGFpbCYxKSE9PTB9aXNVbm1lcmdlYWJsZSgpe3JldHVybih0aGlzLmdldExhdGVzdCgpLl9fZGV0YWlsJjIpIT09MH1oYXNGb3JtYXQodCl7cmV0dXJuIHQ9b2lbdF0sKHRoaXMuZ2V0Rm9ybWF0KCkmdCkhPT0wfWlzU2ltcGxlVGV4dCgpe3JldHVybiB0aGlzLl9fdHlwZT09PSJ0ZXh0IiYmdGhpcy5fX21vZGU9PT0wfWdldFRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX190ZXh0fWdldEZvcm1hdEZsYWdzKHQsbil7bGV0IHI9dGhpcy5nZXRMYXRlc3QoKS5fX2Zvcm1hdDtyZXR1cm4gcncocix0LG4pfWNyZWF0ZURPTSh0KXt2YXIgbj10aGlzLl9fZm9ybWF0LHI9bWYodGhpcyxuKTtsZXQgbz12Zih0aGlzLG4pLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyPT09bnVsbD9vOnIpLGw9aTtyZXR1cm4gdGhpcy5oYXNGb3JtYXQoImNvZGUiKSYmaS5zZXRBdHRyaWJ1dGUoInNwZWxsY2hlY2siLCJmYWxzZSIpLHIhPT1udWxsJiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KG8pLGkuYXBwZW5kQ2hpbGQobCkpLHI9bCx4Zih0aGlzLl9fdGV4dCxyLHRoaXMpLHQ9dC50aGVtZS50ZXh0LHQhPT12b2lkIDAmJnlmKG8sMCxuLHIsdCksbj10aGlzLl9fc3R5bGUsbiE9PSIiJiYoaS5zdHlsZS5jc3NUZXh0PW4pLGl9dXBkYXRlRE9NKHQsbixyKXtsZXQgbz10aGlzLl9fdGV4dDt2YXIgaT10Ll9fZm9ybWF0LGw9dGhpcy5fX2Zvcm1hdCxzPW1mKHRoaXMsaSk7bGV0IGE9bWYodGhpcyxsKTt2YXIgdT12Zih0aGlzLGkpO2xldCBjPXZmKHRoaXMsbCk7cmV0dXJuKHM9PT1udWxsP3U6cykhPT0oYT09PW51bGw/YzphKT8hMDpzPT09YSYmdSE9PWM/KGk9bi5maXJzdENoaWxkLGk9PW51bGwmJlUoNDgpLHQ9cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGMpLHhmKG8sdCx0aGlzKSxyPXIudGhlbWUudGV4dCxyIT09dm9pZCAwJiZ5ZihjLDAsbCx0LHIpLG4ucmVwbGFjZUNoaWxkKHMsaSksITEpOih1PW4sYSE9PW51bGwmJnMhPT1udWxsJiYodT1uLmZpcnN0Q2hpbGQsdT09bnVsbCYmVSg0OSkpLHhmKG8sdSx0aGlzKSxyPXIudGhlbWUudGV4dCxyIT09dm9pZCAwJiZpIT09bCYmeWYoYyxpLGwsdSxyKSxsPXRoaXMuX19zdHlsZSx0Ll9fc3R5bGUhPT1sJiYobi5zdHlsZS5jc3NUZXh0PWwpLCExKX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJueyIjdGV4dCI6KCk9Pih7Y29udmVyc2lvbjpQYixwcmlvcml0eTowfSksYjooKT0+KHtjb252ZXJzaW9uOlJiLHByaW9yaXR5OjB9KSxjb2RlOigpPT4oe2NvbnZlcnNpb246cm8scHJpb3JpdHk6MH0pLGVtOigpPT4oe2NvbnZlcnNpb246cm8scHJpb3JpdHk6MH0pLGk6KCk9Pih7Y29udmVyc2lvbjpybyxwcmlvcml0eTowfSksczooKT0+KHtjb252ZXJzaW9uOnJvLHByaW9yaXR5OjB9KSxzcGFuOigpPT4oe2NvbnZlcnNpb246YmIscHJpb3JpdHk6MH0pLHN0cm9uZzooKT0+KHtjb252ZXJzaW9uOnJvLHByaW9yaXR5OjB9KSxzdWI6KCk9Pih7Y29udmVyc2lvbjpybyxwcmlvcml0eTowfSksc3VwOigpPT4oe2NvbnZlcnNpb246cm8scHJpb3JpdHk6MH0pLHU6KCk9Pih7Y29udmVyc2lvbjpybyxwcmlvcml0eTowfSl9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPUV0KHQudGV4dCk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldERldGFpbCh0LmRldGFpbCksbi5zZXRNb2RlKHQubW9kZSksbi5zZXRTdHlsZSh0LnN0eWxlKSxufWV4cG9ydERPTSh0KXtyZXR1cm57ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCE9PW51bGwmJmRkKHQpfHxVKDEzMiksdC5zdHlsZS53aGl0ZVNwYWNlPSJwcmUtd3JhcCIsdGhpcy5oYXNGb3JtYXQoImJvbGQiKSYmKHQ9ZHUodCwiYiIpKSx0aGlzLmhhc0Zvcm1hdCgiaXRhbGljIikmJih0PWR1KHQsImkiKSksdGhpcy5oYXNGb3JtYXQoInN0cmlrZXRocm91Z2giKSYmKHQ9ZHUodCwicyIpKSx0aGlzLmhhc0Zvcm1hdCgidW5kZXJsaW5lIikmJih0PWR1KHQsInUiKSkse2VsZW1lbnQ6dH19ZXhwb3J0SlNPTigpe3JldHVybntkZXRhaWw6dGhpcy5nZXREZXRhaWwoKSxmb3JtYXQ6dGhpcy5nZXRGb3JtYXQoKSxtb2RlOnRoaXMuZ2V0TW9kZSgpLHN0eWxlOnRoaXMuZ2V0U3R5bGUoKSx0ZXh0OnRoaXMuZ2V0VGV4dENvbnRlbnQoKSx0eXBlOiJ0ZXh0Iix2ZXJzaW9uOjF9fXNlbGVjdGlvblRyYW5zZm9ybSgpe31zZXRGb3JtYXQodCl7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fZm9ybWF0PXR5cGVvZiB0PT0ic3RyaW5nIj9vaVt0XTp0LG59c2V0RGV0YWlsKHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX2RldGFpbD10eXBlb2YgdD09InN0cmluZyI/c2JbdF06dCxufXNldFN0eWxlKHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX3N0eWxlPXQsbn10b2dnbGVGb3JtYXQodCl7cmV0dXJuIHQ9b2lbdF0sdGhpcy5zZXRGb3JtYXQodGhpcy5nZXRGb3JtYXQoKV50KX10b2dnbGVEaXJlY3Rpb25sZXNzKCl7bGV0IHQ9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiB0Ll9fZGV0YWlsXj0xLHR9dG9nZ2xlVW5tZXJnZWFibGUoKXtsZXQgdD10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIHQuX19kZXRhaWxePTIsdH1zZXRNb2RlKHQpe2lmKHQ9dWJbdF0sdGhpcy5fX21vZGU9PT10KXJldHVybiB0aGlzO2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX21vZGU9dCxufXNldFRleHRDb250ZW50KHQpe2lmKHRoaXMuX190ZXh0PT09dClyZXR1cm4gdGhpcztsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX190ZXh0PXQsbn1zZWxlY3QodCxuKXtKdCgpO2xldCByPUtlKCk7dmFyIG89dGhpcy5nZXRUZXh0Q29udGVudCgpO2xldCBpPXRoaXMuX19rZXk7aWYodHlwZW9mIG89PSJzdHJpbmciPyhvPW8ubGVuZ3RoLHQ9PT12b2lkIDAmJih0PW8pLG49PT12b2lkIDAmJihuPW8pKTpuPXQ9MCxkZShyKSlvPW1vKCksbyE9PXIuYW5jaG9yLmtleSYmbyE9PXIuZm9jdXMua2V5fHxNdChpKSxyLnNldFRleHROb2RlUmFuZ2UodGhpcyx0LHRoaXMsbik7ZWxzZSByZXR1cm4gUncoaSx0LGksbiwidGV4dCIsInRleHQiKTtyZXR1cm4gcn1zcGxpY2VUZXh0KHQsbixyLG8pe2xldCBpPXRoaXMuZ2V0V3JpdGFibGUoKSxsPWkuX190ZXh0LHM9ci5sZW5ndGgsYT10OzA+YSYmKGE9cythLDA+YSYmKGE9MCkpO2xldCB1PUtlKCk7cmV0dXJuIG8mJmRlKHUpJiYodCs9cyx1LnNldFRleHROb2RlUmFuZ2UoaSx0LGksdCkpLG49bC5zbGljZSgwLGEpK3IrbC5zbGljZShhK24pLGkuX190ZXh0PW4saX1jYW5JbnNlcnRUZXh0QmVmb3JlKCl7cmV0dXJuITB9Y2FuSW5zZXJ0VGV4dEFmdGVyKCl7cmV0dXJuITB9c3BsaXRUZXh0KC4uLnQpe0p0KCk7dmFyIG49dGhpcy5nZXRMYXRlc3QoKSxyPW4uZ2V0VGV4dENvbnRlbnQoKSxvPW4uX19rZXksaT1tbygpLGw9bmV3IFNldCh0KTt0PVtdO2Zvcih2YXIgcz1yLmxlbmd0aCxhPSIiLHU9MDt1PHM7dSsrKWEhPT0iIiYmbC5oYXModSkmJih0LnB1c2goYSksYT0iIiksYSs9clt1XTtpZihhIT09IiImJnQucHVzaChhKSxsPXQubGVuZ3RoLGw9PT0wKXJldHVybltdO2lmKHRbMF09PT1yKXJldHVybltuXTt2YXIgYz10WzBdO3I9bi5nZXRQYXJlbnRPclRocm93KCksdT1uLmdldEZvcm1hdCgpO2xldCBkPW4uZ2V0U3R5bGUoKSxmPW4uX19kZXRhaWw7cz0hMSxuLmlzU2VnbWVudGVkKCk/KGE9RXQoYyksYS5fX2Zvcm1hdD11LGEuX19zdHlsZT1kLGEuX19kZXRhaWw9ZixzPSEwKTooYT1uLmdldFdyaXRhYmxlKCksYS5fX3RleHQ9Yyksbj1LZSgpLGE9W2FdLGM9Yy5sZW5ndGg7Zm9yKGxldCBtPTE7bTxsO20rKyl7dmFyIGg9dFttXSxnPWgubGVuZ3RoO2g9RXQoaCkuZ2V0V3JpdGFibGUoKSxoLl9fZm9ybWF0PXUsaC5fX3N0eWxlPWQsaC5fX2RldGFpbD1mO2xldCBTPWguX19rZXk7aWYoZz1jK2csZGUobikpe2xldCB2PW4uYW5jaG9yLHk9bi5mb2N1czt2LmtleT09PW8mJnYudHlwZT09PSJ0ZXh0IiYmdi5vZmZzZXQ+YyYmdi5vZmZzZXQ8PWcmJih2LmtleT1TLHYub2Zmc2V0LT1jLG4uZGlydHk9ITApLHkua2V5PT09byYmeS50eXBlPT09InRleHQiJiZ5Lm9mZnNldD5jJiZ5Lm9mZnNldDw9ZyYmKHkua2V5PVMseS5vZmZzZXQtPWMsbi5kaXJ0eT0hMCl9aT09PW8mJk10KFMpLGM9ZyxhLnB1c2goaCl9cmV0dXJuIG89dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSxpPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSxvIT09bnVsbCYmdmMobyksaSE9PW51bGwmJnZjKGkpLG89ci5nZXRXcml0YWJsZSgpLGk9dGhpcy5nZXRJbmRleFdpdGhpblBhcmVudCgpLHM/KG8uc3BsaWNlKGksMCxhKSx0aGlzLnJlbW92ZSgpKTpvLnNwbGljZShpLDEsYSksZGUobikmJkVjKG4scixpLGwtMSksYX1tZXJnZVdpdGhTaWJsaW5nKHQpe3ZhciBuPXQ9PT10aGlzLmdldFByZXZpb3VzU2libGluZygpO258fHQ9PT10aGlzLmdldE5leHRTaWJsaW5nKCl8fFUoNTApO3ZhciByPXRoaXMuX19rZXk7bGV0IG89dC5fX2tleSxpPXRoaXMuX190ZXh0LGw9aS5sZW5ndGg7bW8oKT09PW8mJk10KHIpO2xldCBzPUtlKCk7aWYoZGUocykpe2xldCBhPXMuYW5jaG9yLHU9cy5mb2N1czthIT09bnVsbCYmYS5rZXk9PT1vJiYoX3koYSxuLHIsdCxsKSxzLmRpcnR5PSEwKSx1IT09bnVsbCYmdS5rZXk9PT1vJiYoX3kodSxuLHIsdCxsKSxzLmRpcnR5PSEwKX1yZXR1cm4gcj10Ll9fdGV4dCx0aGlzLnNldFRleHRDb250ZW50KG4/citpOmkrciksbj10aGlzLmdldFdyaXRhYmxlKCksdC5yZW1vdmUoKSxufWlzVGV4dEVudGl0eSgpe3JldHVybiExfX1mdW5jdGlvbiBiYihlKXtsZXQgdD1lLnN0eWxlLmZvbnRXZWlnaHQ9PT0iNzAwIixuPWUuc3R5bGUudGV4dERlY29yYXRpb249PT0ibGluZS10aHJvdWdoIixyPWUuc3R5bGUuZm9udFN0eWxlPT09Iml0YWxpYyIsbz1lLnN0eWxlLnRleHREZWNvcmF0aW9uPT09InVuZGVybGluZSIsaT1lLnN0eWxlLnZlcnRpY2FsQWxpZ247cmV0dXJue2ZvckNoaWxkOmw9PihRKGwpJiYodCYmbC50b2dnbGVGb3JtYXQoImJvbGQiKSxuJiZsLnRvZ2dsZUZvcm1hdCgic3RyaWtldGhyb3VnaCIpLHImJmwudG9nZ2xlRm9ybWF0KCJpdGFsaWMiKSxvJiZsLnRvZ2dsZUZvcm1hdCgidW5kZXJsaW5lIiksaT09PSJzdWIiJiZsLnRvZ2dsZUZvcm1hdCgic3Vic2NyaXB0IiksaT09PSJzdXBlciImJmwudG9nZ2xlRm9ybWF0KCJzdXBlcnNjcmlwdCIpKSxsKSxub2RlOm51bGx9fWZ1bmN0aW9uIFJiKGUpe2xldCB0PWUuc3R5bGUuZm9udFdlaWdodD09PSJub3JtYWwiO3JldHVybntmb3JDaGlsZDpuPT4oUShuKSYmIXQmJm4udG9nZ2xlRm9ybWF0KCJib2xkIiksbiksbm9kZTpudWxsfX1sZXQgZHk9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gUGIoZSl7ZS5wYXJlbnRFbGVtZW50PT09bnVsbCYmVSgxMjkpO2Zvcih2YXIgdD1lLnRleHRDb250ZW50fHwiIixuLHI9ZS5wYXJlbnROb2RlLG89W2VdO3IhPT1udWxsJiYobj1keS5nZXQocikpPT09dm9pZCAwJiYhKHIubm9kZU5hbWU9PT0iUFJFInx8ci5ub2RlVHlwZT09PTEmJnIuc3R5bGUud2hpdGVTcGFjZS5zdGFydHNXaXRoKCJwcmUiKSk7KW8ucHVzaChyKSxyPXIucGFyZW50Tm9kZTtmb3Iobj1uPT09dm9pZCAwP3I6bixyPTA7cjxvLmxlbmd0aDtyKyspZHkuc2V0KG9bcl0sbik7aWYobiE9PW51bGwpe2Zvcih0PXQuc3BsaXQoLyhccj9cbnxcdCkvKSxlPVtdLG89dC5sZW5ndGgsbj0wO248bztuKyspcj10W25dLHI9PT1gCmB8fHI9PT1gXHIKYD9lLnB1c2goJGwoKSk6cj09PSIJIj9lLnB1c2goaGQoKSk6ciE9PSIiJiZlLnB1c2goRXQocikpO3JldHVybntub2RlOmV9fWlmKHQ9dC5yZXBsYWNlKC9cci9nLCIiKS5yZXBsYWNlKC9bIFx0XG5dKy9nLCIgIiksdD09PSIiKXJldHVybntub2RlOm51bGx9O2lmKHRbMF09PT0iICIpe2ZvcihvPWUsbj0hMDtvIT09bnVsbCYmKG89ZnkobywhMSkpIT09bnVsbDspaWYocj1vLnRleHRDb250ZW50fHwiIiwwPHIubGVuZ3RoKXsvWyBcdFxuXSQvLnRlc3QocikmJih0PXQuc2xpY2UoMSkpLG49ITE7YnJlYWt9biYmKHQ9dC5zbGljZSgxKSl9aWYodFt0Lmxlbmd0aC0xXT09PSIgIil7Zm9yKG89ITA7ZSE9PW51bGwmJihlPWZ5KGUsITApKSE9PW51bGw7KWlmKDA8KGUudGV4dENvbnRlbnR8fCIiKS5yZXBsYWNlKC9eKCB8XHR8XHI/XG4pKy8sIiIpLmxlbmd0aCl7bz0hMTticmVha31vJiYodD10LnNsaWNlKDAsdC5sZW5ndGgtMSkpfXJldHVybiB0PT09IiI/e25vZGU6bnVsbH06e25vZGU6RXQodCl9fWxldCBPYj1uZXcgUmVnRXhwKC9eKGF8YWJicnxhY3JvbnltfGJ8Y2l0ZXxjb2RlfGRlbHxlbXxpfGluc3xrYmR8bGFiZWx8b3V0cHV0fHF8cnVieXxzfHNhbXB8c3BhbnxzdHJvbmd8c3VifHN1cHx0aW1lfHV8dHR8dmFyKSQvLCJpIik7ZnVuY3Rpb24gZnkoZSx0KXtmb3IoOzspe2Zvcih2YXIgbj12b2lkIDA7KG49dD9lLm5leHRTaWJsaW5nOmUucHJldmlvdXNTaWJsaW5nKT09PW51bGw7KWlmKGU9ZS5wYXJlbnRFbGVtZW50LGU9PT1udWxsKXJldHVybiBudWxsO2lmKGU9bixlLm5vZGVUeXBlPT09MSYmKG49ZS5zdHlsZS5kaXNwbGF5LG49PT0iIiYmZS5ub2RlTmFtZS5tYXRjaChPYik9PT1udWxsfHxuIT09IiImJiFuLnN0YXJ0c1dpdGgoImlubGluZSIpKSlyZXR1cm4gbnVsbDtmb3IoOyhuPXQ/ZS5maXJzdENoaWxkOmUubGFzdENoaWxkKSE9PW51bGw7KWU9bjtpZihlLm5vZGVUeXBlPT09MylyZXR1cm4gZTtpZihlLm5vZGVOYW1lPT09IkJSIilyZXR1cm4gbnVsbH19bGV0IEFiPXtjb2RlOiJjb2RlIixlbToiaXRhbGljIixpOiJpdGFsaWMiLHM6InN0cmlrZXRocm91Z2giLHN0cm9uZzoiYm9sZCIsc3ViOiJzdWJzY3JpcHQiLHN1cDoic3VwZXJzY3JpcHQiLHU6InVuZGVybGluZSJ9O2Z1bmN0aW9uIHJvKGUpe2xldCB0PUFiW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07cmV0dXJuIHQ9PT12b2lkIDA/e25vZGU6bnVsbH06e2ZvckNoaWxkOm49PihRKG4pJiYhbi5oYXNGb3JtYXQodCkmJm4udG9nZ2xlRm9ybWF0KHQpLG4pLG5vZGU6bnVsbH19ZnVuY3Rpb24gRXQoZT0iIil7cmV0dXJuIERhKG5ldyAkaShlKSl9ZnVuY3Rpb24gUShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mICRpfWNsYXNzIGpsIGV4dGVuZHMgJGl7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4idGFiIn1zdGF0aWMgY2xvbmUodCl7bGV0IG49bmV3IGpsKHQuX19rZXkpO3JldHVybiBuLl9fdGV4dD10Ll9fdGV4dCxuLl9fZm9ybWF0PXQuX19mb3JtYXQsbi5fX3N0eWxlPXQuX19zdHlsZSxufWNvbnN0cnVjdG9yKHQpe3N1cGVyKCIJIix0KSx0aGlzLl9fZGV0YWlsPTJ9c3RhdGljIGltcG9ydERPTSgpe3JldHVybiBudWxsfXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPWhkKCk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldFN0eWxlKHQuc3R5bGUpLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToidGFiIix2ZXJzaW9uOjF9fXNldFRleHRDb250ZW50KCl7VSgxMjYpfXNldERldGFpbCgpe1UoMTI3KX1zZXRNb2RlKCl7VSgxMjgpfWNhbkluc2VydFRleHRCZWZvcmUoKXtyZXR1cm4hMX1jYW5JbnNlcnRUZXh0QWZ0ZXIoKXtyZXR1cm4hMX19ZnVuY3Rpb24gaGQoKXtyZXR1cm4gRGEobmV3IGpsKX1jbGFzcyB5cntjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5fc2VsZWN0aW9uPW51bGwsdGhpcy5rZXk9dCx0aGlzLm9mZnNldD1uLHRoaXMudHlwZT1yfWlzKHQpe3JldHVybiB0aGlzLmtleT09PXQua2V5JiZ0aGlzLm9mZnNldD09PXQub2Zmc2V0JiZ0aGlzLnR5cGU9PT10LnR5cGV9aXNCZWZvcmUodCl7bGV0IG49dGhpcy5nZXROb2RlKCkscj10LmdldE5vZGUoKSxvPXRoaXMub2Zmc2V0O2lmKHQ9dC5vZmZzZXQsQihuKSl7dmFyIGk9bi5nZXREZXNjZW5kYW50QnlJbmRleChvKTtuPWk/P259cmV0dXJuIEIocikmJihpPXIuZ2V0RGVzY2VuZGFudEJ5SW5kZXgodCkscj1pPz9yKSxuPT09cj9vPHQ6bi5pc0JlZm9yZShyKX1nZXROb2RlKCl7bGV0IHQ9JHQodGhpcy5rZXkpO3JldHVybiB0PT09bnVsbCYmVSgyMCksdH1zZXQodCxuLHIpe2xldCBvPXRoaXMuX3NlbGVjdGlvbixpPXRoaXMua2V5O3RoaXMua2V5PXQsdGhpcy5vZmZzZXQ9bix0aGlzLnR5cGU9cixCbCgpfHwobW8oKT09PWkmJk10KHQpLG8hPT1udWxsJiYoby5fY2FjaGVkTm9kZXM9bnVsbCxvLmRpcnR5PSEwKSl9fWZ1bmN0aW9uIF9mKGUsdCl7bGV0IG49dC5fX2tleSxyPWUub2Zmc2V0LG89ImVsZW1lbnQiO2lmKFEodCkpbz0idGV4dCIsdD10LmdldFRleHRDb250ZW50U2l6ZSgpLHI+dCYmKHI9dCk7ZWxzZSBpZighQih0KSl7dmFyIGk9dC5nZXROZXh0U2libGluZygpO1EoaSk/KG49aS5fX2tleSxyPTAsbz0idGV4dCIpOihpPXQuZ2V0UGFyZW50KCkpJiYobj1pLl9fa2V5LHI9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEpfWUuc2V0KG4scixvKX1mdW5jdGlvbiBoeShlLHQpe2lmKEIodCkpe2xldCBuPXQuZ2V0TGFzdERlc2NlbmRhbnQoKTtCKG4pfHxRKG4pP19mKGUsbik6X2YoZSx0KX1lbHNlIF9mKGUsdCl9ZnVuY3Rpb24gcHkoZSx0LG4scil7bGV0IG89ZS5nZXROb2RlKCksaT1vLmdldENoaWxkQXRJbmRleChlLm9mZnNldCksbD1FdCgpLHM9cXQobyk/aGkoKS5hcHBlbmQobCk6bDtsLnNldEZvcm1hdChuKSxsLnNldFN0eWxlKHIpLGk9PT1udWxsP28uYXBwZW5kKHMpOihpLmluc2VydEJlZm9yZShzKSx0LnR5cGU9PT0iZWxlbWVudCImJnQua2V5PT09ZS5rZXkmJnQub2Zmc2V0IT09ZS5vZmZzZXQmJnQuc2V0KHQua2V5LHQub2Zmc2V0KzEsImVsZW1lbnQiKSksZS5pcyh0KSYmdC5zZXQobC5fX2tleSwwLCJ0ZXh0IiksZS5zZXQobC5fX2tleSwwLCJ0ZXh0Iil9ZnVuY3Rpb24gYW8oZSx0LG4scil7ZS5rZXk9dCxlLm9mZnNldD1uLGUudHlwZT1yfWNsYXNzIHBke2NvbnN0cnVjdG9yKHQpe3RoaXMuZGlydHk9ITEsdGhpcy5fbm9kZXM9dCx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWlzKHQpe2lmKCF6bCh0KSlyZXR1cm4hMTtsZXQgbj10aGlzLl9ub2RlcyxyPXQuX25vZGVzO3JldHVybiBuLnNpemU9PT1yLnNpemUmJkFycmF5LmZyb20obikuZXZlcnkobz0+ci5oYXMobykpfWFkZCh0KXt0aGlzLmRpcnR5PSEwLHRoaXMuX25vZGVzLmFkZCh0KSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWRlbGV0ZSh0KXt0aGlzLmRpcnR5PSEwLHRoaXMuX25vZGVzLmRlbGV0ZSh0KSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWNsZWFyKCl7dGhpcy5kaXJ0eT0hMCx0aGlzLl9ub2Rlcy5jbGVhcigpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9aGFzKHQpe3JldHVybiB0aGlzLl9ub2Rlcy5oYXModCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHBkKG5ldyBTZXQodGhpcy5fbm9kZXMpKX1leHRyYWN0KCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZXMoKX1pbnNlcnRSYXdUZXh0KCl7fWluc2VydFRleHQoKXt9aW5zZXJ0Tm9kZXModCxuKXtsZXQgcj10aGlzLmdldE5vZGVzKCksbz1yLmxlbmd0aDt2YXIgaT1yW28tMV07aWYoUShpKSlpPWkuc2VsZWN0KCk7ZWxzZXtsZXQgbD1pLmdldEluZGV4V2l0aGluUGFyZW50KCkrMTtpPWkuZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdChsLGwpfWZvcihpLmluc2VydE5vZGVzKHQsbiksdD0wO3Q8bzt0Kyspclt0XS5yZW1vdmUoKTtyZXR1cm4hMH1nZXROb2Rlcygpe3ZhciB0PXRoaXMuX2NhY2hlZE5vZGVzO2lmKHQhPT1udWxsKXJldHVybiB0O3ZhciBuPXRoaXMuX25vZGVzO3Q9W107Zm9yKGxldCByIG9mIG4pbj0kdChyKSxuIT09bnVsbCYmdC5wdXNoKG4pO3JldHVybiBCbCgpfHwodGhpcy5fY2FjaGVkTm9kZXM9dCksdH1nZXRUZXh0Q29udGVudCgpe2xldCB0PXRoaXMuZ2V0Tm9kZXMoKSxuPSIiO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKW4rPXRbcl0uZ2V0VGV4dENvbnRlbnQoKTtyZXR1cm4gbn19ZnVuY3Rpb24gZGUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBraX1mdW5jdGlvbiBlcChlKXtsZXRbdCwsbl09T3coZSk7ZT1uLmdldENoaWxkcmVuKCk7bGV0IHI9ZS5sZW5ndGg7dmFyIG89ZVswXS5nZXRDaGlsZHJlbigpLmxlbmd0aDtsZXQgaT1BcnJheShyKTtmb3IodmFyIGw9MDtsPHI7bCsrKWlbbF09QXJyYXkobyk7Zm9yKG89MDtvPHI7bysrKXtsPWVbb10uZ2V0Q2hpbGRyZW4oKTtsZXQgcz0wO2ZvcihsZXQgYT0wO2E8bC5sZW5ndGg7YSsrKXtmb3IoO2lbb11bc107KXMrKztsZXQgdT1sW2FdLGM9dS5fX3Jvd1NwYW58fDEsZD11Ll9fY29sU3Bhbnx8MTtmb3IobGV0IGY9MDtmPGM7ZisrKWZvcihsZXQgaD0wO2g8ZDtoKyspaVtvK2ZdW3MraF09dTtpZih0PT09dSlyZXR1cm57Y29sU3BhbjpkLGNvbHVtbkluZGV4OnMscm93SW5kZXg6byxyb3dTcGFuOmN9O3MrPWR9fXJldHVybiBudWxsfWNsYXNzIGdke2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLmdyaWRLZXk9dCx0aGlzLmFuY2hvcj1uLHRoaXMuZm9jdXM9cix0aGlzLmRpcnR5PSExLHRoaXMuX2NhY2hlZE5vZGVzPW51bGwsbi5fc2VsZWN0aW9uPXRoaXMsci5fc2VsZWN0aW9uPXRoaXN9aXModCl7cmV0dXJuIEtnKHQpP3RoaXMuZ3JpZEtleT09PXQuZ3JpZEtleSYmdGhpcy5hbmNob3IuaXModC5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKHQuZm9jdXMpOiExfXNldCh0LG4scil7dGhpcy5kaXJ0eT0hMCx0aGlzLmdyaWRLZXk9dCx0aGlzLmFuY2hvci5rZXk9bix0aGlzLmZvY3VzLmtleT1yLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9Y2xvbmUoKXtyZXR1cm4gbmV3IGdkKHRoaXMuZ3JpZEtleSx0aGlzLmFuY2hvcix0aGlzLmZvY3VzKX1pc0NvbGxhcHNlZCgpe3JldHVybiExfWlzQmFja3dhcmQoKXtyZXR1cm4gdGhpcy5mb2N1cy5pc0JlZm9yZSh0aGlzLmFuY2hvcil9Z2V0Q2hhcmFjdGVyT2Zmc2V0cygpe3JldHVybiBqdSh0aGlzKX1leHRyYWN0KCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZXMoKX1pbnNlcnRSYXdUZXh0KCl7fWluc2VydFRleHQoKXt9aW5zZXJ0Tm9kZXModCxuKXtsZXQgcj10aGlzLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gamcoci5zZWxlY3QoMCxyLmdldENoaWxkcmVuU2l6ZSgpKSkuaW5zZXJ0Tm9kZXModCxuKX1nZXRTaGFwZSgpe3ZhciB0PSR0KHRoaXMuYW5jaG9yLmtleSk7aWYoQW4odCl8fFUoMTAzKSx0PWVwKHQpLHQ9PT1udWxsKXRocm93IEVycm9yKCJnZXRDZWxsUmVjdDogZXhwZWN0ZWQgdG8gZmluZCBBbmNob3JOb2RlIik7dmFyIG49JHQodGhpcy5mb2N1cy5rZXkpO0FuKG4pfHxVKDEwNCk7bGV0IHI9ZXAobik7aWYocj09PW51bGwpdGhyb3cgRXJyb3IoImdldENlbGxSZWN0OiBleHBlY3RlZCB0byBmaW5kIGZvY3VzQ2VsbE5vZGUiKTtuPU1hdGgubWluKHQuY29sdW1uSW5kZXgsci5jb2x1bW5JbmRleCk7bGV0IG89TWF0aC5tYXgodC5jb2x1bW5JbmRleCxyLmNvbHVtbkluZGV4KSxpPU1hdGgubWluKHQucm93SW5kZXgsci5yb3dJbmRleCk7cmV0dXJuIHQ9TWF0aC5tYXgodC5yb3dJbmRleCxyLnJvd0luZGV4KSx7ZnJvbVg6TWF0aC5taW4obixvKSxmcm9tWTpNYXRoLm1pbihpLHQpLHRvWDpNYXRoLm1heChuLG8pLHRvWTpNYXRoLm1heChpLHQpfX1nZXROb2Rlcygpe2Z1bmN0aW9uIHQoUyl7bGV0e2NlbGw6dixzdGFydENvbHVtbjp5LHN0YXJ0Um93Onh9PVM7YT1NYXRoLm1pbihhLHkpLHU9TWF0aC5taW4odSx4KSxjPU1hdGgubWF4KGMseSt2Ll9fY29sU3Bhbi0xKSxkPU1hdGgubWF4KGQseCt2Ll9fcm93U3Bhbi0xKX12YXIgbj10aGlzLl9jYWNoZWROb2RlcztpZihuIT09bnVsbClyZXR1cm4gbjt2YXIgcj10aGlzLmFuY2hvci5nZXROb2RlKCk7bj10aGlzLmZvY3VzLmdldE5vZGUoKSxyPXdjKHIsQW4pO3ZhciBvPXdjKG4sQW4pO0FuKHIpfHxVKDEwMyksQW4obyl8fFUoMTA0KSxuPXIuZ2V0UGFyZW50KCkseWEobil8fFUoMTA1KSxuPW4uZ2V0UGFyZW50KCksSmcobil8fFUoMTA2KTtsZXRbaSxsLHNdPVB3KG4scixvKSxhPU1hdGgubWluKGwuc3RhcnRDb2x1bW4scy5zdGFydENvbHVtbiksdT1NYXRoLm1pbihsLnN0YXJ0Um93LHMuc3RhcnRSb3cpLGM9TWF0aC5tYXgobC5zdGFydENvbHVtbitsLmNlbGwuX19jb2xTcGFuLTEscy5zdGFydENvbHVtbitzLmNlbGwuX19jb2xTcGFuLTEpLGQ9TWF0aC5tYXgobC5zdGFydFJvdytsLmNlbGwuX19yb3dTcGFuLTEscy5zdGFydFJvdytzLmNlbGwuX19yb3dTcGFuLTEpO3I9YSxvPXU7Zm9yKHZhciBmPWEsaD11O2E8cnx8dTxvfHxjPmZ8fGQ+aDspe2lmKGE8cil7dmFyIGc9aC1vOy0tcjtmb3IodmFyIG09MDttPD1nO20rKyl0KGlbbyttXVtyXSl9aWYodTxvKWZvcihnPWYtciwtLW8sbT0wO208PWc7bSsrKXQoaVtvXVtyK21dKTtpZihjPmYpZm9yKGc9aC1vLGYrPTEsbT0wO208PWc7bSsrKXQoaVtvK21dW2ZdKTtpZihkPmgpZm9yKGc9Zi1yLGgrPTEsbT0wO208PWc7bSsrKXQoaVtoXVtyK21dKX1mb3Iobj1bbl0scj1udWxsLG89dTtvPD1kO28rKylmb3IoZj1hO2Y8PWM7ZisrKSh7Y2VsbDpofT1pW29dW2ZdKSxnPWguZ2V0UGFyZW50KCkseWEoZyl8fFUoMTA3KSxnIT09ciYmbi5wdXNoKGcpLG4ucHVzaChoLC4uLnZiKGgpKSxyPWc7cmV0dXJuIEJsKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz1uKSxufWdldFRleHRDb250ZW50KCl7bGV0IHQ9dGhpcy5nZXROb2RlcygpLG49IiI7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspbis9dFtyXS5nZXRUZXh0Q29udGVudCgpO3JldHVybiBufX1mdW5jdGlvbiBLZyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGdkfWNsYXNzIGtpe2NvbnN0cnVjdG9yKHQsbixyLG8pe3RoaXMuYW5jaG9yPXQsdGhpcy5mb2N1cz1uLHRoaXMuZGlydHk9ITEsdGhpcy5mb3JtYXQ9cix0aGlzLnN0eWxlPW8sdGhpcy5fY2FjaGVkTm9kZXM9bnVsbCx0Ll9zZWxlY3Rpb249dGhpcyxuLl9zZWxlY3Rpb249dGhpc31pcyh0KXtyZXR1cm4gZGUodCk/dGhpcy5hbmNob3IuaXModC5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKHQuZm9jdXMpJiZ0aGlzLmZvcm1hdD09PXQuZm9ybWF0JiZ0aGlzLnN0eWxlPT09dC5zdHlsZTohMX1pc0JhY2t3YXJkKCl7cmV0dXJuIHRoaXMuZm9jdXMuaXNCZWZvcmUodGhpcy5hbmNob3IpfWlzQ29sbGFwc2VkKCl7cmV0dXJuIHRoaXMuYW5jaG9yLmlzKHRoaXMuZm9jdXMpfWdldE5vZGVzKCl7dmFyIHQ9dGhpcy5fY2FjaGVkTm9kZXM7aWYodCE9PW51bGwpcmV0dXJuIHQ7dD10aGlzLmFuY2hvcjt2YXIgbj10aGlzLmZvY3VzLHI9dC5pc0JlZm9yZShuKSxvPXI/dDpuO3I9cj9uOnQsdD1vLmdldE5vZGUoKSxuPXIuZ2V0Tm9kZSgpO2xldCBpPW8ub2Zmc2V0O3JldHVybiBvPXIub2Zmc2V0LEIodCkmJihyPXQuZ2V0RGVzY2VuZGFudEJ5SW5kZXgoaSksdD1yPz90KSxCKG4pJiYocj1uLmdldERlc2NlbmRhbnRCeUluZGV4KG8pLHIhPT1udWxsJiZyIT09dCYmbi5nZXRDaGlsZEF0SW5kZXgobyk9PT1yJiYocj1yLmdldFByZXZpb3VzU2libGluZygpKSxuPXI/P24pLHQ9dC5pcyhuKT9CKHQpJiYwPHQuZ2V0Q2hpbGRyZW5TaXplKCk/W106W3RdOnQuZ2V0Tm9kZXNCZXR3ZWVuKG4pLEJsKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz10KSx0fXNldFRleHROb2RlUmFuZ2UodCxuLHIsbyl7YW8odGhpcy5hbmNob3IsdC5fX2tleSxuLCJ0ZXh0IiksYW8odGhpcy5mb2N1cyxyLl9fa2V5LG8sInRleHQiKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsLHRoaXMuZGlydHk9ITB9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD10aGlzLmdldE5vZGVzKCk7aWYodC5sZW5ndGg9PT0wKXJldHVybiIiO2xldCBuPXRbMF0scj10W3QubGVuZ3RoLTFdLG89dGhpcy5hbmNob3IsaT10aGlzLmZvY3VzLGw9by5pc0JlZm9yZShpKSxbcyxhXT1qdSh0aGlzKSx1PSIiLGM9ITA7Zm9yKGxldCBkPTA7ZDx0Lmxlbmd0aDtkKyspe2xldCBmPXRbZF07aWYoQihmKSYmIWYuaXNJbmxpbmUoKSljfHwodSs9YApgKSxjPSFmLmlzRW1wdHkoKTtlbHNlIGlmKGM9ITEsUShmKSl7bGV0IGg9Zi5nZXRUZXh0Q29udGVudCgpO2Y9PT1uP2Y9PT1yPyhvLnR5cGUhPT0iZWxlbWVudCJ8fGkudHlwZSE9PSJlbGVtZW50Inx8aS5vZmZzZXQ9PT1vLm9mZnNldCkmJihoPXM8YT9oLnNsaWNlKHMsYSk6aC5zbGljZShhLHMpKTpoPWw/aC5zbGljZShzKTpoLnNsaWNlKGEpOmY9PT1yJiYoaD1sP2guc2xpY2UoMCxhKTpoLnNsaWNlKDAscykpLHUrPWh9ZWxzZSFWZShmKSYmIW1hKGYpfHxmPT09ciYmdGhpcy5pc0NvbGxhcHNlZCgpfHwodSs9Zi5nZXRUZXh0Q29udGVudCgpKX1yZXR1cm4gdX1hcHBseURPTVJhbmdlKHQpe2xldCBuPWV0KCkscj1uLmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbjtpZih0PWJ3KHQuc3RhcnRDb250YWluZXIsdC5zdGFydE9mZnNldCx0LmVuZENvbnRhaW5lcix0LmVuZE9mZnNldCxuLHIpLHQhPT1udWxsKXt2YXJbbyxpXT10O2FvKHRoaXMuYW5jaG9yLG8ua2V5LG8ub2Zmc2V0LG8udHlwZSksYW8odGhpcy5mb2N1cyxpLmtleSxpLm9mZnNldCxpLnR5cGUpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9fWNsb25lKCl7bGV0IHQ9dGhpcy5hbmNob3Isbj10aGlzLmZvY3VzO3JldHVybiBuZXcga2kobmV3IHlyKHQua2V5LHQub2Zmc2V0LHQudHlwZSksbmV3IHlyKG4ua2V5LG4ub2Zmc2V0LG4udHlwZSksdGhpcy5mb3JtYXQsdGhpcy5zdHlsZSl9dG9nZ2xlRm9ybWF0KHQpe3RoaXMuZm9ybWF0PXJ3KHRoaXMuZm9ybWF0LHQsbnVsbCksdGhpcy5kaXJ0eT0hMH1zZXRTdHlsZSh0KXt0aGlzLnN0eWxlPXQsdGhpcy5kaXJ0eT0hMH1oYXNGb3JtYXQodCl7cmV0dXJuKHRoaXMuZm9ybWF0Jm9pW3RdKSE9PTB9aW5zZXJ0UmF3VGV4dCh0KXt0PXQuc3BsaXQoLyhccj9cbnxcdCkvKTtsZXQgbj1bXSxyPXQubGVuZ3RoO2ZvcihsZXQgbz0wO288cjtvKyspe2xldCBpPXRbb107aT09PWAKYHx8aT09PWBccgpgP24ucHVzaCgkbCgpKTppPT09IgkiP24ucHVzaChoZCgpKTpuLnB1c2goRXQoaSkpfXRoaXMuaW5zZXJ0Tm9kZXMobil9aW5zZXJ0VGV4dCh0KXt2YXIgbj10aGlzLmFuY2hvcixyPXRoaXMuZm9jdXMsbz10aGlzLmlzQ29sbGFwc2VkKCl8fG4uaXNCZWZvcmUociksaT10aGlzLmZvcm1hdCxsPXRoaXMuc3R5bGU7byYmbi50eXBlPT09ImVsZW1lbnQiP3B5KG4scixpLGwpOm98fHIudHlwZSE9PSJlbGVtZW50Inx8cHkocixuLGksbCk7dmFyIHM9dGhpcy5nZXROb2RlcygpLGE9cy5sZW5ndGgsdT1vP3I6bjtyPShvP246cikub2Zmc2V0O3ZhciBjPXUub2Zmc2V0O249c1swXSxRKG4pfHxVKDI2KSxvPW4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg7dmFyIGQ9bi5nZXRQYXJlbnRPclRocm93KCksZj1zW2EtMV07aWYodGhpcy5pc0NvbGxhcHNlZCgpJiZyPT09byYmKG4uaXNTZWdtZW50ZWQoKXx8bi5pc1Rva2VuKCl8fCFuLmNhbkluc2VydFRleHRBZnRlcigpfHwhZC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSYmbi5nZXROZXh0U2libGluZygpPT09bnVsbCkpe3ZhciBoPW4uZ2V0TmV4dFNpYmxpbmcoKTtpZihRKGgpJiZoLmNhbkluc2VydFRleHRCZWZvcmUoKSYmIUZoKGgpfHwoaD1FdCgpLGguc2V0Rm9ybWF0KGkpLGQuY2FuSW5zZXJ0VGV4dEFmdGVyKCk/bi5pbnNlcnRBZnRlcihoKTpkLmluc2VydEFmdGVyKGgpKSxoLnNlbGVjdCgwLDApLG49aCx0IT09IiIpe3RoaXMuaW5zZXJ0VGV4dCh0KTtyZXR1cm59fWVsc2UgaWYodGhpcy5pc0NvbGxhcHNlZCgpJiZyPT09MCYmKG4uaXNTZWdtZW50ZWQoKXx8bi5pc1Rva2VuKCl8fCFuLmNhbkluc2VydFRleHRCZWZvcmUoKXx8IWQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZuLmdldFByZXZpb3VzU2libGluZygpPT09bnVsbCkpe2lmKGg9bi5nZXRQcmV2aW91c1NpYmxpbmcoKSwoIVEoaCl8fEZoKGgpKSYmKGg9RXQoKSxoLnNldEZvcm1hdChpKSxkLmNhbkluc2VydFRleHRCZWZvcmUoKT9uLmluc2VydEJlZm9yZShoKTpkLmluc2VydEJlZm9yZShoKSksaC5zZWxlY3QoKSxuPWgsdCE9PSIiKXt0aGlzLmluc2VydFRleHQodCk7cmV0dXJufX1lbHNlIGlmKG4uaXNTZWdtZW50ZWQoKSYmciE9PW8pZD1FdChuLmdldFRleHRDb250ZW50KCkpLGQuc2V0Rm9ybWF0KGkpLG4ucmVwbGFjZShkKSxuPWQ7ZWxzZSBpZighKHRoaXMuaXNDb2xsYXBzZWQoKXx8dD09PSIifHwoaD1mLmdldFBhcmVudCgpLGQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZkLmNhbkluc2VydFRleHRBZnRlcigpJiYoIUIoaCl8fGguY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZoLmNhbkluc2VydFRleHRBZnRlcigpKSkpKXt0aGlzLmluc2VydFRleHQoIiIpLE53KHRoaXMuYW5jaG9yLHRoaXMuZm9jdXMsbnVsbCksdGhpcy5pbnNlcnRUZXh0KHQpO3JldHVybn1pZihhPT09MSlpZihuLmlzVG9rZW4oKSl0PUV0KHQpLHQuc2VsZWN0KCksbi5yZXBsYWNlKHQpO2Vsc2V7aWYocz1uLmdldEZvcm1hdCgpLGE9bi5nZXRTdHlsZSgpLHI9PT1jJiYocyE9PWl8fGEhPT1sKSlpZihuLmdldFRleHRDb250ZW50KCk9PT0iIiluLnNldEZvcm1hdChpKSxuLnNldFN0eWxlKGwpO2Vsc2V7cz1FdCh0KSxzLnNldEZvcm1hdChpKSxzLnNldFN0eWxlKGwpLHMuc2VsZWN0KCkscj09PTA/bi5pbnNlcnRCZWZvcmUocywhMSk6KFthXT1uLnNwbGl0VGV4dChyKSxhLmluc2VydEFmdGVyKHMsITEpKSxzLmlzQ29tcG9zaW5nKCkmJnRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJih0aGlzLmFuY2hvci5vZmZzZXQtPXQubGVuZ3RoKTtyZXR1cm59bj1uLnNwbGljZVRleHQocixjLXIsdCwhMCksbi5nZXRUZXh0Q29udGVudCgpPT09IiI/bi5yZW1vdmUoKTp0aGlzLmFuY2hvci50eXBlPT09InRleHQiJiYobi5pc0NvbXBvc2luZygpP3RoaXMuYW5jaG9yLm9mZnNldC09dC5sZW5ndGg6KHRoaXMuZm9ybWF0PXMsdGhpcy5zdHlsZT1hKSl9ZWxzZXtpZihpPW5ldyBTZXQoWy4uLm4uZ2V0UGFyZW50S2V5cygpLC4uLmYuZ2V0UGFyZW50S2V5cygpXSksaD1CKG4pP246bi5nZXRQYXJlbnRPclRocm93KCksbD1CKGYpP2Y6Zi5nZXRQYXJlbnRPclRocm93KCksZD1mLCFoLmlzKGwpJiZsLmlzSW5saW5lKCkpZG8gZD1sLGw9bC5nZXRQYXJlbnRPclRocm93KCk7d2hpbGUobC5pc0lubGluZSgpKTtpZih1LnR5cGU9PT0idGV4dCImJihjIT09MHx8Zi5nZXRUZXh0Q29udGVudCgpPT09IiIpfHx1LnR5cGU9PT0iZWxlbWVudCImJmYuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTxjKWlmKFEoZikmJiFmLmlzVG9rZW4oKSYmYyE9PWYuZ2V0VGV4dENvbnRlbnRTaXplKCkpe2lmKGYuaXNTZWdtZW50ZWQoKSl7dmFyIGc9RXQoZi5nZXRUZXh0Q29udGVudCgpKTtmLnJlcGxhY2UoZyksZj1nfXF0KHUuZ2V0Tm9kZSgpKXx8KGY9Zi5zcGxpY2VUZXh0KDAsYywiIikpLGkuYWRkKGYuX19rZXkpfWVsc2UgdT1mLmdldFBhcmVudE9yVGhyb3coKSx1LmNhbkJlRW1wdHkoKXx8dS5nZXRDaGlsZHJlblNpemUoKSE9PTE/Zi5yZW1vdmUoKTp1LnJlbW92ZSgpO2Vsc2UgaS5hZGQoZi5fX2tleSk7Zm9yKHU9bC5nZXRDaGlsZHJlbigpLGM9bmV3IFNldChzKSxmPWguaXMobCksaD1oLmlzSW5saW5lKCkmJm4uZ2V0TmV4dFNpYmxpbmcoKT09PW51bGw/aDpuLGc9dS5sZW5ndGgtMTswPD1nO2ctLSl7bGV0IG09dVtnXTtpZihtLmlzKG4pfHxCKG0pJiZtLmlzUGFyZW50T2YobikpYnJlYWs7bS5pc0F0dGFjaGVkKCkmJighYy5oYXMobSl8fG0uaXMoZCk/Znx8aC5pbnNlcnRBZnRlcihtLCExKTptLnJlbW92ZSgpKX1pZighZilmb3IodT1sLGM9bnVsbDt1IT09bnVsbDspbD11LmdldENoaWxkcmVuKCksZj1sLmxlbmd0aCwoZj09PTB8fGxbZi0xXS5pcyhjKSkmJihpLmRlbGV0ZSh1Ll9fa2V5KSxjPXUpLHU9dS5nZXRQYXJlbnQoKTtmb3Iobi5pc1Rva2VuKCk/cj09PW8/bi5zZWxlY3QoKToodD1FdCh0KSx0LnNlbGVjdCgpLG4ucmVwbGFjZSh0KSk6KG49bi5zcGxpY2VUZXh0KHIsby1yLHQsITApLG4uZ2V0VGV4dENvbnRlbnQoKT09PSIiP24ucmVtb3ZlKCk6bi5pc0NvbXBvc2luZygpJiZ0aGlzLmFuY2hvci50eXBlPT09InRleHQiJiYodGhpcy5hbmNob3Iub2Zmc2V0LT10Lmxlbmd0aCkpLHQ9MTt0PGE7dCsrKW49c1t0XSxpLmhhcyhuLl9fa2V5KXx8bi5yZW1vdmUoKX19cmVtb3ZlVGV4dCgpe3RoaXMuaW5zZXJ0VGV4dCgiIil9Zm9ybWF0VGV4dCh0KXtpZih0aGlzLmlzQ29sbGFwc2VkKCkpdGhpcy50b2dnbGVGb3JtYXQodCksTXQobnVsbCk7ZWxzZXt2YXIgbj10aGlzLmdldE5vZGVzKCkscj1bXTtmb3IodmFyIG8gb2YgbilRKG8pJiZyLnB1c2gobyk7dmFyIGk9ci5sZW5ndGg7aWYoaT09PTApdGhpcy50b2dnbGVGb3JtYXQodCksTXQobnVsbCk7ZWxzZXtvPXRoaXMuYW5jaG9yO3ZhciBsPXRoaXMuZm9jdXMscz10aGlzLmlzQmFja3dhcmQoKTtuPXM/bDpvLG89cz9vOmw7dmFyIGE9MCx1PXJbMF07aWYobD1uLnR5cGU9PT0iZWxlbWVudCI/MDpuLm9mZnNldCxuLnR5cGU9PT0idGV4dCImJmw9PT11LmdldFRleHRDb250ZW50U2l6ZSgpJiYoYT0xLHU9clsxXSxsPTApLHUhPW51bGwpe3M9dS5nZXRGb3JtYXRGbGFncyh0LG51bGwpO3ZhciBjPWktMSxkPXJbY107aWYoaT1vLnR5cGU9PT0idGV4dCI/by5vZmZzZXQ6ZC5nZXRUZXh0Q29udGVudFNpemUoKSx1LmlzKGQpKWwhPT1pJiYobD09PTAmJmk9PT11LmdldFRleHRDb250ZW50U2l6ZSgpP3Uuc2V0Rm9ybWF0KHMpOih0PXUuc3BsaXRUZXh0KGwsaSksdD1sPT09MD90WzBdOnRbMV0sdC5zZXRGb3JtYXQocyksbi50eXBlPT09InRleHQiJiZuLnNldCh0Ll9fa2V5LDAsInRleHQiKSxvLnR5cGU9PT0idGV4dCImJm8uc2V0KHQuX19rZXksaS1sLCJ0ZXh0IikpLHRoaXMuZm9ybWF0PXMpO2Vsc2V7bCE9PTAmJihbLHVdPXUuc3BsaXRUZXh0KGwpLGw9MCksdS5zZXRGb3JtYXQocyk7dmFyIGY9ZC5nZXRGb3JtYXRGbGFncyh0LHMpO2ZvcigwPGkmJihpIT09ZC5nZXRUZXh0Q29udGVudFNpemUoKSYmKFtkXT1kLnNwbGl0VGV4dChpKSksZC5zZXRGb3JtYXQoZikpLGErPTE7YTxjO2ErKyl7bGV0IGg9clthXTtpZighaC5pc1Rva2VuKCkpe2xldCBnPWguZ2V0Rm9ybWF0RmxhZ3ModCxmKTtoLnNldEZvcm1hdChnKX19bi50eXBlPT09InRleHQiJiZuLnNldCh1Ll9fa2V5LGwsInRleHQiKSxvLnR5cGU9PT0idGV4dCImJm8uc2V0KGQuX19rZXksaSwidGV4dCIpLHRoaXMuZm9ybWF0PXN8Zn19fX19aW5zZXJ0Tm9kZXModCxuKXtpZighdGhpcy5pc0NvbGxhcHNlZCgpKXt2YXIgcj10aGlzLmlzQmFja3dhcmQoKT90aGlzLmFuY2hvcjp0aGlzLmZvY3VzLG89ci5nZXROb2RlKCkuZ2V0TmV4dFNpYmxpbmcoKTtpZihvPW8/by5nZXRLZXkoKTpudWxsLHI9KHI9ci5nZXROb2RlKCkuZ2V0UHJldmlvdXNTaWJsaW5nKCkpP3IuZ2V0S2V5KCk6bnVsbCx0aGlzLnJlbW92ZVRleHQoKSx0aGlzLmlzQ29sbGFwc2VkKCkmJnRoaXMuZm9jdXMudHlwZT09PSJlbGVtZW50Iil7aWYodGhpcy5mb2N1cy5rZXk9PT1vJiZ0aGlzLmZvY3VzLm9mZnNldD09PTApe3ZhciBpPUV0KCk7dGhpcy5mb2N1cy5nZXROb2RlKCkuaW5zZXJ0QmVmb3JlKGkpfWVsc2UgdGhpcy5mb2N1cy5rZXk9PT1yJiZ0aGlzLmZvY3VzLm9mZnNldD09PXRoaXMuZm9jdXMuZ2V0Tm9kZSgpLmdldENoaWxkcmVuU2l6ZSgpJiYoaT1FdCgpLHRoaXMuZm9jdXMuZ2V0Tm9kZSgpLmluc2VydEFmdGVyKGkpKTtpJiYodGhpcy5mb2N1cy5zZXQoaS5fX2tleSwwLCJ0ZXh0IiksdGhpcy5hbmNob3Iuc2V0KGkuX19rZXksMCwidGV4dCIpKX19aT10aGlzLmFuY2hvcixyPWkub2Zmc2V0O3ZhciBsPWkuZ2V0Tm9kZSgpO289bCxpLnR5cGU9PT0iZWxlbWVudCImJihpPWkuZ2V0Tm9kZSgpLG89aS5nZXRDaGlsZEF0SW5kZXgoci0xKSxvPW89PT1udWxsP2k6byksaT1bXTt2YXIgcz1sLmdldE5leHRTaWJsaW5ncygpLGE9Sm4obCk/bnVsbDpsLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKTtpZihRKGwpKWlmKG89bC5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCxyPT09MCYmbyE9PTApbz1sLmdldFByZXZpb3VzU2libGluZygpLG89byE9PW51bGw/bzpsLmdldFBhcmVudE9yVGhyb3coKSxpLnB1c2gobCk7ZWxzZSBpZihyPT09bylvPWw7ZWxzZXtpZihsLmlzVG9rZW4oKSlyZXR1cm4hMTtbbyxsXT1sLnNwbGl0VGV4dChyKSxpLnB1c2gobCl9bD1vLGkucHVzaCguLi5zKSxzPXRbMF07dmFyIHU9ITEsYz1udWxsO2ZvcihsZXQgZz0wO2c8dC5sZW5ndGg7ZysrKXt2YXIgZD10W2ddO2lmKEpuKG8pfHxWZShvKXx8IUIoZCl8fGQuaXNJbmxpbmUoKSl1JiYhQihkKSYmIVZlKGQpJiZKbihvLmdldFBhcmVudCgpKSYmVSgyOCk7ZWxzZXtpZihkLmlzKHMpKXtpZihCKG8pJiZvLmlzRW1wdHkoKSYmby5jYW5SZXBsYWNlV2l0aChkKSl7by5yZXBsYWNlKGQpLG89ZCx1PSEwO2NvbnRpbnVlfWlmKHU9ZC5nZXRGaXJzdERlc2NlbmRhbnQoKSxvdyh1KSl7Zm9yKHZhciBmPXUuZ2V0UGFyZW50T3JUaHJvdygpO2YuaXNJbmxpbmUoKTspZj1mLmdldFBhcmVudE9yVGhyb3coKTtpZihjPWYuZ2V0Q2hpbGRyZW4oKSx1PWMubGVuZ3RoLEIobykpe3ZhciBoPW8uZ2V0Rmlyc3RDaGlsZCgpO2ZvcihsZXQgbT0wO208dTttKyspe2xldCBTPWNbbV07aD09PW51bGw/by5hcHBlbmQoUyk6aC5pbnNlcnRBZnRlcihTKSxoPVN9fWVsc2V7Zm9yKGg9dS0xOzA8PWg7aC0tKW8uaW5zZXJ0QWZ0ZXIoY1toXSk7bz1vLmdldFBhcmVudE9yVGhyb3coKX1pZihjPWNbdS0xXSxmLnJlbW92ZSgpLHU9ITAsZi5pcyhkKSljb250aW51ZX19UShvKSYmKGE9PT1udWxsJiZVKDI3KSxvPWEpfXU9ITEsQihvKSYmIW8uaXNJbmxpbmUoKT8oYz1kLFZlKGQpJiYhZC5pc0lubGluZSgpP289dC5sZW5ndGg9PT0xJiZvLmNhbkJlRW1wdHkoKSYmby5pc0VtcHR5KCk/by5pbnNlcnRCZWZvcmUoZCwhMSk6by5pbnNlcnRBZnRlcihkLCExKTpCKGQpPyhkLmNhbkJlRW1wdHkoKXx8IWQuaXNFbXB0eSgpKSYmKHF0KG8pPyhmPW8uZ2V0Q2hpbGRBdEluZGV4KHIpLGYhPT1udWxsP2YuaW5zZXJ0QmVmb3JlKGQpOm8uYXBwZW5kKGQpLG89ZCk6ZC5pc0lubGluZSgpPyhvLmFwcGVuZChkKSxvPWQpOm89by5pbnNlcnRBZnRlcihkLCExKSk6KGY9by5nZXRGaXJzdENoaWxkKCksZiE9PW51bGw/Zi5pbnNlcnRCZWZvcmUoZCk6by5hcHBlbmQoZCksbz1kKSk6IUIoZCl8fEIoZCkmJmQuaXNJbmxpbmUoKXx8VmUobykmJiFvLmlzSW5saW5lKCk/KGM9ZCxkZSh0aGlzKSYmVmUoZCkmJihCKG8pfHxRKG8pKSYmIWQuaXNJbmxpbmUoKT8oUShvKT8oZj1vLmdldFBhcmVudE9yVGhyb3coKSxbb109by5zcGxpdFRleHQociksbz1vLmdldEluZGV4V2l0aGluUGFyZW50KCkrMSk6KGY9byxvPXIpLFssb109aHcoZixvKSxvPW8uaW5zZXJ0QmVmb3JlKGQpKTpvPW8uaW5zZXJ0QWZ0ZXIoZCwhMSkpOihkPW8uZ2V0UGFyZW50T3JUaHJvdygpLG1hKG8pJiZvLnJlbW92ZSgpLG89ZCxnLS0pfWlmKG4mJihRKGwpP2wuc2VsZWN0KCk6KHQ9by5nZXRQcmV2aW91c1NpYmxpbmcoKSxRKHQpP3Quc2VsZWN0KCk6KHQ9by5nZXRJbmRleFdpdGhpblBhcmVudCgpLG8uZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdCh0LHQpKSkpLEIobykpe2lmKHQ9UShjKT9jOkIoYykmJmMuaXNJbmxpbmUoKT9jLmdldExhc3REZXNjZW5kYW50KCk6by5nZXRMYXN0RGVzY2VuZGFudCgpLG58fCh0PT09bnVsbD9vLnNlbGVjdCgpOlEodCk/dC5nZXRUZXh0Q29udGVudCgpPT09IiI/dC5zZWxlY3RQcmV2aW91cygpOnQuc2VsZWN0KCk6dC5zZWxlY3ROZXh0KCkpLGkubGVuZ3RoIT09MClmb3Iobj1vLHQ9aS5sZW5ndGgtMTswPD10O3QtLSlyPWlbdF0sYT1yLmdldFBhcmVudE9yVGhyb3coKSwhQihvKXx8dHAocil8fFZlKHIpJiYoIXIuaXNJbmxpbmUoKXx8ci5pc0lzb2xhdGVkKCkpP0Iobyl8fHRwKHIpP0IocikmJiFyLmNhbkluc2VydEFmdGVyKG8pPyhsPWEuY29uc3RydWN0b3IuY2xvbmUoYSksQihsKXx8VSgyOSksbC5hcHBlbmQociksby5pbnNlcnRBZnRlcihsKSk6by5pbnNlcnRBZnRlcihyKTooby5pbnNlcnRCZWZvcmUociksbz1yKToobj09PW8/by5hcHBlbmQocik6by5pbnNlcnRCZWZvcmUociksbz1yKSxhLmlzRW1wdHkoKSYmIWEuY2FuQmVFbXB0eSgpJiZhLnJlbW92ZSgpfWVsc2Ugbnx8KFEobyk/by5zZWxlY3QoKToobj1vLmdldFBhcmVudE9yVGhyb3coKSx0PW8uZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLG4uc2VsZWN0KHQsdCkpKTtyZXR1cm4hMH1pbnNlcnRQYXJhZ3JhcGgoKXt0aGlzLmlzQ29sbGFwc2VkKCl8fHRoaXMucmVtb3ZlVGV4dCgpO3ZhciB0PXRoaXMuYW5jaG9yLG49dC5vZmZzZXQscj1bXTtpZih0LnR5cGU9PT0idGV4dCIpe3ZhciBvPXQuZ2V0Tm9kZSgpLGk9by5nZXROZXh0U2libGluZ3MoKS5yZXZlcnNlKCksbD1vLmdldFBhcmVudE9yVGhyb3coKSxzPWwuaXNJbmxpbmUoKSxhPXM/bC5nZXRUZXh0Q29udGVudFNpemUoKTpvLmdldFRleHRDb250ZW50U2l6ZSgpO249PT0wP2kucHVzaChvKToocyYmKHI9bC5nZXROZXh0U2libGluZ3MoKSksbj09PWF8fHMmJm49PT1vLmdldFRleHRDb250ZW50U2l6ZSgpfHwoWyxvXT1vLnNwbGl0VGV4dChuKSxpLnB1c2gobykpKX1lbHNle2lmKGw9dC5nZXROb2RlKCksSm4obCkpe2k9aGkoKSxyPWwuZ2V0Q2hpbGRBdEluZGV4KG4pLGkuc2VsZWN0KCksciE9PW51bGw/ci5pbnNlcnRCZWZvcmUoaSwhMSk6bC5hcHBlbmQoaSk7cmV0dXJufWk9bC5nZXRDaGlsZHJlbigpLnNsaWNlKG4pLnJldmVyc2UoKX1pZihvPWkubGVuZ3RoLG49PT0wJiYwPG8mJmwuaXNJbmxpbmUoKSl7aWYocj1sLmdldFBhcmVudE9yVGhyb3coKSxpPXIuaW5zZXJ0TmV3QWZ0ZXIodGhpcywhMSksQihpKSlmb3Iocj1yLmdldENoaWxkcmVuKCksbD0wO2w8ci5sZW5ndGg7bCsrKWkuYXBwZW5kKHJbbF0pfWVsc2UgaWYocz1sLmluc2VydE5ld0FmdGVyKHRoaXMsITEpLHM9PT1udWxsKXRoaXMuaW5zZXJ0TGluZUJyZWFrKCk7ZWxzZSBpZihCKHMpKWlmKGE9bC5nZXRGaXJzdENoaWxkKCksbj09PTAmJihsLmlzKHQuZ2V0Tm9kZSgpKXx8YSYmYS5pcyh0LmdldE5vZGUoKSkpJiYwPG8pbC5pbnNlcnRCZWZvcmUocyk7ZWxzZXtpZihsPW51bGwsbj1yLmxlbmd0aCx0PXMuZ2V0UGFyZW50T3JUaHJvdygpLDA8bilmb3IoYT0wO2E8bjthKyspdC5hcHBlbmQoclthXSk7aWYobyE9PTApZm9yKHI9MDtyPG87cisrKW49aVtyXSxsPT09bnVsbD9zLmFwcGVuZChuKTpsLmluc2VydEJlZm9yZShuKSxsPW47cy5jYW5CZUVtcHR5KCl8fHMuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wP3Muc2VsZWN0U3RhcnQoKToocy5zZWxlY3RQcmV2aW91cygpLHMucmVtb3ZlKCkpfX1pbnNlcnRMaW5lQnJlYWsodCl7bGV0IG49JGwoKTt2YXIgcj10aGlzLmFuY2hvcjtyLnR5cGU9PT0iZWxlbWVudCImJihyPXIuZ2V0Tm9kZSgpLHF0KHIpJiZ0aGlzLmluc2VydFBhcmFncmFwaCgpKSx0P3RoaXMuaW5zZXJ0Tm9kZXMoW25dLCEwKTp0aGlzLmluc2VydE5vZGVzKFtuXSkmJm4uc2VsZWN0TmV4dCgwLDApfWdldENoYXJhY3Rlck9mZnNldHMoKXtyZXR1cm4ganUodGhpcyl9ZXh0cmFjdCgpe3ZhciB0PXRoaXMuZ2V0Tm9kZXMoKSxuPXQubGVuZ3RoLHI9bi0xLG89dGhpcy5hbmNob3I7bGV0IGk9dGhpcy5mb2N1czt2YXIgbD10WzBdO2xldCBzPXRbcl0sW2EsdV09anUodGhpcyk7cmV0dXJuIG49PT0wP1tdOm49PT0xP1EobCkmJiF0aGlzLmlzQ29sbGFwc2VkKCk/KHQ9YT51P3U6YSxyPWwuc3BsaXRUZXh0KHQsYT51P2E6dSksdD10PT09MD9yWzBdOnJbMV0sdCE9bnVsbD9bdF06W10pOltsXToobj1vLmlzQmVmb3JlKGkpLFEobCkmJihvPW4/YTp1LG89PT1sLmdldFRleHRDb250ZW50U2l6ZSgpP3Quc2hpZnQoKTpvIT09MCYmKFssbF09bC5zcGxpdFRleHQobyksdFswXT1sKSksUShzKSYmKGw9cy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCxuPW4/dTphLG49PT0wP3QucG9wKCk6biE9PWwmJihbc109cy5zcGxpdFRleHQobiksdFtyXT1zKSksdCl9bW9kaWZ5KHQsbixyKXt2YXIgbz10aGlzLmZvY3VzLGk9dGhpcy5hbmNob3IsbD10PT09Im1vdmUiLHM9QmgobyxuKTtpZihWZShzKSYmIXMuaXNJc29sYXRlZCgpKWwmJnMuaXNLZXlib2FyZFNlbGVjdGFibGUoKT8obj1ucCgpLG4uYWRkKHMuX19rZXkpLHZyKG4pKToodD1uP3MuZ2V0UHJldmlvdXNTaWJsaW5nKCk6cy5nZXROZXh0U2libGluZygpLFEodCk/KHM9dC5fX2tleSxuPW4/dC5nZXRUZXh0Q29udGVudCgpLmxlbmd0aDowLG8uc2V0KHMsbiwidGV4dCIpLGwmJmkuc2V0KHMsbiwidGV4dCIpKToocj1zLmdldFBhcmVudE9yVGhyb3coKSxCKHQpPyhyPXQuX19rZXkscz1uP3QuZ2V0Q2hpbGRyZW5TaXplKCk6MCk6KHM9cy5nZXRJbmRleFdpdGhpblBhcmVudCgpLHI9ci5fX2tleSxufHxzKyspLG8uc2V0KHIscywiZWxlbWVudCIpLGwmJmkuc2V0KHIscywiZWxlbWVudCIpKSk7ZWxzZSBpZihpPWV0KCksbz1FcihpLl93aW5kb3cpKXt2YXIgYT1pLl9ibG9ja0N1cnNvckVsZW1lbnQsdT1pLl9yb290RWxlbWVudDtpZih1PT09bnVsbHx8YT09PW51bGx8fCFCKHMpfHxzLmlzSW5saW5lKCl8fHMuY2FuQmVFbXB0eSgpfHxXaChhLGksdSksby5tb2RpZnkodCxuPyJiYWNrd2FyZCI6ImZvcndhcmQiLHIpLDA8by5yYW5nZUNvdW50JiYocz1vLmdldFJhbmdlQXQoMCksaT10aGlzLmFuY2hvci5nZXROb2RlKCksaT1xdChpKT9pOmR3KGkpLHRoaXMuYXBwbHlET01SYW5nZShzKSx0aGlzLmRpcnR5PSEwLCFsKSl7Zm9yKGw9dGhpcy5nZXROb2RlcygpLHQ9W10scj0hMSxhPTA7YTxsLmxlbmd0aDthKyspdT1sW2FdLF9jKHUsaSk/dC5wdXNoKHUpOnI9ITA7ciYmMDx0Lmxlbmd0aCYmKG4/KG49dFswXSxCKG4pP24uc2VsZWN0U3RhcnQoKTpuLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3RTdGFydCgpKToobj10W3QubGVuZ3RoLTFdLEIobik/bi5zZWxlY3RFbmQoKTpuLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3RFbmQoKSkpLChvLmFuY2hvck5vZGUhPT1zLnN0YXJ0Q29udGFpbmVyfHxvLmFuY2hvck9mZnNldCE9PXMuc3RhcnRPZmZzZXQpJiYobj10aGlzLmZvY3VzLGw9dGhpcy5hbmNob3Isbz1sLmtleSxzPWwub2Zmc2V0LGk9bC50eXBlLGFvKGwsbi5rZXksbi5vZmZzZXQsbi50eXBlKSxhbyhuLG8scyxpKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsKX19fWRlbGV0ZUNoYXJhY3Rlcih0KXtsZXQgbj10aGlzLmlzQ29sbGFwc2VkKCk7aWYodGhpcy5pc0NvbGxhcHNlZCgpKXt2YXIgcj10aGlzLmFuY2hvcixvPXRoaXMuZm9jdXMsaT1yLmdldE5vZGUoKTtpZighdCYmKHIudHlwZT09PSJlbGVtZW50IiYmQihpKSYmci5vZmZzZXQ9PT1pLmdldENoaWxkcmVuU2l6ZSgpfHxyLnR5cGU9PT0idGV4dCImJnIub2Zmc2V0PT09aS5nZXRUZXh0Q29udGVudFNpemUoKSkpe3ZhciBsPWkuZ2V0UGFyZW50KCk7aWYobD1pLmdldE5leHRTaWJsaW5nKCl8fChsPT09bnVsbD9udWxsOmwuZ2V0TmV4dFNpYmxpbmcoKSksQihsKSYmbC5pc1NoYWRvd1Jvb3QoKSlyZXR1cm59aWYobD1CaChvLHQpLFZlKGwpJiYhbC5pc0lzb2xhdGVkKCkpe2wuaXNLZXlib2FyZFNlbGVjdGFibGUoKSYmQihpKSYmaS5nZXRDaGlsZHJlblNpemUoKT09PTA/KGkucmVtb3ZlKCksdD1ucCgpLHQuYWRkKGwuX19rZXkpLHZyKHQpKToobC5yZW1vdmUoKSxldCgpLmRpc3BhdGNoQ29tbWFuZChsZCx2b2lkIDApKTtyZXR1cm59aWYoIXQmJkIobCkmJkIoaSkmJmkuaXNFbXB0eSgpKXtpLnJlbW92ZSgpLGwuc2VsZWN0U3RhcnQoKTtyZXR1cm59aWYodGhpcy5tb2RpZnkoImV4dGVuZCIsdCwiY2hhcmFjdGVyIiksdGhpcy5pc0NvbGxhcHNlZCgpKXtpZih0JiZyLm9mZnNldD09PTAmJihyLnR5cGU9PT0iZWxlbWVudCI/ci5nZXROb2RlKCk6ci5nZXROb2RlKCkuZ2V0UGFyZW50T3JUaHJvdygpKS5jb2xsYXBzZUF0U3RhcnQodGhpcykpcmV0dXJufWVsc2V7aWYobD1vLnR5cGU9PT0idGV4dCI/by5nZXROb2RlKCk6bnVsbCxpPXIudHlwZT09PSJ0ZXh0Ij9yLmdldE5vZGUoKTpudWxsLGwhPT1udWxsJiZsLmlzU2VnbWVudGVkKCkpe2lmKHI9by5vZmZzZXQsbz1sLmdldFRleHRDb250ZW50U2l6ZSgpLGwuaXMoaSl8fHQmJnIhPT1vfHwhdCYmciE9PTApe215KGwsdCxyKTtyZXR1cm59fWVsc2UgaWYoaSE9PW51bGwmJmkuaXNTZWdtZW50ZWQoKSYmKHI9ci5vZmZzZXQsbz1pLmdldFRleHRDb250ZW50U2l6ZSgpLGkuaXMobCl8fHQmJnIhPT0wfHwhdCYmciE9PW8pKXtteShpLHQscik7cmV0dXJufWlmKGk9dGhpcy5hbmNob3IsbD10aGlzLmZvY3VzLHI9aS5nZXROb2RlKCksbz1sLmdldE5vZGUoKSxyPT09byYmaS50eXBlPT09InRleHQiJiZsLnR5cGU9PT0idGV4dCIpe3ZhciBzPWkub2Zmc2V0LGE9bC5vZmZzZXQ7bGV0IHU9czxhO289dT9zOmEsYT11P2E6cyxzPWEtMSxvIT09cyYmKHI9ci5nZXRUZXh0Q29udGVudCgpLnNsaWNlKG8sYSksYXcocil8fCh0P2wub2Zmc2V0PXM6aS5vZmZzZXQ9cykpfX19dGhpcy5yZW1vdmVUZXh0KCksdCYmIW4mJnRoaXMuaXNDb2xsYXBzZWQoKSYmdGhpcy5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmdGhpcy5hbmNob3Iub2Zmc2V0PT09MCYmKHQ9dGhpcy5hbmNob3IuZ2V0Tm9kZSgpLHQuaXNFbXB0eSgpJiZxdCh0LmdldFBhcmVudCgpKSYmdC5nZXRJbmRleFdpdGhpblBhcmVudCgpPT09MCYmdC5jb2xsYXBzZUF0U3RhcnQodGhpcykpfWRlbGV0ZUxpbmUodCl7dGhpcy5pc0NvbGxhcHNlZCgpJiYodGhpcy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmdGhpcy5tb2RpZnkoImV4dGVuZCIsdCwibGluZWJvdW5kYXJ5IiksKHQ/dGhpcy5mb2N1czp0aGlzLmFuY2hvcikub2Zmc2V0PT09MCYmdGhpcy5tb2RpZnkoImV4dGVuZCIsdCwiY2hhcmFjdGVyIikpLHRoaXMucmVtb3ZlVGV4dCgpfWRlbGV0ZVdvcmQodCl7dGhpcy5pc0NvbGxhcHNlZCgpJiZ0aGlzLm1vZGlmeSgiZXh0ZW5kIix0LCJ3b3JkIiksdGhpcy5yZW1vdmVUZXh0KCl9fWZ1bmN0aW9uIHpsKGUpe3JldHVybiBlIGluc3RhbmNlb2YgcGR9ZnVuY3Rpb24gZ3koZSl7bGV0IHQ9ZS5vZmZzZXQ7cmV0dXJuIGUudHlwZT09PSJ0ZXh0Ij90OihlPWUuZ2V0Tm9kZSgpLHQ9PT1lLmdldENoaWxkcmVuU2l6ZSgpP2UuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg6MCl9ZnVuY3Rpb24ganUoZSl7bGV0IHQ9ZS5hbmNob3I7cmV0dXJuIGU9ZS5mb2N1cyx0LnR5cGU9PT0iZWxlbWVudCImJmUudHlwZT09PSJlbGVtZW50IiYmdC5rZXk9PT1lLmtleSYmdC5vZmZzZXQ9PT1lLm9mZnNldD9bMCwwXTpbZ3kodCksZ3koZSldfWZ1bmN0aW9uIG15KGUsdCxuKXtsZXQgcj1lLmdldFRleHRDb250ZW50KCkuc3BsaXQoLyg/PVxzKS9nKSxvPXIubGVuZ3RoLGk9MCxsPTA7Zm9yKGxldCBzPTA7czxvO3MrKyl7bGV0IGE9cltzXSx1PXM9PT1vLTE7aWYobD1pLGkrPWEubGVuZ3RoLHQmJmk9PT1ufHxpPm58fHUpe3Iuc3BsaWNlKHMsMSksdSYmKGw9dm9pZCAwKTticmVha319dD1yLmpvaW4oIiIpLnRyaW0oKSx0PT09IiI/ZS5yZW1vdmUoKTooZS5zZXRUZXh0Q29udGVudCh0KSxlLnNlbGVjdChsLGwpKX1mdW5jdGlvbiB2eShlLHQsbixyKXt2YXIgbz10O2lmKGUubm9kZVR5cGU9PT0xKXtsZXQgcz0hMTt2YXIgaT1lLmNoaWxkTm9kZXMsbD1pLmxlbmd0aDtvPT09bCYmKHM9ITAsbz1sLTEpO2xldCBhPWlbb107aWYobD0hMSxhPT09ci5fYmxvY2tDdXJzb3JFbGVtZW50PyhhPWlbbysxXSxsPSEwKTpyLl9ibG9ja0N1cnNvckVsZW1lbnQhPT1udWxsJiZvLS0scj1lbChhKSxRKHIpKW89cz9yLmdldFRleHRDb250ZW50U2l6ZSgpOjA7ZWxzZXtpZihpPWVsKGUpLGk9PT1udWxsKXJldHVybiBudWxsO2lmKEIoaSk/KGU9aS5nZXRDaGlsZEF0SW5kZXgobyksKHQ9QihlKSkmJih0PWUuZ2V0UGFyZW50KCksdD1uPT09bnVsbHx8dD09PW51bGx8fCF0LmNhbkJlRW1wdHkoKXx8dCE9PW4uZ2V0Tm9kZSgpKSx0JiYobj1zP2UuZ2V0TGFzdERlc2NlbmRhbnQoKTplLmdldEZpcnN0RGVzY2VuZGFudCgpLG49PT1udWxsPyhpPWUsbz0wKTooZT1uLGk9QihlKT9lOmUuZ2V0UGFyZW50T3JUaHJvdygpKSksUShlKT8ocj1lLGk9bnVsbCxvPXM/ZS5nZXRUZXh0Q29udGVudFNpemUoKTowKTplIT09aSYmcyYmIWwmJm8rKyk6KG89aS5nZXRJbmRleFdpdGhpblBhcmVudCgpLG89dD09PTAmJlZlKGkpJiZlbChlKT09PWk/bzpvKzEsaT1pLmdldFBhcmVudE9yVGhyb3coKSksQihpKSlyZXR1cm4gbmV3IHlyKGkuX19rZXksbywiZWxlbWVudCIpfX1lbHNlIHI9ZWwoZSk7cmV0dXJuIFEocik/bmV3IHlyKHIuX19rZXksbywidGV4dCIpOm51bGx9ZnVuY3Rpb24geXkoZSx0LG4pe3ZhciByPWUub2Zmc2V0LG89ZS5nZXROb2RlKCk7cj09PTA/KHI9by5nZXRQcmV2aW91c1NpYmxpbmcoKSxvPW8uZ2V0UGFyZW50KCksdD8obnx8IXQpJiZyPT09bnVsbCYmQihvKSYmby5pc0lubGluZSgpJiYodD1vLmdldFByZXZpb3VzU2libGluZygpLFEodCkmJihlLmtleT10Ll9fa2V5LGUub2Zmc2V0PXQuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgpKTpCKHIpJiYhbiYmci5pc0lubGluZSgpPyhlLmtleT1yLl9fa2V5LGUub2Zmc2V0PXIuZ2V0Q2hpbGRyZW5TaXplKCksZS50eXBlPSJlbGVtZW50Iik6UShyKSYmKGUua2V5PXIuX19rZXksZS5vZmZzZXQ9ci5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCkpOnI9PT1vLmdldFRleHRDb250ZW50KCkubGVuZ3RoJiYocj1vLmdldE5leHRTaWJsaW5nKCksbz1vLmdldFBhcmVudCgpLHQmJkIocikmJnIuaXNJbmxpbmUoKT8oZS5rZXk9ci5fX2tleSxlLm9mZnNldD0wLGUudHlwZT0iZWxlbWVudCIpOihufHx0KSYmcj09PW51bGwmJkIobykmJm8uaXNJbmxpbmUoKSYmIW8uY2FuSW5zZXJ0VGV4dEFmdGVyKCkmJih0PW8uZ2V0TmV4dFNpYmxpbmcoKSxRKHQpJiYoZS5rZXk9dC5fX2tleSxlLm9mZnNldD0wKSkpfWZ1bmN0aW9uIE53KGUsdCxuKXtpZihlLnR5cGU9PT0idGV4dCImJnQudHlwZT09PSJ0ZXh0Iil7dmFyIHI9ZS5pc0JlZm9yZSh0KTtsZXQgbz1lLmlzKHQpO3l5KGUscixvKSx5eSh0LCFyLG8pLG8mJih0LmtleT1lLmtleSx0Lm9mZnNldD1lLm9mZnNldCx0LnR5cGU9ZS50eXBlKSxyPWV0KCksci5pc0NvbXBvc2luZygpJiZyLl9jb21wb3NpdGlvbktleSE9PWUua2V5JiZkZShuKSYmKHI9bi5hbmNob3Isbj1uLmZvY3VzLGFvKGUsci5rZXksci5vZmZzZXQsci50eXBlKSxhbyh0LG4ua2V5LG4ub2Zmc2V0LG4udHlwZSkpfX1mdW5jdGlvbiBidyhlLHQsbixyLG8saSl7cmV0dXJuIGU9PT1udWxsfHxuPT09bnVsbHx8IUFhKG8sZSxuKXx8KHQ9dnkoZSx0LGRlKGkpP2kuYW5jaG9yOm51bGwsbyksdD09PW51bGwpfHwocj12eShuLHIsZGUoaSk/aS5mb2N1czpudWxsLG8pLHI9PT1udWxsfHx0LnR5cGU9PT0iZWxlbWVudCImJnIudHlwZT09PSJlbGVtZW50IiYmKGU9ZWwoZSksbj1lbChuKSxWZShlKSYmVmUobikpKT9udWxsOihOdyh0LHIsaSksW3Qscl0pfWZ1bmN0aW9uIHRwKGUpe3JldHVybiBCKGUpJiYhZS5pc0lubGluZSgpfWZ1bmN0aW9uIFJ3KGUsdCxuLHIsbyxpKXtsZXQgbD1DcigpO3JldHVybiBlPW5ldyBraShuZXcgeXIoZSx0LG8pLG5ldyB5cihuLHIsaSksMCwiIiksZS5kaXJ0eT0hMCxsLl9zZWxlY3Rpb249ZX1mdW5jdGlvbiBucCgpe3JldHVybiBuZXcgcGQobmV3IFNldCl9ZnVuY3Rpb24gTWIoZSl7bGV0IHQ9ZS5nZXRFZGl0b3JTdGF0ZSgpLl9zZWxlY3Rpb24sbj1FcihlLl93aW5kb3cpO3JldHVybiB6bCh0KXx8S2codCk/dC5jbG9uZSgpOkdnKHQsbixlKX1mdW5jdGlvbiBHZyhlLHQsbil7dmFyIHI9bi5fd2luZG93O2lmKHI9PT1udWxsKXJldHVybiBudWxsO3ZhciBvPXIuZXZlbnQsaT1vP28udHlwZTp2b2lkIDA7cj1pPT09InNlbGVjdGlvbmNoYW5nZSIsbz0hemgmJihyfHxpPT09ImJlZm9yZWlucHV0Inx8aT09PSJjb21wb3NpdGlvbnN0YXJ0Inx8aT09PSJjb21wb3NpdGlvbmVuZCJ8fGk9PT0iY2xpY2siJiZvJiZvLmRldGFpbD09PTN8fGk9PT0iZHJvcCJ8fGk9PT12b2lkIDApO2xldCBsO2lmKCFkZShlKXx8byl7aWYodD09PW51bGwpcmV0dXJuIG51bGw7aWYobz10LmFuY2hvck5vZGUsaT10LmZvY3VzTm9kZSxsPXQuYW5jaG9yT2Zmc2V0LHQ9dC5mb2N1c09mZnNldCxyJiZkZShlKSYmIUFhKG4sbyxpKSlyZXR1cm4gZS5jbG9uZSgpfWVsc2UgcmV0dXJuIGUuY2xvbmUoKTtpZihuPWJ3KG8sbCxpLHQsbixlKSxuPT09bnVsbClyZXR1cm4gbnVsbDtsZXRbcyxhXT1uO3JldHVybiBuZXcga2kocyxhLGRlKGUpP2UuZm9ybWF0OjAsZGUoZSk/ZS5zdHlsZToiIil9ZnVuY3Rpb24gS2UoKXtyZXR1cm4gQ3IoKS5fc2VsZWN0aW9ufWZ1bmN0aW9uIEZsKCl7cmV0dXJuIGV0KCkuX2VkaXRvclN0YXRlLl9zZWxlY3Rpb259ZnVuY3Rpb24gRWMoZSx0LG4scj0xKXt2YXIgbz1lLmFuY2hvcixpPWUuZm9jdXMsbD1vLmdldE5vZGUoKSxzPWkuZ2V0Tm9kZSgpO2lmKHQuaXMobCl8fHQuaXMocykpe2lmKGw9dC5fX2tleSxlLmlzQ29sbGFwc2VkKCkpdD1vLm9mZnNldCwobjw9dCYmMDxyfHxuPHQmJjA+cikmJihuPU1hdGgubWF4KDAsdCtyKSxvLnNldChsLG4sImVsZW1lbnQiKSxpLnNldChsLG4sImVsZW1lbnQiKSx4eShlKSk7ZWxzZXtsZXQgdT1lLmlzQmFja3dhcmQoKTtzPXU/aTpvO3ZhciBhPXMuZ2V0Tm9kZSgpO289dT9vOmksaT1vLmdldE5vZGUoKSx0LmlzKGEpJiYoYT1zLm9mZnNldCwobjw9YSYmMDxyfHxuPGEmJjA+cikmJnMuc2V0KGwsTWF0aC5tYXgoMCxhK3IpLCJlbGVtZW50IikpLHQuaXMoaSkmJih0PW8ub2Zmc2V0LChuPD10JiYwPHJ8fG48dCYmMD5yKSYmby5zZXQobCxNYXRoLm1heCgwLHQrciksImVsZW1lbnQiKSl9eHkoZSl9fWZ1bmN0aW9uIHh5KGUpe3ZhciB0PWUuYW5jaG9yLG49dC5vZmZzZXQ7bGV0IHI9ZS5mb2N1czt2YXIgbz1yLm9mZnNldCxpPXQuZ2V0Tm9kZSgpLGw9ci5nZXROb2RlKCk7aWYoZS5pc0NvbGxhcHNlZCgpKUIoaSkmJihsPWkuZ2V0Q2hpbGRyZW5TaXplKCksbD0obz1uPj1sKT9pLmdldENoaWxkQXRJbmRleChsLTEpOmkuZ2V0Q2hpbGRBdEluZGV4KG4pLFEobCkmJihuPTAsbyYmKG49bC5nZXRUZXh0Q29udGVudFNpemUoKSksdC5zZXQobC5fX2tleSxuLCJ0ZXh0Iiksci5zZXQobC5fX2tleSxuLCJ0ZXh0IikpKTtlbHNle2lmKEIoaSkpe2xldCBzPWkuZ2V0Q2hpbGRyZW5TaXplKCk7bj0oZT1uPj1zKT9pLmdldENoaWxkQXRJbmRleChzLTEpOmkuZ2V0Q2hpbGRBdEluZGV4KG4pLFEobikmJihpPTAsZSYmKGk9bi5nZXRUZXh0Q29udGVudFNpemUoKSksdC5zZXQobi5fX2tleSxpLCJ0ZXh0IikpfUIobCkmJihuPWwuZ2V0Q2hpbGRyZW5TaXplKCksbz0odD1vPj1uKT9sLmdldENoaWxkQXRJbmRleChuLTEpOmwuZ2V0Q2hpbGRBdEluZGV4KG8pLFEobykmJihsPTAsdCYmKGw9by5nZXRUZXh0Q29udGVudFNpemUoKSksci5zZXQoby5fX2tleSxsLCJ0ZXh0IikpKX19ZnVuY3Rpb24gRGIoZSx0KXtpZih0PXQuZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uLGU9ZS5fc2VsZWN0aW9uLGRlKGUpKXt2YXIgbj1lLmFuY2hvcjtsZXQgcj1lLmZvY3VzLG87bi50eXBlPT09InRleHQiJiYobz1uLmdldE5vZGUoKSxvLnNlbGVjdGlvblRyYW5zZm9ybSh0LGUpKSxyLnR5cGU9PT0idGV4dCImJihuPXIuZ2V0Tm9kZSgpLG8hPT1uJiZuLnNlbGVjdGlvblRyYW5zZm9ybSh0LGUpKX19ZnVuY3Rpb24gQ2MoZSx0LG4scixvKXtsZXQgaT1udWxsLGw9MCxzPW51bGw7ciE9PW51bGw/KGk9ci5fX2tleSxRKHIpPyhsPXIuZ2V0VGV4dENvbnRlbnRTaXplKCkscz0idGV4dCIpOkIocikmJihsPXIuZ2V0Q2hpbGRyZW5TaXplKCkscz0iZWxlbWVudCIpKTpvIT09bnVsbCYmKGk9by5fX2tleSxRKG8pP3M9InRleHQiOkIobykmJihzPSJlbGVtZW50IikpLGkhPT1udWxsJiZzIT09bnVsbD9lLnNldChpLGwscyk6KGw9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpLGw9PT0tMSYmKGw9bi5nZXRDaGlsZHJlblNpemUoKSksZS5zZXQobi5fX2tleSxsLCJlbGVtZW50IikpfWZ1bmN0aW9uIF95KGUsdCxuLHIsbyl7ZS50eXBlPT09InRleHQiPyhlLmtleT1uLHR8fChlLm9mZnNldCs9bykpOmUub2Zmc2V0PnIuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSYmLS1lLm9mZnNldH1mdW5jdGlvbiBQdyhlLHQsbil7bGV0IHI9W10sbz1udWxsLGk9bnVsbDtlPWUuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrKyl7dmFyIGw9ZVtjXTt5YShsKXx8VSgxMDgpO3ZhciBzPWwuZ2V0Q2hpbGRyZW4oKTtsPTA7Zm9yKGxldCBkIG9mIHMpe2ZvcihBbihkKXx8VSgxMDkpO3JbY10hPT12b2lkIDAmJnJbY11bbF0hPT12b2lkIDA7KWwrKztzPWM7dmFyIGE9bCx1PWQ7bGV0IGY9e2NlbGw6dSxzdGFydENvbHVtbjphLHN0YXJ0Um93OnN9LGg9dS5fX3Jvd1NwYW4sZz11Ll9fY29sU3Bhbjtmb3IobGV0IG09MDttPGg7bSsrKXtyW3MrbV09PT12b2lkIDAmJihyW3MrbV09W10pO2ZvcihsZXQgUz0wO1M8ZztTKyspcltzK21dW2ErU109Zn10LmlzKHUpJiYobz1mKSxuLmlzKHUpJiYoaT1mKSxsKz1kLl9fY29sU3Bhbn19cmV0dXJuIG89PT1udWxsJiZVKDExMCksaT09PW51bGwmJlUoMTExKSxbcixvLGldfWZ1bmN0aW9uIE93KGUpe2UgaW5zdGFuY2VvZiBRZ3x8KGUgaW5zdGFuY2VvZiBMYT8oZT13YyhlLEFuKSxBbihlKXx8VSgxMTQpKTooZT13YyhlLmdldE5vZGUoKSxBbiksQW4oZSl8fFUoMTE0KSkpO2xldCB0PWUuZ2V0UGFyZW50KCk7eWEodCl8fFUoMTE1KTtsZXQgbj10LmdldFBhcmVudCgpO3JldHVybiBKZyhuKXx8VSgxMTYpLFtlLHQsbl19bGV0IGt0PW51bGwsVHQ9bnVsbCxobj0hMSx3Zj0hMSx2YT0wLHd5PXtjaGFyYWN0ZXJEYXRhOiEwLGNoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfTtmdW5jdGlvbiBCbCgpe3JldHVybiBobnx8a3QhPT1udWxsJiZrdC5fcmVhZE9ubHl9ZnVuY3Rpb24gSnQoKXtobiYmVSgxMyl9ZnVuY3Rpb24gQ3IoKXtyZXR1cm4ga3Q9PT1udWxsJiZVKDE1KSxrdH1mdW5jdGlvbiBldCgpe3JldHVybiBUdD09PW51bGwmJlUoMTYpLFR0fWZ1bmN0aW9uIFN5KGUsdCxuKXt2YXIgcj10Ll9fdHlwZTtsZXQgbz1lLl9ub2Rlcy5nZXQocik7Zm9yKG89PT12b2lkIDAmJlUoMzAsciksZT1uLmdldChyKSxlPT09dm9pZCAwJiYoZT1BcnJheS5mcm9tKG8udHJhbnNmb3Jtcyksbi5zZXQocixlKSksbj1lLmxlbmd0aCxyPTA7cjxuJiYoZVtyXSh0KSx0LmlzQXR0YWNoZWQoKSk7cisrKTt9ZnVuY3Rpb24gTGIoZSx0KXt0PXQuX2RpcnR5TGVhdmVzLGU9ZS5fbm9kZU1hcDtmb3IobGV0IG4gb2YgdCl0PWUuZ2V0KG4pLFEodCkmJnQuaXNBdHRhY2hlZCgpJiZ0LmlzU2ltcGxlVGV4dCgpJiYhdC5pc1VubWVyZ2VhYmxlKCkmJm53KHQpfWZ1bmN0aW9uIEliKGUsdCl7bGV0IG49dC5fZGlydHlMZWF2ZXMscj10Ll9kaXJ0eUVsZW1lbnRzO2U9ZS5fbm9kZU1hcDtsZXQgbz1tbygpLGk9bmV3IE1hcDt2YXIgbD1uO2xldCBzPWwuc2l6ZTtmb3IodmFyIGE9cix1PWEuc2l6ZTswPHN8fDA8dTspe2lmKDA8cyl7dC5fZGlydHlMZWF2ZXM9bmV3IFNldDtmb3IobGV0IGMgb2YgbClsPWUuZ2V0KGMpLFEobCkmJmwuaXNBdHRhY2hlZCgpJiZsLmlzU2ltcGxlVGV4dCgpJiYhbC5pc1VubWVyZ2VhYmxlKCkmJm53KGwpLGwhPT12b2lkIDAmJmwhPT12b2lkIDAmJmwuX19rZXkhPT1vJiZsLmlzQXR0YWNoZWQoKSYmU3kodCxsLGkpLG4uYWRkKGMpO2lmKGw9dC5fZGlydHlMZWF2ZXMscz1sLnNpemUsMDxzKXt2YSsrO2NvbnRpbnVlfX10Ll9kaXJ0eUxlYXZlcz1uZXcgU2V0LHQuX2RpcnR5RWxlbWVudHM9bmV3IE1hcDtmb3IobGV0IGMgb2YgYSlhPWNbMF0sdT1jWzFdLChhPT09InJvb3QifHx1KSYmKGw9ZS5nZXQoYSksbCE9PXZvaWQgMCYmbCE9PXZvaWQgMCYmbC5fX2tleSE9PW8mJmwuaXNBdHRhY2hlZCgpJiZTeSh0LGwsaSksci5zZXQoYSx1KSk7bD10Ll9kaXJ0eUxlYXZlcyxzPWwuc2l6ZSxhPXQuX2RpcnR5RWxlbWVudHMsdT1hLnNpemUsdmErK310Ll9kaXJ0eUxlYXZlcz1uLHQuX2RpcnR5RWxlbWVudHM9cn1mdW5jdGlvbiBZZyhlLHQpe3ZhciBuPWUudHlwZSxyPXQuZ2V0KG4pO2lmKHI9PT12b2lkIDAmJlUoMTcsbiksbj1yLmtsYXNzLGUudHlwZSE9PW4uZ2V0VHlwZSgpJiZVKDE4LG4ubmFtZSksbj1uLmltcG9ydEpTT04oZSksZT1lLmNoaWxkcmVuLEIobikmJkFycmF5LmlzQXJyYXkoZSkpZm9yKHI9MDtyPGUubGVuZ3RoO3IrKyl7bGV0IG89WWcoZVtyXSx0KTtuLmFwcGVuZChvKX1yZXR1cm4gbn1mdW5jdGlvbiBFeShlLHQpe2xldCBuPWt0LHI9aG4sbz1UdDtrdD1lLGhuPSEwLFR0PW51bGw7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtrdD1uLGhuPXIsVHQ9b319ZnVuY3Rpb24gbGkoZSx0KXtsZXQgbj1lLl9wZW5kaW5nRWRpdG9yU3RhdGUscj1lLl9yb290RWxlbWVudCxvPWUuX2hlYWRsZXNzfHxyPT09bnVsbDtpZihuIT09bnVsbCl7dmFyIGk9ZS5fZWRpdG9yU3RhdGUsbD1pLl9zZWxlY3Rpb24scz1uLl9zZWxlY3Rpb24sYT1lLl9kaXJ0eVR5cGUhPT0wLHU9a3QsYz1obixkPVR0LGY9ZS5fdXBkYXRpbmcsaD1lLl9vYnNlcnZlcixnPW51bGw7aWYoZS5fcGVuZGluZ0VkaXRvclN0YXRlPW51bGwsZS5fZWRpdG9yU3RhdGU9biwhbyYmYSYmaCE9PW51bGwpe1R0PWUsa3Q9bixobj0hMSxlLl91cGRhdGluZz0hMDt0cnl7bGV0IFRlPWUuX2RpcnR5VHlwZSxmdD1lLl9kaXJ0eUVsZW1lbnRzLGh0PWUuX2RpcnR5TGVhdmVzO2guZGlzY29ubmVjdCgpO3ZhciBtPVRlLFM9ZnQsdj1odDtRdD1Pcj1ndD0iIixndz1tPT09MixEdT1udWxsLEh0PWUsUm89ZS5fY29uZmlnLGhhPWUuX25vZGVzLGZkPUh0Ll9saXN0ZW5lcnMubXV0YXRpb24sVWg9UyxWaD12LGZpPWkuX25vZGVNYXAsUG89bi5fbm9kZU1hcCxIZz1uLl9yZWFkT25seSxIaD1uZXcgTWFwKGUuX2tleVRvRE9NTWFwKTtsZXQgX3Q9bmV3IE1hcDtwYT1fdCx5cygicm9vdCIsbnVsbCkscGE9SGg9Um89UG89Zmk9Vmg9VWg9aGE9SHQ9dm9pZCAwLGc9X3R9Y2F0Y2goVGUpe2lmKFRlIGluc3RhbmNlb2YgRXJyb3ImJmUuX29uRXJyb3IoVGUpLHdmKXRocm93IFRlO0x3KGUsbnVsbCxyLG4pLHR3KGUpLGUuX2RpcnR5VHlwZT0yLHdmPSEwLGxpKGUsaSksd2Y9ITE7cmV0dXJufWZpbmFsbHl7aC5vYnNlcnZlKHIsd3kpLGUuX3VwZGF0aW5nPWYsa3Q9dSxobj1jLFR0PWR9fW4uX3JlYWRPbmx5fHwobi5fcmVhZE9ubHk9ITApO3ZhciB5PWUuX2RpcnR5TGVhdmVzLHg9ZS5fZGlydHlFbGVtZW50cyxfPWUuX25vcm1hbGl6ZWROb2RlcyxFPWUuX3VwZGF0ZVRhZ3MsJD1lLl9kZWZlcnJlZDthJiYoZS5fZGlydHlUeXBlPTAsZS5fY2xvbmVOb3ROZWVkZWQuY2xlYXIoKSxlLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LGUuX2RpcnR5RWxlbWVudHM9bmV3IE1hcCxlLl9ub3JtYWxpemVkTm9kZXM9bmV3IFNldCxlLl91cGRhdGVUYWdzPW5ldyBTZXQpO3ZhciBDPWUuX2RlY29yYXRvcnMsVD1lLl9wZW5kaW5nRGVjb3JhdG9yc3x8QyxNPW4uX25vZGVNYXAsUjtmb3IoUiBpbiBUKU0uaGFzKFIpfHwoVD09PUMmJihUPXN3KGUpKSxkZWxldGUgVFtSXSk7dmFyIGo9bz9udWxsOkVyKGUuX3dpbmRvdyk7aWYoZS5fZWRpdGFibGUmJmohPT1udWxsJiYoYXx8cz09PW51bGx8fHMuZGlydHkpKXtUdD1lLGt0PW47dHJ5e2lmKGghPT1udWxsJiZoLmRpc2Nvbm5lY3QoKSxhfHxzPT09bnVsbHx8cy5kaXJ0eSl7bGV0IFRlPWUuX2Jsb2NrQ3Vyc29yRWxlbWVudDtUZSE9PW51bGwmJldoKFRlLGUscik7ZTp7bGV0IGZ0PWouYW5jaG9yTm9kZSxodD1qLmZvY3VzTm9kZSxfdD1qLmFuY2hvck9mZnNldCxwbj1qLmZvY3VzT2Zmc2V0LEl0PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoIShFLmhhcygiY29sbGFib3JhdGlvbiIpJiZJdCE9PXJ8fEl0IT09bnVsbCYmemcoSXQpKSlpZihkZShzKSl7dmFyIEY9cy5hbmNob3IsYWU9cy5mb2N1cyxIPUYua2V5LFg9YWUua2V5LFA9eGMoZSxIKSxPPXhjKGUsWCksaz1GLm9mZnNldCxJPWFlLm9mZnNldCxMPXMuZm9ybWF0LFY9cy5zdHlsZSx0ZT1zLmlzQ29sbGFwc2VkKCkseWU9UCxmZT1PLE9lPSExO2lmKEYudHlwZT09PSJ0ZXh0Iil7eWU9bWMoUCk7bGV0IHd0PUYuZ2V0Tm9kZSgpO09lPXd0LmdldEZvcm1hdCgpIT09THx8d3QuZ2V0U3R5bGUoKSE9PVZ9ZWxzZSBkZShsKSYmbC5hbmNob3IudHlwZT09PSJ0ZXh0IiYmKE9lPSEwKTtpZihhZS50eXBlPT09InRleHQiJiYoZmU9bWMoTykpLHllIT09bnVsbCYmZmUhPT1udWxsKXtpZih0ZSYmKGw9PT1udWxsfHxPZXx8ZGUobCkmJihsLmZvcm1hdCE9PUx8fGwuc3R5bGUhPT1WKSkpe3ZhciBiZT1wZXJmb3JtYW5jZS5ub3coKTtFdz1bTCxWLGssSCxiZV19aWYoX3Q9PT1rJiZwbj09PUkmJmZ0PT09eWUmJmh0PT09ZmUmJihqLnR5cGUhPT0iUmFuZ2UifHwhdGUpJiYoSXQhPT1udWxsJiZyLmNvbnRhaW5zKEl0KXx8ci5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLEYudHlwZSE9PSJlbGVtZW50IikpYnJlYWsgZTt0cnl7ai5zZXRCYXNlQW5kRXh0ZW50KHllLGssZmUsSSl9Y2F0Y2h7fWlmKCFFLmhhcygic2tpcC1zY3JvbGwtaW50by12aWV3IikmJnMuaXNDb2xsYXBzZWQoKSYmciE9PW51bGwmJnI9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50KXtsZXQgd3Q9cyBpbnN0YW5jZW9mIGtpJiZzLmFuY2hvci50eXBlPT09ImVsZW1lbnQiP3llLmNoaWxkTm9kZXNba118fG51bGw6MDxqLnJhbmdlQ291bnQ/ai5nZXRSYW5nZUF0KDApOm51bGw7aWYod3QhPT1udWxsKXtsZXQgT3Q7aWYod3QgaW5zdGFuY2VvZiBUZXh0KXtsZXQgenQ9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTt6dC5zZWxlY3ROb2RlKHd0KSxPdD16dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1lbHNlIE90PXd0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2xldCBvcj1yLm93bmVyRG9jdW1lbnQsanQ9b3IuZGVmYXVsdFZpZXc7aWYoanQhPT1udWxsKWZvcih2YXJ7dG9wOlosYm90dG9tOmtlfT1PdCxjZSxfZSxtZT1yO21lIT09bnVsbDspe2xldCB6dD1tZT09PW9yLmJvZHk7aWYoenQpY2U9MCxfZT1jZChlKS5pbm5lckhlaWdodDtlbHNle2xldCBXbz1tZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjZT1Xby50b3AsX2U9V28uYm90dG9tfWxldCBpcj0wO2lmKFo8Y2U/aXI9LShjZS1aKTprZT5fZSYmKGlyPWtlLV9lKSxpciE9PTApaWYoenQpanQuc2Nyb2xsQnkoMCxpcik7ZWxzZXtsZXQgV289bWUuc2Nyb2xsVG9wO21lLnNjcm9sbFRvcCs9aXI7bGV0IFdhPW1lLnNjcm9sbFRvcC1XbztaLT1XYSxrZS09V2F9aWYoenQpYnJlYWs7bWU9dWQobWUpfX19UWg9ITB9fWVsc2UgbCE9PW51bGwmJkFhKGUsZnQsaHQpJiZqLnJlbW92ZUFsbFJhbmdlcygpfX1lOntsZXQgVGU9ZS5fYmxvY2tDdXJzb3JFbGVtZW50O2lmKGRlKHMpJiZzLmlzQ29sbGFwc2VkKCkmJnMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJnIuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpe2xldCBmdD1zLmFuY2hvcixodD1mdC5nZXROb2RlKCksX3Q9ZnQub2Zmc2V0LHBuPWh0LmdldENoaWxkcmVuU2l6ZSgpLEl0PSExLHd0PW51bGw7aWYoX3Q9PT1wbil7bGV0IE90PWh0LmdldENoaWxkQXRJbmRleChfdC0xKTtwZihPdCkmJihJdD0hMCl9ZWxzZXtsZXQgT3Q9aHQuZ2V0Q2hpbGRBdEluZGV4KF90KTtpZihwZihPdCkpe2xldCBvcj1PdC5nZXRQcmV2aW91c1NpYmxpbmcoKTsob3I9PT1udWxsfHxwZihvcikpJiYoSXQ9ITAsd3Q9ZS5nZXRFbGVtZW50QnlLZXkoT3QuX19rZXkpKX19aWYoSXQpe2xldCBPdD1lLmdldEVsZW1lbnRCeUtleShodC5fX2tleSk7aWYoVGU9PT1udWxsKXtsZXQgb3I9ZS5fY29uZmlnLnRoZW1lLGp0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2p0LmNvbnRlbnRFZGl0YWJsZT0iZmFsc2UiLGp0LnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLWN1cnNvciIsInRydWUiKTtsZXQgenQ9b3IuYmxvY2tDdXJzb3I7aWYoenQhPT12b2lkIDApe2lmKHR5cGVvZiB6dD09InN0cmluZyIpe2xldCBpcj16dC5zcGxpdCgiICIpO3p0PW9yLmJsb2NrQ3Vyc29yPWlyfXp0IT09dm9pZCAwJiZqdC5jbGFzc0xpc3QuYWRkKC4uLnp0KX1lLl9ibG9ja0N1cnNvckVsZW1lbnQ9VGU9anR9ci5zdHlsZS5jYXJldENvbG9yPSJ0cmFuc3BhcmVudCIsd3Q9PT1udWxsP090LmFwcGVuZENoaWxkKFRlKTpPdC5pbnNlcnRCZWZvcmUoVGUsd3QpO2JyZWFrIGV9fVRlIT09bnVsbCYmV2goVGUsZSxyKX1oIT09bnVsbCYmaC5vYnNlcnZlKHIsd3kpfWZpbmFsbHl7VHQ9ZCxrdD11fX1pZihnIT09bnVsbCl7dmFyICRlPWc7bGV0IFRlPUFycmF5LmZyb20oZS5fbGlzdGVuZXJzLm11dGF0aW9uKSxmdD1UZS5sZW5ndGg7Zm9yKGxldCBodD0wO2h0PGZ0O2h0Kyspe2xldFtfdCxwbl09VGVbaHRdLEl0PSRlLmdldChwbik7SXQhPT12b2lkIDAmJl90KEl0LHtkaXJ0eUxlYXZlczp5LHByZXZFZGl0b3JTdGF0ZTppLHVwZGF0ZVRhZ3M6RX0pfX1kZShzKXx8cz09PW51bGx8fGwhPT1udWxsJiZsLmlzKHMpfHxlLmRpc3BhdGNoQ29tbWFuZChsZCx2b2lkIDApO3ZhciBCZT1lLl9wZW5kaW5nRGVjb3JhdG9ycztCZSE9PW51bGwmJihlLl9kZWNvcmF0b3JzPUJlLGUuX3BlbmRpbmdEZWNvcmF0b3JzPW51bGwsanMoImRlY29yYXRvciIsZSwhMCxCZSkpO3ZhciBQdD1seSh0fHxpKSxzbj1seShuKTtpZihQdCE9PXNuJiZqcygidGV4dGNvbnRlbnQiLGUsITAsc24pLGpzKCJ1cGRhdGUiLGUsITAse2RpcnR5RWxlbWVudHM6eCxkaXJ0eUxlYXZlczp5LGVkaXRvclN0YXRlOm4sbm9ybWFsaXplZE5vZGVzOl8scHJldkVkaXRvclN0YXRlOnR8fGksdGFnczpFfSksZS5fZGVmZXJyZWQ9W10sJC5sZW5ndGghPT0wKXtsZXQgVGU9ZS5fdXBkYXRpbmc7ZS5fdXBkYXRpbmc9ITA7dHJ5e2ZvcihsZXQgZnQ9MDtmdDwkLmxlbmd0aDtmdCsrKSRbZnRdKCl9ZmluYWxseXtlLl91cGRhdGluZz1UZX19dmFyIGJuPWUuX3VwZGF0ZXM7aWYoYm4ubGVuZ3RoIT09MCl7bGV0IFRlPWJuLnNoaWZ0KCk7aWYoVGUpe2xldFtmdCxodF09VGU7QXcoZSxmdCxodCl9fX19ZnVuY3Rpb24ganMoZSx0LG4sLi4ucil7bGV0IG89dC5fdXBkYXRpbmc7dC5fdXBkYXRpbmc9bjt0cnl7bGV0IGk9QXJyYXkuZnJvbSh0Ll9saXN0ZW5lcnNbZV0pO2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspaVtlXS5hcHBseShudWxsLHIpfWZpbmFsbHl7dC5fdXBkYXRpbmc9b319ZnVuY3Rpb24gWShlLHQsbil7aWYoZS5fdXBkYXRpbmc9PT0hMXx8VHQhPT1lKXtsZXQgaT0hMTtyZXR1cm4gZS51cGRhdGUoKCk9PntpPVkoZSx0LG4pfSksaX1sZXQgcj1CZyhlKTtmb3IobGV0IGk9NDswPD1pO2ktLSlmb3IobGV0IGw9MDtsPHIubGVuZ3RoO2wrKyl7dmFyIG89cltsXS5fY29tbWFuZHMuZ2V0KHQpO2lmKG8hPT12b2lkIDAmJihvPW9baV0sbyE9PXZvaWQgMCkpe289QXJyYXkuZnJvbShvKTtsZXQgcz1vLmxlbmd0aDtmb3IobGV0IGE9MDthPHM7YSsrKWlmKG9bYV0obixlKT09PSEwKXJldHVybiEwfX1yZXR1cm4hMX1mdW5jdGlvbiBDeShlLHQpe2xldCBuPWUuX3VwZGF0ZXM7Zm9yKHQ9dHx8ITE7bi5sZW5ndGghPT0wOyl7dmFyIHI9bi5zaGlmdCgpO2lmKHIpe2xldFtvLGldPXIsbDtpIT09dm9pZCAwJiYocj1pLm9uVXBkYXRlLGw9aS50YWcsaS5za2lwVHJhbnNmb3JtcyYmKHQ9ITApLHImJmUuX2RlZmVycmVkLnB1c2gociksbCYmZS5fdXBkYXRlVGFncy5hZGQobCkpLG8oKX19cmV0dXJuIHR9ZnVuY3Rpb24gQXcoZSx0LG4pe2xldCByPWUuX3VwZGF0ZVRhZ3M7dmFyIG8saT1vPSExO2lmKG4hPT12b2lkIDApe3ZhciBsPW4ub25VcGRhdGU7bz1uLnRhZyxvIT1udWxsJiZyLmFkZChvKSxvPW4uc2tpcFRyYW5zZm9ybXN8fCExLGk9bi5kaXNjcmV0ZXx8ITF9bCYmZS5fZGVmZXJyZWQucHVzaChsKSxuPWUuX2VkaXRvclN0YXRlLGw9ZS5fcGVuZGluZ0VkaXRvclN0YXRlO2xldCBzPSExOyhsPT09bnVsbHx8bC5fcmVhZE9ubHkpJiYobD1lLl9wZW5kaW5nRWRpdG9yU3RhdGU9bmV3IG1kKG5ldyBNYXAoKGx8fG4pLl9ub2RlTWFwKSkscz0hMCksbC5fZmx1c2hTeW5jPWksaT1rdDtsZXQgYT1obix1PVR0LGM9ZS5fdXBkYXRpbmc7a3Q9bCxobj0hMSxlLl91cGRhdGluZz0hMCxUdD1lO3RyeXtzJiYoZS5faGVhZGxlc3M/bi5fc2VsZWN0aW9uIT1udWxsJiYobC5fc2VsZWN0aW9uPW4uX3NlbGVjdGlvbi5jbG9uZSgpKTpsLl9zZWxlY3Rpb249TWIoZSkpO2xldCBkPWUuX2NvbXBvc2l0aW9uS2V5O3QoKSxvPUN5KGUsbyksRGIobCxlKSxlLl9kaXJ0eVR5cGUhPT0wJiYobz9MYihsLGUpOkliKGwsZSksQ3koZSkseWIobixsLGUuX2RpcnR5TGVhdmVzLGUuX2RpcnR5RWxlbWVudHMpKSxkIT09ZS5fY29tcG9zaXRpb25LZXkmJihsLl9mbHVzaFN5bmM9ITApO2xldCBmPWwuX3NlbGVjdGlvbjtpZihkZShmKSl7bGV0IGg9bC5fbm9kZU1hcCxnPWYuZm9jdXMua2V5O2guZ2V0KGYuYW5jaG9yLmtleSkhPT12b2lkIDAmJmguZ2V0KGcpIT09dm9pZCAwfHxVKDE5KX1lbHNlIHpsKGYpJiZmLl9ub2Rlcy5zaXplPT09MCYmKGwuX3NlbGVjdGlvbj1udWxsKX1jYXRjaChkKXtkIGluc3RhbmNlb2YgRXJyb3ImJmUuX29uRXJyb3IoZCksZS5fcGVuZGluZ0VkaXRvclN0YXRlPW4sZS5fZGlydHlUeXBlPTIsZS5fY2xvbmVOb3ROZWVkZWQuY2xlYXIoKSxlLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LGUuX2RpcnR5RWxlbWVudHMuY2xlYXIoKSxsaShlKTtyZXR1cm59ZmluYWxseXtrdD1pLGhuPWEsVHQ9dSxlLl91cGRhdGluZz1jLHZhPTB9ZS5fZGlydHlUeXBlIT09MHx8amIobCxlKT9sLl9mbHVzaFN5bmM/KGwuX2ZsdXNoU3luYz0hMSxsaShlKSk6cyYmcGIoKCk9PntsaShlKX0pOihsLl9mbHVzaFN5bmM9ITEscyYmKHIuY2xlYXIoKSxlLl9kZWZlcnJlZD1bXSxlLl9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCkpfWZ1bmN0aW9uIGtuKGUsdCxuKXtlLl91cGRhdGluZz9lLl91cGRhdGVzLnB1c2goW3Qsbl0pOkF3KGUsdCxuKX1jbGFzcyBNdyBleHRlbmRzIExhe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWRlY29yYXRlKCl7VSg0Nyl9aXNJc29sYXRlZCgpe3JldHVybiExfWlzSW5saW5lKCl7cmV0dXJuITB9aXNLZXlib2FyZFNlbGVjdGFibGUoKXtyZXR1cm4hMH19ZnVuY3Rpb24gVmUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBNd31jbGFzcyBUaSBleHRlbmRzIExhe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX19sYXN0PXRoaXMuX19maXJzdD1udWxsLHRoaXMuX19pbmRlbnQ9dGhpcy5fX2Zvcm1hdD10aGlzLl9fc2l6ZT0wLHRoaXMuX19kaXI9bnVsbH1nZXRGb3JtYXQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Zvcm1hdH1nZXRGb3JtYXRUeXBlKCl7bGV0IHQ9dGhpcy5nZXRGb3JtYXQoKTtyZXR1cm4gYWJbdF18fCIifWdldEluZGVudCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9faW5kZW50fWdldENoaWxkcmVuKCl7bGV0IHQ9W10sbj10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q2hpbGRyZW5LZXlzKCl7bGV0IHQ9W10sbj10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobi5fX2tleSksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q2hpbGRyZW5TaXplKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19zaXplfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5nZXRDaGlsZHJlblNpemUoKT09PTB9aXNEaXJ0eSgpe2xldCB0PWV0KCkuX2RpcnR5RWxlbWVudHM7cmV0dXJuIHQhPT1udWxsJiZ0Lmhhcyh0aGlzLl9fa2V5KX1pc0xhc3RDaGlsZCgpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCksbj10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRMYXN0Q2hpbGQoKTtyZXR1cm4gbiE9PW51bGwmJm4uaXModCl9Z2V0QWxsVGV4dE5vZGVzKCl7bGV0IHQ9W10sbj10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO24hPT1udWxsOyl7aWYoUShuKSYmdC5wdXNoKG4pLEIobikpe2xldCByPW4uZ2V0QWxsVGV4dE5vZGVzKCk7dC5wdXNoKC4uLnIpfW49bi5nZXROZXh0U2libGluZygpfXJldHVybiB0fWdldEZpcnN0RGVzY2VuZGFudCgpe2xldCB0PXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO2Zvcig7dCE9PW51bGw7KXtpZihCKHQpKXtsZXQgbj10LmdldEZpcnN0Q2hpbGQoKTtpZihuIT09bnVsbCl7dD1uO2NvbnRpbnVlfX1icmVha31yZXR1cm4gdH1nZXRMYXN0RGVzY2VuZGFudCgpe2xldCB0PXRoaXMuZ2V0TGFzdENoaWxkKCk7Zm9yKDt0IT09bnVsbDspe2lmKEIodCkpe2xldCBuPXQuZ2V0TGFzdENoaWxkKCk7aWYobiE9PW51bGwpe3Q9bjtjb250aW51ZX19YnJlYWt9cmV0dXJuIHR9Z2V0RGVzY2VuZGFudEJ5SW5kZXgodCl7bGV0IG49dGhpcy5nZXRDaGlsZHJlbigpLHI9bi5sZW5ndGg7cmV0dXJuIHQ+PXI/KHQ9bltyLTFdLEIodCkmJnQuZ2V0TGFzdERlc2NlbmRhbnQoKXx8dHx8bnVsbCk6KHQ9blt0XSxCKHQpJiZ0LmdldEZpcnN0RGVzY2VuZGFudCgpfHx0fHxudWxsKX1nZXRGaXJzdENoaWxkKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX2ZpcnN0O3JldHVybiB0PT09bnVsbD9udWxsOiR0KHQpfWdldEZpcnN0Q2hpbGRPclRocm93KCl7bGV0IHQ9dGhpcy5nZXRGaXJzdENoaWxkKCk7cmV0dXJuIHQ9PT1udWxsJiZVKDQ1LHRoaXMuX19rZXkpLHR9Z2V0TGFzdENoaWxkKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX2xhc3Q7cmV0dXJuIHQ9PT1udWxsP251bGw6JHQodCl9Z2V0TGFzdENoaWxkT3JUaHJvdygpe2xldCB0PXRoaXMuZ2V0TGFzdENoaWxkKCk7cmV0dXJuIHQ9PT1udWxsJiZVKDk2LHRoaXMuX19rZXkpLHR9Z2V0Q2hpbGRBdEluZGV4KHQpe3ZhciBuPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7bGV0IHI7aWYodDxuLzIpe2ZvcihyPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpLG49MDtyIT09bnVsbCYmbjw9dDspe2lmKG49PT10KXJldHVybiByO3I9ci5nZXROZXh0U2libGluZygpLG4rK31yZXR1cm4gbnVsbH1mb3Iocj10aGlzLmdldExhc3RDaGlsZCgpLC0tbjtyIT09bnVsbCYmbj49dDspe2lmKG49PT10KXJldHVybiByO3I9ci5nZXRQcmV2aW91c1NpYmxpbmcoKSxuLS19cmV0dXJuIG51bGx9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD0iIixuPXRoaXMuZ2V0Q2hpbGRyZW4oKSxyPW4ubGVuZ3RoO2ZvcihsZXQgbz0wO288cjtvKyspe2xldCBpPW5bb107dCs9aS5nZXRUZXh0Q29udGVudCgpLEIoaSkmJm8hPT1yLTEmJiFpLmlzSW5saW5lKCkmJih0Kz1gCgpgKX1yZXR1cm4gdH1nZXRUZXh0Q29udGVudFNpemUoKXtsZXQgdD0wLG49dGhpcy5nZXRDaGlsZHJlbigpLHI9bi5sZW5ndGg7Zm9yKGxldCBvPTA7bzxyO28rKyl7bGV0IGk9bltvXTt0Kz1pLmdldFRleHRDb250ZW50U2l6ZSgpLEIoaSkmJm8hPT1yLTEmJiFpLmlzSW5saW5lKCkmJih0Kz0yKX1yZXR1cm4gdH1nZXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Rpcn1oYXNGb3JtYXQodCl7cmV0dXJuIHQhPT0iIj8odD1ueVt0XSwodGhpcy5nZXRGb3JtYXQoKSZ0KSE9PTApOiExfXNlbGVjdCh0LG4pe0p0KCk7bGV0IHI9S2UoKSxvPXQsaT1uO3ZhciBsPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7aWYoIXRoaXMuY2FuQmVFbXB0eSgpKXtpZih0PT09MCYmbj09PTApe2lmKHQ9dGhpcy5nZXRGaXJzdENoaWxkKCksUSh0KXx8Qih0KSlyZXR1cm4gdC5zZWxlY3QoMCwwKX1lbHNlIGlmKCEodCE9PXZvaWQgMCYmdCE9PWx8fG4hPT12b2lkIDAmJm4hPT1sKSYmKHQ9dGhpcy5nZXRMYXN0Q2hpbGQoKSxRKHQpfHxCKHQpKSlyZXR1cm4gdC5zZWxlY3QoKX1pZihvPT09dm9pZCAwJiYobz1sKSxpPT09dm9pZCAwJiYoaT1sKSxsPXRoaXMuX19rZXksZGUocikpci5hbmNob3Iuc2V0KGwsbywiZWxlbWVudCIpLHIuZm9jdXMuc2V0KGwsaSwiZWxlbWVudCIpLHIuZGlydHk9ITA7ZWxzZSByZXR1cm4gUncobCxvLGwsaSwiZWxlbWVudCIsImVsZW1lbnQiKTtyZXR1cm4gcn1zZWxlY3RTdGFydCgpe2xldCB0PXRoaXMuZ2V0Rmlyc3REZXNjZW5kYW50KCk7cmV0dXJuIEIodCl8fFEodCk/dC5zZWxlY3QoMCwwKTp0IT09bnVsbD90LnNlbGVjdFByZXZpb3VzKCk6dGhpcy5zZWxlY3QoMCwwKX1zZWxlY3RFbmQoKXtsZXQgdD10aGlzLmdldExhc3REZXNjZW5kYW50KCk7cmV0dXJuIEIodCl8fFEodCk/dC5zZWxlY3QoKTp0IT09bnVsbD90LnNlbGVjdE5leHQoKTp0aGlzLnNlbGVjdCgpfWNsZWFyKCl7bGV0IHQ9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChuPT5uLnJlbW92ZSgpKSx0fWFwcGVuZCguLi50KXtyZXR1cm4gdGhpcy5zcGxpY2UodGhpcy5nZXRDaGlsZHJlblNpemUoKSwwLHQpfXNldERpcmVjdGlvbih0KXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19kaXI9dCxufXNldEZvcm1hdCh0KXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9fZm9ybWF0PXQhPT0iIj9ueVt0XTowLHRoaXN9c2V0SW5kZW50KHQpe3JldHVybiB0aGlzLmdldFdyaXRhYmxlKCkuX19pbmRlbnQ9dCx0aGlzfXNwbGljZSh0LG4scil7bGV0IG89ci5sZW5ndGgsaT10aGlzLmdldENoaWxkcmVuU2l6ZSgpLGw9dGhpcy5nZXRXcml0YWJsZSgpLHM9bC5fX2tleTt2YXIgYT1bXSx1PVtdO2xldCBjPXRoaXMuZ2V0Q2hpbGRBdEluZGV4KHQrbiksZD1udWxsLGY9aS1uK287aWYodCE9PTApaWYodD09PWkpZD10aGlzLmdldExhc3RDaGlsZCgpO2Vsc2V7dmFyIGg9dGhpcy5nZXRDaGlsZEF0SW5kZXgodCk7aCE9PW51bGwmJihkPWguZ2V0UHJldmlvdXNTaWJsaW5nKCkpfWlmKDA8bil7dmFyIGc9ZD09PW51bGw/dGhpcy5nZXRGaXJzdENoaWxkKCk6ZC5nZXROZXh0U2libGluZygpO2ZvcihoPTA7aDxuO2grKyl7Zz09PW51bGwmJlUoMTAwKTt2YXIgbT1nLmdldE5leHRTaWJsaW5nKCksUz1nLl9fa2V5O2c9Zy5nZXRXcml0YWJsZSgpLGlpKGcpLHUucHVzaChTKSxnPW19fWZvcihoPWQsbT0wO208bzttKyspe1M9clttXSxoIT09bnVsbCYmUy5pcyhoKSYmKGQ9aD1oLmdldFByZXZpb3VzU2libGluZygpKSxnPVMuZ2V0V3JpdGFibGUoKSxnLl9fcGFyZW50PT09cyYmZi0tLGlpKGcpO2xldCB2PVMuX19rZXk7aD09PW51bGw/KGwuX19maXJzdD12LGcuX19wcmV2PW51bGwpOihoPWguZ2V0V3JpdGFibGUoKSxoLl9fbmV4dD12LGcuX19wcmV2PWguX19rZXkpLFMuX19rZXk9PT1zJiZVKDc2KSxnLl9fcGFyZW50PXMsYS5wdXNoKHYpLGg9U31pZih0K249PT1pP2ghPT1udWxsJiYoaC5nZXRXcml0YWJsZSgpLl9fbmV4dD1udWxsLGwuX19sYXN0PWguX19rZXkpOmMhPT1udWxsJiYodD1jLmdldFdyaXRhYmxlKCksaCE9PW51bGw/KG49aC5nZXRXcml0YWJsZSgpLHQuX19wcmV2PWguX19rZXksbi5fX25leHQ9Yy5fX2tleSk6dC5fX3ByZXY9bnVsbCksbC5fX3NpemU9Zix1Lmxlbmd0aCYmKHQ9S2UoKSxkZSh0KSkpe3U9bmV3IFNldCh1KSxhPW5ldyBTZXQoYSk7bGV0e2FuY2hvcjp2LGZvY3VzOnl9PXQ7JHkodix1LGEpJiZDYyh2LHYuZ2V0Tm9kZSgpLHRoaXMsZCxjKSwkeSh5LHUsYSkmJkNjKHkseS5nZXROb2RlKCksdGhpcyxkLGMpLGYhPT0wfHx0aGlzLmNhbkJlRW1wdHkoKXx8Sm4odGhpcyl8fHRoaXMucmVtb3ZlKCl9cmV0dXJuIGx9ZXhwb3J0SlNPTigpe3JldHVybntjaGlsZHJlbjpbXSxkaXJlY3Rpb246dGhpcy5nZXREaXJlY3Rpb24oKSxmb3JtYXQ6dGhpcy5nZXRGb3JtYXRUeXBlKCksaW5kZW50OnRoaXMuZ2V0SW5kZW50KCksdHlwZToiZWxlbWVudCIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcigpe3JldHVybiBudWxsfWNhbkluZGVudCgpe3JldHVybiEwfWNvbGxhcHNlQXRTdGFydCgpe3JldHVybiExfWV4Y2x1ZGVGcm9tQ29weSgpe3JldHVybiExfWNhbkV4dHJhY3RDb250ZW50cygpe3JldHVybiEwfWNhblJlcGxhY2VXaXRoKCl7cmV0dXJuITB9Y2FuSW5zZXJ0QWZ0ZXIoKXtyZXR1cm4hMH1jYW5CZUVtcHR5KCl7cmV0dXJuITB9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiEwfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiEwfWlzSW5saW5lKCl7cmV0dXJuITF9aXNTaGFkb3dSb290KCl7cmV0dXJuITF9Y2FuTWVyZ2VXaXRoKCl7cmV0dXJuITF9ZXh0cmFjdFdpdGhDaGlsZCgpe3JldHVybiExfX1mdW5jdGlvbiBCKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVGl9ZnVuY3Rpb24gJHkoZSx0LG4pe2ZvcihlPWUuZ2V0Tm9kZSgpO2U7KXtsZXQgcj1lLl9fa2V5O2lmKHQuaGFzKHIpJiYhbi5oYXMocikpcmV0dXJuITA7ZT1lLmdldFBhcmVudCgpfXJldHVybiExfWNsYXNzIFdsIGV4dGVuZHMgVGl7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4icm9vdCJ9c3RhdGljIGNsb25lKCl7cmV0dXJuIG5ldyBXbH1jb25zdHJ1Y3Rvcigpe3N1cGVyKCJyb290IiksdGhpcy5fX2NhY2hlZFRleHQ9bnVsbH1nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCl7VSg1MSl9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD10aGlzLl9fY2FjaGVkVGV4dDtyZXR1cm4hQmwoKSYmZXQoKS5fZGlydHlUeXBlIT09MHx8dD09PW51bGw/c3VwZXIuZ2V0VGV4dENvbnRlbnQoKTp0fXJlbW92ZSgpe1UoNTIpfXJlcGxhY2UoKXtVKDUzKX1pbnNlcnRCZWZvcmUoKXtVKDU0KX1pbnNlcnRBZnRlcigpe1UoNTUpfXVwZGF0ZURPTSgpe3JldHVybiExfWFwcGVuZCguLi50KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7bGV0IHI9dFtuXTtCKHIpfHxWZShyKXx8VSg1Nil9cmV0dXJuIHN1cGVyLmFwcGVuZCguLi50KX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1TcigpO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Y2hpbGRyZW46W10sZGlyZWN0aW9uOnRoaXMuZ2V0RGlyZWN0aW9uKCksZm9ybWF0OnRoaXMuZ2V0Rm9ybWF0VHlwZSgpLGluZGVudDp0aGlzLmdldEluZGVudCgpLHR5cGU6InJvb3QiLHZlcnNpb246MX19Y29sbGFwc2VBdFN0YXJ0KCl7cmV0dXJuITB9fWZ1bmN0aW9uIHF0KGUpe3JldHVybiBlIGluc3RhbmNlb2YgV2x9ZnVuY3Rpb24gamIoZSx0KXtpZih0PXQuZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uLGU9ZS5fc2VsZWN0aW9uLGUhPT1udWxsKXtpZihlLmRpcnR5fHwhZS5pcyh0KSlyZXR1cm4hMH1lbHNlIGlmKHQhPT1udWxsKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIFhnKCl7cmV0dXJuIG5ldyBtZChuZXcgTWFwKFtbInJvb3QiLG5ldyBXbF1dKSl9ZnVuY3Rpb24gRHcoZSl7bGV0IHQ9ZS5leHBvcnRKU09OKCk7dmFyIG49ZS5jb25zdHJ1Y3Rvcjt0LnR5cGUhPT1uLmdldFR5cGUoKSYmVSgxMzAsbi5uYW1lKTtsZXQgcj10LmNoaWxkcmVuO2lmKEIoZSkpZm9yKEFycmF5LmlzQXJyYXkocil8fFUoNTksbi5uYW1lKSxlPWUuZ2V0Q2hpbGRyZW4oKSxuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBvPUR3KGVbbl0pO3IucHVzaChvKX1yZXR1cm4gdH1jbGFzcyBtZHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX25vZGVNYXA9dCx0aGlzLl9zZWxlY3Rpb249bnx8bnVsbCx0aGlzLl9yZWFkT25seT10aGlzLl9mbHVzaFN5bmM9ITF9aXNFbXB0eSgpe3JldHVybiB0aGlzLl9ub2RlTWFwLnNpemU9PT0xJiZ0aGlzLl9zZWxlY3Rpb249PT1udWxsfXJlYWQodCl7cmV0dXJuIEV5KHRoaXMsdCl9Y2xvbmUodCl7cmV0dXJuIHQ9bmV3IG1kKHRoaXMuX25vZGVNYXAsdD09PXZvaWQgMD90aGlzLl9zZWxlY3Rpb246dCksdC5fcmVhZE9ubHk9ITAsdH10b0pTT04oKXtyZXR1cm4gRXkodGhpcywoKT0+KHtyb290OkR3KFNyKCkpfSkpfX1jbGFzcyBVbCBleHRlbmRzIFRpe3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInBhcmFncmFwaCJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgVWwodC5fX2tleSl9Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTtyZXR1cm4gdD1Ecyh0LnRoZW1lLCJwYXJhZ3JhcGgiKSx0IT09dm9pZCAwJiZuLmNsYXNzTGlzdC5hZGQoLi4udCksbn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue3A6KCk9Pih7Y29udmVyc2lvbjp6Yixwcmlvcml0eTowfSl9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmZGQodCkpe3RoaXMuaXNFbXB0eSgpJiZ0LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTt2YXIgbj10aGlzLmdldEZvcm1hdFR5cGUoKTt0LnN0eWxlLnRleHRBbGlnbj1uLChuPXRoaXMuZ2V0RGlyZWN0aW9uKCkpJiYodC5kaXI9biksbj10aGlzLmdldEluZGVudCgpLDA8biYmKHQuc3R5bGUudGV4dEluZGVudD1gJHsyMCpufXB4YCl9cmV0dXJue2VsZW1lbnQ6dH19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49aGkoKTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSx0eXBlOiJwYXJhZ3JhcGgiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIodCxuKXt0PWhpKCk7bGV0IHI9dGhpcy5nZXREaXJlY3Rpb24oKTtyZXR1cm4gdC5zZXREaXJlY3Rpb24ociksdGhpcy5pbnNlcnRBZnRlcih0LG4pLHR9Y29sbGFwc2VBdFN0YXJ0KCl7bGV0IHQ9dGhpcy5nZXRDaGlsZHJlbigpO2lmKHQubGVuZ3RoPT09MHx8USh0WzBdKSYmdFswXS5nZXRUZXh0Q29udGVudCgpLnRyaW0oKT09PSIiKXtpZih0aGlzLmdldE5leHRTaWJsaW5nKCkhPT1udWxsKXJldHVybiB0aGlzLnNlbGVjdE5leHQoKSx0aGlzLnJlbW92ZSgpLCEwO2lmKHRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkhPT1udWxsKXJldHVybiB0aGlzLnNlbGVjdFByZXZpb3VzKCksdGhpcy5yZW1vdmUoKSwhMH1yZXR1cm4hMX19ZnVuY3Rpb24gemIoZSl7bGV0IHQ9aGkoKTtyZXR1cm4gZS5zdHlsZSYmKHQuc2V0Rm9ybWF0KGUuc3R5bGUudGV4dEFsaWduKSxlPXBhcnNlSW50KGUuc3R5bGUudGV4dEluZGVudCwxMCkvMjAsMDxlJiZ0LnNldEluZGVudChlKSkse25vZGU6dH19ZnVuY3Rpb24gaGkoKXtyZXR1cm4gRGEobmV3IFVsKX1mdW5jdGlvbiBMdyhlLHQsbixyKXtsZXQgbz1lLl9rZXlUb0RPTU1hcDtvLmNsZWFyKCksZS5fZWRpdG9yU3RhdGU9WGcoKSxlLl9wZW5kaW5nRWRpdG9yU3RhdGU9cixlLl9jb21wb3NpdGlvbktleT1udWxsLGUuX2RpcnR5VHlwZT0wLGUuX2Nsb25lTm90TmVlZGVkLmNsZWFyKCksZS5fZGlydHlMZWF2ZXM9bmV3IFNldCxlLl9kaXJ0eUVsZW1lbnRzLmNsZWFyKCksZS5fbm9ybWFsaXplZE5vZGVzPW5ldyBTZXQsZS5fdXBkYXRlVGFncz1uZXcgU2V0LGUuX3VwZGF0ZXM9W10sZS5fYmxvY2tDdXJzb3JFbGVtZW50PW51bGwscj1lLl9vYnNlcnZlcixyIT09bnVsbCYmKHIuZGlzY29ubmVjdCgpLGUuX29ic2VydmVyPW51bGwpLHQhPT1udWxsJiYodC50ZXh0Q29udGVudD0iIiksbiE9PW51bGwmJihuLnRleHRDb250ZW50PSIiLG8uc2V0KCJyb290IixuKSl9ZnVuY3Rpb24gRmIoZSl7bGV0IHQ9bmV3IE1hcCxuPW5ldyBTZXQ7cmV0dXJuIGUuZm9yRWFjaChyPT57aWYocj1yLmtsYXNzLmltcG9ydERPTSE9bnVsbD9yLmtsYXNzLmltcG9ydERPTS5iaW5kKHIua2xhc3MpOm51bGwsciE9bnVsbCYmIW4uaGFzKHIpKXtuLmFkZChyKTt2YXIgbz1yKCk7byE9PW51bGwmJk9iamVjdC5rZXlzKG8pLmZvckVhY2goaT0+e2xldCBsPXQuZ2V0KGkpO2w9PT12b2lkIDAmJihsPVtdLHQuc2V0KGksbCkpLGwucHVzaChvW2ldKX0pfX0pLHR9Y2xhc3MgQmJ7Y29uc3RydWN0b3IodCxuLHIsbyxpLGwscyl7dGhpcy5fcGFyZW50RWRpdG9yPW4sdGhpcy5fcm9vdEVsZW1lbnQ9bnVsbCx0aGlzLl9lZGl0b3JTdGF0ZT10LHRoaXMuX2NvbXBvc2l0aW9uS2V5PXRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT1udWxsLHRoaXMuX2RlZmVycmVkPVtdLHRoaXMuX2tleVRvRE9NTWFwPW5ldyBNYXAsdGhpcy5fdXBkYXRlcz1bXSx0aGlzLl91cGRhdGluZz0hMSx0aGlzLl9saXN0ZW5lcnM9e2RlY29yYXRvcjpuZXcgU2V0LGVkaXRhYmxlOm5ldyBTZXQsbXV0YXRpb246bmV3IE1hcCxyb290Om5ldyBTZXQsdGV4dGNvbnRlbnQ6bmV3IFNldCx1cGRhdGU6bmV3IFNldH0sdGhpcy5fY29tbWFuZHM9bmV3IE1hcCx0aGlzLl9jb25maWc9byx0aGlzLl9ub2Rlcz1yLHRoaXMuX2RlY29yYXRvcnM9e30sdGhpcy5fcGVuZGluZ0RlY29yYXRvcnM9bnVsbCx0aGlzLl9kaXJ0eVR5cGU9MCx0aGlzLl9jbG9uZU5vdE5lZWRlZD1uZXcgU2V0LHRoaXMuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdGhpcy5fZGlydHlFbGVtZW50cz1uZXcgTWFwLHRoaXMuX25vcm1hbGl6ZWROb2Rlcz1uZXcgU2V0LHRoaXMuX3VwZGF0ZVRhZ3M9bmV3IFNldCx0aGlzLl9vYnNlcnZlcj1udWxsLHRoaXMuX2tleT11dygpLHRoaXMuX29uRXJyb3I9aSx0aGlzLl9odG1sQ29udmVyc2lvbnM9bCx0aGlzLl9lZGl0YWJsZT1zLHRoaXMuX2hlYWRsZXNzPW4hPT1udWxsJiZuLl9oZWFkbGVzcyx0aGlzLl9ibG9ja0N1cnNvckVsZW1lbnQ9dGhpcy5fd2luZG93PW51bGx9aXNDb21wb3NpbmcoKXtyZXR1cm4gdGhpcy5fY29tcG9zaXRpb25LZXkhPW51bGx9cmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcih0KXtsZXQgbj10aGlzLl9saXN0ZW5lcnMudXBkYXRlO3JldHVybiBuLmFkZCh0KSwoKT0+e24uZGVsZXRlKHQpfX1yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIodCl7bGV0IG49dGhpcy5fbGlzdGVuZXJzLmVkaXRhYmxlO3JldHVybiBuLmFkZCh0KSwoKT0+e24uZGVsZXRlKHQpfX1yZWdpc3RlckRlY29yYXRvckxpc3RlbmVyKHQpe2xldCBuPXRoaXMuX2xpc3RlbmVycy5kZWNvcmF0b3I7cmV0dXJuIG4uYWRkKHQpLCgpPT57bi5kZWxldGUodCl9fXJlZ2lzdGVyVGV4dENvbnRlbnRMaXN0ZW5lcih0KXtsZXQgbj10aGlzLl9saXN0ZW5lcnMudGV4dGNvbnRlbnQ7cmV0dXJuIG4uYWRkKHQpLCgpPT57bi5kZWxldGUodCl9fXJlZ2lzdGVyUm9vdExpc3RlbmVyKHQpe2xldCBuPXRoaXMuX2xpc3RlbmVycy5yb290O3JldHVybiB0KHRoaXMuX3Jvb3RFbGVtZW50LG51bGwpLG4uYWRkKHQpLCgpPT57dChudWxsLHRoaXMuX3Jvb3RFbGVtZW50KSxuLmRlbGV0ZSh0KX19cmVnaXN0ZXJDb21tYW5kKHQsbixyKXtyPT09dm9pZCAwJiZVKDM1KTtsZXQgbz10aGlzLl9jb21tYW5kcztvLmhhcyh0KXx8by5zZXQodCxbbmV3IFNldCxuZXcgU2V0LG5ldyBTZXQsbmV3IFNldCxuZXcgU2V0XSk7bGV0IGk9by5nZXQodCk7aT09PXZvaWQgMCYmVSgzNixTdHJpbmcodCkpO2xldCBsPWlbcl07cmV0dXJuIGwuYWRkKG4pLCgpPT57bC5kZWxldGUobiksaS5ldmVyeShzPT5zLnNpemU9PT0wKSYmby5kZWxldGUodCl9fXJlZ2lzdGVyTXV0YXRpb25MaXN0ZW5lcih0LG4pe3RoaXMuX25vZGVzLmdldCh0LmdldFR5cGUoKSk9PT12b2lkIDAmJlUoMzcsdC5uYW1lKTtsZXQgcj10aGlzLl9saXN0ZW5lcnMubXV0YXRpb247cmV0dXJuIHIuc2V0KG4sdCksKCk9PntyLmRlbGV0ZShuKX19cmVnaXN0ZXJOb2RlVHJhbnNmb3JtVG9LbGFzcyh0LG4pe3ZhciByPXQuZ2V0VHlwZSgpO3JldHVybiByPXRoaXMuX25vZGVzLmdldChyKSxyPT09dm9pZCAwJiZVKDM3LHQubmFtZSksci50cmFuc2Zvcm1zLmFkZChuKSxyfXJlZ2lzdGVyTm9kZVRyYW5zZm9ybSh0LG4pe3ZhciByPXRoaXMucmVnaXN0ZXJOb2RlVHJhbnNmb3JtVG9LbGFzcyh0LG4pO2xldCBvPVtyXTtyZXR1cm4gcj1yLnJlcGxhY2VXaXRoS2xhc3MsciE9bnVsbCYmKHI9dGhpcy5yZWdpc3Rlck5vZGVUcmFuc2Zvcm1Ub0tsYXNzKHIsbiksby5wdXNoKHIpKSxnYih0aGlzLHQuZ2V0VHlwZSgpKSwoKT0+e28uZm9yRWFjaChpPT5pLnRyYW5zZm9ybXMuZGVsZXRlKG4pKX19aGFzTm9kZSh0KXtyZXR1cm4gdGhpcy5fbm9kZXMuaGFzKHQuZ2V0VHlwZSgpKX1oYXNOb2Rlcyh0KXtyZXR1cm4gdC5ldmVyeSh0aGlzLmhhc05vZGUuYmluZCh0aGlzKSl9ZGlzcGF0Y2hDb21tYW5kKHQsbil7cmV0dXJuIFkodGhpcyx0LG4pfWdldERlY29yYXRvcnMoKXtyZXR1cm4gdGhpcy5fZGVjb3JhdG9yc31nZXRSb290RWxlbWVudCgpe3JldHVybiB0aGlzLl9yb290RWxlbWVudH1nZXRLZXkoKXtyZXR1cm4gdGhpcy5fa2V5fXNldFJvb3RFbGVtZW50KHQpe2xldCBuPXRoaXMuX3Jvb3RFbGVtZW50O2lmKHQhPT1uKXtsZXQgbD1Ecyh0aGlzLl9jb25maWcudGhlbWUsInJvb3QiKTt2YXIgcj10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGV8fHRoaXMuX2VkaXRvclN0YXRlO2lmKHRoaXMuX3Jvb3RFbGVtZW50PXQsTHcodGhpcyxuLHQsciksbiE9PW51bGwpe2lmKCF0aGlzLl9jb25maWcuZGlzYWJsZUV2ZW50cyl7THMhPT0wJiYoTHMtLSxMcz09PTAmJm4ub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLFR3KSk7dmFyIG89bi5fX2xleGljYWxFZGl0b3I7aWYobyE9bnVsbCl7aWYoby5fcGFyZW50RWRpdG9yIT09bnVsbCl7dmFyIGk9Qmcobyk7aT1pW2kubGVuZ3RoLTFdLl9rZXksZGwuZ2V0KGkpPT09byYmZGwuZGVsZXRlKGkpfWVsc2UgZGwuZGVsZXRlKG8uX2tleSk7bi5fX2xleGljYWxFZGl0b3I9bnVsbH1mb3Iobz1rdyhuKSxpPTA7aTxvLmxlbmd0aDtpKyspb1tpXSgpO24uX19sZXhpY2FsRXZlbnRIYW5kbGVzPVtdfWwhPW51bGwmJm4uY2xhc3NMaXN0LnJlbW92ZSguLi5sKX10IT09bnVsbD8ocj0ocj10Lm93bmVyRG9jdW1lbnQpJiZyLmRlZmF1bHRWaWV3fHxudWxsLG89dC5zdHlsZSxvLnVzZXJTZWxlY3Q9InRleHQiLG8ud2hpdGVTcGFjZT0icHJlLXdyYXAiLG8ud29yZEJyZWFrPSJicmVhay13b3JkIix0LnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLWVkaXRvciIsInRydWUiKSx0aGlzLl93aW5kb3c9cix0aGlzLl9kaXJ0eVR5cGU9Mix0dyh0aGlzKSx0aGlzLl91cGRhdGVUYWdzLmFkZCgiaGlzdG9yeS1tZXJnZSIpLGxpKHRoaXMpLHRoaXMuX2NvbmZpZy5kaXNhYmxlRXZlbnRzfHxUYih0LHRoaXMpLGwhPW51bGwmJnQuY2xhc3NMaXN0LmFkZCguLi5sKSk6KHRoaXMuX2VkaXRvclN0YXRlPXIsdGhpcy5fd2luZG93PXRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT1udWxsKSxqcygicm9vdCIsdGhpcywhMSx0LG4pfX1nZXRFbGVtZW50QnlLZXkodCl7cmV0dXJuIHRoaXMuX2tleVRvRE9NTWFwLmdldCh0KXx8bnVsbH1nZXRFZGl0b3JTdGF0ZSgpe3JldHVybiB0aGlzLl9lZGl0b3JTdGF0ZX1zZXRFZGl0b3JTdGF0ZSh0LG4pe3QuaXNFbXB0eSgpJiZVKDM4KSxldyh0aGlzKTtsZXQgcj10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGUsbz10aGlzLl91cGRhdGVUYWdzO249biE9PXZvaWQgMD9uLnRhZzpudWxsLHI9PT1udWxsfHxyLmlzRW1wdHkoKXx8KG4hPW51bGwmJm8uYWRkKG4pLGxpKHRoaXMpKSx0aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9dCx0aGlzLl9kaXJ0eVR5cGU9Mix0aGlzLl9kaXJ0eUVsZW1lbnRzLnNldCgicm9vdCIsITEpLHRoaXMuX2NvbXBvc2l0aW9uS2V5PW51bGwsbiE9bnVsbCYmby5hZGQobiksbGkodGhpcyl9cGFyc2VFZGl0b3JTdGF0ZSh0LG4pe3Q9dHlwZW9mIHQ9PSJzdHJpbmciP0pTT04ucGFyc2UodCk6dDtsZXQgcj1YZygpLG89a3QsaT1obixsPVR0LHM9dGhpcy5fZGlydHlFbGVtZW50cyxhPXRoaXMuX2RpcnR5TGVhdmVzLHU9dGhpcy5fY2xvbmVOb3ROZWVkZWQsYz10aGlzLl9kaXJ0eVR5cGU7dGhpcy5fZGlydHlFbGVtZW50cz1uZXcgTWFwLHRoaXMuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdGhpcy5fY2xvbmVOb3ROZWVkZWQ9bmV3IFNldCx0aGlzLl9kaXJ0eVR5cGU9MCxrdD1yLGhuPSExLFR0PXRoaXM7dHJ5e1lnKHQucm9vdCx0aGlzLl9ub2RlcyksbiYmbigpLHIuX3JlYWRPbmx5PSEwfWNhdGNoKGQpe2QgaW5zdGFuY2VvZiBFcnJvciYmdGhpcy5fb25FcnJvcihkKX1maW5hbGx5e3RoaXMuX2RpcnR5RWxlbWVudHM9cyx0aGlzLl9kaXJ0eUxlYXZlcz1hLHRoaXMuX2Nsb25lTm90TmVlZGVkPXUsdGhpcy5fZGlydHlUeXBlPWMsa3Q9byxobj1pLFR0PWx9cmV0dXJuIHJ9dXBkYXRlKHQsbil7a24odGhpcyx0LG4pfWZvY3VzKHQsbj17fSl7bGV0IHI9dGhpcy5fcm9vdEVsZW1lbnQ7ciE9PW51bGwmJihyLnNldEF0dHJpYnV0ZSgiYXV0b2NhcGl0YWxpemUiLCJvZmYiKSxrbih0aGlzLCgpPT57bGV0IG89S2UoKSxpPVNyKCk7byE9PW51bGw/by5kaXJ0eT0hMDppLmdldENoaWxkcmVuU2l6ZSgpIT09MCYmKG4uZGVmYXVsdFNlbGVjdGlvbj09PSJyb290U3RhcnQiP2kuc2VsZWN0U3RhcnQoKTppLnNlbGVjdEVuZCgpKX0se29uVXBkYXRlOigpPT57ci5yZW1vdmVBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiksdCYmdCgpfSx0YWc6ImZvY3VzIn0pLHRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT09PW51bGwmJnIucmVtb3ZlQXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIpKX1ibHVyKCl7dmFyIHQ9dGhpcy5fcm9vdEVsZW1lbnQ7dCE9PW51bGwmJnQuYmx1cigpLHQ9RXIodGhpcy5fd2luZG93KSx0IT09bnVsbCYmdC5yZW1vdmVBbGxSYW5nZXMoKX1pc0VkaXRhYmxlKCl7cmV0dXJuIHRoaXMuX2VkaXRhYmxlfXNldEVkaXRhYmxlKHQpe3RoaXMuX2VkaXRhYmxlIT09dCYmKHRoaXMuX2VkaXRhYmxlPXQsanMoImVkaXRhYmxlIix0aGlzLCEwLHQpKX10b0pTT04oKXtyZXR1cm57ZWRpdG9yU3RhdGU6dGhpcy5fZWRpdG9yU3RhdGUudG9KU09OKCl9fX1jbGFzcyBRZyBleHRlbmRzIFRpe2NvbnN0cnVjdG9yKHQsbil7c3VwZXIobiksdGhpcy5fX2NvbFNwYW49dCx0aGlzLl9fcm93U3Bhbj0xfWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLGNvbFNwYW46dGhpcy5fX2NvbFNwYW4scm93U3Bhbjp0aGlzLl9fcm93U3Bhbn19Z2V0Q29sU3Bhbigpe3JldHVybiB0aGlzLl9fY29sU3Bhbn1zZXRDb2xTcGFuKHQpe3JldHVybiB0aGlzLmdldFdyaXRhYmxlKCkuX19jb2xTcGFuPXQsdGhpc31nZXRSb3dTcGFuKCl7cmV0dXJuIHRoaXMuX19yb3dTcGFufXNldFJvd1NwYW4odCl7cmV0dXJuIHRoaXMuZ2V0V3JpdGFibGUoKS5fX3Jvd1NwYW49dCx0aGlzfX1mdW5jdGlvbiBBbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFFnfWNsYXNzIEl3IGV4dGVuZHMgVGl7fWZ1bmN0aW9uIEpnKGUpe3JldHVybiBlIGluc3RhbmNlb2YgSXd9Y2xhc3MgancgZXh0ZW5kcyBUaXt9ZnVuY3Rpb24geWEoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBqd31ELiRhZGRVcGRhdGVUYWc9ZnVuY3Rpb24oZSl7SnQoKSxldCgpLl91cGRhdGVUYWdzLmFkZChlKX07RC4kYXBwbHlOb2RlUmVwbGFjZW1lbnQ9RGE7RC4kY29weU5vZGU9Znc7RC4kY3JlYXRlTGluZUJyZWFrTm9kZT0kbDtELiRjcmVhdGVOb2RlU2VsZWN0aW9uPW5wO0QuJGNyZWF0ZVBhcmFncmFwaE5vZGU9aGk7RC4kY3JlYXRlUmFuZ2VTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgZT1uZXcgeXIoInJvb3QiLDAsImVsZW1lbnQiKSx0PW5ldyB5cigicm9vdCIsMCwiZWxlbWVudCIpO3JldHVybiBuZXcga2koZSx0LDAsIiIpfTtELiRjcmVhdGVUYWJOb2RlPWhkO0QuJGNyZWF0ZVRleHROb2RlPUV0O0QuJGdldEFkamFjZW50Tm9kZT1CaDtELiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlPU1hO0QuJGdldE5lYXJlc3RSb290T3JTaGFkb3dSb290PWR3O0QuJGdldE5vZGVCeUtleT0kdDtELiRnZXRQcmV2aW91c1NlbGVjdGlvbj1GbDtELiRnZXRSb290PVNyO0QuJGdldFNlbGVjdGlvbj1LZTtELiRnZXRUZXh0Q29udGVudD1mdW5jdGlvbigpe2xldCBlPUtlKCk7cmV0dXJuIGU9PT1udWxsPyIiOmUuZ2V0VGV4dENvbnRlbnQoKX07RC4kaGFzQW5jZXN0b3I9X2M7RC4kaGFzVXBkYXRlVGFnPWZ1bmN0aW9uKGUpe3JldHVybiBldCgpLl91cGRhdGVUYWdzLmhhcyhlKX07RC4kaW5zZXJ0Tm9kZXM9ZnVuY3Rpb24oZSx0KXtsZXQgbj1LZSgpfHxGbCgpO3JldHVybiBuPT09bnVsbCYmKG49U3IoKS5zZWxlY3RFbmQoKSksbi5pbnNlcnROb2RlcyhlLHQpfTtELiRpc0Jsb2NrRWxlbWVudE5vZGU9dHA7RC4kaXNEZWNvcmF0b3JOb2RlPVZlO0QuJGlzRWxlbWVudE5vZGU9QjtELiRpc0lubGluZUVsZW1lbnRPckRlY29yYXRvck5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIEIoZSkmJmUuaXNJbmxpbmUoKXx8VmUoZSkmJmUuaXNJbmxpbmUoKX07RC4kaXNMZWFmTm9kZT1vdztELiRpc0xpbmVCcmVha05vZGU9bWE7RC4kaXNOb2RlU2VsZWN0aW9uPXpsO0QuJGlzUGFyYWdyYXBoTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFVsfTtELiRpc1JhbmdlU2VsZWN0aW9uPWRlO0QuJGlzUm9vdE5vZGU9cXQ7RC4kaXNSb290T3JTaGFkb3dSb290PUpuO0QuJGlzVGFiTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGpsfTtELiRpc1RleHROb2RlPVE7RC4kbm9kZXNPZlR5cGU9ZnVuY3Rpb24oZSl7dmFyIHQ9Q3IoKTtsZXQgbj10Ll9yZWFkT25seSxyPWUuZ2V0VHlwZSgpO3Q9dC5fbm9kZU1hcDtsZXQgbz1bXTtmb3IobGV0WyxpXW9mIHQpaSBpbnN0YW5jZW9mIGUmJmkuX190eXBlPT09ciYmKG58fGkuaXNBdHRhY2hlZCgpKSYmby5wdXNoKGkpO3JldHVybiBvfTtELiRub3JtYWxpemVTZWxlY3Rpb25fX0VYUEVSSU1FTlRBTD1qZztELiRwYXJzZVNlcmlhbGl6ZWROb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBZZyhlLGV0KCkuX25vZGVzKX07RC4kc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dmFyIGU9U3IoKTtlPWUuc2VsZWN0KDAsZS5nZXRDaGlsZHJlblNpemUoKSksdnIoamcoZSkpfTtELiRzZXRDb21wb3NpdGlvbktleT1NdDtELiRzZXRTZWxlY3Rpb249dnI7RC4kc3BsaXROb2RlPWh3O0QuQkxVUl9DT01NQU5EPUpfO0QuQ0FOX1JFRE9fQ09NTUFORD17fTtELkNBTl9VTkRPX0NPTU1BTkQ9e307RC5DTEVBUl9FRElUT1JfQ09NTUFORD17fTtELkNMRUFSX0hJU1RPUllfQ09NTUFORD17fTtELkNMSUNLX0NPTU1BTkQ9QV87RC5DT01NQU5EX1BSSU9SSVRZX0NSSVRJQ0FMPTQ7RC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUj0wO0QuQ09NTUFORF9QUklPUklUWV9ISUdIPTM7RC5DT01NQU5EX1BSSU9SSVRZX0xPVz0xO0QuQ09NTUFORF9QUklPUklUWV9OT1JNQUw9MjtELkNPTlRST0xMRURfVEVYVF9JTlNFUlRJT05fQ09NTUFORD1jbDtELkNPUFlfQ09NTUFORD1BZztELkNVVF9DT01NQU5EPU1nO0QuREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5EPWNhO0QuREVMRVRFX0xJTkVfQ09NTUFORD1mYTtELkRFTEVURV9XT1JEX0NPTU1BTkQ9ZGE7RC5ERVBSRUNBVEVEXyRjb21wdXRlR3JpZE1hcD1QdztELkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgZT1uZXcgeXIoInJvb3QiLDAsImVsZW1lbnQiKSx0PW5ldyB5cigicm9vdCIsMCwiZWxlbWVudCIpO3JldHVybiBuZXcgZ2QoInJvb3QiLGUsdCl9O0QuREVQUkVDQVRFRF8kZ2V0R3JpZENlbGxOb2RlUmVjdD1lcDtELkRFUFJFQ0FURURfJGdldE5vZGVUcmlwbGV0PU93O0QuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGU9QW47RC5ERVBSRUNBVEVEXyRpc0dyaWROb2RlPUpnO0QuREVQUkVDQVRFRF8kaXNHcmlkUm93Tm9kZT15YTtELkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbj1LZztELkRFUFJFQ0FURURfR3JpZENlbGxOb2RlPVFnO0QuREVQUkVDQVRFRF9HcmlkTm9kZT1JdztELkRFUFJFQ0FURURfR3JpZFJvd05vZGU9anc7RC5EUkFHRU5EX0NPTU1BTkQ9WF87RC5EUkFHT1ZFUl9DT01NQU5EPVlfO0QuRFJBR1NUQVJUX0NPTU1BTkQ9R187RC5EUk9QX0NPTU1BTkQ9S187RC5EZWNvcmF0b3JOb2RlPU13O0QuRWxlbWVudE5vZGU9VGk7RC5GT0NVU19DT01NQU5EPVFfO0QuRk9STUFUX0VMRU1FTlRfQ09NTUFORD17fTtELkZPUk1BVF9URVhUX0NPTU1BTkQ9Z287RC5JTkRFTlRfQ09OVEVOVF9DT01NQU5EPXt9O0QuSU5TRVJUX0xJTkVfQlJFQUtfQ09NTUFORD1NcztELklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORD1MaDtELklOU0VSVF9UQUJfQ09NTUFORD17fTtELktFWV9BUlJPV19ET1dOX0NPTU1BTkQ9Rl87RC5LRVlfQVJST1dfTEVGVF9DT01NQU5EPUlfO0QuS0VZX0FSUk9XX1JJR0hUX0NPTU1BTkQ9RF87RC5LRVlfQVJST1dfVVBfQ09NTUFORD16XztELktFWV9CQUNLU1BBQ0VfQ09NTUFORD1XXztELktFWV9ERUxFVEVfQ09NTUFORD1WXztELktFWV9ET1dOX0NPTU1BTkQ9TV87RC5LRVlfRU5URVJfQ09NTUFORD1wYztELktFWV9FU0NBUEVfQ09NTUFORD1VXztELktFWV9NT0RJRklFUl9DT01NQU5EPVpfO0QuS0VZX1NQQUNFX0NPTU1BTkQ9Ql87RC5LRVlfVEFCX0NPTU1BTkQ9SF87RC5MaW5lQnJlYWtOb2RlPUlsO0QuTU9WRV9UT19FTkQ9TF87RC5NT1ZFX1RPX1NUQVJUPWpfO0QuT1VUREVOVF9DT05URU5UX0NPTU1BTkQ9e307RC5QQVNURV9DT01NQU5EPVJnO0QuUGFyYWdyYXBoTm9kZT1VbDtELlJFRE9fQ09NTUFORD1PZztELlJFTU9WRV9URVhUX0NPTU1BTkQ9SWg7RC5Sb290Tm9kZT1XbDtELlNFTEVDVElPTl9DSEFOR0VfQ09NTUFORD1sZDtELlNFTEVDVF9BTExfQ09NTUFORD1qaDtELlRhYk5vZGU9amw7RC5UZXh0Tm9kZT0kaTtELlVORE9fQ09NTUFORD1QZztELmNyZWF0ZUNvbW1hbmQ9ZnVuY3Rpb24oKXtyZXR1cm57fX07RC5jcmVhdGVFZGl0b3I9ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e30sbj1UdCxyPXQudGhlbWV8fHt9O2xldCBvPWU9PT12b2lkIDA/bjp0LnBhcmVudEVkaXRvcnx8bnVsbCxpPXQuZGlzYWJsZUV2ZW50c3x8ITEsbD1YZygpLHM9dC5uYW1lc3BhY2V8fChvIT09bnVsbD9vLl9jb25maWcubmFtZXNwYWNlOnV3KCkpLGE9dC5lZGl0b3JTdGF0ZSx1PVtXbCwkaSxJbCxqbCxVbCwuLi50Lm5vZGVzfHxbXV0sYz10Lm9uRXJyb3I7aWYodD10LmVkaXRhYmxlIT09dm9pZCAwP3QuZWRpdGFibGU6ITAsZT09PXZvaWQgMCYmbiE9PW51bGwpZT1uLl9ub2RlcztlbHNlIGZvcihlPW5ldyBNYXAsbj0wO248dS5sZW5ndGg7bisrKXtsZXQgZj11W25dLGg9bnVsbDt2YXIgZD1udWxsO3R5cGVvZiBmIT0iZnVuY3Rpb24iJiYoZD1mLGY9ZC5yZXBsYWNlLGg9ZC53aXRoLGQ9ZC53aXRoS2xhc3M/ZC53aXRoS2xhc3M6bnVsbCk7bGV0IGc9Zi5nZXRUeXBlKCksbT1mLnRyYW5zZm9ybSgpLFM9bmV3IFNldDttIT09bnVsbCYmUy5hZGQobSksZS5zZXQoZyx7a2xhc3M6ZixyZXBsYWNlOmgscmVwbGFjZVdpdGhLbGFzczpkLHRyYW5zZm9ybXM6U30pfXJldHVybiByPW5ldyBCYihsLG8sZSx7ZGlzYWJsZUV2ZW50czppLG5hbWVzcGFjZTpzLHRoZW1lOnJ9LGN8fGNvbnNvbGUuZXJyb3IsRmIoZSksdCksYSE9PXZvaWQgMCYmKHIuX3BlbmRpbmdFZGl0b3JTdGF0ZT1hLHIuX2RpcnR5VHlwZT0yKSxyfTtELmdldE5lYXJlc3RFZGl0b3JGcm9tRE9NTm9kZT1GZztELmlzSFRNTEFuY2hvckVsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGRkKGUpJiZlLnRhZ05hbWU9PT0iQSJ9O0QuaXNIVE1MRWxlbWVudD1kZDtELmlzU2VsZWN0aW9uQ2FwdHVyZWRJbkRlY29yYXRvcklucHV0PXpnO0QuaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3I9QWE7Y29uc3QgV2I9RDt2YXIgZ2U9V2IsZHQ9e30sUnQ9e30sbmU9Z2U7bGV0ICRjPW5ldyBNYXA7ZnVuY3Rpb24ga3koZSl7Zm9yKDtlIT1udWxsOyl7aWYoZS5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXJldHVybiBlO2U9ZS5maXJzdENoaWxkfXJldHVybiBudWxsfWZ1bmN0aW9uIFR5KGUpe2xldCB0PWUucGFyZW50Tm9kZTtpZih0PT1udWxsKXRocm93IEVycm9yKCJTaG91bGQgbmV2ZXIgaGFwcGVuIik7cmV0dXJuW3QsQXJyYXkuZnJvbSh0LmNoaWxkTm9kZXMpLmluZGV4T2YoZSldfWZ1bmN0aW9uIHp3KGUpe2xldCB0PXt9O2U9ZS5zcGxpdCgiOyIpO2ZvcihsZXQgbiBvZiBlKWlmKG4hPT0iIil7bGV0W3Isb109bi5zcGxpdCgvOihbXl0rKS8pO3Rbci50cmltKCldPW8udHJpbSgpfXJldHVybiB0fWZ1bmN0aW9uIGtjKGUpe2xldCB0PSRjLmdldChlKTtyZXR1cm4gdD09PXZvaWQgMCYmKHQ9encoZSksJGMuc2V0KGUsdCkpLHR9ZnVuY3Rpb24gVWIoZSl7bGV0IHQ9IiI7Zm9yKGxldCBuIGluIGUpbiYmKHQrPWAke259OiAke2Vbbl19O2ApO3JldHVybiB0fWZ1bmN0aW9uIE9pKGUsdCl7dmFyIG49a2MoImdldFN0eWxlImluIGU/ZS5nZXRTdHlsZSgpOmUuc3R5bGUpO3Q9T2JqZWN0LmVudHJpZXModCkucmVkdWNlKChyLFtvLGldKT0+KGk9PT1udWxsP2RlbGV0ZSByW29dOnJbb109aSxyKSx7Li4ubn0pLG49VWIodCksZS5zZXRTdHlsZShuKSwkYy5zZXQobix0KX1mdW5jdGlvbiBGdyhlLHQpe3ZhciBuPWUuZ2V0Tm9kZXMoKSxyPW4ubGVuZ3RoO2lmKG5lLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihlKSl7Zm9yKHZhciBvPW5lLiRjcmVhdGVSYW5nZVNlbGVjdGlvbigpLGk9by5hbmNob3IsbD1vLmZvY3VzLHM9MDtzPHI7cysrKXt2YXIgYT1uW3NdO25lLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGEpJiYoaS5zZXQoYS5nZXRLZXkoKSwwLCJlbGVtZW50IiksbC5zZXQoYS5nZXRLZXkoKSxhLmdldENoaWxkcmVuU2l6ZSgpLCJlbGVtZW50IiksRncobmUuJG5vcm1hbGl6ZVNlbGVjdGlvbl9fRVhQRVJJTUVOVEFMKG8pLHQpKX1uZS4kc2V0U2VsZWN0aW9uKGUpfWVsc2UgaWYoLS1yLG89blswXSxpPW5bcl0sZS5pc0NvbGxhcHNlZCgpKU9pKGUsdCk7ZWxzZXt2YXIgdT1lLmFuY2hvcixjPWUuZm9jdXM7cz1vLmdldFRleHRDb250ZW50KCkubGVuZ3RoLGE9Yy5vZmZzZXQ7dmFyIGQ9dS5vZmZzZXQsZj11LmlzQmVmb3JlKGMpO2w9Zj9kOmEsZT1mP2E6ZDt2YXIgaD1mP3UudHlwZTpjLnR5cGUsZz1mP2MudHlwZTp1LnR5cGU7aWYodT1mP2Mua2V5OnUua2V5LG5lLiRpc1RleHROb2RlKG8pJiZsPT09cyYmKGM9by5nZXROZXh0U2libGluZygpLG5lLiRpc1RleHROb2RlKGMpJiYobD1kPTAsbz1jKSksbi5sZW5ndGg9PT0xKW5lLiRpc1RleHROb2RlKG8pJiYobD1oPT09ImVsZW1lbnQiPzA6ZD5hP2E6ZCxlPWc9PT0iZWxlbWVudCI/czpkPmE/ZDphLGwhPT1lJiYobD09PTAmJmU9PT1zPyhPaShvLHQpLG8uc2VsZWN0KGwsZSkpOihuPW8uc3BsaXRUZXh0KGwsZSksbj1sPT09MD9uWzBdOm5bMV0sT2kobix0KSxuLnNlbGVjdCgwLGUtbCkpKSk7ZWxzZSBmb3IobmUuJGlzVGV4dE5vZGUobykmJmw8by5nZXRUZXh0Q29udGVudFNpemUoKSYmKGwhPT0wJiYobz1vLnNwbGl0VGV4dChsKVsxXSksT2kobyx0KSksbmUuJGlzVGV4dE5vZGUoaSkmJihsPWkuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgsaS5fX2tleSE9PXUmJmUhPT0wJiYoZT1sKSxlIT09bCYmKFtpXT1pLnNwbGl0VGV4dChlKSksZSE9PTAmJk9pKGksdCkpLGU9MTtlPHI7ZSsrKWw9bltlXSxzPWwuZ2V0S2V5KCksbmUuJGlzVGV4dE5vZGUobCkmJnMhPT1vLmdldEtleSgpJiZzIT09aS5nZXRLZXkoKSYmIWwuaXNUb2tlbigpJiZPaShsLHQpfX1mdW5jdGlvbiBWYihlKXtmb3IoO2UhPT1udWxsJiYhbmUuJGlzUm9vdE9yU2hhZG93Um9vdChlKTspe2xldCB0PWUuZ2V0TGF0ZXN0KCksbj1lLmdldFBhcmVudCgpO3QuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZlLnJlbW92ZSghMCksZT1ufX1mdW5jdGlvbiBTZihlLHQsbixyLG89bnVsbCl7aWYodC5sZW5ndGghPT0wKXt2YXIgaT10WzBdLGw9bmV3IE1hcCxzPVtdO2k9bmUuJGlzRWxlbWVudE5vZGUoaSk/aTppLmdldFBhcmVudE9yVGhyb3coKSxpLmlzSW5saW5lKCkmJihpPWkuZ2V0UGFyZW50T3JUaHJvdygpKTtmb3IodmFyIGE9ITE7aSE9PW51bGw7KXt2YXIgdT1pLmdldFByZXZpb3VzU2libGluZygpO2lmKHUhPT1udWxsKXtpPXUsYT0hMDticmVha31pZihpPWkuZ2V0UGFyZW50T3JUaHJvdygpLG5lLiRpc1Jvb3RPclNoYWRvd1Jvb3QoaSkpYnJlYWt9dT1uZXcgU2V0O2Zvcih2YXIgYz0wO2M8bjtjKyspe3ZhciBkPXRbY107bmUuJGlzRWxlbWVudE5vZGUoZCkmJmQuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZ1LmFkZChkLmdldEtleSgpKX12YXIgZj1uZXcgU2V0O2ZvcihjPTA7YzxuO2MrKyl7ZD10W2NdO3ZhciBoPWQuZ2V0UGFyZW50KCk7aWYoaCE9PW51bGwmJmguaXNJbmxpbmUoKSYmKGg9aC5nZXRQYXJlbnQoKSksaCE9PW51bGwmJm5lLiRpc0xlYWZOb2RlKGQpJiYhZi5oYXMoZC5nZXRLZXkoKSkpe2lmKGQ9aC5nZXRLZXkoKSxsLmdldChkKT09PXZvaWQgMCl7bGV0IGc9cigpO2cuc2V0Rm9ybWF0KGguZ2V0Rm9ybWF0VHlwZSgpKSxnLnNldEluZGVudChoLmdldEluZGVudCgpKSxzLnB1c2goZyksbC5zZXQoZCxnKSxoLmdldENoaWxkcmVuKCkuZm9yRWFjaChtPT57Zy5hcHBlbmQobSksZi5hZGQobS5nZXRLZXkoKSksbmUuJGlzRWxlbWVudE5vZGUobSkmJm0uZ2V0Q2hpbGRyZW5LZXlzKCkuZm9yRWFjaChTPT5mLmFkZChTKSl9KSxWYihoKX19ZWxzZSB1LmhhcyhkLmdldEtleSgpKSYmKGg9cigpLGguc2V0Rm9ybWF0KGQuZ2V0Rm9ybWF0VHlwZSgpKSxoLnNldEluZGVudChkLmdldEluZGVudCgpKSxzLnB1c2goaCksZC5yZW1vdmUoITApKX1pZihvIT09bnVsbClmb3IodD0wO3Q8cy5sZW5ndGg7dCsrKW8uYXBwZW5kKHNbdF0pO2lmKHQ9bnVsbCxuZS4kaXNSb290T3JTaGFkb3dSb290KGkpKWlmKGEpaWYobyE9PW51bGwpaS5pbnNlcnRBZnRlcihvKTtlbHNlIGZvcihvPXMubGVuZ3RoLTE7MDw9bztvLS0paS5pbnNlcnRBZnRlcihzW29dKTtlbHNlIGlmKGE9aS5nZXRGaXJzdENoaWxkKCksbmUuJGlzRWxlbWVudE5vZGUoYSkmJihpPWEpLGE9PT1udWxsKWlmKG8paS5hcHBlbmQobyk7ZWxzZSBmb3Iobz0wO288cy5sZW5ndGg7bysrKWE9c1tvXSxpLmFwcGVuZChhKSx0PWE7ZWxzZSBpZihvIT09bnVsbClhLmluc2VydEJlZm9yZShvKTtlbHNlIGZvcihpPTA7aTxzLmxlbmd0aDtpKyspbz1zW2ldLGEuaW5zZXJ0QmVmb3JlKG8pLHQ9bztlbHNlIGlmKG8paS5pbnNlcnRBZnRlcihvKTtlbHNlIGZvcihvPXMubGVuZ3RoLTE7MDw9bztvLS0pYT1zW29dLGkuaW5zZXJ0QWZ0ZXIoYSksdD1hO3M9bmUuJGdldFByZXZpb3VzU2VsZWN0aW9uKCksbmUuJGlzUmFuZ2VTZWxlY3Rpb24ocykmJnMuYW5jaG9yLmdldE5vZGUoKS5pc0F0dGFjaGVkKCkmJnMuZm9jdXMuZ2V0Tm9kZSgpLmlzQXR0YWNoZWQoKT9uZS4kc2V0U2VsZWN0aW9uKHMuY2xvbmUoKSk6dCE9PW51bGw/dC5zZWxlY3RFbmQoKTplLmRpcnR5PSEwfX1mdW5jdGlvbiBCdyhlLHQsbixyKXtlLm1vZGlmeSh0PyJleHRlbmQiOiJtb3ZlIixuLHIpfWZ1bmN0aW9uIFd3KGUpe3JldHVybiBlPWUuYW5jaG9yLmdldE5vZGUoKSwobmUuJGlzUm9vdE5vZGUoZSk/ZTplLmdldFBhcmVudE9yVGhyb3coKSkuZ2V0RGlyZWN0aW9uKCk9PT0icnRsIn1SdC4kYWRkTm9kZVN0eWxlPWZ1bmN0aW9uKGUpe2U9ZS5nZXRTdHlsZSgpO2xldCB0PXp3KGUpOyRjLnNldChlLHQpfTtSdC4kY2xvbmVXaXRoUHJvcGVydGllcz1mdW5jdGlvbihlKXtsZXQgdD1lLmNvbnN0cnVjdG9yLmNsb25lKGUpO3JldHVybiB0Ll9fcGFyZW50PWUuX19wYXJlbnQsdC5fX25leHQ9ZS5fX25leHQsdC5fX3ByZXY9ZS5fX3ByZXYsbmUuJGlzRWxlbWVudE5vZGUoZSkmJm5lLiRpc0VsZW1lbnROb2RlKHQpPyh0Ll9fZmlyc3Q9ZS5fX2ZpcnN0LHQuX19sYXN0PWUuX19sYXN0LHQuX19zaXplPWUuX19zaXplLHQuX19mb3JtYXQ9ZS5fX2Zvcm1hdCx0Ll9faW5kZW50PWUuX19pbmRlbnQsdC5fX2Rpcj1lLl9fZGlyLHQpOihuZS4kaXNUZXh0Tm9kZShlKSYmbmUuJGlzVGV4dE5vZGUodCkmJih0Ll9fZm9ybWF0PWUuX19mb3JtYXQsdC5fX3N0eWxlPWUuX19zdHlsZSx0Ll9fbW9kZT1lLl9fbW9kZSx0Ll9fZGV0YWlsPWUuX19kZXRhaWwpLHQpfTtSdC4kZ2V0U2VsZWN0aW9uU3R5bGVWYWx1ZUZvclByb3BlcnR5PWZ1bmN0aW9uKGUsdCxuPSIiKXtsZXQgcj1udWxsLG89ZS5nZXROb2RlcygpO3ZhciBpPWUuYW5jaG9yLGw9ZS5mb2N1cyxzPWUuaXNCYWNrd2FyZCgpO2xldCBhPXM/bC5vZmZzZXQ6aS5vZmZzZXQ7aWYoaT1zP2wuZ2V0Tm9kZSgpOmkuZ2V0Tm9kZSgpLGUuc3R5bGUhPT0iIiYmKGU9a2MoZS5zdHlsZSksZSE9PW51bGwmJnQgaW4gZSkpcmV0dXJuIGVbdF07Zm9yKGU9MDtlPG8ubGVuZ3RoO2UrKyl7dmFyIHU9b1tlXTtpZigoZT09PTB8fGEhPT0wfHwhdS5pcyhpKSkmJm5lLiRpc1RleHROb2RlKHUpKXtpZihsPXQscz1uLHU9dS5nZXRTdHlsZSgpLHU9a2ModSksbD11IT09bnVsbCYmdVtsXXx8cyxyPT09bnVsbClyPWw7ZWxzZSBpZihyIT09bCl7cj0iIjticmVha319fXJldHVybiByPT09bnVsbD9uOnJ9O1J0LiRpc0F0Tm9kZUVuZD1mdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09InRleHQiP2Uub2Zmc2V0PT09ZS5nZXROb2RlKCkuZ2V0VGV4dENvbnRlbnRTaXplKCk6ZS5vZmZzZXQ9PT1lLmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKX07UnQuJGlzUGFyZW50RWxlbWVudFJUTD1XdztSdC4kbW92ZUNhcmV0U2VsZWN0aW9uPUJ3O1J0LiRtb3ZlQ2hhcmFjdGVyPWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj1XdyhlKTtCdyhlLHQsbj8hcjpyLCJjaGFyYWN0ZXIiKX07UnQuJHBhdGNoU3R5bGVUZXh0PUZ3O1J0LiRzZWxlY3RBbGw9ZnVuY3Rpb24oZSl7bGV0IHQ9ZS5hbmNob3I7ZT1lLmZvY3VzO3ZhciBuPXQuZ2V0Tm9kZSgpLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5nZXRQYXJlbnRPclRocm93KCk7bGV0IHI9bi5nZXRGaXJzdERlc2NlbmRhbnQoKTtuPW4uZ2V0TGFzdERlc2NlbmRhbnQoKTtsZXQgbz0iZWxlbWVudCIsaT0iZWxlbWVudCIsbD0wO25lLiRpc1RleHROb2RlKHIpP289InRleHQiOm5lLiRpc0VsZW1lbnROb2RlKHIpfHxyPT09bnVsbHx8KHI9ci5nZXRQYXJlbnRPclRocm93KCkpLG5lLiRpc1RleHROb2RlKG4pPyhpPSJ0ZXh0IixsPW4uZ2V0VGV4dENvbnRlbnRTaXplKCkpOm5lLiRpc0VsZW1lbnROb2RlKG4pfHxuPT09bnVsbHx8KG49bi5nZXRQYXJlbnRPclRocm93KCkpLHImJm4mJih0LnNldChyLmdldEtleSgpLDAsbyksZS5zZXQobi5nZXRLZXkoKSxsLGkpKX07UnQuJHNldEJsb2Nrc1R5cGU9ZnVuY3Rpb24oZSx0KXtpZihlLmFuY2hvci5rZXk9PT0icm9vdCIpe3Q9dCgpO3ZhciBuPW5lLiRnZXRSb290KCk7KGU9bi5nZXRGaXJzdENoaWxkKCkpP2UucmVwbGFjZSh0LCEwKTpuLmFwcGVuZCh0KX1lbHNlIGZvcihuPWUuZ2V0Tm9kZXMoKSxlPWUuYW5jaG9yLmdldE5vZGUoKS5nZXRQYXJlbnRPclRocm93KCksbi5pbmRleE9mKGUpPT09LTEmJm4ucHVzaChlKSxlLmlzSW5saW5lKCkmJihlPWUuZ2V0UGFyZW50T3JUaHJvdygpLG4uaW5kZXhPZihlKT09PS0xJiZuLnB1c2goZSkpLGU9MDtlPG4ubGVuZ3RoO2UrKyl7bGV0IGk9bltlXTt2YXIgcj1pO2lmKCFuZS4kaXNFbGVtZW50Tm9kZShyKXx8bmUuJGlzUm9vdE9yU2hhZG93Um9vdChyKSlyPSExO2Vsc2V7dmFyIG89ci5nZXRGaXJzdENoaWxkKCk7bz1vPT09bnVsbHx8bmUuJGlzTGluZUJyZWFrTm9kZShvKXx8bmUuJGlzVGV4dE5vZGUobyl8fG8uaXNJbmxpbmUoKSxyPSFyLmlzSW5saW5lKCkmJnIuY2FuQmVFbXB0eSgpIT09ITEmJm99ciYmKHI9dCgpLHIuc2V0Rm9ybWF0KGkuZ2V0Rm9ybWF0VHlwZSgpKSxyLnNldEluZGVudChpLmdldEluZGVudCgpKSxpLnJlcGxhY2UociwhMCkpfX07UnQuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbj1mdW5jdGlvbihlLHQpe3JldHVybiBlPW5lLiRnZXRBZGphY2VudE5vZGUoZS5mb2N1cyx0KSxuZS4kaXNEZWNvcmF0b3JOb2RlKGUpJiYhZS5pc0lzb2xhdGVkKCl8fG5lLiRpc0VsZW1lbnROb2RlKGUpJiYhZS5pc0lubGluZSgpJiYhZS5jYW5CZUVtcHR5KCl9O1J0LiRzbGljZVNlbGVjdGVkVGV4dE5vZGVDb250ZW50PWZ1bmN0aW9uKGUsdCl7aWYodC5pc1NlbGVjdGVkKCkmJiF0LmlzU2VnbWVudGVkKCkmJiF0LmlzVG9rZW4oKSYmKG5lLiRpc1JhbmdlU2VsZWN0aW9uKGUpfHxuZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24oZSkpKXt2YXIgbj1lLmFuY2hvci5nZXROb2RlKCkscj1lLmZvY3VzLmdldE5vZGUoKSxvPXQuaXMobiksaT10LmlzKHIpO2lmKG98fGkpe289ZS5pc0JhY2t3YXJkKCk7bGV0W2wsc109ZS5nZXRDaGFyYWN0ZXJPZmZzZXRzKCk7ZT1uLmlzKHIpLGk9dC5pcyhvP3I6bikscj10LmlzKG8/bjpyKSxuPTA7bGV0IGE7ZT8obj1sPnM/czpsLGE9bD5zP2w6cyk6aT8obj1vP3M6bCxhPXZvaWQgMCk6ciYmKG89bz9sOnMsbj0wLGE9byksdC5fX3RleHQ9dC5fX3RleHQuc2xpY2UobixhKX19cmV0dXJuIHR9O1J0LiR3cmFwTm9kZXM9ZnVuY3Rpb24oZSx0LG49bnVsbCl7dmFyIHI9ZS5nZXROb2RlcygpO2xldCBvPXIubGVuZ3RoO3ZhciBpPWUuYW5jaG9yO2lmKG89PT0wfHxvPT09MSYmaS50eXBlPT09ImVsZW1lbnQiJiZpLmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKT09PTApe2U9aS50eXBlPT09InRleHQiP2kuZ2V0Tm9kZSgpLmdldFBhcmVudE9yVGhyb3coKTppLmdldE5vZGUoKSxyPWUuZ2V0Q2hpbGRyZW4oKTtsZXQgcz10KCk7cy5zZXRGb3JtYXQoZS5nZXRGb3JtYXRUeXBlKCkpLHMuc2V0SW5kZW50KGUuZ2V0SW5kZW50KCkpLHIuZm9yRWFjaChhPT5zLmFwcGVuZChhKSksbiYmKHM9bi5hcHBlbmQocykpLGUucmVwbGFjZShzKX1lbHNle2k9bnVsbDt2YXIgbD1bXTtmb3IobGV0IHM9MDtzPG87cysrKXtsZXQgYT1yW3NdO25lLiRpc1Jvb3RPclNoYWRvd1Jvb3QoYSk/KFNmKGUsbCxsLmxlbmd0aCx0LG4pLGw9W10saT1hKTppPT09bnVsbHx8aSE9PW51bGwmJm5lLiRoYXNBbmNlc3RvcihhLGkpP2wucHVzaChhKTooU2YoZSxsLGwubGVuZ3RoLHQsbiksbD1bYV0pfVNmKGUsbCxsLmxlbmd0aCx0LG4pfX07UnQuY3JlYXRlRE9NUmFuZ2U9ZnVuY3Rpb24oZSx0LG4scixvKXtsZXQgaT10LmdldEtleSgpLGw9ci5nZXRLZXkoKSxzPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCksYT1lLmdldEVsZW1lbnRCeUtleShpKTtpZihlPWUuZ2V0RWxlbWVudEJ5S2V5KGwpLG5lLiRpc1RleHROb2RlKHQpJiYoYT1reShhKSksbmUuJGlzVGV4dE5vZGUocikmJihlPWt5KGUpKSx0PT09dm9pZCAwfHxyPT09dm9pZCAwfHxhPT09bnVsbHx8ZT09PW51bGwpcmV0dXJuIG51bGw7YS5ub2RlTmFtZT09PSJCUiImJihbYSxuXT1UeShhKSksZS5ub2RlTmFtZT09PSJCUiImJihbZSxvXT1UeShlKSksdD1hLmZpcnN0Q2hpbGQsYT09PWUmJnQhPW51bGwmJnQubm9kZU5hbWU9PT0iQlIiJiZuPT09MCYmbz09PTAmJihvPTEpO3RyeXtzLnNldFN0YXJ0KGEsbikscy5zZXRFbmQoZSxvKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4hcy5jb2xsYXBzZWR8fG49PT1vJiZpPT09bHx8KHMuc2V0U3RhcnQoZSxvKSxzLnNldEVuZChhLG4pKSxzfTtSdC5jcmVhdGVSZWN0c0Zyb21ET01SYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0Um9vdEVsZW1lbnQoKTtpZihuPT09bnVsbClyZXR1cm5bXTtlPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1nZXRDb21wdXRlZFN0eWxlKG4pLG49cGFyc2VGbG9hdChuLnBhZGRpbmdMZWZ0KStwYXJzZUZsb2F0KG4ucGFkZGluZ1JpZ2h0KSx0PUFycmF5LmZyb20odC5nZXRDbGllbnRSZWN0cygpKTtsZXQgcj10Lmxlbmd0aDt0LnNvcnQoKGksbCk9PntsZXQgcz1pLnRvcC1sLnRvcDtyZXR1cm4gMz49TWF0aC5hYnMocyk/aS5sZWZ0LWwubGVmdDpzfSk7bGV0IG87Zm9yKGxldCBpPTA7aTxyO2krKyl7bGV0IGw9dFtpXSxzPWwud2lkdGgrbj09PWUud2lkdGg7byYmby50b3A8PWwudG9wJiZvLnRvcCtvLmhlaWdodD5sLnRvcCYmby5sZWZ0K28ud2lkdGg+bC5sZWZ0fHxzPyh0LnNwbGljZShpLS0sMSksci0tKTpvPWx9cmV0dXJuIHR9O1J0LmdldFN0eWxlT2JqZWN0RnJvbUNTUz1rYztSdC50cmltVGV4dENvbnRlbnRGcm9tQW5jaG9yPWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj10LmdldE5vZGUoKTtpZihuZS4kaXNFbGVtZW50Tm9kZShyKSl7dmFyIG89ci5nZXREZXNjZW5kYW50QnlJbmRleCh0Lm9mZnNldCk7byE9PW51bGwmJihyPW8pfWZvcig7MDxuJiZyIT09bnVsbDspe3ZhciBpPXIuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD0wO2lmKGk9PT1udWxsKXtvPXIuZ2V0UGFyZW50T3JUaHJvdygpO2Zvcih2YXIgcz1vLmdldFByZXZpb3VzU2libGluZygpO3M9PT1udWxsOyl7aWYobz1vLmdldFBhcmVudCgpLG89PT1udWxsKXtpPW51bGw7YnJlYWt9cz1vLmdldFByZXZpb3VzU2libGluZygpfW8hPT1udWxsJiYobD1vLmlzSW5saW5lKCk/MDoyLGk9bmUuJGlzRWxlbWVudE5vZGUocyk/cy5nZXRMYXN0RGVzY2VuZGFudCgpOnMpfWlmKHM9ci5nZXRUZXh0Q29udGVudCgpLHM9PT0iIiYmbmUuJGlzRWxlbWVudE5vZGUocikmJiFyLmlzSW5saW5lKCkmJihzPWAKCmApLG89cy5sZW5ndGgsIW5lLiRpc1RleHROb2RlKHIpfHxuPj1vKXM9ci5nZXRQYXJlbnQoKSxyLnJlbW92ZSgpLHM9PW51bGx8fHMuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wfHxuZS4kaXNSb290Tm9kZShzKXx8cy5yZW1vdmUoKSxuLT1vK2wscj1pO2Vsc2V7bGV0IGE9ci5nZXRLZXkoKTtsPWUuZ2V0RWRpdG9yU3RhdGUoKS5yZWFkKCgpPT57Y29uc3QgYz1uZS4kZ2V0Tm9kZUJ5S2V5KGEpO3JldHVybiBuZS4kaXNUZXh0Tm9kZShjKSYmYy5pc1NpbXBsZVRleHQoKT9jLmdldFRleHRDb250ZW50KCk6bnVsbH0pLGk9by1uO2xldCB1PXMuc2xpY2UoMCxpKTtsIT09bnVsbCYmbCE9PXM/KG49bmUuJGdldFByZXZpb3VzU2VsZWN0aW9uKCksbz1yLHIuaXNTaW1wbGVUZXh0KCk/ci5zZXRUZXh0Q29udGVudChsKToobz1uZS4kY3JlYXRlVGV4dE5vZGUobCksci5yZXBsYWNlKG8pKSxuZS4kaXNSYW5nZVNlbGVjdGlvbihuKSYmbi5pc0NvbGxhcHNlZCgpJiYobj1uLmFuY2hvci5vZmZzZXQsby5zZWxlY3QobixuKSkpOnIuaXNTaW1wbGVUZXh0KCk/KGw9dC5rZXk9PT1hLHM9dC5vZmZzZXQsczxuJiYocz1vKSxuPWw/cy1uOjAsbz1sP3M6aSxsJiZuPT09MD8oW25dPXIuc3BsaXRUZXh0KG4sbyksbi5yZW1vdmUoKSk6KFssbl09ci5zcGxpdFRleHQobixvKSxuLnJlbW92ZSgpKSk6KG49bmUuJGNyZWF0ZVRleHROb2RlKHUpLHIucmVwbGFjZShuKSksbj0wfX19O2NvbnN0IEhiPVJ0O3ZhciBPbz1IYixLYj1PbyxhdD1nZTtmdW5jdGlvbiBHYihlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3QuYXBwZW5kKCJjb2RlIixlKTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9ZnVuY3Rpb24gVXcoZSx0KXtmb3IobGV0IG4gb2YgdClpZihlLnR5cGUuc3RhcnRzV2l0aChuKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBWdyhlLHQpe2Zvcig7ZSE9PWF0LiRnZXRSb290KCkmJmUhPW51bGw7KXtpZih0KGUpKXJldHVybiBlO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4gbnVsbH1kdC4kc3BsaXROb2RlPWF0LiRzcGxpdE5vZGU7ZHQuaXNIVE1MQW5jaG9yRWxlbWVudD1hdC5pc0hUTUxBbmNob3JFbGVtZW50O2R0LmlzSFRNTEVsZW1lbnQ9YXQuaXNIVE1MRWxlbWVudDtkdC4kZGZzPWZ1bmN0aW9uKGUsdCl7bGV0IG49W107ZT0oZXx8YXQuJGdldFJvb3QoKSkuZ2V0TGF0ZXN0KCksdD10fHwoYXQuJGlzRWxlbWVudE5vZGUoZSk/ZS5nZXRMYXN0RGVzY2VuZGFudCgpOmUpO2Zvcih2YXIgcj1lLG89MDsocj1yLmdldFBhcmVudCgpKSE9PW51bGw7KW8rKztmb3Iocj1vO2UhPT1udWxsJiYhZS5pcyh0KTspaWYobi5wdXNoKHtkZXB0aDpyLG5vZGU6ZX0pLGF0LiRpc0VsZW1lbnROb2RlKGUpJiYwPGUuZ2V0Q2hpbGRyZW5TaXplKCkpZT1lLmdldEZpcnN0Q2hpbGQoKSxyKys7ZWxzZSBmb3Iobz1udWxsO289PT1udWxsJiZlIT09bnVsbDspbz1lLmdldE5leHRTaWJsaW5nKCksbz09PW51bGw/KGU9ZS5nZXRQYXJlbnQoKSxyLS0pOmU9bztyZXR1cm4gZSE9PW51bGwmJmUuaXModCkmJm4ucHVzaCh7ZGVwdGg6cixub2RlOmV9KSxufTtkdC4kZmlsdGVyPWZ1bmN0aW9uKGUsdCl7bGV0IG49W107Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe2xldCBvPXQoZVtyXSk7byE9PW51bGwmJm4ucHVzaChvKX1yZXR1cm4gbn07ZHQuJGZpbmRNYXRjaGluZ1BhcmVudD1WdztkdC4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdz1mdW5jdGlvbihlKXtsZXQgdD1WdyhlLG49PmF0LiRpc0VsZW1lbnROb2RlKG4pJiYhbi5pc0lubGluZSgpKTtyZXR1cm4gYXQuJGlzRWxlbWVudE5vZGUodCl8fEdiKDQsZS5fX2tleSksdH07ZHQuJGdldE5lYXJlc3ROb2RlT2ZUeXBlPWZ1bmN0aW9uKGUsdCl7Zm9yKDtlIT1udWxsOyl7aWYoZSBpbnN0YW5jZW9mIHQpcmV0dXJuIGU7ZT1lLmdldFBhcmVudCgpfXJldHVybiBudWxsfTtkdC4kaW5zZXJ0Rmlyc3Q9ZnVuY3Rpb24oZSx0KXtsZXQgbj1lLmdldEZpcnN0Q2hpbGQoKTtuIT09bnVsbD9uLmluc2VydEJlZm9yZSh0KTplLmFwcGVuZCh0KX07ZHQuJGluc2VydE5vZGVUb05lYXJlc3RSb290PWZ1bmN0aW9uKGUpe3ZhciB0PWF0LiRnZXRTZWxlY3Rpb24oKXx8YXQuJGdldFByZXZpb3VzU2VsZWN0aW9uKCk7aWYoYXQuJGlzUmFuZ2VTZWxlY3Rpb24odCkpe3Zhcntmb2N1czpufT10O2lmKHQ9bi5nZXROb2RlKCksbj1uLm9mZnNldCxhdC4kaXNSb290T3JTaGFkb3dSb290KHQpKW49dC5nZXRDaGlsZEF0SW5kZXgobiksbj09bnVsbD90LmFwcGVuZChlKTpuLmluc2VydEJlZm9yZShlKSxlLnNlbGVjdE5leHQoKTtlbHNle2xldCByLG87YXQuJGlzVGV4dE5vZGUodCk/KHI9dC5nZXRQYXJlbnRPclRocm93KCksbz10LmdldEluZGV4V2l0aGluUGFyZW50KCksMDxuJiYobys9MSx0LnNwbGl0VGV4dChuKSkpOihyPXQsbz1uKSxbLHRdPWF0LiRzcGxpdE5vZGUocixvKSx0Lmluc2VydEJlZm9yZShlKSx0LnNlbGVjdFN0YXJ0KCl9fWVsc2UgYXQuJGlzTm9kZVNlbGVjdGlvbih0KXx8YXQuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKHQpPyh0PXQuZ2V0Tm9kZXMoKSx0W3QubGVuZ3RoLTFdLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5pbnNlcnRBZnRlcihlKSk6YXQuJGdldFJvb3QoKS5hcHBlbmQoZSksdD1hdC4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLGUuaW5zZXJ0QWZ0ZXIodCksdC5zZWxlY3QoKTtyZXR1cm4gZS5nZXRMYXRlc3QoKX07ZHQuJHJlc3RvcmVFZGl0b3JTdGF0ZT1mdW5jdGlvbihlLHQpe2xldCBuPW5ldyBNYXAscj1lLl9wZW5kaW5nRWRpdG9yU3RhdGU7Zm9yKGxldFtvLGldb2YgdC5fbm9kZU1hcCl7bGV0IGw9S2IuJGNsb25lV2l0aFByb3BlcnRpZXMoaSk7YXQuJGlzVGV4dE5vZGUobCkmJihsLl9fdGV4dD1pLl9fdGV4dCksbi5zZXQobyxsKX1yJiYoci5fbm9kZU1hcD1uKSxlLl9kaXJ0eVR5cGU9MixlPXQuX3NlbGVjdGlvbixhdC4kc2V0U2VsZWN0aW9uKGU9PT1udWxsP251bGw6ZS5jbG9uZSgpKX07ZHQuJHdyYXBOb2RlSW5FbGVtZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dCgpLGUucmVwbGFjZSh0KSx0LmFwcGVuZChlKSx0fTtkdC5hZGRDbGFzc05hbWVzVG9FbGVtZW50PWZ1bmN0aW9uKGUsLi4udCl7dC5mb3JFYWNoKG49Pnt0eXBlb2Ygbj09InN0cmluZyImJihuPW4uc3BsaXQoIiAiKS5maWx0ZXIocj0+ciE9PSIiKSxlLmNsYXNzTGlzdC5hZGQoLi4ubikpfSl9O2R0LmlzTWltZVR5cGU9VXc7ZHQubWVkaWFGaWxlUmVhZGVyPWZ1bmN0aW9uKGUsdCl7bGV0IG49ZVtTeW1ib2wuaXRlcmF0b3JdKCk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG8pPT57bGV0IGk9W10sbD0oKT0+e2NvbnN0e2RvbmU6cyx2YWx1ZTphfT1uLm5leHQoKTtpZihzKXJldHVybiByKGkpO2NvbnN0IHU9bmV3IEZpbGVSZWFkZXI7dS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsbyksdS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoKT0+e2NvbnN0IGM9dS5yZXN1bHQ7dHlwZW9mIGM9PSJzdHJpbmciJiZpLnB1c2goe2ZpbGU6YSxyZXN1bHQ6Y30pLGwoKX0pLFV3KGEsdCk/dS5yZWFkQXNEYXRhVVJMKGEpOmwoKX07bCgpfSl9O2R0Lm1lcmdlUmVnaXN0ZXI9ZnVuY3Rpb24oLi4uZSl7cmV0dXJuKCk9PntlLmZvckVhY2godD0+dCgpKX19O2R0Lm9iamVjdEtsYXNzRXF1YWxzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUhPT1udWxsP09iamVjdC5nZXRQcm90b3R5cGVPZihlKS5jb25zdHJ1Y3Rvci5uYW1lPT09dC5uYW1lOiExfTtkdC5yZWdpc3Rlck5lc3RlZEVsZW1lbnRSZXNvbHZlcj1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0odCxvPT57ZTp7Zm9yKHZhciBpPW8uZ2V0Q2hpbGRyZW4oKSxsPTA7bDxpLmxlbmd0aDtsKyspaWYoaVtsXWluc3RhbmNlb2YgdCl7aT1udWxsO2JyZWFrIGV9Zm9yKGk9bztpIT09bnVsbDspaWYobD1pLGk9aS5nZXRQYXJlbnQoKSxpIGluc3RhbmNlb2YgdCl7aT17Y2hpbGQ6bCxwYXJlbnQ6aX07YnJlYWsgZX1pPW51bGx9aWYoaSE9PW51bGwpe2NvbnN0e2NoaWxkOnMscGFyZW50OmF9PWk7aWYocy5pcyhvKSl7aWYocihhLG8pLG89cy5nZXROZXh0U2libGluZ3MoKSxpPW8ubGVuZ3RoLGEuaW5zZXJ0QWZ0ZXIocyksaSE9PTApe2w9bihhKSxzLmluc2VydEFmdGVyKGwpO2ZvcihsZXQgdT0wO3U8aTt1KyspbC5hcHBlbmQob1t1XSl9YS5jYW5CZUVtcHR5KCl8fGEuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wfHxhLnJlbW92ZSgpfX19KX07ZHQucmVtb3ZlQ2xhc3NOYW1lc0Zyb21FbGVtZW50PWZ1bmN0aW9uKGUsLi4udCl7dC5mb3JFYWNoKG49Pnt0eXBlb2Ygbj09InN0cmluZyImJmUuY2xhc3NMaXN0LnJlbW92ZSguLi5uLnNwbGl0KCIgIikpfSl9O2NvbnN0IFliPWR0O3ZhciBOdD1ZYixOZT1nZSxBbz1OdDtmdW5jdGlvbiBrbChlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3QuYXBwZW5kKCJjb2RlIixlKTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9ZnVuY3Rpb24gSHcoZSl7bGV0IHQ9MTtmb3IoZT1lLmdldFBhcmVudCgpO2UhPW51bGw7KXtpZihaZShlKSl7aWYoZT1lLmdldFBhcmVudCgpLHhlKGUpKXt0KyssZT1lLmdldFBhcmVudCgpO2NvbnRpbnVlfWtsKDQwKX1icmVha31yZXR1cm4gdH1mdW5jdGlvbiBycChlKXtlPWUuZ2V0UGFyZW50KCkseGUoZSl8fGtsKDQwKTtsZXQgdD1lO2Zvcig7dCE9PW51bGw7KXQ9dC5nZXRQYXJlbnQoKSx4ZSh0KSYmKGU9dCk7cmV0dXJuIGV9ZnVuY3Rpb24gS3coZSl7bGV0IHQ9W107ZT1lLmdldENoaWxkcmVuKCkuZmlsdGVyKFplKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZVtuXSxvPXIuZ2V0Rmlyc3RDaGlsZCgpO3hlKG8pP3Q9dC5jb25jYXQoS3cobykpOnQucHVzaChyKX1yZXR1cm4gdH1mdW5jdGlvbiBhcihlKXtyZXR1cm4gWmUoZSkmJnhlKGUuZ2V0Rmlyc3RDaGlsZCgpKX1mdW5jdGlvbiBYYihlKXtmb3IoO2UuZ2V0TmV4dFNpYmxpbmcoKT09bnVsbCYmZS5nZXRQcmV2aW91c1NpYmxpbmcoKT09bnVsbDspe2xldCB0PWUuZ2V0UGFyZW50KCk7aWYodD09bnVsbHx8IVplKGUpJiYheGUoZSkpYnJlYWs7ZT10fWUucmVtb3ZlKCl9ZnVuY3Rpb24gTnkoZSl7cmV0dXJuIFNuKCkuYXBwZW5kKGUpfWZ1bmN0aW9uIEd3KGUsdCl7cmV0dXJuIFplKGUpJiYodC5sZW5ndGg9PT0wfHx0Lmxlbmd0aD09PTEmJmUuaXModFswXSkmJmUuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wKX1mdW5jdGlvbiBwaShlLHQpe2Uuc3BsaWNlKGUuZ2V0Q2hpbGRyZW5TaXplKCksMCx0KX1mdW5jdGlvbiBieShlLHQpe2lmKHhlKGUpKXJldHVybiBlO2xldCBuPWUuZ2V0UHJldmlvdXNTaWJsaW5nKCkscj1lLmdldE5leHRTaWJsaW5nKCksbz1TbigpO3JldHVybiBvLnNldEZvcm1hdChlLmdldEZvcm1hdFR5cGUoKSksby5zZXRJbmRlbnQoZS5nZXRJbmRlbnQoKSkscGkobyxlLmdldENoaWxkcmVuKCkpLHhlKG4pJiZ0PT09bi5nZXRMaXN0VHlwZSgpPyhuLmFwcGVuZChvKSxlLnJlbW92ZSgpLHhlKHIpJiZ0PT09ci5nZXRMaXN0VHlwZSgpJiYocGkobixyLmdldENoaWxkcmVuKCkpLHIucmVtb3ZlKCkpLG4pOnhlKHIpJiZ0PT09ci5nZXRMaXN0VHlwZSgpPyhyLmdldEZpcnN0Q2hpbGRPclRocm93KCkuaW5zZXJ0QmVmb3JlKG8pLGUucmVtb3ZlKCkscik6KHQ9ZW4odCksdC5hcHBlbmQobyksZS5yZXBsYWNlKHQpLFl0KHQpLHQpfWZ1bmN0aW9uIFl3KGUsdCl7dmFyIG49ZS5nZXRMYXN0Q2hpbGQoKTtsZXQgcj10LmdldEZpcnN0Q2hpbGQoKTtuJiZyJiZhcihuKSYmYXIocikmJihZdyhuLmdldEZpcnN0Q2hpbGQoKSxyLmdldEZpcnN0Q2hpbGQoKSksci5yZW1vdmUoKSksbj10LmdldENoaWxkcmVuKCksMDxuLmxlbmd0aCYmKGUuYXBwZW5kKC4uLm4pLFl0KGUpKSx0LnJlbW92ZSgpfWZ1bmN0aW9uIFl0KGUsdCl7aWYoZT10fHxlLmdldENoaWxkcmVuKCksZSE9PXZvaWQgMClmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgaT1lW3RdO2lmKFplKGkpKXtsZXQgbD1pLmdldFZhbHVlKCk7dmFyIG49aSxyPW4uZ2V0UGFyZW50KCksbz0xO2ZvcihyIT1udWxsJiYoeGUocik/bz1yLmdldFN0YXJ0KCk6a2woNDQpKSxuPW4uZ2V0UHJldmlvdXNTaWJsaW5ncygpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7bGV0IHM9bltyXTtaZShzKSYmIXhlKHMuZ2V0Rmlyc3RDaGlsZCgpKSYmbysrfWwhPT1vJiZpLnNldFZhbHVlKG8pfX19ZnVuY3Rpb24gUWIoZSl7aWYoIWFyKGUpKXt2YXIgdD1lLmdldFBhcmVudCgpLG49dD90LmdldFBhcmVudCgpOnZvaWQgMCxyPW4/bi5nZXRQYXJlbnQoKTp2b2lkIDA7aWYoeGUocikmJlplKG4pJiZ4ZSh0KSl7dmFyIG89dD90LmdldEZpcnN0Q2hpbGQoKTp2b2lkIDAsaT10P3QuZ2V0TGFzdENoaWxkKCk6dm9pZCAwO2lmKGUuaXMobykpbi5pbnNlcnRCZWZvcmUoZSksdC5pc0VtcHR5KCkmJm4ucmVtb3ZlKCk7ZWxzZSBpZihlLmlzKGkpKW4uaW5zZXJ0QWZ0ZXIoZSksdC5pc0VtcHR5KCkmJm4ucmVtb3ZlKCk7ZWxzZXt2YXIgbD10LmdldExpc3RUeXBlKCk7bz1TbigpO2xldCBzPWVuKGwpO28uYXBwZW5kKHMpLGUuZ2V0UHJldmlvdXNTaWJsaW5ncygpLmZvckVhY2goYT0+cy5hcHBlbmQoYSkpLGk9U24oKSxsPWVuKGwpLGkuYXBwZW5kKGwpLHBpKGwsZS5nZXROZXh0U2libGluZ3MoKSksbi5pbnNlcnRCZWZvcmUobyksbi5pbnNlcnRBZnRlcihpKSxuLnJlcGxhY2UoZSl9WXQodCksWXQocil9fX1sZXQgdmQ9Y2xhc3MgWHcgZXh0ZW5kcyBOZS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaXN0aXRlbSJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgWHcodC5fX3ZhbHVlLHQuX19jaGVja2VkLHQuX19rZXkpfWNvbnN0cnVjdG9yKHQsbixyKXtzdXBlcihyKSx0aGlzLl9fdmFsdWU9dD09PXZvaWQgMD8xOnQsdGhpcy5fX2NoZWNrZWQ9bn1jcmVhdGVET00odCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxyPXRoaXMuZ2V0UGFyZW50KCk7cmV0dXJuIHhlKHIpJiZyLmdldExpc3RUeXBlKCk9PT0iY2hlY2siJiZQeShuLHRoaXMsbnVsbCksbi52YWx1ZT10aGlzLl9fdmFsdWUsUnkobix0LnRoZW1lLHRoaXMpLG59dXBkYXRlRE9NKHQsbixyKXtsZXQgbz10aGlzLmdldFBhcmVudCgpO3JldHVybiB4ZShvKSYmby5nZXRMaXN0VHlwZSgpPT09ImNoZWNrIiYmUHkobix0aGlzLHQpLG4udmFsdWU9dGhpcy5fX3ZhbHVlLFJ5KG4sci50aGVtZSx0aGlzKSwhMX1zdGF0aWMgdHJhbnNmb3JtKCl7cmV0dXJuIHQ9PntsZXQgbj10LmdldFBhcmVudCgpO3hlKG4pJiYoWXQobiksbi5nZXRMaXN0VHlwZSgpIT09ImNoZWNrIiYmdC5nZXRDaGVja2VkKCkhPW51bGwmJnQuc2V0Q2hlY2tlZCh2b2lkIDApKX19c3RhdGljIGltcG9ydERPTSgpe3JldHVybntsaTooKT0+KHtjb252ZXJzaW9uOkpiLHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49U24oKTtyZXR1cm4gbi5zZXRDaGVja2VkKHQuY2hlY2tlZCksbi5zZXRWYWx1ZSh0LnZhbHVlKSxuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksY2hlY2tlZDp0aGlzLmdldENoZWNrZWQoKSx0eXBlOiJsaXN0aXRlbSIsdmFsdWU6dGhpcy5nZXRWYWx1ZSgpLHZlcnNpb246MX19YXBwZW5kKC4uLnQpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtsZXQgcj10W25dO2lmKE5lLiRpc0VsZW1lbnROb2RlKHIpJiZ0aGlzLmNhbk1lcmdlV2l0aChyKSl7bGV0IG89ci5nZXRDaGlsZHJlbigpO3RoaXMuYXBwZW5kKC4uLm8pLHIucmVtb3ZlKCl9ZWxzZSBzdXBlci5hcHBlbmQocil9cmV0dXJuIHRoaXN9cmVwbGFjZSh0LG4pe2lmKFplKHQpKXJldHVybiBzdXBlci5yZXBsYWNlKHQpO3RoaXMuc2V0SW5kZW50KDApO2xldCByPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpO2lmKCF4ZShyKSlyZXR1cm4gdDtpZihyLl9fZmlyc3Q9PT10aGlzLmdldEtleSgpKXIuaW5zZXJ0QmVmb3JlKHQpO2Vsc2UgaWYoci5fX2xhc3Q9PT10aGlzLmdldEtleSgpKXIuaW5zZXJ0QWZ0ZXIodCk7ZWxzZXtsZXQgbz1lbihyLmdldExpc3RUeXBlKCkpLGk9dGhpcy5nZXROZXh0U2libGluZygpO2Zvcig7aTspe2xldCBsPWk7aT1pLmdldE5leHRTaWJsaW5nKCksby5hcHBlbmQobCl9ci5pbnNlcnRBZnRlcih0KSx0Lmluc2VydEFmdGVyKG8pfXJldHVybiBuJiZ0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChvPT57dC5hcHBlbmQobyl9KSx0aGlzLnJlbW92ZSgpLHIuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZyLnJlbW92ZSgpLHR9aW5zZXJ0QWZ0ZXIodCxuPSEwKXt2YXIgcj10aGlzLmdldFBhcmVudE9yVGhyb3coKTt4ZShyKXx8a2woMzkpO3ZhciBvPXRoaXMuZ2V0TmV4dFNpYmxpbmdzKCk7aWYoWmUodCkpcmV0dXJuIG49c3VwZXIuaW5zZXJ0QWZ0ZXIodCxuKSx0PXQuZ2V0UGFyZW50T3JUaHJvdygpLHhlKHQpJiZZdCh0KSxuO2lmKHhlKHQpKXtmb3Iocj10LHQ9dC5nZXRDaGlsZHJlbigpLG89dC5sZW5ndGgtMTswPD1vO28tLSlyPXRbb10sdGhpcy5pbnNlcnRBZnRlcihyLG4pO3JldHVybiByfWlmKHIuaW5zZXJ0QWZ0ZXIodCxuKSxvLmxlbmd0aCE9PTApe2xldCBpPWVuKHIuZ2V0TGlzdFR5cGUoKSk7by5mb3JFYWNoKGw9PmkuYXBwZW5kKGwpKSx0Lmluc2VydEFmdGVyKGksbil9cmV0dXJuIHR9cmVtb3ZlKHQpe2xldCBuPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkscj10aGlzLmdldE5leHRTaWJsaW5nKCk7c3VwZXIucmVtb3ZlKHQpLG4mJnImJmFyKG4pJiZhcihyKT8oWXcobi5nZXRGaXJzdENoaWxkKCksci5nZXRGaXJzdENoaWxkKCkpLHIucmVtb3ZlKCkpOnImJih0PXIuZ2V0UGFyZW50KCkseGUodCkmJll0KHQpKX1pbnNlcnROZXdBZnRlcih0LG49ITApe3JldHVybiB0PVNuKHRoaXMuX19jaGVja2VkPT1udWxsP3ZvaWQgMDohMSksdGhpcy5pbnNlcnRBZnRlcih0LG4pLHR9Y29sbGFwc2VBdFN0YXJ0KHQpe2xldCBuPU5lLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7dGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobD0+bi5hcHBlbmQobCkpO3ZhciByPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLG89ci5nZXRQYXJlbnRPclRocm93KCk7bGV0IGk9WmUobyk7cmV0dXJuIHIuZ2V0Q2hpbGRyZW5TaXplKCk9PT0xP2k/KHIucmVtb3ZlKCksby5zZWxlY3QoKSk6KHIuaW5zZXJ0QmVmb3JlKG4pLHIucmVtb3ZlKCkscj10LmFuY2hvcix0PXQuZm9jdXMsbz1uLmdldEtleSgpLHIudHlwZT09PSJlbGVtZW50IiYmci5nZXROb2RlKCkuaXModGhpcykmJnIuc2V0KG8sci5vZmZzZXQsImVsZW1lbnQiKSx0LnR5cGU9PT0iZWxlbWVudCImJnQuZ2V0Tm9kZSgpLmlzKHRoaXMpJiZ0LnNldChvLHQub2Zmc2V0LCJlbGVtZW50IikpOihyLmluc2VydEJlZm9yZShuKSx0aGlzLnJlbW92ZSgpKSwhMH1nZXRWYWx1ZSgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdmFsdWV9c2V0VmFsdWUodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fdmFsdWU9dH1nZXRDaGVja2VkKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19jaGVja2VkfXNldENoZWNrZWQodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fY2hlY2tlZD10fXRvZ2dsZUNoZWNrZWQoKXt0aGlzLnNldENoZWNrZWQoIXRoaXMuX19jaGVja2VkKX1nZXRJbmRlbnQoKXt2YXIgdD10aGlzLmdldFBhcmVudCgpO2lmKHQ9PT1udWxsKXJldHVybiB0aGlzLmdldExhdGVzdCgpLl9faW5kZW50O3Q9dC5nZXRQYXJlbnRPclRocm93KCk7bGV0IG49MDtmb3IoO1plKHQpOyl0PXQuZ2V0UGFyZW50T3JUaHJvdygpLmdldFBhcmVudE9yVGhyb3coKSxuKys7cmV0dXJuIG59c2V0SW5kZW50KHQpe3R5cGVvZiB0PT0ibnVtYmVyIiYmLTE8dHx8a2woMTE3KTtsZXQgbj10aGlzLmdldEluZGVudCgpO2Zvcig7biE9PXQ7KWlmKG48dCl7ZTp7dmFyIHI9bmV3IFNldDtpZihhcih0aGlzKXx8ci5oYXModGhpcy5nZXRLZXkoKSkpYnJlYWsgZTtsZXQgcz10aGlzLmdldFBhcmVudCgpO3ZhciBvPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSxpPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7aWYoYXIobykmJmFyKGkpKXtpZihpPWkuZ2V0Rmlyc3RDaGlsZCgpLHhlKGkpKXtpLmFwcGVuZCh0aGlzKTt2YXIgbD1vLmdldEZpcnN0Q2hpbGQoKTt4ZShsKSYmKGw9bC5nZXRDaGlsZHJlbigpLHBpKGksbCksby5yZW1vdmUoKSxyLmFkZChvLmdldEtleSgpKSksWXQoaSl9fWVsc2UgYXIobyk/KG89by5nZXRGaXJzdENoaWxkKCkseGUobykmJihyPW8uZ2V0Rmlyc3RDaGlsZCgpLHIhPT1udWxsJiZyLmluc2VydEJlZm9yZSh0aGlzKSxZdChvKSkpOmFyKGkpPyhvPWkuZ2V0Rmlyc3RDaGlsZCgpLHhlKG8pJiYoby5hcHBlbmQodGhpcyksWXQobykpKTp4ZShzKSYmKHI9U24oKSxsPWVuKHMuZ2V0TGlzdFR5cGUoKSksci5hcHBlbmQobCksbC5hcHBlbmQodGhpcyksaT9pLmluc2VydEFmdGVyKHIpOm8/by5pbnNlcnRCZWZvcmUocik6cy5hcHBlbmQociksWXQobCkpO3hlKHMpJiZZdChzKX1uKyt9ZWxzZSBRYih0aGlzKSxuLS07cmV0dXJuIHRoaXN9aW5zZXJ0QmVmb3JlKHQpe2lmKFplKHQpKXtsZXQgbj10aGlzLmdldFBhcmVudE9yVGhyb3coKTtpZih4ZShuKSl7bGV0IHI9dGhpcy5nZXROZXh0U2libGluZ3MoKTtZdChuLHIpfX1yZXR1cm4gc3VwZXIuaW5zZXJ0QmVmb3JlKHQpfWNhbkluc2VydEFmdGVyKHQpe3JldHVybiBaZSh0KX1jYW5SZXBsYWNlV2l0aCh0KXtyZXR1cm4gWmUodCl9Y2FuTWVyZ2VXaXRoKHQpe3JldHVybiBOZS4kaXNQYXJhZ3JhcGhOb2RlKHQpfHxaZSh0KX1leHRyYWN0V2l0aENoaWxkKHQsbil7aWYoIU5lLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXJldHVybiExO3Q9bi5hbmNob3IuZ2V0Tm9kZSgpO2xldCByPW4uZm9jdXMuZ2V0Tm9kZSgpO3JldHVybiB0aGlzLmlzUGFyZW50T2YodCkmJnRoaXMuaXNQYXJlbnRPZihyKSYmdGhpcy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aD09PW4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9aXNQYXJlbnRSZXF1aXJlZCgpe3JldHVybiEwfWNyZWF0ZVBhcmVudEVsZW1lbnROb2RlKCl7cmV0dXJuIGVuKCJidWxsZXQiKX19O2Z1bmN0aW9uIFJ5KGUsdCxuKXtsZXQgcj1bXSxvPVtdO3ZhciBpPSh0PXQubGlzdCk/dC5saXN0aXRlbTp2b2lkIDA7aWYodCYmdC5uZXN0ZWQpdmFyIGw9dC5uZXN0ZWQubGlzdGl0ZW07aWYoaSE9PXZvaWQgMCYmKGk9aS5zcGxpdCgiICIpLHIucHVzaCguLi5pKSksdCl7aT1uLmdldFBhcmVudCgpLGk9eGUoaSkmJmkuZ2V0TGlzdFR5cGUoKT09PSJjaGVjayI7bGV0IHM9bi5nZXRDaGVja2VkKCk7aSYmIXN8fG8ucHVzaCh0Lmxpc3RpdGVtVW5jaGVja2VkKSxpJiZzfHxvLnB1c2godC5saXN0aXRlbUNoZWNrZWQpLGkmJnIucHVzaChzP3QubGlzdGl0ZW1DaGVja2VkOnQubGlzdGl0ZW1VbmNoZWNrZWQpfWwhPT12b2lkIDAmJihsPWwuc3BsaXQoIiAiKSxuLmdldENoaWxkcmVuKCkuc29tZShzPT54ZShzKSk/ci5wdXNoKC4uLmwpOm8ucHVzaCguLi5sKSksMDxvLmxlbmd0aCYmQW8ucmVtb3ZlQ2xhc3NOYW1lc0Zyb21FbGVtZW50KGUsLi4ubyksMDxyLmxlbmd0aCYmQW8uYWRkQ2xhc3NOYW1lc1RvRWxlbWVudChlLC4uLnIpfWZ1bmN0aW9uIFB5KGUsdCxuKXt4ZSh0LmdldEZpcnN0Q2hpbGQoKSk/KGUucmVtb3ZlQXR0cmlidXRlKCJyb2xlIiksZS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IiksZS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIpKTooZS5zZXRBdHRyaWJ1dGUoInJvbGUiLCJjaGVja2JveCIpLGUuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsIi0xIiksbiYmdC5fX2NoZWNrZWQ9PT1uLl9fY2hlY2tlZHx8ZS5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsdC5nZXRDaGVja2VkKCk/InRydWUiOiJmYWxzZSIpKX1mdW5jdGlvbiBKYihlKXtyZXR1cm4gZT1Bby5pc0hUTUxFbGVtZW50KGUpJiZlLmdldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIik9PT0idHJ1ZSIse25vZGU6U24oZSl9fWZ1bmN0aW9uIFNuKGUpe3JldHVybiBOZS4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IHZkKHZvaWQgMCxlKSl9ZnVuY3Rpb24gWmUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB2ZH1sZXQgWmc9Y2xhc3MgUXcgZXh0ZW5kcyBOZS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaXN0In1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBRdyh0Ll9fbGlzdFR5cGV8fE15W3QuX190YWddLHQuX19zdGFydCx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIociksdGhpcy5fX2xpc3RUeXBlPXQ9TXlbdF18fHQsdGhpcy5fX3RhZz10PT09Im51bWJlciI/Im9sIjoidWwiLHRoaXMuX19zdGFydD1ufWdldFRhZygpe3JldHVybiB0aGlzLl9fdGFnfXNldExpc3RUeXBlKHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtuLl9fbGlzdFR5cGU9dCxuLl9fdGFnPXQ9PT0ibnVtYmVyIj8ib2wiOiJ1bCJ9Z2V0TGlzdFR5cGUoKXtyZXR1cm4gdGhpcy5fX2xpc3RUeXBlfWdldFN0YXJ0KCl7cmV0dXJuIHRoaXMuX19zdGFydH1jcmVhdGVET00odCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLl9fdGFnKTtyZXR1cm4gdGhpcy5fX3N0YXJ0IT09MSYmbi5zZXRBdHRyaWJ1dGUoInN0YXJ0IixTdHJpbmcodGhpcy5fX3N0YXJ0KSksbi5fX2xleGljYWxMaXN0VHlwZT10aGlzLl9fbGlzdFR5cGUsT3kobix0LnRoZW1lLHRoaXMpLG59dXBkYXRlRE9NKHQsbixyKXtyZXR1cm4gdC5fX3RhZyE9PXRoaXMuX190YWc/ITA6KE95KG4sci50aGVtZSx0aGlzKSwhMSl9c3RhdGljIGltcG9ydERPTSgpe3JldHVybntvbDooKT0+KHtjb252ZXJzaW9uOkF5LHByaW9yaXR5OjB9KSx1bDooKT0+KHtjb252ZXJzaW9uOkF5LHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49ZW4odC5saXN0VHlwZSx0LnN0YXJ0KTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1leHBvcnRET00odCl7cmV0dXJue2VsZW1lbnQ6dH09c3VwZXIuZXhwb3J0RE9NKHQpLHQmJkFvLmlzSFRNTEVsZW1lbnQodCkmJih0aGlzLl9fc3RhcnQhPT0xJiZ0LnNldEF0dHJpYnV0ZSgic3RhcnQiLFN0cmluZyh0aGlzLl9fc3RhcnQpKSx0aGlzLl9fbGlzdFR5cGU9PT0iY2hlY2siJiZ0LnNldEF0dHJpYnV0ZSgiX19sZXhpY2FsTGlzdFR5cGUiLCJjaGVjayIpKSx7ZWxlbWVudDp0fX1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSxsaXN0VHlwZTp0aGlzLmdldExpc3RUeXBlKCksc3RhcnQ6dGhpcy5nZXRTdGFydCgpLHRhZzp0aGlzLmdldFRhZygpLHR5cGU6Imxpc3QiLHZlcnNpb246MX19Y2FuQmVFbXB0eSgpe3JldHVybiExfWNhbkluZGVudCgpe3JldHVybiExfWFwcGVuZCguLi50KXtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49dFtyXTtpZihaZShuKSlzdXBlci5hcHBlbmQobik7ZWxzZXtsZXQgbz1TbigpO3hlKG4pfHxOZS4kaXNFbGVtZW50Tm9kZShuKSYmKG49TmUuJGNyZWF0ZVRleHROb2RlKG4uZ2V0VGV4dENvbnRlbnQoKSkpLG8uYXBwZW5kKG4pLHN1cGVyLmFwcGVuZChvKX19cmV0dXJuIFl0KHRoaXMpLHRoaXN9ZXh0cmFjdFdpdGhDaGlsZCh0KXtyZXR1cm4gWmUodCl9fTtmdW5jdGlvbiBPeShlLHQsbil7bGV0IHI9W10sbz1bXTt2YXIgaT10Lmxpc3Q7aWYoaSE9PXZvaWQgMCl7bGV0IHM9aVtgJHtuLl9fdGFnfURlcHRoYF18fFtdO3Q9SHcobiktMTtsZXQgYT10JXMubGVuZ3RoO3ZhciBsPXNbYV07bGV0IHU9aVtuLl9fdGFnXSxjO2lmKGk9aS5uZXN0ZWQsaSE9PXZvaWQgMCYmaS5saXN0JiYoYz1pLmxpc3QpLHUhPT12b2lkIDAmJnIucHVzaCh1KSxsIT09dm9pZCAwKWZvcihsPWwuc3BsaXQoIiAiKSxyLnB1c2goLi4ubCksbD0wO2w8cy5sZW5ndGg7bCsrKWwhPT1hJiZvLnB1c2gobi5fX3RhZytsKTtjIT09dm9pZCAwJiYobj1jLnNwbGl0KCIgIiksMTx0P3IucHVzaCguLi5uKTpvLnB1c2goLi4ubikpfTA8by5sZW5ndGgmJkFvLnJlbW92ZUNsYXNzTmFtZXNGcm9tRWxlbWVudChlLC4uLm8pLDA8ci5sZW5ndGgmJkFvLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQoZSwuLi5yKX1mdW5jdGlvbiBaYihlKXtsZXQgdD1bXTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtaZShuKT8odC5wdXNoKG4pLG49bi5nZXRDaGlsZHJlbigpLDE8bi5sZW5ndGgmJm4uZm9yRWFjaChvPT57eGUobykmJnQucHVzaChOeShvKSl9KSk6dC5wdXNoKE55KG4pKX1yZXR1cm4gdH1mdW5jdGlvbiBBeShlKXtsZXQgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj1udWxsO3JldHVybiB0PT09Im9sIj9uPWVuKCJudW1iZXIiLGUuc3RhcnQpOnQ9PT0idWwiJiYobj1Bby5pc0hUTUxFbGVtZW50KGUpJiZlLmdldEF0dHJpYnV0ZSgiX19sZXhpY2FsbGlzdHR5cGUiKT09PSJjaGVjayI/ZW4oImNoZWNrIik6ZW4oImJ1bGxldCIpKSx7YWZ0ZXI6WmIsbm9kZTpufX1sZXQgTXk9e29sOiJudW1iZXIiLHVsOiJidWxsZXQifTtmdW5jdGlvbiBlbihlLHQ9MSl7cmV0dXJuIE5lLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgWmcoZSx0KSl9ZnVuY3Rpb24geGUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBaZ31sZXQgcWI9TmUuY3JlYXRlQ29tbWFuZCgiSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQiKSxlMj1OZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQiKSx0Mj1OZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfQ0hFQ0tfTElTVF9DT01NQU5EIiksbjI9TmUuY3JlYXRlQ29tbWFuZCgiUkVNT1ZFX0xJU1RfQ09NTUFORCIpO2xuLiRjcmVhdGVMaXN0SXRlbU5vZGU9U247bG4uJGNyZWF0ZUxpc3ROb2RlPWVuO2xuLiRnZXRMaXN0RGVwdGg9SHc7bG4uJGhhbmRsZUxpc3RJbnNlcnRQYXJhZ3JhcGg9ZnVuY3Rpb24oKXt2YXIgZT1OZS4kZ2V0U2VsZWN0aW9uKCk7aWYoIU5lLiRpc1JhbmdlU2VsZWN0aW9uKGUpfHwhZS5pc0NvbGxhcHNlZCgpfHwoZT1lLmFuY2hvci5nZXROb2RlKCksIVplKGUpfHxlLmdldENoaWxkcmVuU2l6ZSgpIT09MCkpcmV0dXJuITE7dmFyIHQ9cnAoZSksbj1lLmdldFBhcmVudCgpO3hlKG4pfHxrbCg0MCk7bGV0IHI9bi5nZXRQYXJlbnQoKSxvO2lmKE5lLiRpc1Jvb3RPclNoYWRvd1Jvb3Qocikpbz1OZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLHQuaW5zZXJ0QWZ0ZXIobyk7ZWxzZSBpZihaZShyKSlvPVNuKCksci5pbnNlcnRBZnRlcihvKTtlbHNlIHJldHVybiExO2lmKG8uc2VsZWN0KCksdD1lLmdldE5leHRTaWJsaW5ncygpLDA8dC5sZW5ndGgpe2xldCBpPWVuKG4uZ2V0TGlzdFR5cGUoKSk7TmUuJGlzUGFyYWdyYXBoTm9kZShvKT9vLmluc2VydEFmdGVyKGkpOihuPVNuKCksbi5hcHBlbmQoaSksby5pbnNlcnRBZnRlcihuKSksdC5mb3JFYWNoKGw9PntsLnJlbW92ZSgpLGkuYXBwZW5kKGwpfSl9cmV0dXJuIFhiKGUpLCEwfTtsbi4kaXNMaXN0SXRlbU5vZGU9WmU7bG4uJGlzTGlzdE5vZGU9eGU7bG4uSU5TRVJUX0NIRUNLX0xJU1RfQ09NTUFORD10Mjtsbi5JTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQ9ZTI7bG4uSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQ9cWI7bG4uTGlzdEl0ZW1Ob2RlPXZkO2xuLkxpc3ROb2RlPVpnO2xuLlJFTU9WRV9MSVNUX0NPTU1BTkQ9bjI7bG4uaW5zZXJ0TGlzdD1mdW5jdGlvbihlLHQpe2UudXBkYXRlKCgpPT57dmFyIG49TmUuJGdldFNlbGVjdGlvbigpO2lmKE5lLiRpc1JhbmdlU2VsZWN0aW9uKG4pfHxOZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24obikpe3ZhciByPW4uZ2V0Tm9kZXMoKTtuPW4uYW5jaG9yLmdldE5vZGUoKTt2YXIgbz1uLmdldFBhcmVudCgpO2lmKEd3KG4scikpcj1lbih0KSxOZS4kaXNSb290T3JTaGFkb3dSb290KG8pPyhuLnJlcGxhY2Uociksbz1TbigpLE5lLiRpc0VsZW1lbnROb2RlKG4pJiYoby5zZXRGb3JtYXQobi5nZXRGb3JtYXRUeXBlKCkpLG8uc2V0SW5kZW50KG4uZ2V0SW5kZW50KCkpKSxyLmFwcGVuZChvKSk6WmUobikmJihuPW4uZ2V0UGFyZW50T3JUaHJvdygpLHBpKHIsbi5nZXRDaGlsZHJlbigpKSxuLnJlcGxhY2UocikpO2Vsc2UgZm9yKG49bmV3IFNldCxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoTmUuJGlzRWxlbWVudE5vZGUoaSkmJmkuaXNFbXB0eSgpJiYhbi5oYXMoaS5nZXRLZXkoKSkpYnkoaSx0KTtlbHNlIGlmKE5lLiRpc0xlYWZOb2RlKGkpKWZvcihpPWkuZ2V0UGFyZW50KCk7aSE9bnVsbDspe2xldCBzPWkuZ2V0S2V5KCk7aWYoeGUoaSkpe2lmKCFuLmhhcyhzKSl7dmFyIGw9ZW4odCk7cGkobCxpLmdldENoaWxkcmVuKCkpLGkucmVwbGFjZShsKSxZdChsKSxuLmFkZChzKX1icmVha31lbHNle2lmKGw9aS5nZXRQYXJlbnQoKSxOZS4kaXNSb290T3JTaGFkb3dSb290KGwpJiYhbi5oYXMocykpe24uYWRkKHMpLGJ5KGksdCk7YnJlYWt9aT1sfX19fX0pfTtsbi5yZW1vdmVMaXN0PWZ1bmN0aW9uKGUpe2UudXBkYXRlKCgpPT57bGV0IHQ9TmUuJGdldFNlbGVjdGlvbigpO2lmKE5lLiRpc1JhbmdlU2VsZWN0aW9uKHQpKXt2YXIgbj1uZXcgU2V0LHI9dC5nZXROb2RlcygpLG89dC5hbmNob3IuZ2V0Tm9kZSgpO2lmKEd3KG8scikpbi5hZGQocnAobykpO2Vsc2UgZm9yKG89MDtvPHIubGVuZ3RoO28rKyl7dmFyIGk9cltvXTtOZS4kaXNMZWFmTm9kZShpKSYmKGk9QW8uJGdldE5lYXJlc3ROb2RlT2ZUeXBlKGksdmQpLGkhPW51bGwmJm4uYWRkKHJwKGkpKSl9Zm9yKGxldCBsIG9mIG4pe249bCxyPUt3KGwpO2ZvcihsZXQgcyBvZiByKXI9TmUuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSxwaShyLHMuZ2V0Q2hpbGRyZW4oKSksbi5pbnNlcnRBZnRlcihyKSxuPXIscy5fX2tleT09PXQuYW5jaG9yLmtleSYmdC5hbmNob3Iuc2V0KHIuZ2V0S2V5KCksMCwiZWxlbWVudCIpLHMuX19rZXk9PT10LmZvY3VzLmtleSYmdC5mb2N1cy5zZXQoci5nZXRLZXkoKSwwLCJlbGVtZW50Iikscy5yZW1vdmUoKTtsLnJlbW92ZSgpfX19KX07Y29uc3QgcjI9bG47dmFyIGZvPXIyLEp3PXt9LHlkPXt9LFp3PXA7ZnVuY3Rpb24gbzIoZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWxldCBxdz1ady5jcmVhdGVDb250ZXh0KG51bGwpO3lkLkxleGljYWxDb21wb3NlckNvbnRleHQ9cXc7eWQuY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbihlLHQpe2xldCBuPW51bGw7cmV0dXJuIGUhPW51bGwmJihuPWVbMV0pLHtnZXRUaGVtZTpmdW5jdGlvbigpe3JldHVybiB0Pz8obiE9bnVsbD9uLmdldFRoZW1lKCk6bnVsbCl9fX07eWQudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbigpe2xldCBlPVp3LnVzZUNvbnRleHQocXcpO3JldHVybiBlPT1udWxsJiZvMig4KSxlfTtjb25zdCBpMj15ZDt2YXIgbnI9aTIsRHk9bnIsX3M9Z2UsVGM9cDtsZXQgZVM9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiO3ZhciBsMj1lUz9UYy51c2VMYXlvdXRFZmZlY3Q6VGMudXNlRWZmZWN0O2xldCBmdT17dGFnOiJoaXN0b3J5LW1lcmdlIn07ZnVuY3Rpb24gczIoZSx0KXtpZih0IT09bnVsbCl7aWYodD09PXZvaWQgMCllLnVwZGF0ZSgoKT0+e3ZhciBuPV9zLiRnZXRSb290KCk7aWYobi5pc0VtcHR5KCkpe2xldCByPV9zLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7bi5hcHBlbmQociksbj1lUz9kb2N1bWVudC5hY3RpdmVFbGVtZW50Om51bGwsKF9zLiRnZXRTZWxlY3Rpb24oKSE9PW51bGx8fG4hPT1udWxsJiZuPT09ZS5nZXRSb290RWxlbWVudCgpKSYmci5zZWxlY3QoKX19LGZ1KTtlbHNlIGlmKHQhPT1udWxsKXN3aXRjaCh0eXBlb2YgdCl7Y2FzZSJzdHJpbmciOmxldCBuPWUucGFyc2VFZGl0b3JTdGF0ZSh0KTtlLnNldEVkaXRvclN0YXRlKG4sZnUpO2JyZWFrO2Nhc2Uib2JqZWN0IjplLnNldEVkaXRvclN0YXRlKHQsZnUpO2JyZWFrO2Nhc2UiZnVuY3Rpb24iOmUudXBkYXRlKCgpPT57X3MuJGdldFJvb3QoKS5pc0VtcHR5KCkmJnQoZSl9LGZ1KX19fUp3LkxleGljYWxDb21wb3Nlcj1mdW5jdGlvbih7aW5pdGlhbENvbmZpZzplLGNoaWxkcmVuOnR9KXtsZXQgbj1UYy51c2VNZW1vKCgpPT57Y29uc3R7dGhlbWU6cixuYW1lc3BhY2U6byxlZGl0b3JfX0RFUFJFQ0FURUQ6aSxub2RlczpsLG9uRXJyb3I6cyxlZGl0b3JTdGF0ZTphfT1lLHU9RHkuY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dChudWxsLHIpO2xldCBjPWl8fG51bGw7aWYoYz09PW51bGwpe2NvbnN0IGQ9X3MuY3JlYXRlRWRpdG9yKHtlZGl0YWJsZTplLmVkaXRhYmxlLG5hbWVzcGFjZTpvLG5vZGVzOmwsb25FcnJvcjpmPT5zKGYsZCksdGhlbWU6cn0pO3MyKGQsYSksYz1kfXJldHVybltjLHVdfSxbXSk7cmV0dXJuIGwyKCgpPT57bGV0IHI9ZS5lZGl0YWJsZSxbb109bjtvLnNldEVkaXRhYmxlKHIhPT12b2lkIDA/cjohMCl9LFtdKSxUYy5jcmVhdGVFbGVtZW50KER5LkxleGljYWxDb21wb3NlckNvbnRleHQuUHJvdmlkZXIse3ZhbHVlOm59LHQpfTtjb25zdCBhMj1Kdzt2YXIgdTI9YTIsenM9cDtmdW5jdGlvbiBvcChlLHQpe3JldHVybiBvcD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihuLHIpe3JldHVybiBuLl9fcHJvdG9fXz1yLG59LG9wKGUsdCl9ZnVuY3Rpb24gYzIoZSx0KXtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLG9wKGUsdCl9ZnVuY3Rpb24gZDIoZSx0KXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9W10pLHQ9PT12b2lkIDAmJih0PVtdKSxlLmxlbmd0aCE9PXQubGVuZ3RofHxlLnNvbWUoZnVuY3Rpb24obixyKXtyZXR1cm4hT2JqZWN0LmlzKG4sdFtyXSl9KX12YXIgTHk9e2Vycm9yOm51bGx9LGYyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtmb3IodmFyIHIsbz1hcmd1bWVudHMubGVuZ3RoLGk9QXJyYXkobyksbD0wO2w8bztsKyspaVtsXT1hcmd1bWVudHNbbF07cmV0dXJuIHI9ZS5jYWxsLmFwcGx5KGUsW3RoaXNdLmNvbmNhdChpKSl8fHRoaXMsci5zdGF0ZT1MeSxyLnJlc2V0RXJyb3JCb3VuZGFyeT1mdW5jdGlvbigpe2Zvcih2YXIgcyxhPWFyZ3VtZW50cy5sZW5ndGgsdT1BcnJheShhKSxjPTA7YzxhO2MrKyl1W2NdPWFyZ3VtZW50c1tjXTtyLnByb3BzLm9uUmVzZXQ9PW51bGx8fChzPXIucHJvcHMpLm9uUmVzZXQuYXBwbHkocyx1KSxyLnJlc2V0KCl9LHJ9YzIodCxlKSx0LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj1mdW5jdGlvbihyKXtyZXR1cm57ZXJyb3I6cn19O3ZhciBuPXQucHJvdG90eXBlO3JldHVybiBuLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zZXRTdGF0ZShMeSl9LG4uY29tcG9uZW50RGlkQ2F0Y2g9ZnVuY3Rpb24ocixvKXt2YXIgaSxsOyhpPShsPXRoaXMucHJvcHMpLm9uRXJyb3IpPT1udWxsfHxpLmNhbGwobCxyLG8pfSxuLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbihyLG8pe3ZhciBpPXRoaXMucHJvcHMucmVzZXRLZXlzO2lmKHRoaXMuc3RhdGUuZXJyb3IhPT1udWxsJiZvLmVycm9yIT09bnVsbCYmZDIoci5yZXNldEtleXMsaSkpe3ZhciBsLHM7KGw9KHM9dGhpcy5wcm9wcykub25SZXNldEtleXNDaGFuZ2UpPT1udWxsfHxsLmNhbGwocyxyLnJlc2V0S2V5cyxpKSx0aGlzLnJlc2V0KCl9fSxuLnJlbmRlcj1mdW5jdGlvbigpe3ZhciByPXRoaXMuc3RhdGUuZXJyb3Isbz10aGlzLnByb3BzLGk9by5mYWxsYmFja1JlbmRlcixsPW8uRmFsbGJhY2tDb21wb25lbnQ7aWYobz1vLmZhbGxiYWNrLHIhPT1udWxsKXtpZihyPXtlcnJvcjpyLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX0senMuaXNWYWxpZEVsZW1lbnQobykpcmV0dXJuIG87aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpcmV0dXJuIGkocik7aWYobClyZXR1cm4genMuY3JlYXRlRWxlbWVudChsLHIpO3Rocm93IEVycm9yKCJyZWFjdC1lcnJvci1ib3VuZGFyeSByZXF1aXJlcyBlaXRoZXIgYSBmYWxsYmFjaywgZmFsbGJhY2tSZW5kZXIsIG9yIEZhbGxiYWNrQ29tcG9uZW50IHByb3AiKX1yZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbn0sdH0oenMuQ29tcG9uZW50KSxoMj1mdW5jdGlvbih7Y2hpbGRyZW46ZSxvbkVycm9yOnR9KXtyZXR1cm4genMuY3JlYXRlRWxlbWVudChmMix7ZmFsbGJhY2s6enMuY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6e2JvcmRlcjoiMXB4IHNvbGlkICNmMDAiLGNvbG9yOiIjZjAwIixwYWRkaW5nOiI4cHgifX0sIkFuIGVycm9yIHdhcyB0aHJvd24uIiksb25FcnJvcjp0fSxlKX07Y29uc3QgcDI9aDI7dmFyIGcyPXAyO2NvbnN0IG0yPSRhKGcyKTt2YXIgcWc9e30sZW09e30sdjI9TnQsemU9Z2U7ZnVuY3Rpb24geTIoZSx0LG4scixvKXtpZihlPT09bnVsbHx8bi5zaXplPT09MCYmci5zaXplPT09MCYmIW8pcmV0dXJuIDA7dmFyIGk9dC5fc2VsZWN0aW9uLGw9ZS5fc2VsZWN0aW9uO2lmKG8pcmV0dXJuIDE7aWYoISh6ZS4kaXNSYW5nZVNlbGVjdGlvbihpKSYmemUuJGlzUmFuZ2VTZWxlY3Rpb24obCkmJmwuaXNDb2xsYXBzZWQoKSYmaS5pc0NvbGxhcHNlZCgpKSlyZXR1cm4gMDtvPXQuX25vZGVNYXA7bGV0IHM9W107Zm9yKGxldCBhIG9mIG4pbj1vLmdldChhKSxuIT09dm9pZCAwJiZzLnB1c2gobik7Zm9yKGxldFthLHVdb2Ygcil1JiYocj1vLmdldChhKSxyPT09dm9pZCAwfHx6ZS4kaXNSb290Tm9kZShyKXx8cy5wdXNoKHIpKTtyZXR1cm4gcy5sZW5ndGg9PT0wPzA6MTxzLmxlbmd0aD8ocj10Ll9ub2RlTWFwLHQ9ci5nZXQoaS5hbmNob3Iua2V5KSxsPXIuZ2V0KGwuYW5jaG9yLmtleSksdCYmbCYmIWUuX25vZGVNYXAuaGFzKHQuX19rZXkpJiZ6ZS4kaXNUZXh0Tm9kZSh0KSYmdC5fX3RleHQubGVuZ3RoPT09MSYmaS5hbmNob3Iub2Zmc2V0PT09MT8yOjApOih0PXNbMF0sZT1lLl9ub2RlTWFwLmdldCh0Ll9fa2V5KSwhemUuJGlzVGV4dE5vZGUoZSl8fCF6ZS4kaXNUZXh0Tm9kZSh0KXx8ZS5fX21vZGUhPT10Ll9fbW9kZXx8KGU9ZS5fX3RleHQsdD10Ll9fdGV4dCxlPT09dCl8fChpPWkuYW5jaG9yLGw9bC5hbmNob3IsaS5rZXkhPT1sLmtleXx8aS50eXBlIT09InRleHQiKT8wOihpPWkub2Zmc2V0LGw9bC5vZmZzZXQsZT10Lmxlbmd0aC1lLmxlbmd0aCxlPT09MSYmbD09PWktMT8yOmU9PT0tMSYmbD09PWkrMT8zOmU9PT0tMSYmbD09PWk/NDowKSl9ZnVuY3Rpb24geDIoZSx0KXtsZXQgbj1EYXRlLm5vdygpLHI9MDtyZXR1cm4obyxpLGwscyxhLHUpPT57bGV0IGM9RGF0ZS5ub3coKTtpZih1LmhhcygiaGlzdG9yaWMiKSlyZXR1cm4gcj0wLG49YywyO2xldCBkPXkyKG8saSxzLGEsZS5pc0NvbXBvc2luZygpKSxmPSgoKT0+e3ZhciBoPWw9PT1udWxsfHxsLmVkaXRvcj09PWUsZz11LmhhcygiaGlzdG9yeS1wdXNoIik7aWYoIWcmJmgmJnUuaGFzKCJoaXN0b3J5LW1lcmdlIikpcmV0dXJuIDA7aWYobz09PW51bGwpcmV0dXJuIDE7dmFyIG09aS5fc2VsZWN0aW9uO2lmKCEoMDxzLnNpemV8fDA8YS5zaXplKSlyZXR1cm4gbSE9PW51bGw/MDoyO2lmKGc9PT0hMSYmZCE9PTAmJmQ9PT1yJiZjPG4rdCYmaClyZXR1cm4gMDtpZihzLnNpemU9PT0xKXt7Zz1BcnJheS5mcm9tKHMpWzBdLGg9by5fbm9kZU1hcC5nZXQoZyksZz1pLl9ub2RlTWFwLmdldChnKSxtPW8uX3NlbGVjdGlvbjtsZXQgUz1pLl9zZWxlY3Rpb24sdj0hMTt6ZS4kaXNSYW5nZVNlbGVjdGlvbihtKSYmemUuJGlzUmFuZ2VTZWxlY3Rpb24oUykmJih2PW0uYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJm0uZm9jdXMudHlwZT09PSJlbGVtZW50IiYmUy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmUy5mb2N1cy50eXBlPT09InRleHQiKSxoPSF2JiZ6ZS4kaXNUZXh0Tm9kZShoKSYmemUuJGlzVGV4dE5vZGUoZyk/aC5fX3R5cGU9PT1nLl9fdHlwZSYmaC5fX3RleHQ9PT1nLl9fdGV4dCYmaC5fX21vZGU9PT1nLl9fbW9kZSYmaC5fX2RldGFpbD09PWcuX19kZXRhaWwmJmguX19zdHlsZT09PWcuX19zdHlsZSYmaC5fX2Zvcm1hdD09PWcuX19mb3JtYXQmJmguX19wYXJlbnQ9PT1nLl9fcGFyZW50OiExfWlmKGgpcmV0dXJuIDB9cmV0dXJuIDF9KSgpO3JldHVybiBuPWMscj1kLGZ9fWVtLmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbCxyZWRvU3RhY2s6W10sdW5kb1N0YWNrOltdfX07ZW0ucmVnaXN0ZXJIaXN0b3J5PWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj14MihlLG4pO249KHtlZGl0b3JTdGF0ZTpsLHByZXZFZGl0b3JTdGF0ZTpzLGRpcnR5TGVhdmVzOmEsZGlydHlFbGVtZW50czp1LHRhZ3M6Y30pPT57Y29uc3QgZD10LmN1cnJlbnQsZj10LnJlZG9TdGFjayxoPXQudW5kb1N0YWNrLGc9ZD09PW51bGw/bnVsbDpkLmVkaXRvclN0YXRlO2lmKGQ9PT1udWxsfHxsIT09Zyl7aWYocz1yKHMsbCxkLGEsdSxjKSxzPT09MSlmLmxlbmd0aCE9PTAmJih0LnJlZG9TdGFjaz1bXSxlLmRpc3BhdGNoQ29tbWFuZCh6ZS5DQU5fUkVET19DT01NQU5ELCExKSksZCE9PW51bGwmJihoLnB1c2goey4uLmR9KSxlLmRpc3BhdGNoQ29tbWFuZCh6ZS5DQU5fVU5ET19DT01NQU5ELCEwKSk7ZWxzZSBpZihzPT09MilyZXR1cm47dC5jdXJyZW50PXtlZGl0b3I6ZSxlZGl0b3JTdGF0ZTpsfX19O2xldCBvPXYyLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoemUuVU5ET19DT01NQU5ELCgpPT57bGV0IGw9dC5yZWRvU3RhY2sscz10LnVuZG9TdGFjaztpZihzLmxlbmd0aCE9PTApe2xldCBhPXQuY3VycmVudCx1PXMucG9wKCk7YSE9PW51bGwmJihsLnB1c2goYSksZS5kaXNwYXRjaENvbW1hbmQoemUuQ0FOX1JFRE9fQ09NTUFORCwhMCkpLHMubGVuZ3RoPT09MCYmZS5kaXNwYXRjaENvbW1hbmQoemUuQ0FOX1VORE9fQ09NTUFORCwhMSksdC5jdXJyZW50PXV8fG51bGwsdSYmdS5lZGl0b3Iuc2V0RWRpdG9yU3RhdGUodS5lZGl0b3JTdGF0ZSx7dGFnOiJoaXN0b3JpYyJ9KX1yZXR1cm4hMH0semUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKHplLlJFRE9fQ09NTUFORCwoKT0+e2xldCBsPXQucmVkb1N0YWNrO3ZhciBzPXQudW5kb1N0YWNrO2lmKGwubGVuZ3RoIT09MCl7bGV0IGE9dC5jdXJyZW50O2EhPT1udWxsJiYocy5wdXNoKGEpLGUuZGlzcGF0Y2hDb21tYW5kKHplLkNBTl9VTkRPX0NPTU1BTkQsITApKSxzPWwucG9wKCksbC5sZW5ndGg9PT0wJiZlLmRpc3BhdGNoQ29tbWFuZCh6ZS5DQU5fUkVET19DT01NQU5ELCExKSx0LmN1cnJlbnQ9c3x8bnVsbCxzJiZzLmVkaXRvci5zZXRFZGl0b3JTdGF0ZShzLmVkaXRvclN0YXRlLHt0YWc6Imhpc3RvcmljIn0pfXJldHVybiEwfSx6ZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoemUuQ0xFQVJfRURJVE9SX0NPTU1BTkQsKCk9Pih0LnVuZG9TdGFjaz1bXSx0LnJlZG9TdGFjaz1bXSx0LmN1cnJlbnQ9bnVsbCwhMSksemUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKHplLkNMRUFSX0hJU1RPUllfQ09NTUFORCwoKT0+KHQudW5kb1N0YWNrPVtdLHQucmVkb1N0YWNrPVtdLHQuY3VycmVudD1udWxsLGUuZGlzcGF0Y2hDb21tYW5kKHplLkNBTl9SRURPX0NPTU1BTkQsITEpLGUuZGlzcGF0Y2hDb21tYW5kKHplLkNBTl9VTkRPX0NPTU1BTkQsITEpLCEwKSx6ZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKG4pKSxpPWUucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcihuKTtyZXR1cm4oKT0+e28oKSxpKCl9fTtjb25zdCBfMj1lbTt2YXIgdzI9XzIsUzI9bnIsaXA9dzIsSXk9cDtmdW5jdGlvbiBFMihlLHQsbj0xZTMpe2xldCByPUl5LnVzZU1lbW8oKCk9PnR8fGlwLmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlKCksW3RdKTtJeS51c2VFZmZlY3QoKCk9PmlwLnJlZ2lzdGVySGlzdG9yeShlLHIsbiksW24sZSxyXSl9cWcuY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU9aXAuY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU7cWcuSGlzdG9yeVBsdWdpbj1mdW5jdGlvbih7ZXh0ZXJuYWxIaXN0b3J5U3RhdGU6ZX0pe2xldFt0XT1TMi51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIEUyKHQsZSksbnVsbH07Y29uc3QgQzI9cWc7dmFyICQyPUMyLHRTPXt9LGsyPW5yLEZzPXAsVDI9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiP0ZzLnVzZUxheW91dEVmZmVjdDpGcy51c2VFZmZlY3Q7ZnVuY3Rpb24gTjIoZSl7bGV0W3RdPWsyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxuPUZzLnVzZU1lbW8oKCk9PmUodCksW3QsZV0pLHI9RnMudXNlUmVmKG4uaW5pdGlhbFZhbHVlRm4oKSksW28saV09RnMudXNlU3RhdGUoci5jdXJyZW50KTtyZXR1cm4gVDIoKCk9PntsZXR7aW5pdGlhbFZhbHVlRm46bCxzdWJzY3JpYmU6c309bixhPWwoKTtyZXR1cm4gci5jdXJyZW50IT09YSYmKHIuY3VycmVudD1hLGkoYSkpLHModT0+e3IuY3VycmVudD11LGkodSl9KX0sW24sZV0pLG99ZnVuY3Rpb24gYjIoZSl7cmV0dXJue2luaXRpYWxWYWx1ZUZuOigpPT5lLmlzRWRpdGFibGUoKSxzdWJzY3JpYmU6dD0+ZS5yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIodCl9fXZhciBSMj1mdW5jdGlvbigpe3JldHVybiBOMihiMil9O2NvbnN0IFAyPVIyO3ZhciBPMj1QMixGbz17fSxYdD1nZTtmdW5jdGlvbiB0bShlLHQ9ITApe3JldHVybiBlPyExOihlPW5TKCksdCYmKGU9ZS50cmltKCkpLGU9PT0iIil9ZnVuY3Rpb24gblMoKXtyZXR1cm4gWHQuJGdldFJvb3QoKS5nZXRUZXh0Q29udGVudCgpfWZ1bmN0aW9uIHJTKGUpe2lmKCF0bShlLCExKSlyZXR1cm4hMTtlPVh0LiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtsZXQgdD1lLmxlbmd0aDtpZigxPHQpcmV0dXJuITE7Zm9yKGxldCByPTA7cjx0O3IrKyl7dmFyIG49ZVtyXTtpZihYdC4kaXNEZWNvcmF0b3JOb2RlKG4pKXJldHVybiExO2lmKFh0LiRpc0VsZW1lbnROb2RlKG4pKXtpZighWHQuJGlzUGFyYWdyYXBoTm9kZShuKXx8bi5fX2luZGVudCE9PTApcmV0dXJuITE7bj1uLmdldENoaWxkcmVuKCk7bGV0IG89bi5sZW5ndGg7Zm9yKGxldCBpPTA7aTxvO2krKylpZighWHQuJGlzVGV4dE5vZGUobltyXSkpcmV0dXJuITF9fXJldHVybiEwfUZvLiRjYW5TaG93UGxhY2Vob2xkZXI9clM7Rm8uJGNhblNob3dQbGFjZWhvbGRlckN1cnJ5PWZ1bmN0aW9uKGUpe3JldHVybigpPT5yUyhlKX07Rm8uJGZpbmRUZXh0SW50ZXJzZWN0aW9uRnJvbUNoYXJhY3RlcnM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldEZpcnN0Q2hpbGQoKTtlPTA7ZTpmb3IoO24hPT1udWxsOyl7aWYoWHQuJGlzRWxlbWVudE5vZGUobikpe3ZhciByPW4uZ2V0Rmlyc3RDaGlsZCgpO2lmKHIhPT1udWxsKXtuPXI7Y29udGludWV9fWVsc2UgaWYoWHQuJGlzVGV4dE5vZGUobikpe2lmKHI9bi5nZXRUZXh0Q29udGVudFNpemUoKSxlK3I+dClyZXR1cm57bm9kZTpuLG9mZnNldDp0LWV9O2UrPXJ9aWYocj1uLmdldE5leHRTaWJsaW5nKCksciE9PW51bGwpbj1yO2Vsc2V7Zm9yKG49bi5nZXRQYXJlbnQoKTtuIT09bnVsbDspe2lmKHI9bi5nZXROZXh0U2libGluZygpLHIhPT1udWxsKXtuPXI7Y29udGludWUgZX1uPW4uZ2V0UGFyZW50KCl9YnJlYWt9fXJldHVybiBudWxsfTtGby4kaXNSb290VGV4dENvbnRlbnRFbXB0eT10bTtGby4kaXNSb290VGV4dENvbnRlbnRFbXB0eUN1cnJ5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuKCk9PnRtKGUsdCl9O0ZvLiRyb290VGV4dENvbnRlbnQ9blM7Rm8ucmVnaXN0ZXJMZXhpY2FsVGV4dEVudGl0eT1mdW5jdGlvbihlLHQsbixyKXtsZXQgbz1sPT57Y29uc3Qgcz1YdC4kY3JlYXRlVGV4dE5vZGUobC5nZXRUZXh0Q29udGVudCgpKTtzLnNldEZvcm1hdChsLmdldEZvcm1hdCgpKSxsLnJlcGxhY2Uocyl9LGk9ZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0oWHQuVGV4dE5vZGUsbD0+e2lmKGwuaXNTaW1wbGVUZXh0KCkpe3ZhciBzPWwuZ2V0UHJldmlvdXNTaWJsaW5nKCksYT1sLmdldFRleHRDb250ZW50KCksdT1sO2lmKFh0LiRpc1RleHROb2RlKHMpKXt2YXIgYz1zLmdldFRleHRDb250ZW50KCksZD10KGMrYSk7aWYocyBpbnN0YW5jZW9mIG4pe2lmKGQ9PT1udWxsfHxzLmdldExhdGVzdCgpLl9fbW9kZSE9PTApe28ocyk7cmV0dXJufWlmKGQ9ZC5lbmQtYy5sZW5ndGgsMDxkKXt1PWEuc2xpY2UoMCxkKSx1PWMrdSxzLnNlbGVjdCgpLHMuc2V0VGV4dENvbnRlbnQodSksZD09PWEubGVuZ3RoP2wucmVtb3ZlKCk6KHM9YS5zbGljZShkKSxsLnNldFRleHRDb250ZW50KHMpKTtyZXR1cm59fWVsc2UgaWYoZD09PW51bGx8fGQuc3RhcnQ8Yy5sZW5ndGgpcmV0dXJufWZvcig7Oyl7aWYobD10KGEpLGE9ZD1sPT09bnVsbD8iIjphLnNsaWNlKGwuZW5kKSxkPT09IiIpe2lmKGM9dS5nZXROZXh0U2libGluZygpLFh0LiRpc1RleHROb2RlKGMpKXtpZihkPXUuZ2V0VGV4dENvbnRlbnQoKStjLmdldFRleHRDb250ZW50KCksZD10KGQpLGQ9PT1udWxsKXtjIGluc3RhbmNlb2Ygbj9vKGMpOmMubWFya0RpcnR5KCk7YnJlYWt9ZWxzZSBpZihkLnN0YXJ0IT09MClicmVha319ZWxzZSBpZihjPXQoZCksYyE9PW51bGwmJmMuc3RhcnQ9PT0wKWJyZWFrO2lmKGw9PT1udWxsKWJyZWFrO2lmKGwuc3RhcnQ9PT0wJiZYdC4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSljb250aW51ZTtsZXQgZjtpZihsLnN0YXJ0PT09MD9bZix1XT11LnNwbGl0VGV4dChsLmVuZCk6WyxmLHVdPXUuc3BsaXRUZXh0KGwuc3RhcnQsbC5lbmQpLGw9cihmKSxsLnNldEZvcm1hdChmLmdldEZvcm1hdCgpKSxmLnJlcGxhY2UobCksdT09bnVsbClicmVha319fSk7cmV0dXJuIGU9ZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0obixsPT57dmFyIHM9bC5nZXRUZXh0Q29udGVudCgpO2NvbnN0IGE9dChzKTthPT09bnVsbHx8YS5zdGFydCE9PTA/byhsKTpzLmxlbmd0aD5hLmVuZD9sLnNwbGl0VGV4dChhLmVuZCk6KHM9bC5nZXRQcmV2aW91c1NpYmxpbmcoKSxYdC4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSYmKG8ocyksbyhsKSkscz1sLmdldE5leHRTaWJsaW5nKCksWHQuJGlzVGV4dE5vZGUocykmJnMuaXNUZXh0RW50aXR5KCkmJihvKHMpLGwgaW5zdGFuY2VvZiBuJiZvKGwpKSl9KSxbaSxlXX07Y29uc3QgQTI9Rm87dmFyIE0yPUEyLG9TPXt9LGh1PWdlO29TLnJlZ2lzdGVyRHJhZ29uU3VwcG9ydD1mdW5jdGlvbihlKXtsZXQgdD13aW5kb3cubG9jYXRpb24ub3JpZ2luLG49cj0+e2lmKHIub3JpZ2luPT09dCl7dmFyIG89ZS5nZXRSb290RWxlbWVudCgpO2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1vJiYobz1yLmRhdGEsdHlwZW9mIG89PSJzdHJpbmciKSl7dHJ5e3ZhciBpPUpTT04ucGFyc2Uobyl9Y2F0Y2h7cmV0dXJufWlmKGkmJmkucHJvdG9jb2w9PT0ibnVhbnJpYV9tZXNzYWdpbmciJiZpLnR5cGU9PT0icmVxdWVzdCImJihpPWkucGF5bG9hZCkmJmkuZnVuY3Rpb25JZD09PSJtYWtlQ2hhbmdlcyImJihpPWkuYXJncykpe2NvbnN0W2wscyxhLHUsY109aTtlLnVwZGF0ZSgoKT0+e2NvbnN0IGQ9aHUuJGdldFNlbGVjdGlvbigpO2lmKGh1LiRpc1JhbmdlU2VsZWN0aW9uKGQpKXt2YXIgZj1kLmFuY2hvcjtsZXQgaD1mLmdldE5vZGUoKSxnPTAsbT0wO2h1LiRpc1RleHROb2RlKGgpJiYwPD1sJiYwPD1zJiYoZz1sLG09bCtzLGQuc2V0VGV4dE5vZGVSYW5nZShoLGcsaCxtKSksKGchPT1tfHxhIT09IiIpJiYoZC5pbnNlcnRSYXdUZXh0KGEpLGg9Zi5nZXROb2RlKCkpLGh1LiRpc1RleHROb2RlKGgpJiYoZz11LG09dStjLGY9aC5nZXRUZXh0Q29udGVudFNpemUoKSxnPWc+Zj9mOmcsbT1tPmY/ZjptLGQuc2V0VGV4dE5vZGVSYW5nZShoLGcsaCxtKSksci5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX19KX19fX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuLCEwKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuLCEwKX19O2NvbnN0IEQyPW9TO3ZhciBMMj1EMiwkcj17fSxZcj17fSxubT17fSxqeT1PbyxJMj1OdCx0bD1nZTtmdW5jdGlvbiBpUyhlLHQsbixyPW51bGwpe2xldCBvPXIhPW51bGw/dC5pc1NlbGVjdGVkKHIpOiEwLGk9dGwuJGlzRWxlbWVudE5vZGUodCkmJnQuZXhjbHVkZUZyb21Db3B5KCJodG1sIik7dmFyIGw9dDtyIT09bnVsbCYmKGw9ankuJGNsb25lV2l0aFByb3BlcnRpZXModCksbD10bC4kaXNUZXh0Tm9kZShsKSYmciE9bnVsbD9qeS4kc2xpY2VTZWxlY3RlZFRleHROb2RlQ29udGVudChyLGwpOmwpO2xldCBzPXRsLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXSx7ZWxlbWVudDphLGFmdGVyOnV9PWwuZXhwb3J0RE9NKGUpO2lmKCFhKXJldHVybiExO2xldCBjPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IobGV0IGQ9MDtkPHMubGVuZ3RoO2QrKyl7bGV0IGY9c1tkXSxoPWlTKGUsZixjLHIpOyFvJiZ0bC4kaXNFbGVtZW50Tm9kZSh0KSYmaCYmdC5leHRyYWN0V2l0aENoaWxkKGYsciwiaHRtbCIpJiYobz0hMCl9cmV0dXJuIG8mJiFpPyhJMi5pc0hUTUxFbGVtZW50KGEpJiZhLmFwcGVuZChjKSxuLmFwcGVuZChhKSx1JiYoZT11LmNhbGwobCxhKSkmJmEucmVwbGFjZVdpdGgoZSkpOm4uYXBwZW5kKGMpLG99bGV0IGxTPW5ldyBTZXQoWyJTVFlMRSIsIlNDUklQVCJdKTtmdW5jdGlvbiBzUyhlLHQsbj1uZXcgTWFwLHIpe2xldCBvPVtdO2lmKGxTLmhhcyhlLm5vZGVOYW1lKSlyZXR1cm4gbztsZXQgaT1udWxsO3ZhciBsLHtub2RlTmFtZTpzfT1lLGE9dC5faHRtbENvbnZlcnNpb25zLmdldChzLnRvTG93ZXJDYXNlKCkpO2lmKHM9bnVsbCxhIT09dm9pZCAwKWZvcihsIG9mIGEpYT1sKGUpLGEhPT1udWxsJiYocz09PW51bGx8fHMucHJpb3JpdHk8YS5wcmlvcml0eSkmJihzPWEpO2lmKHM9KGw9cyE9PW51bGw/cy5jb252ZXJzaW9uOm51bGwpP2woZSk6bnVsbCxsPW51bGwscyE9PW51bGwpe2lmKGw9cy5hZnRlcixhPXMubm9kZSxpPUFycmF5LmlzQXJyYXkoYSk/YVthLmxlbmd0aC0xXTphLGkhPT1udWxsKXtmb3IodmFyWyx1XW9mIG4paWYoaT11KGksciksIWkpYnJlYWs7aSYmby5wdXNoKC4uLkFycmF5LmlzQXJyYXkoYSk/YTpbaV0pfXMuZm9yQ2hpbGQhPW51bGwmJm4uc2V0KGUubm9kZU5hbWUscy5mb3JDaGlsZCl9Zm9yKGU9ZS5jaGlsZE5vZGVzLHI9W10sdT0wO3U8ZS5sZW5ndGg7dSsrKXIucHVzaCguLi5zUyhlW3VdLHQsbmV3IE1hcChuKSxpKSk7cmV0dXJuIGwhPW51bGwmJihyPWwocikpLGk9PW51bGw/bz1vLmNvbmNhdChyKTp0bC4kaXNFbGVtZW50Tm9kZShpKSYmaS5hcHBlbmQoLi4uciksb31ubS4kZ2VuZXJhdGVIdG1sRnJvbU5vZGVzPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdz4idSIpdGhyb3cgRXJyb3IoIlRvIHVzZSAkZ2VuZXJhdGVIdG1sRnJvbU5vZGVzIGluIGhlYWRsZXNzIG1vZGUgcGxlYXNlIGluaXRpYWxpemUgYSBoZWFkbGVzcyBicm93c2VyIGltcGxlbWVudGF0aW9uIHN1Y2ggYXMgSlNEb20gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4iKTtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxyPXRsLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKylpUyhlLHJbb10sbix0KTtyZXR1cm4gbi5pbm5lckhUTUx9O25tLiRnZW5lcmF0ZU5vZGVzRnJvbURPTT1mdW5jdGlvbihlLHQpe3Q9dC5ib2R5P3QuYm9keS5jaGlsZE5vZGVzOltdO2xldCBuPVtdO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXt2YXIgcj10W29dO2xTLmhhcyhyLm5vZGVOYW1lKXx8KHI9c1MocixlKSxyIT09bnVsbCYmKG49bi5jb25jYXQocikpKX1yZXR1cm4gbn07Y29uc3QgajI9bm07dmFyIHoyPWoyLGFTPXoyLGxwPU9vLGZsPU50LHVlPWdlO2Z1bmN0aW9uIEFyKGUpe2xldCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7dC5hcHBlbmQoImNvZGUiLGUpO2ZvcihsZXQgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5hcHBlbmQoInYiLGFyZ3VtZW50c1tuXSk7dGhyb3cgRXJyb3IoYE1pbmlmaWVkIExleGljYWwgZXJyb3IgIyR7ZX07IHZpc2l0IGh0dHBzOi8vbGV4aWNhbC5kZXYvZG9jcy9lcnJvcj8ke3R9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5gKX1sZXQgdVM9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiO2Z1bmN0aW9uIGNTKGUpe2xldCB0PXVlLiRnZXRTZWxlY3Rpb24oKTtpZih0PT1udWxsKXRocm93IEVycm9yKCJFeHBlY3RlZCB2YWxpZCBMZXhpY2FsU2VsZWN0aW9uIik7cmV0dXJuIHVlLiRpc1JhbmdlU2VsZWN0aW9uKHQpJiZ0LmlzQ29sbGFwc2VkKCl8fHQuZ2V0Tm9kZXMoKS5sZW5ndGg9PT0wPyIiOmFTLiRnZW5lcmF0ZUh0bWxGcm9tTm9kZXMoZSx0KX1mdW5jdGlvbiBkUyhlKXtsZXQgdD11ZS4kZ2V0U2VsZWN0aW9uKCk7aWYodD09bnVsbCl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdmFsaWQgTGV4aWNhbFNlbGVjdGlvbiIpO3JldHVybiB1ZS4kaXNSYW5nZVNlbGVjdGlvbih0KSYmdC5pc0NvbGxhcHNlZCgpfHx0LmdldE5vZGVzKCkubGVuZ3RoPT09MD9udWxsOkpTT04uc3RyaW5naWZ5KGhTKGUsdCkpfWZ1bmN0aW9uIHNwKGUsdCxuKXsodWUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pfHxmbC4kZmluZE1hdGNoaW5nUGFyZW50KG4uYW5jaG9yLmdldE5vZGUoKSxyPT51ZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShyKSkhPT1udWxsJiZmbC4kZmluZE1hdGNoaW5nUGFyZW50KG4uZm9jdXMuZ2V0Tm9kZSgpLHI9PnVlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKHIpKSE9PW51bGwpJiZ0Lmxlbmd0aD09PTEmJnVlLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUodFswXSk/QjIodCxuLCExLGUpOkYyKHQsbil9ZnVuY3Rpb24gRjIoZSx0KXtsZXQgbj1bXSxyPW51bGw7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspe2xldCBpPWVbb10sbD11ZS4kaXNMaW5lQnJlYWtOb2RlKGkpO2lmKGx8fHVlLiRpc0RlY29yYXRvck5vZGUoaSkmJmkuaXNJbmxpbmUoKXx8dWUuJGlzRWxlbWVudE5vZGUoaSkmJmkuaXNJbmxpbmUoKXx8dWUuJGlzVGV4dE5vZGUoaSl8fGkuaXNQYXJlbnRSZXF1aXJlZCgpKXtpZihyPT09bnVsbCYmKHI9aS5jcmVhdGVQYXJlbnRFbGVtZW50Tm9kZSgpLG4ucHVzaChyKSxsKSljb250aW51ZTtyIT09bnVsbCYmci5hcHBlbmQoaSl9ZWxzZSBuLnB1c2goaSkscj1udWxsfXVlLiRpc1JhbmdlU2VsZWN0aW9uKHQpP3QuaW5zZXJ0Tm9kZXMobik6dWUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKHQpJiYoZT10LmFuY2hvci5nZXROb2RlKCksdWUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUoZSl8fEFyKDQxKSxlLmFwcGVuZCguLi5uKSl9ZnVuY3Rpb24gQjIoZSx0LG4scil7ZS5sZW5ndGg9PT0xJiZ1ZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKGVbMF0pfHxBcig0Mik7dmFyIG89ZVswXTtlPW8uZ2V0Q2hpbGRyZW4oKSxuPW8uZ2V0Rmlyc3RDaGlsZE9yVGhyb3coKS5nZXRDaGlsZHJlblNpemUoKTt2YXIgaT1vLmdldENoaWxkcmVuU2l6ZSgpLGw9ZmwuJGZpbmRNYXRjaGluZ1BhcmVudCh0LmFuY2hvci5nZXROb2RlKCksaD0+dWUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUoaCkpO3Q9KG89bCYmZmwuJGZpbmRNYXRjaGluZ1BhcmVudChsLGg9PnVlLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoaCkpKSYmZmwuJGZpbmRNYXRjaGluZ1BhcmVudChvLGg9PnVlLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUoaCkpLHVlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGwpJiZ1ZS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKG8pJiZ1ZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKHQpfHxBcig0Myk7dmFyIHM9by5nZXRJbmRleFdpdGhpblBhcmVudCgpLGE9TWF0aC5taW4odC5nZXRDaGlsZHJlblNpemUoKS0xLHMraS0xKTtpPWwuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxsPU1hdGgubWluKG8uZ2V0Q2hpbGRyZW5TaXplKCktMSxpK24tMSksbj1NYXRoLm1pbihpLGwpLG89TWF0aC5taW4ocyxhKSxpPU1hdGgubWF4KGksbCkscz1NYXRoLm1heChzLGEpLGE9dC5nZXRDaGlsZHJlbigpLGw9MDtsZXQgdSxjO2ZvcihsZXQgaD1vO2g8PXM7aCsrKXt2YXIgZD1hW2hdO3VlLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoZCl8fEFyKDI0KTt2YXIgZj1lW2xdO3VlLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoZil8fEFyKDI0KSxkPWQuZ2V0Q2hpbGRyZW4oKSxmPWYuZ2V0Q2hpbGRyZW4oKTtsZXQgZz0wO2ZvcihsZXQgbT1uO208PWk7bSsrKXtsZXQgUz1kW21dO3VlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKFMpfHxBcigyNSk7bGV0IHY9ZltnXTt1ZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZSh2KXx8QXIoMjUpLGg9PT1vJiZtPT09bj91PVMuZ2V0S2V5KCk6aD09PXMmJm09PT1pJiYoYz1TLmdldEtleSgpKTtsZXQgeT1TLmdldENoaWxkcmVuKCk7di5nZXRDaGlsZHJlbigpLmZvckVhY2goeD0+e3VlLiRpc1RleHROb2RlKHgpJiZ1ZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLmFwcGVuZCh4KSxTLmFwcGVuZCh4KX0pLHkuZm9yRWFjaCh4PT54LnJlbW92ZSgpKSxnKyt9bCsrfXUmJmMmJihlPXVlLkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb24oKSxlLnNldCh0LmdldEtleSgpLHUsYyksdWUuJHNldFNlbGVjdGlvbihlKSxyLmRpc3BhdGNoQ29tbWFuZCh1ZS5TRUxFQ1RJT05fQ0hBTkdFX0NPTU1BTkQsdm9pZCAwKSl9ZnVuY3Rpb24gZlMoZSx0LG4scj1bXSl7bGV0IG89dCE9bnVsbD9uLmlzU2VsZWN0ZWQodCk6ITAsaT11ZS4kaXNFbGVtZW50Tm9kZShuKSYmbi5leGNsdWRlRnJvbUNvcHkoImh0bWwiKTt2YXIgbD1uO2lmKHQhPT1udWxsKXt2YXIgcz1scC4kY2xvbmVXaXRoUHJvcGVydGllcyhuKTtsPXM9dWUuJGlzVGV4dE5vZGUocykmJnQhPW51bGw/bHAuJHNsaWNlU2VsZWN0ZWRUZXh0Tm9kZUNvbnRlbnQodCxzKTpzfWxldCBhPXVlLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXTt2YXIgdT1sO3M9dS5leHBvcnRKU09OKCk7dmFyIGM9dS5jb25zdHJ1Y3RvcjtzLnR5cGUhPT1jLmdldFR5cGUoKSYmQXIoNTgsYy5uYW1lKTtsZXQgZD1zLmNoaWxkcmVuO2Zvcih1ZS4kaXNFbGVtZW50Tm9kZSh1KSYmKEFycmF5LmlzQXJyYXkoZCl8fEFyKDU5LGMubmFtZSkpLHVlLiRpc1RleHROb2RlKGwpJiYobD1sLl9fdGV4dCwwPGwubGVuZ3RoP3MudGV4dD1sOm89ITEpLGw9MDtsPGEubGVuZ3RoO2wrKyl1PWFbbF0sYz1mUyhlLHQsdSxzLmNoaWxkcmVuKSwhbyYmdWUuJGlzRWxlbWVudE5vZGUobikmJmMmJm4uZXh0cmFjdFdpdGhDaGlsZCh1LHQsImNsb25lIikmJihvPSEwKTtpZihvJiYhaSlyLnB1c2gocyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHMuY2hpbGRyZW4pKWZvcihlPTA7ZTxzLmNoaWxkcmVuLmxlbmd0aDtlKyspci5wdXNoKHMuY2hpbGRyZW5bZV0pO3JldHVybiBvfWZ1bmN0aW9uIGhTKGUsdCl7bGV0IG49W10scj11ZS4kZ2V0Um9vdCgpLmdldENoaWxkcmVuKCk7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKyspZlMoZSx0LHJbb10sbik7cmV0dXJue25hbWVzcGFjZTplLl9jb25maWcubmFtZXNwYWNlLG5vZGVzOm59fWZ1bmN0aW9uIHBTKGUpe2xldCB0PVtdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj11ZS4kcGFyc2VTZXJpYWxpemVkTm9kZShlW25dKTt1ZS4kaXNUZXh0Tm9kZShyKSYmbHAuJGFkZE5vZGVTdHlsZShyKSx0LnB1c2gocil9cmV0dXJuIHR9bGV0IEFpPW51bGw7ZnVuY3Rpb24genkoZSx0KXt2YXIgbj11Uz8oZS5fd2luZG93fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpOm51bGw7aWYoIW4pcmV0dXJuITE7dmFyIHI9bi5hbmNob3JOb2RlO2lmKG49bi5mb2N1c05vZGUsciE9PW51bGwmJm4hPT1udWxsJiYhdWUuaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3IoZSxyLG4pfHwodC5wcmV2ZW50RGVmYXVsdCgpLHQ9dC5jbGlwYm9hcmREYXRhLHI9dWUuJGdldFNlbGVjdGlvbigpLHQ9PT1udWxsfHxyPT09bnVsbCkpcmV0dXJuITE7bj1jUyhlKSxlPWRTKGUpO2xldCBvPSIiO3JldHVybiByIT09bnVsbCYmKG89ci5nZXRUZXh0Q29udGVudCgpKSxuIT09bnVsbCYmdC5zZXREYXRhKCJ0ZXh0L2h0bWwiLG4pLGUhPT1udWxsJiZ0LnNldERhdGEoImFwcGxpY2F0aW9uL3gtbGV4aWNhbC1lZGl0b3IiLGUpLHQuc2V0RGF0YSgidGV4dC9wbGFpbiIsbyksITB9WXIuJGdlbmVyYXRlSlNPTkZyb21TZWxlY3RlZE5vZGVzPWhTO1lyLiRnZW5lcmF0ZU5vZGVzRnJvbVNlcmlhbGl6ZWROb2Rlcz1wUztZci4kZ2V0SHRtbENvbnRlbnQ9Y1M7WXIuJGdldExleGljYWxDb250ZW50PWRTO1lyLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JQbGFpblRleHQ9ZnVuY3Rpb24oZSx0KXtlPWUuZ2V0RGF0YSgidGV4dC9wbGFpbiIpfHxlLmdldERhdGEoInRleHQvdXJpLWxpc3QiKSxlIT1udWxsJiZ0Lmluc2VydFJhd1RleHQoZSl9O1lyLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JSaWNoVGV4dD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXREYXRhKCJhcHBsaWNhdGlvbi94LWxleGljYWwtZWRpdG9yIik7aWYocil0cnl7bGV0IGw9SlNPTi5wYXJzZShyKTtpZihsLm5hbWVzcGFjZT09PW4uX2NvbmZpZy5uYW1lc3BhY2UmJkFycmF5LmlzQXJyYXkobC5ub2Rlcykpe2xldCBzPXBTKGwubm9kZXMpO3JldHVybiBzcChuLHMsdCl9fWNhdGNoe31pZihyPWUuZ2V0RGF0YSgidGV4dC9odG1sIikpdHJ5e3ZhciBvPW5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcociwidGV4dC9odG1sIiksaT1hUy4kZ2VuZXJhdGVOb2Rlc0Zyb21ET00obixvKTtyZXR1cm4gc3AobixpLHQpfWNhdGNoe31pZihlPWUuZ2V0RGF0YSgidGV4dC9wbGFpbiIpfHxlLmdldERhdGEoInRleHQvdXJpLWxpc3QiKSxlIT1udWxsKWlmKHVlLiRpc1JhbmdlU2VsZWN0aW9uKHQpKWZvcihlPWUuc3BsaXQoLyhccj9cbnxcdCkvKSxuPWUubGVuZ3RoLG89MDtvPG47bysrKWk9ZVtvXSxpPT09YApgfHxpPT09YFxyCmA/dC5pbnNlcnRQYXJhZ3JhcGgoKTppPT09IgkiP3QuaW5zZXJ0Tm9kZXMoW3VlLiRjcmVhdGVUYWJOb2RlKCldKTp0Lmluc2VydFRleHQoaSk7ZWxzZSB0Lmluc2VydFJhd1RleHQoZSl9O1lyLiRpbnNlcnRHZW5lcmF0ZWROb2Rlcz1zcDtZci5jb3B5VG9DbGlwYm9hcmQ9YXN5bmMgZnVuY3Rpb24oZSx0KXtpZihBaSE9PW51bGwpcmV0dXJuITE7aWYodCE9PW51bGwpcmV0dXJuIG5ldyBQcm9taXNlKGw9PntlLnVwZGF0ZSgoKT0+e2woenkoZSx0KSl9KX0pO3ZhciBuPWUuZ2V0Um9vdEVsZW1lbnQoKTtsZXQgcj1lLl93aW5kb3c9PW51bGw/d2luZG93LmRvY3VtZW50OmUuX3dpbmRvdy5kb2N1bWVudCxvPXVTPyhlLl93aW5kb3d8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCk6bnVsbDtpZihuPT09bnVsbHx8bz09PW51bGwpcmV0dXJuITE7bGV0IGk9ci5jcmVhdGVFbGVtZW50KCJzcGFuIik7cmV0dXJuIGkuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246IGZpeGVkOyB0b3A6IC0xMDAwcHg7IixpLmFwcGVuZChyLmNyZWF0ZVRleHROb2RlKCIjIikpLG4uYXBwZW5kKGkpLG49bmV3IFJhbmdlLG4uc2V0U3RhcnQoaSwwKSxuLnNldEVuZChpLDEpLG8ucmVtb3ZlQWxsUmFuZ2VzKCksby5hZGRSYW5nZShuKSxuZXcgUHJvbWlzZShsPT57bGV0IHM9ZS5yZWdpc3RlckNvbW1hbmQodWUuQ09QWV9DT01NQU5ELGE9PihmbC5vYmplY3RLbGFzc0VxdWFscyhhLENsaXBib2FyZEV2ZW50KSYmKHMoKSxBaSE9PW51bGwmJih3aW5kb3cuY2xlYXJUaW1lb3V0KEFpKSxBaT1udWxsKSxsKHp5KGUsYSkpKSwhMCksdWUuQ09NTUFORF9QUklPUklUWV9DUklUSUNBTCk7QWk9d2luZG93LnNldFRpbWVvdXQoKCk9PntzKCksQWk9bnVsbCxsKCExKX0sNTApLHIuZXhlY0NvbW1hbmQoImNvcHkiKSxpLnJlbW92ZSgpfSl9O2NvbnN0IFcyPVlyO3ZhciBVMj1XMixOYz1VMixwdT1Pbyxkcj1OdCxiPWdlO2Z1bmN0aW9uIEZ5KGUsdCl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50PCJ1Ij8oZT1kb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50KGUsdCksZT09PW51bGw/bnVsbDp7bm9kZTplLnN0YXJ0Q29udGFpbmVyLG9mZnNldDplLnN0YXJ0T2Zmc2V0fSk6ZG9jdW1lbnQuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCE9PSJ1bmRlZmluZWQiPyhlPWRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQoZSx0KSxlPT09bnVsbD9udWxsOntub2RlOmUub2Zmc2V0Tm9kZSxvZmZzZXQ6ZS5vZmZzZXR9KTpudWxsfWxldCBWbD10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIsVjI9VmwmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQ/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOm51bGwsSDI9VmwmJiJJbnB1dEV2ZW50ImluIHdpbmRvdyYmIVYyPyJnZXRUYXJnZXRSYW5nZXMiaW4gbmV3IHdpbmRvdy5JbnB1dEV2ZW50KCJpbnB1dCIpOiExLEsyPVZsJiYvVmVyc2lvblwvW1xkLl0rLipTYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksRzI9VmwmJi9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhd2luZG93Lk1TU3RyZWFtLFkyPVZsJiYvXig/PS4qQ2hyb21lKS4qL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxYMj1WbCYmL0FwcGxlV2ViS2l0XC9bXGQuXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFZMixhcD1iLmNyZWF0ZUNvbW1hbmQoIkRSQUdfRFJPUF9QQVNURV9GSUxFIikscm09Y2xhc3MgZ1MgZXh0ZW5kcyBiLkVsZW1lbnROb2Rle3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInF1b3RlIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBnUyh0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1jcmVhdGVET00odCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYmxvY2txdW90ZSIpO3JldHVybiBkci5hZGRDbGFzc05hbWVzVG9FbGVtZW50KG4sdC50aGVtZS5xdW90ZSksbn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue2Jsb2NrcXVvdGU6KCk9Pih7Y29udmVyc2lvbjpRMixwcmlvcml0eTowfSl9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmZHIuaXNIVE1MRWxlbWVudCh0KSl7dGhpcy5pc0VtcHR5KCkmJnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciBuPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO3Quc3R5bGUudGV4dEFsaWduPW4sKG49dGhpcy5nZXREaXJlY3Rpb24oKSkmJih0LmRpcj1uKX1yZXR1cm57ZWxlbWVudDp0fX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1vbSgpO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHR5cGU6InF1b3RlIn19aW5zZXJ0TmV3QWZ0ZXIodCxuKXt0PWIuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgcj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiB0LnNldERpcmVjdGlvbihyKSx0aGlzLmluc2VydEFmdGVyKHQsbiksdH1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgdD1iLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG49PnQuYXBwZW5kKG4pKSx0aGlzLnJlcGxhY2UodCksITB9fTtmdW5jdGlvbiBvbSgpe3JldHVybiBiLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgcm0pfWxldCBpbT1jbGFzcyBtUyBleHRlbmRzIGIuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4iaGVhZGluZyJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgbVModC5fX3RhZyx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKG4pLHRoaXMuX190YWc9dH1nZXRUYWcoKXtyZXR1cm4gdGhpcy5fX3RhZ31jcmVhdGVET00odCl7bGV0IG49dGhpcy5fX3RhZyxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobik7cmV0dXJuIHQ9dC50aGVtZS5oZWFkaW5nLHQhPT12b2lkIDAmJmRyLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQocix0W25dKSxyfXVwZGF0ZURPTSgpe3JldHVybiExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57aDE6KCk9Pih7Y29udmVyc2lvbjpNaSxwcmlvcml0eTowfSksaDI6KCk9Pih7Y29udmVyc2lvbjpNaSxwcmlvcml0eTowfSksaDM6KCk9Pih7Y29udmVyc2lvbjpNaSxwcmlvcml0eTowfSksaDQ6KCk9Pih7Y29udmVyc2lvbjpNaSxwcmlvcml0eTowfSksaDU6KCk9Pih7Y29udmVyc2lvbjpNaSxwcmlvcml0eTowfSksaDY6KCk9Pih7Y29udmVyc2lvbjpNaSxwcmlvcml0eTowfSkscDp0PT4odD10LmZpcnN0Q2hpbGQsdCE9PW51bGwmJkJ5KHQpP3tjb252ZXJzaW9uOigpPT4oe25vZGU6bnVsbH0pLHByaW9yaXR5OjN9Om51bGwpLHNwYW46dD0+QnkodCk/e2NvbnZlcnNpb246KCk9Pih7bm9kZTpubCgiaDEiKX0pLHByaW9yaXR5OjN9Om51bGx9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmZHIuaXNIVE1MRWxlbWVudCh0KSl7dGhpcy5pc0VtcHR5KCkmJnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciBuPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO3Quc3R5bGUudGV4dEFsaWduPW4sKG49dGhpcy5nZXREaXJlY3Rpb24oKSkmJih0LmRpcj1uKX1yZXR1cm57ZWxlbWVudDp0fX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1ubCh0LnRhZyk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldEluZGVudCh0LmluZGVudCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdGFnOnRoaXMuZ2V0VGFnKCksdHlwZToiaGVhZGluZyIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcih0LG49ITApe3Q9dD90LmFuY2hvci5vZmZzZXQ6MCx0PTA8dCYmdDx0aGlzLmdldFRleHRDb250ZW50U2l6ZSgpP25sKHRoaXMuZ2V0VGFnKCkpOmIuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgcj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiB0LnNldERpcmVjdGlvbihyKSx0aGlzLmluc2VydEFmdGVyKHQsbiksdH1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgdD10aGlzLmlzRW1wdHkoKT9iLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk6bmwodGhpcy5nZXRUYWcoKSk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG49PnQuYXBwZW5kKG4pKSx0aGlzLnJlcGxhY2UodCksITB9ZXh0cmFjdFdpdGhDaGlsZCgpe3JldHVybiEwfX07ZnVuY3Rpb24gQnkoZSl7cmV0dXJuIGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzcGFuIj9lLnN0eWxlLmZvbnRTaXplPT09IjI2cHQiOiExfWZ1bmN0aW9uIE1pKGUpe2xldCB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxuPW51bGw7cmV0dXJuKHQ9PT0iaDEifHx0PT09ImgyInx8dD09PSJoMyJ8fHQ9PT0iaDQifHx0PT09Img1Inx8dD09PSJoNiIpJiYobj1ubCh0KSxlLnN0eWxlIT09bnVsbCYmbi5zZXRGb3JtYXQoZS5zdHlsZS50ZXh0QWxpZ24pKSx7bm9kZTpufX1mdW5jdGlvbiBRMihlKXtsZXQgdD1vbSgpO3JldHVybiBlLnN0eWxlIT09bnVsbCYmdC5zZXRGb3JtYXQoZS5zdHlsZS50ZXh0QWxpZ24pLHtub2RlOnR9fWZ1bmN0aW9uIG5sKGUpe3JldHVybiBiLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgaW0oZSkpfWZ1bmN0aW9uIEoyKGUsdCl7ZS5wcmV2ZW50RGVmYXVsdCgpLHQudXBkYXRlKCgpPT57bGV0IG49Yi4kZ2V0U2VsZWN0aW9uKCkscj1lIGluc3RhbmNlb2YgSW5wdXRFdmVudHx8ZSBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQ/bnVsbDplLmNsaXBib2FyZERhdGE7ciE9bnVsbCYmKGIuJGlzUmFuZ2VTZWxlY3Rpb24obil8fGIuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pKSYmTmMuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KHIsbix0KX0se3RhZzoicGFzdGUifSl9YXN5bmMgZnVuY3Rpb24gWjIoZSx0KXthd2FpdCBOYy5jb3B5VG9DbGlwYm9hcmQodCxkci5vYmplY3RLbGFzc0VxdWFscyhlLENsaXBib2FyZEV2ZW50KT9lOm51bGwpLHQudXBkYXRlKCgpPT57bGV0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7Yi4kaXNSYW5nZVNlbGVjdGlvbihuKT9uLnJlbW92ZVRleHQoKTpiLiRpc05vZGVTZWxlY3Rpb24obikmJm4uZ2V0Tm9kZXMoKS5mb3JFYWNoKHI9PnIucmVtb3ZlKCkpfSl9ZnVuY3Rpb24gd3MoZSl7bGV0IHQ9bnVsbDtpZihlIGluc3RhbmNlb2YgRHJhZ0V2ZW50P3Q9ZS5kYXRhVHJhbnNmZXI6ZSBpbnN0YW5jZW9mIENsaXBib2FyZEV2ZW50JiYodD1lLmNsaXBib2FyZERhdGEpLHQ9PT1udWxsKXJldHVyblshMSxbXSwhMV07dmFyIG49dC50eXBlcztyZXR1cm4gZT1uLmluY2x1ZGVzKCJGaWxlcyIpLG49bi5pbmNsdWRlcygidGV4dC9odG1sIil8fG4uaW5jbHVkZXMoInRleHQvcGxhaW4iKSxbZSxBcnJheS5mcm9tKHQuZmlsZXMpLG5dfWZ1bmN0aW9uIFd5KGUpe3ZhciB0PWIuJGdldFNlbGVjdGlvbigpO2lmKCFiLiRpc1JhbmdlU2VsZWN0aW9uKHQpKXJldHVybiExO2xldCBuPW5ldyBTZXQ7dD10LmdldE5vZGVzKCk7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciByPXRbaV0sbz1yLmdldEtleSgpO24uaGFzKG8pfHwocj1kci4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdyhyKSxvPXIuZ2V0S2V5KCksci5jYW5JbmRlbnQoKSYmIW4uaGFzKG8pJiYobi5hZGQobyksZShyKSkpfXJldHVybiAwPG4uc2l6ZX1mdW5jdGlvbiBndShlKXtyZXR1cm4gZT1iLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKGUpLGIuJGlzRGVjb3JhdG9yTm9kZShlKX0kci4kY3JlYXRlSGVhZGluZ05vZGU9bmw7JHIuJGNyZWF0ZVF1b3RlTm9kZT1vbTskci4kaXNIZWFkaW5nTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGltfTskci4kaXNRdW90ZU5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBybX07JHIuRFJBR19EUk9QX1BBU1RFPWFwOyRyLkhlYWRpbmdOb2RlPWltOyRyLlF1b3RlTm9kZT1ybTskci5ldmVudEZpbGVzPXdzOyRyLnJlZ2lzdGVyUmljaFRleHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGRyLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoYi5DTElDS19DT01NQU5ELCgpPT57Y29uc3QgdD1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gYi4kaXNOb2RlU2VsZWN0aW9uKHQpPyh0LmNsZWFyKCksITApOiExfSwwKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkRFTEVURV9DSEFSQUNURVJfQ09NTUFORCx0PT57Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gYi4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5kZWxldGVDaGFyYWN0ZXIodCksITApOiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkRFTEVURV9XT1JEX0NPTU1BTkQsdD0+e2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIGIuJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uZGVsZXRlV29yZCh0KSwhMCk6ITF9LGIuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKGIuREVMRVRFX0xJTkVfQ09NTUFORCx0PT57Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gYi4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5kZWxldGVMaW5lKHQpLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5DT05UUk9MTEVEX1RFWFRfSU5TRVJUSU9OX0NPTU1BTkQsdD0+e2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7aWYodHlwZW9mIHQ9PSJzdHJpbmciKWIuJGlzUmFuZ2VTZWxlY3Rpb24obik/bi5pbnNlcnRUZXh0KHQpOmIuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pO2Vsc2V7aWYoIWIuJGlzUmFuZ2VTZWxlY3Rpb24obikmJiFiLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihuKSlyZXR1cm4hMTtjb25zdCByPXQuZGF0YVRyYW5zZmVyO3IhPW51bGw/TmMuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KHIsbixlKTpiLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYodD10LmRhdGEpJiZuLmluc2VydFRleHQodCl9cmV0dXJuITB9LGIuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKGIuUkVNT1ZFX1RFWFRfQ09NTUFORCwoKT0+e2NvbnN0IHQ9Yi4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIGIuJGlzUmFuZ2VTZWxlY3Rpb24odCk/KHQucmVtb3ZlVGV4dCgpLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5GT1JNQVRfVEVYVF9DT01NQU5ELHQ9Pntjb25zdCBuPWIuJGdldFNlbGVjdGlvbigpO3JldHVybiBiLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhuLmZvcm1hdFRleHQodCksITApOiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkZPUk1BVF9FTEVNRU5UX0NPTU1BTkQsdD0+e3ZhciBuPWIuJGdldFNlbGVjdGlvbigpO2lmKCFiLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYhYi4kaXNOb2RlU2VsZWN0aW9uKG4pKXJldHVybiExO249bi5nZXROb2RlcygpO2Zvcihjb25zdCByIG9mIG4pbj1kci4kZmluZE1hdGNoaW5nUGFyZW50KHIsbz0+Yi4kaXNFbGVtZW50Tm9kZShvKSYmIW8uaXNJbmxpbmUoKSksbiE9PW51bGwmJm4uc2V0Rm9ybWF0KHQpO3JldHVybiEwfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLklOU0VSVF9MSU5FX0JSRUFLX0NPTU1BTkQsdD0+e2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIGIuJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uaW5zZXJ0TGluZUJyZWFrKHQpLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsKCk9Pntjb25zdCB0PWIuJGdldFNlbGVjdGlvbigpO3JldHVybiBiLiRpc1JhbmdlU2VsZWN0aW9uKHQpPyh0Lmluc2VydFBhcmFncmFwaCgpLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5JTlNFUlRfVEFCX0NPTU1BTkQsKCk9PihiLiRpbnNlcnROb2RlcyhbYi4kY3JlYXRlVGFiTm9kZSgpXSksITApLGIuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKGIuSU5ERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+V3kodD0+e2NvbnN0IG49dC5nZXRJbmRlbnQoKTt0LnNldEluZGVudChuKzEpfSksYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+V3kodD0+e2NvbnN0IG49dC5nZXRJbmRlbnQoKTswPG4mJnQuc2V0SW5kZW50KG4tMSl9KSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLktFWV9BUlJPV19VUF9DT01NQU5ELHQ9Pnt2YXIgbj1iLiRnZXRTZWxlY3Rpb24oKTtpZihiLiRpc05vZGVTZWxlY3Rpb24obikmJiFndSh0LnRhcmdldCkpe2lmKHQ9bi5nZXROb2RlcygpLDA8dC5sZW5ndGgpcmV0dXJuIHRbMF0uc2VsZWN0UHJldmlvdXMoKSwhMH1lbHNlIGlmKGIuJGlzUmFuZ2VTZWxlY3Rpb24obikmJihuPWIuJGdldEFkamFjZW50Tm9kZShuLmZvY3VzLCEwKSwhdC5zaGlmdEtleSYmYi4kaXNEZWNvcmF0b3JOb2RlKG4pJiYhbi5pc0lzb2xhdGVkKCkmJiFuLmlzSW5saW5lKCkpKXJldHVybiBuLnNlbGVjdFByZXZpb3VzKCksdC5wcmV2ZW50RGVmYXVsdCgpLCEwO3JldHVybiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLktFWV9BUlJPV19ET1dOX0NPTU1BTkQsdD0+e3ZhciBuPWIuJGdldFNlbGVjdGlvbigpO2lmKGIuJGlzTm9kZVNlbGVjdGlvbihuKSl7aWYodD1uLmdldE5vZGVzKCksMDx0Lmxlbmd0aClyZXR1cm4gdFswXS5zZWxlY3ROZXh0KDAsMCksITB9ZWxzZSBpZihiLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXtsZXQgcj1uLmZvY3VzO2lmKHIua2V5PT09InJvb3QiJiZyLm9mZnNldD09PWIuJGdldFJvb3QoKS5nZXRDaGlsZHJlblNpemUoKSlyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLCEwO2lmKG49Yi4kZ2V0QWRqYWNlbnROb2RlKG4uZm9jdXMsITEpLCF0LnNoaWZ0S2V5JiZiLiRpc0RlY29yYXRvck5vZGUobikmJiFuLmlzSXNvbGF0ZWQoKSYmIW4uaXNJbmxpbmUoKSlyZXR1cm4gbi5zZWxlY3ROZXh0KCksdC5wcmV2ZW50RGVmYXVsdCgpLCEwfXJldHVybiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLktFWV9BUlJPV19MRUZUX0NPTU1BTkQsdD0+e2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7aWYoYi4kaXNOb2RlU2VsZWN0aW9uKG4pKXt2YXIgcj1uLmdldE5vZGVzKCk7aWYoMDxyLmxlbmd0aClyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLHJbMF0uc2VsZWN0UHJldmlvdXMoKSwhMH1yZXR1cm4gYi4kaXNSYW5nZVNlbGVjdGlvbihuKSYmcHUuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbihuLCEwKT8ocj10LnNoaWZ0S2V5LHQucHJldmVudERlZmF1bHQoKSxwdS4kbW92ZUNoYXJhY3RlcihuLHIsITApLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5LRVlfQVJST1dfUklHSFRfQ09NTUFORCx0PT57Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtpZihiLiRpc05vZGVTZWxlY3Rpb24obikmJiFndSh0LnRhcmdldCkpe3ZhciByPW4uZ2V0Tm9kZXMoKTtpZigwPHIubGVuZ3RoKXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksclswXS5zZWxlY3ROZXh0KDAsMCksITB9cmV0dXJuIGIuJGlzUmFuZ2VTZWxlY3Rpb24obik/KHI9dC5zaGlmdEtleSxwdS4kc2hvdWxkT3ZlcnJpZGVEZWZhdWx0Q2hhcmFjdGVyU2VsZWN0aW9uKG4sITEpPyh0LnByZXZlbnREZWZhdWx0KCkscHUuJG1vdmVDaGFyYWN0ZXIobixyLCExKSwhMCk6ITEpOiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLktFWV9CQUNLU1BBQ0VfQ09NTUFORCx0PT57aWYoZ3UodC50YXJnZXQpKXJldHVybiExO2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7aWYoIWIuJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7dC5wcmV2ZW50RGVmYXVsdCgpLHthbmNob3I6dH09bjtjb25zdCByPXQuZ2V0Tm9kZSgpO3JldHVybiBuLmlzQ29sbGFwc2VkKCkmJnQub2Zmc2V0PT09MCYmIWIuJGlzUm9vdE5vZGUocikmJjA8ZHIuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3cocikuZ2V0SW5kZW50KCk/ZS5kaXNwYXRjaENvbW1hbmQoYi5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCx2b2lkIDApOmUuZGlzcGF0Y2hDb21tYW5kKGIuREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5ELCEwKX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5LRVlfREVMRVRFX0NPTU1BTkQsdD0+e2lmKGd1KHQudGFyZ2V0KSlyZXR1cm4hMTtjb25zdCBuPWIuJGdldFNlbGVjdGlvbigpO3JldHVybiBiLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyh0LnByZXZlbnREZWZhdWx0KCksZS5kaXNwYXRjaENvbW1hbmQoYi5ERUxFVEVfQ0hBUkFDVEVSX0NPTU1BTkQsITEpKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5LRVlfRU5URVJfQ09NTUFORCx0PT57Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtpZighYi4kaXNSYW5nZVNlbGVjdGlvbihuKSlyZXR1cm4hMTtpZih0IT09bnVsbCl7aWYoKEcyfHxLMnx8WDIpJiZIMilyZXR1cm4hMTtpZih0LnByZXZlbnREZWZhdWx0KCksdC5zaGlmdEtleSlyZXR1cm4gZS5kaXNwYXRjaENvbW1hbmQoYi5JTlNFUlRfTElORV9CUkVBS19DT01NQU5ELCExKX1yZXR1cm4gZS5kaXNwYXRjaENvbW1hbmQoYi5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsdm9pZCAwKX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5LRVlfRVNDQVBFX0NPTU1BTkQsKCk9Pntjb25zdCB0PWIuJGdldFNlbGVjdGlvbigpO3JldHVybiBiLiRpc1JhbmdlU2VsZWN0aW9uKHQpPyhlLmJsdXIoKSwhMCk6ITF9LGIuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKGIuRFJPUF9DT01NQU5ELHQ9Pntjb25zdFssbl09d3ModCk7aWYoMDxuLmxlbmd0aCl7dmFyIHI9RnkodC5jbGllbnRYLHQuY2xpZW50WSk7aWYociE9PW51bGwpe2NvbnN0e29mZnNldDppLG5vZGU6bH09cjt2YXIgbz1iLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKGwpO2lmKG8hPT1udWxsKXtpZihyPWIuJGNyZWF0ZVJhbmdlU2VsZWN0aW9uKCksYi4kaXNUZXh0Tm9kZShvKSlyLmFuY2hvci5zZXQoby5nZXRLZXkoKSxpLCJ0ZXh0Iiksci5mb2N1cy5zZXQoby5nZXRLZXkoKSxpLCJ0ZXh0Iik7ZWxzZXtjb25zdCBzPW8uZ2V0UGFyZW50T3JUaHJvdygpLmdldEtleSgpO289by5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsci5hbmNob3Iuc2V0KHMsbywiZWxlbWVudCIpLHIuZm9jdXMuc2V0KHMsbywiZWxlbWVudCIpfXI9Yi4kbm9ybWFsaXplU2VsZWN0aW9uX19FWFBFUklNRU5UQUwociksYi4kc2V0U2VsZWN0aW9uKHIpfWUuZGlzcGF0Y2hDb21tYW5kKGFwLG4pfXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksITB9cmV0dXJuIHQ9Yi4kZ2V0U2VsZWN0aW9uKCksISFiLiRpc1JhbmdlU2VsZWN0aW9uKHQpfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkRSQUdTVEFSVF9DT01NQU5ELHQ9PntbdF09d3ModCk7Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4hKHQmJiFiLiRpc1JhbmdlU2VsZWN0aW9uKG4pKX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5EUkFHT1ZFUl9DT01NQU5ELHQ9Pnt2YXJbbl09d3ModCk7Y29uc3Qgcj1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gbiYmIWIuJGlzUmFuZ2VTZWxlY3Rpb24ocik/ITE6KG49RnkodC5jbGllbnRYLHQuY2xpZW50WSksbiE9PW51bGwmJihuPWIuJGdldE5lYXJlc3ROb2RlRnJvbURPTU5vZGUobi5ub2RlKSxiLiRpc0RlY29yYXRvck5vZGUobikmJnQucHJldmVudERlZmF1bHQoKSksITApfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLlNFTEVDVF9BTExfQ09NTUFORCwoKT0+KGIuJHNlbGVjdEFsbCgpLCEwKSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkNPUFlfQ09NTUFORCx0PT4oTmMuY29weVRvQ2xpcGJvYXJkKGUsZHIub2JqZWN0S2xhc3NFcXVhbHModCxDbGlwYm9hcmRFdmVudCk/dDpudWxsKSwhMCksYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5DVVRfQ09NTUFORCx0PT4oWjIodCxlKSwhMCksYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5QQVNURV9DT01NQU5ELHQ9Pntjb25zdFssbixyXT13cyh0KTtpZigwPG4ubGVuZ3RoJiYhcilyZXR1cm4gZS5kaXNwYXRjaENvbW1hbmQoYXAsbiksITA7aWYoYi5pc1NlbGVjdGlvbkNhcHR1cmVkSW5EZWNvcmF0b3JJbnB1dCh0LnRhcmdldCkpcmV0dXJuITE7Y29uc3Qgbz1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gYi4kaXNSYW5nZVNlbGVjdGlvbihvKXx8Yi5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24obyk/KEoyKHQsZSksITApOiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9O2NvbnN0IHEyPSRyO3ZhciBCcz1xMix2Uz1ucixlUj1PMixNbj1wLHRSPU0yLHlTPU50LFV5PUhyLG5SPUwyLHJSPUJzLGxtPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1Ij9Nbi51c2VMYXlvdXRFZmZlY3Q6TW4udXNlRWZmZWN0O2Z1bmN0aW9uIFZ5KGUpe3JldHVybiBlLmdldEVkaXRvclN0YXRlKCkucmVhZCh0Ui4kY2FuU2hvd1BsYWNlaG9sZGVyQ3VycnkoZS5pc0NvbXBvc2luZygpKSl9ZnVuY3Rpb24gb1IoZSl7bGV0W3Qsbl09TW4udXNlU3RhdGUoKCk9PlZ5KGUpKTtyZXR1cm4gbG0oKCk9PntmdW5jdGlvbiByKCl7bGV0IG89VnkoZSk7bihvKX1yZXR1cm4gcigpLHlTLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKCgpPT57cigpfSksZS5yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIoKCk9PntyKCl9KSl9LFtlXSksdH1mdW5jdGlvbiBpUihlLHQpe2xldFtuLHJdPU1uLnVzZVN0YXRlKCgpPT5lLmdldERlY29yYXRvcnMoKSk7cmV0dXJuIGxtKCgpPT5lLnJlZ2lzdGVyRGVjb3JhdG9yTGlzdGVuZXIobz0+e1V5LmZsdXNoU3luYygoKT0+e3Iobyl9KX0pLFtlXSksTW4udXNlRWZmZWN0KCgpPT57cihlLmdldERlY29yYXRvcnMoKSl9LFtlXSksTW4udXNlTWVtbygoKT0+e2xldCBvPVtdLGk9T2JqZWN0LmtleXMobik7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDtsKyspe2xldCBzPWlbbF0sYT1Nbi5jcmVhdGVFbGVtZW50KHQse29uRXJyb3I6Yz0+ZS5fb25FcnJvcihjKX0sTW4uY3JlYXRlRWxlbWVudChNbi5TdXNwZW5zZSx7ZmFsbGJhY2s6bnVsbH0sbltzXSkpLHU9ZS5nZXRFbGVtZW50QnlLZXkocyk7dSE9PW51bGwmJm8ucHVzaChVeS5jcmVhdGVQb3J0YWwoYSx1LHMpKX1yZXR1cm4gb30sW3QsbixlXSl9ZnVuY3Rpb24gbFIoZSl7bG0oKCk9PnlTLm1lcmdlUmVnaXN0ZXIoclIucmVnaXN0ZXJSaWNoVGV4dChlKSxuUi5yZWdpc3RlckRyYWdvblN1cHBvcnQoZSkpLFtlXSl9ZnVuY3Rpb24gc1Ioe2NvbnRlbnQ6ZX0pe3Zhclt0XT12Uy51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7dD1vUih0KTtsZXQgbj1lUigpO3JldHVybiB0P3R5cGVvZiBlPT0iZnVuY3Rpb24iP2Uobik6ZTpudWxsfXRTLlJpY2hUZXh0UGx1Z2luPWZ1bmN0aW9uKHtjb250ZW50RWRpdGFibGU6ZSxwbGFjZWhvbGRlcjp0LEVycm9yQm91bmRhcnk6bn0pe2xldFtyXT12Uy51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIG49aVIocixuKSxsUihyKSxNbi5jcmVhdGVFbGVtZW50KE1uLkZyYWdtZW50LG51bGwsZSxNbi5jcmVhdGVFbGVtZW50KHNSLHtjb250ZW50OnR9KSxuKX07Y29uc3QgYVI9dFM7dmFyIHVSPWFSLHhTPXt9LGJyPWZvLGNSPW5yLF9TPXAsZFI9TnQsdXM9Z2U7ZnVuY3Rpb24gZlIoZSl7X1MudXNlRWZmZWN0KCgpPT5kUi5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJDb21tYW5kKGJyLklOU0VSVF9PUkRFUkVEX0xJU1RfQ09NTUFORCwoKT0+KGJyLmluc2VydExpc3QoZSwibnVtYmVyIiksITApLHVzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlLnJlZ2lzdGVyQ29tbWFuZChici5JTlNFUlRfVU5PUkRFUkVEX0xJU1RfQ09NTUFORCwoKT0+KGJyLmluc2VydExpc3QoZSwiYnVsbGV0IiksITApLHVzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlLnJlZ2lzdGVyQ29tbWFuZChici5SRU1PVkVfTElTVF9DT01NQU5ELCgpPT4oYnIucmVtb3ZlTGlzdChlKSwhMCksdXMuQ09NTUFORF9QUklPUklUWV9MT1cpLGUucmVnaXN0ZXJDb21tYW5kKHVzLklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORCwoKT0+ISFici4kaGFuZGxlTGlzdEluc2VydFBhcmFncmFwaCgpLHVzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSksW2VdKX14Uy5MaXN0UGx1Z2luPWZ1bmN0aW9uKCl7bGV0W2VdPWNSLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gX1MudXNlRWZmZWN0KCgpPT57aWYoIWUuaGFzTm9kZXMoW2JyLkxpc3ROb2RlLGJyLkxpc3RJdGVtTm9kZV0pKXRocm93IEVycm9yKCJMaXN0UGx1Z2luOiBMaXN0Tm9kZSBhbmQvb3IgTGlzdEl0ZW1Ob2RlIG5vdCByZWdpc3RlcmVkIG9uIGVkaXRvciIpfSxbZV0pLGZSKGUpLG51bGx9O2NvbnN0IGhSPXhTO3ZhciBwUj1oUix3Uz17fSxYcj17fSxTUz1OdCxtcj1nZTtsZXQgZ1I9bmV3IFNldChbImh0dHA6IiwiaHR0cHM6IiwibWFpbHRvOiIsInNtczoiLCJ0ZWw6Il0pO2NsYXNzIEhsIGV4dGVuZHMgbXIuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGluayJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgSGwodC5fX3VybCx7cmVsOnQuX19yZWwsdGFyZ2V0OnQuX190YXJnZXQsdGl0bGU6dC5fX3RpdGxlfSx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG49e30scil7c3VwZXIocik7bGV0e3RhcmdldDpvPW51bGwscmVsOmk9bnVsbCx0aXRsZTpsPW51bGx9PW47dGhpcy5fX3VybD10LHRoaXMuX190YXJnZXQ9byx0aGlzLl9fcmVsPWksdGhpcy5fX3RpdGxlPWx9Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gbi5ocmVmPXRoaXMuc2FuaXRpemVVcmwodGhpcy5fX3VybCksdGhpcy5fX3RhcmdldCE9PW51bGwmJihuLnRhcmdldD10aGlzLl9fdGFyZ2V0KSx0aGlzLl9fcmVsIT09bnVsbCYmKG4ucmVsPXRoaXMuX19yZWwpLHRoaXMuX190aXRsZSE9PW51bGwmJihuLnRpdGxlPXRoaXMuX190aXRsZSksU1MuYWRkQ2xhc3NOYW1lc1RvRWxlbWVudChuLHQudGhlbWUubGluayksbn11cGRhdGVET00odCxuKXtsZXQgcj10aGlzLl9fdXJsLG89dGhpcy5fX3RhcmdldCxpPXRoaXMuX19yZWwsbD10aGlzLl9fdGl0bGU7cmV0dXJuIHIhPT10Ll9fdXJsJiYobi5ocmVmPXIpLG8hPT10Ll9fdGFyZ2V0JiYobz9uLnRhcmdldD1vOm4ucmVtb3ZlQXR0cmlidXRlKCJ0YXJnZXQiKSksaSE9PXQuX19yZWwmJihpP24ucmVsPWk6bi5yZW1vdmVBdHRyaWJ1dGUoInJlbCIpKSxsIT09dC5fX3RpdGxlJiYobD9uLnRpdGxlPWw6bi5yZW1vdmVBdHRyaWJ1dGUoInRpdGxlIikpLCExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57YTooKT0+KHtjb252ZXJzaW9uOm1SLHByaW9yaXR5OjF9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49eGEodC51cmwse3JlbDp0LnJlbCx0YXJnZXQ6dC50YXJnZXQsdGl0bGU6dC50aXRsZX0pO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufXNhbml0aXplVXJsKHQpe3RyeXtsZXQgbj1uZXcgVVJMKHQpO2lmKCFnUi5oYXMobi5wcm90b2NvbCkpcmV0dXJuImFib3V0OmJsYW5rIn1jYXRjaHt9cmV0dXJuIHR9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCkscmVsOnRoaXMuZ2V0UmVsKCksdGFyZ2V0OnRoaXMuZ2V0VGFyZ2V0KCksdGl0bGU6dGhpcy5nZXRUaXRsZSgpLHR5cGU6ImxpbmsiLHVybDp0aGlzLmdldFVSTCgpLHZlcnNpb246MX19Z2V0VVJMKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX191cmx9c2V0VVJMKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3VybD10fWdldFRhcmdldCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdGFyZ2V0fXNldFRhcmdldCh0KXt0aGlzLmdldFdyaXRhYmxlKCkuX190YXJnZXQ9dH1nZXRSZWwoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3JlbH1zZXRSZWwodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fcmVsPXR9Z2V0VGl0bGUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3RpdGxlfXNldFRpdGxlKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3RpdGxlPXR9aW5zZXJ0TmV3QWZ0ZXIodCxuPSEwKXtyZXR1cm4gdD10aGlzLmdldFBhcmVudE9yVGhyb3coKS5pbnNlcnROZXdBZnRlcih0LG4pLG1yLiRpc0VsZW1lbnROb2RlKHQpPyhuPXhhKHRoaXMuX191cmwse3JlbDp0aGlzLl9fcmVsLHRhcmdldDp0aGlzLl9fdGFyZ2V0LHRpdGxlOnRoaXMuX190aXRsZX0pLHQuYXBwZW5kKG4pLG4pOm51bGx9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiExfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiExfWNhbkJlRW1wdHkoKXtyZXR1cm4hMX1pc0lubGluZSgpe3JldHVybiEwfWV4dHJhY3RXaXRoQ2hpbGQodCxuKXtpZighbXIuJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7dD1uLmFuY2hvci5nZXROb2RlKCk7bGV0IHI9bi5mb2N1cy5nZXROb2RlKCk7cmV0dXJuIHRoaXMuaXNQYXJlbnRPZih0KSYmdGhpcy5pc1BhcmVudE9mKHIpJiYwPG4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9fWZ1bmN0aW9uIG1SKGUpe2xldCB0PW51bGw7aWYoU1MuaXNIVE1MQW5jaG9yRWxlbWVudChlKSl7bGV0IG49ZS50ZXh0Q29udGVudDtuIT09bnVsbCYmbiE9PSIiJiYodD14YShlLmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIix7cmVsOmUuZ2V0QXR0cmlidXRlKCJyZWwiKSx0YXJnZXQ6ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLHRpdGxlOmUuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfSkpfXJldHVybntub2RlOnR9fWZ1bmN0aW9uIHhhKGUsdCl7cmV0dXJuIG1yLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgSGwoZSx0KSl9ZnVuY3Rpb24gWW8oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBIbH1jbGFzcyBJYSBleHRlbmRzIEhse3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImF1dG9saW5rIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBJYSh0Ll9fdXJsLHtyZWw6dC5fX3JlbCx0YXJnZXQ6dC5fX3RhcmdldCx0aXRsZTp0Ll9fdGl0bGV9LHQuX19rZXkpfXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPXVwKHQudXJsLHtyZWw6dC5yZWwsdGFyZ2V0OnQudGFyZ2V0LHRpdGxlOnQudGl0bGV9KTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJuIG51bGx9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToiYXV0b2xpbmsiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIodCxuPSEwKXtyZXR1cm4gdD10aGlzLmdldFBhcmVudE9yVGhyb3coKS5pbnNlcnROZXdBZnRlcih0LG4pLG1yLiRpc0VsZW1lbnROb2RlKHQpPyhuPXVwKHRoaXMuX191cmwse3JlbDp0aGlzLl9yZWwsdGFyZ2V0OnRoaXMuX190YXJnZXQsdGl0bGU6dGhpcy5fX3RpdGxlfSksdC5hcHBlbmQobiksbik6bnVsbH19ZnVuY3Rpb24gdXAoZSx0KXtyZXR1cm4gbXIuJGFwcGx5Tm9kZVJlcGxhY2VtZW50KG5ldyBJYShlLHQpKX1sZXQgdlI9bXIuY3JlYXRlQ29tbWFuZCgiVE9HR0xFX0xJTktfQ09NTUFORCIpO2Z1bmN0aW9uIHlSKGUsdCl7Zm9yKDtlIT09bnVsbCYmKGU9ZS5nZXRQYXJlbnQoKSkhPT1udWxsJiYhdChlKTspO3JldHVybiBlfVhyLiRjcmVhdGVBdXRvTGlua05vZGU9dXA7WHIuJGNyZWF0ZUxpbmtOb2RlPXhhO1hyLiRpc0F1dG9MaW5rTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIElhfTtYci4kaXNMaW5rTm9kZT1ZbztYci5BdXRvTGlua05vZGU9SWE7WHIuTGlua05vZGU9SGw7WHIuVE9HR0xFX0xJTktfQ09NTUFORD12UjtYci50b2dnbGVMaW5rPWZ1bmN0aW9uKGUsdD17fSl7bGV0e3RhcmdldDpuLHRpdGxlOnJ9PXQsbz10LnJlbD09PXZvaWQgMD8ibm9yZWZlcnJlciI6dC5yZWw7aWYodD1tci4kZ2V0U2VsZWN0aW9uKCksbXIuJGlzUmFuZ2VTZWxlY3Rpb24odCkpaWYodD10LmV4dHJhY3QoKSxlPT09bnVsbCl0LmZvckVhY2gobD0+e2lmKGw9bC5nZXRQYXJlbnQoKSxZbyhsKSl7bGV0IHM9bC5nZXRDaGlsZHJlbigpO2ZvcihsZXQgYT0wO2E8cy5sZW5ndGg7YSsrKWwuaW5zZXJ0QmVmb3JlKHNbYV0pO2wucmVtb3ZlKCl9fSk7ZWxzZXtpZih0Lmxlbmd0aD09PTEpe3ZhciBpPXRbMF07aWYoaT1ZbyhpKT9pOnlSKGksWW8pLGkhPT1udWxsKXtpLnNldFVSTChlKSxuIT09dm9pZCAwJiZpLnNldFRhcmdldChuKSxvIT09bnVsbCYmaS5zZXRSZWwobyksciE9PXZvaWQgMCYmaS5zZXRUaXRsZShyKTtyZXR1cm59fWxldCBsPW51bGwscz1udWxsO3QuZm9yRWFjaChhPT57dmFyIHU9YS5nZXRQYXJlbnQoKTtpZih1IT09cyYmdSE9PW51bGwmJighbXIuJGlzRWxlbWVudE5vZGUoYSl8fGEuaXNJbmxpbmUoKSkpaWYoWW8odSkpcz11LHUuc2V0VVJMKGUpLG4hPT12b2lkIDAmJnUuc2V0VGFyZ2V0KG4pLG8hPT1udWxsJiZzLnNldFJlbChvKSxyIT09dm9pZCAwJiZzLnNldFRpdGxlKHIpO2Vsc2UgaWYodS5pcyhsKXx8KGw9dSxzPXhhKGUse3JlbDpvLHRhcmdldDpufSksWW8odSk/YS5nZXRQcmV2aW91c1NpYmxpbmcoKT09PW51bGw/dS5pbnNlcnRCZWZvcmUocyk6dS5pbnNlcnRBZnRlcihzKTphLmluc2VydEJlZm9yZShzKSksWW8oYSkpe2lmKCFhLmlzKHMpKXtpZihzIT09bnVsbCl7dT1hLmdldENoaWxkcmVuKCk7Zm9yKGxldCBjPTA7Yzx1Lmxlbmd0aDtjKyspcy5hcHBlbmQodVtjXSl9YS5yZW1vdmUoKX19ZWxzZSBzIT09bnVsbCYmcy5hcHBlbmQoYSl9KX19O2NvbnN0IHhSPVhyO3ZhciBUbD14UixEaT1UbCxfUj1ucix3Uj1OdCxMaT1nZSxTUj1wO3dTLkxpbmtQbHVnaW49ZnVuY3Rpb24oe3ZhbGlkYXRlVXJsOmV9KXtsZXRbdF09X1IudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBTUi51c2VFZmZlY3QoKCk9PntpZighdC5oYXNOb2RlcyhbRGkuTGlua05vZGVdKSl0aHJvdyBFcnJvcigiTGlua1BsdWdpbjogTGlua05vZGUgbm90IHJlZ2lzdGVyZWQgb24gZWRpdG9yIik7cmV0dXJuIHdSLm1lcmdlUmVnaXN0ZXIodC5yZWdpc3RlckNvbW1hbmQoRGkuVE9HR0xFX0xJTktfQ09NTUFORCxuPT57aWYobj09PW51bGwpcmV0dXJuIERpLnRvZ2dsZUxpbmsobiksITA7aWYodHlwZW9mIG49PSJzdHJpbmciKXJldHVybiBlPT09dm9pZCAwfHxlKG4pPyhEaS50b2dnbGVMaW5rKG4pLCEwKTohMTtsZXR7dXJsOnIsdGFyZ2V0Om8scmVsOmksdGl0bGU6bH09bjtyZXR1cm4gRGkudG9nZ2xlTGluayhyLHtyZWw6aSx0YXJnZXQ6byx0aXRsZTpsfSksITB9LExpLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlIT09dm9pZCAwP3QucmVnaXN0ZXJDb21tYW5kKExpLlBBU1RFX0NPTU1BTkQsbj0+e2xldCByPUxpLiRnZXRTZWxlY3Rpb24oKTtpZighTGkuJGlzUmFuZ2VTZWxlY3Rpb24ocil8fHIuaXNDb2xsYXBzZWQoKXx8IShuIGluc3RhbmNlb2YgQ2xpcGJvYXJkRXZlbnQpfHxuLmNsaXBib2FyZERhdGE9PW51bGwpcmV0dXJuITE7bGV0IG89bi5jbGlwYm9hcmREYXRhLmdldERhdGEoInRleHQiKTtyZXR1cm4gZShvKT9yLmdldE5vZGVzKCkuc29tZShpPT5MaS4kaXNFbGVtZW50Tm9kZShpKSk/ITE6KHQuZGlzcGF0Y2hDb21tYW5kKERpLlRPR0dMRV9MSU5LX0NPTU1BTkQsbyksbi5wcmV2ZW50RGVmYXVsdCgpLCEwKTohMX0sTGkuQ09NTUFORF9QUklPUklUWV9MT1cpOigpPT57fSl9LFt0LGVdKSxudWxsfTtjb25zdCBFUj13Uzt2YXIgQ1I9RVI7ZnVuY3Rpb24gJFIoe2FyaWFBY3RpdmVEZXNjZW5kYW50OmUsYXJpYUF1dG9Db21wbGV0ZTp0LGFyaWFDb250cm9sczpuLGFyaWFEZXNjcmliZWRCeTpyLGFyaWFFeHBhbmRlZDpvLGFyaWFMYWJlbDppLGFyaWFMYWJlbGxlZEJ5OmwsYXJpYU11bHRpbGluZTpzLGFyaWFPd25zOmEsYXJpYVJlcXVpcmVkOnUsYXV0b0NhcGl0YWxpemU6YyxjbGFzc05hbWU6ZCxpZDpmLHJvbGU6aD0idGV4dGJveCIsc3BlbGxDaGVjazpnPSEwLHN0eWxlOm0sdGFiSW5kZXg6UywiZGF0YS10ZXN0aWQiOnYsLi4ueX0pe2NvbnN0W3hdPW5yLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxbXyxFXT1wLnVzZVN0YXRlKCExKSwkPXAudXNlQ2FsbGJhY2soQz0+e3ZhciBNO3guc2V0Um9vdEVsZW1lbnQoQyk7Y29uc3QgVD0oTT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidmFsLXVpIikpPT1udWxsP3ZvaWQgMDpNLnNoYWRvd1Jvb3Q7aWYoVCYmImdldFNlbGVjdGlvbiJpbiBUKXt4Ll93aW5kb3c9VDtyZXR1cm59fSxbeF0pO3JldHVybiBwLnVzZUxheW91dEVmZmVjdCgoKT0+KEUoeC5pc0VkaXRhYmxlKCkpLHgucmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKEM9PntFKEMpfSkpLFt4XSksdy5qc3goImRpdiIsey4uLnksImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6Xz9lOnZvaWQgMCwiYXJpYS1hdXRvY29tcGxldGUiOl8/dDoibm9uZSIsImFyaWEtY29udHJvbHMiOl8/bjp2b2lkIDAsImFyaWEtZGVzY3JpYmVkYnkiOnIsImFyaWEtZXhwYW5kZWQiOl8mJmg9PT0iY29tYm9ib3giPyEhbzp2b2lkIDAsImFyaWEtbGFiZWwiOmksImFyaWEtbGFiZWxsZWRieSI6bCwiYXJpYS1tdWx0aWxpbmUiOnMsImFyaWEtb3ducyI6Xz9hOnZvaWQgMCwiYXJpYS1yZWFkb25seSI6Xz92b2lkIDA6ITAsImFyaWEtcmVxdWlyZWQiOnUsYXV0b0NhcGl0YWxpemU6YyxjbGFzc05hbWU6ZCxjb250ZW50RWRpdGFibGU6XywiZGF0YS10ZXN0aWQiOnYsaWQ6ZixyZWY6JCxyb2xlOmgsc3BlbGxDaGVjazpnLHN0eWxlOm0sdGFiSW5kZXg6U30pfWZ1bmN0aW9uIGtSKHtjbGFzc05hbWU6ZX0pe3JldHVybiB3LmpzeCgkUix7Y2xhc3NOYW1lOmV9KX1jbGFzcyBqYSBleHRlbmRzIGdlLkRlY29yYXRvck5vZGV7Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLl9fc3JjPXQuc3JjLHRoaXMuX19hbHRUZXh0PXQuYWx0VGV4dCx0aGlzLl9fd2lkdGg9dC53aWR0aCx0aGlzLl9faGVpZ2h0PXQuaGVpZ2h0fXN0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImltYWdlIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBqYSh7c3JjOnQuX19zcmMsYWx0VGV4dDp0Ll9fYWx0VGV4dCx3aWR0aDp0Ll9fd2lkdGgsaGVpZ2h0OnQuX19oZWlnaHR9KX1leHBvcnRKU09OKCl7cmV0dXJue2FsdFRleHQ6dGhpcy5fX2FsdFRleHQsaGVpZ2h0OnRoaXMuX193aWR0aCxzcmM6dGhpcy5fX3NyYyx0eXBlOiJpbWFnZSIsdmVyc2lvbjoxLHdpZHRoOnRoaXMuX193aWR0aH19c3RhdGljIGltcG9ydEpTT04odCl7cmV0dXJuIEVTKHQpfWNyZWF0ZURPTSgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX11cGRhdGVET00oKXtyZXR1cm4hMX1kZWNvcmF0ZSgpe3JldHVybiB3LmpzeChUUix7c3JjOnRoaXMuX19zcmMsYWx0VGV4dDp0aGlzLl9fYWx0VGV4dCxlbXB0eTp0aGlzLl9fZW1wdHksaGVpZ2h0OnRoaXMuX19oZWlnaHQsbm9kZUtleTp0aGlzLmdldEtleSgpfSl9fWZ1bmN0aW9uIFRSKGUpe3JldHVybiB3LmpzeCgiaW1nIix7c3JjOmUuc3JjfSl9ZnVuY3Rpb24gRVMoZSl7cmV0dXJuIG5ldyBqYShlKX1mdW5jdGlvbiBOUigpe2NvbnN0W2VdPW5yLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntlLmZvY3VzKCl9LFtlXSksbnVsbH1jb25zdCBDUz1nZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfSU1BR0VfQ09NTUFORCIpO2Z1bmN0aW9uIGJSKCl7Y29uc3RbZV09bnIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2lmKCFlLmhhc05vZGVzKFtqYV0pKXRocm93IG5ldyBFcnJvcigiSW1hZ2VzUGx1Z2luOiBJbWFnZU5vZGUgbm90IHJlZ2lzdGVyZWQgb24gZWRpdG9yIik7cmV0dXJuIE50Lm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoQ1MsdD0+e2NvbnN0IG49RVModCk7cmV0dXJuIGdlLiRpbnNlcnROb2Rlcyhbbl0pLGdlLiRpc1Jvb3RPclNoYWRvd1Jvb3Qobi5nZXRQYXJlbnRPclRocm93KCkpJiZOdC4kd3JhcE5vZGVJbkVsZW1lbnQobixnZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSkuc2VsZWN0RW5kKCksITB9LGdlLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9LFtlXSksbnVsbH1jb25zdCBSUj0oe2NsYXNzTmFtZTplfSk9PncuanN4cygic3ZnIix7aGVpZ2h0OjEyLHdpZHRoOjEyLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNsYXNzTmFtZTplLGNoaWxkcmVuOlt3LmpzeCgicGF0aCIse2Q6Ik02IDRoOGE0IDQgMCAwIDEgNCA0IDQgNCAwIDAgMS00IDRINnoifSksdy5qc3goInBhdGgiLHtkOiJNNiAxMmg5YTQgNCAwIDAgMSA0IDQgNCA0IDAgMCAxLTQgNEg2eiJ9KV19KSxQUj1SUixPUj0oe2NsYXNzTmFtZTplfSk9PncuanN4cygic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsY2xhc3NOYW1lOmUsd2lkdGg6MTIsaGVpZ2h0OjEyLGNoaWxkcmVuOlt3LmpzeCgibGluZSIse3gxOiIxOSIseTE6IjQiLHgyOiIxMCIseTI6IjQifSksdy5qc3goImxpbmUiLHt4MToiMTQiLHkxOiIyMCIseDI6IjUiLHkyOiIyMCJ9KSx3LmpzeCgibGluZSIse3gxOiIxNSIseTE6IjQiLHgyOiI5Iix5MjoiMjAifSldfSksQVI9T1IsTVI9KHtjbGFzc05hbWU6ZX0pPT53LmpzeCgic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMSIsY2xhc3NOYW1lOmUsd2lkdGg6MTIsaGVpZ2h0OjEyLGNoaWxkcmVuOncuanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGQ6Ik0xMywxNSBMMTMsMjEgQzEzLDIxLjU1MjI4NDcgMTIuNTUyMjg0NywyMiAxMiwyMiBDMTEuNDQ3NzE1MywyMiAxMSwyMS41NTIyODQ3IDExLDIxIEwxMSwxNSBMMTMsMTUgWiBNMywxMyBDMi40NDc3MTUyNSwxMyAyLDEyLjU1MjI4NDcgMiwxMiBDMiwxMS40NDc3MTUzIDIuNDQ3NzE1MjUsMTEgMywxMSBMMjEsMTEgQzIxLjU1MjI4NDcsMTEgMjIsMTEuNDQ3NzE1MyAyMiwxMiBDMjIsMTIuNTUyMjg0NyAyMS41NTIyODQ3LDEzIDIxLDEzIEwzLDEzIFogTTE5LDIgQzE5LjU1MjI4NDcsMiAyMCwyLjQ0NzcxNTI1IDIwLDMgQzIwLDMuNTUyMjg0NzUgMTkuNTUyMjg0Nyw0IDE5LDQgTDEzLDQgTDEzLDkgTDExLDkgTDExLDQgTDUsNCBDNC40NDc3MTUyNSw0IDQsMy41NTIyODQ3NSA0LDMgQzQsMi40NDc3MTUyNSA0LjQ0NzcxNTI1LDIgNSwyIEwxOSwyIFoifSl9KSxEUj1NUixMUj0oe3ZhcmlhbnQ6ZT0icHJpbWFyeSIsb25DbGljazp0LGNoaWxkcmVuOm4saWNvbjpyLGRpc2FibGVkOm89ITF9KT0+dy5qc3goImJ1dHRvbiIse2Rpc2FibGVkOm8sY2xhc3NOYW1lOnJkKCJmb250LXNhbnMgZm9udC1bMTJweF0gdHJhY2tpbmctWzAuMDRlbV0gcHktMSBweC0yIHJvdW5kZWQgd2hpdGVzcGFjZS1ub3dyYXAgZ3JvdXAgcmVsYXRpdmUgdGV4dC1wcmltYXJ5Iix7ImZvbnQtYm9sZCI6ZT09PSJwcmltYXJ5IiwiYmctYmFja2dyb3VuZCBob3ZlcjpiZy1iYWNrZ3JvdW5kIHRleHQtZmlsbCBkaXNhYmxlZDpiZy1maWxsIGRpc2FibGVkOnRleHQtYmFja2dyb3VuZCI6ZT09PSJwcmltYXJ5IiwiYmctdHJhbnNwYXJlbnQgYm9yZGVyIGJvcmRlci1wcmltYXJ5IHRleHQtcHJpbWFyeSBob3Zlcjpib3JkZXItaGlnaGxpZ2h0IGhvdmVyOnRleHQtaGlnaGxpZ2h0IGRpc2FibGVkOmJnLWZpbGwgZGlzYWJsZWQ6dGV4dC1iYWNrZ3JvdW5kIjplIT09InByaW1hcnkifSksb25DbGljazp0LGNoaWxkcmVuOncuanN4cygic3BhbiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltyJiZyLG5dfSl9KSxYbz1MUixJUj0oe2NsYXNzTmFtZTplfSk9PncuanN4cygic3ZnIix7d2lkdGg6IjEwIixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgMTIgMTIiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2xhc3NOYW1lOmUsY2hpbGRyZW46W3cuanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNMy43MDczMyAxLjAwMDE1TDguNzc4NCA2LjA3MTIxTDguMDcxMjkgNi43NzgzMkwzLjAwMDIyIDEuNzA3MjVMMy43MDczMyAxLjAwMDE1WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLHcuanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNMy4wMDAxNSAxMC40NzA5TDguMDcxMjEgNS4zOTk4M0w4Ljc3ODMyIDYuMTA2OTNMMy43MDcyNSAxMS4xNzhMMy4wMDAxNSAxMC40NzA5WiIsZmlsbDoiY3VycmVudENvbG9yIn0pXX0pLGpSPUlSLCRTPXEuY3JlYXRlQ29udGV4dCh7Z2V0IGFwaSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNlc3Npb24oKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCB0aGVtZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldFRoZW1lKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgZWRpdE1vZGUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRFZGl0TW9kZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IGhpZ2hsaWdodCgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldEhpZ2hsaWdodCgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldFdpbmRvd1NpemUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCB3aW5kb3dTaXplKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfX0pO2Z1bmN0aW9uIHNtKCl7cmV0dXJuIHEudXNlQ29udGV4dCgkUyl9Y29uc3QgelI9KHtvcHRpb25zOmUsb25DaGFuZ2U6dCxsYWJlbDpuLGljb246cn0pPT57Y29uc3RbbyxpXT1wLnVzZVN0YXRlKCExKSxsPXAudXNlUmVmKG51bGwpLFtzLGFdPXAudXNlU3RhdGUoMCkse3dpbmRvd1NpemU6dX09c20oKSxjPSgpPT57aSghbyl9LGQ9KGYsaCk9PnthKGgpLHQoZiksaSghMSl9O3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IGY9aD0+e28mJmwuY3VycmVudCYmIWwuY3VycmVudC5jb250YWlucyhoLnRhcmdldCkmJmkoITEpfTtyZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGYpLCgpPT57ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGYpfX0sW10pLHcuanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtWzEycHhdIixyZWY6bCxjaGlsZHJlbjp3LmpzeChYbyx7b25DbGljazpmPT57Zi5wcmV2ZW50RGVmYXVsdCgpLGMoKX0saWNvbjp3LmpzeChqUix7Y2xhc3NOYW1lOmByb3RhdGUtWy05MGRlZ10gdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMTUwIGVhc2UtaW4tb3V0ICR7bz8iIjoicm90YXRlLVs5MGRlZ10ifWB9KSxjaGlsZHJlbjp3LmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVsYXRpdmUiLGNoaWxkcmVuOlt3LmpzeHMoInNwYW4iLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xIixjaGlsZHJlbjpbbixyJiZyXX0pLG8mJncuanN4KCJkaXYiLHtjbGFzc05hbWU6ImFic29sdXRlIC10b3AtWzRweF0gb3ZlcmZsb3ctc2Nyb2xsIHNoYWRvdy1sZyAtbGVmdC0yIHRleHQtcHJpbWFyeSBiZy1ib3JkZXIgdy1maXQgei1vdmVybGF5IixzdHlsZTp7bWF4SGVpZ2h0OnU9PW51bGw/dm9pZCAwOnUuaW5uZXJIZWlnaHR9LGNoaWxkcmVuOncuanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgIixjaGlsZHJlbjplPT1udWxsP3ZvaWQgMDplLm1hcCgoZixoKT0+dy5qc3goImJ1dHRvbiIse29uQ2xpY2s6Zz0+e2cucHJldmVudERlZmF1bHQoKSxkKGYsaCl9LGNsYXNzTmFtZTpgdGV4dC1sZWZ0IHB4LTIgcHktMSBob3ZlcjpiZy1iYWNrZ3JvdW5kIGhvdmVyOnRleHQtaGlnaGxpZ2h0ICAke2g9PT1zJiYiZm9udC1ib2xkIGJnLWJhY2tncm91bmQgaG92ZXI6YmctYmFja2dyb3VuZCB0cnVuY2F0ZSJ9YCxjaGlsZHJlbjpmfSxmKSl9KX0pXX0pfSl9KX0sRlI9elIsQlI9L15kYXRhOihpbWFnZVwvKHBuZ3xqcGVnfGpwZ3xnaWZ8d2VicHxibXB8dGlmZnxpY298c3ZnXCt4bWwpKTtiYXNlNjQsLztmdW5jdGlvbiBrUyhlKXtjb25zdCB0PUJSLmV4ZWMoZSk7aWYodCYmdFsxXSlyZXR1cm4gdFsxXX1mdW5jdGlvbiBUUyhlKXtyZXR1cm4gZT09PSJpbWFnZS9zdmcreG1sIj8ic3ZnIjplPT09ImltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiI/ImljbyI6ZS5zdGFydHNXaXRoKCJpbWFnZS8iKT9lLnNsaWNlKDYpOmV9Y29uc3QgV1I9bmV3IFRleHRFbmNvZGVyO2Z1bmN0aW9uIE5TKGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e3ZhciBpO2NvbnN0IHI9KGk9ZS5jdXJyZW50VGFyZ2V0LmZpbGVzKT09bnVsbD92b2lkIDA6aVswXSxvPW5ldyBGaWxlUmVhZGVyO28uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKCk9Pntjb25zdCBsPW8ucmVzdWx0O2lmKHR5cGVvZiBsPT0ic3RyaW5nIil7Y29uc3Qgcz1uZXcgSW1hZ2U7cy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixhc3luYygpPT57Y29uc3QgYT1hd2FpdCB3bi5nZXRTSEEyNTZIYXNoKFdSLmVuY29kZShsKSk7aWYocy5uYXR1cmFsV2lkdGgmJnMubmF0dXJhbEhlaWdodCl7Y29uc3QgdT1rUyhsKTt0KHtzcmM6bCx3aWR0aDpzLm5hdHVyYWxXaWR0aCxoZWlnaHQ6cy5uYXR1cmFsSGVpZ2h0LHNoYTI1NjphLG1pbWVUeXBlOnUsZmlsZUV4dDp1JiZUUyh1KX0pfWVsc2UgdCh7c3JjOmwsc2hhMjU2OmF9KX0pLHMuc3JjPWx9ZWxzZSBuKGw/e21lc3NhZ2U6IlVuZXhwZWN0ZWQgaW1hZ2UgcmVzdWx0IHR5cGUiLHJlc3VsdDpsfTp7bWVzc2FnZToiRW1wdHkgcmVzdWx0In0pfSksciYmby5yZWFkQXNEYXRhVVJMKHIpfSl9ZnVuY3Rpb24gYlMoZSl7Y29uc3QgdD1lLmFuY2hvcixuPWUuZm9jdXMscj1lLmFuY2hvci5nZXROb2RlKCksbz1lLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gcj09PW8/cjplLmlzQmFja3dhcmQoKT9Pby4kaXNBdE5vZGVFbmQobik/cjpvOk9vLiRpc0F0Tm9kZUVuZCh0KT9yOm99ZnVuY3Rpb24gVVIoKXtjb25zdFtlXT1uci51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT5OdC5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJDb21tYW5kKGdlLkNMSUNLX0NPTU1BTkQsdD0+e2NvbnN0IG49Z2UuJGdldFNlbGVjdGlvbigpO2lmKGdlLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXtjb25zdCByPWJTKG4pLG89TnQuJGZpbmRNYXRjaGluZ1BhcmVudChyLFRsLiRpc0xpbmtOb2RlKTtpZihUbC4kaXNMaW5rTm9kZShvKSYmKHQubWV0YUtleXx8dC5jdHJsS2V5KSlyZXR1cm4gd2luZG93Lm9wZW4oby5nZXRVUkwoKSwiX2JsYW5rIiksITB9cmV0dXJuITF9LGdlLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSksW10pLG51bGx9dmFyIFJTPXtleHBvcnRzOnt9fSxWUj0iU0VDUkVUX0RPX05PVF9QQVNTX1RISVNfT1JfWU9VX1dJTExfQkVfRklSRUQiLEhSPVZSLEtSPUhSO2Z1bmN0aW9uIFBTKCl7fWZ1bmN0aW9uIE9TKCl7fU9TLnJlc2V0V2FybmluZ0NhY2hlPVBTO3ZhciBHUj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUocixvLGksbCxzLGEpe2lmKGEhPT1LUil7dmFyIHU9bmV3IEVycm9yKCJDYWxsaW5nIFByb3BUeXBlcyB2YWxpZGF0b3JzIGRpcmVjdGx5IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGBwcm9wLXR5cGVzYCBwYWNrYWdlLiBVc2UgUHJvcFR5cGVzLmNoZWNrUHJvcFR5cGVzKCkgdG8gY2FsbCB0aGVtLiBSZWFkIG1vcmUgYXQgaHR0cDovL2ZiLm1lL3VzZS1jaGVjay1wcm9wLXR5cGVzIik7dGhyb3cgdS5uYW1lPSJJbnZhcmlhbnQgVmlvbGF0aW9uIix1fX1lLmlzUmVxdWlyZWQ9ZTtmdW5jdGlvbiB0KCl7cmV0dXJuIGV9dmFyIG49e2FycmF5OmUsYmlnaW50OmUsYm9vbDplLGZ1bmM6ZSxudW1iZXI6ZSxvYmplY3Q6ZSxzdHJpbmc6ZSxzeW1ib2w6ZSxhbnk6ZSxhcnJheU9mOnQsZWxlbWVudDplLGVsZW1lbnRUeXBlOmUsaW5zdGFuY2VPZjp0LG5vZGU6ZSxvYmplY3RPZjp0LG9uZU9mOnQsb25lT2ZUeXBlOnQsc2hhcGU6dCxleGFjdDp0LGNoZWNrUHJvcFR5cGVzOk9TLHJlc2V0V2FybmluZ0NhY2hlOlBTfTtyZXR1cm4gbi5Qcm9wVHlwZXM9bixufTtSUy5leHBvcnRzPUdSKCk7dmFyIFlSPVJTLmV4cG9ydHM7Y29uc3QgTG49JGEoWVIpO2Z1bmN0aW9uIGNwKCl7cmV0dXJuIGNwPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LGNwLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBYUihlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49UVIoZSx0KSxyLG87aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtmb3Iobz0wO288aS5sZW5ndGg7bysrKXI9aVtvXSwhKHQuaW5kZXhPZihyKT49MCkmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHIpJiYobltyXT1lW3JdKX1yZXR1cm4gbn1mdW5jdGlvbiBRUihlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49e30scj1PYmplY3Qua2V5cyhlKSxvLGk7Zm9yKGk9MDtpPHIubGVuZ3RoO2krKylvPXJbaV0sISh0LmluZGV4T2Yobyk+PTApJiYobltvXT1lW29dKTtyZXR1cm4gbn12YXIgYW09cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jb2xvcixyPW49PT12b2lkIDA/ImN1cnJlbnRDb2xvciI6bixvPWUuc2l6ZSxpPW89PT12b2lkIDA/MjQ6byxsPVhSKGUsWyJjb2xvciIsInNpemUiXSk7cmV0dXJuIHEuY3JlYXRlRWxlbWVudCgic3ZnIixjcCh7cmVmOnQseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDppLGhlaWdodDppLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOnIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQifSxsKSxxLmNyZWF0ZUVsZW1lbnQoInBvbHlsaW5lIix7cG9pbnRzOiIyMCA2IDkgMTcgNCAxMiJ9KSl9KTthbS5wcm9wVHlwZXM9e2NvbG9yOkxuLnN0cmluZyxzaXplOkxuLm9uZU9mVHlwZShbTG4uc3RyaW5nLExuLm51bWJlcl0pfTthbS5kaXNwbGF5TmFtZT0iQ2hlY2siO2NvbnN0IEpSPWFtO2Z1bmN0aW9uIGRwKCl7cmV0dXJuIGRwPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LGRwLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBaUihlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49cVIoZSx0KSxyLG87aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtmb3Iobz0wO288aS5sZW5ndGg7bysrKXI9aVtvXSwhKHQuaW5kZXhPZihyKT49MCkmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHIpJiYobltyXT1lW3JdKX1yZXR1cm4gbn1mdW5jdGlvbiBxUihlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49e30scj1PYmplY3Qua2V5cyhlKSxvLGk7Zm9yKGk9MDtpPHIubGVuZ3RoO2krKylvPXJbaV0sISh0LmluZGV4T2Yobyk+PTApJiYobltvXT1lW29dKTtyZXR1cm4gbn12YXIgdW09cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jb2xvcixyPW49PT12b2lkIDA/ImN1cnJlbnRDb2xvciI6bixvPWUuc2l6ZSxpPW89PT12b2lkIDA/MjQ6byxsPVpSKGUsWyJjb2xvciIsInNpemUiXSk7cmV0dXJuIHEuY3JlYXRlRWxlbWVudCgic3ZnIixkcCh7cmVmOnQseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDppLGhlaWdodDppLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOnIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQifSxsKSxxLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTAgMTNhNSA1IDAgMCAwIDcuNTQuNTRsMy0zYTUgNSAwIDAgMC03LjA3LTcuMDdsLTEuNzIgMS43MSJ9KSxxLmNyZWF0ZUVsZW1lbnQoInBhdGgiLHtkOiJNMTQgMTFhNSA1IDAgMCAwLTcuNTQtLjU0bC0zIDNhNSA1IDAgMCAwIDcuMDcgNy4wN2wxLjcxLTEuNzEifSkpfSk7dW0ucHJvcFR5cGVzPXtjb2xvcjpMbi5zdHJpbmcsc2l6ZTpMbi5vbmVPZlR5cGUoW0xuLnN0cmluZyxMbi5udW1iZXJdKX07dW0uZGlzcGxheU5hbWU9IkxpbmsiO2NvbnN0IGVQPXVtO2Z1bmN0aW9uIGZwKCl7cmV0dXJuIGZwPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LGZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiB0UChlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49blAoZSx0KSxyLG87aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7dmFyIGk9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtmb3Iobz0wO288aS5sZW5ndGg7bysrKXI9aVtvXSwhKHQuaW5kZXhPZihyKT49MCkmJk9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChlLHIpJiYobltyXT1lW3JdKX1yZXR1cm4gbn1mdW5jdGlvbiBuUChlLHQpe2lmKGU9PW51bGwpcmV0dXJue307dmFyIG49e30scj1PYmplY3Qua2V5cyhlKSxvLGk7Zm9yKGk9MDtpPHIubGVuZ3RoO2krKylvPXJbaV0sISh0LmluZGV4T2Yobyk+PTApJiYobltvXT1lW29dKTtyZXR1cm4gbn12YXIgY209cC5mb3J3YXJkUmVmKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5jb2xvcixyPW49PT12b2lkIDA/ImN1cnJlbnRDb2xvciI6bixvPWUuc2l6ZSxpPW89PT12b2lkIDA/MjQ6byxsPXRQKGUsWyJjb2xvciIsInNpemUiXSk7cmV0dXJuIHEuY3JlYXRlRWxlbWVudCgic3ZnIixmcCh7cmVmOnQseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDppLGhlaWdodDppLHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOnIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQifSxsKSxxLmNyZWF0ZUVsZW1lbnQoImxpbmUiLHt4MToiMTgiLHkxOiI2Iix4MjoiNiIseTI6IjE4In0pLHEuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOiI2Iix5MToiNiIseDI6IjE4Iix5MjoiMTgifSkpfSk7Y20ucHJvcFR5cGVzPXtjb2xvcjpMbi5zdHJpbmcsc2l6ZTpMbi5vbmVPZlR5cGUoW0xuLnN0cmluZyxMbi5udW1iZXJdKX07Y20uZGlzcGxheU5hbWU9IlgiO2NvbnN0IHJQPWNtLG9QPSh7Zm9udFNpemVzOmUsZm9udHNGYW1pbGllczp0LG9uRWRpdG9yOm4sY29sb3JzOnJ9KT0+e2NvbnN0W29dPW5yLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtwLnVzZUVmZmVjdCgoKT0+e24mJm4obyl9LFtvXSk7Y29uc3RbaSxsXT1wLnVzZVN0YXRlKG8pLFtzLGFdPXAudXNlU3RhdGUobnVsbCksW3UsY109cC51c2VTdGF0ZSghMSksW2QsZl09cC51c2VTdGF0ZSghMSksW2gsZ109cC51c2VTdGF0ZSghMSksW20sU109cC51c2VTdGF0ZSghMSk7cC51c2VTdGF0ZSgiMTVweCIpLHAudXNlU3RhdGUoIiMwMDAiKSxwLnVzZVN0YXRlKCJTYW5zIik7Y29uc3Rbdix5XT1wLnVzZVN0YXRlKCJwYXJhZ3JhcGgiKTtwLnVzZVN0YXRlKCExKSxwLnVzZVN0YXRlKCExKSxwLnVzZVN0YXRlKCJ1cmwiKSxwLnVzZVN0YXRlKG51bGwpO2NvbnN0W3gsX109cC51c2VTdGF0ZShudWxsKSxFPVI9PntvLmRpc3BhdGNoQ29tbWFuZChUbC5UT0dHTEVfTElOS19DT01NQU5ELFIpfSwkPXtwYXJhZ3JhcGg6Ik5vcm1hbCIsaDE6IkhlYWRpbmcgMSIsaDI6IkhlYWRpbmcgMiIsaDM6IkhlYWRpbmcgMyIsaDQ6IkhlYWRpbmcgNCIsaDU6IkhlYWRpbmcgNSIsaDY6IkhlYWRpbmcgNiIsbnVtYmVyOiJOdW1iZXJlZCBMaXN0IixidWxsZXQ6IkJ1bGxldGVkIExpc3QifSxDPXt9O2Zvcihjb25zdCBSIGluICQpQ1skW1JdXT1SO2NvbnN0IFQ9cC51c2VDYWxsYmFjaygoKT0+e2NvbnN0IFI9Z2UuJGdldFNlbGVjdGlvbigpO2lmKGdlLiRpc1JhbmdlU2VsZWN0aW9uKFIpKXtjb25zdCBqPVIuYW5jaG9yLmdldE5vZGUoKTtsZXQgRj1qLmdldEtleSgpPT09InJvb3QiP2o6TnQuJGZpbmRNYXRjaGluZ1BhcmVudChqLE89Pntjb25zdCBrPU8uZ2V0UGFyZW50KCk7cmV0dXJuIGshPT1udWxsJiZnZS4kaXNSb290T3JTaGFkb3dSb290KGspfSk7Rj09PW51bGwmJihGPWouZ2V0VG9wTGV2ZWxFbGVtZW50T3JUaHJvdygpKTtjb25zdCBhZT1iUyhSKSxIPU50LiRmaW5kTWF0Y2hpbmdQYXJlbnQoYWUsVGwuJGlzTGlua05vZGUpO2lmKEghPT1udWxsKXtjb25zdCBPPUguZ2V0VVJMKCk7XyhPKX1lbHNlIF8obnVsbCk7Y29uc3QgWD1GLmdldEtleSgpLFA9aS5nZXRFbGVtZW50QnlLZXkoWCk7aWYoYyhSLmhhc0Zvcm1hdCgiYm9sZCIpKSxmKFIuaGFzRm9ybWF0KCJpdGFsaWMiKSksZyhSLmhhc0Zvcm1hdCgic3RyaWtldGhyb3VnaCIpKSxTKFIuaGFzRm9ybWF0KCJ1bmRlcmxpbmUiKSksUCE9PW51bGwpaWYoYShYKSxmby4kaXNMaXN0Tm9kZShGKSl7Y29uc3QgTz1OdC4kZ2V0TmVhcmVzdE5vZGVPZlR5cGUoaixmby5MaXN0Tm9kZSksaz1PP08uZ2V0TGlzdFR5cGUoKTpGLmdldExpc3RUeXBlKCk7eShrKX1lbHNle2NvbnN0IE89QnMuJGlzSGVhZGluZ05vZGUoRik/Ri5nZXRUYWcoKTpGLmdldFR5cGUoKTtPIGluICQmJnkoTyl9fX0sW2ldKTtwLnVzZUVmZmVjdCgoKT0+TnQubWVyZ2VSZWdpc3RlcihvLnJlZ2lzdGVyVXBkYXRlTGlzdGVuZXIoKHtlZGl0b3JTdGF0ZTpSfSk9PntSLnJlYWQoKCk9PntUKCl9KX0pKSxbVCxpLG9dKSxwLnVzZUVmZmVjdCgoKT0+by5yZWdpc3RlckNvbW1hbmQoZ2UuU0VMRUNUSU9OX0NIQU5HRV9DT01NQU5ELChSLGopPT4oVCgpLGwoaiksITEpLGdlLkNPTU1BTkRfUFJJT1JJVFlfQ1JJVElDQUwpLFtvLFRdKTtjb25zdCBNPVI9PntbImgxIiwiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiJdLmluY2x1ZGVzKFIpP3YhPT1SJiZvLnVwZGF0ZSgoKT0+e2NvbnN0IGo9Z2UuJGdldFNlbGVjdGlvbigpO2dlLiRpc1JhbmdlU2VsZWN0aW9uKGopJiZPby4kc2V0QmxvY2tzVHlwZShqLCgpPT5Ccy4kY3JlYXRlSGVhZGluZ05vZGUoUikpfSk6Uj09PSJwYXJhZ3JhcGgiJiZ2IT09InBhcmFncmFwaCI/by51cGRhdGUoKCk9Pntjb25zdCBqPWdlLiRnZXRTZWxlY3Rpb24oKTsoZ2UuJGlzUmFuZ2VTZWxlY3Rpb24oail8fGdlLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihqKSkmJk9vLiRzZXRCbG9ja3NUeXBlKGosKCk9PmdlLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCkpfSk6Uj09PSJudW1iZXIiJiZ2IT09Im51bWJlciI/by5kaXNwYXRjaENvbW1hbmQoZm8uSU5TRVJUX09SREVSRURfTElTVF9DT01NQU5ELHZvaWQgMCk6Uj09PSJidWxsZXQiJiZ2IT09ImJ1bGxldCI/by5kaXNwYXRjaENvbW1hbmQoZm8uSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQsdm9pZCAwKTpvLmRpc3BhdGNoQ29tbWFuZChmby5SRU1PVkVfTElTVF9DT01NQU5ELHZvaWQgMCl9O3JldHVybiBwLnVzZUNhbGxiYWNrKCgpPT57by51cGRhdGUoKCk9Pntjb25zdCBSPWdlLiRnZXRTZWxlY3Rpb24oKTtpZihnZS4kaXNSYW5nZVNlbGVjdGlvbihSKSl7Y29uc3Qgaj1SLmFuY2hvcixGPVIuZm9jdXMsYWU9Ui5nZXROb2RlcygpO2lmKGoua2V5PT09Ri5rZXkmJmoub2Zmc2V0PT09Ri5vZmZzZXQpcmV0dXJuO2FlLmZvckVhY2goKEgsWCk9PntnZS4kaXNUZXh0Tm9kZShIKT8oWD09PTAmJmoub2Zmc2V0IT09MCYmKEg9SC5zcGxpdFRleHQoai5vZmZzZXQpWzFdfHxIKSxYPT09YWUubGVuZ3RoLTEmJihIPUguc3BsaXRUZXh0KEYub2Zmc2V0KVswXXx8SCksSC5fX3N0eWxlIT09IiImJkguc2V0U3R5bGUoIiIpLEguX19mb3JtYXQhPT0wJiYoSC5zZXRGb3JtYXQoMCksTnQuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3coSCkuc2V0Rm9ybWF0KCIiKSkpOkJzLiRpc0hlYWRpbmdOb2RlKEgpJiZILnJlcGxhY2UoZ2UuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSwhMCl9KX19KX0sW2ldKSx3LmpzeHMoImRpdiIse2NsYXNzTmFtZToic3RpY2t5IHRvcC0wIGJvcmRlci1iIGJnLWJhY2tncm91bmQgYm9yZGVyLWhpZ2hsaWdodCBmbGV4IGZsZXgtY29sIixjaGlsZHJlbjpbdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgZ2FwLTEiLGNoaWxkcmVuOlt3LmpzeChGUix7b3B0aW9uczpPYmplY3QudmFsdWVzKCQpLGxhYmVsOiRbdl0/P3YrIiAobm90IHN1cHBvcnRlZCkiLG9uQ2hhbmdlOlI9PntNKENbUl0pfX0pLHcuanN4KFhvLHt2YXJpYW50OiJwcmltYXJ5IixvbkNsaWNrOlI9PntSLnByZXZlbnREZWZhdWx0KCksby5kaXNwYXRjaENvbW1hbmQoZ2UuRk9STUFUX1RFWFRfQ09NTUFORCwiYm9sZCIpfSxhY3RpdmU6dSxpY29uOncuanN4KFBSLHtjbGFzc05hbWU6YCR7dSYmInN0cm9rZS1bM3B4XSJ9YH0pfSksdy5qc3goWG8se2FjdGl2ZTpoLG9uQ2xpY2s6Uj0+e1IucHJldmVudERlZmF1bHQoKSxvLmRpc3BhdGNoQ29tbWFuZChnZS5GT1JNQVRfVEVYVF9DT01NQU5ELCJzdHJpa2V0aHJvdWdoIil9LGljb246dy5qc3goRFIse2NsYXNzTmFtZTpgJHtoJiYic3Ryb2tlLVsycHhdIn1gfSl9KSx3LmpzeChYbyx7YWN0aXZlOmQsb25DbGljazpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLG8uZGlzcGF0Y2hDb21tYW5kKGdlLkZPUk1BVF9URVhUX0NPTU1BTkQsIml0YWxpYyIpfSxpY29uOncuanN4KEFSLHtjbGFzc05hbWU6YCR7ZCYmInN0cm9rZS1bM3B4XSJ9YH0pfSksdy5qc3goWG8se2FjdGl2ZTp4IT09bnVsbCxvbkNsaWNrOlI9PntSLnByZXZlbnREZWZhdWx0KCksXygiIiksRSgiIil9LGljb246dy5qc3goZVAse3dpZHRoOjEyLGhlaWdodDoxMixjbGFzc05hbWU6YCR7eCE9PW51bGwmJiJzdHJva2UtWzNweF0ifWB9KX0pLHcuanN4cygibGFiZWwiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIixjaGlsZHJlbjpbdy5qc3goUF8se30pLHcuanN4KCJpbnB1dCIse3R5cGU6ImZpbGUiLGhpZGRlbjohMCxvbkNoYW5nZTpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLE5TKFIpLnRoZW4oaj0+e28uZGlzcGF0Y2hDb21tYW5kKENTLHsuLi5qfSl9KS5jYXRjaChqPT57Y29uc29sZS5lcnJvcigiRXJyb3IgcmVhZGluZyBpbWFnZSIsail9KX19KV19KV19KSx4IT09bnVsbCYmdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgcC0yIixjaGlsZHJlbjpbdy5qc3goImlucHV0Iix7dHlwZToidGV4dCIscGxhY2Vob2xkZXI6IkVudGVyIFVSTCIsY2xhc3NOYW1lOiJ3LTEvMyB0ZXh0LXByaW1hcnkgYmctYmFja2dyb3VuZCBweC0yIix2YWx1ZTp4LG9uQ2hhbmdlOlI9PntSLnByZXZlbnREZWZhdWx0KCksXyhSLnRhcmdldC52YWx1ZSl9fSksdy5qc3goWG8se3ZhcmlhbnQ6InByaW1hcnkiLG9uQ2xpY2s6Uj0+e1IucHJldmVudERlZmF1bHQoKSxFKHh8fG51bGwpfSxpY29uOncuanN4KEpSLHtzaXplOjE0fSl9KSx3LmpzeChYbyx7dmFyaWFudDoicHJpbWFyeSIsb25DbGljazpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLEUobnVsbCl9LGljb246dy5qc3goclAse3NpemU6MTR9KX0pXX0pXX0pfSxpUD1vUCx0cj17dmVyc2lvbjoxLGZvcm1hdDoiIixpbmRlbnQ6MCxkaXJlY3Rpb246bnVsbH07ZnVuY3Rpb24gS2woZSx0PSExKXtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuey4uLnRyLHR5cGU6InRleHQiLGZvcm1hdDoiIix0ZXh0OmV9O2lmKCJ0YWciaW4gZSlzd2l0Y2goZS50YWcpe2Nhc2UiaDEiOnJldHVybiBJaShlKTtjYXNlImgyIjpyZXR1cm4gSWkoZSk7Y2FzZSJoMyI6cmV0dXJuIElpKGUpO2Nhc2UiaDQiOnJldHVybiBJaShlKTtjYXNlImg1IjpyZXR1cm4gSWkoZSk7Y2FzZSJoNiI6cmV0dXJuIElpKGUpO2Nhc2UibGkiOnJldHVybiBkUChlKTtjYXNlInAiOnJldHVybiB1UChlKTtjYXNlInVsIjpyZXR1cm4gSHkoZSk7Y2FzZSJvbCI6cmV0dXJuIEh5KGUpO2Nhc2Uic3BhbiI6cmV0dXJuIEFTKGUpO2Nhc2UiYSI6cmV0dXJuIHNQKGUpO2Nhc2UiaW1nIjpyZXR1cm4gbFAoZSk7Y2FzZSJiciI6cmV0dXJuIHQ/ey4uLnRyLHR5cGU6ImxpbmVicmVhayJ9OmNQKCk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBub2RlIHRhZzogIitKU09OLnN0cmluZ2lmeShlLG51bGwsMikpfWVsc2UgdGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgbm9kZTogIitKU09OLnN0cmluZ2lmeShlLG51bGwsMikpfWZ1bmN0aW9uIGxQKGUpe2NvbnN0IHQ9ZS5zcmM7cmV0dXJuey4uLnRyLHR5cGU6ImltYWdlIixzcmM6dCx3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodH19ZnVuY3Rpb24gc1AoZSl7cmV0dXJuey4uLnRyLHR5cGU6ImxpbmsiLHVybDplLmhyZWYsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAodD0+S2wodCkpfX1mdW5jdGlvbiBhUChlKXtyZXR1cm57Li4udHIsZm9ybWF0OiIiLHR5cGU6InJvb3QiLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKHQ9PktsKHQpKX19ZnVuY3Rpb24gSWkoZSl7cmV0dXJuey4uLnRyLHR5cGU6ImhlYWRpbmciLHRhZzplLnRhZyxjaGlsZHJlbjplLmNoaWxkcmVuLm1hcCh0PT5LbCh0KSl9fWZ1bmN0aW9uIHVQKGUpe3JldHVybnsuLi50cix0eXBlOiJwYXJhZ3JhcGgiLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKHQ9PktsKHQsITApKX19ZnVuY3Rpb24gY1AoKXtyZXR1cm57Li4udHIsdHlwZToicGFyYWdyYXBoIixjaGlsZHJlbjpbXX19ZnVuY3Rpb24gZFAoZSl7cmV0dXJuey4uLnRyLHR5cGU6Imxpc3RpdGVtIixjaGlsZHJlbjplLmNoaWxkcmVuLm1hcCh0PT5LbCh0LCEwKSl9fWZ1bmN0aW9uIEh5KGUpe3JldHVybnsuLi50cix0eXBlOiJsaXN0IixsaXN0VHlwZTplLnRhZz09PSJvbCI/Im51bWJlciI6ImJ1bGxldCIsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAodD0+S2wodCkpLC4uLmUuZGlyP3tkaXJlY3Rpb246ZS5kaXJ9OntkaXJlY3Rpb246bnVsbH19fWNvbnN0IGZQPXtib2xkOjEsaXRhbGljOjIsImxpbmUtdGhyb3VnaCI6NH07ZnVuY3Rpb24gaFAoZSl7cmV0dXJuIGUucmVkdWNlKCh0LG4pPT50fGZQW25dLDApfWZ1bmN0aW9uIEFTKGUpe2NvbnN0IHQ9ZS5jaGlsZHJlblswXTtyZXR1cm4gdHlwZW9mIHQ9PSJzdHJpbmciP3suLi50cix0eXBlOiJ0ZXh0Iix0ZXh0OnQsZm9ybWF0OmhQKGUuY2xhc3Nlcyl9OkFTKHsuLi50LGNsYXNzZXM6ZS5jbGFzc2VzLmNvbmNhdCh0LmNsYXNzZXMpfSl9ZnVuY3Rpb24gcFAoZSl7Y29uc29sZS5lcnJvcihlKX1jb25zdCBnUD0yOCxtUD0oe3JpY2h0ZXh0OmUsb25FZGl0b3I6dH0pPT57Y29uc3R7d2luZG93U2l6ZTpufT1zbSgpLG89e25hbWVzcGFjZToidmFsIixlZGl0b3JTdGF0ZTppPT57aS5zZXRFZGl0b3JTdGF0ZShpLnBhcnNlRWRpdG9yU3RhdGUoe3Jvb3Q6YVAoQlMoZSkpfSkpfSxub2RlczpbQnMuSGVhZGluZ05vZGUsamEsZm8uTGlzdE5vZGUsZm8uTGlzdEl0ZW1Ob2RlLFRsLkxpbmtOb2RlXSx0aGVtZTp7dGV4dDp7Ym9sZDoiZm9udC1zZW1pYm9sZCIsdW5kZXJsaW5lOiJ1bmRlcmxpbmUiLGl0YWxpYzoiaXRhbGljIixzdHJpa2V0aHJvdWdoOiJsaW5lLXRocm91Z2giLHVuZGVybGluZVN0cmlrZXRocm91Z2g6InVuZGVybGluZSBsaW5lLXRocm91Z2gifSxsaXN0OntsaXN0aXRlbToibWwtWzIwcHhdIixvbDoibGlzdC1kZWNpbWFsIix1bDoibGlzdC1kaXNjIn0saGVhZGluZzp7aDE6InRleHQtNHhsIGZvbnQtYm9sZCIsaDI6InRleHQtM3hsIGZvbnQtYm9sZCIsaDM6InRleHQtMnhsIGZvbnQtYm9sZCIsaDQ6InRleHQteGwgZm9udC1ib2xkIixoNToidGV4dC1sZyBmb250LWJvbGQiLGg2OiJ0ZXh0LW1kIGZvbnQtYm9sZCJ9LGxpbms6InRleHQtaGlnaGxpZ2h0IHVuZGVybGluZSJ9LG9uRXJyb3I6cFB9O3JldHVybiB3LmpzeHModTIuTGV4aWNhbENvbXBvc2VyLHtpbml0aWFsQ29uZmlnOm8sY2hpbGRyZW46W3cuanN4KE5SLHt9KSx3LmpzeChpUCx7b25FZGl0b3I6dH0pLHcuanN4KHVSLlJpY2hUZXh0UGx1Z2luLHtjb250ZW50RWRpdGFibGU6dy5qc3goImRpdiIse2NsYXNzTmFtZToiZm9udC1zYW5zIGJvcmRlci1iIHRleHQtcHJpbWFyeSBib3JkZXItaGlnaGxpZ2h0IixzdHlsZTp7bWluSGVpZ2h0Om4hPW51bGwmJm4uaW5uZXJIZWlnaHQ/KG49PW51bGw/dm9pZCAwOm4uaW5uZXJIZWlnaHQpLWdQOnZvaWQgMH0sY2hpbGRyZW46dy5qc3goa1Ise2NsYXNzTmFtZToicC00IG91dGxpbmUtbm9uZSBiZy1maWxsIn0pfSkscGxhY2Vob2xkZXI6dy5qc3goImRpdiIse2NsYXNzTmFtZToiIixjaGlsZHJlbjoiRW50ZXIgc29tZSB0ZXh0Li4uIn0pLEVycm9yQm91bmRhcnk6bTJ9KSx3LmpzeChDUi5MaW5rUGx1Z2luLHt9KSx3LmpzeChVUix7fSksdy5qc3gocFIuTGlzdFBsdWdpbix7fSksdy5qc3goYlIse30pLHcuanN4KCQyLkhpc3RvcnlQbHVnaW4se30pXX0pfTt2YXIgdlA9e3htbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsd2lkdGg6MjQsaGVpZ2h0OjI0LHZpZXdCb3g6IjAgMCAyNCAyNCIsZmlsbDoibm9uZSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IiLHN0cm9rZVdpZHRoOjIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9O2NvbnN0IHlQPWU9PmUucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywiJDEtJDIiKS50b0xvd2VyQ2FzZSgpLHJyPShlLHQpPT57Y29uc3Qgbj1wLmZvcndhcmRSZWYoKHtjb2xvcjpyPSJjdXJyZW50Q29sb3IiLHNpemU6bz0yNCxzdHJva2VXaWR0aDppPTIsYWJzb2x1dGVTdHJva2VXaWR0aDpsLGNoaWxkcmVuOnMsLi4uYX0sdSk9PnAuY3JlYXRlRWxlbWVudCgic3ZnIix7cmVmOnUsLi4udlAsd2lkdGg6byxoZWlnaHQ6byxzdHJva2U6cixzdHJva2VXaWR0aDpsP051bWJlcihpKSoyNC9OdW1iZXIobyk6aSxjbGFzc05hbWU6YGx1Y2lkZSBsdWNpZGUtJHt5UChlKX1gLC4uLmF9LFsuLi50Lm1hcCgoW2MsZF0pPT5wLmNyZWF0ZUVsZW1lbnQoYyxkKSksLi4uKEFycmF5LmlzQXJyYXkocyk/czpbc10pfHxbXV0pKTtyZXR1cm4gbi5kaXNwbGF5TmFtZT1gJHtlfWAsbn0seFA9cnIoIkNoZWNrIixbWyJwb2x5bGluZSIse3BvaW50czoiMjAgNiA5IDE3IDQgMTIiLGtleToiMTBqamZqIn1dXSksTVM9cnIoIkNoZXZyb25Eb3duIixbWyJwYXRoIix7ZDoibTYgOSA2IDYgNi02IixrZXk6InFydW5zbCJ9XV0pLF9QPXJyKCJDaGV2cm9uTGVmdCIsW1sicGF0aCIse2Q6Im0xNSAxOC02LTYgNi02IixrZXk6IjF3bmZnMyJ9XV0pLHdQPXJyKCJNYXhpbWl6ZSIsW1sicGF0aCIse2Q6Ik04IDNINWEyIDIgMCAwIDAtMiAydjMiLGtleToiMWRjbWl0In1dLFsicGF0aCIse2Q6Ik0yMSA4VjVhMiAyIDAgMCAwLTItMmgtMyIsa2V5OiIxZTRndDMifV0sWyJwYXRoIix7ZDoiTTMgMTZ2M2EyIDIgMCAwIDAgMiAyaDMiLGtleToid3NsNXNjIn1dLFsicGF0aCIse2Q6Ik0xNiAyMWgzYTIgMiAwIDAgMCAyLTJ2LTMiLGtleToiMTh0cmVrIn1dXSksU1A9cnIoIk1pbmltaXplIixbWyJwYXRoIix7ZDoiTTggM3YzYTIgMiAwIDAgMS0yIDJIMyIsa2V5OiJob2hidHIifV0sWyJwYXRoIix7ZDoiTTIxIDhoLTNhMiAyIDAgMCAxLTItMlYzIixrZXk6IjVqdzFmMyJ9XSxbInBhdGgiLHtkOiJNMyAxNmgzYTIgMiAwIDAgMSAyIDJ2MyIsa2V5OiIxOTh0dnIifV0sWyJwYXRoIix7ZDoiTTE2IDIxdi0zYTIgMiAwIDAgMSAyLTJoMyIsa2V5OiJwaDhteHAifV1dKSxFUD1ycigiTW9vbiIsW1sicGF0aCIse2Q6Ik0xMiAzYTYgNiAwIDAgMCA5IDkgOSA5IDAgMSAxLTktOVoiLGtleToiYTd0bjE4In1dXSksQ1A9cnIoIlBhdXNlIixbWyJyZWN0Iix7d2lkdGg6IjQiLGhlaWdodDoiMTYiLHg6IjYiLHk6IjQiLGtleToiaWZmaGU0In1dLFsicmVjdCIse3dpZHRoOiI0IixoZWlnaHQ6IjE2Iix4OiIxNCIseToiNCIsa2V5OiJzamluN2oifV1dKSwkUD1ycigiUGxheSIsW1sicG9seWdvbiIse3BvaW50czoiNSAzIDE5IDEyIDUgMjEgNSAzIixrZXk6IjE5MTYzNyJ9XV0pLGtQPXJyKCJQb3dlciIsW1sicGF0aCIse2Q6Ik0xMiAydjEwIixrZXk6Im1uZmJsIn1dLFsicGF0aCIse2Q6Ik0xOC40IDYuNmE5IDkgMCAxIDEtMTIuNzcuMDQiLGtleToib2JvZnU5In1dXSksVFA9cnIoIlN1biIsW1siY2lyY2xlIix7Y3g6IjEyIixjeToiMTIiLHI6IjQiLGtleToiNGV4aXAyIn1dLFsicGF0aCIse2Q6Ik0xMiAydjIiLGtleToidHVzMDNtIn1dLFsicGF0aCIse2Q6Ik0xMiAyMHYyIixrZXk6IjFsaDFrZyJ9XSxbInBhdGgiLHtkOiJtNC45MyA0LjkzIDEuNDEgMS40MSIsa2V5OiIxNDl0NmoifV0sWyJwYXRoIix7ZDoibTE3LjY2IDE3LjY2IDEuNDEgMS40MSIsa2V5OiJwdGJndXYifV0sWyJwYXRoIix7ZDoiTTIgMTJoMiIsa2V5OiIxdDhmOG4ifV0sWyJwYXRoIix7ZDoiTTIwIDEyaDIiLGtleToiMXE4bWp3In1dLFsicGF0aCIse2Q6Im02LjM0IDE3LjY2LTEuNDEgMS40MSIsa2V5OiIxbTh6ejUifV0sWyJwYXRoIix7ZDoibTE5LjA3IDQuOTMtMS40MSAxLjQxIixrZXk6IjFzaGxjcyJ9XV0pLE5QPXJyKCJYIixbWyJwYXRoIix7ZDoiTTE4IDYgNiAxOCIsa2V5OiIxYmw1ZjgifV0sWyJwYXRoIix7ZDoibTYgNiAxMiAxMiIsa2V5OiJkOGJrNnYifV1dKSxEUz0icC0xIGJvcmRlciByb3VuZGVkLWZ1bGwgc2hhZG93IGJvcmRlci1hY2NlbnQiLEt5PSJ2YWxidWlsZDp1cmxCZWZvcmVOYXZpZ2F0aW9uIjtmdW5jdGlvbiBiUCh7YXBpOmV9KXtjb25zdHt0aGVtZTp0LHNldFRoZW1lOm4sZWRpdE1vZGU6cixzZXRFZGl0TW9kZTpvfT1zbSgpO3JldHVybiB3LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1mdWxsIGgtZnVsbCBweC0xIHB5LTIgYm9yZGVyLTIgcm91bmRlZC1mdWxsIGdhcC14LTMgdGV4dC1wcmltYXJ5IGJnLWJhY2tncm91bmQgYm9yZGVyLWZpbGwiLGNoaWxkcmVuOlt3LmpzeChFZix7YWN0aXZlOnI9PT0iaG92ZXIiLG9uQ2xpY2s6KCk9PntvKGk9Pmk9PT0iaG92ZXIiPyJvZmYiOiJob3ZlciIpfSxjaGlsZHJlbjp3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJoLVsyNHB4XSB3LVsyNHB4XSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciIsY2hpbGRyZW46cj09PSJob3ZlciI/dy5qc3goQ1Ase3NpemU6MTh9KTp3LmpzeCgkUCx7c2l6ZToxOH0pfSl9KSx3LmpzeChFZix7b25DbGljazooKT0+e24odD09PSJkYXJrIj8ibGlnaHQiOiJkYXJrIil9LGNoaWxkcmVuOncuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJoLVsyNHB4XSB3LVsyNHB4XSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciIsY2hpbGRyZW46W3Q9PT0iZGFyayImJncuanN4KFRQLHtzaXplOjE1fSksdD09PSJsaWdodCImJncuanN4KEVQLHtzaXplOjE1fSldfSl9KSx3LmpzeChFZix7YWN0aXZlOnI9PT0iZnVsbCIsb25DbGljazooKT0+e2lmKHIhPT0iZnVsbCIpbG9jYWxTdG9yYWdlLnNldEl0ZW0oS3ksd2luZG93LmxvY2F0aW9uLmhyZWYpLHdpbmRvdy5sb2NhdGlvbi5ocmVmPWUuZ2V0RWRpdFVybCgpO2Vsc2UgaWYocj09PSJmdWxsIil7Y29uc3QgaT1sb2NhbFN0b3JhZ2UuZ2V0SXRlbShLeSk7d2luZG93LmxvY2F0aW9uLmhyZWY9aXx8Ii8ifX0sY2hpbGRyZW46dy5qc3goImRpdiIse2NsYXNzTmFtZToiaC1bMjRweF0gdy1bMjRweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIiLGNoaWxkcmVuOnI9PT0iZnVsbCI/dy5qc3goU1Ase3NpemU6MTV9KTp3LmpzeCh3UCx7c2l6ZToxNX0pfSl9KSx3LmpzeCgiYSIse2NsYXNzTmFtZTpEUyxocmVmOmUuZ2V0RGlzYWJsZVVybCgpLGNoaWxkcmVuOncuanN4KCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjp3LmpzeChrUCx7c2l6ZToxOH0pfSl9KV19KX1mdW5jdGlvbiBFZih7YWN0aXZlOmUsb25DbGljazp0LGNoaWxkcmVuOm59KXtyZXR1cm4gdy5qc3goImJ1dHRvbiIse2NsYXNzTmFtZTpyZChEUyx7ImJnLWFjY2VudCBkcm9wLXNoYWRvdy1bMHB4XzBweF8xMnB4X3JnYmEoNTYsMjA1LDE1MiwwLjYwKV0iOmV9KSxvbkNsaWNrOnQsY2hpbGRyZW46bn0pfWZ1bmN0aW9uIExTKGUpe3ZhciB0LG4scj0iIjtpZih0eXBlb2YgZT09InN0cmluZyJ8fHR5cGVvZiBlPT0ibnVtYmVyIilyKz1lO2Vsc2UgaWYodHlwZW9mIGU9PSJvYmplY3QiKWlmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdJiYobj1MUyhlW3RdKSkmJihyJiYocis9IiAiKSxyKz1uKTtlbHNlIGZvcih0IGluIGUpZVt0XSYmKHImJihyKz0iICIpLHIrPXQpO3JldHVybiByfWZ1bmN0aW9uIFJQKCl7Zm9yKHZhciBlLHQsbj0wLHI9IiI7bjxhcmd1bWVudHMubGVuZ3RoOykoZT1hcmd1bWVudHNbbisrXSkmJih0PUxTKGUpKSYmKHImJihyKz0iICIpLHIrPXQpO3JldHVybiByfWNvbnN0IEd5PWU9PnR5cGVvZiBlPT0iYm9vbGVhbiI/IiIuY29uY2F0KGUpOmU9PT0wPyIwIjplLFl5PVJQLFBQPShlLHQpPT5uPT57dmFyIHI7aWYoKHQ9PW51bGw/dm9pZCAwOnQudmFyaWFudHMpPT1udWxsKXJldHVybiBZeShlLG49PW51bGw/dm9pZCAwOm4uY2xhc3Msbj09bnVsbD92b2lkIDA6bi5jbGFzc05hbWUpO2NvbnN0e3ZhcmlhbnRzOm8sZGVmYXVsdFZhcmlhbnRzOml9PXQsbD1PYmplY3Qua2V5cyhvKS5tYXAodT0+e2NvbnN0IGM9bj09bnVsbD92b2lkIDA6blt1XSxkPWk9PW51bGw/dm9pZCAwOmlbdV07aWYoYz09PW51bGwpcmV0dXJuIG51bGw7Y29uc3QgZj1HeShjKXx8R3koZCk7cmV0dXJuIG9bdV1bZl19KSxzPW4mJk9iamVjdC5lbnRyaWVzKG4pLnJlZHVjZSgodSxjKT0+e2xldFtkLGZdPWM7cmV0dXJuIGY9PT12b2lkIDB8fCh1W2RdPWYpLHV9LHt9KSxhPXQ9PW51bGx8fChyPXQuY29tcG91bmRWYXJpYW50cyk9PT1udWxsfHxyPT09dm9pZCAwP3ZvaWQgMDpyLnJlZHVjZSgodSxjKT0+e2xldHtjbGFzczpkLGNsYXNzTmFtZTpmLC4uLmh9PWM7cmV0dXJuIE9iamVjdC5lbnRyaWVzKGgpLmV2ZXJ5KGc9PntsZXRbbSxTXT1nO3JldHVybiBBcnJheS5pc0FycmF5KFMpP1MuaW5jbHVkZXMoey4uLmksLi4uc31bbV0pOnsuLi5pLC4uLnN9W21dPT09U30pP1suLi51LGQsZl06dX0sW10pO3JldHVybiBZeShlLGwsYSxuPT1udWxsP3ZvaWQgMDpuLmNsYXNzLG49PW51bGw/dm9pZCAwOm4uY2xhc3NOYW1lKX0sT1A9UFAoImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3aGl0ZXNwYWNlLW5vd3JhcCByb3VuZGVkLW1kIHRleHQtc20gZm9udC1tZWRpdW0gcmluZy1vZmZzZXQtYmFja2dyb3VuZCB0cmFuc2l0aW9uLWNvbG9ycyBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpvcGFjaXR5LTUwIix7dmFyaWFudHM6e3ZhcmlhbnQ6e2RlZmF1bHQ6ImJnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgaG92ZXI6YmctcHJpbWFyeS85MCIsZGVzdHJ1Y3RpdmU6ImJnLWRlc3RydWN0aXZlIHRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCBob3ZlcjpiZy1kZXN0cnVjdGl2ZS85MCIsb3V0bGluZToiYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIixzZWNvbmRhcnk6ImJnLXNlY29uZGFyeSB0ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5kIGhvdmVyOmJnLXNlY29uZGFyeS84MCIsZ2hvc3Q6ImhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIixsaW5rOiJ0ZXh0LXByaW1hcnkgdW5kZXJsaW5lLW9mZnNldC00IGhvdmVyOnVuZGVybGluZSJ9LHNpemU6e2RlZmF1bHQ6ImgtMTAgcHgtNCBweS0yIixzbToiaC05IHJvdW5kZWQtbWQgcHgtMyIsbGc6ImgtMTEgcm91bmRlZC1tZCBweC04IixpY29uOiJoLTEwIHctMTAifX0sZGVmYXVsdFZhcmlhbnRzOnt2YXJpYW50OiJkZWZhdWx0IixzaXplOiJkZWZhdWx0In19KSxHbD1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSx2YXJpYW50OnQsc2l6ZTpuLGFzQ2hpbGQ6cj0hMSwuLi5vfSxpKT0+e2NvbnN0IGw9cj9FbDoiYnV0dG9uIjtyZXR1cm4gdy5qc3gobCx7Y2xhc3NOYW1lOm90KE9QKHt2YXJpYW50OnQsc2l6ZTpuLGNsYXNzTmFtZTplfSkpLHJlZjppLC4uLm99KX0pO0dsLmRpc3BsYXlOYW1lPSJCdXR0b24iO2Z1bmN0aW9uIEFQKGU9ImRhcmsiKXtjb25zdFt0LG5dPXAudXNlU3RhdGUoZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57bG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhbC10aGVtZSIpPT09ImxpZ2h0Ij9uKCJsaWdodCIpOmxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ2YWwtdGhlbWUiKT09PSJkYXJrInx8d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikubWF0Y2hlcz9uKCJkYXJrIik6d2luZG93Lm1hdGNoTWVkaWEmJndpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGxpZ2h0KSIpLm1hdGNoZXMmJm4oImxpZ2h0Iik7Y29uc3Qgcj1vPT57bG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhbC10aGVtZSIpfHxuKG8ubWF0Y2hlcz8iZGFyayI6ImxpZ2h0Iil9O3JldHVybiB3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpLmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsciksKCk9Pnt3aW5kb3cubWF0Y2hNZWRpYSgiKHByZWZlcnMtY29sb3Itc2NoZW1lOiBkYXJrKSIpLnJlbW92ZUV2ZW50TGlzdGVuZXIoImNoYW5nZSIscil9fSxbXSksW3Qscj0+e2xvY2FsU3RvcmFnZS5zZXRJdGVtKCJ2YWwtdGhlbWUiLHIpLG4ocil9XX1mdW5jdGlvbiBkbSgpe3JldHVybnthc3luYzohMSxicmVha3M6ITEsZXh0ZW5zaW9uczpudWxsLGdmbTohMCxob29rczpudWxsLHBlZGFudGljOiExLHJlbmRlcmVyOm51bGwsc2lsZW50OiExLHRva2VuaXplcjpudWxsLHdhbGtUb2tlbnM6bnVsbH19bGV0IE5pPWRtKCk7ZnVuY3Rpb24gSVMoZSl7Tmk9ZX1jb25zdCBqUz0vWyY8PiInXS8sTVA9bmV3IFJlZ0V4cChqUy5zb3VyY2UsImciKSx6Uz0vWzw+IiddfCYoPyEoI1xkezEsN318I1tYeF1bYS1mQS1GMC05XXsxLDZ9fFx3Kyk7KS8sRFA9bmV3IFJlZ0V4cCh6Uy5zb3VyY2UsImciKSxMUD17IiYiOiImYW1wOyIsIjwiOiImbHQ7IiwiPiI6IiZndDsiLCciJzoiJnF1b3Q7IiwiJyI6IiYjMzk7In0sWHk9ZT0+TFBbZV07ZnVuY3Rpb24gbW4oZSx0KXtpZih0KXtpZihqUy50ZXN0KGUpKXJldHVybiBlLnJlcGxhY2UoTVAsWHkpfWVsc2UgaWYoelMudGVzdChlKSlyZXR1cm4gZS5yZXBsYWNlKERQLFh5KTtyZXR1cm4gZX1jb25zdCBJUD0vJigjKD86XGQrKXwoPzojeFswLTlBLUZhLWZdKyl8KD86XHcrKSk7Py9pZztmdW5jdGlvbiBqUChlKXtyZXR1cm4gZS5yZXBsYWNlKElQLCh0LG4pPT4obj1uLnRvTG93ZXJDYXNlKCksbj09PSJjb2xvbiI/IjoiOm4uY2hhckF0KDApPT09IiMiP24uY2hhckF0KDEpPT09IngiP1N0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQobi5zdWJzdHJpbmcoMiksMTYpKTpTdHJpbmcuZnJvbUNoYXJDb2RlKCtuLnN1YnN0cmluZygxKSk6IiIpKX1jb25zdCB6UD0vKF58W15cW10pXF4vZztmdW5jdGlvbiBSZShlLHQpe2U9dHlwZW9mIGU9PSJzdHJpbmciP2U6ZS5zb3VyY2UsdD10fHwiIjtjb25zdCBuPXtyZXBsYWNlOihyLG8pPT4obz10eXBlb2Ygbz09Im9iamVjdCImJiJzb3VyY2UiaW4gbz9vLnNvdXJjZTpvLG89by5yZXBsYWNlKHpQLCIkMSIpLGU9ZS5yZXBsYWNlKHIsbyksbiksZ2V0UmVnZXg6KCk9Pm5ldyBSZWdFeHAoZSx0KX07cmV0dXJuIG59ZnVuY3Rpb24gUXkoZSl7dHJ5e2U9ZW5jb2RlVVJJKGUpLnJlcGxhY2UoLyUyNS9nLCIlIil9Y2F0Y2h7cmV0dXJuIG51bGx9cmV0dXJuIGV9Y29uc3QgYmM9e2V4ZWM6KCk9Pm51bGx9O2Z1bmN0aW9uIEp5KGUsdCl7Y29uc3Qgbj1lLnJlcGxhY2UoL1x8L2csKGksbCxzKT0+e2xldCBhPSExLHU9bDtmb3IoOy0tdT49MCYmc1t1XT09PSJcXCI7KWE9IWE7cmV0dXJuIGE/InwiOiIgfCJ9KSxyPW4uc3BsaXQoLyBcfC8pO2xldCBvPTA7aWYoclswXS50cmltKCl8fHIuc2hpZnQoKSxyLmxlbmd0aD4wJiYhcltyLmxlbmd0aC0xXS50cmltKCkmJnIucG9wKCksdClpZihyLmxlbmd0aD50KXIuc3BsaWNlKHQpO2Vsc2UgZm9yKDtyLmxlbmd0aDx0OylyLnB1c2goIiIpO2Zvcig7bzxyLmxlbmd0aDtvKyspcltvXT1yW29dLnRyaW0oKS5yZXBsYWNlKC9cXFx8L2csInwiKTtyZXR1cm4gcn1mdW5jdGlvbiBDZihlLHQsbil7Y29uc3Qgcj1lLmxlbmd0aDtpZihyPT09MClyZXR1cm4iIjtsZXQgbz0wO2Zvcig7bzxyOyl7Y29uc3QgaT1lLmNoYXJBdChyLW8tMSk7aWYoaT09PXQmJiFuKW8rKztlbHNlIGlmKGkhPT10JiZuKW8rKztlbHNlIGJyZWFrfXJldHVybiBlLnNsaWNlKDAsci1vKX1mdW5jdGlvbiBGUChlLHQpe2lmKGUuaW5kZXhPZih0WzFdKT09PS0xKXJldHVybi0xO2xldCBuPTA7Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspaWYoZVtyXT09PSJcXCIpcisrO2Vsc2UgaWYoZVtyXT09PXRbMF0pbisrO2Vsc2UgaWYoZVtyXT09PXRbMV0mJihuLS0sbjwwKSlyZXR1cm4gcjtyZXR1cm4tMX1mdW5jdGlvbiBaeShlLHQsbixyKXtjb25zdCBvPXQuaHJlZixpPXQudGl0bGU/bW4odC50aXRsZSk6bnVsbCxsPWVbMV0ucmVwbGFjZSgvXFwoW1xbXF1dKS9nLCIkMSIpO2lmKGVbMF0uY2hhckF0KDApIT09IiEiKXtyLnN0YXRlLmluTGluaz0hMDtjb25zdCBzPXt0eXBlOiJsaW5rIixyYXc6bixocmVmOm8sdGl0bGU6aSx0ZXh0OmwsdG9rZW5zOnIuaW5saW5lVG9rZW5zKGwpfTtyZXR1cm4gci5zdGF0ZS5pbkxpbms9ITEsc31yZXR1cm57dHlwZToiaW1hZ2UiLHJhdzpuLGhyZWY6byx0aXRsZTppLHRleHQ6bW4obCl9fWZ1bmN0aW9uIEJQKGUsdCl7Y29uc3Qgbj1lLm1hdGNoKC9eKFxzKykoPzpgYGApLyk7aWYobj09PW51bGwpcmV0dXJuIHQ7Y29uc3Qgcj1uWzFdO3JldHVybiB0LnNwbGl0KGAKYCkubWFwKG89Pntjb25zdCBpPW8ubWF0Y2goL15ccysvKTtpZihpPT09bnVsbClyZXR1cm4gbztjb25zdFtsXT1pO3JldHVybiBsLmxlbmd0aD49ci5sZW5ndGg/by5zbGljZShyLmxlbmd0aCk6b30pLmpvaW4oYApgKX1jbGFzcyBSY3tjb25zdHJ1Y3Rvcih0KXtqZSh0aGlzLCJvcHRpb25zIik7amUodGhpcywicnVsZXMiKTtqZSh0aGlzLCJsZXhlciIpO3RoaXMub3B0aW9ucz10fHxOaX1zcGFjZSh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2submV3bGluZS5leGVjKHQpO2lmKG4mJm5bMF0ubGVuZ3RoPjApcmV0dXJue3R5cGU6InNwYWNlIixyYXc6blswXX19Y29kZSh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2suY29kZS5leGVjKHQpO2lmKG4pe2NvbnN0IHI9blswXS5yZXBsYWNlKC9eIHsxLDR9L2dtLCIiKTtyZXR1cm57dHlwZToiY29kZSIscmF3Om5bMF0sY29kZUJsb2NrU3R5bGU6ImluZGVudGVkIix0ZXh0OnRoaXMub3B0aW9ucy5wZWRhbnRpYz9yOkNmKHIsYApgKX19fWZlbmNlcyh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2suZmVuY2VzLmV4ZWModCk7aWYobil7Y29uc3Qgcj1uWzBdLG89QlAocixuWzNdfHwiIik7cmV0dXJue3R5cGU6ImNvZGUiLHJhdzpyLGxhbmc6blsyXT9uWzJdLnRyaW0oKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLl9lc2NhcGVzLCIkMSIpOm5bMl0sdGV4dDpvfX19aGVhZGluZyh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2suaGVhZGluZy5leGVjKHQpO2lmKG4pe2xldCByPW5bMl0udHJpbSgpO2lmKC8jJC8udGVzdChyKSl7Y29uc3Qgbz1DZihyLCIjIik7KHRoaXMub3B0aW9ucy5wZWRhbnRpY3x8IW98fC8gJC8udGVzdChvKSkmJihyPW8udHJpbSgpKX1yZXR1cm57dHlwZToiaGVhZGluZyIscmF3Om5bMF0sZGVwdGg6blsxXS5sZW5ndGgsdGV4dDpyLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShyKX19fWhyKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5oci5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6ImhyIixyYXc6blswXX19YmxvY2txdW90ZSh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2suYmxvY2txdW90ZS5leGVjKHQpO2lmKG4pe2NvbnN0IHI9blswXS5yZXBsYWNlKC9eICo+WyBcdF0/L2dtLCIiKSxvPXRoaXMubGV4ZXIuc3RhdGUudG9wO3RoaXMubGV4ZXIuc3RhdGUudG9wPSEwO2NvbnN0IGk9dGhpcy5sZXhlci5ibG9ja1Rva2VucyhyKTtyZXR1cm4gdGhpcy5sZXhlci5zdGF0ZS50b3A9byx7dHlwZToiYmxvY2txdW90ZSIscmF3Om5bMF0sdG9rZW5zOmksdGV4dDpyfX19bGlzdCh0KXtsZXQgbj10aGlzLnJ1bGVzLmJsb2NrLmxpc3QuZXhlYyh0KTtpZihuKXtsZXQgcj1uWzFdLnRyaW0oKTtjb25zdCBvPXIubGVuZ3RoPjEsaT17dHlwZToibGlzdCIscmF3OiIiLG9yZGVyZWQ6byxzdGFydDpvPytyLnNsaWNlKDAsLTEpOiIiLGxvb3NlOiExLGl0ZW1zOltdfTtyPW8/YFxcZHsxLDl9XFwke3Iuc2xpY2UoLTEpfWA6YFxcJHtyfWAsdGhpcy5vcHRpb25zLnBlZGFudGljJiYocj1vP3I6IlsqKy1dIik7Y29uc3QgbD1uZXcgUmVnRXhwKGBeKCB7MCwzfSR7cn0pKCg/OlsJIF1bXlxcbl0qKT8oPzpcXG58JCkpYCk7bGV0IHM9IiIsYT0iIix1PSExO2Zvcig7dDspe2xldCBjPSExO2lmKCEobj1sLmV4ZWModCkpfHx0aGlzLnJ1bGVzLmJsb2NrLmhyLnRlc3QodCkpYnJlYWs7cz1uWzBdLHQ9dC5zdWJzdHJpbmcocy5sZW5ndGgpO2xldCBkPW5bMl0uc3BsaXQoYApgLDEpWzBdLnJlcGxhY2UoL15cdCsvLHY9PiIgIi5yZXBlYXQoMyp2Lmxlbmd0aCkpLGY9dC5zcGxpdChgCmAsMSlbMF0saD0wO3RoaXMub3B0aW9ucy5wZWRhbnRpYz8oaD0yLGE9ZC50cmltU3RhcnQoKSk6KGg9blsyXS5zZWFyY2goL1teIF0vKSxoPWg+ND8xOmgsYT1kLnNsaWNlKGgpLGgrPW5bMV0ubGVuZ3RoKTtsZXQgZz0hMTtpZighZCYmL14gKiQvLnRlc3QoZikmJihzKz1mK2AKYCx0PXQuc3Vic3RyaW5nKGYubGVuZ3RoKzEpLGM9ITApLCFjKXtjb25zdCB2PW5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGgtMSl9fSg/OlsqKy1dfFxcZHsxLDl9Wy4pXSkoKD86WyAJXVteXFxuXSopPyg/OlxcbnwkKSlgKSx5PW5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGgtMSl9fSgoPzotICopezMsfXwoPzpfICopezMsfXwoPzpcXCogKil7Myx9KSg/Olxcbit8JClgKSx4PW5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGgtMSl9fSg/OlxgXGBcYHx+fn4pYCksXz1uZXcgUmVnRXhwKGBeIHswLCR7TWF0aC5taW4oMyxoLTEpfX0jYCk7Zm9yKDt0Oyl7Y29uc3QgRT10LnNwbGl0KGAKYCwxKVswXTtpZihmPUUsdGhpcy5vcHRpb25zLnBlZGFudGljJiYoZj1mLnJlcGxhY2UoL14gezEsNH0oPz0oIHs0fSkqW14gXSkvZywiICAiKSkseC50ZXN0KGYpfHxfLnRlc3QoZil8fHYudGVzdChmKXx8eS50ZXN0KHQpKWJyZWFrO2lmKGYuc2VhcmNoKC9bXiBdLyk+PWh8fCFmLnRyaW0oKSlhKz1gCmArZi5zbGljZShoKTtlbHNle2lmKGd8fGQuc2VhcmNoKC9bXiBdLyk+PTR8fHgudGVzdChkKXx8Xy50ZXN0KGQpfHx5LnRlc3QoZCkpYnJlYWs7YSs9YApgK2Z9IWcmJiFmLnRyaW0oKSYmKGc9ITApLHMrPUUrYApgLHQ9dC5zdWJzdHJpbmcoRS5sZW5ndGgrMSksZD1mLnNsaWNlKGgpfX1pLmxvb3NlfHwodT9pLmxvb3NlPSEwOi9cbiAqXG4gKiQvLnRlc3QocykmJih1PSEwKSk7bGV0IG09bnVsbCxTO3RoaXMub3B0aW9ucy5nZm0mJihtPS9eXFtbIHhYXVxdIC8uZXhlYyhhKSxtJiYoUz1tWzBdIT09IlsgXSAiLGE9YS5yZXBsYWNlKC9eXFtbIHhYXVxdICsvLCIiKSkpLGkuaXRlbXMucHVzaCh7dHlwZToibGlzdF9pdGVtIixyYXc6cyx0YXNrOiEhbSxjaGVja2VkOlMsbG9vc2U6ITEsdGV4dDphLHRva2VuczpbXX0pLGkucmF3Kz1zfWkuaXRlbXNbaS5pdGVtcy5sZW5ndGgtMV0ucmF3PXMudHJpbUVuZCgpLGkuaXRlbXNbaS5pdGVtcy5sZW5ndGgtMV0udGV4dD1hLnRyaW1FbmQoKSxpLnJhdz1pLnJhdy50cmltRW5kKCk7Zm9yKGxldCBjPTA7YzxpLml0ZW1zLmxlbmd0aDtjKyspaWYodGhpcy5sZXhlci5zdGF0ZS50b3A9ITEsaS5pdGVtc1tjXS50b2tlbnM9dGhpcy5sZXhlci5ibG9ja1Rva2VucyhpLml0ZW1zW2NdLnRleHQsW10pLCFpLmxvb3NlKXtjb25zdCBkPWkuaXRlbXNbY10udG9rZW5zLmZpbHRlcihoPT5oLnR5cGU9PT0ic3BhY2UiKSxmPWQubGVuZ3RoPjAmJmQuc29tZShoPT4vXG4uKlxuLy50ZXN0KGgucmF3KSk7aS5sb29zZT1mfWlmKGkubG9vc2UpZm9yKGxldCBjPTA7YzxpLml0ZW1zLmxlbmd0aDtjKyspaS5pdGVtc1tjXS5sb29zZT0hMDtyZXR1cm4gaX19aHRtbCh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2suaHRtbC5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6Imh0bWwiLGJsb2NrOiEwLHJhdzpuWzBdLHByZTpuWzFdPT09InByZSJ8fG5bMV09PT0ic2NyaXB0Inx8blsxXT09PSJzdHlsZSIsdGV4dDpuWzBdfX1kZWYodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmRlZi5leGVjKHQpO2lmKG4pe2NvbnN0IHI9blsxXS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xzKy9nLCIgIiksbz1uWzJdP25bMl0ucmVwbGFjZSgvXjwoLiopPiQvLCIkMSIpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIik6IiIsaT1uWzNdP25bM10uc3Vic3RyaW5nKDEsblszXS5sZW5ndGgtMSkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5fZXNjYXBlcywiJDEiKTpuWzNdO3JldHVybnt0eXBlOiJkZWYiLHRhZzpyLHJhdzpuWzBdLGhyZWY6byx0aXRsZTppfX19dGFibGUodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLnRhYmxlLmV4ZWModCk7aWYobil7aWYoIS9bOnxdLy50ZXN0KG5bMl0pKXJldHVybjtjb25zdCByPXt0eXBlOiJ0YWJsZSIscmF3Om5bMF0saGVhZGVyOkp5KG5bMV0pLm1hcChvPT4oe3RleHQ6byx0b2tlbnM6W119KSksYWxpZ246blsyXS5yZXBsYWNlKC9eXHx8XHwgKiQvZywiIikuc3BsaXQoInwiKSxyb3dzOm5bM10mJm5bM10udHJpbSgpP25bM10ucmVwbGFjZSgvXG5bIFx0XSokLywiIikuc3BsaXQoYApgKTpbXX07aWYoci5oZWFkZXIubGVuZ3RoPT09ci5hbGlnbi5sZW5ndGgpe2xldCBvPXIuYWxpZ24ubGVuZ3RoLGksbCxzLGE7Zm9yKGk9MDtpPG87aSsrKXtjb25zdCB1PXIuYWxpZ25baV07dSYmKC9eICotKzogKiQvLnRlc3QodSk/ci5hbGlnbltpXT0icmlnaHQiOi9eICo6LSs6ICokLy50ZXN0KHUpP3IuYWxpZ25baV09ImNlbnRlciI6L14gKjotKyAqJC8udGVzdCh1KT9yLmFsaWduW2ldPSJsZWZ0IjpyLmFsaWduW2ldPW51bGwpfWZvcihvPXIucm93cy5sZW5ndGgsaT0wO2k8bztpKyspci5yb3dzW2ldPUp5KHIucm93c1tpXSxyLmhlYWRlci5sZW5ndGgpLm1hcCh1PT4oe3RleHQ6dSx0b2tlbnM6W119KSk7Zm9yKG89ci5oZWFkZXIubGVuZ3RoLGw9MDtsPG87bCsrKXIuaGVhZGVyW2xdLnRva2Vucz10aGlzLmxleGVyLmlubGluZShyLmhlYWRlcltsXS50ZXh0KTtmb3Iobz1yLnJvd3MubGVuZ3RoLGw9MDtsPG87bCsrKWZvcihhPXIucm93c1tsXSxzPTA7czxhLmxlbmd0aDtzKyspYVtzXS50b2tlbnM9dGhpcy5sZXhlci5pbmxpbmUoYVtzXS50ZXh0KTtyZXR1cm4gcn19fWxoZWFkaW5nKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5saGVhZGluZy5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6ImhlYWRpbmciLHJhdzpuWzBdLGRlcHRoOm5bMl0uY2hhckF0KDApPT09Ij0iPzE6Mix0ZXh0Om5bMV0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG5bMV0pfX1wYXJhZ3JhcGgodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLnBhcmFncmFwaC5leGVjKHQpO2lmKG4pe2NvbnN0IHI9blsxXS5jaGFyQXQoblsxXS5sZW5ndGgtMSk9PT1gCmA/blsxXS5zbGljZSgwLC0xKTpuWzFdO3JldHVybnt0eXBlOiJwYXJhZ3JhcGgiLHJhdzpuWzBdLHRleHQ6cix0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUocil9fX10ZXh0KHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay50ZXh0LmV4ZWModCk7aWYobilyZXR1cm57dHlwZToidGV4dCIscmF3Om5bMF0sdGV4dDpuWzBdLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShuWzBdKX19ZXNjYXBlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuZXNjYXBlLmV4ZWModCk7aWYobilyZXR1cm57dHlwZToiZXNjYXBlIixyYXc6blswXSx0ZXh0Om1uKG5bMV0pfX10YWcodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS50YWcuZXhlYyh0KTtpZihuKXJldHVybiF0aGlzLmxleGVyLnN0YXRlLmluTGluayYmL148YSAvaS50ZXN0KG5bMF0pP3RoaXMubGV4ZXIuc3RhdGUuaW5MaW5rPSEwOnRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rJiYvXjxcL2E+L2kudGVzdChuWzBdKSYmKHRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rPSExKSwhdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrJiYvXjwocHJlfGNvZGV8a2JkfHNjcmlwdCkoXHN8PikvaS50ZXN0KG5bMF0pP3RoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaz0hMDp0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2smJi9ePFwvKHByZXxjb2RlfGtiZHxzY3JpcHQpKFxzfD4pL2kudGVzdChuWzBdKSYmKHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaz0hMSkse3R5cGU6Imh0bWwiLHJhdzpuWzBdLGluTGluazp0aGlzLmxleGVyLnN0YXRlLmluTGluayxpblJhd0Jsb2NrOnRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayxibG9jazohMSx0ZXh0Om5bMF19fWxpbmsodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5saW5rLmV4ZWModCk7aWYobil7Y29uc3Qgcj1uWzJdLnRyaW0oKTtpZighdGhpcy5vcHRpb25zLnBlZGFudGljJiYvXjwvLnRlc3Qocikpe2lmKCEvPiQvLnRlc3QocikpcmV0dXJuO2NvbnN0IGw9Q2Yoci5zbGljZSgwLC0xKSwiXFwiKTtpZigoci5sZW5ndGgtbC5sZW5ndGgpJTI9PT0wKXJldHVybn1lbHNle2NvbnN0IGw9RlAoblsyXSwiKCkiKTtpZihsPi0xKXtjb25zdCBhPShuWzBdLmluZGV4T2YoIiEiKT09PTA/NTo0KStuWzFdLmxlbmd0aCtsO25bMl09blsyXS5zdWJzdHJpbmcoMCxsKSxuWzBdPW5bMF0uc3Vic3RyaW5nKDAsYSkudHJpbSgpLG5bM109IiJ9fWxldCBvPW5bMl0saT0iIjtpZih0aGlzLm9wdGlvbnMucGVkYW50aWMpe2NvbnN0IGw9L14oW14nIl0qW15cc10pXHMrKFsnIl0pKC4qKVwyLy5leGVjKG8pO2wmJihvPWxbMV0saT1sWzNdKX1lbHNlIGk9blszXT9uWzNdLnNsaWNlKDEsLTEpOiIiO3JldHVybiBvPW8udHJpbSgpLC9ePC8udGVzdChvKSYmKHRoaXMub3B0aW9ucy5wZWRhbnRpYyYmIS8+JC8udGVzdChyKT9vPW8uc2xpY2UoMSk6bz1vLnNsaWNlKDEsLTEpKSxaeShuLHtocmVmOm8mJm8ucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5fZXNjYXBlcywiJDEiKSx0aXRsZTppJiZpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIil9LG5bMF0sdGhpcy5sZXhlcil9fXJlZmxpbmsodCxuKXtsZXQgcjtpZigocj10aGlzLnJ1bGVzLmlubGluZS5yZWZsaW5rLmV4ZWModCkpfHwocj10aGlzLnJ1bGVzLmlubGluZS5ub2xpbmsuZXhlYyh0KSkpe2xldCBvPShyWzJdfHxyWzFdKS5yZXBsYWNlKC9ccysvZywiICIpO2lmKG89bltvLnRvTG93ZXJDYXNlKCldLCFvKXtjb25zdCBpPXJbMF0uY2hhckF0KDApO3JldHVybnt0eXBlOiJ0ZXh0IixyYXc6aSx0ZXh0Oml9fXJldHVybiBaeShyLG8sclswXSx0aGlzLmxleGVyKX19ZW1TdHJvbmcodCxuLHI9IiIpe2xldCBvPXRoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nLmxEZWxpbS5leGVjKHQpO2lmKCFvfHxvWzNdJiZyLm1hdGNoKC9bXHB7TH1ccHtOfV0vdSkpcmV0dXJuO2lmKCEob1sxXXx8b1syXXx8IiIpfHwhcnx8dGhpcy5ydWxlcy5pbmxpbmUucHVuY3R1YXRpb24uZXhlYyhyKSl7Y29uc3QgbD1bLi4ub1swXV0ubGVuZ3RoLTE7bGV0IHMsYSx1PWwsYz0wO2NvbnN0IGQ9b1swXVswXT09PSIqIj90aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZy5yRGVsaW1Bc3Q6dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmcuckRlbGltVW5kO2ZvcihkLmxhc3RJbmRleD0wLG49bi5zbGljZSgtMSp0Lmxlbmd0aCtvWzBdLmxlbmd0aC0xKTsobz1kLmV4ZWMobikpIT1udWxsOyl7aWYocz1vWzFdfHxvWzJdfHxvWzNdfHxvWzRdfHxvWzVdfHxvWzZdLCFzKWNvbnRpbnVlO2lmKGE9Wy4uLnNdLmxlbmd0aCxvWzNdfHxvWzRdKXt1Kz1hO2NvbnRpbnVlfWVsc2UgaWYoKG9bNV18fG9bNl0pJiZsJTMmJiEoKGwrYSklMykpe2MrPWE7Y29udGludWV9aWYodS09YSx1PjApY29udGludWU7YT1NYXRoLm1pbihhLGErdStjKTtjb25zdCBmPVsuLi50XS5zbGljZSgwLGwrby5pbmRleCthKzEpLmpvaW4oIiIpO2lmKE1hdGgubWluKGwsYSklMil7Y29uc3QgZz1mLnNsaWNlKDEsLTEpO3JldHVybnt0eXBlOiJlbSIscmF3OmYsdGV4dDpnLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2VucyhnKX19Y29uc3QgaD1mLnNsaWNlKDIsLTIpO3JldHVybnt0eXBlOiJzdHJvbmciLHJhdzpmLHRleHQ6aCx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmVUb2tlbnMoaCl9fX19Y29kZXNwYW4odCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5jb2RlLmV4ZWModCk7aWYobil7bGV0IHI9blsyXS5yZXBsYWNlKC9cbi9nLCIgIik7Y29uc3Qgbz0vW14gXS8udGVzdChyKSxpPS9eIC8udGVzdChyKSYmLyAkLy50ZXN0KHIpO3JldHVybiBvJiZpJiYocj1yLnN1YnN0cmluZygxLHIubGVuZ3RoLTEpKSxyPW1uKHIsITApLHt0eXBlOiJjb2Rlc3BhbiIscmF3Om5bMF0sdGV4dDpyfX19YnIodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5ici5leGVjKHQpO2lmKG4pcmV0dXJue3R5cGU6ImJyIixyYXc6blswXX19ZGVsKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuZGVsLmV4ZWModCk7aWYobilyZXR1cm57dHlwZToiZGVsIixyYXc6blswXSx0ZXh0Om5bMl0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKG5bMl0pfX1hdXRvbGluayh0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmF1dG9saW5rLmV4ZWModCk7aWYobil7bGV0IHIsbztyZXR1cm4gblsyXT09PSJAIj8ocj1tbihuWzFdKSxvPSJtYWlsdG86IityKToocj1tbihuWzFdKSxvPXIpLHt0eXBlOiJsaW5rIixyYXc6blswXSx0ZXh0OnIsaHJlZjpvLHRva2Vuczpbe3R5cGU6InRleHQiLHJhdzpyLHRleHQ6cn1dfX19dXJsKHQpe2xldCBuO2lmKG49dGhpcy5ydWxlcy5pbmxpbmUudXJsLmV4ZWModCkpe2xldCByLG87aWYoblsyXT09PSJAIilyPW1uKG5bMF0pLG89Im1haWx0bzoiK3I7ZWxzZXtsZXQgaTtkbyBpPW5bMF0sblswXT10aGlzLnJ1bGVzLmlubGluZS5fYmFja3BlZGFsLmV4ZWMoblswXSlbMF07d2hpbGUoaSE9PW5bMF0pO3I9bW4oblswXSksblsxXT09PSJ3d3cuIj9vPSJodHRwOi8vIituWzBdOm89blswXX1yZXR1cm57dHlwZToibGluayIscmF3Om5bMF0sdGV4dDpyLGhyZWY6byx0b2tlbnM6W3t0eXBlOiJ0ZXh0IixyYXc6cix0ZXh0OnJ9XX19fWlubGluZVRleHQodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS50ZXh0LmV4ZWModCk7aWYobil7bGV0IHI7cmV0dXJuIHRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jaz9yPW5bMF06cj1tbihuWzBdKSx7dHlwZToidGV4dCIscmF3Om5bMF0sdGV4dDpyfX19fWNvbnN0IHJlPXtuZXdsaW5lOi9eKD86ICooPzpcbnwkKSkrLyxjb2RlOi9eKCB7NH1bXlxuXSsoPzpcbig/OiAqKD86XG58JCkpKik/KSsvLGZlbmNlczovXiB7MCwzfShgezMsfSg/PVteYFxuXSooPzpcbnwkKSl8fnszLH0pKFteXG5dKikoPzpcbnwkKSg/OnwoW1xzXFNdKj8pKD86XG58JCkpKD86IHswLDN9XDFbfmBdKiAqKD89XG58JCl8JCkvLGhyOi9eIHswLDN9KCg/Oi1bXHQgXSopezMsfXwoPzpfWyBcdF0qKXszLH18KD86XCpbIFx0XSopezMsfSkoPzpcbit8JCkvLGhlYWRpbmc6L14gezAsM30oI3sxLDZ9KSg/PVxzfCQpKC4qKSg/OlxuK3wkKS8sYmxvY2txdW90ZTovXiggezAsM30+ID8ocGFyYWdyYXBofFteXG5dKikoPzpcbnwkKSkrLyxsaXN0Oi9eKCB7MCwzfWJ1bGwpKFsgXHRdW15cbl0rPyk/KD86XG58JCkvLGh0bWw6Il4gezAsM30oPzo8KHNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpW1xccz5dW1xcc1xcU10qPyg/OjwvXFwxPlteXFxuXSpcXG4rfCQpfGNvbW1lbnRbXlxcbl0qKFxcbit8JCl8PFxcP1tcXHNcXFNdKj8oPzpcXD8+XFxuKnwkKXw8IVtBLVpdW1xcc1xcU10qPyg/Oj5cXG4qfCQpfDwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/KD86XFxdXFxdPlxcbip8JCl8PC8/KHRhZykoPzogK3xcXG58Lz8+KVtcXHNcXFNdKj8oPzooPzpcXG4gKikrXFxufCQpfDwoPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKShbYS16XVtcXHctXSopKD86YXR0cmlidXRlKSo/ICovPz4oPz1bIFxcdF0qKD86XFxufCQpKVtcXHNcXFNdKj8oPzooPzpcXG4gKikrXFxufCQpfDwvKD8hc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbYS16XVtcXHctXSpcXHMqPig/PVsgXFx0XSooPzpcXG58JCkpW1xcc1xcU10qPyg/Oig/OlxcbiAqKStcXG58JCkpIixkZWY6L14gezAsM31cWyhsYWJlbClcXTogKig/OlxuICopPyhbXjxcc11bXlxzXSp8PC4qPz4pKD86KD86ICsoPzpcbiAqKT98ICpcbiAqKSh0aXRsZSkpPyAqKD86XG4rfCQpLyx0YWJsZTpiYyxsaGVhZGluZzovXig/IWJ1bGwgKSgoPzoufFxuKD8hXHMqP1xufGJ1bGwgKSkrPylcbiB7MCwzfSg9K3wtKykgKig/OlxuK3wkKS8sX3BhcmFncmFwaDovXihbXlxuXSsoPzpcbig/IWhyfGhlYWRpbmd8bGhlYWRpbmd8YmxvY2txdW90ZXxmZW5jZXN8bGlzdHxodG1sfHRhYmxlfCArXG4pW15cbl0rKSopLyx0ZXh0Oi9eW15cbl0rL307cmUuX2xhYmVsPS8oPyFccypcXSkoPzpcXC58W15cW1xdXFxdKSsvO3JlLl90aXRsZT0vKD86Iig/OlxcIj98W14iXFxdKSoifCdbXidcbl0qKD86XG5bXidcbl0rKSpcbj8nfFwoW14oKV0qXCkpLztyZS5kZWY9UmUocmUuZGVmKS5yZXBsYWNlKCJsYWJlbCIscmUuX2xhYmVsKS5yZXBsYWNlKCJ0aXRsZSIscmUuX3RpdGxlKS5nZXRSZWdleCgpO3JlLmJ1bGxldD0vKD86WyorLV18XGR7MSw5fVsuKV0pLztyZS5saXN0SXRlbVN0YXJ0PVJlKC9eKCAqKShidWxsKSAqLykucmVwbGFjZSgiYnVsbCIscmUuYnVsbGV0KS5nZXRSZWdleCgpO3JlLmxpc3Q9UmUocmUubGlzdCkucmVwbGFjZSgvYnVsbC9nLHJlLmJ1bGxldCkucmVwbGFjZSgiaHIiLCJcXG4rKD89XFwxPyg/Oig/Oi0gKil7Myx9fCg/Ol8gKil7Myx9fCg/OlxcKiAqKXszLH0pKD86XFxuK3wkKSkiKS5yZXBsYWNlKCJkZWYiLCJcXG4rKD89IityZS5kZWYuc291cmNlKyIpIikuZ2V0UmVnZXgoKTtyZS5fdGFnPSJhZGRyZXNzfGFydGljbGV8YXNpZGV8YmFzZXxiYXNlZm9udHxibG9ja3F1b3RlfGJvZHl8Y2FwdGlvbnxjZW50ZXJ8Y29sfGNvbGdyb3VwfGRkfGRldGFpbHN8ZGlhbG9nfGRpcnxkaXZ8ZGx8ZHR8ZmllbGRzZXR8ZmlnY2FwdGlvbnxmaWd1cmV8Zm9vdGVyfGZvcm18ZnJhbWV8ZnJhbWVzZXR8aFsxLTZdfGhlYWR8aGVhZGVyfGhyfGh0bWx8aWZyYW1lfGxlZ2VuZHxsaXxsaW5rfG1haW58bWVudXxtZW51aXRlbXxtZXRhfG5hdnxub2ZyYW1lc3xvbHxvcHRncm91cHxvcHRpb258cHxwYXJhbXxzZWN0aW9ufHNvdXJjZXxzdW1tYXJ5fHRhYmxlfHRib2R5fHRkfHRmb290fHRofHRoZWFkfHRpdGxlfHRyfHRyYWNrfHVsIjtyZS5fY29tbWVudD0vPCEtLSg/IS0/PilbXHNcU10qPyg/Oi0tPnwkKS87cmUuaHRtbD1SZShyZS5odG1sLCJpIikucmVwbGFjZSgiY29tbWVudCIscmUuX2NvbW1lbnQpLnJlcGxhY2UoInRhZyIscmUuX3RhZykucmVwbGFjZSgiYXR0cmlidXRlIiwvICtbYS16QS1aOl9dW1x3LjotXSooPzogKj0gKiJbXiJcbl0qInwgKj0gKidbXidcbl0qJ3wgKj0gKlteXHMiJz08PmBdKyk/LykuZ2V0UmVnZXgoKTtyZS5saGVhZGluZz1SZShyZS5saGVhZGluZykucmVwbGFjZSgvYnVsbC9nLHJlLmJ1bGxldCkuZ2V0UmVnZXgoKTtyZS5wYXJhZ3JhcGg9UmUocmUuX3BhcmFncmFwaCkucmVwbGFjZSgiaHIiLHJlLmhyKS5yZXBsYWNlKCJoZWFkaW5nIiwiIHswLDN9I3sxLDZ9ICIpLnJlcGxhY2UoInxsaGVhZGluZyIsIiIpLnJlcGxhY2UoInx0YWJsZSIsIiIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgiZmVuY2VzIiwiIHswLDN9KD86YHszLH0oPz1bXmBcXG5dKlxcbil8fnszLH0pW15cXG5dKlxcbiIpLnJlcGxhY2UoImxpc3QiLCIgezAsM30oPzpbKistXXwxWy4pXSkgIikucmVwbGFjZSgiaHRtbCIsIjwvPyg/OnRhZykoPzogK3xcXG58Lz8+KXw8KD86c2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYXwhLS0pIikucmVwbGFjZSgidGFnIixyZS5fdGFnKS5nZXRSZWdleCgpO3JlLmJsb2NrcXVvdGU9UmUocmUuYmxvY2txdW90ZSkucmVwbGFjZSgicGFyYWdyYXBoIixyZS5wYXJhZ3JhcGgpLmdldFJlZ2V4KCk7cmUubm9ybWFsPXsuLi5yZX07cmUuZ2ZtPXsuLi5yZS5ub3JtYWwsdGFibGU6Il4gKihbXlxcbiBdLiopXFxuIHswLDN9KCg/OlxcfCAqKT86Py0rOj8gKig/OlxcfCAqOj8tKzo/ICopKig/OlxcfCAqKT8pKD86XFxuKCg/Oig/ISAqXFxufGhyfGhlYWRpbmd8YmxvY2txdW90ZXxjb2RlfGZlbmNlc3xsaXN0fGh0bWwpLiooPzpcXG58JCkpKilcXG4qfCQpIn07cmUuZ2ZtLnRhYmxlPVJlKHJlLmdmbS50YWJsZSkucmVwbGFjZSgiaHIiLHJlLmhyKS5yZXBsYWNlKCJoZWFkaW5nIiwiIHswLDN9I3sxLDZ9ICIpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgiY29kZSIsIiB7NH1bXlxcbl0iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLHJlLl90YWcpLmdldFJlZ2V4KCk7cmUuZ2ZtLnBhcmFncmFwaD1SZShyZS5fcGFyYWdyYXBoKS5yZXBsYWNlKCJociIscmUuaHIpLnJlcGxhY2UoImhlYWRpbmciLCIgezAsM30jezEsNn0gIikucmVwbGFjZSgifGxoZWFkaW5nIiwiIikucmVwbGFjZSgidGFibGUiLHJlLmdmbS50YWJsZSkucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLHJlLl90YWcpLmdldFJlZ2V4KCk7cmUucGVkYW50aWM9ey4uLnJlLm5vcm1hbCxodG1sOlJlKGBeICooPzpjb21tZW50ICooPzpcXG58XFxzKiQpfDwodGFnKVtcXHNcXFNdKz88L1xcMT4gKig/OlxcbnsyLH18XFxzKiQpfDx0YWcoPzoiW14iXSoifCdbXiddKid8XFxzW14nIi8+XFxzXSopKj8vPz4gKig/OlxcbnsyLH18XFxzKiQpKWApLnJlcGxhY2UoImNvbW1lbnQiLHJlLl9jb21tZW50KS5yZXBsYWNlKC90YWcvZywiKD8hKD86YXxlbXxzdHJvbmd8c21hbGx8c3xjaXRlfHF8ZGZufGFiYnJ8ZGF0YXx0aW1lfGNvZGV8dmFyfHNhbXB8a2JkfHN1YnxzdXB8aXxifHV8bWFya3xydWJ5fHJ0fHJwfGJkaXxiZG98c3Bhbnxicnx3YnJ8aW5zfGRlbHxpbWcpXFxiKVxcdysoPyE6fFteXFx3XFxzQF0qQClcXGIiKS5nZXRSZWdleCgpLGRlZjovXiAqXFsoW15cXV0rKVxdOiAqPD8oW15ccz5dKyk+Pyg/OiArKFsiKF1bXlxuXStbIildKSk/ICooPzpcbit8JCkvLGhlYWRpbmc6L14oI3sxLDZ9KSguKikoPzpcbit8JCkvLGZlbmNlczpiYyxsaGVhZGluZzovXiguKz8pXG4gezAsM30oPSt8LSspICooPzpcbit8JCkvLHBhcmFncmFwaDpSZShyZS5ub3JtYWwuX3BhcmFncmFwaCkucmVwbGFjZSgiaHIiLHJlLmhyKS5yZXBsYWNlKCJoZWFkaW5nIixgICojezEsNn0gKlteCl1gKS5yZXBsYWNlKCJsaGVhZGluZyIscmUubGhlYWRpbmcpLnJlcGxhY2UoImJsb2NrcXVvdGUiLCIgezAsM30+IikucmVwbGFjZSgifGZlbmNlcyIsIiIpLnJlcGxhY2UoInxsaXN0IiwiIikucmVwbGFjZSgifGh0bWwiLCIiKS5nZXRSZWdleCgpfTtjb25zdCBLPXtlc2NhcGU6L15cXChbISIjJCUmJygpKissXC0uLzo7PD0+P0BcW1xdXFxeX2B7fH1+XSkvLGF1dG9saW5rOi9ePChzY2hlbWU6W15cc1x4MDAtXHgxZjw+XSp8ZW1haWwpPi8sdXJsOmJjLHRhZzoiXmNvbW1lbnR8XjwvW2EtekEtWl1bXFx3Oi1dKlxccyo+fF48W2EtekEtWl1bXFx3LV0qKD86YXR0cmlidXRlKSo/XFxzKi8/PnxePFxcP1tcXHNcXFNdKj9cXD8+fF48IVthLXpBLVpdK1xcc1tcXHNcXFNdKj8+fF48IVxcW0NEQVRBXFxbW1xcc1xcU10qP1xcXVxcXT4iLGxpbms6L14hP1xbKGxhYmVsKVxdXChccyooaHJlZikoPzpccysodGl0bGUpKT9ccypcKS8scmVmbGluazovXiE/XFsobGFiZWwpXF1cWyhyZWYpXF0vLG5vbGluazovXiE/XFsocmVmKVxdKD86XFtcXSk/LyxyZWZsaW5rU2VhcmNoOiJyZWZsaW5rfG5vbGluayg/IVxcKCkiLGVtU3Ryb25nOntsRGVsaW06L14oPzpcKisoPzooKD8hXCopW3B1bmN0XSl8W15ccypdKSl8Xl8rKD86KCg/IV8pW3B1bmN0XSl8KFteXHNfXSkpLyxyRGVsaW1Bc3Q6L15bXl8qXSo/X19bXl8qXSo/XCpbXl8qXSo/KD89X18pfFteKl0rKD89W14qXSl8KD8hXCopW3B1bmN0XShcKispKD89W1xzXXwkKXxbXnB1bmN0XHNdKFwqKykoPyFcKikoPz1bcHVuY3Rcc118JCl8KD8hXCopW3B1bmN0XHNdKFwqKykoPz1bXnB1bmN0XHNdKXxbXHNdKFwqKykoPyFcKikoPz1bcHVuY3RdKXwoPyFcKilbcHVuY3RdKFwqKykoPyFcKikoPz1bcHVuY3RdKXxbXnB1bmN0XHNdKFwqKykoPz1bXnB1bmN0XHNdKS8sckRlbGltVW5kOi9eW15fKl0qP1wqXCpbXl8qXSo/X1teXypdKj8oPz1cKlwqKXxbXl9dKyg/PVteX10pfCg/IV8pW3B1bmN0XShfKykoPz1bXHNdfCQpfFtecHVuY3Rcc10oXyspKD8hXykoPz1bcHVuY3Rcc118JCl8KD8hXylbcHVuY3Rcc10oXyspKD89W15wdW5jdFxzXSl8W1xzXShfKykoPyFfKSg/PVtwdW5jdF0pfCg/IV8pW3B1bmN0XShfKykoPyFfKSg/PVtwdW5jdF0pL30sY29kZTovXihgKykoW15gXXxbXmBdW1xzXFNdKj9bXmBdKVwxKD8hYCkvLGJyOi9eKCB7Mix9fFxcKVxuKD8hXHMqJCkvLGRlbDpiYyx0ZXh0Oi9eKGArfFteYF0pKD86KD89IHsyLH1cbil8W1xzXFNdKj8oPzooPz1bXFw8IVxbYCpfXXxcYl98JCl8W14gXSg/PSB7Mix9XG4pKSkvLHB1bmN0dWF0aW9uOi9eKCg/IVsqX10pW1xzcHVuY3R1YXRpb25dKS99O0suX3B1bmN0dWF0aW9uPSJcXHB7UH0kKzw9PmBefH4iO0sucHVuY3R1YXRpb249UmUoSy5wdW5jdHVhdGlvbiwidSIpLnJlcGxhY2UoL3B1bmN0dWF0aW9uL2csSy5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7Sy5ibG9ja1NraXA9L1xbW15bXF1dKj9cXVwoW15cKFwpXSo/XCl8YFteYF0qP2B8PFtePD5dKj8+L2c7Sy5hbnlQdW5jdHVhdGlvbj0vXFxbcHVuY3RdL2c7Sy5fZXNjYXBlcz0vXFwoW3B1bmN0XSkvZztLLl9jb21tZW50PVJlKHJlLl9jb21tZW50KS5yZXBsYWNlKCIoPzotLT58JCkiLCItLT4iKS5nZXRSZWdleCgpO0suZW1TdHJvbmcubERlbGltPVJlKEsuZW1TdHJvbmcubERlbGltLCJ1IikucmVwbGFjZSgvcHVuY3QvZyxLLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtLLmVtU3Ryb25nLnJEZWxpbUFzdD1SZShLLmVtU3Ryb25nLnJEZWxpbUFzdCwiZ3UiKS5yZXBsYWNlKC9wdW5jdC9nLEsuX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO0suZW1TdHJvbmcuckRlbGltVW5kPVJlKEsuZW1TdHJvbmcuckRlbGltVW5kLCJndSIpLnJlcGxhY2UoL3B1bmN0L2csSy5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7Sy5hbnlQdW5jdHVhdGlvbj1SZShLLmFueVB1bmN0dWF0aW9uLCJndSIpLnJlcGxhY2UoL3B1bmN0L2csSy5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7Sy5fZXNjYXBlcz1SZShLLl9lc2NhcGVzLCJndSIpLnJlcGxhY2UoL3B1bmN0L2csSy5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7Sy5fc2NoZW1lPS9bYS16QS1aXVthLXpBLVowLTkrLi1dezEsMzF9LztLLl9lbWFpbD0vW2EtekEtWjAtOS4hIyQlJicqKy89P15fYHt8fX4tXSsoQClbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykrKD8hWy1fXSkvO0suYXV0b2xpbms9UmUoSy5hdXRvbGluaykucmVwbGFjZSgic2NoZW1lIixLLl9zY2hlbWUpLnJlcGxhY2UoImVtYWlsIixLLl9lbWFpbCkuZ2V0UmVnZXgoKTtLLl9hdHRyaWJ1dGU9L1xzK1thLXpBLVo6X11bXHcuOi1dKig/OlxzKj1ccyoiW14iXSoifFxzKj1ccyonW14nXSonfFxzKj1ccypbXlxzIic9PD5gXSspPy87Sy50YWc9UmUoSy50YWcpLnJlcGxhY2UoImNvbW1lbnQiLEsuX2NvbW1lbnQpLnJlcGxhY2UoImF0dHJpYnV0ZSIsSy5fYXR0cmlidXRlKS5nZXRSZWdleCgpO0suX2xhYmVsPS8oPzpcWyg/OlxcLnxbXlxbXF1cXF0pKlxdfFxcLnxgW15gXSpgfFteXFtcXVxcYF0pKj8vO0suX2hyZWY9LzwoPzpcXC58W15cbjw+XFxdKSs+fFteXHNceDAwLVx4MWZdKi87Sy5fdGl0bGU9LyIoPzpcXCI/fFteIlxcXSkqInwnKD86XFwnP3xbXidcXF0pKid8XCgoPzpcXFwpP3xbXilcXF0pKlwpLztLLmxpbms9UmUoSy5saW5rKS5yZXBsYWNlKCJsYWJlbCIsSy5fbGFiZWwpLnJlcGxhY2UoImhyZWYiLEsuX2hyZWYpLnJlcGxhY2UoInRpdGxlIixLLl90aXRsZSkuZ2V0UmVnZXgoKTtLLnJlZmxpbms9UmUoSy5yZWZsaW5rKS5yZXBsYWNlKCJsYWJlbCIsSy5fbGFiZWwpLnJlcGxhY2UoInJlZiIscmUuX2xhYmVsKS5nZXRSZWdleCgpO0subm9saW5rPVJlKEsubm9saW5rKS5yZXBsYWNlKCJyZWYiLHJlLl9sYWJlbCkuZ2V0UmVnZXgoKTtLLnJlZmxpbmtTZWFyY2g9UmUoSy5yZWZsaW5rU2VhcmNoLCJnIikucmVwbGFjZSgicmVmbGluayIsSy5yZWZsaW5rKS5yZXBsYWNlKCJub2xpbmsiLEsubm9saW5rKS5nZXRSZWdleCgpO0subm9ybWFsPXsuLi5LfTtLLnBlZGFudGljPXsuLi5LLm5vcm1hbCxzdHJvbmc6e3N0YXJ0Oi9eX198XCpcKi8sbWlkZGxlOi9eX18oPz1cUykoW1xzXFNdKj9cUylfXyg/IV8pfF5cKlwqKD89XFMpKFtcc1xTXSo/XFMpXCpcKig/IVwqKS8sZW5kQXN0Oi9cKlwqKD8hXCopL2csZW5kVW5kOi9fXyg/IV8pL2d9LGVtOntzdGFydDovXl98XCovLG1pZGRsZTovXigpXCooPz1cUykoW1xzXFNdKj9cUylcKig/IVwqKXxeXyg/PVxTKShbXHNcU10qP1xTKV8oPyFfKS8sZW5kQXN0Oi9cKig/IVwqKS9nLGVuZFVuZDovXyg/IV8pL2d9LGxpbms6UmUoL14hP1xbKGxhYmVsKVxdXCgoLio/KVwpLykucmVwbGFjZSgibGFiZWwiLEsuX2xhYmVsKS5nZXRSZWdleCgpLHJlZmxpbms6UmUoL14hP1xbKGxhYmVsKVxdXHMqXFsoW15cXV0qKVxdLykucmVwbGFjZSgibGFiZWwiLEsuX2xhYmVsKS5nZXRSZWdleCgpfTtLLmdmbT17Li4uSy5ub3JtYWwsZXNjYXBlOlJlKEsuZXNjYXBlKS5yZXBsYWNlKCJdKSIsIn58XSkiKS5nZXRSZWdleCgpLF9leHRlbmRlZF9lbWFpbDovW0EtWmEtejAtOS5fKy1dKyhAKVthLXpBLVowLTktX10rKD86XC5bYS16QS1aMC05LV9dKlthLXpBLVowLTldKSsoPyFbLV9dKS8sdXJsOi9eKCg/OmZ0cHxodHRwcz8pOlwvXC98d3d3XC4pKD86W2EtekEtWjAtOVwtXStcLj8pK1teXHM8XSp8XmVtYWlsLyxfYmFja3BlZGFsOi8oPzpbXj8hLiw6OypfJyJ+KCkmXSt8XChbXildKlwpfCYoPyFbYS16QS1aMC05XSs7JCl8Wz8hLiw6OypfJyJ+KV0rKD8hJCkpKy8sZGVsOi9eKH5+PykoPz1bXlxzfl0pKFtcc1xTXSo/W15cc35dKVwxKD89W15+XXwkKS8sdGV4dDovXihbYH5dK3xbXmB+XSkoPzooPz0gezIsfVxuKXwoPz1bYS16QS1aMC05LiEjJCUmJyorXC89P19ge1x8fX4tXStAKXxbXHNcU10qPyg/Oig/PVtcXDwhXFtgKn5fXXxcYl98aHR0cHM/OlwvXC98ZnRwOlwvXC98d3d3XC58JCl8W14gXSg/PSB7Mix9XG4pfFteYS16QS1aMC05LiEjJCUmJyorXC89P19ge1x8fX4tXSg/PVthLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dK0ApKSkvfTtLLmdmbS51cmw9UmUoSy5nZm0udXJsLCJpIikucmVwbGFjZSgiZW1haWwiLEsuZ2ZtLl9leHRlbmRlZF9lbWFpbCkuZ2V0UmVnZXgoKTtLLmJyZWFrcz17Li4uSy5nZm0sYnI6UmUoSy5icikucmVwbGFjZSgiezIsfSIsIioiKS5nZXRSZWdleCgpLHRleHQ6UmUoSy5nZm0udGV4dCkucmVwbGFjZSgiXFxiXyIsIlxcYl98IHsyLH1cXG4iKS5yZXBsYWNlKC9cezIsXH0vZywiKiIpLmdldFJlZ2V4KCl9O2NsYXNzIGZye2NvbnN0cnVjdG9yKHQpe2plKHRoaXMsInRva2VucyIpO2plKHRoaXMsIm9wdGlvbnMiKTtqZSh0aGlzLCJzdGF0ZSIpO2plKHRoaXMsInRva2VuaXplciIpO2plKHRoaXMsImlubGluZVF1ZXVlIik7dGhpcy50b2tlbnM9W10sdGhpcy50b2tlbnMubGlua3M9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLm9wdGlvbnM9dHx8TmksdGhpcy5vcHRpb25zLnRva2VuaXplcj10aGlzLm9wdGlvbnMudG9rZW5pemVyfHxuZXcgUmMsdGhpcy50b2tlbml6ZXI9dGhpcy5vcHRpb25zLnRva2VuaXplcix0aGlzLnRva2VuaXplci5vcHRpb25zPXRoaXMub3B0aW9ucyx0aGlzLnRva2VuaXplci5sZXhlcj10aGlzLHRoaXMuaW5saW5lUXVldWU9W10sdGhpcy5zdGF0ZT17aW5MaW5rOiExLGluUmF3QmxvY2s6ITEsdG9wOiEwfTtjb25zdCBuPXtibG9jazpyZS5ub3JtYWwsaW5saW5lOksubm9ybWFsfTt0aGlzLm9wdGlvbnMucGVkYW50aWM/KG4uYmxvY2s9cmUucGVkYW50aWMsbi5pbmxpbmU9Sy5wZWRhbnRpYyk6dGhpcy5vcHRpb25zLmdmbSYmKG4uYmxvY2s9cmUuZ2ZtLHRoaXMub3B0aW9ucy5icmVha3M/bi5pbmxpbmU9Sy5icmVha3M6bi5pbmxpbmU9Sy5nZm0pLHRoaXMudG9rZW5pemVyLnJ1bGVzPW59c3RhdGljIGdldCBydWxlcygpe3JldHVybntibG9jazpyZSxpbmxpbmU6S319c3RhdGljIGxleCh0LG4pe3JldHVybiBuZXcgZnIobikubGV4KHQpfXN0YXRpYyBsZXhJbmxpbmUodCxuKXtyZXR1cm4gbmV3IGZyKG4pLmlubGluZVRva2Vucyh0KX1sZXgodCl7dD10LnJlcGxhY2UoL1xyXG58XHIvZyxgCmApLHRoaXMuYmxvY2tUb2tlbnModCx0aGlzLnRva2Vucyk7bGV0IG47Zm9yKDtuPXRoaXMuaW5saW5lUXVldWUuc2hpZnQoKTspdGhpcy5pbmxpbmVUb2tlbnMobi5zcmMsbi50b2tlbnMpO3JldHVybiB0aGlzLnRva2Vuc31ibG9ja1Rva2Vucyh0LG49W10pe3RoaXMub3B0aW9ucy5wZWRhbnRpYz90PXQucmVwbGFjZSgvXHQvZywiICAgICIpLnJlcGxhY2UoL14gKyQvZ20sIiIpOnQ9dC5yZXBsYWNlKC9eKCAqKShcdCspL2dtLChzLGEsdSk9PmErIiAgICAiLnJlcGVhdCh1Lmxlbmd0aCkpO2xldCByLG8saSxsO2Zvcig7dDspaWYoISh0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuYmxvY2smJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLmJsb2NrLnNvbWUocz0+KHI9cy5jYWxsKHtsZXhlcjp0aGlzfSx0LG4pKT8odD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKSwhMCk6ITEpKSl7aWYocj10aGlzLnRva2VuaXplci5zcGFjZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLHIucmF3Lmxlbmd0aD09PTEmJm4ubGVuZ3RoPjA/bltuLmxlbmd0aC0xXS5yYXcrPWAKYDpuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5jb2RlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbz1uW24ubGVuZ3RoLTFdLG8mJihvLnR5cGU9PT0icGFyYWdyYXBoInx8by50eXBlPT09InRleHQiKT8oby5yYXcrPWAKYCtyLnJhdyxvLnRleHQrPWAKYCtyLnRleHQsdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aC0xXS5zcmM9by50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5mZW5jZXModCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5oZWFkaW5nKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuaHIodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5ibG9ja3F1b3RlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIubGlzdCh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmh0bWwodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5kZWYodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxvPW5bbi5sZW5ndGgtMV0sbyYmKG8udHlwZT09PSJwYXJhZ3JhcGgifHxvLnR5cGU9PT0idGV4dCIpPyhvLnJhdys9YApgK3IucmF3LG8udGV4dCs9YApgK3IucmF3LHRoaXMuaW5saW5lUXVldWVbdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGgtMV0uc3JjPW8udGV4dCk6dGhpcy50b2tlbnMubGlua3Nbci50YWddfHwodGhpcy50b2tlbnMubGlua3Nbci50YWddPXtocmVmOnIuaHJlZix0aXRsZTpyLnRpdGxlfSk7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci50YWJsZSh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmxoZWFkaW5nKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKGk9dCx0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuc3RhcnRCbG9jayl7bGV0IHM9MS8wO2NvbnN0IGE9dC5zbGljZSgxKTtsZXQgdTt0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrLmZvckVhY2goYz0+e3U9Yy5jYWxsKHtsZXhlcjp0aGlzfSxhKSx0eXBlb2YgdT09Im51bWJlciImJnU+PTAmJihzPU1hdGgubWluKHMsdSkpfSksczwxLzAmJnM+PTAmJihpPXQuc3Vic3RyaW5nKDAscysxKSl9aWYodGhpcy5zdGF0ZS50b3AmJihyPXRoaXMudG9rZW5pemVyLnBhcmFncmFwaChpKSkpe289bltuLmxlbmd0aC0xXSxsJiZvLnR5cGU9PT0icGFyYWdyYXBoIj8oby5yYXcrPWAKYCtyLnJhdyxvLnRleHQrPWAKYCtyLnRleHQsdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKSx0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoLTFdLnNyYz1vLnRleHQpOm4ucHVzaChyKSxsPWkubGVuZ3RoIT09dC5sZW5ndGgsdD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIudGV4dCh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG89bltuLmxlbmd0aC0xXSxvJiZvLnR5cGU9PT0idGV4dCI/KG8ucmF3Kz1gCmArci5yYXcsby50ZXh0Kz1gCmArci50ZXh0LHRoaXMuaW5saW5lUXVldWUucG9wKCksdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aC0xXS5zcmM9by50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYodCl7Y29uc3Qgcz0iSW5maW5pdGUgbG9vcCBvbiBieXRlOiAiK3QuY2hhckNvZGVBdCgwKTtpZih0aGlzLm9wdGlvbnMuc2lsZW50KXtjb25zb2xlLmVycm9yKHMpO2JyZWFrfWVsc2UgdGhyb3cgbmV3IEVycm9yKHMpfX1yZXR1cm4gdGhpcy5zdGF0ZS50b3A9ITAsbn1pbmxpbmUodCxuPVtdKXtyZXR1cm4gdGhpcy5pbmxpbmVRdWV1ZS5wdXNoKHtzcmM6dCx0b2tlbnM6bn0pLG59aW5saW5lVG9rZW5zKHQsbj1bXSl7bGV0IHIsbyxpLGw9dCxzLGEsdTtpZih0aGlzLnRva2Vucy5saW5rcyl7Y29uc3QgYz1PYmplY3Qua2V5cyh0aGlzLnRva2Vucy5saW5rcyk7aWYoYy5sZW5ndGg+MClmb3IoOyhzPXRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmV4ZWMobCkpIT1udWxsOyljLmluY2x1ZGVzKHNbMF0uc2xpY2Uoc1swXS5sYXN0SW5kZXhPZigiWyIpKzEsLTEpKSYmKGw9bC5zbGljZSgwLHMuaW5kZXgpKyJbIisiYSIucmVwZWF0KHNbMF0ubGVuZ3RoLTIpKyJdIitsLnNsaWNlKHRoaXMudG9rZW5pemVyLnJ1bGVzLmlubGluZS5yZWZsaW5rU2VhcmNoLmxhc3RJbmRleCkpfWZvcig7KHM9dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5leGVjKGwpKSE9bnVsbDspbD1sLnNsaWNlKDAscy5pbmRleCkrIlsiKyJhIi5yZXBlYXQoc1swXS5sZW5ndGgtMikrIl0iK2wuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmJsb2NrU2tpcC5sYXN0SW5kZXgpO2Zvcig7KHM9dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmV4ZWMobCkpIT1udWxsOylsPWwuc2xpY2UoMCxzLmluZGV4KSsiKysiK2wuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLmFueVB1bmN0dWF0aW9uLmxhc3RJbmRleCk7Zm9yKDt0OylpZihhfHwodT0iIiksYT0hMSwhKHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5pbmxpbmUmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLmlubGluZS5zb21lKGM9PihyPWMuY2FsbCh7bGV4ZXI6dGhpc30sdCxuKSk/KHQ9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gociksITApOiExKSkpe2lmKHI9dGhpcy50b2tlbml6ZXIuZXNjYXBlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIudGFnKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbz1uW24ubGVuZ3RoLTFdLG8mJnIudHlwZT09PSJ0ZXh0IiYmby50eXBlPT09InRleHQiPyhvLnJhdys9ci5yYXcsby50ZXh0Kz1yLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmxpbmsodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5yZWZsaW5rKHQsdGhpcy50b2tlbnMubGlua3MpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbz1uW24ubGVuZ3RoLTFdLG8mJnIudHlwZT09PSJ0ZXh0IiYmby50eXBlPT09InRleHQiPyhvLnJhdys9ci5yYXcsby50ZXh0Kz1yLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmVtU3Ryb25nKHQsbCx1KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmNvZGVzcGFuKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuYnIodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5kZWwodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5hdXRvbGluayh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZighdGhpcy5zdGF0ZS5pbkxpbmsmJihyPXRoaXMudG9rZW5pemVyLnVybCh0KSkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYoaT10LHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydElubGluZSl7bGV0IGM9MS8wO2NvbnN0IGQ9dC5zbGljZSgxKTtsZXQgZjt0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydElubGluZS5mb3JFYWNoKGg9PntmPWguY2FsbCh7bGV4ZXI6dGhpc30sZCksdHlwZW9mIGY9PSJudW1iZXIiJiZmPj0wJiYoYz1NYXRoLm1pbihjLGYpKX0pLGM8MS8wJiZjPj0wJiYoaT10LnN1YnN0cmluZygwLGMrMSkpfWlmKHI9dGhpcy50b2tlbml6ZXIuaW5saW5lVGV4dChpKSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLHIucmF3LnNsaWNlKC0xKSE9PSJfIiYmKHU9ci5yYXcuc2xpY2UoLTEpKSxhPSEwLG89bltuLmxlbmd0aC0xXSxvJiZvLnR5cGU9PT0idGV4dCI/KG8ucmF3Kz1yLnJhdyxvLnRleHQrPXIudGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHQpe2NvbnN0IGM9IkluZmluaXRlIGxvb3Agb24gYnl0ZTogIit0LmNoYXJDb2RlQXQoMCk7aWYodGhpcy5vcHRpb25zLnNpbGVudCl7Y29uc29sZS5lcnJvcihjKTticmVha31lbHNlIHRocm93IG5ldyBFcnJvcihjKX19cmV0dXJuIG59fWNsYXNzIFBje2NvbnN0cnVjdG9yKHQpe2plKHRoaXMsIm9wdGlvbnMiKTt0aGlzLm9wdGlvbnM9dHx8Tml9Y29kZSh0LG4scil7dmFyIGk7Y29uc3Qgbz0oaT0obnx8IiIpLm1hdGNoKC9eXFMqLykpPT1udWxsP3ZvaWQgMDppWzBdO3JldHVybiB0PXQucmVwbGFjZSgvXG4kLywiIikrYApgLG8/JzxwcmU+PGNvZGUgY2xhc3M9Imxhbmd1YWdlLScrbW4obykrJyI+Jysocj90Om1uKHQsITApKStgPC9jb2RlPjwvcHJlPgpgOiI8cHJlPjxjb2RlPiIrKHI/dDptbih0LCEwKSkrYDwvY29kZT48L3ByZT4KYH1ibG9ja3F1b3RlKHQpe3JldHVybmA8YmxvY2txdW90ZT4KJHt0fTwvYmxvY2txdW90ZT4KYH1odG1sKHQsbil7cmV0dXJuIHR9aGVhZGluZyh0LG4scil7cmV0dXJuYDxoJHtufT4ke3R9PC9oJHtufT4KYH1ocigpe3JldHVybmA8aHI+CmB9bGlzdCh0LG4scil7Y29uc3Qgbz1uPyJvbCI6InVsIixpPW4mJnIhPT0xPycgc3RhcnQ9IicrcisnIic6IiI7cmV0dXJuIjwiK28raStgPgpgK3QrIjwvIitvK2A+CmB9bGlzdGl0ZW0odCxuLHIpe3JldHVybmA8bGk+JHt0fTwvbGk+CmB9Y2hlY2tib3godCl7cmV0dXJuIjxpbnB1dCAiKyh0PydjaGVja2VkPSIiICc6IiIpKydkaXNhYmxlZD0iIiB0eXBlPSJjaGVja2JveCI+J31wYXJhZ3JhcGgodCl7cmV0dXJuYDxwPiR7dH08L3A+CmB9dGFibGUodCxuKXtyZXR1cm4gbiYmKG49YDx0Ym9keT4ke259PC90Ym9keT5gKSxgPHRhYmxlPgo8dGhlYWQ+CmArdCtgPC90aGVhZD4KYCtuK2A8L3RhYmxlPgpgfXRhYmxlcm93KHQpe3JldHVybmA8dHI+CiR7dH08L3RyPgpgfXRhYmxlY2VsbCh0LG4pe2NvbnN0IHI9bi5oZWFkZXI/InRoIjoidGQiO3JldHVybihuLmFsaWduP2A8JHtyfSBhbGlnbj0iJHtuLmFsaWdufSI+YDpgPCR7cn0+YCkrdCtgPC8ke3J9PgpgfXN0cm9uZyh0KXtyZXR1cm5gPHN0cm9uZz4ke3R9PC9zdHJvbmc+YH1lbSh0KXtyZXR1cm5gPGVtPiR7dH08L2VtPmB9Y29kZXNwYW4odCl7cmV0dXJuYDxjb2RlPiR7dH08L2NvZGU+YH1icigpe3JldHVybiI8YnI+In1kZWwodCl7cmV0dXJuYDxkZWw+JHt0fTwvZGVsPmB9bGluayh0LG4scil7Y29uc3Qgbz1ReSh0KTtpZihvPT09bnVsbClyZXR1cm4gcjt0PW87bGV0IGk9JzxhIGhyZWY9IicrdCsnIic7cmV0dXJuIG4mJihpKz0nIHRpdGxlPSInK24rJyInKSxpKz0iPiIrcisiPC9hPiIsaX1pbWFnZSh0LG4scil7Y29uc3Qgbz1ReSh0KTtpZihvPT09bnVsbClyZXR1cm4gcjt0PW87bGV0IGk9YDxpbWcgc3JjPSIke3R9IiBhbHQ9IiR7cn0iYDtyZXR1cm4gbiYmKGkrPWAgdGl0bGU9IiR7bn0iYCksaSs9Ij4iLGl9dGV4dCh0KXtyZXR1cm4gdH19Y2xhc3MgZm17c3Ryb25nKHQpe3JldHVybiB0fWVtKHQpe3JldHVybiB0fWNvZGVzcGFuKHQpe3JldHVybiB0fWRlbCh0KXtyZXR1cm4gdH1odG1sKHQpe3JldHVybiB0fXRleHQodCl7cmV0dXJuIHR9bGluayh0LG4scil7cmV0dXJuIiIrcn1pbWFnZSh0LG4scil7cmV0dXJuIiIrcn1icigpe3JldHVybiIifX1jbGFzcyBocntjb25zdHJ1Y3Rvcih0KXtqZSh0aGlzLCJvcHRpb25zIik7amUodGhpcywicmVuZGVyZXIiKTtqZSh0aGlzLCJ0ZXh0UmVuZGVyZXIiKTt0aGlzLm9wdGlvbnM9dHx8TmksdGhpcy5vcHRpb25zLnJlbmRlcmVyPXRoaXMub3B0aW9ucy5yZW5kZXJlcnx8bmV3IFBjLHRoaXMucmVuZGVyZXI9dGhpcy5vcHRpb25zLnJlbmRlcmVyLHRoaXMucmVuZGVyZXIub3B0aW9ucz10aGlzLm9wdGlvbnMsdGhpcy50ZXh0UmVuZGVyZXI9bmV3IGZtfXN0YXRpYyBwYXJzZSh0LG4pe3JldHVybiBuZXcgaHIobikucGFyc2UodCl9c3RhdGljIHBhcnNlSW5saW5lKHQsbil7cmV0dXJuIG5ldyBocihuKS5wYXJzZUlubGluZSh0KX1wYXJzZSh0LG49ITApe2xldCByPSIiO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXtjb25zdCBpPXRbb107aWYodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVycyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2kudHlwZV0pe2NvbnN0IGw9aSxzPXRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tsLnR5cGVdLmNhbGwoe3BhcnNlcjp0aGlzfSxsKTtpZihzIT09ITF8fCFbInNwYWNlIiwiaHIiLCJoZWFkaW5nIiwiY29kZSIsInRhYmxlIiwiYmxvY2txdW90ZSIsImxpc3QiLCJodG1sIiwicGFyYWdyYXBoIiwidGV4dCJdLmluY2x1ZGVzKGwudHlwZSkpe3IrPXN8fCIiO2NvbnRpbnVlfX1zd2l0Y2goaS50eXBlKXtjYXNlInNwYWNlIjpjb250aW51ZTtjYXNlImhyIjp7cis9dGhpcy5yZW5kZXJlci5ocigpO2NvbnRpbnVlfWNhc2UiaGVhZGluZyI6e2NvbnN0IGw9aTtyKz10aGlzLnJlbmRlcmVyLmhlYWRpbmcodGhpcy5wYXJzZUlubGluZShsLnRva2VucyksbC5kZXB0aCxqUCh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLHRoaXMudGV4dFJlbmRlcmVyKSkpO2NvbnRpbnVlfWNhc2UiY29kZSI6e2NvbnN0IGw9aTtyKz10aGlzLnJlbmRlcmVyLmNvZGUobC50ZXh0LGwubGFuZywhIWwuZXNjYXBlZCk7Y29udGludWV9Y2FzZSJ0YWJsZSI6e2NvbnN0IGw9aTtsZXQgcz0iIixhPSIiO2ZvcihsZXQgYz0wO2M8bC5oZWFkZXIubGVuZ3RoO2MrKylhKz10aGlzLnJlbmRlcmVyLnRhYmxlY2VsbCh0aGlzLnBhcnNlSW5saW5lKGwuaGVhZGVyW2NdLnRva2Vucykse2hlYWRlcjohMCxhbGlnbjpsLmFsaWduW2NdfSk7cys9dGhpcy5yZW5kZXJlci50YWJsZXJvdyhhKTtsZXQgdT0iIjtmb3IobGV0IGM9MDtjPGwucm93cy5sZW5ndGg7YysrKXtjb25zdCBkPWwucm93c1tjXTthPSIiO2ZvcihsZXQgZj0wO2Y8ZC5sZW5ndGg7ZisrKWErPXRoaXMucmVuZGVyZXIudGFibGVjZWxsKHRoaXMucGFyc2VJbmxpbmUoZFtmXS50b2tlbnMpLHtoZWFkZXI6ITEsYWxpZ246bC5hbGlnbltmXX0pO3UrPXRoaXMucmVuZGVyZXIudGFibGVyb3coYSl9cis9dGhpcy5yZW5kZXJlci50YWJsZShzLHUpO2NvbnRpbnVlfWNhc2UiYmxvY2txdW90ZSI6e2NvbnN0IGw9aSxzPXRoaXMucGFyc2UobC50b2tlbnMpO3IrPXRoaXMucmVuZGVyZXIuYmxvY2txdW90ZShzKTtjb250aW51ZX1jYXNlImxpc3QiOntjb25zdCBsPWkscz1sLm9yZGVyZWQsYT1sLnN0YXJ0LHU9bC5sb29zZTtsZXQgYz0iIjtmb3IobGV0IGQ9MDtkPGwuaXRlbXMubGVuZ3RoO2QrKyl7Y29uc3QgZj1sLml0ZW1zW2RdLGg9Zi5jaGVja2VkLGc9Zi50YXNrO2xldCBtPSIiO2lmKGYudGFzayl7Y29uc3QgUz10aGlzLnJlbmRlcmVyLmNoZWNrYm94KCEhaCk7dT9mLnRva2Vucy5sZW5ndGg+MCYmZi50b2tlbnNbMF0udHlwZT09PSJwYXJhZ3JhcGgiPyhmLnRva2Vuc1swXS50ZXh0PVMrIiAiK2YudG9rZW5zWzBdLnRleHQsZi50b2tlbnNbMF0udG9rZW5zJiZmLnRva2Vuc1swXS50b2tlbnMubGVuZ3RoPjAmJmYudG9rZW5zWzBdLnRva2Vuc1swXS50eXBlPT09InRleHQiJiYoZi50b2tlbnNbMF0udG9rZW5zWzBdLnRleHQ9UysiICIrZi50b2tlbnNbMF0udG9rZW5zWzBdLnRleHQpKTpmLnRva2Vucy51bnNoaWZ0KHt0eXBlOiJ0ZXh0Iix0ZXh0OlMrIiAifSk6bSs9UysiICJ9bSs9dGhpcy5wYXJzZShmLnRva2Vucyx1KSxjKz10aGlzLnJlbmRlcmVyLmxpc3RpdGVtKG0sZywhIWgpfXIrPXRoaXMucmVuZGVyZXIubGlzdChjLHMsYSk7Y29udGludWV9Y2FzZSJodG1sIjp7Y29uc3QgbD1pO3IrPXRoaXMucmVuZGVyZXIuaHRtbChsLnRleHQsbC5ibG9jayk7Y29udGludWV9Y2FzZSJwYXJhZ3JhcGgiOntjb25zdCBsPWk7cis9dGhpcy5yZW5kZXJlci5wYXJhZ3JhcGgodGhpcy5wYXJzZUlubGluZShsLnRva2VucykpO2NvbnRpbnVlfWNhc2UidGV4dCI6e2xldCBsPWkscz1sLnRva2Vucz90aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zKTpsLnRleHQ7Zm9yKDtvKzE8dC5sZW5ndGgmJnRbbysxXS50eXBlPT09InRleHQiOylsPXRbKytvXSxzKz1gCmArKGwudG9rZW5zP3RoaXMucGFyc2VJbmxpbmUobC50b2tlbnMpOmwudGV4dCk7cis9bj90aGlzLnJlbmRlcmVyLnBhcmFncmFwaChzKTpzO2NvbnRpbnVlfWRlZmF1bHQ6e2NvbnN0IGw9J1Rva2VuIHdpdGggIicraS50eXBlKyciIHR5cGUgd2FzIG5vdCBmb3VuZC4nO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpcmV0dXJuIGNvbnNvbGUuZXJyb3IobCksIiI7dGhyb3cgbmV3IEVycm9yKGwpfX19cmV0dXJuIHJ9cGFyc2VJbmxpbmUodCxuKXtuPW58fHRoaXMucmVuZGVyZXI7bGV0IHI9IiI7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGk9dFtvXTtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbaS50eXBlXSl7Y29uc3QgbD10aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbaS50eXBlXS5jYWxsKHtwYXJzZXI6dGhpc30saSk7aWYobCE9PSExfHwhWyJlc2NhcGUiLCJodG1sIiwibGluayIsImltYWdlIiwic3Ryb25nIiwiZW0iLCJjb2Rlc3BhbiIsImJyIiwiZGVsIiwidGV4dCJdLmluY2x1ZGVzKGkudHlwZSkpe3IrPWx8fCIiO2NvbnRpbnVlfX1zd2l0Y2goaS50eXBlKXtjYXNlImVzY2FwZSI6e2NvbnN0IGw9aTtyKz1uLnRleHQobC50ZXh0KTticmVha31jYXNlImh0bWwiOntjb25zdCBsPWk7cis9bi5odG1sKGwudGV4dCk7YnJlYWt9Y2FzZSJsaW5rIjp7Y29uc3QgbD1pO3IrPW4ubGluayhsLmhyZWYsbC50aXRsZSx0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLG4pKTticmVha31jYXNlImltYWdlIjp7Y29uc3QgbD1pO3IrPW4uaW1hZ2UobC5ocmVmLGwudGl0bGUsbC50ZXh0KTticmVha31jYXNlInN0cm9uZyI6e2NvbnN0IGw9aTtyKz1uLnN0cm9uZyh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLG4pKTticmVha31jYXNlImVtIjp7Y29uc3QgbD1pO3IrPW4uZW0odGhpcy5wYXJzZUlubGluZShsLnRva2VucyxuKSk7YnJlYWt9Y2FzZSJjb2Rlc3BhbiI6e2NvbnN0IGw9aTtyKz1uLmNvZGVzcGFuKGwudGV4dCk7YnJlYWt9Y2FzZSJiciI6e3IrPW4uYnIoKTticmVha31jYXNlImRlbCI6e2NvbnN0IGw9aTtyKz1uLmRlbCh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLG4pKTticmVha31jYXNlInRleHQiOntjb25zdCBsPWk7cis9bi50ZXh0KGwudGV4dCk7YnJlYWt9ZGVmYXVsdDp7Y29uc3QgbD0nVG9rZW4gd2l0aCAiJytpLnR5cGUrJyIgdHlwZSB3YXMgbm90IGZvdW5kLic7aWYodGhpcy5vcHRpb25zLnNpbGVudClyZXR1cm4gY29uc29sZS5lcnJvcihsKSwiIjt0aHJvdyBuZXcgRXJyb3IobCl9fX1yZXR1cm4gcn19Y2xhc3MgV3N7Y29uc3RydWN0b3IodCl7amUodGhpcywib3B0aW9ucyIpO3RoaXMub3B0aW9ucz10fHxOaX1wcmVwcm9jZXNzKHQpe3JldHVybiB0fXBvc3Rwcm9jZXNzKHQpe3JldHVybiB0fX1qZShXcywicGFzc1Rocm91Z2hIb29rcyIsbmV3IFNldChbInByZXByb2Nlc3MiLCJwb3N0cHJvY2VzcyJdKSk7dmFyIENhLGhwLEZjLEZTO2NsYXNzIFdQe2NvbnN0cnVjdG9yKC4uLnQpe0lkKHRoaXMsQ2EpO0lkKHRoaXMsRmMpO2plKHRoaXMsImRlZmF1bHRzIixkbSgpKTtqZSh0aGlzLCJvcHRpb25zIix0aGlzLnNldE9wdGlvbnMpO2plKHRoaXMsInBhcnNlIixIYSh0aGlzLENhLGhwKS5jYWxsKHRoaXMsZnIubGV4LGhyLnBhcnNlKSk7amUodGhpcywicGFyc2VJbmxpbmUiLEhhKHRoaXMsQ2EsaHApLmNhbGwodGhpcyxmci5sZXhJbmxpbmUsaHIucGFyc2VJbmxpbmUpKTtqZSh0aGlzLCJQYXJzZXIiLGhyKTtqZSh0aGlzLCJwYXJzZXIiLGhyLnBhcnNlKTtqZSh0aGlzLCJSZW5kZXJlciIsUGMpO2plKHRoaXMsIlRleHRSZW5kZXJlciIsZm0pO2plKHRoaXMsIkxleGVyIixmcik7amUodGhpcywibGV4ZXIiLGZyLmxleCk7amUodGhpcywiVG9rZW5pemVyIixSYyk7amUodGhpcywiSG9va3MiLFdzKTt0aGlzLnVzZSguLi50KX13YWxrVG9rZW5zKHQsbil7dmFyIG8saTtsZXQgcj1bXTtmb3IoY29uc3QgbCBvZiB0KXN3aXRjaChyPXIuY29uY2F0KG4uY2FsbCh0aGlzLGwpKSxsLnR5cGUpe2Nhc2UidGFibGUiOntjb25zdCBzPWw7Zm9yKGNvbnN0IGEgb2Ygcy5oZWFkZXIpcj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoYS50b2tlbnMsbikpO2Zvcihjb25zdCBhIG9mIHMucm93cylmb3IoY29uc3QgdSBvZiBhKXI9ci5jb25jYXQodGhpcy53YWxrVG9rZW5zKHUudG9rZW5zLG4pKTticmVha31jYXNlImxpc3QiOntjb25zdCBzPWw7cj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMocy5pdGVtcyxuKSk7YnJlYWt9ZGVmYXVsdDp7Y29uc3Qgcz1sOyhpPShvPXRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9ucyk9PW51bGw/dm9pZCAwOm8uY2hpbGRUb2tlbnMpIT1udWxsJiZpW3MudHlwZV0/dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zLmNoaWxkVG9rZW5zW3MudHlwZV0uZm9yRWFjaChhPT57cj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMoc1thXSxuKSl9KTpzLnRva2VucyYmKHI9ci5jb25jYXQodGhpcy53YWxrVG9rZW5zKHMudG9rZW5zLG4pKSl9fXJldHVybiByfXVzZSguLi50KXtjb25zdCBuPXRoaXMuZGVmYXVsdHMuZXh0ZW5zaW9uc3x8e3JlbmRlcmVyczp7fSxjaGlsZFRva2Vuczp7fX07cmV0dXJuIHQuZm9yRWFjaChyPT57Y29uc3Qgbz17Li4ucn07aWYoby5hc3luYz10aGlzLmRlZmF1bHRzLmFzeW5jfHxvLmFzeW5jfHwhMSxyLmV4dGVuc2lvbnMmJihyLmV4dGVuc2lvbnMuZm9yRWFjaChpPT57aWYoIWkubmFtZSl0aHJvdyBuZXcgRXJyb3IoImV4dGVuc2lvbiBuYW1lIHJlcXVpcmVkIik7aWYoInJlbmRlcmVyImluIGkpe2NvbnN0IGw9bi5yZW5kZXJlcnNbaS5uYW1lXTtsP24ucmVuZGVyZXJzW2kubmFtZV09ZnVuY3Rpb24oLi4ucyl7bGV0IGE9aS5yZW5kZXJlci5hcHBseSh0aGlzLHMpO3JldHVybiBhPT09ITEmJihhPWwuYXBwbHkodGhpcyxzKSksYX06bi5yZW5kZXJlcnNbaS5uYW1lXT1pLnJlbmRlcmVyfWlmKCJ0b2tlbml6ZXIiaW4gaSl7aWYoIWkubGV2ZWx8fGkubGV2ZWwhPT0iYmxvY2siJiZpLmxldmVsIT09ImlubGluZSIpdGhyb3cgbmV3IEVycm9yKCJleHRlbnNpb24gbGV2ZWwgbXVzdCBiZSAnYmxvY2snIG9yICdpbmxpbmUnIik7Y29uc3QgbD1uW2kubGV2ZWxdO2w/bC51bnNoaWZ0KGkudG9rZW5pemVyKTpuW2kubGV2ZWxdPVtpLnRva2VuaXplcl0saS5zdGFydCYmKGkubGV2ZWw9PT0iYmxvY2siP24uc3RhcnRCbG9jaz9uLnN0YXJ0QmxvY2sucHVzaChpLnN0YXJ0KTpuLnN0YXJ0QmxvY2s9W2kuc3RhcnRdOmkubGV2ZWw9PT0iaW5saW5lIiYmKG4uc3RhcnRJbmxpbmU/bi5zdGFydElubGluZS5wdXNoKGkuc3RhcnQpOm4uc3RhcnRJbmxpbmU9W2kuc3RhcnRdKSl9ImNoaWxkVG9rZW5zImluIGkmJmkuY2hpbGRUb2tlbnMmJihuLmNoaWxkVG9rZW5zW2kubmFtZV09aS5jaGlsZFRva2Vucyl9KSxvLmV4dGVuc2lvbnM9biksci5yZW5kZXJlcil7Y29uc3QgaT10aGlzLmRlZmF1bHRzLnJlbmRlcmVyfHxuZXcgUGModGhpcy5kZWZhdWx0cyk7Zm9yKGNvbnN0IGwgaW4gci5yZW5kZXJlcil7Y29uc3Qgcz1yLnJlbmRlcmVyW2xdLGE9bCx1PWlbYV07aVthXT0oLi4uYyk9PntsZXQgZD1zLmFwcGx5KGksYyk7cmV0dXJuIGQ9PT0hMSYmKGQ9dS5hcHBseShpLGMpKSxkfHwiIn19by5yZW5kZXJlcj1pfWlmKHIudG9rZW5pemVyKXtjb25zdCBpPXRoaXMuZGVmYXVsdHMudG9rZW5pemVyfHxuZXcgUmModGhpcy5kZWZhdWx0cyk7Zm9yKGNvbnN0IGwgaW4gci50b2tlbml6ZXIpe2NvbnN0IHM9ci50b2tlbml6ZXJbbF0sYT1sLHU9aVthXTtpW2FdPSguLi5jKT0+e2xldCBkPXMuYXBwbHkoaSxjKTtyZXR1cm4gZD09PSExJiYoZD11LmFwcGx5KGksYykpLGR9fW8udG9rZW5pemVyPWl9aWYoci5ob29rcyl7Y29uc3QgaT10aGlzLmRlZmF1bHRzLmhvb2tzfHxuZXcgV3M7Zm9yKGNvbnN0IGwgaW4gci5ob29rcyl7Y29uc3Qgcz1yLmhvb2tzW2xdLGE9bCx1PWlbYV07V3MucGFzc1Rocm91Z2hIb29rcy5oYXMobCk/aVthXT1jPT57aWYodGhpcy5kZWZhdWx0cy5hc3luYylyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHMuY2FsbChpLGMpKS50aGVuKGY9PnUuY2FsbChpLGYpKTtjb25zdCBkPXMuY2FsbChpLGMpO3JldHVybiB1LmNhbGwoaSxkKX06aVthXT0oLi4uYyk9PntsZXQgZD1zLmFwcGx5KGksYyk7cmV0dXJuIGQ9PT0hMSYmKGQ9dS5hcHBseShpLGMpKSxkfX1vLmhvb2tzPWl9aWYoci53YWxrVG9rZW5zKXtjb25zdCBpPXRoaXMuZGVmYXVsdHMud2Fsa1Rva2VucyxsPXIud2Fsa1Rva2VucztvLndhbGtUb2tlbnM9ZnVuY3Rpb24ocyl7bGV0IGE9W107cmV0dXJuIGEucHVzaChsLmNhbGwodGhpcyxzKSksaSYmKGE9YS5jb25jYXQoaS5jYWxsKHRoaXMscykpKSxhfX10aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLm99fSksdGhpc31zZXRPcHRpb25zKHQpe3JldHVybiB0aGlzLmRlZmF1bHRzPXsuLi50aGlzLmRlZmF1bHRzLC4uLnR9LHRoaXN9fUNhPW5ldyBXZWFrU2V0LGhwPWZ1bmN0aW9uKHQsbil7cmV0dXJuKHIsbyk9Pntjb25zdCBpPXsuLi5vfSxsPXsuLi50aGlzLmRlZmF1bHRzLC4uLml9O3RoaXMuZGVmYXVsdHMuYXN5bmM9PT0hMCYmaS5hc3luYz09PSExJiYobC5zaWxlbnR8fGNvbnNvbGUud2FybigibWFya2VkKCk6IFRoZSBhc3luYyBvcHRpb24gd2FzIHNldCB0byB0cnVlIGJ5IGFuIGV4dGVuc2lvbi4gVGhlIGFzeW5jOiBmYWxzZSBvcHRpb24gc2VudCB0byBwYXJzZSB3aWxsIGJlIGlnbm9yZWQuIiksbC5hc3luYz0hMCk7Y29uc3Qgcz1IYSh0aGlzLEZjLEZTKS5jYWxsKHRoaXMsISFsLnNpbGVudCwhIWwuYXN5bmMpO2lmKHR5cGVvZiByPiJ1Inx8cj09PW51bGwpcmV0dXJuIHMobmV3IEVycm9yKCJtYXJrZWQoKTogaW5wdXQgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCBvciBudWxsIikpO2lmKHR5cGVvZiByIT0ic3RyaW5nIilyZXR1cm4gcyhuZXcgRXJyb3IoIm1hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgb2YgdHlwZSAiK09iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChyKSsiLCBzdHJpbmcgZXhwZWN0ZWQiKSk7aWYobC5ob29rcyYmKGwuaG9va3Mub3B0aW9ucz1sKSxsLmFzeW5jKXJldHVybiBQcm9taXNlLnJlc29sdmUobC5ob29rcz9sLmhvb2tzLnByZXByb2Nlc3Mocik6cikudGhlbihhPT50KGEsbCkpLnRoZW4oYT0+bC53YWxrVG9rZW5zP1Byb21pc2UuYWxsKHRoaXMud2Fsa1Rva2VucyhhLGwud2Fsa1Rva2VucykpLnRoZW4oKCk9PmEpOmEpLnRoZW4oYT0+bihhLGwpKS50aGVuKGE9PmwuaG9va3M/bC5ob29rcy5wb3N0cHJvY2VzcyhhKTphKS5jYXRjaChzKTt0cnl7bC5ob29rcyYmKHI9bC5ob29rcy5wcmVwcm9jZXNzKHIpKTtjb25zdCBhPXQocixsKTtsLndhbGtUb2tlbnMmJnRoaXMud2Fsa1Rva2VucyhhLGwud2Fsa1Rva2Vucyk7bGV0IHU9bihhLGwpO3JldHVybiBsLmhvb2tzJiYodT1sLmhvb2tzLnBvc3Rwcm9jZXNzKHUpKSx1fWNhdGNoKGEpe3JldHVybiBzKGEpfX19LEZjPW5ldyBXZWFrU2V0LEZTPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHI9PntpZihyLm1lc3NhZ2UrPWAKUGxlYXNlIHJlcG9ydCB0aGlzIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrZWRqcy9tYXJrZWQuYCx0KXtjb25zdCBvPSI8cD5BbiBlcnJvciBvY2N1cnJlZDo8L3A+PHByZT4iK21uKHIubWVzc2FnZSsiIiwhMCkrIjwvcHJlPiI7cmV0dXJuIG4/UHJvbWlzZS5yZXNvbHZlKG8pOm99aWYobilyZXR1cm4gUHJvbWlzZS5yZWplY3Qocik7dGhyb3cgcn19O2NvbnN0IGdpPW5ldyBXUDtmdW5jdGlvbiBNZShlLHQpe3JldHVybiBnaS5wYXJzZShlLHQpfU1lLm9wdGlvbnM9TWUuc2V0T3B0aW9ucz1mdW5jdGlvbihlKXtyZXR1cm4gZ2kuc2V0T3B0aW9ucyhlKSxNZS5kZWZhdWx0cz1naS5kZWZhdWx0cyxJUyhNZS5kZWZhdWx0cyksTWV9O01lLmdldERlZmF1bHRzPWRtO01lLmRlZmF1bHRzPU5pO01lLnVzZT1mdW5jdGlvbiguLi5lKXtyZXR1cm4gZ2kudXNlKC4uLmUpLE1lLmRlZmF1bHRzPWdpLmRlZmF1bHRzLElTKE1lLmRlZmF1bHRzKSxNZX07TWUud2Fsa1Rva2Vucz1mdW5jdGlvbihlLHQpe3JldHVybiBnaS53YWxrVG9rZW5zKGUsdCl9O01lLnBhcnNlSW5saW5lPWdpLnBhcnNlSW5saW5lO01lLlBhcnNlcj1ocjtNZS5wYXJzZXI9aHIucGFyc2U7TWUuUmVuZGVyZXI9UGM7TWUuVGV4dFJlbmRlcmVyPWZtO01lLkxleGVyPWZyO01lLmxleGVyPWZyLmxleDtNZS5Ub2tlbml6ZXI9UmM7TWUuSG9va3M9V3M7TWUucGFyc2U9TWU7TWUub3B0aW9ucztNZS5zZXRPcHRpb25zO01lLnVzZTtNZS53YWxrVG9rZW5zO01lLnBhcnNlSW5saW5lO2hyLnBhcnNlO2NvbnN0IFVQPWZyLmxleCxPYz0nPHZhbCB2YWx1ZT0iJyxwcD0nIj4nLGdwPSI8L3ZhbD4iO2Z1bmN0aW9uIEhuKGUsdCxuLHI9ITEpe3ZhciBpLGw7Y29uc3Qgbz1bXTtmb3IoO248ZS5sZW5ndGg7KXtjb25zdCBzPWVbbl07aWYocy50eXBlPT09ImhlYWRpbmciKW8ucHVzaCh7dGFnOmBoJHtzLmRlcHRofWAsY2hpbGRyZW46SG4ocy50b2tlbnM/cy50b2tlbnM6W10sdCwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYocy50eXBlPT09InBhcmFncmFwaCIpby5wdXNoKHt0YWc6InAiLGNoaWxkcmVuOkhuKHMudG9rZW5zP3MudG9rZW5zOltdLHQsMCkuY2hpbGRyZW59KTtlbHNlIGlmKHMudHlwZT09PSJzdHJvbmciKW8ucHVzaCh7dGFnOiJzcGFuIixjbGFzc2VzOlsiYm9sZCJdLGNoaWxkcmVuOkhuKHMudG9rZW5zP3MudG9rZW5zOltdLHQsMCkuY2hpbGRyZW59KTtlbHNlIGlmKHMudHlwZT09PSJlbSIpby5wdXNoKHt0YWc6InNwYW4iLGNsYXNzZXM6WyJpdGFsaWMiXSxjaGlsZHJlbjpIbihzLnRva2Vucz9zLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihzLnR5cGU9PT0iZGVsIilvLnB1c2goe3RhZzoic3BhbiIsY2xhc3NlczpbImxpbmUtdGhyb3VnaCJdLGNoaWxkcmVuOkhuKHMudG9rZW5zP3MudG9rZW5zOltdLHQsMCkuY2hpbGRyZW59KTtlbHNlIGlmKHMudHlwZT09PSJ0ZXh0IilpZigidG9rZW5zImluIHMmJkFycmF5LmlzQXJyYXkocy50b2tlbnMpKW8ucHVzaCguLi5IbihzLnRva2Vucyx0LG4scikuY2hpbGRyZW4pO2Vsc2UgaWYociYmdHlwZW9mIHMucmF3PT0ic3RyaW5nIil7Y29uc3QgYT1zLnJhdy5zcGxpdChgCmApLHU9YS5mbGF0TWFwKChjLGQpPT5kPT09YS5sZW5ndGgtMT9bY106W2Mse3RhZzoiYnIiLGNoaWxkcmVuOltdfV0pO28ucHVzaCguLi51KX1lbHNlIG8ucHVzaChzLnJhdyk7ZWxzZSBpZihzLnR5cGU9PT0ibGlzdCIpby5wdXNoKHt0YWc6cy5vcmRlcmVkPyJvbCI6InVsIixjaGlsZHJlbjpIbihzLml0ZW1zLHQsMCkuY2hpbGRyZW59KTtlbHNlIGlmKHMudHlwZT09PSJsaXN0X2l0ZW0iKW8ucHVzaCh7dGFnOiJsaSIsY2hpbGRyZW46SG4ocy50b2tlbnM/cy50b2tlbnM6W10sdCwwLCEwKS5jaGlsZHJlbn0pO2Vsc2UgaWYocy50eXBlIT09InNwYWNlIilpZihzLnR5cGU9PT0iaHRtbCIpe2lmKHMudGV4dD09PWdwKXJldHVybntjaGlsZHJlbjpvLGN1cnNvcjpufTtjb25zdCBhPXMudGV4dC5pbmRleE9mKHBwKTtpZihzLnRleHQuc3RhcnRzV2l0aChPYykmJmE+LTEpe2NvbnN0IGM9TnVtYmVyKHMudGV4dC5zbGljZShPYy5sZW5ndGgsYSkpO2lmKE51bWJlci5pc05hTihjKSl0aHJvdyBFcnJvcihgSWxsZWdhbCB2YWwgaW50ZXJtZWRpYXRlIG5vZGU6ICR7SlNPTi5zdHJpbmdpZnkocyl9YCk7Y29uc3R7Y2hpbGRyZW46ZCxjdXJzb3I6Zn09SG4oZS5tYXAoZz0+Zy50eXBlPT09ImxpbmsifHxnLnR5cGU9PT0ibGlzdCI/e3R5cGU6InRleHQiLHJhdzpnLnJhdyx0ZXh0OmcucmF3fTpnKSx0LG4rMSksaD10W2NdO2guX3R5cGU9PT0ibGluayI/by5wdXNoKHt0YWc6ImEiLGhyZWY6aC5ocmVmLGNoaWxkcmVuOmR9KTpoLl90eXBlPT09ImZpbGUiJiZvLnB1c2goe3RhZzoiaW1nIixzcmM6d24uY29udmVydEZpbGVTb3VyY2UoaCkudXJsLHdpZHRoOihpPWgubWV0YWRhdGEpPT1udWxsP3ZvaWQgMDppLndpZHRoLGhlaWdodDoobD1oLm1ldGFkYXRhKT09bnVsbD92b2lkIDA6bC5oZWlnaHQsY2hpbGRyZW46W119KSxuPWZ9Y29uc3QgdT0vPGJyXHMqXC8/Pi9naTtzLnRleHQudHJpbSgpLm1hdGNoKHUpJiZvLnB1c2goe3RhZzoiYnIiLGNoaWxkcmVuOltdfSl9ZWxzZSBzLnR5cGU9PT0ibGluayI/cy5yYXc9PT1zLmhyZWY/by5wdXNoKHMucmF3KTpvLnB1c2goe3RhZzoiYSIsaHJlZjpzLmhyZWYsY2hpbGRyZW46SG4ocy50b2tlbnM/cy50b2tlbnM6W10sdCwwKS5jaGlsZHJlbn0pOnMudHlwZT09PSJiciI/by5wdXNoKHt0YWc6ImJyIixjaGlsZHJlbjpbXX0pOmNvbnNvbGUuZXJyb3IoYENvdWxkIG5vdCBwYXJzZSBtYXJrZG93bjogdW5zdXBwb3J0ZWQgdG9rZW4gdHlwZTogJHtzLnR5cGV9LiBGb3VuZDogJHtzLnJhd31gKTtuKyt9cmV0dXJue2NoaWxkcmVuOm8sY3Vyc29yOm59fWZ1bmN0aW9uIEJTKHt0ZW1wbGF0ZVN0cmluZ3M6ZSxleHByczp0fSl7Y29uc3Qgbj1lLmZsYXRNYXAoKGwscyk9Pntjb25zdCBhPXRbc107cmV0dXJuIGE/YVtubl09PT0ibGluayI/bC5jb25jYXQoYCR7T2N9JHtzfSR7cHB9JHthLmNoaWxkcmVuWzBdfSR7Z3B9YCk6bC5jb25jYXQoYCR7T2N9JHtzfSR7cHB9JHtncH1gKTpsfSkuam9pbigiIikscj1VUChuLHtnZm06ITB9KSx7Y2hpbGRyZW46byxjdXJzb3I6aX09SG4ocix0LDApO2lmKGkhPT1yLmxlbmd0aCl0aHJvdyBFcnJvcigiVW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQgbWFya2Rvd24gcGFyc2luZy4gUG9zc2libGUgcmVhc29uOiB1bmNsb3NlZCBodG1sIHRhZz8iKTtyZXR1cm57W25uXToicmljaHRleHQiLGNoaWxkcmVuOm99fWNvbnN0IFZQPS9eaChbXGQrXSkkLztmdW5jdGlvbiBIUChlKXtjb25zdCB0PWUuY2hpbGRyZW4ubWFwKEtQKTtyZXR1cm4gR1AodCl9ZnVuY3Rpb24gS1AoZSl7dmFyIHQ7aWYoZS50eXBlPT09ImhlYWRpbmciKXtsZXQgbj0iIjtjb25zdCByPU51bWJlcigodD1lLnRhZy5tYXRjaChWUCkpPT1udWxsP3ZvaWQgMDp0WzFdKTtpZihOdW1iZXIuaXNOYU4ocikpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGhlYWRlciBkZXB0aCIpO2ZvcihsZXQgaT0wO2k8TnVtYmVyKHIpO2krKyluKz0iIyI7cmV0dXJue3R5cGU6ImJsb2NrIixjaGlsZHJlbjpbYCR7bn0gYF0uY29uY2F0KC4uLmUuY2hpbGRyZW4ubWFwKG1wKSl9fWVsc2V7aWYoZS50eXBlPT09InBhcmFncmFwaCIpcmV0dXJuIGUuY2hpbGRyZW4ubGVuZ3RoPT09MD97dHlwZToiYmxvY2siLGNoaWxkcmVuOlsiPGJyIC8+Il19Ont0eXBlOiJibG9jayIsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAobj0+bXAobikpfTtpZihlLnR5cGU9PT0ibGlzdCIpcmV0dXJue3R5cGU6ImJsb2NrIixjaGlsZHJlbjplLmNoaWxkcmVuLmZsYXRNYXAoKG4scik9PlVTKFZTKGUpLG4sMCxyPT09MCkpfTt7Y29uc3Qgbj1lO3Rocm93IG5ldyBFcnJvcihgVW5oYW5kbGVkIG5vZGUgdHlwZTogJHsidHlwZSJpbiBuPyJleGhhdXN0aXZlQ2hlY2sudHlwZSI6InVua25vd24ifWApfX19YXN5bmMgZnVuY3Rpb24gR1AoZSl7Y29uc3QgdD1bYApgXSxuPVtdLHI9e307Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspe2NvbnN0IGk9ZVtvXTtmb3IoY29uc3QgbCBvZiBpLmNoaWxkcmVuKWlmKHR5cGVvZiBsPT0ic3RyaW5nIil0W3QubGVuZ3RoLTFdKz1sO2Vsc2V7aWYobC50eXBlPT09ImltYWdlIiluLnB1c2goYXdhaXQgSlAobCxyKSk7ZWxzZSBpZihsLnR5cGU9PT0ibGluayIpbi5wdXNoKHFQKGwpKTtlbHNle2NvbnN0IHM9bDt0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgbm9kZSB0eXBlOiAke0pTT04uc3RyaW5naWZ5KHMsbnVsbCwyKX1gKX10LnB1c2goIiIpfW89PT1lLmxlbmd0aC0xP3RbdC5sZW5ndGgtMV0rPWAKYDp0W3QubGVuZ3RoLTFdKz1gCgpgfXJldHVybntbbm5dOiJyaWNodGV4dCIsdGVtcGxhdGVTdHJpbmdzOnQsZXhwcnM6bixmaWxlczpyfX1mdW5jdGlvbiBXUyhlKXtjb25zdCB0PXR5cGVvZiBlLmZvcm1hdD09Im51bWJlciI/WFAoZS5mb3JtYXQpOltdO2xldCBuPWUudGV4dC50cmltU3RhcnQoKTtjb25zdCByPWUudGV4dC5sZW5ndGgtbi5sZW5ndGg7bj1uLnRyaW1FbmQoKTtjb25zdCBvPWUudGV4dC5sZW5ndGgtbi5sZW5ndGgtcjtyZXR1cm4gdC5pbmNsdWRlcygiYm9sZCIpJiZ0LmluY2x1ZGVzKCJpdGFsaWMiKT9uPWAqKioke259KioqYDp0LmluY2x1ZGVzKCJib2xkIik/bj1gKioke259KipgOnQuaW5jbHVkZXMoIml0YWxpYyIpJiYobj1gXyR7bn1fYCksdC5pbmNsdWRlcygibGluZS10aHJvdWdoIikmJihuPWB+fiR7bn1+fmApLGAkeyIgIi5yZXBlYXQocil9JHtufSR7IiAiLnJlcGVhdChvKX1gfWZ1bmN0aW9uIG1wKGUpe3JldHVybiBlLnR5cGU9PT0idGV4dCI/V1MoZSk6ZS50eXBlPT09ImxpbmVicmVhayI/YApgOmV9ZnVuY3Rpb24gVVMoZSx0LG4scj0hMSl7dmFyIGwscztjb25zdCBpPVtgJHtyPyIiOmAKYH0keyIgIi5yZXBlYXQobil9JHtlfWBdO3JldHVybigocz0obD10LmNoaWxkcmVuKT09bnVsbD92b2lkIDA6bFswXSk9PW51bGw/dm9pZCAwOnMudHlwZSkhPT0ibGlzdCImJmkucHVzaCgiICIpLGkuY29uY2F0KHQuY2hpbGRyZW4uZmxhdE1hcChhPT5hLnR5cGU9PT0ibGlzdCI/YS5jaGlsZHJlbi5mbGF0TWFwKHU9PlVTKFZTKGEpLHUsbis0KSk6W21wKGEpXSkpfWZ1bmN0aW9uIFZTKGUpe2lmKGUubGlzdFR5cGU9PT0iYnVsbGV0IilyZXR1cm4iLSI7aWYoZS5saXN0VHlwZT09PSJudW1iZXIiKXJldHVybiIxLiI7dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgbGlzdCB0eXBlOiAke2UubGlzdFR5cGV9YCl9Y29uc3QgWVA9e2JvbGQ6MSxpdGFsaWM6MiwibGluZS10aHJvdWdoIjo0fTtmdW5jdGlvbiBYUChlKXtyZXR1cm4gT2JqZWN0LmVudHJpZXMoWVApLmZsYXRNYXAoKFt0LG5dKT0+KG4mZSk9PT1uP1t0XTpbXSl9Y29uc3QgUVA9bmV3IFRleHRFbmNvZGVyO2FzeW5jIGZ1bmN0aW9uIEpQKGUsdCl7aWYoZS5zcmMuc3RhcnRzV2l0aCgiZGF0YToiKSl7Y29uc3Qgbj1hd2FpdCB3bi5nZXRTSEEyNTZIYXNoKFFQLmVuY29kZShlLnNyYykpLHI9a1MoZS5zcmMpO2lmKHI9PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZGV0ZWN0IE1pbWUgVHlwZSBmb3IgaW1hZ2U6ICR7ZS5zcmN9YCk7Y29uc3Qgbz1UUyhyKSxpPWAvcHVibGljLyR7bn0uJHtvfWA7cmV0dXJuIHRbaV09ZS5zcmMse1tubl06ImZpbGUiLFtfbl06aSxtZXRhZGF0YTp7d2lkdGg6ZS53aWR0aHx8MCxoZWlnaHQ6ZS53aWR0aHx8MCxzaGEyNTY6bnx8IiJ9fX1lbHNle2NvbnN0IG49WlAoInNoYTI1NiIsZS5zcmMpO3JldHVybntbbm5dOiJmaWxlIixbX25dOmAvcHVibGljJHtlLnNyYy5zcGxpdCgiPyIpWzBdfWAsbWV0YWRhdGE6e3dpZHRoOmUud2lkdGh8fDAsaGVpZ2h0OmUud2lkdGh8fDAsc2hhMjU2Om58fCIifX19fWZ1bmN0aW9uIFpQKGUsdCl7Y29uc3Qgbj10LnNwbGl0KCI/Iik7aWYobi5sZW5ndGg8MilyZXR1cm47Y29uc3Qgcj1uWzFdLG89bmV3IFVSTFNlYXJjaFBhcmFtcyhyKTtpZihvLmhhcyhlKSlyZXR1cm4gby5nZXQoZSl9ZnVuY3Rpb24gcVAoZSl7cmV0dXJue1tubl06ImxpbmsiLGhyZWY6ZS51cmwsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAoV1MpfX1jb25zdCBobT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSx0eXBlOnQsLi4ubn0scik9PncuanN4KCJpbnB1dCIse3R5cGU6dCxjbGFzc05hbWU6b3QoImZsZXggaC0xMCB3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgcHgtMyBweS0yIHRleHQtc20gcmluZy1vZmZzZXQtYmFja2dyb3VuZCBmaWxlOmJvcmRlci0wIGZpbGU6YmctdHJhbnNwYXJlbnQgZmlsZTp0ZXh0LXNtIGZpbGU6Zm9udC1tZWRpdW0gcGxhY2Vob2xkZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCIsZSkscmVmOnIsLi4ubn0pKTtobS5kaXNwbGF5TmFtZT0iSW5wdXQiO2Z1bmN0aW9uIEhTKGUpe2NvbnN0IHQ9ZSsiQ29sbGVjdGlvblByb3ZpZGVyIixbbixyXT1DaSh0KSxbbyxpXT1uKHQse2NvbGxlY3Rpb25SZWY6e2N1cnJlbnQ6bnVsbH0saXRlbU1hcDpuZXcgTWFwfSksbD1oPT57Y29uc3R7c2NvcGU6ZyxjaGlsZHJlbjptfT1oLFM9cS51c2VSZWYobnVsbCksdj1xLnVzZVJlZihuZXcgTWFwKS5jdXJyZW50O3JldHVybiBxLmNyZWF0ZUVsZW1lbnQobyx7c2NvcGU6ZyxpdGVtTWFwOnYsY29sbGVjdGlvblJlZjpTfSxtKX0scz1lKyJDb2xsZWN0aW9uU2xvdCIsYT1xLmZvcndhcmRSZWYoKGgsZyk9Pntjb25zdHtzY29wZTptLGNoaWxkcmVuOlN9PWgsdj1pKHMsbSkseT1YZShnLHYuY29sbGVjdGlvblJlZik7cmV0dXJuIHEuY3JlYXRlRWxlbWVudChFbCx7cmVmOnl9LFMpfSksdT1lKyJDb2xsZWN0aW9uSXRlbVNsb3QiLGM9ImRhdGEtcmFkaXgtY29sbGVjdGlvbi1pdGVtIixkPXEuZm9yd2FyZFJlZigoaCxnKT0+e2NvbnN0e3Njb3BlOm0sY2hpbGRyZW46UywuLi52fT1oLHk9cS51c2VSZWYobnVsbCkseD1YZShnLHkpLF89aSh1LG0pO3JldHVybiBxLnVzZUVmZmVjdCgoKT0+KF8uaXRlbU1hcC5zZXQoeSx7cmVmOnksLi4udn0pLCgpPT52b2lkIF8uaXRlbU1hcC5kZWxldGUoeSkpKSxxLmNyZWF0ZUVsZW1lbnQoRWwse1tjXToiIixyZWY6eH0sUyl9KTtmdW5jdGlvbiBmKGgpe2NvbnN0IGc9aShlKyJDb2xsZWN0aW9uQ29uc3VtZXIiLGgpO3JldHVybiBxLnVzZUNhbGxiYWNrKCgpPT57Y29uc3QgUz1nLmNvbGxlY3Rpb25SZWYuY3VycmVudDtpZighUylyZXR1cm5bXTtjb25zdCB2PUFycmF5LmZyb20oUy5xdWVyeVNlbGVjdG9yQWxsKGBbJHtjfV1gKSk7cmV0dXJuIEFycmF5LmZyb20oZy5pdGVtTWFwLnZhbHVlcygpKS5zb3J0KChfLEUpPT52LmluZGV4T2YoXy5yZWYuY3VycmVudCktdi5pbmRleE9mKEUucmVmLmN1cnJlbnQpKX0sW2cuY29sbGVjdGlvblJlZixnLml0ZW1NYXBdKX1yZXR1cm5be1Byb3ZpZGVyOmwsU2xvdDphLEl0ZW1TbG90OmR9LGYscl19ZnVuY3Rpb24gZU8oZSx0PWdsb2JhbFRoaXM9PW51bGw/dm9pZCAwOmdsb2JhbFRoaXMuZG9jdW1lbnQpe2NvbnN0IG49VnQoZSk7cC51c2VFZmZlY3QoKCk9Pntjb25zdCByPW89PntvLmtleT09PSJFc2NhcGUiJiZuKG8pfTtyZXR1cm4gdC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixyKSwoKT0+dC5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixyKX0sW24sdF0pfWNvbnN0IHZwPSJkaXNtaXNzYWJsZUxheWVyLnVwZGF0ZSIsdE89ImRpc21pc3NhYmxlTGF5ZXIucG9pbnRlckRvd25PdXRzaWRlIixuTz0iZGlzbWlzc2FibGVMYXllci5mb2N1c091dHNpZGUiO2xldCBxeTtjb25zdCByTz1wLmNyZWF0ZUNvbnRleHQoe2xheWVyczpuZXcgU2V0LGxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkOm5ldyBTZXQsYnJhbmNoZXM6bmV3IFNldH0pLG9PPXAuZm9yd2FyZFJlZigoZSx0KT0+e3ZhciBuO2NvbnN0e2Rpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czpyPSExLG9uRXNjYXBlS2V5RG93bjpvLG9uUG9pbnRlckRvd25PdXRzaWRlOmksb25Gb2N1c091dHNpZGU6bCxvbkludGVyYWN0T3V0c2lkZTpzLG9uRGlzbWlzczphLC4uLnV9PWUsYz1wLnVzZUNvbnRleHQock8pLFtkLGZdPXAudXNlU3RhdGUobnVsbCksaD0obj1kPT1udWxsP3ZvaWQgMDpkLm93bmVyRG9jdW1lbnQpIT09bnVsbCYmbiE9PXZvaWQgMD9uOmdsb2JhbFRoaXM9PW51bGw/dm9pZCAwOmdsb2JhbFRoaXMuZG9jdW1lbnQsWyxnXT1wLnVzZVN0YXRlKHt9KSxtPVhlKHQsVD0+ZihUKSksUz1BcnJheS5mcm9tKGMubGF5ZXJzKSxbdl09Wy4uLmMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWRdLnNsaWNlKC0xKSx5PVMuaW5kZXhPZih2KSx4PWQ/Uy5pbmRleE9mKGQpOi0xLF89Yy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5zaXplPjAsRT14Pj15LCQ9aU8oVD0+e2NvbnN0IE09VC50YXJnZXQsUj1bLi4uYy5icmFuY2hlc10uc29tZShqPT5qLmNvbnRhaW5zKE0pKTshRXx8Unx8KGk9PW51bGx8fGkoVCkscz09bnVsbHx8cyhUKSxULmRlZmF1bHRQcmV2ZW50ZWR8fGE9PW51bGx8fGEoKSl9LGgpLEM9bE8oVD0+e2NvbnN0IE09VC50YXJnZXQ7Wy4uLmMuYnJhbmNoZXNdLnNvbWUoaj0+ai5jb250YWlucyhNKSl8fChsPT1udWxsfHxsKFQpLHM9PW51bGx8fHMoVCksVC5kZWZhdWx0UHJldmVudGVkfHxhPT1udWxsfHxhKCkpfSxoKTtyZXR1cm4gZU8oVD0+e3g9PT1jLmxheWVycy5zaXplLTEmJihvPT1udWxsfHxvKFQpLCFULmRlZmF1bHRQcmV2ZW50ZWQmJmEmJihULnByZXZlbnREZWZhdWx0KCksYSgpKSl9LGgpLHAudXNlRWZmZWN0KCgpPT57aWYoZClyZXR1cm4gciYmKGMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT09PTAmJihxeT1oLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cyxoLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIpLGMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuYWRkKGQpKSxjLmxheWVycy5hZGQoZCksZTAoKSwoKT0+e3ImJmMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT09PTEmJihoLmJvZHkuc3R5bGUucG9pbnRlckV2ZW50cz1xeSl9fSxbZCxoLHIsY10pLHAudXNlRWZmZWN0KCgpPT4oKT0+e2QmJihjLmxheWVycy5kZWxldGUoZCksYy5sYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZC5kZWxldGUoZCksZTAoKSl9LFtkLGNdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IFQ9KCk9Pmcoe30pO3JldHVybiBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKHZwLFQpLCgpPT5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHZwLFQpfSxbXSkscC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7fSx1LHtyZWY6bSxzdHlsZTp7cG9pbnRlckV2ZW50czpfP0U/ImF1dG8iOiJub25lIjp2b2lkIDAsLi4uZS5zdHlsZX0sb25Gb2N1c0NhcHR1cmU6SGUoZS5vbkZvY3VzQ2FwdHVyZSxDLm9uRm9jdXNDYXB0dXJlKSxvbkJsdXJDYXB0dXJlOkhlKGUub25CbHVyQ2FwdHVyZSxDLm9uQmx1ckNhcHR1cmUpLG9uUG9pbnRlckRvd25DYXB0dXJlOkhlKGUub25Qb2ludGVyRG93bkNhcHR1cmUsJC5vblBvaW50ZXJEb3duQ2FwdHVyZSl9KSl9KTtmdW5jdGlvbiBpTyhlLHQ9Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCl7Y29uc3Qgbj1WdChlKSxyPXAudXNlUmVmKCExKSxvPXAudXNlUmVmKCgpPT57fSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgaT1zPT57aWYocy50YXJnZXQmJiFyLmN1cnJlbnQpe2xldCBjPWZ1bmN0aW9uKCl7S1ModE8sbix1LHtkaXNjcmV0ZTohMH0pfTt2YXIgYT1jO2NvbnN0IHU9e29yaWdpbmFsRXZlbnQ6c307cy5wb2ludGVyVHlwZT09PSJ0b3VjaCI/KHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLG8uY3VycmVudCksby5jdXJyZW50PWMsdC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsby5jdXJyZW50LHtvbmNlOiEwfSkpOmMoKX1lbHNlIHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLG8uY3VycmVudCk7ci5jdXJyZW50PSExfSxsPXdpbmRvdy5zZXRUaW1lb3V0KCgpPT57dC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsaSl9LDApO3JldHVybigpPT57d2luZG93LmNsZWFyVGltZW91dChsKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJkb3duIixpKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixvLmN1cnJlbnQpfX0sW3Qsbl0pLHtvblBvaW50ZXJEb3duQ2FwdHVyZTooKT0+ci5jdXJyZW50PSEwfX1mdW5jdGlvbiBsTyhlLHQ9Z2xvYmFsVGhpcz09bnVsbD92b2lkIDA6Z2xvYmFsVGhpcy5kb2N1bWVudCl7Y29uc3Qgbj1WdChlKSxyPXAudXNlUmVmKCExKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBvPWk9PntpLnRhcmdldCYmIXIuY3VycmVudCYmS1Mobk8sbix7b3JpZ2luYWxFdmVudDppfSx7ZGlzY3JldGU6ITF9KX07cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsbyksKCk9PnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsbyl9LFt0LG5dKSx7b25Gb2N1c0NhcHR1cmU6KCk9PnIuY3VycmVudD0hMCxvbkJsdXJDYXB0dXJlOigpPT5yLmN1cnJlbnQ9ITF9fWZ1bmN0aW9uIGUwKCl7Y29uc3QgZT1uZXcgQ3VzdG9tRXZlbnQodnApO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQoZSl9ZnVuY3Rpb24gS1MoZSx0LG4se2Rpc2NyZXRlOnJ9KXtjb25zdCBvPW4ub3JpZ2luYWxFdmVudC50YXJnZXQsaT1uZXcgQ3VzdG9tRXZlbnQoZSx7YnViYmxlczohMSxjYW5jZWxhYmxlOiEwLGRldGFpbDpufSk7dCYmby5hZGRFdmVudExpc3RlbmVyKGUsdCx7b25jZTohMH0pLHI/UVQobyxpKTpvLmRpc3BhdGNoRXZlbnQoaSl9bGV0ICRmPTA7ZnVuY3Rpb24gc08oKXtwLnVzZUVmZmVjdCgoKT0+e3ZhciBlLHQ7Y29uc3Qgbj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1yYWRpeC1mb2N1cy1ndWFyZF0iKTtyZXR1cm4gZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEVsZW1lbnQoImFmdGVyYmVnaW4iLChlPW5bMF0pIT09bnVsbCYmZSE9PXZvaWQgMD9lOnQwKCkpLGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJiZWZvcmVlbmQiLCh0PW5bMV0pIT09bnVsbCYmdCE9PXZvaWQgMD90OnQwKCkpLCRmKyssKCk9PnskZj09PTEmJmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIltkYXRhLXJhZGl4LWZvY3VzLWd1YXJkXSIpLmZvckVhY2gocj0+ci5yZW1vdmUoKSksJGYtLX19LFtdKX1mdW5jdGlvbiB0MCgpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO3JldHVybiBlLnNldEF0dHJpYnV0ZSgiZGF0YS1yYWRpeC1mb2N1cy1ndWFyZCIsIiIpLGUudGFiSW5kZXg9MCxlLnN0eWxlLmNzc1RleHQ9Im91dGxpbmU6IG5vbmU7IG9wYWNpdHk6IDA7IHBvc2l0aW9uOiBmaXhlZDsgcG9pbnRlci1ldmVudHM6IG5vbmUiLGV9Y29uc3Qga2Y9ImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Nb3VudCIsVGY9ImZvY3VzU2NvcGUuYXV0b0ZvY3VzT25Vbm1vdW50IixuMD17YnViYmxlczohMSxjYW5jZWxhYmxlOiEwfSxhTz1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtsb29wOm49ITEsdHJhcHBlZDpyPSExLG9uTW91bnRBdXRvRm9jdXM6byxvblVubW91bnRBdXRvRm9jdXM6aSwuLi5sfT1lLFtzLGFdPXAudXNlU3RhdGUobnVsbCksdT1WdChvKSxjPVZ0KGkpLGQ9cC51c2VSZWYobnVsbCksZj1YZSh0LG09PmEobSkpLGg9cC51c2VSZWYoe3BhdXNlZDohMSxwYXVzZSgpe3RoaXMucGF1c2VkPSEwfSxyZXN1bWUoKXt0aGlzLnBhdXNlZD0hMX19KS5jdXJyZW50O3AudXNlRWZmZWN0KCgpPT57aWYocil7bGV0IHk9ZnVuY3Rpb24oJCl7aWYoaC5wYXVzZWR8fCFzKXJldHVybjtjb25zdCBDPSQudGFyZ2V0O3MuY29udGFpbnMoQyk/ZC5jdXJyZW50PUM6b28oZC5jdXJyZW50LHtzZWxlY3Q6ITB9KX0seD1mdW5jdGlvbigkKXtpZihoLnBhdXNlZHx8IXMpcmV0dXJuO2NvbnN0IEM9JC5yZWxhdGVkVGFyZ2V0O0MhPT1udWxsJiYocy5jb250YWlucyhDKXx8b28oZC5jdXJyZW50LHtzZWxlY3Q6ITB9KSl9LF89ZnVuY3Rpb24oJCl7aWYoZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PWRvY3VtZW50LmJvZHkpZm9yKGNvbnN0IFQgb2YgJClULnJlbW92ZWROb2Rlcy5sZW5ndGg+MCYmb28ocyl9O3ZhciBtPXksUz14LHY9Xztkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c2luIix5KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJmb2N1c291dCIseCk7Y29uc3QgRT1uZXcgTXV0YXRpb25PYnNlcnZlcihfKTtyZXR1cm4gcyYmRS5vYnNlcnZlKHMse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSksKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1c2luIix5KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJmb2N1c291dCIseCksRS5kaXNjb25uZWN0KCl9fX0sW3IscyxoLnBhdXNlZF0pLHAudXNlRWZmZWN0KCgpPT57aWYocyl7bzAuYWRkKGgpO2NvbnN0IG09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighcy5jb250YWlucyhtKSl7Y29uc3Qgdj1uZXcgQ3VzdG9tRXZlbnQoa2YsbjApO3MuYWRkRXZlbnRMaXN0ZW5lcihrZix1KSxzLmRpc3BhdGNoRXZlbnQodiksdi5kZWZhdWx0UHJldmVudGVkfHwodU8ocE8oR1MocykpLHtzZWxlY3Q6ITB9KSxkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09bSYmb28ocykpfXJldHVybigpPT57cy5yZW1vdmVFdmVudExpc3RlbmVyKGtmLHUpLHNldFRpbWVvdXQoKCk9Pntjb25zdCB2PW5ldyBDdXN0b21FdmVudChUZixuMCk7cy5hZGRFdmVudExpc3RlbmVyKFRmLGMpLHMuZGlzcGF0Y2hFdmVudCh2KSx2LmRlZmF1bHRQcmV2ZW50ZWR8fG9vKG0/P2RvY3VtZW50LmJvZHkse3NlbGVjdDohMH0pLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcihUZixjKSxvMC5yZW1vdmUoaCl9LDApfX19LFtzLHUsYyxoXSk7Y29uc3QgZz1wLnVzZUNhbGxiYWNrKG09PntpZighbiYmIXJ8fGgucGF1c2VkKXJldHVybjtjb25zdCBTPW0ua2V5PT09IlRhYiImJiFtLmFsdEtleSYmIW0uY3RybEtleSYmIW0ubWV0YUtleSx2PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoUyYmdil7Y29uc3QgeT1tLmN1cnJlbnRUYXJnZXQsW3gsX109Y08oeSk7eCYmXz8hbS5zaGlmdEtleSYmdj09PV8/KG0ucHJldmVudERlZmF1bHQoKSxuJiZvbyh4LHtzZWxlY3Q6ITB9KSk6bS5zaGlmdEtleSYmdj09PXgmJihtLnByZXZlbnREZWZhdWx0KCksbiYmb28oXyx7c2VsZWN0OiEwfSkpOnY9PT15JiZtLnByZXZlbnREZWZhdWx0KCl9fSxbbixyLGgucGF1c2VkXSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoe3RhYkluZGV4Oi0xfSxsLHtyZWY6ZixvbktleURvd246Z30pKX0pO2Z1bmN0aW9uIHVPKGUse3NlbGVjdDp0PSExfT17fSl7Y29uc3Qgbj1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2Zvcihjb25zdCByIG9mIGUpaWYob28ocix7c2VsZWN0OnR9KSxkb2N1bWVudC5hY3RpdmVFbGVtZW50IT09bilyZXR1cm59ZnVuY3Rpb24gY08oZSl7Y29uc3QgdD1HUyhlKSxuPXIwKHQsZSkscj1yMCh0LnJldmVyc2UoKSxlKTtyZXR1cm5bbixyXX1mdW5jdGlvbiBHUyhlKXtjb25zdCB0PVtdLG49ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlLE5vZGVGaWx0ZXIuU0hPV19FTEVNRU5ULHthY2NlcHROb2RlOnI9Pntjb25zdCBvPXIudGFnTmFtZT09PSJJTlBVVCImJnIudHlwZT09PSJoaWRkZW4iO3JldHVybiByLmRpc2FibGVkfHxyLmhpZGRlbnx8bz9Ob2RlRmlsdGVyLkZJTFRFUl9TS0lQOnIudGFiSW5kZXg+PTA/Tm9kZUZpbHRlci5GSUxURVJfQUNDRVBUOk5vZGVGaWx0ZXIuRklMVEVSX1NLSVB9fSk7Zm9yKDtuLm5leHROb2RlKCk7KXQucHVzaChuLmN1cnJlbnROb2RlKTtyZXR1cm4gdH1mdW5jdGlvbiByMChlLHQpe2Zvcihjb25zdCBuIG9mIGUpaWYoIWRPKG4se3VwVG86dH0pKXJldHVybiBufWZ1bmN0aW9uIGRPKGUse3VwVG86dH0pe2lmKGdldENvbXB1dGVkU3R5bGUoZSkudmlzaWJpbGl0eT09PSJoaWRkZW4iKXJldHVybiEwO2Zvcig7ZTspe2lmKHQhPT12b2lkIDAmJmU9PT10KXJldHVybiExO2lmKGdldENvbXB1dGVkU3R5bGUoZSkuZGlzcGxheT09PSJub25lIilyZXR1cm4hMDtlPWUucGFyZW50RWxlbWVudH1yZXR1cm4hMX1mdW5jdGlvbiBmTyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQmJiJzZWxlY3QiaW4gZX1mdW5jdGlvbiBvbyhlLHtzZWxlY3Q6dD0hMX09e30pe2lmKGUmJmUuZm9jdXMpe2NvbnN0IG49ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtlLmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSksZSE9PW4mJmZPKGUpJiZ0JiZlLnNlbGVjdCgpfX1jb25zdCBvMD1oTygpO2Z1bmN0aW9uIGhPKCl7bGV0IGU9W107cmV0dXJue2FkZCh0KXtjb25zdCBuPWVbMF07dCE9PW4mJihuPT1udWxsfHxuLnBhdXNlKCkpLGU9aTAoZSx0KSxlLnVuc2hpZnQodCl9LHJlbW92ZSh0KXt2YXIgbjtlPWkwKGUsdCksKG49ZVswXSk9PT1udWxsfHxuPT09dm9pZCAwfHxuLnJlc3VtZSgpfX19ZnVuY3Rpb24gaTAoZSx0KXtjb25zdCBuPVsuLi5lXSxyPW4uaW5kZXhPZih0KTtyZXR1cm4gciE9PS0xJiZuLnNwbGljZShyLDEpLG59ZnVuY3Rpb24gcE8oZSl7cmV0dXJuIGUuZmlsdGVyKHQ9PnQudGFnTmFtZSE9PSJBIil9Y29uc3QgZ089SjBbInVzZUlkIi50b1N0cmluZygpXXx8KCgpPT57fSk7bGV0IG1PPTA7ZnVuY3Rpb24geGQoZSl7Y29uc3RbdCxuXT1wLnVzZVN0YXRlKGdPKCkpO3JldHVybiAkbigoKT0+e2V8fG4ocj0+cj8/U3RyaW5nKG1PKyspKX0sW2VdKSxlfHwodD9gcmFkaXgtJHt0fWA6IiIpfWNvbnN0IHZPPVsidG9wIiwicmlnaHQiLCJib3R0b20iLCJsZWZ0Il0sTW89TWF0aC5taW4sdm49TWF0aC5tYXgsQWM9TWF0aC5yb3VuZCxtdT1NYXRoLmZsb29yLERvPWU9Pih7eDplLHk6ZX0pLHlPPXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLGJvdHRvbToidG9wIix0b3A6ImJvdHRvbSJ9LHhPPXtzdGFydDoiZW5kIixlbmQ6InN0YXJ0In07ZnVuY3Rpb24geXAoZSx0LG4pe3JldHVybiB2bihlLE1vKHQsbikpfWZ1bmN0aW9uIEJyKGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iP2UodCk6ZX1mdW5jdGlvbiBXcihlKXtyZXR1cm4gZS5zcGxpdCgiLSIpWzBdfWZ1bmN0aW9uIFlsKGUpe3JldHVybiBlLnNwbGl0KCItIilbMV19ZnVuY3Rpb24gcG0oZSl7cmV0dXJuIGU9PT0ieCI/InkiOiJ4In1mdW5jdGlvbiBnbShlKXtyZXR1cm4gZT09PSJ5Ij8iaGVpZ2h0Ijoid2lkdGgifWZ1bmN0aW9uIFhsKGUpe3JldHVyblsidG9wIiwiYm90dG9tIl0uaW5jbHVkZXMoV3IoZSkpPyJ5IjoieCJ9ZnVuY3Rpb24gbW0oZSl7cmV0dXJuIHBtKFhsKGUpKX1mdW5jdGlvbiBfTyhlLHQsbil7bj09PXZvaWQgMCYmKG49ITEpO2NvbnN0IHI9WWwoZSksbz1tbShlKSxpPWdtKG8pO2xldCBsPW89PT0ieCI/cj09PShuPyJlbmQiOiJzdGFydCIpPyJyaWdodCI6ImxlZnQiOnI9PT0ic3RhcnQiPyJib3R0b20iOiJ0b3AiO3JldHVybiB0LnJlZmVyZW5jZVtpXT50LmZsb2F0aW5nW2ldJiYobD1NYyhsKSksW2wsTWMobCldfWZ1bmN0aW9uIHdPKGUpe2NvbnN0IHQ9TWMoZSk7cmV0dXJuW3hwKGUpLHQseHAodCldfWZ1bmN0aW9uIHhwKGUpe3JldHVybiBlLnJlcGxhY2UoL3N0YXJ0fGVuZC9nLHQ9PnhPW3RdKX1mdW5jdGlvbiBTTyhlLHQsbil7Y29uc3Qgcj1bImxlZnQiLCJyaWdodCJdLG89WyJyaWdodCIsImxlZnQiXSxpPVsidG9wIiwiYm90dG9tIl0sbD1bImJvdHRvbSIsInRvcCJdO3N3aXRjaChlKXtjYXNlInRvcCI6Y2FzZSJib3R0b20iOnJldHVybiBuP3Q/bzpyOnQ/cjpvO2Nhc2UibGVmdCI6Y2FzZSJyaWdodCI6cmV0dXJuIHQ/aTpsO2RlZmF1bHQ6cmV0dXJuW119fWZ1bmN0aW9uIEVPKGUsdCxuLHIpe2NvbnN0IG89WWwoZSk7bGV0IGk9U08oV3IoZSksbj09PSJzdGFydCIscik7cmV0dXJuIG8mJihpPWkubWFwKGw9PmwrIi0iK28pLHQmJihpPWkuY29uY2F0KGkubWFwKHhwKSkpKSxpfWZ1bmN0aW9uIE1jKGUpe3JldHVybiBlLnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLHQ9PnlPW3RdKX1mdW5jdGlvbiBDTyhlKXtyZXR1cm57dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjAsLi4uZX19ZnVuY3Rpb24gWVMoZSl7cmV0dXJuIHR5cGVvZiBlIT0ibnVtYmVyIj9DTyhlKTp7dG9wOmUscmlnaHQ6ZSxib3R0b206ZSxsZWZ0OmV9fWZ1bmN0aW9uIERjKGUpe3JldHVybnsuLi5lLHRvcDplLnksbGVmdDplLngscmlnaHQ6ZS54K2Uud2lkdGgsYm90dG9tOmUueStlLmhlaWdodH19ZnVuY3Rpb24gbDAoZSx0LG4pe2xldHtyZWZlcmVuY2U6cixmbG9hdGluZzpvfT1lO2NvbnN0IGk9WGwodCksbD1tbSh0KSxzPWdtKGwpLGE9V3IodCksdT1pPT09InkiLGM9ci54K3Iud2lkdGgvMi1vLndpZHRoLzIsZD1yLnkrci5oZWlnaHQvMi1vLmhlaWdodC8yLGY9cltzXS8yLW9bc10vMjtsZXQgaDtzd2l0Y2goYSl7Y2FzZSJ0b3AiOmg9e3g6Yyx5OnIueS1vLmhlaWdodH07YnJlYWs7Y2FzZSJib3R0b20iOmg9e3g6Yyx5OnIueStyLmhlaWdodH07YnJlYWs7Y2FzZSJyaWdodCI6aD17eDpyLngrci53aWR0aCx5OmR9O2JyZWFrO2Nhc2UibGVmdCI6aD17eDpyLngtby53aWR0aCx5OmR9O2JyZWFrO2RlZmF1bHQ6aD17eDpyLngseTpyLnl9fXN3aXRjaChZbCh0KSl7Y2FzZSJzdGFydCI6aFtsXS09ZioobiYmdT8tMToxKTticmVhaztjYXNlImVuZCI6aFtsXSs9ZioobiYmdT8tMToxKTticmVha31yZXR1cm4gaH1jb25zdCAkTz1hc3luYyhlLHQsbik9Pntjb25zdHtwbGFjZW1lbnQ6cj0iYm90dG9tIixzdHJhdGVneTpvPSJhYnNvbHV0ZSIsbWlkZGxld2FyZTppPVtdLHBsYXRmb3JtOmx9PW4scz1pLmZpbHRlcihCb29sZWFuKSxhPWF3YWl0KGwuaXNSVEw9PW51bGw/dm9pZCAwOmwuaXNSVEwodCkpO2xldCB1PWF3YWl0IGwuZ2V0RWxlbWVudFJlY3RzKHtyZWZlcmVuY2U6ZSxmbG9hdGluZzp0LHN0cmF0ZWd5Om99KSx7eDpjLHk6ZH09bDAodSxyLGEpLGY9cixoPXt9LGc9MDtmb3IobGV0IG09MDttPHMubGVuZ3RoO20rKyl7Y29uc3R7bmFtZTpTLGZuOnZ9PXNbbV0se3g6eSx5OngsZGF0YTpfLHJlc2V0OkV9PWF3YWl0IHYoe3g6Yyx5OmQsaW5pdGlhbFBsYWNlbWVudDpyLHBsYWNlbWVudDpmLHN0cmF0ZWd5Om8sbWlkZGxld2FyZURhdGE6aCxyZWN0czp1LHBsYXRmb3JtOmwsZWxlbWVudHM6e3JlZmVyZW5jZTplLGZsb2F0aW5nOnR9fSk7aWYoYz15Pz9jLGQ9eD8/ZCxoPXsuLi5oLFtTXTp7Li4uaFtTXSwuLi5ffX0sRSYmZzw9NTApe2crKyx0eXBlb2YgRT09Im9iamVjdCImJihFLnBsYWNlbWVudCYmKGY9RS5wbGFjZW1lbnQpLEUucmVjdHMmJih1PUUucmVjdHM9PT0hMD9hd2FpdCBsLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTpvfSk6RS5yZWN0cykse3g6Yyx5OmR9PWwwKHUsZixhKSksbT0tMTtjb250aW51ZX19cmV0dXJue3g6Yyx5OmQscGxhY2VtZW50OmYsc3RyYXRlZ3k6byxtaWRkbGV3YXJlRGF0YTpofX07YXN5bmMgZnVuY3Rpb24gX2EoZSx0KXt2YXIgbjt0PT09dm9pZCAwJiYodD17fSk7Y29uc3R7eDpyLHk6byxwbGF0Zm9ybTppLHJlY3RzOmwsZWxlbWVudHM6cyxzdHJhdGVneTphfT1lLHtib3VuZGFyeTp1PSJjbGlwcGluZ0FuY2VzdG9ycyIscm9vdEJvdW5kYXJ5OmM9InZpZXdwb3J0IixlbGVtZW50Q29udGV4dDpkPSJmbG9hdGluZyIsYWx0Qm91bmRhcnk6Zj0hMSxwYWRkaW5nOmg9MH09QnIodCxlKSxnPVlTKGgpLFM9c1tmP2Q9PT0iZmxvYXRpbmciPyJyZWZlcmVuY2UiOiJmbG9hdGluZyI6ZF0sdj1EYyhhd2FpdCBpLmdldENsaXBwaW5nUmVjdCh7ZWxlbWVudDoobj1hd2FpdChpLmlzRWxlbWVudD09bnVsbD92b2lkIDA6aS5pc0VsZW1lbnQoUykpKT09bnVsbHx8bj9TOlMuY29udGV4dEVsZW1lbnR8fGF3YWl0KGkuZ2V0RG9jdW1lbnRFbGVtZW50PT1udWxsP3ZvaWQgMDppLmdldERvY3VtZW50RWxlbWVudChzLmZsb2F0aW5nKSksYm91bmRhcnk6dSxyb290Qm91bmRhcnk6YyxzdHJhdGVneTphfSkpLHk9ZD09PSJmbG9hdGluZyI/ey4uLmwuZmxvYXRpbmcseDpyLHk6b306bC5yZWZlcmVuY2UseD1hd2FpdChpLmdldE9mZnNldFBhcmVudD09bnVsbD92b2lkIDA6aS5nZXRPZmZzZXRQYXJlbnQocy5mbG9hdGluZykpLF89YXdhaXQoaS5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOmkuaXNFbGVtZW50KHgpKT9hd2FpdChpLmdldFNjYWxlPT1udWxsP3ZvaWQgMDppLmdldFNjYWxlKHgpKXx8e3g6MSx5OjF9Ont4OjEseToxfSxFPURjKGkuY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Q/YXdhaXQgaS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdCh7cmVjdDp5LG9mZnNldFBhcmVudDp4LHN0cmF0ZWd5OmF9KTp5KTtyZXR1cm57dG9wOih2LnRvcC1FLnRvcCtnLnRvcCkvXy55LGJvdHRvbTooRS5ib3R0b20tdi5ib3R0b20rZy5ib3R0b20pL18ueSxsZWZ0Oih2LmxlZnQtRS5sZWZ0K2cubGVmdCkvXy54LHJpZ2h0OihFLnJpZ2h0LXYucmlnaHQrZy5yaWdodCkvXy54fX1jb25zdCBzMD1lPT4oe25hbWU6ImFycm93IixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7eDpuLHk6cixwbGFjZW1lbnQ6byxyZWN0czppLHBsYXRmb3JtOmwsZWxlbWVudHM6cyxtaWRkbGV3YXJlRGF0YTphfT10LHtlbGVtZW50OnUscGFkZGluZzpjPTB9PUJyKGUsdCl8fHt9O2lmKHU9PW51bGwpcmV0dXJue307Y29uc3QgZD1ZUyhjKSxmPXt4Om4seTpyfSxoPW1tKG8pLGc9Z20oaCksbT1hd2FpdCBsLmdldERpbWVuc2lvbnModSksUz1oPT09InkiLHY9Uz8idG9wIjoibGVmdCIseT1TPyJib3R0b20iOiJyaWdodCIseD1TPyJjbGllbnRIZWlnaHQiOiJjbGllbnRXaWR0aCIsXz1pLnJlZmVyZW5jZVtnXStpLnJlZmVyZW5jZVtoXS1mW2hdLWkuZmxvYXRpbmdbZ10sRT1mW2hdLWkucmVmZXJlbmNlW2hdLCQ9YXdhaXQobC5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOmwuZ2V0T2Zmc2V0UGFyZW50KHUpKTtsZXQgQz0kPyRbeF06MDsoIUN8fCFhd2FpdChsLmlzRWxlbWVudD09bnVsbD92b2lkIDA6bC5pc0VsZW1lbnQoJCkpKSYmKEM9cy5mbG9hdGluZ1t4XXx8aS5mbG9hdGluZ1tnXSk7Y29uc3QgVD1fLzItRS8yLE09Qy8yLW1bZ10vMi0xLFI9TW8oZFt2XSxNKSxqPU1vKGRbeV0sTSksRj1SLGFlPUMtbVtnXS1qLEg9Qy8yLW1bZ10vMitULFg9eXAoRixILGFlKSxQPSFhLmFycm93JiZZbChvKSE9bnVsbCYmSCE9WCYmaS5yZWZlcmVuY2VbZ10vMi0oSDxGP1I6aiktbVtnXS8yPDAsTz1QP0g8Rj9ILUY6SC1hZTowO3JldHVybntbaF06ZltoXStPLGRhdGE6e1toXTpYLGNlbnRlck9mZnNldDpILVgtTywuLi5QJiZ7YWxpZ25tZW50T2Zmc2V0Ok99fSxyZXNldDpQfX19KSxrTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJmbGlwIixvcHRpb25zOmUsYXN5bmMgZm4odCl7dmFyIG4scjtjb25zdHtwbGFjZW1lbnQ6byxtaWRkbGV3YXJlRGF0YTppLHJlY3RzOmwsaW5pdGlhbFBsYWNlbWVudDpzLHBsYXRmb3JtOmEsZWxlbWVudHM6dX09dCx7bWFpbkF4aXM6Yz0hMCxjcm9zc0F4aXM6ZD0hMCxmYWxsYmFja1BsYWNlbWVudHM6ZixmYWxsYmFja1N0cmF0ZWd5Omg9ImJlc3RGaXQiLGZhbGxiYWNrQXhpc1NpZGVEaXJlY3Rpb246Zz0ibm9uZSIsZmxpcEFsaWdubWVudDptPSEwLC4uLlN9PUJyKGUsdCk7aWYoKG49aS5hcnJvdykhPW51bGwmJm4uYWxpZ25tZW50T2Zmc2V0KXJldHVybnt9O2NvbnN0IHY9V3IobykseT1XcihzKT09PXMseD1hd2FpdChhLmlzUlRMPT1udWxsP3ZvaWQgMDphLmlzUlRMKHUuZmxvYXRpbmcpKSxfPWZ8fCh5fHwhbT9bTWMocyldOndPKHMpKTshZiYmZyE9PSJub25lIiYmXy5wdXNoKC4uLkVPKHMsbSxnLHgpKTtjb25zdCBFPVtzLC4uLl9dLCQ9YXdhaXQgX2EodCxTKSxDPVtdO2xldCBUPSgocj1pLmZsaXApPT1udWxsP3ZvaWQgMDpyLm92ZXJmbG93cyl8fFtdO2lmKGMmJkMucHVzaCgkW3ZdKSxkKXtjb25zdCBGPV9PKG8sbCx4KTtDLnB1c2goJFtGWzBdXSwkW0ZbMV1dKX1pZihUPVsuLi5ULHtwbGFjZW1lbnQ6byxvdmVyZmxvd3M6Q31dLCFDLmV2ZXJ5KEY9PkY8PTApKXt2YXIgTSxSO2NvbnN0IEY9KCgoTT1pLmZsaXApPT1udWxsP3ZvaWQgMDpNLmluZGV4KXx8MCkrMSxhZT1FW0ZdO2lmKGFlKXJldHVybntkYXRhOntpbmRleDpGLG92ZXJmbG93czpUfSxyZXNldDp7cGxhY2VtZW50OmFlfX07bGV0IEg9KFI9VC5maWx0ZXIoWD0+WC5vdmVyZmxvd3NbMF08PTApLnNvcnQoKFgsUCk9Plgub3ZlcmZsb3dzWzFdLVAub3ZlcmZsb3dzWzFdKVswXSk9PW51bGw/dm9pZCAwOlIucGxhY2VtZW50O2lmKCFIKXN3aXRjaChoKXtjYXNlImJlc3RGaXQiOnt2YXIgajtjb25zdCBYPShqPVQubWFwKFA9PltQLnBsYWNlbWVudCxQLm92ZXJmbG93cy5maWx0ZXIoTz0+Tz4wKS5yZWR1Y2UoKE8sayk9Pk8raywwKV0pLnNvcnQoKFAsTyk9PlBbMV0tT1sxXSlbMF0pPT1udWxsP3ZvaWQgMDpqWzBdO1gmJihIPVgpO2JyZWFrfWNhc2UiaW5pdGlhbFBsYWNlbWVudCI6SD1zO2JyZWFrfWlmKG8hPT1IKXJldHVybntyZXNldDp7cGxhY2VtZW50Okh9fX1yZXR1cm57fX19fTtmdW5jdGlvbiBhMChlLHQpe3JldHVybnt0b3A6ZS50b3AtdC5oZWlnaHQscmlnaHQ6ZS5yaWdodC10LndpZHRoLGJvdHRvbTplLmJvdHRvbS10LmhlaWdodCxsZWZ0OmUubGVmdC10LndpZHRofX1mdW5jdGlvbiB1MChlKXtyZXR1cm4gdk8uc29tZSh0PT5lW3RdPj0wKX1jb25zdCBUTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJoaWRlIixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7cmVjdHM6bn09dCx7c3RyYXRlZ3k6cj0icmVmZXJlbmNlSGlkZGVuIiwuLi5vfT1CcihlLHQpO3N3aXRjaChyKXtjYXNlInJlZmVyZW5jZUhpZGRlbiI6e2NvbnN0IGk9YXdhaXQgX2EodCx7Li4ubyxlbGVtZW50Q29udGV4dDoicmVmZXJlbmNlIn0pLGw9YTAoaSxuLnJlZmVyZW5jZSk7cmV0dXJue2RhdGE6e3JlZmVyZW5jZUhpZGRlbk9mZnNldHM6bCxyZWZlcmVuY2VIaWRkZW46dTAobCl9fX1jYXNlImVzY2FwZWQiOntjb25zdCBpPWF3YWl0IF9hKHQsey4uLm8sYWx0Qm91bmRhcnk6ITB9KSxsPWEwKGksbi5mbG9hdGluZyk7cmV0dXJue2RhdGE6e2VzY2FwZWRPZmZzZXRzOmwsZXNjYXBlZDp1MChsKX19fWRlZmF1bHQ6cmV0dXJue319fX19O2FzeW5jIGZ1bmN0aW9uIE5PKGUsdCl7Y29uc3R7cGxhY2VtZW50Om4scGxhdGZvcm06cixlbGVtZW50czpvfT1lLGk9YXdhaXQoci5pc1JUTD09bnVsbD92b2lkIDA6ci5pc1JUTChvLmZsb2F0aW5nKSksbD1XcihuKSxzPVlsKG4pLGE9WGwobik9PT0ieSIsdT1bImxlZnQiLCJ0b3AiXS5pbmNsdWRlcyhsKT8tMToxLGM9aSYmYT8tMToxLGQ9QnIodCxlKTtsZXR7bWFpbkF4aXM6Zixjcm9zc0F4aXM6aCxhbGlnbm1lbnRBeGlzOmd9PXR5cGVvZiBkPT0ibnVtYmVyIj97bWFpbkF4aXM6ZCxjcm9zc0F4aXM6MCxhbGlnbm1lbnRBeGlzOm51bGx9OnttYWluQXhpczowLGNyb3NzQXhpczowLGFsaWdubWVudEF4aXM6bnVsbCwuLi5kfTtyZXR1cm4gcyYmdHlwZW9mIGc9PSJudW1iZXIiJiYoaD1zPT09ImVuZCI/ZyotMTpnKSxhP3t4OmgqYyx5OmYqdX06e3g6Zip1LHk6aCpjfX1jb25zdCBiTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9MCkse25hbWU6Im9mZnNldCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3g6bix5OnJ9PXQsbz1hd2FpdCBOTyh0LGUpO3JldHVybnt4Om4rby54LHk6citvLnksZGF0YTpvfX19fSxSTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJzaGlmdCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3g6bix5OnIscGxhY2VtZW50Om99PXQse21haW5BeGlzOmk9ITAsY3Jvc3NBeGlzOmw9ITEsbGltaXRlcjpzPXtmbjpTPT57bGV0e3g6dix5fT1TO3JldHVybnt4OnYseX19fSwuLi5hfT1CcihlLHQpLHU9e3g6bix5OnJ9LGM9YXdhaXQgX2EodCxhKSxkPVhsKFdyKG8pKSxmPXBtKGQpO2xldCBoPXVbZl0sZz11W2RdO2lmKGkpe2NvbnN0IFM9Zj09PSJ5Ij8idG9wIjoibGVmdCIsdj1mPT09InkiPyJib3R0b20iOiJyaWdodCIseT1oK2NbU10seD1oLWNbdl07aD15cCh5LGgseCl9aWYobCl7Y29uc3QgUz1kPT09InkiPyJ0b3AiOiJsZWZ0Iix2PWQ9PT0ieSI/ImJvdHRvbSI6InJpZ2h0Iix5PWcrY1tTXSx4PWctY1t2XTtnPXlwKHksZyx4KX1jb25zdCBtPXMuZm4oey4uLnQsW2ZdOmgsW2RdOmd9KTtyZXR1cm57Li4ubSxkYXRhOnt4Om0ueC1uLHk6bS55LXJ9fX19fSxQTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtvcHRpb25zOmUsZm4odCl7Y29uc3R7eDpuLHk6cixwbGFjZW1lbnQ6byxyZWN0czppLG1pZGRsZXdhcmVEYXRhOmx9PXQse29mZnNldDpzPTAsbWFpbkF4aXM6YT0hMCxjcm9zc0F4aXM6dT0hMH09QnIoZSx0KSxjPXt4Om4seTpyfSxkPVhsKG8pLGY9cG0oZCk7bGV0IGg9Y1tmXSxnPWNbZF07Y29uc3QgbT1CcihzLHQpLFM9dHlwZW9mIG09PSJudW1iZXIiP3ttYWluQXhpczptLGNyb3NzQXhpczowfTp7bWFpbkF4aXM6MCxjcm9zc0F4aXM6MCwuLi5tfTtpZihhKXtjb25zdCB4PWY9PT0ieSI/ImhlaWdodCI6IndpZHRoIixfPWkucmVmZXJlbmNlW2ZdLWkuZmxvYXRpbmdbeF0rUy5tYWluQXhpcyxFPWkucmVmZXJlbmNlW2ZdK2kucmVmZXJlbmNlW3hdLVMubWFpbkF4aXM7aDxfP2g9XzpoPkUmJihoPUUpfWlmKHUpe3ZhciB2LHk7Y29uc3QgeD1mPT09InkiPyJ3aWR0aCI6ImhlaWdodCIsXz1bInRvcCIsImxlZnQiXS5pbmNsdWRlcyhXcihvKSksRT1pLnJlZmVyZW5jZVtkXS1pLmZsb2F0aW5nW3hdKyhfJiYoKHY9bC5vZmZzZXQpPT1udWxsP3ZvaWQgMDp2W2RdKXx8MCkrKF8/MDpTLmNyb3NzQXhpcyksJD1pLnJlZmVyZW5jZVtkXStpLnJlZmVyZW5jZVt4XSsoXz8wOigoeT1sLm9mZnNldCk9PW51bGw/dm9pZCAwOnlbZF0pfHwwKS0oXz9TLmNyb3NzQXhpczowKTtnPEU/Zz1FOmc+JCYmKGc9JCl9cmV0dXJue1tmXTpoLFtkXTpnfX19fSxPTz1mdW5jdGlvbihlKXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9e30pLHtuYW1lOiJzaXplIixvcHRpb25zOmUsYXN5bmMgZm4odCl7Y29uc3R7cGxhY2VtZW50Om4scmVjdHM6cixwbGF0Zm9ybTpvLGVsZW1lbnRzOml9PXQse2FwcGx5Omw9KCk9Pnt9LC4uLnN9PUJyKGUsdCksYT1hd2FpdCBfYSh0LHMpLHU9V3IobiksYz1ZbChuKSxkPVhsKG4pPT09InkiLHt3aWR0aDpmLGhlaWdodDpofT1yLmZsb2F0aW5nO2xldCBnLG07dT09PSJ0b3AifHx1PT09ImJvdHRvbSI/KGc9dSxtPWM9PT0oYXdhaXQoby5pc1JUTD09bnVsbD92b2lkIDA6by5pc1JUTChpLmZsb2F0aW5nKSk/InN0YXJ0IjoiZW5kIik/ImxlZnQiOiJyaWdodCIpOihtPXUsZz1jPT09ImVuZCI/InRvcCI6ImJvdHRvbSIpO2NvbnN0IFM9aC1hW2ddLHY9Zi1hW21dLHk9IXQubWlkZGxld2FyZURhdGEuc2hpZnQ7bGV0IHg9UyxfPXY7aWYoZCl7Y29uc3QgJD1mLWEubGVmdC1hLnJpZ2h0O189Y3x8eT9Nbyh2LCQpOiR9ZWxzZXtjb25zdCAkPWgtYS50b3AtYS5ib3R0b207eD1jfHx5P01vKFMsJCk6JH1pZih5JiYhYyl7Y29uc3QgJD12bihhLmxlZnQsMCksQz12bihhLnJpZ2h0LDApLFQ9dm4oYS50b3AsMCksTT12bihhLmJvdHRvbSwwKTtkP189Zi0yKigkIT09MHx8QyE9PTA/JCtDOnZuKGEubGVmdCxhLnJpZ2h0KSk6eD1oLTIqKFQhPT0wfHxNIT09MD9UK006dm4oYS50b3AsYS5ib3R0b20pKX1hd2FpdCBsKHsuLi50LGF2YWlsYWJsZVdpZHRoOl8sYXZhaWxhYmxlSGVpZ2h0Onh9KTtjb25zdCBFPWF3YWl0IG8uZ2V0RGltZW5zaW9ucyhpLmZsb2F0aW5nKTtyZXR1cm4gZiE9PUUud2lkdGh8fGghPT1FLmhlaWdodD97cmVzZXQ6e3JlY3RzOiEwfX06e319fX07ZnVuY3Rpb24gTG8oZSl7cmV0dXJuIFhTKGUpPyhlLm5vZGVOYW1lfHwiIikudG9Mb3dlckNhc2UoKToiI2RvY3VtZW50In1mdW5jdGlvbiBFbihlKXt2YXIgdDtyZXR1cm4oZT09bnVsbHx8KHQ9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6dC5kZWZhdWx0Vmlldyl8fHdpbmRvd31mdW5jdGlvbiBRcihlKXt2YXIgdDtyZXR1cm4odD0oWFMoZSk/ZS5vd25lckRvY3VtZW50OmUuZG9jdW1lbnQpfHx3aW5kb3cuZG9jdW1lbnQpPT1udWxsP3ZvaWQgMDp0LmRvY3VtZW50RWxlbWVudH1mdW5jdGlvbiBYUyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIE5vZGV8fGUgaW5zdGFuY2VvZiBFbihlKS5Ob2RlfWZ1bmN0aW9uIFVyKGUpe3JldHVybiBlIGluc3RhbmNlb2YgRWxlbWVudHx8ZSBpbnN0YW5jZW9mIEVuKGUpLkVsZW1lbnR9ZnVuY3Rpb24geHIoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudHx8ZSBpbnN0YW5jZW9mIEVuKGUpLkhUTUxFbGVtZW50fWZ1bmN0aW9uIGMwKGUpe3JldHVybiB0eXBlb2YgU2hhZG93Um9vdD4idSI/ITE6ZSBpbnN0YW5jZW9mIFNoYWRvd1Jvb3R8fGUgaW5zdGFuY2VvZiBFbihlKS5TaGFkb3dSb290fWZ1bmN0aW9uIHphKGUpe2NvbnN0e292ZXJmbG93OnQsb3ZlcmZsb3dYOm4sb3ZlcmZsb3dZOnIsZGlzcGxheTpvfT1GbihlKTtyZXR1cm4vYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW58Y2xpcC8udGVzdCh0K3IrbikmJiFbImlubGluZSIsImNvbnRlbnRzIl0uaW5jbHVkZXMobyl9ZnVuY3Rpb24gQU8oZSl7cmV0dXJuWyJ0YWJsZSIsInRkIiwidGgiXS5pbmNsdWRlcyhMbyhlKSl9ZnVuY3Rpb24gdm0oZSl7Y29uc3QgdD15bSgpLG49Rm4oZSk7cmV0dXJuIG4udHJhbnNmb3JtIT09Im5vbmUifHxuLnBlcnNwZWN0aXZlIT09Im5vbmUifHwobi5jb250YWluZXJUeXBlP24uY29udGFpbmVyVHlwZSE9PSJub3JtYWwiOiExKXx8IXQmJihuLmJhY2tkcm9wRmlsdGVyP24uYmFja2Ryb3BGaWx0ZXIhPT0ibm9uZSI6ITEpfHwhdCYmKG4uZmlsdGVyP24uZmlsdGVyIT09Im5vbmUiOiExKXx8WyJ0cmFuc2Zvcm0iLCJwZXJzcGVjdGl2ZSIsImZpbHRlciJdLnNvbWUocj0+KG4ud2lsbENoYW5nZXx8IiIpLmluY2x1ZGVzKHIpKXx8WyJwYWludCIsImxheW91dCIsInN0cmljdCIsImNvbnRlbnQiXS5zb21lKHI9PihuLmNvbnRhaW58fCIiKS5pbmNsdWRlcyhyKSl9ZnVuY3Rpb24gTU8oZSl7bGV0IHQ9TmwoZSk7Zm9yKDt4cih0KSYmIV9kKHQpOyl7aWYodm0odCkpcmV0dXJuIHQ7dD1ObCh0KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB5bSgpe3JldHVybiB0eXBlb2YgQ1NTPiJ1Inx8IUNTUy5zdXBwb3J0cz8hMTpDU1Muc3VwcG9ydHMoIi13ZWJraXQtYmFja2Ryb3AtZmlsdGVyIiwibm9uZSIpfWZ1bmN0aW9uIF9kKGUpe3JldHVyblsiaHRtbCIsImJvZHkiLCIjZG9jdW1lbnQiXS5pbmNsdWRlcyhMbyhlKSl9ZnVuY3Rpb24gRm4oZSl7cmV0dXJuIEVuKGUpLmdldENvbXB1dGVkU3R5bGUoZSl9ZnVuY3Rpb24gd2QoZSl7cmV0dXJuIFVyKGUpP3tzY3JvbGxMZWZ0OmUuc2Nyb2xsTGVmdCxzY3JvbGxUb3A6ZS5zY3JvbGxUb3B9OntzY3JvbGxMZWZ0OmUucGFnZVhPZmZzZXQsc2Nyb2xsVG9wOmUucGFnZVlPZmZzZXR9fWZ1bmN0aW9uIE5sKGUpe2lmKExvKGUpPT09Imh0bWwiKXJldHVybiBlO2NvbnN0IHQ9ZS5hc3NpZ25lZFNsb3R8fGUucGFyZW50Tm9kZXx8YzAoZSkmJmUuaG9zdHx8UXIoZSk7cmV0dXJuIGMwKHQpP3QuaG9zdDp0fWZ1bmN0aW9uIFFTKGUpe2NvbnN0IHQ9TmwoZSk7cmV0dXJuIF9kKHQpP2Uub3duZXJEb2N1bWVudD9lLm93bmVyRG9jdW1lbnQuYm9keTplLmJvZHk6eHIodCkmJnphKHQpP3Q6UVModCl9ZnVuY3Rpb24gd2EoZSx0LG4pe3ZhciByO3Q9PT12b2lkIDAmJih0PVtdKSxuPT09dm9pZCAwJiYobj0hMCk7Y29uc3Qgbz1RUyhlKSxpPW89PT0oKHI9ZS5vd25lckRvY3VtZW50KT09bnVsbD92b2lkIDA6ci5ib2R5KSxsPUVuKG8pO3JldHVybiBpP3QuY29uY2F0KGwsbC52aXN1YWxWaWV3cG9ydHx8W10semEobyk/bzpbXSxsLmZyYW1lRWxlbWVudCYmbj93YShsLmZyYW1lRWxlbWVudCk6W10pOnQuY29uY2F0KG8sd2EobyxbXSxuKSl9ZnVuY3Rpb24gSlMoZSl7Y29uc3QgdD1GbihlKTtsZXQgbj1wYXJzZUZsb2F0KHQud2lkdGgpfHwwLHI9cGFyc2VGbG9hdCh0LmhlaWdodCl8fDA7Y29uc3Qgbz14cihlKSxpPW8/ZS5vZmZzZXRXaWR0aDpuLGw9bz9lLm9mZnNldEhlaWdodDpyLHM9QWMobikhPT1pfHxBYyhyKSE9PWw7cmV0dXJuIHMmJihuPWkscj1sKSx7d2lkdGg6bixoZWlnaHQ6ciwkOnN9fWZ1bmN0aW9uIHhtKGUpe3JldHVybiBVcihlKT9lOmUuY29udGV4dEVsZW1lbnR9ZnVuY3Rpb24gaGwoZSl7Y29uc3QgdD14bShlKTtpZigheHIodCkpcmV0dXJuIERvKDEpO2NvbnN0IG49dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx7d2lkdGg6cixoZWlnaHQ6bywkOml9PUpTKHQpO2xldCBsPShpP0FjKG4ud2lkdGgpOm4ud2lkdGgpL3Iscz0oaT9BYyhuLmhlaWdodCk6bi5oZWlnaHQpL287cmV0dXJuKCFsfHwhTnVtYmVyLmlzRmluaXRlKGwpKSYmKGw9MSksKCFzfHwhTnVtYmVyLmlzRmluaXRlKHMpKSYmKHM9MSkse3g6bCx5OnN9fWNvbnN0IERPPURvKDApO2Z1bmN0aW9uIFpTKGUpe2NvbnN0IHQ9RW4oZSk7cmV0dXJuIXltKCl8fCF0LnZpc3VhbFZpZXdwb3J0P0RPOnt4OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdCx5OnQudmlzdWFsVmlld3BvcnQub2Zmc2V0VG9wfX1mdW5jdGlvbiBMTyhlLHQsbil7cmV0dXJuIHQ9PT12b2lkIDAmJih0PSExKSwhbnx8dCYmbiE9PUVuKGUpPyExOnR9ZnVuY3Rpb24gbWkoZSx0LG4scil7dD09PXZvaWQgMCYmKHQ9ITEpLG49PT12b2lkIDAmJihuPSExKTtjb25zdCBvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaT14bShlKTtsZXQgbD1EbygxKTt0JiYocj9VcihyKSYmKGw9aGwocikpOmw9aGwoZSkpO2NvbnN0IHM9TE8oaSxuLHIpP1pTKGkpOkRvKDApO2xldCBhPShvLmxlZnQrcy54KS9sLngsdT0oby50b3Arcy55KS9sLnksYz1vLndpZHRoL2wueCxkPW8uaGVpZ2h0L2wueTtpZihpKXtjb25zdCBmPUVuKGkpLGg9ciYmVXIocik/RW4ocik6cjtsZXQgZz1mLmZyYW1lRWxlbWVudDtmb3IoO2cmJnImJmghPT1mOyl7Y29uc3QgbT1obChnKSxTPWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdj1GbihnKSx5PVMubGVmdCsoZy5jbGllbnRMZWZ0K3BhcnNlRmxvYXQodi5wYWRkaW5nTGVmdCkpKm0ueCx4PVMudG9wKyhnLmNsaWVudFRvcCtwYXJzZUZsb2F0KHYucGFkZGluZ1RvcCkpKm0ueTthKj1tLngsdSo9bS55LGMqPW0ueCxkKj1tLnksYSs9eSx1Kz14LGc9RW4oZykuZnJhbWVFbGVtZW50fX1yZXR1cm4gRGMoe3dpZHRoOmMsaGVpZ2h0OmQseDphLHk6dX0pfWZ1bmN0aW9uIElPKGUpe2xldHtyZWN0OnQsb2Zmc2V0UGFyZW50Om4sc3RyYXRlZ3k6cn09ZTtjb25zdCBvPXhyKG4pLGk9UXIobik7aWYobj09PWkpcmV0dXJuIHQ7bGV0IGw9e3Njcm9sbExlZnQ6MCxzY3JvbGxUb3A6MH0scz1EbygxKTtjb25zdCBhPURvKDApO2lmKChvfHwhbyYmciE9PSJmaXhlZCIpJiYoKExvKG4pIT09ImJvZHkifHx6YShpKSkmJihsPXdkKG4pKSx4cihuKSkpe2NvbnN0IHU9bWkobik7cz1obChuKSxhLng9dS54K24uY2xpZW50TGVmdCxhLnk9dS55K24uY2xpZW50VG9wfXJldHVybnt3aWR0aDp0LndpZHRoKnMueCxoZWlnaHQ6dC5oZWlnaHQqcy55LHg6dC54KnMueC1sLnNjcm9sbExlZnQqcy54K2EueCx5OnQueSpzLnktbC5zY3JvbGxUb3Aqcy55K2EueX19ZnVuY3Rpb24gak8oZSl7cmV0dXJuIEFycmF5LmZyb20oZS5nZXRDbGllbnRSZWN0cygpKX1mdW5jdGlvbiBxUyhlKXtyZXR1cm4gbWkoUXIoZSkpLmxlZnQrd2QoZSkuc2Nyb2xsTGVmdH1mdW5jdGlvbiB6TyhlKXtjb25zdCB0PVFyKGUpLG49d2QoZSkscj1lLm93bmVyRG9jdW1lbnQuYm9keSxvPXZuKHQuc2Nyb2xsV2lkdGgsdC5jbGllbnRXaWR0aCxyLnNjcm9sbFdpZHRoLHIuY2xpZW50V2lkdGgpLGk9dm4odC5zY3JvbGxIZWlnaHQsdC5jbGllbnRIZWlnaHQsci5zY3JvbGxIZWlnaHQsci5jbGllbnRIZWlnaHQpO2xldCBsPS1uLnNjcm9sbExlZnQrcVMoZSk7Y29uc3Qgcz0tbi5zY3JvbGxUb3A7cmV0dXJuIEZuKHIpLmRpcmVjdGlvbj09PSJydGwiJiYobCs9dm4odC5jbGllbnRXaWR0aCxyLmNsaWVudFdpZHRoKS1vKSx7d2lkdGg6byxoZWlnaHQ6aSx4OmwseTpzfX1mdW5jdGlvbiBGTyhlLHQpe2NvbnN0IG49RW4oZSkscj1RcihlKSxvPW4udmlzdWFsVmlld3BvcnQ7bGV0IGk9ci5jbGllbnRXaWR0aCxsPXIuY2xpZW50SGVpZ2h0LHM9MCxhPTA7aWYobyl7aT1vLndpZHRoLGw9by5oZWlnaHQ7Y29uc3QgdT15bSgpOyghdXx8dSYmdD09PSJmaXhlZCIpJiYocz1vLm9mZnNldExlZnQsYT1vLm9mZnNldFRvcCl9cmV0dXJue3dpZHRoOmksaGVpZ2h0OmwseDpzLHk6YX19ZnVuY3Rpb24gQk8oZSx0KXtjb25zdCBuPW1pKGUsITAsdD09PSJmaXhlZCIpLHI9bi50b3ArZS5jbGllbnRUb3Asbz1uLmxlZnQrZS5jbGllbnRMZWZ0LGk9eHIoZSk/aGwoZSk6RG8oMSksbD1lLmNsaWVudFdpZHRoKmkueCxzPWUuY2xpZW50SGVpZ2h0KmkueSxhPW8qaS54LHU9cippLnk7cmV0dXJue3dpZHRoOmwsaGVpZ2h0OnMseDphLHk6dX19ZnVuY3Rpb24gZDAoZSx0LG4pe2xldCByO2lmKHQ9PT0idmlld3BvcnQiKXI9Rk8oZSxuKTtlbHNlIGlmKHQ9PT0iZG9jdW1lbnQiKXI9ek8oUXIoZSkpO2Vsc2UgaWYoVXIodCkpcj1CTyh0LG4pO2Vsc2V7Y29uc3Qgbz1aUyhlKTtyPXsuLi50LHg6dC54LW8ueCx5OnQueS1vLnl9fXJldHVybiBEYyhyKX1mdW5jdGlvbiBlRShlLHQpe2NvbnN0IG49TmwoZSk7cmV0dXJuIG49PT10fHwhVXIobil8fF9kKG4pPyExOkZuKG4pLnBvc2l0aW9uPT09ImZpeGVkInx8ZUUobix0KX1mdW5jdGlvbiBXTyhlLHQpe2NvbnN0IG49dC5nZXQoZSk7aWYobilyZXR1cm4gbjtsZXQgcj13YShlLFtdLCExKS5maWx0ZXIocz0+VXIocykmJkxvKHMpIT09ImJvZHkiKSxvPW51bGw7Y29uc3QgaT1GbihlKS5wb3NpdGlvbj09PSJmaXhlZCI7bGV0IGw9aT9ObChlKTplO2Zvcig7VXIobCkmJiFfZChsKTspe2NvbnN0IHM9Rm4obCksYT12bShsKTshYSYmcy5wb3NpdGlvbj09PSJmaXhlZCImJihvPW51bGwpLChpPyFhJiYhbzohYSYmcy5wb3NpdGlvbj09PSJzdGF0aWMiJiYhIW8mJlsiYWJzb2x1dGUiLCJmaXhlZCJdLmluY2x1ZGVzKG8ucG9zaXRpb24pfHx6YShsKSYmIWEmJmVFKGUsbCkpP3I9ci5maWx0ZXIoYz0+YyE9PWwpOm89cyxsPU5sKGwpfXJldHVybiB0LnNldChlLHIpLHJ9ZnVuY3Rpb24gVU8oZSl7bGV0e2VsZW1lbnQ6dCxib3VuZGFyeTpuLHJvb3RCb3VuZGFyeTpyLHN0cmF0ZWd5Om99PWU7Y29uc3QgbD1bLi4ubj09PSJjbGlwcGluZ0FuY2VzdG9ycyI/V08odCx0aGlzLl9jKTpbXS5jb25jYXQobikscl0scz1sWzBdLGE9bC5yZWR1Y2UoKHUsYyk9Pntjb25zdCBkPWQwKHQsYyxvKTtyZXR1cm4gdS50b3A9dm4oZC50b3AsdS50b3ApLHUucmlnaHQ9TW8oZC5yaWdodCx1LnJpZ2h0KSx1LmJvdHRvbT1NbyhkLmJvdHRvbSx1LmJvdHRvbSksdS5sZWZ0PXZuKGQubGVmdCx1LmxlZnQpLHV9LGQwKHQscyxvKSk7cmV0dXJue3dpZHRoOmEucmlnaHQtYS5sZWZ0LGhlaWdodDphLmJvdHRvbS1hLnRvcCx4OmEubGVmdCx5OmEudG9wfX1mdW5jdGlvbiBWTyhlKXtyZXR1cm4gSlMoZSl9ZnVuY3Rpb24gSE8oZSx0LG4pe2NvbnN0IHI9eHIodCksbz1Rcih0KSxpPW49PT0iZml4ZWQiLGw9bWkoZSwhMCxpLHQpO2xldCBzPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9O2NvbnN0IGE9RG8oMCk7aWYocnx8IXImJiFpKWlmKChMbyh0KSE9PSJib2R5Inx8emEobykpJiYocz13ZCh0KSkscil7Y29uc3QgdT1taSh0LCEwLGksdCk7YS54PXUueCt0LmNsaWVudExlZnQsYS55PXUueSt0LmNsaWVudFRvcH1lbHNlIG8mJihhLng9cVMobykpO3JldHVybnt4OmwubGVmdCtzLnNjcm9sbExlZnQtYS54LHk6bC50b3Arcy5zY3JvbGxUb3AtYS55LHdpZHRoOmwud2lkdGgsaGVpZ2h0OmwuaGVpZ2h0fX1mdW5jdGlvbiBmMChlLHQpe3JldHVybiF4cihlKXx8Rm4oZSkucG9zaXRpb249PT0iZml4ZWQiP251bGw6dD90KGUpOmUub2Zmc2V0UGFyZW50fWZ1bmN0aW9uIHRFKGUsdCl7Y29uc3Qgbj1FbihlKTtpZigheHIoZSkpcmV0dXJuIG47bGV0IHI9ZjAoZSx0KTtmb3IoO3ImJkFPKHIpJiZGbihyKS5wb3NpdGlvbj09PSJzdGF0aWMiOylyPWYwKHIsdCk7cmV0dXJuIHImJihMbyhyKT09PSJodG1sInx8TG8ocik9PT0iYm9keSImJkZuKHIpLnBvc2l0aW9uPT09InN0YXRpYyImJiF2bShyKSk/bjpyfHxNTyhlKXx8bn1jb25zdCBLTz1hc3luYyBmdW5jdGlvbihlKXtsZXR7cmVmZXJlbmNlOnQsZmxvYXRpbmc6bixzdHJhdGVneTpyfT1lO2NvbnN0IG89dGhpcy5nZXRPZmZzZXRQYXJlbnR8fHRFLGk9dGhpcy5nZXREaW1lbnNpb25zO3JldHVybntyZWZlcmVuY2U6SE8odCxhd2FpdCBvKG4pLHIpLGZsb2F0aW5nOnt4OjAseTowLC4uLmF3YWl0IGkobil9fX07ZnVuY3Rpb24gR08oZSl7cmV0dXJuIEZuKGUpLmRpcmVjdGlvbj09PSJydGwifWNvbnN0IFlPPXtjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdDpJTyxnZXREb2N1bWVudEVsZW1lbnQ6UXIsZ2V0Q2xpcHBpbmdSZWN0OlVPLGdldE9mZnNldFBhcmVudDp0RSxnZXRFbGVtZW50UmVjdHM6S08sZ2V0Q2xpZW50UmVjdHM6ak8sZ2V0RGltZW5zaW9uczpWTyxnZXRTY2FsZTpobCxpc0VsZW1lbnQ6VXIsaXNSVEw6R099O2Z1bmN0aW9uIFhPKGUsdCl7bGV0IG49bnVsbCxyO2NvbnN0IG89UXIoZSk7ZnVuY3Rpb24gaSgpe2NsZWFyVGltZW91dChyKSxuJiZuLmRpc2Nvbm5lY3QoKSxuPW51bGx9ZnVuY3Rpb24gbChzLGEpe3M9PT12b2lkIDAmJihzPSExKSxhPT09dm9pZCAwJiYoYT0xKSxpKCk7Y29uc3R7bGVmdDp1LHRvcDpjLHdpZHRoOmQsaGVpZ2h0OmZ9PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoc3x8dCgpLCFkfHwhZilyZXR1cm47Y29uc3QgaD1tdShjKSxnPW11KG8uY2xpZW50V2lkdGgtKHUrZCkpLG09bXUoby5jbGllbnRIZWlnaHQtKGMrZikpLFM9bXUodSkseT17cm9vdE1hcmdpbjotaCsicHggIistZysicHggIistbSsicHggIistUysicHgiLHRocmVzaG9sZDp2bigwLE1vKDEsYSkpfHwxfTtsZXQgeD0hMDtmdW5jdGlvbiBfKEUpe2NvbnN0ICQ9RVswXS5pbnRlcnNlY3Rpb25SYXRpbztpZigkIT09YSl7aWYoIXgpcmV0dXJuIGwoKTskP2woITEsJCk6cj1zZXRUaW1lb3V0KCgpPT57bCghMSwxZS03KX0sMTAwKX14PSExfXRyeXtuPW5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihfLHsuLi55LHJvb3Q6by5vd25lckRvY3VtZW50fSl9Y2F0Y2h7bj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoXyx5KX1uLm9ic2VydmUoZSl9cmV0dXJuIGwoITApLGl9ZnVuY3Rpb24gUU8oZSx0LG4scil7cj09PXZvaWQgMCYmKHI9e30pO2NvbnN0e2FuY2VzdG9yU2Nyb2xsOm89ITAsYW5jZXN0b3JSZXNpemU6aT0hMCxlbGVtZW50UmVzaXplOmw9dHlwZW9mIFJlc2l6ZU9ic2VydmVyPT0iZnVuY3Rpb24iLGxheW91dFNoaWZ0OnM9dHlwZW9mIEludGVyc2VjdGlvbk9ic2VydmVyPT0iZnVuY3Rpb24iLGFuaW1hdGlvbkZyYW1lOmE9ITF9PXIsdT14bShlKSxjPW98fGk/Wy4uLnU/d2EodSk6W10sLi4ud2EodCldOltdO2MuZm9yRWFjaCh2PT57byYmdi5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4se3Bhc3NpdmU6ITB9KSxpJiZ2LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbil9KTtjb25zdCBkPXUmJnM/WE8odSxuKTpudWxsO2xldCBmPS0xLGg9bnVsbDtsJiYoaD1uZXcgUmVzaXplT2JzZXJ2ZXIodj0+e2xldFt5XT12O3kmJnkudGFyZ2V0PT09dSYmaCYmKGgudW5vYnNlcnZlKHQpLGNhbmNlbEFuaW1hdGlvbkZyYW1lKGYpLGY9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57aCYmaC5vYnNlcnZlKHQpfSkpLG4oKX0pLHUmJiFhJiZoLm9ic2VydmUodSksaC5vYnNlcnZlKHQpKTtsZXQgZyxtPWE/bWkoZSk6bnVsbDthJiZTKCk7ZnVuY3Rpb24gUygpe2NvbnN0IHY9bWkoZSk7bSYmKHYueCE9PW0ueHx8di55IT09bS55fHx2LndpZHRoIT09bS53aWR0aHx8di5oZWlnaHQhPT1tLmhlaWdodCkmJm4oKSxtPXYsZz1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoUyl9cmV0dXJuIG4oKSwoKT0+e2MuZm9yRWFjaCh2PT57byYmdi5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLG4pLGkmJnYucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixuKX0pLGQmJmQoKSxoJiZoLmRpc2Nvbm5lY3QoKSxoPW51bGwsYSYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoZyl9fWNvbnN0IEpPPShlLHQsbik9Pntjb25zdCByPW5ldyBNYXAsbz17cGxhdGZvcm06WU8sLi4ubn0saT17Li4uby5wbGF0Zm9ybSxfYzpyfTtyZXR1cm4gJE8oZSx0LHsuLi5vLHBsYXRmb3JtOml9KX0sWk89ZT0+e2Z1bmN0aW9uIHQobil7cmV0dXJue30uaGFzT3duUHJvcGVydHkuY2FsbChuLCJjdXJyZW50Iil9cmV0dXJue25hbWU6ImFycm93IixvcHRpb25zOmUsZm4obil7Y29uc3R7ZWxlbWVudDpyLHBhZGRpbmc6b309dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZShuKTplO3JldHVybiByJiZ0KHIpP3IuY3VycmVudCE9bnVsbD9zMCh7ZWxlbWVudDpyLmN1cnJlbnQscGFkZGluZzpvfSkuZm4obik6e306cj9zMCh7ZWxlbWVudDpyLHBhZGRpbmc6b30pLmZuKG4pOnt9fX19O3ZhciB6dT10eXBlb2YgZG9jdW1lbnQ8InUiP3AudXNlTGF5b3V0RWZmZWN0OnAudXNlRWZmZWN0O2Z1bmN0aW9uIExjKGUsdCl7aWYoZT09PXQpcmV0dXJuITA7aWYodHlwZW9mIGUhPXR5cGVvZiB0KXJldHVybiExO2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iJiZlLnRvU3RyaW5nKCk9PT10LnRvU3RyaW5nKCkpcmV0dXJuITA7bGV0IG4scixvO2lmKGUmJnQmJnR5cGVvZiBlPT0ib2JqZWN0Iil7aWYoQXJyYXkuaXNBcnJheShlKSl7aWYobj1lLmxlbmd0aCxuIT10Lmxlbmd0aClyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KWlmKCFMYyhlW3JdLHRbcl0pKXJldHVybiExO3JldHVybiEwfWlmKG89T2JqZWN0LmtleXMoZSksbj1vLmxlbmd0aCxuIT09T2JqZWN0LmtleXModCkubGVuZ3RoKXJldHVybiExO2ZvcihyPW47ci0tIT09MDspaWYoIXt9Lmhhc093blByb3BlcnR5LmNhbGwodCxvW3JdKSlyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KXtjb25zdCBpPW9bcl07aWYoIShpPT09Il9vd25lciImJmUuJCR0eXBlb2YpJiYhTGMoZVtpXSx0W2ldKSlyZXR1cm4hMX1yZXR1cm4hMH1yZXR1cm4gZSE9PWUmJnQhPT10fWZ1bmN0aW9uIG5FKGUpe3JldHVybiB0eXBlb2Ygd2luZG93PiJ1Ij8xOihlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZGV2aWNlUGl4ZWxSYXRpb3x8MX1mdW5jdGlvbiBoMChlLHQpe2NvbnN0IG49bkUoZSk7cmV0dXJuIE1hdGgucm91bmQodCpuKS9ufWZ1bmN0aW9uIHAwKGUpe2NvbnN0IHQ9cC51c2VSZWYoZSk7cmV0dXJuIHp1KCgpPT57dC5jdXJyZW50PWV9KSx0fWZ1bmN0aW9uIHFPKGUpe2U9PT12b2lkIDAmJihlPXt9KTtjb25zdHtwbGFjZW1lbnQ6dD0iYm90dG9tIixzdHJhdGVneTpuPSJhYnNvbHV0ZSIsbWlkZGxld2FyZTpyPVtdLHBsYXRmb3JtOm8sZWxlbWVudHM6e3JlZmVyZW5jZTppLGZsb2F0aW5nOmx9PXt9LHRyYW5zZm9ybTpzPSEwLHdoaWxlRWxlbWVudHNNb3VudGVkOmEsb3Blbjp1fT1lLFtjLGRdPXAudXNlU3RhdGUoe3g6MCx5OjAsc3RyYXRlZ3k6bixwbGFjZW1lbnQ6dCxtaWRkbGV3YXJlRGF0YTp7fSxpc1Bvc2l0aW9uZWQ6ITF9KSxbZixoXT1wLnVzZVN0YXRlKHIpO0xjKGYscil8fGgocik7Y29uc3RbZyxtXT1wLnVzZVN0YXRlKG51bGwpLFtTLHZdPXAudXNlU3RhdGUobnVsbCkseT1wLnVzZUNhbGxiYWNrKFA9PntQIT0kLmN1cnJlbnQmJigkLmN1cnJlbnQ9UCxtKFApKX0sW21dKSx4PXAudXNlQ2FsbGJhY2soUD0+e1AhPT1DLmN1cnJlbnQmJihDLmN1cnJlbnQ9UCx2KFApKX0sW3ZdKSxfPWl8fGcsRT1sfHxTLCQ9cC51c2VSZWYobnVsbCksQz1wLnVzZVJlZihudWxsKSxUPXAudXNlUmVmKGMpLE09cDAoYSksUj1wMChvKSxqPXAudXNlQ2FsbGJhY2soKCk9PntpZighJC5jdXJyZW50fHwhQy5jdXJyZW50KXJldHVybjtjb25zdCBQPXtwbGFjZW1lbnQ6dCxzdHJhdGVneTpuLG1pZGRsZXdhcmU6Zn07Ui5jdXJyZW50JiYoUC5wbGF0Zm9ybT1SLmN1cnJlbnQpLEpPKCQuY3VycmVudCxDLmN1cnJlbnQsUCkudGhlbihPPT57Y29uc3Qgaz17Li4uTyxpc1Bvc2l0aW9uZWQ6ITB9O0YuY3VycmVudCYmIUxjKFQuY3VycmVudCxrKSYmKFQuY3VycmVudD1rLEhyLmZsdXNoU3luYygoKT0+e2Qoayl9KSl9KX0sW2YsdCxuLFJdKTt6dSgoKT0+e3U9PT0hMSYmVC5jdXJyZW50LmlzUG9zaXRpb25lZCYmKFQuY3VycmVudC5pc1Bvc2l0aW9uZWQ9ITEsZChQPT4oey4uLlAsaXNQb3NpdGlvbmVkOiExfSkpKX0sW3VdKTtjb25zdCBGPXAudXNlUmVmKCExKTt6dSgoKT0+KEYuY3VycmVudD0hMCwoKT0+e0YuY3VycmVudD0hMX0pLFtdKSx6dSgoKT0+e2lmKF8mJigkLmN1cnJlbnQ9XyksRSYmKEMuY3VycmVudD1FKSxfJiZFKXtpZihNLmN1cnJlbnQpcmV0dXJuIE0uY3VycmVudChfLEUsaik7aigpfX0sW18sRSxqLE1dKTtjb25zdCBhZT1wLnVzZU1lbW8oKCk9Pih7cmVmZXJlbmNlOiQsZmxvYXRpbmc6QyxzZXRSZWZlcmVuY2U6eSxzZXRGbG9hdGluZzp4fSksW3kseF0pLEg9cC51c2VNZW1vKCgpPT4oe3JlZmVyZW5jZTpfLGZsb2F0aW5nOkV9KSxbXyxFXSksWD1wLnVzZU1lbW8oKCk9Pntjb25zdCBQPXtwb3NpdGlvbjpuLGxlZnQ6MCx0b3A6MH07aWYoIUguZmxvYXRpbmcpcmV0dXJuIFA7Y29uc3QgTz1oMChILmZsb2F0aW5nLGMueCksaz1oMChILmZsb2F0aW5nLGMueSk7cmV0dXJuIHM/ey4uLlAsdHJhbnNmb3JtOiJ0cmFuc2xhdGUoIitPKyJweCwgIitrKyJweCkiLC4uLm5FKEguZmxvYXRpbmcpPj0xLjUmJnt3aWxsQ2hhbmdlOiJ0cmFuc2Zvcm0ifX06e3Bvc2l0aW9uOm4sbGVmdDpPLHRvcDprfX0sW24scyxILmZsb2F0aW5nLGMueCxjLnldKTtyZXR1cm4gcC51c2VNZW1vKCgpPT4oey4uLmMsdXBkYXRlOmoscmVmczphZSxlbGVtZW50czpILGZsb2F0aW5nU3R5bGVzOlh9KSxbYyxqLGFlLEgsWF0pfWZ1bmN0aW9uIHJFKGUpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZSh2b2lkIDApO3JldHVybiAkbigoKT0+e2lmKGUpe24oe3dpZHRoOmUub2Zmc2V0V2lkdGgsaGVpZ2h0OmUub2Zmc2V0SGVpZ2h0fSk7Y29uc3Qgcj1uZXcgUmVzaXplT2JzZXJ2ZXIobz0+e2lmKCFBcnJheS5pc0FycmF5KG8pfHwhby5sZW5ndGgpcmV0dXJuO2NvbnN0IGk9b1swXTtsZXQgbCxzO2lmKCJib3JkZXJCb3hTaXplImluIGkpe2NvbnN0IGE9aS5ib3JkZXJCb3hTaXplLHU9QXJyYXkuaXNBcnJheShhKT9hWzBdOmE7bD11LmlubGluZVNpemUscz11LmJsb2NrU2l6ZX1lbHNlIGw9ZS5vZmZzZXRXaWR0aCxzPWUub2Zmc2V0SGVpZ2h0O24oe3dpZHRoOmwsaGVpZ2h0OnN9KX0pO3JldHVybiByLm9ic2VydmUoZSx7Ym94OiJib3JkZXItYm94In0pLCgpPT5yLnVub2JzZXJ2ZShlKX1lbHNlIG4odm9pZCAwKX0sW2VdKSx0fWNvbnN0IG9FPSJQb3BwZXIiLFtpRSxsRV09Q2kob0UpLFtlNSxzRV09aUUob0UpLHQ1PWU9Pntjb25zdHtfX3Njb3BlUG9wcGVyOnQsY2hpbGRyZW46bn09ZSxbcixvXT1wLnVzZVN0YXRlKG51bGwpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoZTUse3Njb3BlOnQsYW5jaG9yOnIsb25BbmNob3JDaGFuZ2U6b30sbil9LG41PSJQb3BwZXJBbmNob3IiLHI1PXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVQb3BwZXI6bix2aXJ0dWFsUmVmOnIsLi4ub309ZSxpPXNFKG41LG4pLGw9cC51c2VSZWYobnVsbCkscz1YZSh0LGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2kub25BbmNob3JDaGFuZ2UoKHI9PW51bGw/dm9pZCAwOnIuY3VycmVudCl8fGwuY3VycmVudCl9KSxyP251bGw6cC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7fSxvLHtyZWY6c30pKX0pLGFFPSJQb3BwZXJDb250ZW50IixbbzUsZzRdPWlFKGFFKSxpNT1wLmZvcndhcmRSZWYoKGUsdCk9Pnt2YXIgbixyLG8saSxsLHMsYSx1O2NvbnN0e19fc2NvcGVQb3BwZXI6YyxzaWRlOmQ9ImJvdHRvbSIsc2lkZU9mZnNldDpmPTAsYWxpZ246aD0iY2VudGVyIixhbGlnbk9mZnNldDpnPTAsYXJyb3dQYWRkaW5nOm09MCxhdm9pZENvbGxpc2lvbnM6Uz0hMCxjb2xsaXNpb25Cb3VuZGFyeTp2PVtdLGNvbGxpc2lvblBhZGRpbmc6eT0wLHN0aWNreTp4PSJwYXJ0aWFsIixoaWRlV2hlbkRldGFjaGVkOl89ITEsdXBkYXRlUG9zaXRpb25TdHJhdGVneTpFPSJvcHRpbWl6ZWQiLG9uUGxhY2VkOiQsLi4uQ309ZSxUPXNFKGFFLGMpLFtNLFJdPXAudXNlU3RhdGUobnVsbCksaj1YZSh0LHNuPT5SKHNuKSksW0YsYWVdPXAudXNlU3RhdGUobnVsbCksSD1yRShGKSxYPShuPUg9PW51bGw/dm9pZCAwOkgud2lkdGgpIT09bnVsbCYmbiE9PXZvaWQgMD9uOjAsUD0ocj1IPT1udWxsP3ZvaWQgMDpILmhlaWdodCkhPT1udWxsJiZyIT09dm9pZCAwP3I6MCxPPWQrKGghPT0iY2VudGVyIj8iLSIraDoiIiksaz10eXBlb2YgeT09Im51bWJlciI/eTp7dG9wOjAscmlnaHQ6MCxib3R0b206MCxsZWZ0OjAsLi4ueX0sST1BcnJheS5pc0FycmF5KHYpP3Y6W3ZdLEw9SS5sZW5ndGg+MCxWPXtwYWRkaW5nOmssYm91bmRhcnk6SS5maWx0ZXIobDUpLGFsdEJvdW5kYXJ5Okx9LHtyZWZzOnRlLGZsb2F0aW5nU3R5bGVzOnllLHBsYWNlbWVudDpmZSxpc1Bvc2l0aW9uZWQ6T2UsbWlkZGxld2FyZURhdGE6YmV9PXFPKHtzdHJhdGVneToiZml4ZWQiLHBsYWNlbWVudDpPLHdoaWxlRWxlbWVudHNNb3VudGVkOiguLi5zbik9PlFPKC4uLnNuLHthbmltYXRpb25GcmFtZTpFPT09ImFsd2F5cyJ9KSxlbGVtZW50czp7cmVmZXJlbmNlOlQuYW5jaG9yfSxtaWRkbGV3YXJlOltiTyh7bWFpbkF4aXM6ZitQLGFsaWdubWVudEF4aXM6Z30pLFMmJlJPKHttYWluQXhpczohMCxjcm9zc0F4aXM6ITEsbGltaXRlcjp4PT09InBhcnRpYWwiP1BPKCk6dm9pZCAwLC4uLlZ9KSxTJiZrTyh7Li4uVn0pLE9PKHsuLi5WLGFwcGx5Oih7ZWxlbWVudHM6c24scmVjdHM6Ym4sYXZhaWxhYmxlV2lkdGg6VGUsYXZhaWxhYmxlSGVpZ2h0OmZ0fSk9Pntjb25zdHt3aWR0aDpodCxoZWlnaHQ6X3R9PWJuLnJlZmVyZW5jZSxwbj1zbi5mbG9hdGluZy5zdHlsZTtwbi5zZXRQcm9wZXJ0eSgiLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLXdpZHRoIixgJHtUZX1weGApLHBuLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtaGVpZ2h0IixgJHtmdH1weGApLHBuLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGgiLGAke2h0fXB4YCkscG4uc2V0UHJvcGVydHkoIi0tcmFkaXgtcG9wcGVyLWFuY2hvci1oZWlnaHQiLGAke190fXB4YCl9fSksRiYmWk8oe2VsZW1lbnQ6RixwYWRkaW5nOm19KSxzNSh7YXJyb3dXaWR0aDpYLGFycm93SGVpZ2h0OlB9KSxfJiZUTyh7c3RyYXRlZ3k6InJlZmVyZW5jZUhpZGRlbiIsLi4uVn0pXX0pLFtaLGtlXT11RShmZSksY2U9VnQoJCk7JG4oKCk9PntPZSYmKGNlPT1udWxsfHxjZSgpKX0sW09lLGNlXSk7Y29uc3QgX2U9KG89YmUuYXJyb3cpPT09bnVsbHx8bz09PXZvaWQgMD92b2lkIDA6by54LG1lPShpPWJlLmFycm93KT09PW51bGx8fGk9PT12b2lkIDA/dm9pZCAwOmkueSwkZT0oKGw9YmUuYXJyb3cpPT09bnVsbHx8bD09PXZvaWQgMD92b2lkIDA6bC5jZW50ZXJPZmZzZXQpIT09MCxbQmUsUHRdPXAudXNlU3RhdGUoKTtyZXR1cm4gJG4oKCk9PntNJiZQdCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShNKS56SW5kZXgpfSxbTV0pLHAuY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOnRlLnNldEZsb2F0aW5nLCJkYXRhLXJhZGl4LXBvcHBlci1jb250ZW50LXdyYXBwZXIiOiIiLHN0eWxlOnsuLi55ZSx0cmFuc2Zvcm06T2U/eWUudHJhbnNmb3JtOiJ0cmFuc2xhdGUoMCwgLTIwMCUpIixtaW5XaWR0aDoibWF4LWNvbnRlbnQiLHpJbmRleDpCZSwiLS1yYWRpeC1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbiI6WyhzPWJlLnRyYW5zZm9ybU9yaWdpbik9PT1udWxsfHxzPT09dm9pZCAwP3ZvaWQgMDpzLngsKGE9YmUudHJhbnNmb3JtT3JpZ2luKT09PW51bGx8fGE9PT12b2lkIDA/dm9pZCAwOmEueV0uam9pbigiICIpfSxkaXI6ZS5kaXJ9LHAuY3JlYXRlRWxlbWVudChvNSx7c2NvcGU6YyxwbGFjZWRTaWRlOlosb25BcnJvd0NoYW5nZTphZSxhcnJvd1g6X2UsYXJyb3dZOm1lLHNob3VsZEhpZGVBcnJvdzokZX0scC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7ImRhdGEtc2lkZSI6WiwiZGF0YS1hbGlnbiI6a2V9LEMse3JlZjpqLHN0eWxlOnsuLi5DLnN0eWxlLGFuaW1hdGlvbjpPZT92b2lkIDA6Im5vbmUiLG9wYWNpdHk6KHU9YmUuaGlkZSkhPT1udWxsJiZ1IT09dm9pZCAwJiZ1LnJlZmVyZW5jZUhpZGRlbj8wOnZvaWQgMH19KSkpKX0pO2Z1bmN0aW9uIGw1KGUpe3JldHVybiBlIT09bnVsbH1jb25zdCBzNT1lPT4oe25hbWU6InRyYW5zZm9ybU9yaWdpbiIsb3B0aW9uczplLGZuKHQpe3ZhciBuLHIsbyxpLGw7Y29uc3R7cGxhY2VtZW50OnMscmVjdHM6YSxtaWRkbGV3YXJlRGF0YTp1fT10LGQ9KChuPXUuYXJyb3cpPT09bnVsbHx8bj09PXZvaWQgMD92b2lkIDA6bi5jZW50ZXJPZmZzZXQpIT09MCxmPWQ/MDplLmFycm93V2lkdGgsaD1kPzA6ZS5hcnJvd0hlaWdodCxbZyxtXT11RShzKSxTPXtzdGFydDoiMCUiLGNlbnRlcjoiNTAlIixlbmQ6IjEwMCUifVttXSx2PSgocj0obz11LmFycm93KT09PW51bGx8fG89PT12b2lkIDA/dm9pZCAwOm8ueCkhPT1udWxsJiZyIT09dm9pZCAwP3I6MCkrZi8yLHk9KChpPShsPXUuYXJyb3cpPT09bnVsbHx8bD09PXZvaWQgMD92b2lkIDA6bC55KSE9PW51bGwmJmkhPT12b2lkIDA/aTowKStoLzI7bGV0IHg9IiIsXz0iIjtyZXR1cm4gZz09PSJib3R0b20iPyh4PWQ/UzpgJHt2fXB4YCxfPWAkey1ofXB4YCk6Zz09PSJ0b3AiPyh4PWQ/UzpgJHt2fXB4YCxfPWAke2EuZmxvYXRpbmcuaGVpZ2h0K2h9cHhgKTpnPT09InJpZ2h0Ij8oeD1gJHstaH1weGAsXz1kP1M6YCR7eX1weGApOmc9PT0ibGVmdCImJih4PWAke2EuZmxvYXRpbmcud2lkdGgraH1weGAsXz1kP1M6YCR7eX1weGApLHtkYXRhOnt4LHk6X319fX0pO2Z1bmN0aW9uIHVFKGUpe2NvbnN0W3Qsbj0iY2VudGVyIl09ZS5zcGxpdCgiLSIpO3JldHVyblt0LG5dfWNvbnN0IGE1PXQ1LHU1PXI1LGM1PWk1LGQ1PXAuZm9yd2FyZFJlZigoZSx0KT0+e3ZhciBuO2NvbnN0e2NvbnRhaW5lcjpyPWdsb2JhbFRoaXM9PW51bGx8fChuPWdsb2JhbFRoaXMuZG9jdW1lbnQpPT09bnVsbHx8bj09PXZvaWQgMD92b2lkIDA6bi5ib2R5LC4uLm99PWU7cmV0dXJuIHI/S2suY3JlYXRlUG9ydGFsKHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoe30sbyx7cmVmOnR9KSkscik6bnVsbH0pO2Z1bmN0aW9uIGJsKHtwcm9wOmUsZGVmYXVsdFByb3A6dCxvbkNoYW5nZTpuPSgpPT57fX0pe2NvbnN0W3Isb109ZjUoe2RlZmF1bHRQcm9wOnQsb25DaGFuZ2U6bn0pLGk9ZSE9PXZvaWQgMCxsPWk/ZTpyLHM9VnQobiksYT1wLnVzZUNhbGxiYWNrKHU9PntpZihpKXtjb25zdCBkPXR5cGVvZiB1PT0iZnVuY3Rpb24iP3UoZSk6dTtkIT09ZSYmcyhkKX1lbHNlIG8odSl9LFtpLGUsbyxzXSk7cmV0dXJuW2wsYV19ZnVuY3Rpb24gZjUoe2RlZmF1bHRQcm9wOmUsb25DaGFuZ2U6dH0pe2NvbnN0IG49cC51c2VTdGF0ZShlKSxbcl09bixvPXAudXNlUmVmKHIpLGk9VnQodCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57by5jdXJyZW50IT09ciYmKGkociksby5jdXJyZW50PXIpfSxbcixvLGldKSxufWZ1bmN0aW9uIGNFKGUpe2NvbnN0IHQ9cC51c2VSZWYoe3ZhbHVlOmUscHJldmlvdXM6ZX0pO3JldHVybiBwLnVzZU1lbW8oKCk9Pih0LmN1cnJlbnQudmFsdWUhPT1lJiYodC5jdXJyZW50LnByZXZpb3VzPXQuY3VycmVudC52YWx1ZSx0LmN1cnJlbnQudmFsdWU9ZSksdC5jdXJyZW50LnByZXZpb3VzKSxbZV0pfWNvbnN0IGg1PXAuZm9yd2FyZFJlZigoZSx0KT0+cC5jcmVhdGVFbGVtZW50KERlLnNwYW4sZWUoe30sZSx7cmVmOnQsc3R5bGU6e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsYm9yZGVyOjAsd2lkdGg6MSxoZWlnaHQ6MSxwYWRkaW5nOjAsbWFyZ2luOi0xLG92ZXJmbG93OiJoaWRkZW4iLGNsaXA6InJlY3QoMCwgMCwgMCwgMCkiLHdoaXRlU3BhY2U6Im5vd3JhcCIsd29yZFdyYXA6Im5vcm1hbCIsLi4uZS5zdHlsZX19KSkpO3ZhciBwNT1mdW5jdGlvbihlKXtpZih0eXBlb2YgZG9jdW1lbnQ+InUiKXJldHVybiBudWxsO3ZhciB0PUFycmF5LmlzQXJyYXkoZSk/ZVswXTplO3JldHVybiB0Lm93bmVyRG9jdW1lbnQuYm9keX0samk9bmV3IFdlYWtNYXAsdnU9bmV3IFdlYWtNYXAseXU9e30sTmY9MCxkRT1mdW5jdGlvbihlKXtyZXR1cm4gZSYmKGUuaG9zdHx8ZEUoZS5wYXJlbnROb2RlKSl9LGc1PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKG4pe2lmKGUuY29udGFpbnMobikpcmV0dXJuIG47dmFyIHI9ZEUobik7cmV0dXJuIHImJmUuY29udGFpbnMocik/cjooY29uc29sZS5lcnJvcigiYXJpYS1oaWRkZW4iLG4sImluIG5vdCBjb250YWluZWQgaW5zaWRlIixlLCIuIERvaW5nIG5vdGhpbmciKSxudWxsKX0pLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4hIW59KX0sbTU9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZzUodCxBcnJheS5pc0FycmF5KGUpP2U6W2VdKTt5dVtuXXx8KHl1W25dPW5ldyBXZWFrTWFwKTt2YXIgaT15dVtuXSxsPVtdLHM9bmV3IFNldCxhPW5ldyBTZXQobyksdT1mdW5jdGlvbihkKXshZHx8cy5oYXMoZCl8fChzLmFkZChkKSx1KGQucGFyZW50Tm9kZSkpfTtvLmZvckVhY2godSk7dmFyIGM9ZnVuY3Rpb24oZCl7IWR8fGEuaGFzKGQpfHxBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQuY2hpbGRyZW4sZnVuY3Rpb24oZil7aWYocy5oYXMoZikpYyhmKTtlbHNle3ZhciBoPWYuZ2V0QXR0cmlidXRlKHIpLGc9aCE9PW51bGwmJmghPT0iZmFsc2UiLG09KGppLmdldChmKXx8MCkrMSxTPShpLmdldChmKXx8MCkrMTtqaS5zZXQoZixtKSxpLnNldChmLFMpLGwucHVzaChmKSxtPT09MSYmZyYmdnUuc2V0KGYsITApLFM9PT0xJiZmLnNldEF0dHJpYnV0ZShuLCJ0cnVlIiksZ3x8Zi5zZXRBdHRyaWJ1dGUociwidHJ1ZSIpfX0pfTtyZXR1cm4gYyh0KSxzLmNsZWFyKCksTmYrKyxmdW5jdGlvbigpe2wuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgZj1qaS5nZXQoZCktMSxoPWkuZ2V0KGQpLTE7amkuc2V0KGQsZiksaS5zZXQoZCxoKSxmfHwodnUuaGFzKGQpfHxkLnJlbW92ZUF0dHJpYnV0ZShyKSx2dS5kZWxldGUoZCkpLGh8fGQucmVtb3ZlQXR0cmlidXRlKG4pfSksTmYtLSxOZnx8KGppPW5ldyBXZWFrTWFwLGppPW5ldyBXZWFrTWFwLHZ1PW5ldyBXZWFrTWFwLHl1PXt9KX19LHY1PWZ1bmN0aW9uKGUsdCxuKXtuPT09dm9pZCAwJiYobj0iZGF0YS1hcmlhLWhpZGRlbiIpO3ZhciByPUFycmF5LmZyb20oQXJyYXkuaXNBcnJheShlKT9lOltlXSksbz10fHxwNShlKTtyZXR1cm4gbz8oci5wdXNoLmFwcGx5KHIsQXJyYXkuZnJvbShvLnF1ZXJ5U2VsZWN0b3JBbGwoIlthcmlhLWxpdmVdIikpKSxtNShyLG8sbiwiYXJpYS1oaWRkZW4iKSk6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH19LGNyPWZ1bmN0aW9uKCl7cmV0dXJuIGNyPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixyPTEsbz1hcmd1bWVudHMubGVuZ3RoO3I8bztyKyspe249YXJndW1lbnRzW3JdO2Zvcih2YXIgaSBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLGkpJiYodFtpXT1uW2ldKX1yZXR1cm4gdH0sY3IuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtmdW5jdGlvbiBmRShlLHQpe3ZhciBuPXt9O2Zvcih2YXIgciBpbiBlKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHIpJiZ0LmluZGV4T2Yocik8MCYmKG5bcl09ZVtyXSk7aWYoZSE9bnVsbCYmdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM9PSJmdW5jdGlvbiIpZm9yKHZhciBvPTAscj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO288ci5sZW5ndGg7bysrKXQuaW5kZXhPZihyW29dKTwwJiZPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoZSxyW29dKSYmKG5bcltvXV09ZVtyW29dXSk7cmV0dXJuIG59ZnVuY3Rpb24geTUoZSx0LG4pe2lmKG58fGFyZ3VtZW50cy5sZW5ndGg9PT0yKWZvcih2YXIgcj0wLG89dC5sZW5ndGgsaTtyPG87cisrKShpfHwhKHIgaW4gdCkpJiYoaXx8KGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCwwLHIpKSxpW3JdPXRbcl0pO3JldHVybiBlLmNvbmNhdChpfHxBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0KSl9dmFyIEZ1PSJyaWdodC1zY3JvbGwtYmFyLXBvc2l0aW9uIixCdT0id2lkdGgtYmVmb3JlLXNjcm9sbC1iYXIiLHg1PSJ3aXRoLXNjcm9sbC1iYXJzLWhpZGRlbiIsXzU9Ii0tcmVtb3ZlZC1ib2R5LXNjcm9sbC1iYXItc2l6ZSI7ZnVuY3Rpb24gdzUoZSx0KXtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZSh0KTplJiYoZS5jdXJyZW50PXQpLGV9ZnVuY3Rpb24gUzUoZSx0KXt2YXIgbj1wLnVzZVN0YXRlKGZ1bmN0aW9uKCl7cmV0dXJue3ZhbHVlOmUsY2FsbGJhY2s6dCxmYWNhZGU6e2dldCBjdXJyZW50KCl7cmV0dXJuIG4udmFsdWV9LHNldCBjdXJyZW50KHIpe3ZhciBvPW4udmFsdWU7byE9PXImJihuLnZhbHVlPXIsbi5jYWxsYmFjayhyLG8pKX19fX0pWzBdO3JldHVybiBuLmNhbGxiYWNrPXQsbi5mYWNhZGV9ZnVuY3Rpb24gRTUoZSx0KXtyZXR1cm4gUzUodHx8bnVsbCxmdW5jdGlvbihuKXtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKHIpe3JldHVybiB3NShyLG4pfSl9KX1mdW5jdGlvbiBDNShlKXtyZXR1cm4gZX1mdW5jdGlvbiAkNShlLHQpe3Q9PT12b2lkIDAmJih0PUM1KTt2YXIgbj1bXSxyPSExLG89e3JlYWQ6ZnVuY3Rpb24oKXtpZihyKXRocm93IG5ldyBFcnJvcigiU2lkZWNhcjogY291bGQgbm90IGByZWFkYCBmcm9tIGFuIGBhc3NpZ25lZGAgbWVkaXVtLiBgcmVhZGAgY291bGQgYmUgdXNlZCBvbmx5IHdpdGggYHVzZU1lZGl1bWAuIik7cmV0dXJuIG4ubGVuZ3RoP25bbi5sZW5ndGgtMV06ZX0sdXNlTWVkaXVtOmZ1bmN0aW9uKGkpe3ZhciBsPXQoaSxyKTtyZXR1cm4gbi5wdXNoKGwpLGZ1bmN0aW9uKCl7bj1uLmZpbHRlcihmdW5jdGlvbihzKXtyZXR1cm4gcyE9PWx9KX19LGFzc2lnblN5bmNNZWRpdW06ZnVuY3Rpb24oaSl7Zm9yKHI9ITA7bi5sZW5ndGg7KXt2YXIgbD1uO249W10sbC5mb3JFYWNoKGkpfW49e3B1c2g6ZnVuY3Rpb24ocyl7cmV0dXJuIGkocyl9LGZpbHRlcjpmdW5jdGlvbigpe3JldHVybiBufX19LGFzc2lnbk1lZGl1bTpmdW5jdGlvbihpKXtyPSEwO3ZhciBsPVtdO2lmKG4ubGVuZ3RoKXt2YXIgcz1uO249W10scy5mb3JFYWNoKGkpLGw9bn12YXIgYT1mdW5jdGlvbigpe3ZhciBjPWw7bD1bXSxjLmZvckVhY2goaSl9LHU9ZnVuY3Rpb24oKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbihhKX07dSgpLG49e3B1c2g6ZnVuY3Rpb24oYyl7bC5wdXNoKGMpLHUoKX0sZmlsdGVyOmZ1bmN0aW9uKGMpe3JldHVybiBsPWwuZmlsdGVyKGMpLG59fX19O3JldHVybiBvfWZ1bmN0aW9uIGs1KGUpe2U9PT12b2lkIDAmJihlPXt9KTt2YXIgdD0kNShudWxsKTtyZXR1cm4gdC5vcHRpb25zPWNyKHthc3luYzohMCxzc3I6ITF9LGUpLHR9dmFyIGhFPWZ1bmN0aW9uKGUpe3ZhciB0PWUuc2lkZUNhcixuPWZFKGUsWyJzaWRlQ2FyIl0pO2lmKCF0KXRocm93IG5ldyBFcnJvcigiU2lkZWNhcjogcGxlYXNlIHByb3ZpZGUgYHNpZGVDYXJgIHByb3BlcnR5IHRvIGltcG9ydCB0aGUgcmlnaHQgY2FyIik7dmFyIHI9dC5yZWFkKCk7aWYoIXIpdGhyb3cgbmV3IEVycm9yKCJTaWRlY2FyIG1lZGl1bSBub3QgZm91bmQiKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHIsY3Ioe30sbikpfTtoRS5pc1NpZGVDYXJFeHBvcnQ9ITA7ZnVuY3Rpb24gVDUoZSx0KXtyZXR1cm4gZS51c2VNZWRpdW0odCksaEV9dmFyIHBFPWs1KCksYmY9ZnVuY3Rpb24oKXt9LFNkPXAuZm9yd2FyZFJlZihmdW5jdGlvbihlLHQpe3ZhciBuPXAudXNlUmVmKG51bGwpLHI9cC51c2VTdGF0ZSh7b25TY3JvbGxDYXB0dXJlOmJmLG9uV2hlZWxDYXB0dXJlOmJmLG9uVG91Y2hNb3ZlQ2FwdHVyZTpiZn0pLG89clswXSxpPXJbMV0sbD1lLmZvcndhcmRQcm9wcyxzPWUuY2hpbGRyZW4sYT1lLmNsYXNzTmFtZSx1PWUucmVtb3ZlU2Nyb2xsQmFyLGM9ZS5lbmFibGVkLGQ9ZS5zaGFyZHMsZj1lLnNpZGVDYXIsaD1lLm5vSXNvbGF0aW9uLGc9ZS5pbmVydCxtPWUuYWxsb3dQaW5jaFpvb20sUz1lLmFzLHY9Uz09PXZvaWQgMD8iZGl2IjpTLHk9ZkUoZSxbImZvcndhcmRQcm9wcyIsImNoaWxkcmVuIiwiY2xhc3NOYW1lIiwicmVtb3ZlU2Nyb2xsQmFyIiwiZW5hYmxlZCIsInNoYXJkcyIsInNpZGVDYXIiLCJub0lzb2xhdGlvbiIsImluZXJ0IiwiYWxsb3dQaW5jaFpvb20iLCJhcyJdKSx4PWYsXz1FNShbbix0XSksRT1jcihjcih7fSx5KSxvKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxjJiZwLmNyZWF0ZUVsZW1lbnQoeCx7c2lkZUNhcjpwRSxyZW1vdmVTY3JvbGxCYXI6dSxzaGFyZHM6ZCxub0lzb2xhdGlvbjpoLGluZXJ0Omcsc2V0Q2FsbGJhY2tzOmksYWxsb3dQaW5jaFpvb206ISFtLGxvY2tSZWY6bn0pLGw/cC5jbG9uZUVsZW1lbnQocC5DaGlsZHJlbi5vbmx5KHMpLGNyKGNyKHt9LEUpLHtyZWY6X30pKTpwLmNyZWF0ZUVsZW1lbnQodixjcih7fSxFLHtjbGFzc05hbWU6YSxyZWY6X30pLHMpKX0pO1NkLmRlZmF1bHRQcm9wcz17ZW5hYmxlZDohMCxyZW1vdmVTY3JvbGxCYXI6ITAsaW5lcnQ6ITF9O1NkLmNsYXNzTmFtZXM9e2Z1bGxXaWR0aDpCdSx6ZXJvUmlnaHQ6RnV9O3ZhciBnMCxONT1mdW5jdGlvbigpe2lmKGcwKXJldHVybiBnMDtpZih0eXBlb2YgX193ZWJwYWNrX25vbmNlX188InUiKXJldHVybiBfX3dlYnBhY2tfbm9uY2VfX307ZnVuY3Rpb24gYjUoKXtpZighZG9jdW1lbnQpcmV0dXJuIG51bGw7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtlLnR5cGU9InRleHQvY3NzIjt2YXIgdD1ONSgpO3JldHVybiB0JiZlLnNldEF0dHJpYnV0ZSgibm9uY2UiLHQpLGV9ZnVuY3Rpb24gUjUoZSx0KXtlLnN0eWxlU2hlZXQ/ZS5zdHlsZVNoZWV0LmNzc1RleHQ9dDplLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHQpKX1mdW5jdGlvbiBQNShlKXt2YXIgdD1kb2N1bWVudC5oZWFkfHxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdO3QuYXBwZW5kQ2hpbGQoZSl9dmFyIE81PWZ1bmN0aW9uKCl7dmFyIGU9MCx0PW51bGw7cmV0dXJue2FkZDpmdW5jdGlvbihuKXtlPT0wJiYodD1iNSgpKSYmKFI1KHQsbiksUDUodCkpLGUrK30scmVtb3ZlOmZ1bmN0aW9uKCl7ZS0tLCFlJiZ0JiYodC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCksdD1udWxsKX19fSxBNT1mdW5jdGlvbigpe3ZhciBlPU81KCk7cmV0dXJuIGZ1bmN0aW9uKHQsbil7cC51c2VFZmZlY3QoZnVuY3Rpb24oKXtyZXR1cm4gZS5hZGQodCksZnVuY3Rpb24oKXtlLnJlbW92ZSgpfX0sW3QmJm5dKX19LGdFPWZ1bmN0aW9uKCl7dmFyIGU9QTUoKSx0PWZ1bmN0aW9uKG4pe3ZhciByPW4uc3R5bGVzLG89bi5keW5hbWljO3JldHVybiBlKHIsbyksbnVsbH07cmV0dXJuIHR9LE01PXtsZWZ0OjAsdG9wOjAscmlnaHQ6MCxnYXA6MH0sUmY9ZnVuY3Rpb24oZSl7cmV0dXJuIHBhcnNlSW50KGV8fCIiLDEwKXx8MH0sRDU9ZnVuY3Rpb24oZSl7dmFyIHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuYm9keSksbj10W2U9PT0icGFkZGluZyI/InBhZGRpbmdMZWZ0IjoibWFyZ2luTGVmdCJdLHI9dFtlPT09InBhZGRpbmciPyJwYWRkaW5nVG9wIjoibWFyZ2luVG9wIl0sbz10W2U9PT0icGFkZGluZyI/InBhZGRpbmdSaWdodCI6Im1hcmdpblJpZ2h0Il07cmV0dXJuW1JmKG4pLFJmKHIpLFJmKG8pXX0sTDU9ZnVuY3Rpb24oZSl7aWYoZT09PXZvaWQgMCYmKGU9Im1hcmdpbiIpLHR5cGVvZiB3aW5kb3c+InUiKXJldHVybiBNNTt2YXIgdD1ENShlKSxuPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aCxyPXdpbmRvdy5pbm5lcldpZHRoO3JldHVybntsZWZ0OnRbMF0sdG9wOnRbMV0scmlnaHQ6dFsyXSxnYXA6TWF0aC5tYXgoMCxyLW4rdFsyXS10WzBdKX19LEk1PWdFKCksajU9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZS5sZWZ0LGk9ZS50b3AsbD1lLnJpZ2h0LHM9ZS5nYXA7cmV0dXJuIG49PT12b2lkIDAmJihuPSJtYXJnaW4iKSxgCiAgLmAuY29uY2F0KHg1LGAgewogICBvdmVyZmxvdzogaGlkZGVuIGApLmNvbmNhdChyLGA7CiAgIHBhZGRpbmctcmlnaHQ6IGApLmNvbmNhdChzLCJweCAiKS5jb25jYXQocixgOwogIH0KICBib2R5IHsKICAgIG92ZXJmbG93OiBoaWRkZW4gYCkuY29uY2F0KHIsYDsKICAgIG92ZXJzY3JvbGwtYmVoYXZpb3I6IGNvbnRhaW47CiAgICBgKS5jb25jYXQoW3QmJiJwb3NpdGlvbjogcmVsYXRpdmUgIi5jb25jYXQociwiOyIpLG49PT0ibWFyZ2luIiYmYAogICAgcGFkZGluZy1sZWZ0OiBgLmNvbmNhdChvLGBweDsKICAgIHBhZGRpbmctdG9wOiBgKS5jb25jYXQoaSxgcHg7CiAgICBwYWRkaW5nLXJpZ2h0OiBgKS5jb25jYXQobCxgcHg7CiAgICBtYXJnaW4tbGVmdDowOwogICAgbWFyZ2luLXRvcDowOwogICAgbWFyZ2luLXJpZ2h0OiBgKS5jb25jYXQocywicHggIikuY29uY2F0KHIsYDsKICAgIGApLG49PT0icGFkZGluZyImJiJwYWRkaW5nLXJpZ2h0OiAiLmNvbmNhdChzLCJweCAiKS5jb25jYXQociwiOyIpXS5maWx0ZXIoQm9vbGVhbikuam9pbigiIiksYAogIH0KICAKICAuYCkuY29uY2F0KEZ1LGAgewogICAgcmlnaHQ6IGApLmNvbmNhdChzLCJweCAiKS5jb25jYXQocixgOwogIH0KICAKICAuYCkuY29uY2F0KEJ1LGAgewogICAgbWFyZ2luLXJpZ2h0OiBgKS5jb25jYXQocywicHggIikuY29uY2F0KHIsYDsKICB9CiAgCiAgLmApLmNvbmNhdChGdSwiIC4iKS5jb25jYXQoRnUsYCB7CiAgICByaWdodDogMCBgKS5jb25jYXQocixgOwogIH0KICAKICAuYCkuY29uY2F0KEJ1LCIgLiIpLmNvbmNhdChCdSxgIHsKICAgIG1hcmdpbi1yaWdodDogMCBgKS5jb25jYXQocixgOwogIH0KICAKICBib2R5IHsKICAgIGApLmNvbmNhdChfNSwiOiAiKS5jb25jYXQocyxgcHg7CiAgfQpgKX0sejU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ub1JlbGF0aXZlLG49ZS5ub0ltcG9ydGFudCxyPWUuZ2FwTW9kZSxvPXI9PT12b2lkIDA/Im1hcmdpbiI6cixpPXAudXNlTWVtbyhmdW5jdGlvbigpe3JldHVybiBMNShvKX0sW29dKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KEk1LHtzdHlsZXM6ajUoaSwhdCxvLG4/IiI6IiFpbXBvcnRhbnQiKX0pfSxfcD0hMTtpZih0eXBlb2Ygd2luZG93PCJ1Iil0cnl7dmFyIHh1PU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe3JldHVybiBfcD0hMCwhMH19KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIseHUseHUpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ0ZXN0Iix4dSx4dSl9Y2F0Y2h7X3A9ITF9dmFyIHppPV9wP3twYXNzaXZlOiExfTohMSxGNT1mdW5jdGlvbihlKXtyZXR1cm4gZS50YWdOYW1lPT09IlRFWFRBUkVBIn0sbUU9ZnVuY3Rpb24oZSx0KXt2YXIgbj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlKTtyZXR1cm4gblt0XSE9PSJoaWRkZW4iJiYhKG4ub3ZlcmZsb3dZPT09bi5vdmVyZmxvd1gmJiFGNShlKSYmblt0XT09PSJ2aXNpYmxlIil9LEI1PWZ1bmN0aW9uKGUpe3JldHVybiBtRShlLCJvdmVyZmxvd1kiKX0sVzU9ZnVuY3Rpb24oZSl7cmV0dXJuIG1FKGUsIm92ZXJmbG93WCIpfSxtMD1mdW5jdGlvbihlLHQpe3ZhciBuPXQ7ZG97dHlwZW9mIFNoYWRvd1Jvb3Q8InUiJiZuIGluc3RhbmNlb2YgU2hhZG93Um9vdCYmKG49bi5ob3N0KTt2YXIgcj12RShlLG4pO2lmKHIpe3ZhciBvPXlFKGUsbiksaT1vWzFdLGw9b1syXTtpZihpPmwpcmV0dXJuITB9bj1uLnBhcmVudE5vZGV9d2hpbGUobiYmbiE9PWRvY3VtZW50LmJvZHkpO3JldHVybiExfSxVNT1mdW5jdGlvbihlKXt2YXIgdD1lLnNjcm9sbFRvcCxuPWUuc2Nyb2xsSGVpZ2h0LHI9ZS5jbGllbnRIZWlnaHQ7cmV0dXJuW3QsbixyXX0sVjU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zY3JvbGxMZWZ0LG49ZS5zY3JvbGxXaWR0aCxyPWUuY2xpZW50V2lkdGg7cmV0dXJuW3QsbixyXX0sdkU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PSJ2Ij9CNSh0KTpXNSh0KX0seUU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PSJ2Ij9VNSh0KTpWNSh0KX0sSDU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PSJoIiYmdD09PSJydGwiPy0xOjF9LEs1PWZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGk9SDUoZSx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KS5kaXJlY3Rpb24pLGw9aSpyLHM9bi50YXJnZXQsYT10LmNvbnRhaW5zKHMpLHU9ITEsYz1sPjAsZD0wLGY9MDtkb3t2YXIgaD15RShlLHMpLGc9aFswXSxtPWhbMV0sUz1oWzJdLHY9bS1TLWkqZzsoZ3x8dikmJnZFKGUscykmJihkKz12LGYrPWcpLHM9cy5wYXJlbnROb2RlfXdoaWxlKCFhJiZzIT09ZG9jdW1lbnQuYm9keXx8YSYmKHQuY29udGFpbnMocyl8fHQ9PT1zKSk7cmV0dXJuKGMmJihvJiZkPT09MHx8IW8mJmw+ZCl8fCFjJiYobyYmZj09PTB8fCFvJiYtbD5mKSkmJih1PSEwKSx1fSxfdT1mdW5jdGlvbihlKXtyZXR1cm4iY2hhbmdlZFRvdWNoZXMiaW4gZT9bZS5jaGFuZ2VkVG91Y2hlc1swXS5jbGllbnRYLGUuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WV06WzAsMF19LHYwPWZ1bmN0aW9uKGUpe3JldHVybltlLmRlbHRhWCxlLmRlbHRhWV19LHkwPWZ1bmN0aW9uKGUpe3JldHVybiBlJiYiY3VycmVudCJpbiBlP2UuY3VycmVudDplfSxHNT1mdW5jdGlvbihlLHQpe3JldHVybiBlWzBdPT09dFswXSYmZVsxXT09PXRbMV19LFk1PWZ1bmN0aW9uKGUpe3JldHVybmAKICAuYmxvY2staW50ZXJhY3Rpdml0eS1gLmNvbmNhdChlLGAge3BvaW50ZXItZXZlbnRzOiBub25lO30KICAuYWxsb3ctaW50ZXJhY3Rpdml0eS1gKS5jb25jYXQoZSxgIHtwb2ludGVyLWV2ZW50czogYWxsO30KYCl9LFg1PTAsRmk9W107ZnVuY3Rpb24gUTUoZSl7dmFyIHQ9cC51c2VSZWYoW10pLG49cC51c2VSZWYoWzAsMF0pLHI9cC51c2VSZWYoKSxvPXAudXNlU3RhdGUoWDUrKylbMF0saT1wLnVzZVN0YXRlKGZ1bmN0aW9uKCl7cmV0dXJuIGdFKCl9KVswXSxsPXAudXNlUmVmKGUpO3AudXNlRWZmZWN0KGZ1bmN0aW9uKCl7bC5jdXJyZW50PWV9LFtlXSkscC51c2VFZmZlY3QoZnVuY3Rpb24oKXtpZihlLmluZXJ0KXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoImJsb2NrLWludGVyYWN0aXZpdHktIi5jb25jYXQobykpO3ZhciBtPXk1KFtlLmxvY2tSZWYuY3VycmVudF0sKGUuc2hhcmRzfHxbXSkubWFwKHkwKSwhMCkuZmlsdGVyKEJvb2xlYW4pO3JldHVybiBtLmZvckVhY2goZnVuY3Rpb24oUyl7cmV0dXJuIFMuY2xhc3NMaXN0LmFkZCgiYWxsb3ctaW50ZXJhY3Rpdml0eS0iLmNvbmNhdChvKSl9KSxmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgiYmxvY2staW50ZXJhY3Rpdml0eS0iLmNvbmNhdChvKSksbS5mb3JFYWNoKGZ1bmN0aW9uKFMpe3JldHVybiBTLmNsYXNzTGlzdC5yZW1vdmUoImFsbG93LWludGVyYWN0aXZpdHktIi5jb25jYXQobykpfSl9fX0sW2UuaW5lcnQsZS5sb2NrUmVmLmN1cnJlbnQsZS5zaGFyZHNdKTt2YXIgcz1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKG0sUyl7aWYoInRvdWNoZXMiaW4gbSYmbS50b3VjaGVzLmxlbmd0aD09PTIpcmV0dXJuIWwuY3VycmVudC5hbGxvd1BpbmNoWm9vbTt2YXIgdj1fdShtKSx5PW4uY3VycmVudCx4PSJkZWx0YVgiaW4gbT9tLmRlbHRhWDp5WzBdLXZbMF0sXz0iZGVsdGFZImluIG0/bS5kZWx0YVk6eVsxXS12WzFdLEUsJD1tLnRhcmdldCxDPU1hdGguYWJzKHgpPk1hdGguYWJzKF8pPyJoIjoidiI7aWYoInRvdWNoZXMiaW4gbSYmQz09PSJoIiYmJC50eXBlPT09InJhbmdlIilyZXR1cm4hMTt2YXIgVD1tMChDLCQpO2lmKCFUKXJldHVybiEwO2lmKFQ/RT1DOihFPUM9PT0idiI/ImgiOiJ2IixUPW0wKEMsJCkpLCFUKXJldHVybiExO2lmKCFyLmN1cnJlbnQmJiJjaGFuZ2VkVG91Y2hlcyJpbiBtJiYoeHx8XykmJihyLmN1cnJlbnQ9RSksIUUpcmV0dXJuITA7dmFyIE09ci5jdXJyZW50fHxFO3JldHVybiBLNShNLFMsbSxNPT09ImgiP3g6XywhMCl9LFtdKSxhPXAudXNlQ2FsbGJhY2soZnVuY3Rpb24obSl7dmFyIFM9bTtpZighKCFGaS5sZW5ndGh8fEZpW0ZpLmxlbmd0aC0xXSE9PWkpKXt2YXIgdj0iZGVsdGFZImluIFM/djAoUyk6X3UoUykseT10LmN1cnJlbnQuZmlsdGVyKGZ1bmN0aW9uKEUpe3JldHVybiBFLm5hbWU9PT1TLnR5cGUmJkUudGFyZ2V0PT09Uy50YXJnZXQmJkc1KEUuZGVsdGEsdil9KVswXTtpZih5JiZ5LnNob3VsZCl7Uy5jYW5jZWxhYmxlJiZTLnByZXZlbnREZWZhdWx0KCk7cmV0dXJufWlmKCF5KXt2YXIgeD0obC5jdXJyZW50LnNoYXJkc3x8W10pLm1hcCh5MCkuZmlsdGVyKEJvb2xlYW4pLmZpbHRlcihmdW5jdGlvbihFKXtyZXR1cm4gRS5jb250YWlucyhTLnRhcmdldCl9KSxfPXgubGVuZ3RoPjA/cyhTLHhbMF0pOiFsLmN1cnJlbnQubm9Jc29sYXRpb247XyYmUy5jYW5jZWxhYmxlJiZTLnByZXZlbnREZWZhdWx0KCl9fX0sW10pLHU9cC51c2VDYWxsYmFjayhmdW5jdGlvbihtLFMsdix5KXt2YXIgeD17bmFtZTptLGRlbHRhOlMsdGFyZ2V0OnYsc2hvdWxkOnl9O3QuY3VycmVudC5wdXNoKHgpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LmN1cnJlbnQ9dC5jdXJyZW50LmZpbHRlcihmdW5jdGlvbihfKXtyZXR1cm4gXyE9PXh9KX0sMSl9LFtdKSxjPXAudXNlQ2FsbGJhY2soZnVuY3Rpb24obSl7bi5jdXJyZW50PV91KG0pLHIuY3VycmVudD12b2lkIDB9LFtdKSxkPXAudXNlQ2FsbGJhY2soZnVuY3Rpb24obSl7dShtLnR5cGUsdjAobSksbS50YXJnZXQscyhtLGUubG9ja1JlZi5jdXJyZW50KSl9LFtdKSxmPXAudXNlQ2FsbGJhY2soZnVuY3Rpb24obSl7dShtLnR5cGUsX3UobSksbS50YXJnZXQscyhtLGUubG9ja1JlZi5jdXJyZW50KSl9LFtdKTtwLnVzZUVmZmVjdChmdW5jdGlvbigpe3JldHVybiBGaS5wdXNoKGkpLGUuc2V0Q2FsbGJhY2tzKHtvblNjcm9sbENhcHR1cmU6ZCxvbldoZWVsQ2FwdHVyZTpkLG9uVG91Y2hNb3ZlQ2FwdHVyZTpmfSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGEsemkpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsYSx6aSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsYyx6aSksZnVuY3Rpb24oKXtGaT1GaS5maWx0ZXIoZnVuY3Rpb24obSl7cmV0dXJuIG0hPT1pfSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLGEsemkpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsYSx6aSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidG91Y2hzdGFydCIsYyx6aSl9fSxbXSk7dmFyIGg9ZS5yZW1vdmVTY3JvbGxCYXIsZz1lLmluZXJ0O3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLGc/cC5jcmVhdGVFbGVtZW50KGkse3N0eWxlczpZNShvKX0pOm51bGwsaD9wLmNyZWF0ZUVsZW1lbnQoejUse2dhcE1vZGU6Im1hcmdpbiJ9KTpudWxsKX1jb25zdCBKNT1UNShwRSxRNSk7dmFyIHhFPXAuZm9yd2FyZFJlZihmdW5jdGlvbihlLHQpe3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoU2QsY3Ioe30sZSx7cmVmOnQsc2lkZUNhcjpKNX0pKX0pO3hFLmNsYXNzTmFtZXM9U2QuY2xhc3NOYW1lcztjb25zdCBaNT14RSxxNT1bIiAiLCJFbnRlciIsIkFycm93VXAiLCJBcnJvd0Rvd24iXSxlQT1bIiAiLCJFbnRlciJdLEVkPSJTZWxlY3QiLFtDZCxfbSx0QV09SFMoRWQpLFtRbCxtNF09Q2koRWQsW3RBLGxFXSksd209bEUoKSxbbkEsYmldPVFsKEVkKSxbckEsb0FdPVFsKEVkKSxpQT1lPT57Y29uc3R7X19zY29wZVNlbGVjdDp0LGNoaWxkcmVuOm4sb3BlbjpyLGRlZmF1bHRPcGVuOm8sb25PcGVuQ2hhbmdlOmksdmFsdWU6bCxkZWZhdWx0VmFsdWU6cyxvblZhbHVlQ2hhbmdlOmEsZGlyOnUsbmFtZTpjLGF1dG9Db21wbGV0ZTpkLGRpc2FibGVkOmYscmVxdWlyZWQ6aH09ZSxnPXdtKHQpLFttLFNdPXAudXNlU3RhdGUobnVsbCksW3YseV09cC51c2VTdGF0ZShudWxsKSxbeCxfXT1wLnVzZVN0YXRlKCExKSxFPVRnKHUpLFskPSExLENdPWJsKHtwcm9wOnIsZGVmYXVsdFByb3A6byxvbkNoYW5nZTppfSksW1QsTV09Ymwoe3Byb3A6bCxkZWZhdWx0UHJvcDpzLG9uQ2hhbmdlOmF9KSxSPXAudXNlUmVmKG51bGwpLGo9bT8hIW0uY2xvc2VzdCgiZm9ybSIpOiEwLFtGLGFlXT1wLnVzZVN0YXRlKG5ldyBTZXQpLEg9QXJyYXkuZnJvbShGKS5tYXAoWD0+WC5wcm9wcy52YWx1ZSkuam9pbigiOyIpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoYTUsZyxwLmNyZWF0ZUVsZW1lbnQobkEse3JlcXVpcmVkOmgsc2NvcGU6dCx0cmlnZ2VyOm0sb25UcmlnZ2VyQ2hhbmdlOlMsdmFsdWVOb2RlOnYsb25WYWx1ZU5vZGVDaGFuZ2U6eSx2YWx1ZU5vZGVIYXNDaGlsZHJlbjp4LG9uVmFsdWVOb2RlSGFzQ2hpbGRyZW5DaGFuZ2U6Xyxjb250ZW50SWQ6eGQoKSx2YWx1ZTpULG9uVmFsdWVDaGFuZ2U6TSxvcGVuOiQsb25PcGVuQ2hhbmdlOkMsZGlyOkUsdHJpZ2dlclBvaW50ZXJEb3duUG9zUmVmOlIsZGlzYWJsZWQ6Zn0scC5jcmVhdGVFbGVtZW50KENkLlByb3ZpZGVyLHtzY29wZTp0fSxwLmNyZWF0ZUVsZW1lbnQockEse3Njb3BlOmUuX19zY29wZVNlbGVjdCxvbk5hdGl2ZU9wdGlvbkFkZDpwLnVzZUNhbGxiYWNrKFg9PnthZShQPT5uZXcgU2V0KFApLmFkZChYKSl9LFtdKSxvbk5hdGl2ZU9wdGlvblJlbW92ZTpwLnVzZUNhbGxiYWNrKFg9PnthZShQPT57Y29uc3QgTz1uZXcgU2V0KFApO3JldHVybiBPLmRlbGV0ZShYKSxPfSl9LFtdKX0sbikpLGo/cC5jcmVhdGVFbGVtZW50KEVFLHtrZXk6SCwiYXJpYS1oaWRkZW4iOiEwLHJlcXVpcmVkOmgsdGFiSW5kZXg6LTEsbmFtZTpjLGF1dG9Db21wbGV0ZTpkLHZhbHVlOlQsb25DaGFuZ2U6WD0+TShYLnRhcmdldC52YWx1ZSksZGlzYWJsZWQ6Zn0sVD09PXZvaWQgMD9wLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIse3ZhbHVlOiIifSk6bnVsbCxBcnJheS5mcm9tKEYpKTpudWxsKSl9LGxBPSJTZWxlY3RUcmlnZ2VyIixzQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sZGlzYWJsZWQ6cj0hMSwuLi5vfT1lLGk9d20obiksbD1iaShsQSxuKSxzPWwuZGlzYWJsZWR8fHIsYT1YZSh0LGwub25UcmlnZ2VyQ2hhbmdlKSx1PV9tKG4pLFtjLGQsZl09Q0UoZz0+e2NvbnN0IG09dSgpLmZpbHRlcih5PT4heS5kaXNhYmxlZCksUz1tLmZpbmQoeT0+eS52YWx1ZT09PWwudmFsdWUpLHY9JEUobSxnLFMpO3YhPT12b2lkIDAmJmwub25WYWx1ZUNoYW5nZSh2LnZhbHVlKX0pLGg9KCk9PntzfHwobC5vbk9wZW5DaGFuZ2UoITApLGYoKSl9O3JldHVybiBwLmNyZWF0ZUVsZW1lbnQodTUsZWUoe2FzQ2hpbGQ6ITB9LGkpLHAuY3JlYXRlRWxlbWVudChEZS5idXR0b24sZWUoe3R5cGU6ImJ1dHRvbiIscm9sZToiY29tYm9ib3giLCJhcmlhLWNvbnRyb2xzIjpsLmNvbnRlbnRJZCwiYXJpYS1leHBhbmRlZCI6bC5vcGVuLCJhcmlhLXJlcXVpcmVkIjpsLnJlcXVpcmVkLCJhcmlhLWF1dG9jb21wbGV0ZSI6Im5vbmUiLGRpcjpsLmRpciwiZGF0YS1zdGF0ZSI6bC5vcGVuPyJvcGVuIjoiY2xvc2VkIixkaXNhYmxlZDpzLCJkYXRhLWRpc2FibGVkIjpzPyIiOnZvaWQgMCwiZGF0YS1wbGFjZWhvbGRlciI6U0UobC52YWx1ZSk/IiI6dm9pZCAwfSxvLHtyZWY6YSxvbkNsaWNrOkhlKG8ub25DbGljayxnPT57Zy5jdXJyZW50VGFyZ2V0LmZvY3VzKCl9KSxvblBvaW50ZXJEb3duOkhlKG8ub25Qb2ludGVyRG93bixnPT57Y29uc3QgbT1nLnRhcmdldDttLmhhc1BvaW50ZXJDYXB0dXJlKGcucG9pbnRlcklkKSYmbS5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZy5wb2ludGVySWQpLGcuYnV0dG9uPT09MCYmZy5jdHJsS2V5PT09ITEmJihoKCksbC50cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWYuY3VycmVudD17eDpNYXRoLnJvdW5kKGcucGFnZVgpLHk6TWF0aC5yb3VuZChnLnBhZ2VZKX0sZy5wcmV2ZW50RGVmYXVsdCgpKX0pLG9uS2V5RG93bjpIZShvLm9uS2V5RG93bixnPT57Y29uc3QgbT1jLmN1cnJlbnQhPT0iIjshKGcuY3RybEtleXx8Zy5hbHRLZXl8fGcubWV0YUtleSkmJmcua2V5Lmxlbmd0aD09PTEmJmQoZy5rZXkpLCEobSYmZy5rZXk9PT0iICIpJiZxNS5pbmNsdWRlcyhnLmtleSkmJihoKCksZy5wcmV2ZW50RGVmYXVsdCgpKX0pfSkpKX0pLGFBPSJTZWxlY3RWYWx1ZSIsdUE9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLGNsYXNzTmFtZTpyLHN0eWxlOm8sY2hpbGRyZW46aSxwbGFjZWhvbGRlcjpsPSIiLC4uLnN9PWUsYT1iaShhQSxuKSx7b25WYWx1ZU5vZGVIYXNDaGlsZHJlbkNoYW5nZTp1fT1hLGM9aSE9PXZvaWQgMCxkPVhlKHQsYS5vblZhbHVlTm9kZUNoYW5nZSk7cmV0dXJuICRuKCgpPT57dShjKX0sW3UsY10pLHAuY3JlYXRlRWxlbWVudChEZS5zcGFuLGVlKHt9LHMse3JlZjpkLHN0eWxlOntwb2ludGVyRXZlbnRzOiJub25lIn19KSxTRShhLnZhbHVlKT9wLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLGwpOmkpfSksY0E9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLGNoaWxkcmVuOnIsLi4ub309ZTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KERlLnNwYW4sZWUoeyJhcmlhLWhpZGRlbiI6ITB9LG8se3JlZjp0fSkscnx8IuKWvCIpfSksZEE9ZT0+cC5jcmVhdGVFbGVtZW50KGQ1LGVlKHthc0NoaWxkOiEwfSxlKSksUmw9IlNlbGVjdENvbnRlbnQiLGZBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0IG49YmkoUmwsZS5fX3Njb3BlU2VsZWN0KSxbcixvXT1wLnVzZVN0YXRlKCk7aWYoJG4oKCk9PntvKG5ldyBEb2N1bWVudEZyYWdtZW50KX0sW10pLCFuLm9wZW4pe2NvbnN0IGk9cjtyZXR1cm4gaT9Ici5jcmVhdGVQb3J0YWwocC5jcmVhdGVFbGVtZW50KF9FLHtzY29wZTplLl9fc2NvcGVTZWxlY3R9LHAuY3JlYXRlRWxlbWVudChDZC5TbG90LHtzY29wZTplLl9fc2NvcGVTZWxlY3R9LHAuY3JlYXRlRWxlbWVudCgiZGl2IixudWxsLGUuY2hpbGRyZW4pKSksaSk6bnVsbH1yZXR1cm4gcC5jcmVhdGVFbGVtZW50KGhBLGVlKHt9LGUse3JlZjp0fSkpfSksUnI9MTAsW19FLCRkXT1RbChSbCksaEE9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLHBvc2l0aW9uOnI9Iml0ZW0tYWxpZ25lZCIsb25DbG9zZUF1dG9Gb2N1czpvLG9uRXNjYXBlS2V5RG93bjppLG9uUG9pbnRlckRvd25PdXRzaWRlOmwsc2lkZTpzLHNpZGVPZmZzZXQ6YSxhbGlnbjp1LGFsaWduT2Zmc2V0OmMsYXJyb3dQYWRkaW5nOmQsY29sbGlzaW9uQm91bmRhcnk6Zixjb2xsaXNpb25QYWRkaW5nOmgsc3RpY2t5OmcsaGlkZVdoZW5EZXRhY2hlZDptLGF2b2lkQ29sbGlzaW9uczpTLC4uLnZ9PWUseT1iaShSbCxuKSxbeCxfXT1wLnVzZVN0YXRlKG51bGwpLFtFLCRdPXAudXNlU3RhdGUobnVsbCksQz1YZSh0LFo9Pl8oWikpLFtULE1dPXAudXNlU3RhdGUobnVsbCksW1Isal09cC51c2VTdGF0ZShudWxsKSxGPV9tKG4pLFthZSxIXT1wLnVzZVN0YXRlKCExKSxYPXAudXNlUmVmKCExKTtwLnVzZUVmZmVjdCgoKT0+e2lmKHgpcmV0dXJuIHY1KHgpfSxbeF0pLHNPKCk7Y29uc3QgUD1wLnVzZUNhbGxiYWNrKFo9Pntjb25zdFtrZSwuLi5jZV09RigpLm1hcCgkZT0+JGUucmVmLmN1cnJlbnQpLFtfZV09Y2Uuc2xpY2UoLTEpLG1lPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7Zm9yKGNvbnN0ICRlIG9mIFopaWYoJGU9PT1tZXx8KCRlPT1udWxsfHwkZS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6Im5lYXJlc3QifSksJGU9PT1rZSYmRSYmKEUuc2Nyb2xsVG9wPTApLCRlPT09X2UmJkUmJihFLnNjcm9sbFRvcD1FLnNjcm9sbEhlaWdodCksJGU9PW51bGx8fCRlLmZvY3VzKCksZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PW1lKSlyZXR1cm59LFtGLEVdKSxPPXAudXNlQ2FsbGJhY2soKCk9PlAoW1QseF0pLFtQLFQseF0pO3AudXNlRWZmZWN0KCgpPT57YWUmJk8oKX0sW2FlLE9dKTtjb25zdHtvbk9wZW5DaGFuZ2U6ayx0cmlnZ2VyUG9pbnRlckRvd25Qb3NSZWY6SX09eTtwLnVzZUVmZmVjdCgoKT0+e2lmKHgpe2xldCBaPXt4OjAseTowfTtjb25zdCBrZT1fZT0+e3ZhciBtZSwkZSxCZSxQdDtaPXt4Ok1hdGguYWJzKE1hdGgucm91bmQoX2UucGFnZVgpLSgobWU9KCRlPUkuY3VycmVudCk9PT1udWxsfHwkZT09PXZvaWQgMD92b2lkIDA6JGUueCkhPT1udWxsJiZtZSE9PXZvaWQgMD9tZTowKSkseTpNYXRoLmFicyhNYXRoLnJvdW5kKF9lLnBhZ2VZKS0oKEJlPShQdD1JLmN1cnJlbnQpPT09bnVsbHx8UHQ9PT12b2lkIDA/dm9pZCAwOlB0LnkpIT09bnVsbCYmQmUhPT12b2lkIDA/QmU6MCkpfX0sY2U9X2U9PntaLng8PTEwJiZaLnk8PTEwP19lLnByZXZlbnREZWZhdWx0KCk6eC5jb250YWlucyhfZS50YXJnZXQpfHxrKCExKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsa2UpLEkuY3VycmVudD1udWxsfTtyZXR1cm4gSS5jdXJyZW50IT09bnVsbCYmKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixrZSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIixjZSx7Y2FwdHVyZTohMCxvbmNlOiEwfSkpLCgpPT57ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLGtlKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVydXAiLGNlLHtjYXB0dXJlOiEwfSl9fX0sW3gsayxJXSkscC51c2VFZmZlY3QoKCk9Pntjb25zdCBaPSgpPT5rKCExKTtyZXR1cm4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLFopLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLFopLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImJsdXIiLFopLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLFopfX0sW2tdKTtjb25zdFtMLFZdPUNFKFo9Pntjb25zdCBrZT1GKCkuZmlsdGVyKG1lPT4hbWUuZGlzYWJsZWQpLGNlPWtlLmZpbmQobWU9Pm1lLnJlZi5jdXJyZW50PT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCksX2U9JEUoa2UsWixjZSk7X2UmJnNldFRpbWVvdXQoKCk9Pl9lLnJlZi5jdXJyZW50LmZvY3VzKCkpfSksdGU9cC51c2VDYWxsYmFjaygoWixrZSxjZSk9Pntjb25zdCBfZT0hWC5jdXJyZW50JiYhY2U7KHkudmFsdWUhPT12b2lkIDAmJnkudmFsdWU9PT1rZXx8X2UpJiYoTShaKSxfZSYmKFguY3VycmVudD0hMCkpfSxbeS52YWx1ZV0pLHllPXAudXNlQ2FsbGJhY2soKCk9Png9PW51bGw/dm9pZCAwOnguZm9jdXMoKSxbeF0pLGZlPXAudXNlQ2FsbGJhY2soKFosa2UsY2UpPT57Y29uc3QgX2U9IVguY3VycmVudCYmIWNlOyh5LnZhbHVlIT09dm9pZCAwJiZ5LnZhbHVlPT09a2V8fF9lKSYmaihaKX0sW3kudmFsdWVdKSxPZT1yPT09InBvcHBlciI/eDA6cEEsYmU9T2U9PT14MD97c2lkZTpzLHNpZGVPZmZzZXQ6YSxhbGlnbjp1LGFsaWduT2Zmc2V0OmMsYXJyb3dQYWRkaW5nOmQsY29sbGlzaW9uQm91bmRhcnk6Zixjb2xsaXNpb25QYWRkaW5nOmgsc3RpY2t5OmcsaGlkZVdoZW5EZXRhY2hlZDptLGF2b2lkQ29sbGlzaW9uczpTfTp7fTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KF9FLHtzY29wZTpuLGNvbnRlbnQ6eCx2aWV3cG9ydDpFLG9uVmlld3BvcnRDaGFuZ2U6JCxpdGVtUmVmQ2FsbGJhY2s6dGUsc2VsZWN0ZWRJdGVtOlQsb25JdGVtTGVhdmU6eWUsaXRlbVRleHRSZWZDYWxsYmFjazpmZSxmb2N1c1NlbGVjdGVkSXRlbTpPLHNlbGVjdGVkSXRlbVRleHQ6Uixwb3NpdGlvbjpyLGlzUG9zaXRpb25lZDphZSxzZWFyY2hSZWY6TH0scC5jcmVhdGVFbGVtZW50KFo1LHthczpFbCxhbGxvd1BpbmNoWm9vbTohMH0scC5jcmVhdGVFbGVtZW50KGFPLHthc0NoaWxkOiEwLHRyYXBwZWQ6eS5vcGVuLG9uTW91bnRBdXRvRm9jdXM6Wj0+e1oucHJldmVudERlZmF1bHQoKX0sb25Vbm1vdW50QXV0b0ZvY3VzOkhlKG8sWj0+e3ZhciBrZTsoa2U9eS50cmlnZ2VyKT09PW51bGx8fGtlPT09dm9pZCAwfHxrZS5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLFoucHJldmVudERlZmF1bHQoKX0pfSxwLmNyZWF0ZUVsZW1lbnQob08se2FzQ2hpbGQ6ITAsZGlzYWJsZU91dHNpZGVQb2ludGVyRXZlbnRzOiEwLG9uRXNjYXBlS2V5RG93bjppLG9uUG9pbnRlckRvd25PdXRzaWRlOmwsb25Gb2N1c091dHNpZGU6Wj0+Wi5wcmV2ZW50RGVmYXVsdCgpLG9uRGlzbWlzczooKT0+eS5vbk9wZW5DaGFuZ2UoITEpfSxwLmNyZWF0ZUVsZW1lbnQoT2UsZWUoe3JvbGU6Imxpc3Rib3giLGlkOnkuY29udGVudElkLCJkYXRhLXN0YXRlIjp5Lm9wZW4/Im9wZW4iOiJjbG9zZWQiLGRpcjp5LmRpcixvbkNvbnRleHRNZW51Olo9PloucHJldmVudERlZmF1bHQoKX0sdixiZSx7b25QbGFjZWQ6KCk9PkgoITApLHJlZjpDLHN0eWxlOntkaXNwbGF5OiJmbGV4IixmbGV4RGlyZWN0aW9uOiJjb2x1bW4iLG91dGxpbmU6Im5vbmUiLC4uLnYuc3R5bGV9LG9uS2V5RG93bjpIZSh2Lm9uS2V5RG93bixaPT57Y29uc3Qga2U9Wi5jdHJsS2V5fHxaLmFsdEtleXx8Wi5tZXRhS2V5O2lmKFoua2V5PT09IlRhYiImJloucHJldmVudERlZmF1bHQoKSwha2UmJloua2V5Lmxlbmd0aD09PTEmJlYoWi5rZXkpLFsiQXJyb3dVcCIsIkFycm93RG93biIsIkhvbWUiLCJFbmQiXS5pbmNsdWRlcyhaLmtleSkpe2xldCBfZT1GKCkuZmlsdGVyKG1lPT4hbWUuZGlzYWJsZWQpLm1hcChtZT0+bWUucmVmLmN1cnJlbnQpO2lmKFsiQXJyb3dVcCIsIkVuZCJdLmluY2x1ZGVzKFoua2V5KSYmKF9lPV9lLnNsaWNlKCkucmV2ZXJzZSgpKSxbIkFycm93VXAiLCJBcnJvd0Rvd24iXS5pbmNsdWRlcyhaLmtleSkpe2NvbnN0IG1lPVoudGFyZ2V0LCRlPV9lLmluZGV4T2YobWUpO19lPV9lLnNsaWNlKCRlKzEpfXNldFRpbWVvdXQoKCk9PlAoX2UpKSxaLnByZXZlbnREZWZhdWx0KCl9fSl9KSkpKSkpfSkscEE9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLG9uUGxhY2VkOnIsLi4ub309ZSxpPWJpKFJsLG4pLGw9JGQoUmwsbiksW3MsYV09cC51c2VTdGF0ZShudWxsKSxbdSxjXT1wLnVzZVN0YXRlKG51bGwpLGQ9WGUodCxDPT5jKEMpKSxmPV9tKG4pLGg9cC51c2VSZWYoITEpLGc9cC51c2VSZWYoITApLHt2aWV3cG9ydDptLHNlbGVjdGVkSXRlbTpTLHNlbGVjdGVkSXRlbVRleHQ6dixmb2N1c1NlbGVjdGVkSXRlbTp5fT1sLHg9cC51c2VDYWxsYmFjaygoKT0+e2lmKGkudHJpZ2dlciYmaS52YWx1ZU5vZGUmJnMmJnUmJm0mJlMmJnYpe2NvbnN0IEM9aS50cmlnZ2VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFQ9dS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxNPWkudmFsdWVOb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLFI9di5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZihpLmRpciE9PSJydGwiKXtjb25zdCBtZT1SLmxlZnQtVC5sZWZ0LCRlPU0ubGVmdC1tZSxCZT1DLmxlZnQtJGUsUHQ9Qy53aWR0aCtCZSxzbj1NYXRoLm1heChQdCxULndpZHRoKSxibj13aW5kb3cuaW5uZXJXaWR0aC1ScixUZT1BaCgkZSxbUnIsYm4tc25dKTtzLnN0eWxlLm1pbldpZHRoPVB0KyJweCIscy5zdHlsZS5sZWZ0PVRlKyJweCJ9ZWxzZXtjb25zdCBtZT1ULnJpZ2h0LVIucmlnaHQsJGU9d2luZG93LmlubmVyV2lkdGgtTS5yaWdodC1tZSxCZT13aW5kb3cuaW5uZXJXaWR0aC1DLnJpZ2h0LSRlLFB0PUMud2lkdGgrQmUsc249TWF0aC5tYXgoUHQsVC53aWR0aCksYm49d2luZG93LmlubmVyV2lkdGgtUnIsVGU9QWgoJGUsW1JyLGJuLXNuXSk7cy5zdHlsZS5taW5XaWR0aD1QdCsicHgiLHMuc3R5bGUucmlnaHQ9VGUrInB4In1jb25zdCBqPWYoKSxGPXdpbmRvdy5pbm5lckhlaWdodC1ScioyLGFlPW0uc2Nyb2xsSGVpZ2h0LEg9d2luZG93LmdldENvbXB1dGVkU3R5bGUodSksWD1wYXJzZUludChILmJvcmRlclRvcFdpZHRoLDEwKSxQPXBhcnNlSW50KEgucGFkZGluZ1RvcCwxMCksTz1wYXJzZUludChILmJvcmRlckJvdHRvbVdpZHRoLDEwKSxrPXBhcnNlSW50KEgucGFkZGluZ0JvdHRvbSwxMCksST1YK1ArYWUraytPLEw9TWF0aC5taW4oUy5vZmZzZXRIZWlnaHQqNSxJKSxWPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG0pLHRlPXBhcnNlSW50KFYucGFkZGluZ1RvcCwxMCkseWU9cGFyc2VJbnQoVi5wYWRkaW5nQm90dG9tLDEwKSxmZT1DLnRvcCtDLmhlaWdodC8yLVJyLE9lPUYtZmUsYmU9Uy5vZmZzZXRIZWlnaHQvMixaPVMub2Zmc2V0VG9wK2JlLGtlPVgrUCtaLGNlPUkta2U7aWYoa2U8PWZlKXtjb25zdCBtZT1TPT09altqLmxlbmd0aC0xXS5yZWYuY3VycmVudDtzLnN0eWxlLmJvdHRvbT0iMHB4Ijtjb25zdCAkZT11LmNsaWVudEhlaWdodC1tLm9mZnNldFRvcC1tLm9mZnNldEhlaWdodCxCZT1NYXRoLm1heChPZSxiZSsobWU/eWU6MCkrJGUrTyksUHQ9a2UrQmU7cy5zdHlsZS5oZWlnaHQ9UHQrInB4In1lbHNle2NvbnN0IG1lPVM9PT1qWzBdLnJlZi5jdXJyZW50O3Muc3R5bGUudG9wPSIwcHgiO2NvbnN0IEJlPU1hdGgubWF4KGZlLFgrbS5vZmZzZXRUb3ArKG1lP3RlOjApK2JlKStjZTtzLnN0eWxlLmhlaWdodD1CZSsicHgiLG0uc2Nyb2xsVG9wPWtlLWZlK20ub2Zmc2V0VG9wfXMuc3R5bGUubWFyZ2luPWAke1JyfXB4IDBgLHMuc3R5bGUubWluSGVpZ2h0PUwrInB4IixzLnN0eWxlLm1heEhlaWdodD1GKyJweCIscj09bnVsbHx8cigpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+aC5jdXJyZW50PSEwKX19LFtmLGkudHJpZ2dlcixpLnZhbHVlTm9kZSxzLHUsbSxTLHYsaS5kaXIscl0pOyRuKCgpPT54KCksW3hdKTtjb25zdFtfLEVdPXAudXNlU3RhdGUoKTskbigoKT0+e3UmJkUod2luZG93LmdldENvbXB1dGVkU3R5bGUodSkuekluZGV4KX0sW3VdKTtjb25zdCAkPXAudXNlQ2FsbGJhY2soQz0+e0MmJmcuY3VycmVudD09PSEwJiYoeCgpLHk9PW51bGx8fHkoKSxnLmN1cnJlbnQ9ITEpfSxbeCx5XSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChnQSx7c2NvcGU6bixjb250ZW50V3JhcHBlcjpzLHNob3VsZEV4cGFuZE9uU2Nyb2xsUmVmOmgsb25TY3JvbGxCdXR0b25DaGFuZ2U6JH0scC5jcmVhdGVFbGVtZW50KCJkaXYiLHtyZWY6YSxzdHlsZTp7ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixwb3NpdGlvbjoiZml4ZWQiLHpJbmRleDpffX0scC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7fSxvLHtyZWY6ZCxzdHlsZTp7Ym94U2l6aW5nOiJib3JkZXItYm94IixtYXhIZWlnaHQ6IjEwMCUiLC4uLm8uc3R5bGV9fSkpKSl9KSx4MD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sYWxpZ246cj0ic3RhcnQiLGNvbGxpc2lvblBhZGRpbmc6bz1SciwuLi5pfT1lLGw9d20obik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChjNSxlZSh7fSxsLGkse3JlZjp0LGFsaWduOnIsY29sbGlzaW9uUGFkZGluZzpvLHN0eWxlOntib3hTaXppbmc6ImJvcmRlci1ib3giLC4uLmkuc3R5bGUsIi0tcmFkaXgtc2VsZWN0LWNvbnRlbnQtdHJhbnNmb3JtLW9yaWdpbiI6InZhcigtLXJhZGl4LXBvcHBlci10cmFuc2Zvcm0tb3JpZ2luKSIsIi0tcmFkaXgtc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLXdpZHRoIjoidmFyKC0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS13aWR0aCkiLCItLXJhZGl4LXNlbGVjdC1jb250ZW50LWF2YWlsYWJsZS1oZWlnaHQiOiJ2YXIoLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLWhlaWdodCkiLCItLXJhZGl4LXNlbGVjdC10cmlnZ2VyLXdpZHRoIjoidmFyKC0tcmFkaXgtcG9wcGVyLWFuY2hvci13aWR0aCkiLCItLXJhZGl4LXNlbGVjdC10cmlnZ2VyLWhlaWdodCI6InZhcigtLXJhZGl4LXBvcHBlci1hbmNob3ItaGVpZ2h0KSJ9fSkpfSksW2dBLG1BXT1RbChSbCx7fSksXzA9IlNlbGVjdFZpZXdwb3J0Iix2QT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sLi4ucn09ZSxvPSRkKF8wLG4pLGk9bUEoXzAsbiksbD1YZSh0LG8ub25WaWV3cG9ydENoYW5nZSkscz1wLnVzZVJlZigwKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoInN0eWxlIix7ZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6e19faHRtbDoiW2RhdGEtcmFkaXgtc2VsZWN0LXZpZXdwb3J0XXtzY3JvbGxiYXItd2lkdGg6bm9uZTstbXMtb3ZlcmZsb3ctc3R5bGU6bm9uZTstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaDt9W2RhdGEtcmFkaXgtc2VsZWN0LXZpZXdwb3J0XTo6LXdlYmtpdC1zY3JvbGxiYXJ7ZGlzcGxheTpub25lfSJ9fSkscC5jcmVhdGVFbGVtZW50KENkLlNsb3Qse3Njb3BlOm59LHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoeyJkYXRhLXJhZGl4LXNlbGVjdC12aWV3cG9ydCI6IiIscm9sZToicHJlc2VudGF0aW9uIn0scix7cmVmOmwsc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsZmxleDoxLG92ZXJmbG93OiJhdXRvIiwuLi5yLnN0eWxlfSxvblNjcm9sbDpIZShyLm9uU2Nyb2xsLGE9Pntjb25zdCB1PWEuY3VycmVudFRhcmdldCx7Y29udGVudFdyYXBwZXI6YyxzaG91bGRFeHBhbmRPblNjcm9sbFJlZjpkfT1pO2lmKGQhPW51bGwmJmQuY3VycmVudCYmYyl7Y29uc3QgZj1NYXRoLmFicyhzLmN1cnJlbnQtdS5zY3JvbGxUb3ApO2lmKGY+MCl7Y29uc3QgaD13aW5kb3cuaW5uZXJIZWlnaHQtUnIqMixnPXBhcnNlRmxvYXQoYy5zdHlsZS5taW5IZWlnaHQpLG09cGFyc2VGbG9hdChjLnN0eWxlLmhlaWdodCksUz1NYXRoLm1heChnLG0pO2lmKFM8aCl7Y29uc3Qgdj1TK2YseT1NYXRoLm1pbihoLHYpLHg9di15O2Muc3R5bGUuaGVpZ2h0PXkrInB4IixjLnN0eWxlLmJvdHRvbT09PSIwcHgiJiYodS5zY3JvbGxUb3A9eD4wP3g6MCxjLnN0eWxlLmp1c3RpZnlDb250ZW50PSJmbGV4LWVuZCIpfX19cy5jdXJyZW50PXUuc2Nyb2xsVG9wfSl9KSkpKX0pLHlBPSJTZWxlY3RHcm91cCIsW3Y0LHhBXT1RbCh5QSksX0E9IlNlbGVjdExhYmVsIix3QT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sLi4ucn09ZSxvPXhBKF9BLG4pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHtpZDpvLmlkfSxyLHtyZWY6dH0pKX0pLHdwPSJTZWxlY3RJdGVtIixbU0Esd0VdPVFsKHdwKSxFQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sdmFsdWU6cixkaXNhYmxlZDpvPSExLHRleHRWYWx1ZTppLC4uLmx9PWUscz1iaSh3cCxuKSxhPSRkKHdwLG4pLHU9cy52YWx1ZT09PXIsW2MsZF09cC51c2VTdGF0ZShpPz8iIiksW2YsaF09cC51c2VTdGF0ZSghMSksZz1YZSh0LHY9Pnt2YXIgeTtyZXR1cm4oeT1hLml0ZW1SZWZDYWxsYmFjayk9PT1udWxsfHx5PT09dm9pZCAwP3ZvaWQgMDp5LmNhbGwoYSx2LHIsbyl9KSxtPXhkKCksUz0oKT0+e298fChzLm9uVmFsdWVDaGFuZ2Uocikscy5vbk9wZW5DaGFuZ2UoITEpKX07aWYocj09PSIiKXRocm93IG5ldyBFcnJvcigiQSA8U2VsZWN0Lkl0ZW0gLz4gbXVzdCBoYXZlIGEgdmFsdWUgcHJvcCB0aGF0IGlzIG5vdCBhbiBlbXB0eSBzdHJpbmcuIFRoaXMgaXMgYmVjYXVzZSB0aGUgU2VsZWN0IHZhbHVlIGNhbiBiZSBzZXQgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIGNsZWFyIHRoZSBzZWxlY3Rpb24gYW5kIHNob3cgdGhlIHBsYWNlaG9sZGVyLiIpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoU0Ese3Njb3BlOm4sdmFsdWU6cixkaXNhYmxlZDpvLHRleHRJZDptLGlzU2VsZWN0ZWQ6dSxvbkl0ZW1UZXh0Q2hhbmdlOnAudXNlQ2FsbGJhY2sodj0+e2QoeT0+e3ZhciB4O3JldHVybiB5fHwoKHg9dj09bnVsbD92b2lkIDA6di50ZXh0Q29udGVudCkhPT1udWxsJiZ4IT09dm9pZCAwP3g6IiIpLnRyaW0oKX0pfSxbXSl9LHAuY3JlYXRlRWxlbWVudChDZC5JdGVtU2xvdCx7c2NvcGU6bix2YWx1ZTpyLGRpc2FibGVkOm8sdGV4dFZhbHVlOmN9LHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoe3JvbGU6Im9wdGlvbiIsImFyaWEtbGFiZWxsZWRieSI6bSwiZGF0YS1oaWdobGlnaHRlZCI6Zj8iIjp2b2lkIDAsImFyaWEtc2VsZWN0ZWQiOnUmJmYsImRhdGEtc3RhdGUiOnU/ImNoZWNrZWQiOiJ1bmNoZWNrZWQiLCJhcmlhLWRpc2FibGVkIjpvfHx2b2lkIDAsImRhdGEtZGlzYWJsZWQiOm8/IiI6dm9pZCAwLHRhYkluZGV4Om8/dm9pZCAwOi0xfSxsLHtyZWY6ZyxvbkZvY3VzOkhlKGwub25Gb2N1cywoKT0+aCghMCkpLG9uQmx1cjpIZShsLm9uQmx1ciwoKT0+aCghMSkpLG9uUG9pbnRlclVwOkhlKGwub25Qb2ludGVyVXAsUyksb25Qb2ludGVyTW92ZTpIZShsLm9uUG9pbnRlck1vdmUsdj0+e2lmKG8pe3ZhciB5Oyh5PWEub25JdGVtTGVhdmUpPT09bnVsbHx8eT09PXZvaWQgMHx8eS5jYWxsKGEpfWVsc2Ugdi5jdXJyZW50VGFyZ2V0LmZvY3VzKHtwcmV2ZW50U2Nyb2xsOiEwfSl9KSxvblBvaW50ZXJMZWF2ZTpIZShsLm9uUG9pbnRlckxlYXZlLHY9PntpZih2LmN1cnJlbnRUYXJnZXQ9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50KXt2YXIgeTsoeT1hLm9uSXRlbUxlYXZlKT09PW51bGx8fHk9PT12b2lkIDB8fHkuY2FsbChhKX19KSxvbktleURvd246SGUobC5vbktleURvd24sdj0+e3ZhciB5OygoeT1hLnNlYXJjaFJlZik9PT1udWxsfHx5PT09dm9pZCAwP3ZvaWQgMDp5LmN1cnJlbnQpIT09IiImJnYua2V5PT09IiAifHwoZUEuaW5jbHVkZXModi5rZXkpJiZTKCksdi5rZXk9PT0iICImJnYucHJldmVudERlZmF1bHQoKSl9KX0pKSkpfSksd3U9IlNlbGVjdEl0ZW1UZXh0IixDQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sY2xhc3NOYW1lOnIsc3R5bGU6bywuLi5pfT1lLGw9Ymkod3Usbikscz0kZCh3dSxuKSxhPXdFKHd1LG4pLHU9b0Eod3UsbiksW2MsZF09cC51c2VTdGF0ZShudWxsKSxmPVhlKHQsdj0+ZCh2KSxhLm9uSXRlbVRleHRDaGFuZ2Usdj0+e3ZhciB5O3JldHVybih5PXMuaXRlbVRleHRSZWZDYWxsYmFjayk9PT1udWxsfHx5PT09dm9pZCAwP3ZvaWQgMDp5LmNhbGwocyx2LGEudmFsdWUsYS5kaXNhYmxlZCl9KSxoPWM9PW51bGw/dm9pZCAwOmMudGV4dENvbnRlbnQsZz1wLnVzZU1lbW8oKCk9PnAuY3JlYXRlRWxlbWVudCgib3B0aW9uIix7a2V5OmEudmFsdWUsdmFsdWU6YS52YWx1ZSxkaXNhYmxlZDphLmRpc2FibGVkfSxoKSxbYS5kaXNhYmxlZCxhLnZhbHVlLGhdKSx7b25OYXRpdmVPcHRpb25BZGQ6bSxvbk5hdGl2ZU9wdGlvblJlbW92ZTpTfT11O3JldHVybiAkbigoKT0+KG0oZyksKCk9PlMoZykpLFttLFMsZ10pLHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KERlLnNwYW4sZWUoe2lkOmEudGV4dElkfSxpLHtyZWY6Zn0pKSxhLmlzU2VsZWN0ZWQmJmwudmFsdWVOb2RlJiYhbC52YWx1ZU5vZGVIYXNDaGlsZHJlbj9Ici5jcmVhdGVQb3J0YWwoaS5jaGlsZHJlbixsLnZhbHVlTm9kZSk6bnVsbCl9KSwkQT0iU2VsZWN0SXRlbUluZGljYXRvciIsa0E9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLC4uLnJ9PWU7cmV0dXJuIHdFKCRBLG4pLmlzU2VsZWN0ZWQ/cC5jcmVhdGVFbGVtZW50KERlLnNwYW4sZWUoeyJhcmlhLWhpZGRlbiI6ITB9LHIse3JlZjp0fSkpOm51bGx9KSxUQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2VsZWN0Om4sLi4ucn09ZTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7ImFyaWEtaGlkZGVuIjohMH0scix7cmVmOnR9KSl9KTtmdW5jdGlvbiBTRShlKXtyZXR1cm4gZT09PSIifHxlPT09dm9pZCAwfWNvbnN0IEVFPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e3ZhbHVlOm4sLi4ucn09ZSxvPXAudXNlUmVmKG51bGwpLGk9WGUodCxvKSxsPWNFKG4pO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHM9by5jdXJyZW50LGE9d2luZG93LkhUTUxTZWxlY3RFbGVtZW50LnByb3RvdHlwZSxjPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSwidmFsdWUiKS5zZXQ7aWYobCE9PW4mJmMpe2NvbnN0IGQ9bmV3IEV2ZW50KCJjaGFuZ2UiLHtidWJibGVzOiEwfSk7Yy5jYWxsKHMsbikscy5kaXNwYXRjaEV2ZW50KGQpfX0sW2wsbl0pLHAuY3JlYXRlRWxlbWVudChoNSx7YXNDaGlsZDohMH0scC5jcmVhdGVFbGVtZW50KCJzZWxlY3QiLGVlKHt9LHIse3JlZjppLGRlZmF1bHRWYWx1ZTpufSkpKX0pO0VFLmRpc3BsYXlOYW1lPSJCdWJibGVTZWxlY3QiO2Z1bmN0aW9uIENFKGUpe2NvbnN0IHQ9VnQoZSksbj1wLnVzZVJlZigiIikscj1wLnVzZVJlZigwKSxvPXAudXNlQ2FsbGJhY2sobD0+e2NvbnN0IHM9bi5jdXJyZW50K2w7dChzKSxmdW5jdGlvbiBhKHUpe24uY3VycmVudD11LHdpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KSx1IT09IiImJihyLmN1cnJlbnQ9d2luZG93LnNldFRpbWVvdXQoKCk9PmEoIiIpLDFlMykpfShzKX0sW3RdKSxpPXAudXNlQ2FsbGJhY2soKCk9PntuLmN1cnJlbnQ9IiIsd2luZG93LmNsZWFyVGltZW91dChyLmN1cnJlbnQpfSxbXSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4oKT0+d2luZG93LmNsZWFyVGltZW91dChyLmN1cnJlbnQpLFtdKSxbbixvLGldfWZ1bmN0aW9uICRFKGUsdCxuKXtjb25zdCBvPXQubGVuZ3RoPjEmJkFycmF5LmZyb20odCkuZXZlcnkodT0+dT09PXRbMF0pP3RbMF06dCxpPW4/ZS5pbmRleE9mKG4pOi0xO2xldCBsPU5BKGUsTWF0aC5tYXgoaSwwKSk7by5sZW5ndGg9PT0xJiYobD1sLmZpbHRlcih1PT51IT09bikpO2NvbnN0IGE9bC5maW5kKHU9PnUudGV4dFZhbHVlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChvLnRvTG93ZXJDYXNlKCkpKTtyZXR1cm4gYSE9PW4/YTp2b2lkIDB9ZnVuY3Rpb24gTkEoZSx0KXtyZXR1cm4gZS5tYXAoKG4scik9PmVbKHQrciklZS5sZW5ndGhdKX1jb25zdCBiQT1pQSxrRT1zQSxSQT11QSxQQT1jQSxPQT1kQSxURT1mQSxBQT12QSxORT13QSxiRT1FQSxNQT1DQSxEQT1rQSxSRT1UQSxMQT1iQSxJQT1SQSxQRT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxjaGlsZHJlbjp0LC4uLm59LHIpPT53LmpzeHMoa0Use3JlZjpyLGNsYXNzTmFtZTpvdCgiZmxleCBoLTEwIHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTMgcHktMiB0ZXh0LXNtIHJpbmctb2Zmc2V0LWJhY2tncm91bmQgcGxhY2Vob2xkZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1yaW5nIGZvY3VzOnJpbmctb2Zmc2V0LTIgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAiLGUpLC4uLm4sY2hpbGRyZW46W3Qsdy5qc3goUEEse2FzQ2hpbGQ6ITAsY2hpbGRyZW46dy5qc3goTVMse2NsYXNzTmFtZToidy00IGgtNCBvcGFjaXR5LTUwIn0pfSldfSkpO1BFLmRpc3BsYXlOYW1lPWtFLmRpc3BsYXlOYW1lO2NvbnN0IE9FPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQscG9zaXRpb246bj0icG9wcGVyIiwuLi5yfSxvKT0+dy5qc3goT0Ese2NoaWxkcmVuOncuanN4KFRFLHtyZWY6byxjbGFzc05hbWU6b3QoInJlbGF0aXZlIHotNTAgbWluLXctWzhyZW1dIG92ZXJmbG93LWhpZGRlbiByb3VuZGVkLW1kIGJvcmRlciBiZy1wb3BvdmVyIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIHNoYWRvdy1tZCBkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluIGRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXQgZGF0YS1bc3RhdGU9Y2xvc2VkXTpmYWRlLW91dC0wIGRhdGEtW3N0YXRlPW9wZW5dOmZhZGUtaW4tMCBkYXRhLVtzdGF0ZT1jbG9zZWRdOnpvb20tb3V0LTk1IGRhdGEtW3N0YXRlPW9wZW5dOnpvb20taW4tOTUgZGF0YS1bc2lkZT1ib3R0b21dOnNsaWRlLWluLWZyb20tdG9wLTIgZGF0YS1bc2lkZT1sZWZ0XTpzbGlkZS1pbi1mcm9tLXJpZ2h0LTIgZGF0YS1bc2lkZT1yaWdodF06c2xpZGUtaW4tZnJvbS1sZWZ0LTIgZGF0YS1bc2lkZT10b3BdOnNsaWRlLWluLWZyb20tYm90dG9tLTIiLG49PT0icG9wcGVyIiYmImRhdGEtW3NpZGU9Ym90dG9tXTp0cmFuc2xhdGUteS0xIGRhdGEtW3NpZGU9bGVmdF06LXRyYW5zbGF0ZS14LTEgZGF0YS1bc2lkZT1yaWdodF06dHJhbnNsYXRlLXgtMSBkYXRhLVtzaWRlPXRvcF06LXRyYW5zbGF0ZS15LTEiLGUpLHBvc2l0aW9uOm4sLi4ucixjaGlsZHJlbjp3LmpzeChBQSx7Y2xhc3NOYW1lOm90KCJwLTEiLG49PT0icG9wcGVyIiYmImgtW3ZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLWhlaWdodCldIHctZnVsbCBtaW4tdy1bdmFyKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItd2lkdGgpXSIpLGNoaWxkcmVuOnR9KX0pfSkpO09FLmRpc3BsYXlOYW1lPVRFLmRpc3BsYXlOYW1lO2NvbnN0IGpBPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT53LmpzeChORSx7cmVmOm4sY2xhc3NOYW1lOm90KCJweS0xLjUgcGwtOCBwci0yIHRleHQtc20gZm9udC1zZW1pYm9sZCIsZSksLi4udH0pKTtqQS5kaXNwbGF5TmFtZT1ORS5kaXNwbGF5TmFtZTtjb25zdCBBRT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxjaGlsZHJlbjp0LC4uLm59LHIpPT53LmpzeHMoYkUse3JlZjpyLGNsYXNzTmFtZTpvdCgicmVsYXRpdmUgZmxleCB3LWZ1bGwgY3Vyc29yLWRlZmF1bHQgc2VsZWN0LW5vbmUgaXRlbXMtY2VudGVyIHJvdW5kZWQtc20gcHktMS41IHBsLTggcHItMiB0ZXh0LXNtIG91dGxpbmUtbm9uZSBmb2N1czpiZy1hY2NlbnQgZm9jdXM6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCIsZSksLi4ubixjaGlsZHJlbjpbdy5qc3goInNwYW4iLHtjbGFzc05hbWU6ImFic29sdXRlIGxlZnQtMiBmbGV4IGgtMy41IHctMy41IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciIsY2hpbGRyZW46dy5qc3goREEse2NoaWxkcmVuOncuanN4KHhQLHtjbGFzc05hbWU6InctNCBoLTQifSl9KX0pLHcuanN4KE1BLHtjaGlsZHJlbjp0fSldfSkpO0FFLmRpc3BsYXlOYW1lPWJFLmRpc3BsYXlOYW1lO2NvbnN0IHpBPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT53LmpzeChSRSx7cmVmOm4sY2xhc3NOYW1lOm90KCItbXgtMSBteS0xIGgtcHggYmctbXV0ZWQiLGUpLC4uLnR9KSk7ekEuZGlzcGxheU5hbWU9UkUuZGlzcGxheU5hbWU7ZnVuY3Rpb24gTUUoe3BhdGg6ZSxkaXNhYmxlZDp0LHNvdXJjZTpuLHNjaGVtYTpyLHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpvLG9uU3VibWl0Oml9KXtyZXR1cm4odHlwZW9mIG49PSJzdHJpbmcifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09InN0cmluZyI/dy5qc3goVkEse2RlZmF1bHRWYWx1ZTpuLGRpc2FibGVkOnQscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm8sb25TdWJtaXQ6aX0pOih0eXBlb2Ygbj09Im51bWJlciJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0ibnVtYmVyIj93LmpzeChVQSx7ZGVmYXVsdFZhbHVlOm4sZGlzYWJsZWQ6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6byxvblN1Ym1pdDppfSk6KHR5cGVvZiBuPT0ibnVtYmVyInx8dHlwZW9mIG49PSJzdHJpbmcifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09ImtleU9mIj93LmpzeChXQSx7ZGVmYXVsdFZhbHVlOm4sZGlzYWJsZWQ6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6byxvblN1Ym1pdDppLHNlbGVjdG9yOnIuc2VsZWN0b3J9KToodHlwZW9mIG49PSJvYmplY3QifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09InJpY2h0ZXh0Ij93LmpzeChCQSx7cmVnaXN0ZXJQYXRjaENhbGxiYWNrOm8sb25TdWJtaXQ6aSxkZWZhdWx0VmFsdWU6bn0pOih0eXBlb2Ygbj09Im9iamVjdCJ8fG49PT1udWxsKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0iaW1hZ2UiP3cuanN4KEZBLHtwYXRoOmUscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm8sb25TdWJtaXQ6aSxkZWZhdWx0VmFsdWU6bn0pOncuanN4cygiZGl2Iix7Y2hpbGRyZW46WyJVbnN1cHBvcnRlZCBzY2hlbWE6ICIsci50eXBlXX0pfWFzeW5jIGZ1bmN0aW9uIHcwKGUsdCxuLHIpe2NvbnN0IG89ZS5zcGxpdCgiLyIpO3JldHVybiF0fHwhbj9bXTpbe3ZhbHVlOnsuLi5yLG1ldGFkYXRhOm59LG9wOiJyZXBsYWNlIixwYXRoOmV9LHt2YWx1ZTp0LG9wOiJyZXBsYWNlIixwYXRoOmAke28uc2xpY2UoMCwtMSkuam9pbigiLyIpfS8kJHtvW28ubGVuZ3RoLTFdfWB9XX1mdW5jdGlvbiBGQSh7cGF0aDplLGRlZmF1bHRWYWx1ZTp0LG9uU3VibWl0Om4scmVnaXN0ZXJQYXRjaENhbGxiYWNrOnJ9KXtjb25zdFtvLGldPXAudXNlU3RhdGUobnVsbCksW2wsc109cC51c2VTdGF0ZSghMSksW2EsdV09cC51c2VTdGF0ZSgpLFtjLGRdPXAudXNlU3RhdGUoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntkKHQmJnduLmNvbnZlcnRGaWxlU291cmNlKHQpLnVybCl9LFt0XSkscC51c2VFZmZlY3QoKCk9PntyJiZyKGFzeW5jIGY9PncwKGYsbyxhLHQpKX0sW28sdF0pLHcuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJtYXgtdy00eGwgcC00IixjaGlsZHJlbjpbdy5qc3hzKCJsYWJlbCIse2h0bWxGb3I6YGltZ19pbnB1dDoke2V9YCxjbGFzc05hbWU6IiIsY2hpbGRyZW46W298fGM/dy5qc3goImltZyIse3NyYzpvfHxjfSk6dy5qc3goImRpdiIse2NoaWxkcmVuOiJFbXB0eSJ9KSx3LmpzeCgiaW5wdXQiLHtpZDpgaW1nX2lucHV0OiR7ZX1gLHR5cGU6ImZpbGUiLGhpZGRlbjohMCxvbkNoYW5nZTpmPT57TlMoZikudGhlbihoPT57aShoLnNyYyksaC53aWR0aCYmaC5oZWlnaHQ/dSh7c2hhMjU2Omguc2hhMjU2LHdpZHRoOmgud2lkdGgsaGVpZ2h0OmguaGVpZ2h0fSk6dSh2b2lkIDApfSkuY2F0Y2goaD0+e2NvbnNvbGUuZXJyb3IoaC5tZXNzYWdlKSxpKG51bGwpLHUodm9pZCAwKX0pfX0pXX0pLG4mJncuanN4KCJkaXYiLHtjaGlsZHJlbjpvJiZ3LmpzeChHbCx7ZGlzYWJsZWQ6bCxvbkNsaWNrOigpPT57cyghMCksbihmPT53MChmLG8sYSx0KSkuZmluYWxseSgoKT0+e3MoITEpLGkobnVsbCksdSh2b2lkIDApfSl9LGNoaWxkcmVuOmw/IlNhdmluZy4uLiI6IlN1Ym1pdCJ9KX0pXX0sZSl9YXN5bmMgZnVuY3Rpb24gUzAoZSx0KXtjb25zdHt0ZW1wbGF0ZVN0cmluZ3M6bixleHByczpyLGZpbGVzOm99PXQ/YXdhaXQgSFAodC5nZXRFZGl0b3JTdGF0ZSgpLnRvSlNPTigpLnJvb3QpOntbbm5dOiJyaWNodGV4dCIsdGVtcGxhdGVTdHJpbmdzOlsiIl0sZXhwcnM6W10sZmlsZXM6e319O3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6ZSx2YWx1ZTp7dGVtcGxhdGVTdHJpbmdzOm4sZXhwcnM6cixbbm5dOiJyaWNodGV4dCJ9fSwuLi5PYmplY3QuZW50cmllcyhvKS5tYXAoKFtpLGxdKT0+KHtvcDoiZmlsZSIscGF0aDplLGZpbGVQYXRoOmksdmFsdWU6bH0pKV19ZnVuY3Rpb24gQkEoe2RlZmF1bHRWYWx1ZTplLG9uU3VibWl0OnQscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm59KXtjb25zdFtyLG9dPXAudXNlU3RhdGUobnVsbCksW2ksbF09cC51c2VTdGF0ZSghMSksW3MsYV09cC51c2VTdGF0ZSghMSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57ciYmKGwoITEpLHIucmVnaXN0ZXJUZXh0Q29udGVudExpc3RlbmVyKCgpPT57bCghMCl9KSxyLnJlZ2lzdGVyRGVjb3JhdG9yTGlzdGVuZXIoKCk9PntsKCEwKX0pKX0sW3JdKSxwLnVzZUVmZmVjdCgoKT0+e3ImJm4mJm4odT0+UzAodSxyKSl9LFtyXSksdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InAtNCBib3JkZXIgcm91bmRlZCBib3JkZXItY2FyZCIsY2hpbGRyZW46W3cuanN4KG1QLHtvbkVkaXRvcjp1PT57byh1KX0scmljaHRleHQ6ZXx8e2NoaWxkcmVuOltdLFtubl06InJvb3QifX0pLHQmJncuanN4KCJkaXYiLHtjaGlsZHJlbjppJiZ3LmpzeChHbCx7ZGlzYWJsZWQ6c3x8IXIsb25DbGljazooKT0+e3ImJihhKCEwKSx0KHU9PlMwKHUscikpLmZpbmFsbHkoKCk9PnthKCExKSxsKCExKX0pKX0sY2hpbGRyZW46cz8iU2F2aW5nLi4uIjoiU3VibWl0In0pfSldfSl9ZnVuY3Rpb24gV0Eoe2Rpc2FibGVkOmUsZGVmYXVsdFZhbHVlOnQscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm4sb25TdWJtaXQ6cixzZWxlY3RvcjpvfSl7Y29uc3QgaT1kMyhvKSxzPShoPT5BcnJheS5pc0FycmF5KGgubW9kdWxlU291cmNlKT97dHlwZToibnVtYmVyIix2YWx1ZXM6T2JqZWN0LmtleXMoaC5tb2R1bGVTb3VyY2UpLm1hcChnPT5wYXJzZUludChnKSl9Ont0eXBlOiJzdHJpbmciLHZhbHVlczpPYmplY3Qua2V5cyhoLm1vZHVsZVNvdXJjZT8/WyJFUlJPUiBmZXRjaGluZyBzb3VyY2UiXSl9KShpKSxbYSx1XT1wLnVzZVN0YXRlKHQ/P3MudmFsdWVzWzBdKSxbYyxkXT1wLnVzZVN0YXRlKCExKTtwLnVzZUVmZmVjdCgoKT0+e2QoZSl9LFtlXSk7Y29uc3QgZj1oPT57aWYocy50eXBlPT09Im51bWJlciIpe2lmKGg9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIGNhbm5vdCBiZSBlbXB0eSIpO2lmKE51bWJlci5pc05hTihOdW1iZXIoaCkpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgd2FzIG5vdCBhIG51bWJlcjogIitKU09OLnN0cmluZ2lmeShoKSk7cmV0dXJuIE51bWJlcihoKX1yZXR1cm4gaH07cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57biYmbihhc3luYyBoPT5be29wOiJyZXBsYWNlIixwYXRoOmgsdmFsdWU6YX1dKX0sW2FdKSx3LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gaC1mdWxsIGdhcC15LTQiLGNoaWxkcmVuOlt3LmpzeHMoTEEse2RlZmF1bHRWYWx1ZTphLnRvU3RyaW5nKCksZGlzYWJsZWQ6YyxvblZhbHVlQ2hhbmdlOmg9Pnt1KGYoaCkpfSxjaGlsZHJlbjpbdy5qc3goUEUse2NoaWxkcmVuOncuanN4KElBLHtwbGFjZWhvbGRlcjoiU2VsZWN0IGEgdmFsdWUifSl9KSx3LmpzeChPRSx7Y2hpbGRyZW46cy52YWx1ZXMubWFwKGg9PncuanN4KEFFLHt2YWx1ZTpoLnRvU3RyaW5nKCksY2hpbGRyZW46aC50b1N0cmluZygpfSxoKSl9KV19KSxyJiZ3LmpzeCgiZGl2Iix7Y2hpbGRyZW46dCE9PWEmJncuanN4KEdsLHtkaXNhYmxlZDpjLG9uQ2xpY2s6KCk9PntkKCEwKSxyKGFzeW5jIGg9Plt7b3A6InJlcGxhY2UiLHBhdGg6aCx2YWx1ZTphfV0pLmZpbmFsbHkoKCk9PntkKCExKX0pfSxjaGlsZHJlbjpjPyJTYXZpbmcuLi4iOiJTdWJtaXQifSl9KV19KX1mdW5jdGlvbiBVQSh7ZGlzYWJsZWQ6ZSxkZWZhdWx0VmFsdWU6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6bixvblN1Ym1pdDpyfSl7Y29uc3RbbyxpXT1wLnVzZVN0YXRlKHR8fDApLFtsLHNdPXAudXNlU3RhdGUoITEpO3AudXNlRWZmZWN0KCgpPT57cyhlKX0sW2VdKTtjb25zdCBhPXAudXNlUmVmKG51bGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e24mJm4oYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTpOdW1iZXIoKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fDB9XX0pfSxbXSksdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuIGgtZnVsbCBnYXAteS00IixjaGlsZHJlbjpbdy5qc3goaG0se3JlZjphLGRpc2FibGVkOmwsZGVmYXVsdFZhbHVlOm8/PzAsb25DaGFuZ2U6dT0+aShOdW1iZXIodS50YXJnZXQudmFsdWUpKSx0eXBlOiJudW1iZXIifSksciYmdy5qc3goImRpdiIse2NoaWxkcmVuOnQhPT1vJiZ3LmpzeChHbCx7ZGlzYWJsZWQ6bCxvbkNsaWNrOigpPT57cyghMCkscihhc3luYyB1PT57dmFyIGM7cmV0dXJuW3tvcDoicmVwbGFjZSIscGF0aDp1LHZhbHVlOk51bWJlcigoYz1hLmN1cnJlbnQpPT1udWxsP3ZvaWQgMDpjLnZhbHVlKXx8MH1dfSkuZmluYWxseSgoKT0+e3MoITEpfSl9LGNoaWxkcmVuOmw/IlNhdmluZy4uLiI6IlN1Ym1pdCJ9KX0pXX0pfWZ1bmN0aW9uIFZBKHtkaXNhYmxlZDplLGRlZmF1bHRWYWx1ZTp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpuLG9uU3VibWl0OnJ9KXtjb25zdFtvLGldPXAudXNlU3RhdGUodHx8IiIpLFtsLHNdPXAudXNlU3RhdGUoITEpO3AudXNlRWZmZWN0KCgpPT57cyhlKX0sW2VdKTtjb25zdCBhPXAudXNlUmVmKG51bGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e24mJm4oYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTooKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fCIifV19KX0sW10pLHcuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiBoLWZ1bGwgZ2FwLXktNCIsY2hpbGRyZW46W3cuanN4KGhtLHtyZWY6YSxkaXNhYmxlZDpsLGRlZmF1bHRWYWx1ZTpvPz8iIixvbkNoYW5nZTp1PT5pKHUudGFyZ2V0LnZhbHVlKX0pLHImJncuanN4KCJkaXYiLHtjaGlsZHJlbjp0IT09byYmdy5qc3goR2wse2Rpc2FibGVkOmwsb25DbGljazooKT0+e3MoITApLHIoYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTooKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fCIifV19KS5maW5hbGx5KCgpPT57cyghMSl9KX0sY2hpbGRyZW46bD8iU2F2aW5nLi4uIjoiU3VibWl0In0pfSldfSl9Y29uc3QgSEE9KHtjbGFzc05hbWU6ZX0pPT53LmpzeHMoInN2ZyIse3dpZHRoOiI1OCIsaGVpZ2h0OiIzNCIsdmlld0JveDoiMCAwIDU4IDM0IixmaWxsOiJub25lIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTplLGNoaWxkcmVuOlt3LmpzeCgiZyIse2ZpbHRlcjoidXJsKCNmaWx0ZXIwX2RfMjFfMTY3NykiLGNoaWxkcmVuOncuanN4KCJwYXRoIix7ZDoiTTUgNS4zNjQyNkM1IDUuMTYzMDkgNS4xNjMwOSA1IDUuMzY0MjYgNUgxNy42NTgxQzE3Ljg1OTMgNSAxOC4wMjIzIDUuMTYzMDkgMTguMDIyMyA1LjM2NDI2VjI4LjQ5NDlDMTguMDIyMyAyOC42OTYgMTcuODU5MyAyOC44NTkxIDE3LjY1ODEgMjguODU5MUg1LjM2NDI2QzUuMTYzMDkgMjguODU5MSA1IDI4LjY5NiA1IDI4LjQ5NDlWNS4zNjQyNloiLGZpbGw6IiMzOENEOTgifSl9KSx3LmpzeCgiZyIse2ZpbHRlcjoidXJsKCNmaWx0ZXIxX2lfMjFfMTY3NykiLGNoaWxkcmVuOncuanN4KCJjaXJjbGUiLHtjeDoiMTEuNDY1NiIsY3k6IjIzLjc1OTUiLHI6IjIuMTg1NTciLGZpbGw6ImN1cnJlbnRDb2xvciJ9KX0pLHcuanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNNTIuODU4OCAyMy44MzlINDguNzI1N0g0OC41MzdINDguMTEyOEM0Ny42NzE1IDIzLjgzOSA0Ny40NTA4IDIzLjU5NDIgNDcuNDUwOCAyMy4xMDQ0VjEzLjcyOTNDNDcuNDUwOCAxMy41Nzg0IDQ3LjMyODUgMTMuNDU2MSA0Ny4xNzc3IDEzLjQ1NjFINDUuODExOEM0NS42NjA5IDEzLjQ1NjEgNDUuNTM4NiAxMy41Nzg0IDQ1LjUzODYgMTMuNzI5M1YxNS4xODM2QzQ1LjUzODYgMTUuMjg0NCA0NS40NTY5IDE1LjM2NjEgNDUuMzU2MSAxNS4zNjYxQzQ1LjI4NzYgMTUuMzY2MSA0NS4yMjUgMTUuMzI3NSA0NS4xOTI0IDE1LjI2NzJDNDQuODA1IDE0LjU1MDMgNDQuMjgzIDE0LjAyIDQzLjYyNjQgMTMuNjc2NUM0Mi45NTYzIDEzLjMwMSA0Mi4yMDQ1IDEzLjExMzIgNDEuMzcwOSAxMy4xMTMyQzQwLjYwMjggMTMuMTEzMiAzOS44NzU1IDEzLjI1MiAzOS4xODkgMTMuNTI5NUMzOC41MDI2IDEzLjgwNzEgMzcuODk3OSAxNC4yMTUyIDM3LjM3NDggMTQuNzUzOUMzNi44NjgyIDE1LjI3NjQgMzYuNDY3OCAxNS45MjEyIDM2LjE3MzYgMTYuNjg4NUMzNS44Nzk0IDE3LjQ1NTggMzUuNzMyMyAxOC4zMzc0IDM1LjczMjMgMTkuMzMzMlYxOS43MjVDMzUuNzMyMyAyMC43MzcyIDM1Ljg3OTQgMjEuNjI3IDM2LjE3MzYgMjIuMzk0MkMzNi40Njc4IDIzLjE2MTUgMzYuODY4MiAyMy44MTQ2IDM3LjM3NDggMjQuMzUzM0MzNy44OTc5IDI0Ljg3NTcgMzguNTAyNiAyNS4yNzU3IDM5LjE4OSAyNS41NTMyQzM5Ljg3NTUgMjUuODE0NCA0MC42MTkxIDI1Ljk0NSA0MS40MiAyNS45NDVDNDIuMTg4MSAyNS45NDUgNDIuOTE1NCAyNS43NDkxIDQzLjYwMTkgMjUuMzU3M0M0NC4yNzUxIDI0Ljk4MiA0NC44MDU4IDI0LjQxMTkgNDUuMTk0MSAyMy42NDcxQzQ1LjIyNTUgMjMuNTg1MiA0NS4yODg2IDIzLjU0NTIgNDUuMzU4IDIzLjU0NTJINDUuMzkxN0M0NS40NzI4IDIzLjU0NTIgNDUuNTM4NiAyMy42MTEgNDUuNTM4NiAyMy42OTIxQzQ1LjUzODYgMjMuNzkwNCA0NS41NDQgMjMuODg1NiA0NS41NTQ3IDIzLjk3NzdWMjUuMTM5MkM0NS41NTQ3IDI1LjM5MDQgNDUuNzU4NCAyNS41OTQxIDQ2LjAwOTYgMjUuNTk0MUg0Ny4yMjYxQzQ3LjI5MTQgMjUuNTk5NSA0Ny4zNTgxIDI1LjYwMjIgNDcuNDI2MyAyNS42MDIySDQ4LjUzN0g0OC43MjU3SDU3LjcyNjhDNTcuODc3NyAyNS42MDIyIDU4IDI1LjQ3OTkgNTggMjUuMzI5VjI0LjExMjJDNTggMjMuOTYxNCA1Ny44Nzc3IDIzLjgzOSA1Ny43MjY4IDIzLjgzOUg1NS4zMTc0QzU1LjE2NjUgMjMuODM5IDU1LjA0NDIgMjMuNzE2NyA1NS4wNDQyIDIzLjU2NTlWOC43MzM2OEM1NS4wNDQyIDguNTgyNzkgNTQuOTIxOSA4LjQ2MDQ4IDU0Ljc3MSA4LjQ2MDQ4SDUwLjUwNTRDNTAuMzU0NSA4LjQ2MDQ4IDUwLjIzMjIgOC41ODI3OSA1MC4yMzIyIDguNzMzNjhWOS45NTA0M0M1MC4yMzIyIDEwLjEwMTMgNTAuMzU0NSAxMC4yMjM2IDUwLjUwNTQgMTAuMjIzNkg1Mi44NTg4QzUzLjAwOTcgMTAuMjIzNiA1My4xMzIgMTAuMzQ1OSA1My4xMzIgMTAuNDk2OFYyMy41NjU5QzUzLjEzMiAyMy43MTY3IDUzLjAwOTcgMjMuODM5IDUyLjg1ODggMjMuODM5Wk00MS42MTYxIDI0LjEzMjlDNDIuMTg4MSAyNC4xMzI5IDQyLjcxMTEgMjQuMDI2OCA0My4xODUxIDIzLjgxNDZDNDMuNjc1NCAyMy42MDIzIDQ0LjA5MjIgMjMuMzAwMyA0NC40MzU0IDIyLjkwODVDNDQuNzc4NiAyMi41MTY3IDQ1LjA0ODMgMjIuMDUxNCA0NS4yNDQ0IDIxLjUxMjdDNDUuNDQwNiAyMC45NTc2IDQ1LjUzODYgMjAuMzQ1NCA0NS41Mzg2IDE5LjY3NjFWMTkuMzgyMkM0NS41Mzg2IDE4LjcyOTIgNDUuNDQwNiAxOC4xMzMzIDQ1LjI0NDQgMTcuNTk0NkM0NS4wNDgzIDE3LjAzOTUgNDQuNzcwNSAxNi41NjYxIDQ0LjQxMDkgMTYuMTc0M0M0NC4wNjc3IDE1Ljc4MjQgNDMuNjUwOSAxNS40ODA0IDQzLjE2MDYgMTUuMjY4MkM0Mi42ODY2IDE1LjAzOTYgNDIuMTcxOCAxNC45MjU0IDQxLjYxNjEgMTQuOTI1NEM0MS4wNDQgMTQuOTI1NCA0MC41MjEgMTUuMDMxNSA0MC4wNDcxIDE1LjI0MzdDMzkuNTczMSAxNS40NTU5IDM5LjE1NjMgMTUuNzU4IDM4Ljc5NjggMTYuMTQ5OEMzOC40NTM1IDE2LjUyNTIgMzguMTgzOSAxNi45OTA1IDM3Ljk4NzcgMTcuNTQ1NkMzNy43OTE2IDE4LjA4NDMgMzcuNjkzNiAxOC42ODAyIDM3LjY5MzYgMTkuMzMzMlYxOS43MjVDMzcuNjkzNiAyMS4xMTI3IDM4LjA1MzEgMjIuMTk4MyAzOC43NzIyIDIyLjk4MkMzOS41MDc3IDIzLjc0OTMgNDAuNDU1NyAyNC4xMzI5IDQxLjYxNjEgMjQuMTMyOVpNMzEuMTExNSAyNS40MTkxQzMxLjA3MzIgMjUuNTI4NyAzMC45Njk4IDI1LjYwMjIgMzAuODUzNiAyNS42MDIySDI3LjQ2NjFDMjcuMzUgMjUuNjAyMiAyNy4yNDY1IDI1LjUyODcgMjcuMjA4MiAyNS40MTkxTDIzLjE1NzggMTMuODE5M0MyMy4wOTU4IDEzLjY0MTcgMjMuMjI3NiAxMy40NTYxIDIzLjQxNTcgMTMuNDU2MUgyNS4wODlDMjUuMjA2OCAxMy40NTYxIDI1LjMxMTQgMTMuNTMxNiAyNS4zNDg0IDEzLjY0MzVMMjguOTY2NiAyNC41ODFDMjguOTk0MiAyNC42NjQzIDI5LjA3MjEgMjQuNzIwNiAyOS4xNTk5IDI0LjcyMDZDMjkuMjQ3NyAyNC43MjA2IDI5LjMyNTYgMjQuNjY0MyAyOS4zNTMyIDI0LjU4MUwzMi45NzE0IDEzLjY0MzVDMzMuMDA4NCAxMy41MzE2IDMzLjExMjkgMTMuNDU2MSAzMy4yMzA4IDEzLjQ1NjFIMzQuOTA0MUMzNS4wOTIyIDEzLjQ1NjEgMzUuMjI0IDEzLjY0MTcgMzUuMTYyIDEzLjgxOTNMMzEuMTExNSAyNS40MTkxWiIsZmlsbDoiY3VycmVudENvbG9yIn0pLHcuanN4cygiZGVmcyIse2NoaWxkcmVuOlt3LmpzeHMoImZpbHRlciIse2lkOiJmaWx0ZXIwX2RfMjFfMTY3NyIseDoiMC4xMjQ3MjIiLHk6IjAuMTI0NzIyIix3aWR0aDoiMjIuNzcyOSIsaGVpZ2h0OiIzMy42MDk3IixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlt3LmpzeCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksdy5qc3goImZlQ29sb3JNYXRyaXgiLHtpbjoiU291cmNlQWxwaGEiLHR5cGU6Im1hdHJpeCIsdmFsdWVzOiIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIscmVzdWx0OiJoYXJkQWxwaGEifSksdy5qc3goImZlT2Zmc2V0Iix7fSksdy5qc3goImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIyLjQzNzY0In0pLHcuanN4KCJmZUNvbXBvc2l0ZSIse2luMjoiaGFyZEFscGhhIixvcGVyYXRvcjoib3V0In0pLHcuanN4KCJmZUNvbG9yTWF0cml4Iix7dHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMC4yMTk2MDggMCAwIDAgMCAwLjgwMzkyMiAwIDAgMCAwIDAuNTAxOTYxIDAgMCAwIDAuMyAwIn0pLHcuanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjI6IkJhY2tncm91bmRJbWFnZUZpeCIscmVzdWx0OiJlZmZlY3QxX2Ryb3BTaGFkb3dfMjFfMTY3NyJ9KSx3LmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiZWZmZWN0MV9kcm9wU2hhZG93XzIxXzE2NzciLHJlc3VsdDoic2hhcGUifSldfSksdy5qc3hzKCJmaWx0ZXIiLHtpZDoiZmlsdGVyMV9pXzIxXzE2NzciLHg6IjkuMjgwMDMiLHk6IjIxLjU3MzkiLHdpZHRoOiI0LjM3MTEyIixoZWlnaHQ6IjQuMzcxMTIiLGZpbHRlclVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczoic1JHQiIsY2hpbGRyZW46W3cuanN4KCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSx3LmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLHcuanN4KCJmZUNvbG9yTWF0cml4Iix7aW46IlNvdXJjZUFscGhhIix0eXBlOiJtYXRyaXgiLHZhbHVlczoiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLHJlc3VsdDoiaGFyZEFscGhhIn0pLHcuanN4KCJmZU9mZnNldCIse30pLHcuanN4KCJmZUdhdXNzaWFuQmx1ciIse3N0ZERldmlhdGlvbjoiMC41NDYzOTIifSksdy5qc3goImZlQ29tcG9zaXRlIix7aW4yOiJoYXJkQWxwaGEiLG9wZXJhdG9yOiJhcml0aG1ldGljIixrMjoiLTEiLGszOiIxIn0pLHcuanN4KCJmZUNvbG9yTWF0cml4Iix7dHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMC4yMTk2MDggMCAwIDAgMCAwLjgwMzkyMiAwIDAgMCAwIDAuNTAxOTYxIDAgMCAwIDAuMyAwIn0pLHcuanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjI6InNoYXBlIixyZXN1bHQ6ImVmZmVjdDFfaW5uZXJTaGFkb3dfMjFfMTY3NyJ9KV19KV19KV19KSxERT1IQSxMRT0iU3dpdGNoIixbS0EseTRdPUNpKExFKSxbR0EsWUFdPUtBKExFKSxYQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU3dpdGNoOm4sbmFtZTpyLGNoZWNrZWQ6byxkZWZhdWx0Q2hlY2tlZDppLHJlcXVpcmVkOmwsZGlzYWJsZWQ6cyx2YWx1ZTphPSJvbiIsb25DaGVja2VkQ2hhbmdlOnUsLi4uY309ZSxbZCxmXT1wLnVzZVN0YXRlKG51bGwpLGg9WGUodCx5PT5mKHkpKSxnPXAudXNlUmVmKCExKSxtPWQ/ISFkLmNsb3Nlc3QoImZvcm0iKTohMCxbUz0hMSx2XT1ibCh7cHJvcDpvLGRlZmF1bHRQcm9wOmksb25DaGFuZ2U6dX0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoR0Ese3Njb3BlOm4sY2hlY2tlZDpTLGRpc2FibGVkOnN9LHAuY3JlYXRlRWxlbWVudChEZS5idXR0b24sZWUoe3R5cGU6ImJ1dHRvbiIscm9sZToic3dpdGNoIiwiYXJpYS1jaGVja2VkIjpTLCJhcmlhLXJlcXVpcmVkIjpsLCJkYXRhLXN0YXRlIjpJRShTKSwiZGF0YS1kaXNhYmxlZCI6cz8iIjp2b2lkIDAsZGlzYWJsZWQ6cyx2YWx1ZTphfSxjLHtyZWY6aCxvbkNsaWNrOkhlKGUub25DbGljayx5PT57dih4PT4heCksbSYmKGcuY3VycmVudD15LmlzUHJvcGFnYXRpb25TdG9wcGVkKCksZy5jdXJyZW50fHx5LnN0b3BQcm9wYWdhdGlvbigpKX0pfSkpLG0mJnAuY3JlYXRlRWxlbWVudChaQSx7Y29udHJvbDpkLGJ1YmJsZXM6IWcuY3VycmVudCxuYW1lOnIsdmFsdWU6YSxjaGVja2VkOlMscmVxdWlyZWQ6bCxkaXNhYmxlZDpzLHN0eWxlOnt0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTEwMCUpIn19KSl9KSxRQT0iU3dpdGNoVGh1bWIiLEpBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTd2l0Y2g6biwuLi5yfT1lLG89WUEoUUEsbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChEZS5zcGFuLGVlKHsiZGF0YS1zdGF0ZSI6SUUoby5jaGVja2VkKSwiZGF0YS1kaXNhYmxlZCI6by5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjp0fSkpfSksWkE9ZT0+e2NvbnN0e2NvbnRyb2w6dCxjaGVja2VkOm4sYnViYmxlczpyPSEwLC4uLm99PWUsaT1wLnVzZVJlZihudWxsKSxsPWNFKG4pLHM9ckUodCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgYT1pLmN1cnJlbnQsdT13aW5kb3cuSFRNTElucHV0RWxlbWVudC5wcm90b3R5cGUsZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHUsImNoZWNrZWQiKS5zZXQ7aWYobCE9PW4mJmQpe2NvbnN0IGY9bmV3IEV2ZW50KCJjbGljayIse2J1YmJsZXM6cn0pO2QuY2FsbChhLG4pLGEuZGlzcGF0Y2hFdmVudChmKX19LFtsLG4scl0pLHAuY3JlYXRlRWxlbWVudCgiaW5wdXQiLGVlKHt0eXBlOiJjaGVja2JveCIsImFyaWEtaGlkZGVuIjohMCxkZWZhdWx0Q2hlY2tlZDpufSxvLHt0YWJJbmRleDotMSxyZWY6aSxzdHlsZTp7Li4uZS5zdHlsZSwuLi5zLHBvc2l0aW9uOiJhYnNvbHV0ZSIscG9pbnRlckV2ZW50czoibm9uZSIsb3BhY2l0eTowLG1hcmdpbjowfX0pKX07ZnVuY3Rpb24gSUUoZSl7cmV0dXJuIGU/ImNoZWNrZWQiOiJ1bmNoZWNrZWQifWNvbnN0IGpFPVhBLHFBPUpBLFNwPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT53LmpzeChqRSx7Y2xhc3NOYW1lOm90KCJwZWVyIGlubGluZS1mbGV4IGgtWzIycHhdIHctWzQ0cHhdIHNocmluay0wIGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgYm9yZGVyLXRyYW5zcGFyZW50IHRyYW5zaXRpb24tY29sb3JzIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LWJhY2tncm91bmQgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgZGF0YS1bc3RhdGU9Y2hlY2tlZF06YmctYWNjZW50IGRhdGEtW3N0YXRlPXVuY2hlY2tlZF06YmctcHJpbWFyeSIsZSksLi4udCxyZWY6bixjaGlsZHJlbjp3LmpzeChxQSx7Y2xhc3NOYW1lOm90KCJwb2ludGVyLWV2ZW50cy1ub25lIGJsb2NrIGgtWzE4cHhdIHctNSByb3VuZGVkLWZ1bGwgYmctYmFja2dyb3VuZCBzaGFkb3ctbGcgcmluZy0wIHRyYW5zaXRpb24tdHJhbnNmb3JtIGRhdGEtW3N0YXRlPWNoZWNrZWRdOnRyYW5zbGF0ZS14LTUgZGF0YS1bc3RhdGU9dW5jaGVja2VkXTp0cmFuc2xhdGUteC0wIil9KX0pKTtTcC5kaXNwbGF5TmFtZT1qRS5kaXNwbGF5TmFtZTtjb25zdCBTbT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+dy5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTpvdCgicm91bmRlZC1sZyBib3JkZXIgYmctY2FyZCB0ZXh0LWNhcmQtZm9yZWdyb3VuZCBzaGFkb3ctc20iLGUpLC4uLnR9KSk7U20uZGlzcGxheU5hbWU9IkNhcmQiO2NvbnN0IGVNPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT53LmpzeCgiZGl2Iix7cmVmOm4sY2xhc3NOYW1lOm90KCJmbGV4IGZsZXgtY29sIHNwYWNlLXktMS41IHAtNiIsZSksLi4udH0pKTtlTS5kaXNwbGF5TmFtZT0iQ2FyZEhlYWRlciI7Y29uc3QgdE09cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PncuanN4KCJoMyIse3JlZjpuLGNsYXNzTmFtZTpvdCgidGV4dC0yeGwgZm9udC1zZW1pYm9sZCBsZWFkaW5nLW5vbmUgdHJhY2tpbmctdGlnaHQiLGUpLC4uLnR9KSk7dE0uZGlzcGxheU5hbWU9IkNhcmRUaXRsZSI7Y29uc3Qgbk09cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PncuanN4KCJwIix7cmVmOm4sY2xhc3NOYW1lOm90KCJ0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCIsZSksLi4udH0pKTtuTS5kaXNwbGF5TmFtZT0iQ2FyZERlc2NyaXB0aW9uIjtjb25zdCByTT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+dy5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTpvdCgicC02IHB0LTAiLGUpLC4uLnR9KSk7ck0uZGlzcGxheU5hbWU9IkNhcmRDb250ZW50Ijtjb25zdCBvTT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+dy5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTpvdCgiZmxleCBpdGVtcy1jZW50ZXIgcC02IHB0LTAiLGUpLC4uLnR9KSk7b00uZGlzcGxheU5hbWU9IkNhcmRGb290ZXIiOy8qKgogKiBAcmVtaXgtcnVuL3JvdXRlciB2MS4xMS4wCiAqCiAqIENvcHlyaWdodCAoYykgUmVtaXggU29mdHdhcmUgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRS5tZCBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKgogKiBAbGljZW5zZSBNSVQKICovZnVuY3Rpb24gcnQoKXtyZXR1cm4gcnQ9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSxydC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIGx0OyhmdW5jdGlvbihlKXtlLlBvcD0iUE9QIixlLlB1c2g9IlBVU0giLGUuUmVwbGFjZT0iUkVQTEFDRSJ9KShsdHx8KGx0PXt9KSk7Y29uc3QgRTA9InBvcHN0YXRlIjtmdW5jdGlvbiBpTShlKXtlPT09dm9pZCAwJiYoZT17fSk7ZnVuY3Rpb24gdChyLG8pe2xldHtwYXRobmFtZTppLHNlYXJjaDpsLGhhc2g6c309ci5sb2NhdGlvbjtyZXR1cm4gU2EoIiIse3BhdGhuYW1lOmksc2VhcmNoOmwsaGFzaDpzfSxvLnN0YXRlJiZvLnN0YXRlLnVzcnx8bnVsbCxvLnN0YXRlJiZvLnN0YXRlLmtleXx8ImRlZmF1bHQiKX1mdW5jdGlvbiBuKHIsbyl7cmV0dXJuIHR5cGVvZiBvPT0ic3RyaW5nIj9vOkZhKG8pfXJldHVybiBzTSh0LG4sbnVsbCxlKX1mdW5jdGlvbiB3ZShlLHQpe2lmKGU9PT0hMXx8ZT09PW51bGx8fHR5cGVvZiBlPiJ1Iil0aHJvdyBuZXcgRXJyb3IodCl9ZnVuY3Rpb24gdmkoZSx0KXtpZighZSl7dHlwZW9mIGNvbnNvbGU8InUiJiZjb25zb2xlLndhcm4odCk7dHJ5e3Rocm93IG5ldyBFcnJvcih0KX1jYXRjaHt9fX1mdW5jdGlvbiBsTSgpe3JldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiw4KX1mdW5jdGlvbiBDMChlLHQpe3JldHVybnt1c3I6ZS5zdGF0ZSxrZXk6ZS5rZXksaWR4OnR9fWZ1bmN0aW9uIFNhKGUsdCxuLHIpe3JldHVybiBuPT09dm9pZCAwJiYobj1udWxsKSxydCh7cGF0aG5hbWU6dHlwZW9mIGU9PSJzdHJpbmciP2U6ZS5wYXRobmFtZSxzZWFyY2g6IiIsaGFzaDoiIn0sdHlwZW9mIHQ9PSJzdHJpbmciP0pyKHQpOnQse3N0YXRlOm4sa2V5OnQmJnQua2V5fHxyfHxsTSgpfSl9ZnVuY3Rpb24gRmEoZSl7bGV0e3BhdGhuYW1lOnQ9Ii8iLHNlYXJjaDpuPSIiLGhhc2g6cj0iIn09ZTtyZXR1cm4gbiYmbiE9PSI/IiYmKHQrPW4uY2hhckF0KDApPT09Ij8iP246Ij8iK24pLHImJnIhPT0iIyImJih0Kz1yLmNoYXJBdCgwKT09PSIjIj9yOiIjIityKSx0fWZ1bmN0aW9uIEpyKGUpe2xldCB0PXt9O2lmKGUpe2xldCBuPWUuaW5kZXhPZigiIyIpO24+PTAmJih0Lmhhc2g9ZS5zdWJzdHIobiksZT1lLnN1YnN0cigwLG4pKTtsZXQgcj1lLmluZGV4T2YoIj8iKTtyPj0wJiYodC5zZWFyY2g9ZS5zdWJzdHIociksZT1lLnN1YnN0cigwLHIpKSxlJiYodC5wYXRobmFtZT1lKX1yZXR1cm4gdH1mdW5jdGlvbiBzTShlLHQsbixyKXtyPT09dm9pZCAwJiYocj17fSk7bGV0e3dpbmRvdzpvPWRvY3VtZW50LmRlZmF1bHRWaWV3LHY1Q29tcGF0Omk9ITF9PXIsbD1vLmhpc3Rvcnkscz1sdC5Qb3AsYT1udWxsLHU9YygpO3U9PW51bGwmJih1PTAsbC5yZXBsYWNlU3RhdGUocnQoe30sbC5zdGF0ZSx7aWR4OnV9KSwiIikpO2Z1bmN0aW9uIGMoKXtyZXR1cm4obC5zdGF0ZXx8e2lkeDpudWxsfSkuaWR4fWZ1bmN0aW9uIGQoKXtzPWx0LlBvcDtsZXQgUz1jKCksdj1TPT1udWxsP251bGw6Uy11O3U9UyxhJiZhKHthY3Rpb246cyxsb2NhdGlvbjptLmxvY2F0aW9uLGRlbHRhOnZ9KX1mdW5jdGlvbiBmKFMsdil7cz1sdC5QdXNoO2xldCB5PVNhKG0ubG9jYXRpb24sUyx2KTtuJiZuKHksUyksdT1jKCkrMTtsZXQgeD1DMCh5LHUpLF89bS5jcmVhdGVIcmVmKHkpO3RyeXtsLnB1c2hTdGF0ZSh4LCIiLF8pfWNhdGNoKEUpe2lmKEUgaW5zdGFuY2VvZiBET01FeGNlcHRpb24mJkUubmFtZT09PSJEYXRhQ2xvbmVFcnJvciIpdGhyb3cgRTtvLmxvY2F0aW9uLmFzc2lnbihfKX1pJiZhJiZhKHthY3Rpb246cyxsb2NhdGlvbjptLmxvY2F0aW9uLGRlbHRhOjF9KX1mdW5jdGlvbiBoKFMsdil7cz1sdC5SZXBsYWNlO2xldCB5PVNhKG0ubG9jYXRpb24sUyx2KTtuJiZuKHksUyksdT1jKCk7bGV0IHg9QzAoeSx1KSxfPW0uY3JlYXRlSHJlZih5KTtsLnJlcGxhY2VTdGF0ZSh4LCIiLF8pLGkmJmEmJmEoe2FjdGlvbjpzLGxvY2F0aW9uOm0ubG9jYXRpb24sZGVsdGE6MH0pfWZ1bmN0aW9uIGcoUyl7bGV0IHY9by5sb2NhdGlvbi5vcmlnaW4hPT0ibnVsbCI/by5sb2NhdGlvbi5vcmlnaW46by5sb2NhdGlvbi5ocmVmLHk9dHlwZW9mIFM9PSJzdHJpbmciP1M6RmEoUyk7cmV0dXJuIHdlKHYsIk5vIHdpbmRvdy5sb2NhdGlvbi4ob3JpZ2lufGhyZWYpIGF2YWlsYWJsZSB0byBjcmVhdGUgVVJMIGZvciBocmVmOiAiK3kpLG5ldyBVUkwoeSx2KX1sZXQgbT17Z2V0IGFjdGlvbigpe3JldHVybiBzfSxnZXQgbG9jYXRpb24oKXtyZXR1cm4gZShvLGwpfSxsaXN0ZW4oUyl7aWYoYSl0aHJvdyBuZXcgRXJyb3IoIkEgaGlzdG9yeSBvbmx5IGFjY2VwdHMgb25lIGFjdGl2ZSBsaXN0ZW5lciIpO3JldHVybiBvLmFkZEV2ZW50TGlzdGVuZXIoRTAsZCksYT1TLCgpPT57by5yZW1vdmVFdmVudExpc3RlbmVyKEUwLGQpLGE9bnVsbH19LGNyZWF0ZUhyZWYoUyl7cmV0dXJuIHQobyxTKX0sY3JlYXRlVVJMOmcsZW5jb2RlTG9jYXRpb24oUyl7bGV0IHY9ZyhTKTtyZXR1cm57cGF0aG5hbWU6di5wYXRobmFtZSxzZWFyY2g6di5zZWFyY2gsaGFzaDp2Lmhhc2h9fSxwdXNoOmYscmVwbGFjZTpoLGdvKFMpe3JldHVybiBsLmdvKFMpfX07cmV0dXJuIG19dmFyIHN0OyhmdW5jdGlvbihlKXtlLmRhdGE9ImRhdGEiLGUuZGVmZXJyZWQ9ImRlZmVycmVkIixlLnJlZGlyZWN0PSJyZWRpcmVjdCIsZS5lcnJvcj0iZXJyb3IifSkoc3R8fChzdD17fSkpO2NvbnN0IGFNPW5ldyBTZXQoWyJsYXp5IiwiY2FzZVNlbnNpdGl2ZSIsInBhdGgiLCJpZCIsImluZGV4IiwiY2hpbGRyZW4iXSk7ZnVuY3Rpb24gdU0oZSl7cmV0dXJuIGUuaW5kZXg9PT0hMH1mdW5jdGlvbiBFcChlLHQsbixyKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49W10pLHI9PT12b2lkIDAmJihyPXt9KSxlLm1hcCgobyxpKT0+e2xldCBsPVsuLi5uLGldLHM9dHlwZW9mIG8uaWQ9PSJzdHJpbmciP28uaWQ6bC5qb2luKCItIik7aWYod2Uoby5pbmRleCE9PSEwfHwhby5jaGlsZHJlbiwiQ2Fubm90IHNwZWNpZnkgY2hpbGRyZW4gb24gYW4gaW5kZXggcm91dGUiKSx3ZSghcltzXSwnRm91bmQgYSByb3V0ZSBpZCBjb2xsaXNpb24gb24gaWQgIicrcytgIi4gIFJvdXRlIGlkJ3MgbXVzdCBiZSBnbG9iYWxseSB1bmlxdWUgd2l0aGluIERhdGEgUm91dGVyIHVzYWdlc2ApLHVNKG8pKXtsZXQgYT1ydCh7fSxvLHQobykse2lkOnN9KTtyZXR1cm4gcltzXT1hLGF9ZWxzZXtsZXQgYT1ydCh7fSxvLHQobykse2lkOnMsY2hpbGRyZW46dm9pZCAwfSk7cmV0dXJuIHJbc109YSxvLmNoaWxkcmVuJiYoYS5jaGlsZHJlbj1FcChvLmNoaWxkcmVuLHQsbCxyKSksYX19KX1mdW5jdGlvbiBybChlLHQsbil7bj09PXZvaWQgMCYmKG49Ii8iKTtsZXQgcj10eXBlb2YgdD09InN0cmluZyI/SnIodCk6dCxvPUJhKHIucGF0aG5hbWV8fCIvIixuKTtpZihvPT1udWxsKXJldHVybiBudWxsO2xldCBpPXpFKGUpO2RNKGkpO2xldCBsPW51bGw7Zm9yKGxldCBzPTA7bD09bnVsbCYmczxpLmxlbmd0aDsrK3MpbD1fTShpW3NdLEVNKG8pKTtyZXR1cm4gbH1mdW5jdGlvbiBjTShlLHQpe2xldHtyb3V0ZTpuLHBhdGhuYW1lOnIscGFyYW1zOm99PWU7cmV0dXJue2lkOm4uaWQscGF0aG5hbWU6cixwYXJhbXM6byxkYXRhOnRbbi5pZF0saGFuZGxlOm4uaGFuZGxlfX1mdW5jdGlvbiB6RShlLHQsbixyKXt0PT09dm9pZCAwJiYodD1bXSksbj09PXZvaWQgMCYmKG49W10pLHI9PT12b2lkIDAmJihyPSIiKTtsZXQgbz0oaSxsLHMpPT57bGV0IGE9e3JlbGF0aXZlUGF0aDpzPT09dm9pZCAwP2kucGF0aHx8IiI6cyxjYXNlU2Vuc2l0aXZlOmkuY2FzZVNlbnNpdGl2ZT09PSEwLGNoaWxkcmVuSW5kZXg6bCxyb3V0ZTppfTthLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCIvIikmJih3ZShhLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKHIpLCdBYnNvbHV0ZSByb3V0ZSBwYXRoICInK2EucmVsYXRpdmVQYXRoKyciIG5lc3RlZCB1bmRlciBwYXRoICcrKCciJytyKyciIGlzIG5vdCB2YWxpZC4gQW4gYWJzb2x1dGUgY2hpbGQgcm91dGUgcGF0aCAnKSsibXVzdCBzdGFydCB3aXRoIHRoZSBjb21iaW5lZCBwYXRoIG9mIGFsbCBpdHMgcGFyZW50IHJvdXRlcy4iKSxhLnJlbGF0aXZlUGF0aD1hLnJlbGF0aXZlUGF0aC5zbGljZShyLmxlbmd0aCkpO2xldCB1PWtvKFtyLGEucmVsYXRpdmVQYXRoXSksYz1uLmNvbmNhdChhKTtpLmNoaWxkcmVuJiZpLmNoaWxkcmVuLmxlbmd0aD4wJiYod2UoaS5pbmRleCE9PSEwLCJJbmRleCByb3V0ZXMgbXVzdCBub3QgaGF2ZSBjaGlsZCByb3V0ZXMuIFBsZWFzZSByZW1vdmUgIisoJ2FsbCBjaGlsZCByb3V0ZXMgZnJvbSByb3V0ZSBwYXRoICInK3UrJyIuJykpLHpFKGkuY2hpbGRyZW4sdCxjLHUpKSwhKGkucGF0aD09bnVsbCYmIWkuaW5kZXgpJiZ0LnB1c2goe3BhdGg6dSxzY29yZTp5TSh1LGkuaW5kZXgpLHJvdXRlc01ldGE6Y30pfTtyZXR1cm4gZS5mb3JFYWNoKChpLGwpPT57dmFyIHM7aWYoaS5wYXRoPT09IiJ8fCEoKHM9aS5wYXRoKSE9bnVsbCYmcy5pbmNsdWRlcygiPyIpKSlvKGksbCk7ZWxzZSBmb3IobGV0IGEgb2YgRkUoaS5wYXRoKSlvKGksbCxhKX0pLHR9ZnVuY3Rpb24gRkUoZSl7bGV0IHQ9ZS5zcGxpdCgiLyIpO2lmKHQubGVuZ3RoPT09MClyZXR1cm5bXTtsZXRbbiwuLi5yXT10LG89bi5lbmRzV2l0aCgiPyIpLGk9bi5yZXBsYWNlKC9cPyQvLCIiKTtpZihyLmxlbmd0aD09PTApcmV0dXJuIG8/W2ksIiJdOltpXTtsZXQgbD1GRShyLmpvaW4oIi8iKSkscz1bXTtyZXR1cm4gcy5wdXNoKC4uLmwubWFwKGE9PmE9PT0iIj9pOltpLGFdLmpvaW4oIi8iKSkpLG8mJnMucHVzaCguLi5sKSxzLm1hcChhPT5lLnN0YXJ0c1dpdGgoIi8iKSYmYT09PSIiPyIvIjphKX1mdW5jdGlvbiBkTShlKXtlLnNvcnQoKHQsbik9PnQuc2NvcmUhPT1uLnNjb3JlP24uc2NvcmUtdC5zY29yZTp4TSh0LnJvdXRlc01ldGEubWFwKHI9PnIuY2hpbGRyZW5JbmRleCksbi5yb3V0ZXNNZXRhLm1hcChyPT5yLmNoaWxkcmVuSW5kZXgpKSl9Y29uc3QgZk09L146XHcrJC8saE09MyxwTT0yLGdNPTEsbU09MTAsdk09LTIsJDA9ZT0+ZT09PSIqIjtmdW5jdGlvbiB5TShlLHQpe2xldCBuPWUuc3BsaXQoIi8iKSxyPW4ubGVuZ3RoO3JldHVybiBuLnNvbWUoJDApJiYocis9dk0pLHQmJihyKz1wTSksbi5maWx0ZXIobz0+ISQwKG8pKS5yZWR1Y2UoKG8saSk9Pm8rKGZNLnRlc3QoaSk/aE06aT09PSIiP2dNOm1NKSxyKX1mdW5jdGlvbiB4TShlLHQpe3JldHVybiBlLmxlbmd0aD09PXQubGVuZ3RoJiZlLnNsaWNlKDAsLTEpLmV2ZXJ5KChyLG8pPT5yPT09dFtvXSk/ZVtlLmxlbmd0aC0xXS10W3QubGVuZ3RoLTFdOjB9ZnVuY3Rpb24gX00oZSx0KXtsZXR7cm91dGVzTWV0YTpufT1lLHI9e30sbz0iLyIsaT1bXTtmb3IobGV0IGw9MDtsPG4ubGVuZ3RoOysrbCl7bGV0IHM9bltsXSxhPWw9PT1uLmxlbmd0aC0xLHU9bz09PSIvIj90OnQuc2xpY2Uoby5sZW5ndGgpfHwiLyIsYz13TSh7cGF0aDpzLnJlbGF0aXZlUGF0aCxjYXNlU2Vuc2l0aXZlOnMuY2FzZVNlbnNpdGl2ZSxlbmQ6YX0sdSk7aWYoIWMpcmV0dXJuIG51bGw7T2JqZWN0LmFzc2lnbihyLGMucGFyYW1zKTtsZXQgZD1zLnJvdXRlO2kucHVzaCh7cGFyYW1zOnIscGF0aG5hbWU6a28oW28sYy5wYXRobmFtZV0pLHBhdGhuYW1lQmFzZTpUTShrbyhbbyxjLnBhdGhuYW1lQmFzZV0pKSxyb3V0ZTpkfSksYy5wYXRobmFtZUJhc2UhPT0iLyImJihvPWtvKFtvLGMucGF0aG5hbWVCYXNlXSkpfXJldHVybiBpfWZ1bmN0aW9uIHdNKGUsdCl7dHlwZW9mIGU9PSJzdHJpbmciJiYoZT17cGF0aDplLGNhc2VTZW5zaXRpdmU6ITEsZW5kOiEwfSk7bGV0W24scl09U00oZS5wYXRoLGUuY2FzZVNlbnNpdGl2ZSxlLmVuZCksbz10Lm1hdGNoKG4pO2lmKCFvKXJldHVybiBudWxsO2xldCBpPW9bMF0sbD1pLnJlcGxhY2UoLyguKVwvKyQvLCIkMSIpLHM9by5zbGljZSgxKTtyZXR1cm57cGFyYW1zOnIucmVkdWNlKCh1LGMsZCk9PntsZXR7cGFyYW1OYW1lOmYsaXNPcHRpb25hbDpofT1jO2lmKGY9PT0iKiIpe2xldCBtPXNbZF18fCIiO2w9aS5zbGljZSgwLGkubGVuZ3RoLW0ubGVuZ3RoKS5yZXBsYWNlKC8oLilcLyskLywiJDEiKX1jb25zdCBnPXNbZF07cmV0dXJuIGgmJiFnP3VbZl09dm9pZCAwOnVbZl09Q00oZ3x8IiIsZiksdX0se30pLHBhdGhuYW1lOmkscGF0aG5hbWVCYXNlOmwscGF0dGVybjplfX1mdW5jdGlvbiBTTShlLHQsbil7dD09PXZvaWQgMCYmKHQ9ITEpLG49PT12b2lkIDAmJihuPSEwKSx2aShlPT09IioifHwhZS5lbmRzV2l0aCgiKiIpfHxlLmVuZHNXaXRoKCIvKiIpLCdSb3V0ZSBwYXRoICInK2UrJyIgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgJysoJyInK2UucmVwbGFjZSgvXCokLywiLyoiKSsnIiBiZWNhdXNlIHRoZSBgKmAgY2hhcmFjdGVyIG11c3QgJykrImFsd2F5cyBmb2xsb3cgYSBgL2AgaW4gdGhlIHBhdHRlcm4uIFRvIGdldCByaWQgb2YgdGhpcyB3YXJuaW5nLCAiKygncGxlYXNlIGNoYW5nZSB0aGUgcm91dGUgcGF0aCB0byAiJytlLnJlcGxhY2UoL1wqJC8sIi8qIikrJyIuJykpO2xldCByPVtdLG89Il4iK2UucmVwbGFjZSgvXC8qXCo/JC8sIiIpLnJlcGxhY2UoL15cLyovLCIvIikucmVwbGFjZSgvW1xcLiorXiR7fXwoKVtcXV0vZywiXFwkJiIpLnJlcGxhY2UoL1wvOihcdyspKFw/KT8vZywobCxzLGEpPT4oci5wdXNoKHtwYXJhbU5hbWU6cyxpc09wdGlvbmFsOmEhPW51bGx9KSxhPyIvPyhbXlxcL10rKT8iOiIvKFteXFwvXSspIikpO3JldHVybiBlLmVuZHNXaXRoKCIqIik/KHIucHVzaCh7cGFyYW1OYW1lOiIqIn0pLG8rPWU9PT0iKiJ8fGU9PT0iLyoiPyIoLiopJCI6Iig/OlxcLyguKyl8XFwvKikkIik6bj9vKz0iXFwvKiQiOmUhPT0iIiYmZSE9PSIvIiYmKG8rPSIoPzooPz1cXC98JCkpIiksW25ldyBSZWdFeHAobyx0P3ZvaWQgMDoiaSIpLHJdfWZ1bmN0aW9uIEVNKGUpe3RyeXtyZXR1cm4gZGVjb2RlVVJJKGUpfWNhdGNoKHQpe3JldHVybiB2aSghMSwnVGhlIFVSTCBwYXRoICInK2UrJyIgY291bGQgbm90IGJlIGRlY29kZWQgYmVjYXVzZSBpdCBpcyBpcyBhIG1hbGZvcm1lZCBVUkwgc2VnbWVudC4gVGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYSBiYWQgcGVyY2VudCAnKygiZW5jb2RpbmcgKCIrdCsiKS4iKSksZX19ZnVuY3Rpb24gQ00oZSx0KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaChuKXtyZXR1cm4gdmkoITEsJ1RoZSB2YWx1ZSBmb3IgdGhlIFVSTCBwYXJhbSAiJyt0KyciIHdpbGwgbm90IGJlIGRlY29kZWQgYmVjYXVzZScrKCcgdGhlIHN0cmluZyAiJytlKyciIGlzIGEgbWFsZm9ybWVkIFVSTCBzZWdtZW50LiBUaGlzIGlzIHByb2JhYmx5JykrKCIgZHVlIHRvIGEgYmFkIHBlcmNlbnQgZW5jb2RpbmcgKCIrbisiKS4iKSksZX19ZnVuY3Rpb24gQmEoZSx0KXtpZih0PT09Ii8iKXJldHVybiBlO2lmKCFlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh0LnRvTG93ZXJDYXNlKCkpKXJldHVybiBudWxsO2xldCBuPXQuZW5kc1dpdGgoIi8iKT90Lmxlbmd0aC0xOnQubGVuZ3RoLHI9ZS5jaGFyQXQobik7cmV0dXJuIHImJnIhPT0iLyI/bnVsbDplLnNsaWNlKG4pfHwiLyJ9ZnVuY3Rpb24gJE0oZSx0KXt0PT09dm9pZCAwJiYodD0iLyIpO2xldHtwYXRobmFtZTpuLHNlYXJjaDpyPSIiLGhhc2g6bz0iIn09dHlwZW9mIGU9PSJzdHJpbmciP0pyKGUpOmU7cmV0dXJue3BhdGhuYW1lOm4/bi5zdGFydHNXaXRoKCIvIik/bjprTShuLHQpOnQsc2VhcmNoOk5NKHIpLGhhc2g6Yk0obyl9fWZ1bmN0aW9uIGtNKGUsdCl7bGV0IG49dC5yZXBsYWNlKC9cLyskLywiIikuc3BsaXQoIi8iKTtyZXR1cm4gZS5zcGxpdCgiLyIpLmZvckVhY2gobz0+e289PT0iLi4iP24ubGVuZ3RoPjEmJm4ucG9wKCk6byE9PSIuIiYmbi5wdXNoKG8pfSksbi5sZW5ndGg+MT9uLmpvaW4oIi8iKToiLyJ9ZnVuY3Rpb24gUGYoZSx0LG4scil7cmV0dXJuIkNhbm5vdCBpbmNsdWRlIGEgJyIrZSsiJyBjaGFyYWN0ZXIgaW4gYSBtYW51YWxseSBzcGVjaWZpZWQgIisoImB0by4iK3QrImAgZmllbGQgWyIrSlNPTi5zdHJpbmdpZnkocikrIl0uICBQbGVhc2Ugc2VwYXJhdGUgaXQgb3V0IHRvIHRoZSAiKSsoImB0by4iK24rImAgZmllbGQuIEFsdGVybmF0aXZlbHkgeW91IG1heSBwcm92aWRlIHRoZSBmdWxsIHBhdGggYXMgIikrJ2Egc3RyaW5nIGluIDxMaW5rIHRvPSIuLi4iPiBhbmQgdGhlIHJvdXRlciB3aWxsIHBhcnNlIGl0IGZvciB5b3UuJ31mdW5jdGlvbiBFbShlKXtyZXR1cm4gZS5maWx0ZXIoKHQsbik9Pm49PT0wfHx0LnJvdXRlLnBhdGgmJnQucm91dGUucGF0aC5sZW5ndGg+MCl9ZnVuY3Rpb24gQkUoZSx0LG4scil7cj09PXZvaWQgMCYmKHI9ITEpO2xldCBvO3R5cGVvZiBlPT0ic3RyaW5nIj9vPUpyKGUpOihvPXJ0KHt9LGUpLHdlKCFvLnBhdGhuYW1lfHwhby5wYXRobmFtZS5pbmNsdWRlcygiPyIpLFBmKCI/IiwicGF0aG5hbWUiLCJzZWFyY2giLG8pKSx3ZSghby5wYXRobmFtZXx8IW8ucGF0aG5hbWUuaW5jbHVkZXMoIiMiKSxQZigiIyIsInBhdGhuYW1lIiwiaGFzaCIsbykpLHdlKCFvLnNlYXJjaHx8IW8uc2VhcmNoLmluY2x1ZGVzKCIjIiksUGYoIiMiLCJzZWFyY2giLCJoYXNoIixvKSkpO2xldCBpPWU9PT0iInx8by5wYXRobmFtZT09PSIiLGw9aT8iLyI6by5wYXRobmFtZSxzO2lmKHJ8fGw9PW51bGwpcz1uO2Vsc2V7bGV0IGQ9dC5sZW5ndGgtMTtpZihsLnN0YXJ0c1dpdGgoIi4uIikpe2xldCBmPWwuc3BsaXQoIi8iKTtmb3IoO2ZbMF09PT0iLi4iOylmLnNoaWZ0KCksZC09MTtvLnBhdGhuYW1lPWYuam9pbigiLyIpfXM9ZD49MD90W2RdOiIvIn1sZXQgYT0kTShvLHMpLHU9bCYmbCE9PSIvIiYmbC5lbmRzV2l0aCgiLyIpLGM9KGl8fGw9PT0iLiIpJiZuLmVuZHNXaXRoKCIvIik7cmV0dXJuIWEucGF0aG5hbWUuZW5kc1dpdGgoIi8iKSYmKHV8fGMpJiYoYS5wYXRobmFtZSs9Ii8iKSxhfWNvbnN0IGtvPWU9PmUuam9pbigiLyIpLnJlcGxhY2UoL1wvXC8rL2csIi8iKSxUTT1lPT5lLnJlcGxhY2UoL1wvKyQvLCIiKS5yZXBsYWNlKC9eXC8qLywiLyIpLE5NPWU9PiFlfHxlPT09Ij8iPyIiOmUuc3RhcnRzV2l0aCgiPyIpP2U6Ij8iK2UsYk09ZT0+IWV8fGU9PT0iIyI/IiI6ZS5zdGFydHNXaXRoKCIjIik/ZToiIyIrZTtjbGFzcyBDbXtjb25zdHJ1Y3Rvcih0LG4scixvKXtvPT09dm9pZCAwJiYobz0hMSksdGhpcy5zdGF0dXM9dCx0aGlzLnN0YXR1c1RleHQ9bnx8IiIsdGhpcy5pbnRlcm5hbD1vLHIgaW5zdGFuY2VvZiBFcnJvcj8odGhpcy5kYXRhPXIudG9TdHJpbmcoKSx0aGlzLmVycm9yPXIpOnRoaXMuZGF0YT1yfX1mdW5jdGlvbiBXRShlKXtyZXR1cm4gZSE9bnVsbCYmdHlwZW9mIGUuc3RhdHVzPT0ibnVtYmVyIiYmdHlwZW9mIGUuc3RhdHVzVGV4dD09InN0cmluZyImJnR5cGVvZiBlLmludGVybmFsPT0iYm9vbGVhbiImJiJkYXRhImluIGV9Y29uc3QgVUU9WyJwb3N0IiwicHV0IiwicGF0Y2giLCJkZWxldGUiXSxSTT1uZXcgU2V0KFVFKSxQTT1bImdldCIsLi4uVUVdLE9NPW5ldyBTZXQoUE0pLEFNPW5ldyBTZXQoWzMwMSwzMDIsMzAzLDMwNywzMDhdKSxNTT1uZXcgU2V0KFszMDcsMzA4XSksT2Y9e3N0YXRlOiJpZGxlIixsb2NhdGlvbjp2b2lkIDAsZm9ybU1ldGhvZDp2b2lkIDAsZm9ybUFjdGlvbjp2b2lkIDAsZm9ybUVuY1R5cGU6dm9pZCAwLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMH0sRE09e3N0YXRlOiJpZGxlIixkYXRhOnZvaWQgMCxmb3JtTWV0aG9kOnZvaWQgMCxmb3JtQWN0aW9uOnZvaWQgMCxmb3JtRW5jVHlwZTp2b2lkIDAsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfSxjcz17c3RhdGU6InVuYmxvY2tlZCIscHJvY2VlZDp2b2lkIDAscmVzZXQ6dm9pZCAwLGxvY2F0aW9uOnZvaWQgMH0sVkU9L14oPzpbYS16XVthLXowLTkrLi1dKjp8XC9cLykvaSxMTT1lPT4oe2hhc0Vycm9yQm91bmRhcnk6ISFlLmhhc0Vycm9yQm91bmRhcnl9KSxIRT0icmVtaXgtcm91dGVyLXRyYW5zaXRpb25zIjtmdW5jdGlvbiBJTShlKXtjb25zdCB0PWUud2luZG93P2Uud2luZG93OnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp2b2lkIDAsbj10eXBlb2YgdDwidSImJnR5cGVvZiB0LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIscj0hbjt3ZShlLnJvdXRlcy5sZW5ndGg+MCwiWW91IG11c3QgcHJvdmlkZSBhIG5vbi1lbXB0eSByb3V0ZXMgYXJyYXkgdG8gY3JlYXRlUm91dGVyIik7bGV0IG87aWYoZS5tYXBSb3V0ZVByb3BlcnRpZXMpbz1lLm1hcFJvdXRlUHJvcGVydGllcztlbHNlIGlmKGUuZGV0ZWN0RXJyb3JCb3VuZGFyeSl7bGV0IE49ZS5kZXRlY3RFcnJvckJvdW5kYXJ5O289QT0+KHtoYXNFcnJvckJvdW5kYXJ5Ok4oQSl9KX1lbHNlIG89TE07bGV0IGk9e30sbD1FcChlLnJvdXRlcyxvLHZvaWQgMCxpKSxzLGE9ZS5iYXNlbmFtZXx8Ii8iLHU9cnQoe3Y3X2ZldGNoZXJQZXJzaXN0OiExLHY3X25vcm1hbGl6ZUZvcm1NZXRob2Q6ITEsdjdfcHJlcGVuZEJhc2VuYW1lOiExfSxlLmZ1dHVyZSksYz1udWxsLGQ9bmV3IFNldCxmPW51bGwsaD1udWxsLGc9bnVsbCxtPWUuaHlkcmF0aW9uRGF0YSE9bnVsbCxTPXJsKGwsZS5oaXN0b3J5LmxvY2F0aW9uLGEpLHY9bnVsbDtpZihTPT1udWxsKXtsZXQgTj1Sbig0MDQse3BhdGhuYW1lOmUuaGlzdG9yeS5sb2NhdGlvbi5wYXRobmFtZX0pLHttYXRjaGVzOkEscm91dGU6en09QTAobCk7Uz1BLHY9e1t6LmlkXTpOfX1sZXQgeT0hUy5zb21lKE49Pk4ucm91dGUubGF6eSkmJighUy5zb21lKE49Pk4ucm91dGUubG9hZGVyKXx8ZS5oeWRyYXRpb25EYXRhIT1udWxsKSx4LF89e2hpc3RvcnlBY3Rpb246ZS5oaXN0b3J5LmFjdGlvbixsb2NhdGlvbjplLmhpc3RvcnkubG9jYXRpb24sbWF0Y2hlczpTLGluaXRpYWxpemVkOnksbmF2aWdhdGlvbjpPZixyZXN0b3JlU2Nyb2xsUG9zaXRpb246ZS5oeWRyYXRpb25EYXRhIT1udWxsPyExOm51bGwscHJldmVudFNjcm9sbFJlc2V0OiExLHJldmFsaWRhdGlvbjoiaWRsZSIsbG9hZGVyRGF0YTplLmh5ZHJhdGlvbkRhdGEmJmUuaHlkcmF0aW9uRGF0YS5sb2FkZXJEYXRhfHx7fSxhY3Rpb25EYXRhOmUuaHlkcmF0aW9uRGF0YSYmZS5oeWRyYXRpb25EYXRhLmFjdGlvbkRhdGF8fG51bGwsZXJyb3JzOmUuaHlkcmF0aW9uRGF0YSYmZS5oeWRyYXRpb25EYXRhLmVycm9yc3x8dixmZXRjaGVyczpuZXcgTWFwLGJsb2NrZXJzOm5ldyBNYXB9LEU9bHQuUG9wLCQ9ITEsQyxUPSExLE09bmV3IE1hcCxSPW51bGwsaj0hMSxGPSExLGFlPVtdLEg9W10sWD1uZXcgTWFwLFA9MCxPPS0xLGs9bmV3IE1hcCxJPW5ldyBTZXQsTD1uZXcgTWFwLFY9bmV3IE1hcCx0ZT1uZXcgU2V0LHllPW5ldyBNYXAsZmU9bmV3IE1hcCxPZT0hMTtmdW5jdGlvbiBiZSgpe2lmKGM9ZS5oaXN0b3J5Lmxpc3RlbihOPT57bGV0e2FjdGlvbjpBLGxvY2F0aW9uOnosZGVsdGE6R309TjtpZihPZSl7T2U9ITE7cmV0dXJufXZpKGZlLnNpemU9PT0wfHxHIT1udWxsLCJZb3UgYXJlIHRyeWluZyB0byB1c2UgYSBibG9ja2VyIG9uIGEgUE9QIG5hdmlnYXRpb24gdG8gYSBsb2NhdGlvbiB0aGF0IHdhcyBub3QgY3JlYXRlZCBieSBAcmVtaXgtcnVuL3JvdXRlci4gVGhpcyB3aWxsIGZhaWwgc2lsZW50bHkgaW4gcHJvZHVjdGlvbi4gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBhcmUgbmF2aWdhdGluZyBvdXRzaWRlIHRoZSByb3V0ZXIgdmlhIGB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGVgL2B3aW5kb3cubG9jYXRpb24uaGFzaGAgaW5zdGVhZCBvZiB1c2luZyByb3V0ZXIgbmF2aWdhdGlvbiBBUElzLiAgVGhpcyBjYW4gYWxzbyBoYXBwZW4gaWYgeW91IGFyZSB1c2luZyBjcmVhdGVIYXNoUm91dGVyIGFuZCB0aGUgdXNlciBtYW51YWxseSBjaGFuZ2VzIHRoZSBVUkwuIik7bGV0IGllPU1tKHtjdXJyZW50TG9jYXRpb246Xy5sb2NhdGlvbixuZXh0TG9jYXRpb246eixoaXN0b3J5QWN0aW9uOkF9KTtpZihpZSYmRyE9bnVsbCl7T2U9ITAsZS5oaXN0b3J5LmdvKEcqLTEpLFVhKGllLHtzdGF0ZToiYmxvY2tlZCIsbG9jYXRpb246eixwcm9jZWVkKCl7VWEoaWUse3N0YXRlOiJwcm9jZWVkaW5nIixwcm9jZWVkOnZvaWQgMCxyZXNldDp2b2lkIDAsbG9jYXRpb246en0pLGUuaGlzdG9yeS5nbyhHKX0scmVzZXQoKXtsZXQgbGU9bmV3IE1hcChfLmJsb2NrZXJzKTtsZS5zZXQoaWUsY3MpLGNlKHtibG9ja2VyczpsZX0pfX0pO3JldHVybn1yZXR1cm4gQmUoQSx6KX0pLG4pe1lNKHQsTSk7bGV0IE49KCk9PlhNKHQsTSk7dC5hZGRFdmVudExpc3RlbmVyKCJwYWdlaGlkZSIsTiksUj0oKT0+dC5yZW1vdmVFdmVudExpc3RlbmVyKCJwYWdlaGlkZSIsTil9cmV0dXJuIF8uaW5pdGlhbGl6ZWR8fEJlKGx0LlBvcCxfLmxvY2F0aW9uKSx4fWZ1bmN0aW9uIFooKXtjJiZjKCksUiYmUigpLGQuY2xlYXIoKSxDJiZDLmFib3J0KCksXy5mZXRjaGVycy5mb3JFYWNoKChOLEEpPT5PdChBKSksXy5ibG9ja2Vycy5mb3JFYWNoKChOLEEpPT5BbShBKSl9ZnVuY3Rpb24ga2UoTil7cmV0dXJuIGQuYWRkKE4pLCgpPT5kLmRlbGV0ZShOKX1mdW5jdGlvbiBjZShOLEEpe189cnQoe30sXyxOKTtsZXQgej1bXSxHPVtdO3UudjdfZmV0Y2hlclBlcnNpc3QmJl8uZmV0Y2hlcnMuZm9yRWFjaCgoaWUsbGUpPT57aWUuc3RhdGU9PT0iaWRsZSImJih0ZS5oYXMobGUpP0cucHVzaChsZSk6ei5wdXNoKGxlKSl9KSxkLmZvckVhY2goaWU9PmllKF8se2RlbGV0ZWRGZXRjaGVyczpHLHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uT3B0czpBfSkpLHUudjdfZmV0Y2hlclBlcnNpc3QmJih6LmZvckVhY2goaWU9Pl8uZmV0Y2hlcnMuZGVsZXRlKGllKSksRy5mb3JFYWNoKGllPT5PdChpZSkpKX1mdW5jdGlvbiBfZShOLEEpe3ZhciB6LEc7bGV0IGllPV8uYWN0aW9uRGF0YSE9bnVsbCYmXy5uYXZpZ2F0aW9uLmZvcm1NZXRob2QhPW51bGwmJlluKF8ubmF2aWdhdGlvbi5mb3JtTWV0aG9kKSYmXy5uYXZpZ2F0aW9uLnN0YXRlPT09ImxvYWRpbmciJiYoKHo9Ti5zdGF0ZSk9PW51bGw/dm9pZCAwOnouX2lzUmVkaXJlY3QpIT09ITAsbGU7QS5hY3Rpb25EYXRhP09iamVjdC5rZXlzKEEuYWN0aW9uRGF0YSkubGVuZ3RoPjA/bGU9QS5hY3Rpb25EYXRhOmxlPW51bGw6aWU/bGU9Xy5hY3Rpb25EYXRhOmxlPW51bGw7bGV0IGhlPUEubG9hZGVyRGF0YT9PMChfLmxvYWRlckRhdGEsQS5sb2FkZXJEYXRhLEEubWF0Y2hlc3x8W10sQS5lcnJvcnMpOl8ubG9hZGVyRGF0YSxzZT1fLmJsb2NrZXJzO3NlLnNpemU+MCYmKHNlPW5ldyBNYXAoc2UpLHNlLmZvckVhY2goKFFlLEVlKT0+c2Uuc2V0KEVlLGNzKSkpO2xldCBvZT0kPT09ITB8fF8ubmF2aWdhdGlvbi5mb3JtTWV0aG9kIT1udWxsJiZZbihfLm5hdmlnYXRpb24uZm9ybU1ldGhvZCkmJigoRz1OLnN0YXRlKT09bnVsbD92b2lkIDA6Ry5faXNSZWRpcmVjdCkhPT0hMDtzJiYobD1zLHM9dm9pZCAwKSxqfHxFPT09bHQuUG9wfHwoRT09PWx0LlB1c2g/ZS5oaXN0b3J5LnB1c2goTixOLnN0YXRlKTpFPT09bHQuUmVwbGFjZSYmZS5oaXN0b3J5LnJlcGxhY2UoTixOLnN0YXRlKSk7bGV0IExlO2lmKEU9PT1sdC5Qb3Ape2xldCBRZT1NLmdldChfLmxvY2F0aW9uLnBhdGhuYW1lKTtRZSYmUWUuaGFzKE4ucGF0aG5hbWUpP0xlPXtjdXJyZW50TG9jYXRpb246Xy5sb2NhdGlvbixuZXh0TG9jYXRpb246Tn06TS5oYXMoTi5wYXRobmFtZSkmJihMZT17Y3VycmVudExvY2F0aW9uOk4sbmV4dExvY2F0aW9uOl8ubG9jYXRpb259KX1lbHNlIGlmKFQpe2xldCBRZT1NLmdldChfLmxvY2F0aW9uLnBhdGhuYW1lKTtRZT9RZS5hZGQoTi5wYXRobmFtZSk6KFFlPW5ldyBTZXQoW04ucGF0aG5hbWVdKSxNLnNldChfLmxvY2F0aW9uLnBhdGhuYW1lLFFlKSksTGU9e2N1cnJlbnRMb2NhdGlvbjpfLmxvY2F0aW9uLG5leHRMb2NhdGlvbjpOfX1jZShydCh7fSxBLHthY3Rpb25EYXRhOmxlLGxvYWRlckRhdGE6aGUsaGlzdG9yeUFjdGlvbjpFLGxvY2F0aW9uOk4saW5pdGlhbGl6ZWQ6ITAsbmF2aWdhdGlvbjpPZixyZXZhbGlkYXRpb246ImlkbGUiLHJlc3RvcmVTY3JvbGxQb3NpdGlvbjpMbShOLEEubWF0Y2hlc3x8Xy5tYXRjaGVzKSxwcmV2ZW50U2Nyb2xsUmVzZXQ6b2UsYmxvY2tlcnM6c2V9KSxMZSksRT1sdC5Qb3AsJD0hMSxUPSExLGo9ITEsRj0hMSxhZT1bXSxIPVtdfWFzeW5jIGZ1bmN0aW9uIG1lKE4sQSl7aWYodHlwZW9mIE49PSJudW1iZXIiKXtlLmhpc3RvcnkuZ28oTik7cmV0dXJufWxldCB6PUNwKF8ubG9jYXRpb24sXy5tYXRjaGVzLGEsdS52N19wcmVwZW5kQmFzZW5hbWUsTixBPT1udWxsP3ZvaWQgMDpBLmZyb21Sb3V0ZUlkLEE9PW51bGw/dm9pZCAwOkEucmVsYXRpdmUpLHtwYXRoOkcsc3VibWlzc2lvbjppZSxlcnJvcjpsZX09azAodS52N19ub3JtYWxpemVGb3JtTWV0aG9kLCExLHosQSksaGU9Xy5sb2NhdGlvbixzZT1TYShfLmxvY2F0aW9uLEcsQSYmQS5zdGF0ZSk7c2U9cnQoe30sc2UsZS5oaXN0b3J5LmVuY29kZUxvY2F0aW9uKHNlKSk7bGV0IG9lPUEmJkEucmVwbGFjZSE9bnVsbD9BLnJlcGxhY2U6dm9pZCAwLExlPWx0LlB1c2g7b2U9PT0hMD9MZT1sdC5SZXBsYWNlOm9lPT09ITF8fGllIT1udWxsJiZZbihpZS5mb3JtTWV0aG9kKSYmaWUuZm9ybUFjdGlvbj09PV8ubG9jYXRpb24ucGF0aG5hbWUrXy5sb2NhdGlvbi5zZWFyY2gmJihMZT1sdC5SZXBsYWNlKTtsZXQgUWU9QSYmInByZXZlbnRTY3JvbGxSZXNldCJpbiBBP0EucHJldmVudFNjcm9sbFJlc2V0PT09ITA6dm9pZCAwLEVlPU1tKHtjdXJyZW50TG9jYXRpb246aGUsbmV4dExvY2F0aW9uOnNlLGhpc3RvcnlBY3Rpb246TGV9KTtpZihFZSl7VWEoRWUse3N0YXRlOiJibG9ja2VkIixsb2NhdGlvbjpzZSxwcm9jZWVkKCl7VWEoRWUse3N0YXRlOiJwcm9jZWVkaW5nIixwcm9jZWVkOnZvaWQgMCxyZXNldDp2b2lkIDAsbG9jYXRpb246c2V9KSxtZShOLEEpfSxyZXNldCgpe2xldCBJZT1uZXcgTWFwKF8uYmxvY2tlcnMpO0llLnNldChFZSxjcyksY2Uoe2Jsb2NrZXJzOkllfSl9fSk7cmV0dXJufXJldHVybiBhd2FpdCBCZShMZSxzZSx7c3VibWlzc2lvbjppZSxwZW5kaW5nRXJyb3I6bGUscHJldmVudFNjcm9sbFJlc2V0OlFlLHJlcGxhY2U6QSYmQS5yZXBsYWNlLGVuYWJsZVZpZXdUcmFuc2l0aW9uOkEmJkEudW5zdGFibGVfdmlld1RyYW5zaXRpb259KX1mdW5jdGlvbiAkZSgpe2lmKEl0KCksY2Uoe3JldmFsaWRhdGlvbjoibG9hZGluZyJ9KSxfLm5hdmlnYXRpb24uc3RhdGUhPT0ic3VibWl0dGluZyIpe2lmKF8ubmF2aWdhdGlvbi5zdGF0ZT09PSJpZGxlIil7QmUoXy5oaXN0b3J5QWN0aW9uLF8ubG9jYXRpb24se3N0YXJ0VW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbjohMH0pO3JldHVybn1CZShFfHxfLmhpc3RvcnlBY3Rpb24sXy5uYXZpZ2F0aW9uLmxvY2F0aW9uLHtvdmVycmlkZU5hdmlnYXRpb246Xy5uYXZpZ2F0aW9ufSl9fWFzeW5jIGZ1bmN0aW9uIEJlKE4sQSx6KXtDJiZDLmFib3J0KCksQz1udWxsLEU9TixqPSh6JiZ6LnN0YXJ0VW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbik9PT0hMCx3QyhfLmxvY2F0aW9uLF8ubWF0Y2hlcyksJD0oeiYmei5wcmV2ZW50U2Nyb2xsUmVzZXQpPT09ITAsVD0oeiYmei5lbmFibGVWaWV3VHJhbnNpdGlvbik9PT0hMDtsZXQgRz1zfHxsLGllPXomJnoub3ZlcnJpZGVOYXZpZ2F0aW9uLGxlPXJsKEcsQSxhKTtpZighbGUpe2xldCBJZT1Sbig0MDQse3BhdGhuYW1lOkEucGF0aG5hbWV9KSx7bWF0Y2hlczpwdCxyb3V0ZTpVb309QTAoRyk7T2QoKSxfZShBLHttYXRjaGVzOnB0LGxvYWRlckRhdGE6e30sZXJyb3JzOntbVW8uaWRdOkllfX0pO3JldHVybn1pZihfLmluaXRpYWxpemVkJiYhRiYmV00oXy5sb2NhdGlvbixBKSYmISh6JiZ6LnN1Ym1pc3Npb24mJlluKHouc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkpe19lKEEse21hdGNoZXM6bGV9KTtyZXR1cm59Qz1uZXcgQWJvcnRDb250cm9sbGVyO2xldCBoZT1mcyhlLmhpc3RvcnksQSxDLnNpZ25hbCx6JiZ6LnN1Ym1pc3Npb24pLHNlLG9lO2lmKHomJnoucGVuZGluZ0Vycm9yKW9lPXtbVXMobGUpLnJvdXRlLmlkXTp6LnBlbmRpbmdFcnJvcn07ZWxzZSBpZih6JiZ6LnN1Ym1pc3Npb24mJlluKHouc3VibWlzc2lvbi5mb3JtTWV0aG9kKSl7bGV0IEllPWF3YWl0IFB0KGhlLEEsei5zdWJtaXNzaW9uLGxlLHtyZXBsYWNlOnoucmVwbGFjZX0pO2lmKEllLnNob3J0Q2lyY3VpdGVkKXJldHVybjtzZT1JZS5wZW5kaW5nQWN0aW9uRGF0YSxvZT1JZS5wZW5kaW5nQWN0aW9uRXJyb3IsaWU9QWYoQSx6LnN1Ym1pc3Npb24pLGhlPW5ldyBSZXF1ZXN0KGhlLnVybCx7c2lnbmFsOmhlLnNpZ25hbH0pfWxldHtzaG9ydENpcmN1aXRlZDpMZSxsb2FkZXJEYXRhOlFlLGVycm9yczpFZX09YXdhaXQgc24oaGUsQSxsZSxpZSx6JiZ6LnN1Ym1pc3Npb24seiYmei5mZXRjaGVyU3VibWlzc2lvbix6JiZ6LnJlcGxhY2Usc2Usb2UpO0xlfHwoQz1udWxsLF9lKEEscnQoe21hdGNoZXM6bGV9LHNlP3thY3Rpb25EYXRhOnNlfTp7fSx7bG9hZGVyRGF0YTpRZSxlcnJvcnM6RWV9KSkpfWFzeW5jIGZ1bmN0aW9uIFB0KE4sQSx6LEcsaWUpe2llPT09dm9pZCAwJiYoaWU9e30pLEl0KCk7bGV0IGxlPUtNKEEseik7Y2Uoe25hdmlnYXRpb246bGV9KTtsZXQgaGUsc2U9a3AoRyxBKTtpZighc2Uucm91dGUuYWN0aW9uJiYhc2Uucm91dGUubGF6eSloZT17dHlwZTpzdC5lcnJvcixlcnJvcjpSbig0MDUse21ldGhvZDpOLm1ldGhvZCxwYXRobmFtZTpBLnBhdGhuYW1lLHJvdXRlSWQ6c2Uucm91dGUuaWR9KX07ZWxzZSBpZihoZT1hd2FpdCBkcygiYWN0aW9uIixOLHNlLEcsaSxvLGEpLE4uc2lnbmFsLmFib3J0ZWQpcmV0dXJue3Nob3J0Q2lyY3VpdGVkOiEwfTtpZihwbChoZSkpe2xldCBvZTtyZXR1cm4gaWUmJmllLnJlcGxhY2UhPW51bGw/b2U9aWUucmVwbGFjZTpvZT1oZS5sb2NhdGlvbj09PV8ubG9jYXRpb24ucGF0aG5hbWUrXy5sb2NhdGlvbi5zZWFyY2gsYXdhaXQgX3QoXyxoZSx7c3VibWlzc2lvbjp6LHJlcGxhY2U6b2V9KSx7c2hvcnRDaXJjdWl0ZWQ6ITB9fWlmKFZzKGhlKSl7bGV0IG9lPVVzKEcsc2Uucm91dGUuaWQpO3JldHVybihpZSYmaWUucmVwbGFjZSkhPT0hMCYmKEU9bHQuUHVzaCkse3BlbmRpbmdBY3Rpb25EYXRhOnt9LHBlbmRpbmdBY3Rpb25FcnJvcjp7W29lLnJvdXRlLmlkXTpoZS5lcnJvcn19fWlmKGVpKGhlKSl0aHJvdyBSbig0MDAse3R5cGU6ImRlZmVyLWFjdGlvbiJ9KTtyZXR1cm57cGVuZGluZ0FjdGlvbkRhdGE6e1tzZS5yb3V0ZS5pZF06aGUuZGF0YX19fWFzeW5jIGZ1bmN0aW9uIHNuKE4sQSx6LEcsaWUsbGUsaGUsc2Usb2Upe2xldCBMZT1HfHxBZihBLGllKSxRZT1pZXx8bGV8fEwwKExlKSxFZT1zfHxsLFtJZSxwdF09VDAoZS5oaXN0b3J5LF8seixRZSxBLEYsYWUsSCxMLEksRWUsYSxzZSxvZSk7aWYoT2QoQWU9PiEoeiYmei5zb21lKFduPT5Xbi5yb3V0ZS5pZD09PUFlKSl8fEllJiZJZS5zb21lKFduPT5Xbi5yb3V0ZS5pZD09PUFlKSksTz0rK1AsSWUubGVuZ3RoPT09MCYmcHQubGVuZ3RoPT09MCl7bGV0IEFlPWlyKCk7cmV0dXJuIF9lKEEscnQoe21hdGNoZXM6eixsb2FkZXJEYXRhOnt9LGVycm9yczpvZXx8bnVsbH0sc2U/e2FjdGlvbkRhdGE6c2V9Ont9LEFlP3tmZXRjaGVyczpuZXcgTWFwKF8uZmV0Y2hlcnMpfTp7fSkpLHtzaG9ydENpcmN1aXRlZDohMH19aWYoIWope3B0LmZvckVhY2goV249PntsZXQgcXI9Xy5mZXRjaGVycy5nZXQoV24ua2V5KSxpdD1ocyh2b2lkIDAscXI/cXIuZGF0YTp2b2lkIDApO18uZmV0Y2hlcnMuc2V0KFduLmtleSxpdCl9KTtsZXQgQWU9c2V8fF8uYWN0aW9uRGF0YTtjZShydCh7bmF2aWdhdGlvbjpMZX0sQWU/T2JqZWN0LmtleXMoQWUpLmxlbmd0aD09PTA/e2FjdGlvbkRhdGE6bnVsbH06e2FjdGlvbkRhdGE6QWV9Ont9LHB0Lmxlbmd0aD4wP3tmZXRjaGVyczpuZXcgTWFwKF8uZmV0Y2hlcnMpfTp7fSkpfXB0LmZvckVhY2goQWU9PntYLmhhcyhBZS5rZXkpJiZqdChBZS5rZXkpLEFlLmNvbnRyb2xsZXImJlguc2V0KEFlLmtleSxBZS5jb250cm9sbGVyKX0pO2xldCBVbz0oKT0+cHQuZm9yRWFjaChBZT0+anQoQWUua2V5KSk7QyYmQy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFVvKTtsZXR7cmVzdWx0czpWbyxsb2FkZXJSZXN1bHRzOkpsLGZldGNoZXJSZXN1bHRzOkFkfT1hd2FpdCBwbihfLm1hdGNoZXMseixJZSxwdCxOKTtpZihOLnNpZ25hbC5hYm9ydGVkKXJldHVybntzaG9ydENpcmN1aXRlZDohMH07QyYmQy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFVvKSxwdC5mb3JFYWNoKEFlPT5YLmRlbGV0ZShBZS5rZXkpKTtsZXQga3I9TTAoVm8pO2lmKGtyKXtpZihrci5pZHg+PUllLmxlbmd0aCl7bGV0IEFlPXB0W2tyLmlkeC1JZS5sZW5ndGhdLmtleTtJLmFkZChBZSl9cmV0dXJuIGF3YWl0IF90KF8sa3IucmVzdWx0LHtyZXBsYWNlOmhlfSkse3Nob3J0Q2lyY3VpdGVkOiEwfX1sZXR7bG9hZGVyRGF0YTpacixlcnJvcnM6VmF9PVAwKF8seixJZSxKbCxvZSxwdCxBZCx5ZSk7eWUuZm9yRWFjaCgoQWUsV24pPT57QWUuc3Vic2NyaWJlKHFyPT57KHFyfHxBZS5kb25lKSYmeWUuZGVsZXRlKFduKX0pfSk7bGV0IE1kPWlyKCksRGQ9V28oTyksTGQ9TWR8fERkfHxwdC5sZW5ndGg+MDtyZXR1cm4gcnQoe2xvYWRlckRhdGE6WnIsZXJyb3JzOlZhfSxMZD97ZmV0Y2hlcnM6bmV3IE1hcChfLmZldGNoZXJzKX06e30pfWZ1bmN0aW9uIGJuKE4pe3JldHVybiB1LnY3X2ZldGNoZXJQZXJzaXN0JiYoVi5zZXQoTiwoVi5nZXQoTil8fDApKzEpLHRlLmhhcyhOKSYmdGUuZGVsZXRlKE4pKSxfLmZldGNoZXJzLmdldChOKXx8RE19ZnVuY3Rpb24gVGUoTixBLHosRyl7aWYocil0aHJvdyBuZXcgRXJyb3IoInJvdXRlci5mZXRjaCgpIHdhcyBjYWxsZWQgZHVyaW5nIHRoZSBzZXJ2ZXIgcmVuZGVyLCBidXQgaXQgc2hvdWxkbid0IGJlLiBZb3UgYXJlIGxpa2VseSBjYWxsaW5nIGEgdXNlRmV0Y2hlcigpIG1ldGhvZCBpbiB0aGUgYm9keSBvZiB5b3VyIGNvbXBvbmVudC4gVHJ5IG1vdmluZyBpdCB0byBhIHVzZUVmZmVjdCBvciBhIGNhbGxiYWNrLiIpO1guaGFzKE4pJiZqdChOKTtsZXQgaWU9c3x8bCxsZT1DcChfLmxvY2F0aW9uLF8ubWF0Y2hlcyxhLHUudjdfcHJlcGVuZEJhc2VuYW1lLHosQSxHPT1udWxsP3ZvaWQgMDpHLnJlbGF0aXZlKSxoZT1ybChpZSxsZSxhKTtpZighaGUpe3d0KE4sQSxSbig0MDQse3BhdGhuYW1lOmxlfSkpO3JldHVybn1sZXR7cGF0aDpzZSxzdWJtaXNzaW9uOm9lLGVycm9yOkxlfT1rMCh1LnY3X25vcm1hbGl6ZUZvcm1NZXRob2QsITAsbGUsRyk7aWYoTGUpe3d0KE4sQSxMZSk7cmV0dXJufWxldCBRZT1rcChoZSxzZSk7aWYoJD0oRyYmRy5wcmV2ZW50U2Nyb2xsUmVzZXQpPT09ITAsb2UmJlluKG9lLmZvcm1NZXRob2QpKXtmdChOLEEsc2UsUWUsaGUsb2UpO3JldHVybn1MLnNldChOLHtyb3V0ZUlkOkEscGF0aDpzZX0pLGh0KE4sQSxzZSxRZSxoZSxvZSl9YXN5bmMgZnVuY3Rpb24gZnQoTixBLHosRyxpZSxsZSl7aWYoSXQoKSxMLmRlbGV0ZShOKSwhRy5yb3V0ZS5hY3Rpb24mJiFHLnJvdXRlLmxhenkpe2xldCBpdD1Sbig0MDUse21ldGhvZDpsZS5mb3JtTWV0aG9kLHBhdGhuYW1lOnoscm91dGVJZDpBfSk7d3QoTixBLGl0KTtyZXR1cm59bGV0IGhlPV8uZmV0Y2hlcnMuZ2V0KE4pLHNlPUdNKGxlLGhlKTtfLmZldGNoZXJzLnNldChOLHNlKSxjZSh7ZmV0Y2hlcnM6bmV3IE1hcChfLmZldGNoZXJzKX0pO2xldCBvZT1uZXcgQWJvcnRDb250cm9sbGVyLExlPWZzKGUuaGlzdG9yeSx6LG9lLnNpZ25hbCxsZSk7WC5zZXQoTixvZSk7bGV0IFFlPVAsRWU9YXdhaXQgZHMoImFjdGlvbiIsTGUsRyxpZSxpLG8sYSk7aWYoTGUuc2lnbmFsLmFib3J0ZWQpe1guZ2V0KE4pPT09b2UmJlguZGVsZXRlKE4pO3JldHVybn1pZih0ZS5oYXMoTikpe18uZmV0Y2hlcnMuc2V0KE4saW8odm9pZCAwKSksY2Uoe2ZldGNoZXJzOm5ldyBNYXAoXy5mZXRjaGVycyl9KTtyZXR1cm59aWYocGwoRWUpKWlmKFguZGVsZXRlKE4pLE8+UWUpe2xldCBpdD1pbyh2b2lkIDApO18uZmV0Y2hlcnMuc2V0KE4saXQpLGNlKHtmZXRjaGVyczpuZXcgTWFwKF8uZmV0Y2hlcnMpfSk7cmV0dXJufWVsc2V7SS5hZGQoTik7bGV0IGl0PWhzKGxlKTtyZXR1cm4gXy5mZXRjaGVycy5zZXQoTixpdCksY2Uoe2ZldGNoZXJzOm5ldyBNYXAoXy5mZXRjaGVycyl9KSxfdChfLEVlLHtmZXRjaGVyU3VibWlzc2lvbjpsZX0pfWlmKFZzKEVlKSl7d3QoTixBLEVlLmVycm9yKTtyZXR1cm59aWYoZWkoRWUpKXRocm93IFJuKDQwMCx7dHlwZToiZGVmZXItYWN0aW9uIn0pO2xldCBJZT1fLm5hdmlnYXRpb24ubG9jYXRpb258fF8ubG9jYXRpb24scHQ9ZnMoZS5oaXN0b3J5LEllLG9lLnNpZ25hbCksVW89c3x8bCxWbz1fLm5hdmlnYXRpb24uc3RhdGUhPT0iaWRsZSI/cmwoVW8sXy5uYXZpZ2F0aW9uLmxvY2F0aW9uLGEpOl8ubWF0Y2hlczt3ZShWbywiRGlkbid0IGZpbmQgYW55IG1hdGNoZXMgYWZ0ZXIgZmV0Y2hlciBhY3Rpb24iKTtsZXQgSmw9KytQO2suc2V0KE4sSmwpO2xldCBBZD1ocyhsZSxFZS5kYXRhKTtfLmZldGNoZXJzLnNldChOLEFkKTtsZXRba3IsWnJdPVQwKGUuaGlzdG9yeSxfLFZvLGxlLEllLEYsYWUsSCxMLEksVW8sYSx7W0cucm91dGUuaWRdOkVlLmRhdGF9LHZvaWQgMCk7WnIuZmlsdGVyKGl0PT5pdC5rZXkhPT1OKS5mb3JFYWNoKGl0PT57bGV0IFpsPWl0LmtleSxJbT1fLmZldGNoZXJzLmdldChabCksRUM9aHModm9pZCAwLEltP0ltLmRhdGE6dm9pZCAwKTtfLmZldGNoZXJzLnNldChabCxFQyksWC5oYXMoWmwpJiZqdChabCksaXQuY29udHJvbGxlciYmWC5zZXQoWmwsaXQuY29udHJvbGxlcil9KSxjZSh7ZmV0Y2hlcnM6bmV3IE1hcChfLmZldGNoZXJzKX0pO2xldCBWYT0oKT0+WnIuZm9yRWFjaChpdD0+anQoaXQua2V5KSk7b2Uuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixWYSk7bGV0e3Jlc3VsdHM6TWQsbG9hZGVyUmVzdWx0czpEZCxmZXRjaGVyUmVzdWx0czpMZH09YXdhaXQgcG4oXy5tYXRjaGVzLFZvLGtyLFpyLHB0KTtpZihvZS5zaWduYWwuYWJvcnRlZClyZXR1cm47b2Uuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixWYSksay5kZWxldGUoTiksWC5kZWxldGUoTiksWnIuZm9yRWFjaChpdD0+WC5kZWxldGUoaXQua2V5KSk7bGV0IEFlPU0wKE1kKTtpZihBZSl7aWYoQWUuaWR4Pj1rci5sZW5ndGgpe2xldCBpdD1acltBZS5pZHgta3IubGVuZ3RoXS5rZXk7SS5hZGQoaXQpfXJldHVybiBfdChfLEFlLnJlc3VsdCl9bGV0e2xvYWRlckRhdGE6V24sZXJyb3JzOnFyfT1QMChfLF8ubWF0Y2hlcyxrcixEZCx2b2lkIDAsWnIsTGQseWUpO2lmKF8uZmV0Y2hlcnMuaGFzKE4pKXtsZXQgaXQ9aW8oRWUuZGF0YSk7Xy5mZXRjaGVycy5zZXQoTixpdCl9V28oSmwpLF8ubmF2aWdhdGlvbi5zdGF0ZT09PSJsb2FkaW5nIiYmSmw+Tz8od2UoRSwiRXhwZWN0ZWQgcGVuZGluZyBhY3Rpb24iKSxDJiZDLmFib3J0KCksX2UoXy5uYXZpZ2F0aW9uLmxvY2F0aW9uLHttYXRjaGVzOlZvLGxvYWRlckRhdGE6V24sZXJyb3JzOnFyLGZldGNoZXJzOm5ldyBNYXAoXy5mZXRjaGVycyl9KSk6KGNlKHtlcnJvcnM6cXIsbG9hZGVyRGF0YTpPMChfLmxvYWRlckRhdGEsV24sVm8scXIpLGZldGNoZXJzOm5ldyBNYXAoXy5mZXRjaGVycyl9KSxGPSExKX1hc3luYyBmdW5jdGlvbiBodChOLEEseixHLGllLGxlKXtsZXQgaGU9Xy5mZXRjaGVycy5nZXQoTiksc2U9aHMobGUsaGU/aGUuZGF0YTp2b2lkIDApO18uZmV0Y2hlcnMuc2V0KE4sc2UpLGNlKHtmZXRjaGVyczpuZXcgTWFwKF8uZmV0Y2hlcnMpfSk7bGV0IG9lPW5ldyBBYm9ydENvbnRyb2xsZXIsTGU9ZnMoZS5oaXN0b3J5LHosb2Uuc2lnbmFsKTtYLnNldChOLG9lKTtsZXQgUWU9UCxFZT1hd2FpdCBkcygibG9hZGVyIixMZSxHLGllLGksbyxhKTtpZihlaShFZSkmJihFZT1hd2FpdCBZRShFZSxMZS5zaWduYWwsITApfHxFZSksWC5nZXQoTik9PT1vZSYmWC5kZWxldGUoTiksTGUuc2lnbmFsLmFib3J0ZWQpcmV0dXJuO2lmKHRlLmhhcyhOKSl7Xy5mZXRjaGVycy5zZXQoTixpbyh2b2lkIDApKSxjZSh7ZmV0Y2hlcnM6bmV3IE1hcChfLmZldGNoZXJzKX0pO3JldHVybn1pZihwbChFZSkpaWYoTz5RZSl7bGV0IHB0PWlvKHZvaWQgMCk7Xy5mZXRjaGVycy5zZXQoTixwdCksY2Uoe2ZldGNoZXJzOm5ldyBNYXAoXy5mZXRjaGVycyl9KTtyZXR1cm59ZWxzZXtJLmFkZChOKSxhd2FpdCBfdChfLEVlKTtyZXR1cm59aWYoVnMoRWUpKXt3dChOLEEsRWUuZXJyb3IpO3JldHVybn13ZSghZWkoRWUpLCJVbmhhbmRsZWQgZmV0Y2hlciBkZWZlcnJlZCBkYXRhIik7bGV0IEllPWlvKEVlLmRhdGEpO18uZmV0Y2hlcnMuc2V0KE4sSWUpLGNlKHtmZXRjaGVyczpuZXcgTWFwKF8uZmV0Y2hlcnMpfSl9YXN5bmMgZnVuY3Rpb24gX3QoTixBLHope2xldHtzdWJtaXNzaW9uOkcsZmV0Y2hlclN1Ym1pc3Npb246aWUscmVwbGFjZTpsZX09ej09PXZvaWQgMD97fTp6O0EucmV2YWxpZGF0ZSYmKEY9ITApO2xldCBoZT1TYShOLmxvY2F0aW9uLEEubG9jYXRpb24se19pc1JlZGlyZWN0OiEwfSk7aWYod2UoaGUsIkV4cGVjdGVkIGEgbG9jYXRpb24gb24gdGhlIHJlZGlyZWN0IG5hdmlnYXRpb24iKSxuKXtsZXQgSWU9ITE7aWYoQS5yZWxvYWREb2N1bWVudClJZT0hMDtlbHNlIGlmKFZFLnRlc3QoQS5sb2NhdGlvbikpe2NvbnN0IHB0PWUuaGlzdG9yeS5jcmVhdGVVUkwoQS5sb2NhdGlvbik7SWU9cHQub3JpZ2luIT09dC5sb2NhdGlvbi5vcmlnaW58fEJhKHB0LnBhdGhuYW1lLGEpPT1udWxsfWlmKEllKXtsZT90LmxvY2F0aW9uLnJlcGxhY2UoQS5sb2NhdGlvbik6dC5sb2NhdGlvbi5hc3NpZ24oQS5sb2NhdGlvbik7cmV0dXJufX1DPW51bGw7bGV0IHNlPWxlPT09ITA/bHQuUmVwbGFjZTpsdC5QdXNoLHtmb3JtTWV0aG9kOm9lLGZvcm1BY3Rpb246TGUsZm9ybUVuY1R5cGU6UWV9PU4ubmF2aWdhdGlvbjshRyYmIWllJiZvZSYmTGUmJlFlJiYoRz1MMChOLm5hdmlnYXRpb24pKTtsZXQgRWU9R3x8aWU7aWYoTU0uaGFzKEEuc3RhdHVzKSYmRWUmJlluKEVlLmZvcm1NZXRob2QpKWF3YWl0IEJlKHNlLGhlLHtzdWJtaXNzaW9uOnJ0KHt9LEVlLHtmb3JtQWN0aW9uOkEubG9jYXRpb259KSxwcmV2ZW50U2Nyb2xsUmVzZXQ6JH0pO2Vsc2V7bGV0IEllPUFmKGhlLEcpO2F3YWl0IEJlKHNlLGhlLHtvdmVycmlkZU5hdmlnYXRpb246SWUsZmV0Y2hlclN1Ym1pc3Npb246aWUscHJldmVudFNjcm9sbFJlc2V0OiR9KX19YXN5bmMgZnVuY3Rpb24gcG4oTixBLHosRyxpZSl7bGV0IGxlPWF3YWl0IFByb21pc2UuYWxsKFsuLi56Lm1hcChvZT0+ZHMoImxvYWRlciIsaWUsb2UsQSxpLG8sYSkpLC4uLkcubWFwKG9lPT5vZS5tYXRjaGVzJiZvZS5tYXRjaCYmb2UuY29udHJvbGxlcj9kcygibG9hZGVyIixmcyhlLmhpc3Rvcnksb2UucGF0aCxvZS5jb250cm9sbGVyLnNpZ25hbCksb2UubWF0Y2gsb2UubWF0Y2hlcyxpLG8sYSk6e3R5cGU6c3QuZXJyb3IsZXJyb3I6Um4oNDA0LHtwYXRobmFtZTpvZS5wYXRofSl9KV0pLGhlPWxlLnNsaWNlKDAsei5sZW5ndGgpLHNlPWxlLnNsaWNlKHoubGVuZ3RoKTtyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoW0QwKE4seixoZSxoZS5tYXAoKCk9PmllLnNpZ25hbCksITEsXy5sb2FkZXJEYXRhKSxEMChOLEcubWFwKG9lPT5vZS5tYXRjaCksc2UsRy5tYXAob2U9Pm9lLmNvbnRyb2xsZXI/b2UuY29udHJvbGxlci5zaWduYWw6bnVsbCksITApXSkse3Jlc3VsdHM6bGUsbG9hZGVyUmVzdWx0czpoZSxmZXRjaGVyUmVzdWx0czpzZX19ZnVuY3Rpb24gSXQoKXtGPSEwLGFlLnB1c2goLi4uT2QoKSksTC5mb3JFYWNoKChOLEEpPT57WC5oYXMoQSkmJihILnB1c2goQSksanQoQSkpfSl9ZnVuY3Rpb24gd3QoTixBLHope2xldCBHPVVzKF8ubWF0Y2hlcyxBKTtPdChOKSxjZSh7ZXJyb3JzOntbRy5yb3V0ZS5pZF06en0sZmV0Y2hlcnM6bmV3IE1hcChfLmZldGNoZXJzKX0pfWZ1bmN0aW9uIE90KE4pe2xldCBBPV8uZmV0Y2hlcnMuZ2V0KE4pO1guaGFzKE4pJiYhKEEmJkEuc3RhdGU9PT0ibG9hZGluZyImJmsuaGFzKE4pKSYmanQoTiksTC5kZWxldGUoTiksay5kZWxldGUoTiksSS5kZWxldGUoTiksdGUuZGVsZXRlKE4pLF8uZmV0Y2hlcnMuZGVsZXRlKE4pfWZ1bmN0aW9uIG9yKE4pe2lmKHUudjdfZmV0Y2hlclBlcnNpc3Qpe2xldCBBPShWLmdldChOKXx8MCktMTtBPD0wPyhWLmRlbGV0ZShOKSx0ZS5hZGQoTikpOlYuc2V0KE4sQSl9ZWxzZSBPdChOKTtjZSh7ZmV0Y2hlcnM6bmV3IE1hcChfLmZldGNoZXJzKX0pfWZ1bmN0aW9uIGp0KE4pe2xldCBBPVguZ2V0KE4pO3dlKEEsIkV4cGVjdGVkIGZldGNoIGNvbnRyb2xsZXI6ICIrTiksQS5hYm9ydCgpLFguZGVsZXRlKE4pfWZ1bmN0aW9uIHp0KE4pe2ZvcihsZXQgQSBvZiBOKXtsZXQgej1ibihBKSxHPWlvKHouZGF0YSk7Xy5mZXRjaGVycy5zZXQoQSxHKX19ZnVuY3Rpb24gaXIoKXtsZXQgTj1bXSxBPSExO2ZvcihsZXQgeiBvZiBJKXtsZXQgRz1fLmZldGNoZXJzLmdldCh6KTt3ZShHLCJFeHBlY3RlZCBmZXRjaGVyOiAiK3opLEcuc3RhdGU9PT0ibG9hZGluZyImJihJLmRlbGV0ZSh6KSxOLnB1c2goeiksQT0hMCl9cmV0dXJuIHp0KE4pLEF9ZnVuY3Rpb24gV28oTil7bGV0IEE9W107Zm9yKGxldFt6LEddb2YgaylpZihHPE4pe2xldCBpZT1fLmZldGNoZXJzLmdldCh6KTt3ZShpZSwiRXhwZWN0ZWQgZmV0Y2hlcjogIit6KSxpZS5zdGF0ZT09PSJsb2FkaW5nIiYmKGp0KHopLGsuZGVsZXRlKHopLEEucHVzaCh6KSl9cmV0dXJuIHp0KEEpLEEubGVuZ3RoPjB9ZnVuY3Rpb24gV2EoTixBKXtsZXQgej1fLmJsb2NrZXJzLmdldChOKXx8Y3M7cmV0dXJuIGZlLmdldChOKSE9PUEmJmZlLnNldChOLEEpLHp9ZnVuY3Rpb24gQW0oTil7Xy5ibG9ja2Vycy5kZWxldGUoTiksZmUuZGVsZXRlKE4pfWZ1bmN0aW9uIFVhKE4sQSl7bGV0IHo9Xy5ibG9ja2Vycy5nZXQoTil8fGNzO3dlKHouc3RhdGU9PT0idW5ibG9ja2VkIiYmQS5zdGF0ZT09PSJibG9ja2VkInx8ei5zdGF0ZT09PSJibG9ja2VkIiYmQS5zdGF0ZT09PSJibG9ja2VkInx8ei5zdGF0ZT09PSJibG9ja2VkIiYmQS5zdGF0ZT09PSJwcm9jZWVkaW5nInx8ei5zdGF0ZT09PSJibG9ja2VkIiYmQS5zdGF0ZT09PSJ1bmJsb2NrZWQifHx6LnN0YXRlPT09InByb2NlZWRpbmciJiZBLnN0YXRlPT09InVuYmxvY2tlZCIsIkludmFsaWQgYmxvY2tlciBzdGF0ZSB0cmFuc2l0aW9uOiAiK3ouc3RhdGUrIiAtPiAiK0Euc3RhdGUpO2xldCBHPW5ldyBNYXAoXy5ibG9ja2Vycyk7Ry5zZXQoTixBKSxjZSh7YmxvY2tlcnM6R30pfWZ1bmN0aW9uIE1tKE4pe2xldHtjdXJyZW50TG9jYXRpb246QSxuZXh0TG9jYXRpb246eixoaXN0b3J5QWN0aW9uOkd9PU47aWYoZmUuc2l6ZT09PTApcmV0dXJuO2ZlLnNpemU+MSYmdmkoITEsIkEgcm91dGVyIG9ubHkgc3VwcG9ydHMgb25lIGJsb2NrZXIgYXQgYSB0aW1lIik7bGV0IGllPUFycmF5LmZyb20oZmUuZW50cmllcygpKSxbbGUsaGVdPWllW2llLmxlbmd0aC0xXSxzZT1fLmJsb2NrZXJzLmdldChsZSk7aWYoIShzZSYmc2Uuc3RhdGU9PT0icHJvY2VlZGluZyIpJiZoZSh7Y3VycmVudExvY2F0aW9uOkEsbmV4dExvY2F0aW9uOnosaGlzdG9yeUFjdGlvbjpHfSkpcmV0dXJuIGxlfWZ1bmN0aW9uIE9kKE4pe2xldCBBPVtdO3JldHVybiB5ZS5mb3JFYWNoKCh6LEcpPT57KCFOfHxOKEcpKSYmKHouY2FuY2VsKCksQS5wdXNoKEcpLHllLmRlbGV0ZShHKSl9KSxBfWZ1bmN0aW9uIF9DKE4sQSx6KXtpZihmPU4sZz1BLGg9enx8bnVsbCwhbSYmXy5uYXZpZ2F0aW9uPT09T2Ype209ITA7bGV0IEc9TG0oXy5sb2NhdGlvbixfLm1hdGNoZXMpO0chPW51bGwmJmNlKHtyZXN0b3JlU2Nyb2xsUG9zaXRpb246R30pfXJldHVybigpPT57Zj1udWxsLGc9bnVsbCxoPW51bGx9fWZ1bmN0aW9uIERtKE4sQSl7cmV0dXJuIGgmJmgoTixBLm1hcChHPT5jTShHLF8ubG9hZGVyRGF0YSkpKXx8Ti5rZXl9ZnVuY3Rpb24gd0MoTixBKXtpZihmJiZnKXtsZXQgej1EbShOLEEpO2Zbel09ZygpfX1mdW5jdGlvbiBMbShOLEEpe2lmKGYpe2xldCB6PURtKE4sQSksRz1mW3pdO2lmKHR5cGVvZiBHPT0ibnVtYmVyIilyZXR1cm4gR31yZXR1cm4gbnVsbH1mdW5jdGlvbiBTQyhOKXtpPXt9LHM9RXAoTixvLHZvaWQgMCxpKX1yZXR1cm4geD17Z2V0IGJhc2VuYW1lKCl7cmV0dXJuIGF9LGdldCBzdGF0ZSgpe3JldHVybiBffSxnZXQgcm91dGVzKCl7cmV0dXJuIGx9LGdldCB3aW5kb3coKXtyZXR1cm4gdH0saW5pdGlhbGl6ZTpiZSxzdWJzY3JpYmU6a2UsZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb246X0MsbmF2aWdhdGU6bWUsZmV0Y2g6VGUscmV2YWxpZGF0ZTokZSxjcmVhdGVIcmVmOk49PmUuaGlzdG9yeS5jcmVhdGVIcmVmKE4pLGVuY29kZUxvY2F0aW9uOk49PmUuaGlzdG9yeS5lbmNvZGVMb2NhdGlvbihOKSxnZXRGZXRjaGVyOmJuLGRlbGV0ZUZldGNoZXI6b3IsZGlzcG9zZTpaLGdldEJsb2NrZXI6V2EsZGVsZXRlQmxvY2tlcjpBbSxfaW50ZXJuYWxGZXRjaENvbnRyb2xsZXJzOlgsX2ludGVybmFsQWN0aXZlRGVmZXJyZWRzOnllLF9pbnRlcm5hbFNldFJvdXRlczpTQ30seH1mdW5jdGlvbiBqTShlKXtyZXR1cm4gZSE9bnVsbCYmKCJmb3JtRGF0YSJpbiBlJiZlLmZvcm1EYXRhIT1udWxsfHwiYm9keSJpbiBlJiZlLmJvZHkhPT12b2lkIDApfWZ1bmN0aW9uIENwKGUsdCxuLHIsbyxpLGwpe2xldCBzLGE7aWYoaSE9bnVsbCYmbCE9PSJwYXRoIil7cz1bXTtmb3IobGV0IGMgb2YgdClpZihzLnB1c2goYyksYy5yb3V0ZS5pZD09PWkpe2E9YzticmVha319ZWxzZSBzPXQsYT10W3QubGVuZ3RoLTFdO2xldCB1PUJFKG98fCIuIixFbShzKS5tYXAoYz0+Yy5wYXRobmFtZUJhc2UpLEJhKGUucGF0aG5hbWUsbil8fGUucGF0aG5hbWUsbD09PSJwYXRoIik7cmV0dXJuIG89PW51bGwmJih1LnNlYXJjaD1lLnNlYXJjaCx1Lmhhc2g9ZS5oYXNoKSwobz09bnVsbHx8bz09PSIifHxvPT09Ii4iKSYmYSYmYS5yb3V0ZS5pbmRleCYmISRtKHUuc2VhcmNoKSYmKHUuc2VhcmNoPXUuc2VhcmNoP3Uuc2VhcmNoLnJlcGxhY2UoL15cPy8sIj9pbmRleCYiKToiP2luZGV4IiksciYmbiE9PSIvIiYmKHUucGF0aG5hbWU9dS5wYXRobmFtZT09PSIvIj9uOmtvKFtuLHUucGF0aG5hbWVdKSksRmEodSl9ZnVuY3Rpb24gazAoZSx0LG4scil7aWYoIXJ8fCFqTShyKSlyZXR1cm57cGF0aDpufTtpZihyLmZvcm1NZXRob2QmJiFITShyLmZvcm1NZXRob2QpKXJldHVybntwYXRoOm4sZXJyb3I6Um4oNDA1LHttZXRob2Q6ci5mb3JtTWV0aG9kfSl9O2xldCBvPSgpPT4oe3BhdGg6bixlcnJvcjpSbig0MDAse3R5cGU6ImludmFsaWQtYm9keSJ9KX0pLGk9ci5mb3JtTWV0aG9kfHwiZ2V0IixsPWU/aS50b1VwcGVyQ2FzZSgpOmkudG9Mb3dlckNhc2UoKSxzPUdFKG4pO2lmKHIuYm9keSE9PXZvaWQgMCl7aWYoci5mb3JtRW5jVHlwZT09PSJ0ZXh0L3BsYWluIil7aWYoIVluKGwpKXJldHVybiBvKCk7bGV0IGY9dHlwZW9mIHIuYm9keT09InN0cmluZyI/ci5ib2R5OnIuYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhfHxyLmJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM/QXJyYXkuZnJvbShyLmJvZHkuZW50cmllcygpKS5yZWR1Y2UoKGgsZyk9PntsZXRbbSxTXT1nO3JldHVybiIiK2grbSsiPSIrUytgCmB9LCIiKTpTdHJpbmcoci5ib2R5KTtyZXR1cm57cGF0aDpuLHN1Ym1pc3Npb246e2Zvcm1NZXRob2Q6bCxmb3JtQWN0aW9uOnMsZm9ybUVuY1R5cGU6ci5mb3JtRW5jVHlwZSxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDpmfX19ZWxzZSBpZihyLmZvcm1FbmNUeXBlPT09ImFwcGxpY2F0aW9uL2pzb24iKXtpZighWW4obCkpcmV0dXJuIG8oKTt0cnl7bGV0IGY9dHlwZW9mIHIuYm9keT09InN0cmluZyI/SlNPTi5wYXJzZShyLmJvZHkpOnIuYm9keTtyZXR1cm57cGF0aDpuLHN1Ym1pc3Npb246e2Zvcm1NZXRob2Q6bCxmb3JtQWN0aW9uOnMsZm9ybUVuY1R5cGU6ci5mb3JtRW5jVHlwZSxmb3JtRGF0YTp2b2lkIDAsanNvbjpmLHRleHQ6dm9pZCAwfX19Y2F0Y2h7cmV0dXJuIG8oKX19fXdlKHR5cGVvZiBGb3JtRGF0YT09ImZ1bmN0aW9uIiwiRm9ybURhdGEgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Iik7bGV0IGEsdTtpZihyLmZvcm1EYXRhKWE9JHAoci5mb3JtRGF0YSksdT1yLmZvcm1EYXRhO2Vsc2UgaWYoci5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpYT0kcChyLmJvZHkpLHU9ci5ib2R5O2Vsc2UgaWYoci5ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKWE9ci5ib2R5LHU9UjAoYSk7ZWxzZSBpZihyLmJvZHk9PW51bGwpYT1uZXcgVVJMU2VhcmNoUGFyYW1zLHU9bmV3IEZvcm1EYXRhO2Vsc2UgdHJ5e2E9bmV3IFVSTFNlYXJjaFBhcmFtcyhyLmJvZHkpLHU9UjAoYSl9Y2F0Y2h7cmV0dXJuIG8oKX1sZXQgYz17Zm9ybU1ldGhvZDpsLGZvcm1BY3Rpb246cyxmb3JtRW5jVHlwZTpyJiZyLmZvcm1FbmNUeXBlfHwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixmb3JtRGF0YTp1LGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfTtpZihZbihjLmZvcm1NZXRob2QpKXJldHVybntwYXRoOm4sc3VibWlzc2lvbjpjfTtsZXQgZD1KcihuKTtyZXR1cm4gdCYmZC5zZWFyY2gmJiRtKGQuc2VhcmNoKSYmYS5hcHBlbmQoImluZGV4IiwiIiksZC5zZWFyY2g9Ij8iK2Ese3BhdGg6RmEoZCksc3VibWlzc2lvbjpjfX1mdW5jdGlvbiB6TShlLHQpe2xldCBuPWU7aWYodCl7bGV0IHI9ZS5maW5kSW5kZXgobz0+by5yb3V0ZS5pZD09PXQpO3I+PTAmJihuPWUuc2xpY2UoMCxyKSl9cmV0dXJuIG59ZnVuY3Rpb24gVDAoZSx0LG4scixvLGksbCxzLGEsdSxjLGQsZixoKXtsZXQgZz1oP09iamVjdC52YWx1ZXMoaClbMF06Zj9PYmplY3QudmFsdWVzKGYpWzBdOnZvaWQgMCxtPWUuY3JlYXRlVVJMKHQubG9jYXRpb24pLFM9ZS5jcmVhdGVVUkwobyksdj1oP09iamVjdC5rZXlzKGgpWzBdOnZvaWQgMCx4PXpNKG4sdikuZmlsdGVyKChFLCQpPT57aWYoRS5yb3V0ZS5sYXp5KXJldHVybiEwO2lmKEUucm91dGUubG9hZGVyPT1udWxsKXJldHVybiExO2lmKEZNKHQubG9hZGVyRGF0YSx0Lm1hdGNoZXNbJF0sRSl8fGwuc29tZShNPT5NPT09RS5yb3V0ZS5pZCkpcmV0dXJuITA7bGV0IEM9dC5tYXRjaGVzWyRdLFQ9RTtyZXR1cm4gTjAoRSxydCh7Y3VycmVudFVybDptLGN1cnJlbnRQYXJhbXM6Qy5wYXJhbXMsbmV4dFVybDpTLG5leHRQYXJhbXM6VC5wYXJhbXN9LHIse2FjdGlvblJlc3VsdDpnLGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlOml8fG0ucGF0aG5hbWUrbS5zZWFyY2g9PT1TLnBhdGhuYW1lK1Muc2VhcmNofHxtLnNlYXJjaCE9PVMuc2VhcmNofHxLRShDLFQpfSkpfSksXz1bXTtyZXR1cm4gYS5mb3JFYWNoKChFLCQpPT57aWYoIW4uc29tZShqPT5qLnJvdXRlLmlkPT09RS5yb3V0ZUlkKSlyZXR1cm47bGV0IEM9cmwoYyxFLnBhdGgsZCk7aWYoIUMpe18ucHVzaCh7a2V5OiQscm91dGVJZDpFLnJvdXRlSWQscGF0aDpFLnBhdGgsbWF0Y2hlczpudWxsLG1hdGNoOm51bGwsY29udHJvbGxlcjpudWxsfSk7cmV0dXJufWxldCBUPXQuZmV0Y2hlcnMuZ2V0KCQpLE09a3AoQyxFLnBhdGgpLFI9ITE7dS5oYXMoJCk/Uj0hMTpzLmluY2x1ZGVzKCQpP1I9ITA6VCYmVC5zdGF0ZSE9PSJpZGxlIiYmVC5kYXRhPT09dm9pZCAwP1I9aTpSPU4wKE0scnQoe2N1cnJlbnRVcmw6bSxjdXJyZW50UGFyYW1zOnQubWF0Y2hlc1t0Lm1hdGNoZXMubGVuZ3RoLTFdLnBhcmFtcyxuZXh0VXJsOlMsbmV4dFBhcmFtczpuW24ubGVuZ3RoLTFdLnBhcmFtc30scix7YWN0aW9uUmVzdWx0OmcsZGVmYXVsdFNob3VsZFJldmFsaWRhdGU6aX0pKSxSJiZfLnB1c2goe2tleTokLHJvdXRlSWQ6RS5yb3V0ZUlkLHBhdGg6RS5wYXRoLG1hdGNoZXM6QyxtYXRjaDpNLGNvbnRyb2xsZXI6bmV3IEFib3J0Q29udHJvbGxlcn0pfSksW3gsX119ZnVuY3Rpb24gRk0oZSx0LG4pe2xldCByPSF0fHxuLnJvdXRlLmlkIT09dC5yb3V0ZS5pZCxvPWVbbi5yb3V0ZS5pZF09PT12b2lkIDA7cmV0dXJuIHJ8fG99ZnVuY3Rpb24gS0UoZSx0KXtsZXQgbj1lLnJvdXRlLnBhdGg7cmV0dXJuIGUucGF0aG5hbWUhPT10LnBhdGhuYW1lfHxuIT1udWxsJiZuLmVuZHNXaXRoKCIqIikmJmUucGFyYW1zWyIqIl0hPT10LnBhcmFtc1siKiJdfWZ1bmN0aW9uIE4wKGUsdCl7aWYoZS5yb3V0ZS5zaG91bGRSZXZhbGlkYXRlKXtsZXQgbj1lLnJvdXRlLnNob3VsZFJldmFsaWRhdGUodCk7aWYodHlwZW9mIG49PSJib29sZWFuIilyZXR1cm4gbn1yZXR1cm4gdC5kZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZX1hc3luYyBmdW5jdGlvbiBiMChlLHQsbil7aWYoIWUubGF6eSlyZXR1cm47bGV0IHI9YXdhaXQgZS5sYXp5KCk7aWYoIWUubGF6eSlyZXR1cm47bGV0IG89bltlLmlkXTt3ZShvLCJObyByb3V0ZSBmb3VuZCBpbiBtYW5pZmVzdCIpO2xldCBpPXt9O2ZvcihsZXQgbCBpbiByKXtsZXQgYT1vW2xdIT09dm9pZCAwJiZsIT09Imhhc0Vycm9yQm91bmRhcnkiO3ZpKCFhLCdSb3V0ZSAiJytvLmlkKyciIGhhcyBhIHN0YXRpYyBwcm9wZXJ0eSAiJytsKyciIGRlZmluZWQgYnV0IGl0cyBsYXp5IGZ1bmN0aW9uIGlzIGFsc28gcmV0dXJuaW5nIGEgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkuICcrKCdUaGUgbGF6eSByb3V0ZSBwcm9wZXJ0eSAiJytsKyciIHdpbGwgYmUgaWdub3JlZC4nKSksIWEmJiFhTS5oYXMobCkmJihpW2xdPXJbbF0pfU9iamVjdC5hc3NpZ24obyxpKSxPYmplY3QuYXNzaWduKG8scnQoe30sdChvKSx7bGF6eTp2b2lkIDB9KSl9YXN5bmMgZnVuY3Rpb24gZHMoZSx0LG4scixvLGksbCxzKXtzPT09dm9pZCAwJiYocz17fSk7bGV0IGEsdSxjLGQ9Zz0+e2xldCBtLFM9bmV3IFByb21pc2UoKHYseSk9Pm09eSk7cmV0dXJuIGM9KCk9Pm0oKSx0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYyksUHJvbWlzZS5yYWNlKFtnKHtyZXF1ZXN0OnQscGFyYW1zOm4ucGFyYW1zLGNvbnRleHQ6cy5yZXF1ZXN0Q29udGV4dH0pLFNdKX07dHJ5e2xldCBnPW4ucm91dGVbZV07aWYobi5yb3V0ZS5sYXp5KWlmKGcpe2xldCBtLFM9YXdhaXQgUHJvbWlzZS5hbGwoW2QoZykuY2F0Y2godj0+e209dn0pLGIwKG4ucm91dGUsaSxvKV0pO2lmKG0pdGhyb3cgbTt1PVNbMF19ZWxzZSBpZihhd2FpdCBiMChuLnJvdXRlLGksbyksZz1uLnJvdXRlW2VdLGcpdT1hd2FpdCBkKGcpO2Vsc2UgaWYoZT09PSJhY3Rpb24iKXtsZXQgbT1uZXcgVVJMKHQudXJsKSxTPW0ucGF0aG5hbWUrbS5zZWFyY2g7dGhyb3cgUm4oNDA1LHttZXRob2Q6dC5tZXRob2QscGF0aG5hbWU6Uyxyb3V0ZUlkOm4ucm91dGUuaWR9KX1lbHNlIHJldHVybnt0eXBlOnN0LmRhdGEsZGF0YTp2b2lkIDB9O2Vsc2UgaWYoZyl1PWF3YWl0IGQoZyk7ZWxzZXtsZXQgbT1uZXcgVVJMKHQudXJsKSxTPW0ucGF0aG5hbWUrbS5zZWFyY2g7dGhyb3cgUm4oNDA0LHtwYXRobmFtZTpTfSl9d2UodSE9PXZvaWQgMCwiWW91IGRlZmluZWQgIisoZT09PSJhY3Rpb24iPyJhbiBhY3Rpb24iOiJhIGxvYWRlciIpKyIgZm9yIHJvdXRlICIrKCciJytuLnJvdXRlLmlkKyJcIiBidXQgZGlkbid0IHJldHVybiBhbnl0aGluZyBmcm9tIHlvdXIgYCIrZSsiYCAiKSsiZnVuY3Rpb24uIFBsZWFzZSByZXR1cm4gYSB2YWx1ZSBvciBgbnVsbGAuIil9Y2F0Y2goZyl7YT1zdC5lcnJvcix1PWd9ZmluYWxseXtjJiZ0LnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsYyl9aWYoVk0odSkpe2xldCBnPXUuc3RhdHVzO2lmKEFNLmhhcyhnKSl7bGV0IHY9dS5oZWFkZXJzLmdldCgiTG9jYXRpb24iKTtpZih3ZSh2LCJSZWRpcmVjdHMgcmV0dXJuZWQvdGhyb3duIGZyb20gbG9hZGVycy9hY3Rpb25zIG11c3QgaGF2ZSBhIExvY2F0aW9uIGhlYWRlciIpLCFWRS50ZXN0KHYpKXY9Q3AobmV3IFVSTCh0LnVybCksci5zbGljZSgwLHIuaW5kZXhPZihuKSsxKSxsLCEwLHYpO2Vsc2UgaWYoIXMuaXNTdGF0aWNSZXF1ZXN0KXtsZXQgeT1uZXcgVVJMKHQudXJsKSx4PXYuc3RhcnRzV2l0aCgiLy8iKT9uZXcgVVJMKHkucHJvdG9jb2wrdik6bmV3IFVSTCh2KSxfPUJhKHgucGF0aG5hbWUsbCkhPW51bGw7eC5vcmlnaW49PT15Lm9yaWdpbiYmXyYmKHY9eC5wYXRobmFtZSt4LnNlYXJjaCt4Lmhhc2gpfWlmKHMuaXNTdGF0aWNSZXF1ZXN0KXRocm93IHUuaGVhZGVycy5zZXQoIkxvY2F0aW9uIix2KSx1O3JldHVybnt0eXBlOnN0LnJlZGlyZWN0LHN0YXR1czpnLGxvY2F0aW9uOnYscmV2YWxpZGF0ZTp1LmhlYWRlcnMuZ2V0KCJYLVJlbWl4LVJldmFsaWRhdGUiKSE9PW51bGwscmVsb2FkRG9jdW1lbnQ6dS5oZWFkZXJzLmdldCgiWC1SZW1peC1SZWxvYWQtRG9jdW1lbnQiKSE9PW51bGx9fWlmKHMuaXNSb3V0ZVJlcXVlc3QpdGhyb3d7dHlwZTphPT09c3QuZXJyb3I/c3QuZXJyb3I6c3QuZGF0YSxyZXNwb25zZTp1fTtsZXQgbSxTPXUuaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpO3JldHVybiBTJiYvXGJhcHBsaWNhdGlvblwvanNvblxiLy50ZXN0KFMpP209YXdhaXQgdS5qc29uKCk6bT1hd2FpdCB1LnRleHQoKSxhPT09c3QuZXJyb3I/e3R5cGU6YSxlcnJvcjpuZXcgQ20oZyx1LnN0YXR1c1RleHQsbSksaGVhZGVyczp1LmhlYWRlcnN9Ont0eXBlOnN0LmRhdGEsZGF0YTptLHN0YXR1c0NvZGU6dS5zdGF0dXMsaGVhZGVyczp1LmhlYWRlcnN9fWlmKGE9PT1zdC5lcnJvcilyZXR1cm57dHlwZTphLGVycm9yOnV9O2lmKFVNKHUpKXt2YXIgZixoO3JldHVybnt0eXBlOnN0LmRlZmVycmVkLGRlZmVycmVkRGF0YTp1LHN0YXR1c0NvZGU6KGY9dS5pbml0KT09bnVsbD92b2lkIDA6Zi5zdGF0dXMsaGVhZGVyczooKGg9dS5pbml0KT09bnVsbD92b2lkIDA6aC5oZWFkZXJzKSYmbmV3IEhlYWRlcnModS5pbml0LmhlYWRlcnMpfX1yZXR1cm57dHlwZTpzdC5kYXRhLGRhdGE6dX19ZnVuY3Rpb24gZnMoZSx0LG4scil7bGV0IG89ZS5jcmVhdGVVUkwoR0UodCkpLnRvU3RyaW5nKCksaT17c2lnbmFsOm59O2lmKHImJlluKHIuZm9ybU1ldGhvZCkpe2xldHtmb3JtTWV0aG9kOmwsZm9ybUVuY1R5cGU6c309cjtpLm1ldGhvZD1sLnRvVXBwZXJDYXNlKCkscz09PSJhcHBsaWNhdGlvbi9qc29uIj8oaS5oZWFkZXJzPW5ldyBIZWFkZXJzKHsiQ29udGVudC1UeXBlIjpzfSksaS5ib2R5PUpTT04uc3RyaW5naWZ5KHIuanNvbikpOnM9PT0idGV4dC9wbGFpbiI/aS5ib2R5PXIudGV4dDpzPT09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCImJnIuZm9ybURhdGE/aS5ib2R5PSRwKHIuZm9ybURhdGEpOmkuYm9keT1yLmZvcm1EYXRhfXJldHVybiBuZXcgUmVxdWVzdChvLGkpfWZ1bmN0aW9uICRwKGUpe2xldCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7Zm9yKGxldFtuLHJdb2YgZS5lbnRyaWVzKCkpdC5hcHBlbmQobix0eXBlb2Ygcj09InN0cmluZyI/cjpyLm5hbWUpO3JldHVybiB0fWZ1bmN0aW9uIFIwKGUpe2xldCB0PW5ldyBGb3JtRGF0YTtmb3IobGV0W24scl1vZiBlLmVudHJpZXMoKSl0LmFwcGVuZChuLHIpO3JldHVybiB0fWZ1bmN0aW9uIEJNKGUsdCxuLHIsbyl7bGV0IGk9e30sbD1udWxsLHMsYT0hMSx1PXt9O3JldHVybiBuLmZvckVhY2goKGMsZCk9PntsZXQgZj10W2RdLnJvdXRlLmlkO2lmKHdlKCFwbChjKSwiQ2Fubm90IGhhbmRsZSByZWRpcmVjdCByZXN1bHRzIGluIHByb2Nlc3NMb2FkZXJEYXRhIiksVnMoYykpe2xldCBoPVVzKGUsZiksZz1jLmVycm9yO3ImJihnPU9iamVjdC52YWx1ZXMocilbMF0scj12b2lkIDApLGw9bHx8e30sbFtoLnJvdXRlLmlkXT09bnVsbCYmKGxbaC5yb3V0ZS5pZF09ZyksaVtmXT12b2lkIDAsYXx8KGE9ITAscz1XRShjLmVycm9yKT9jLmVycm9yLnN0YXR1czo1MDApLGMuaGVhZGVycyYmKHVbZl09Yy5oZWFkZXJzKX1lbHNlIGVpKGMpPyhvLnNldChmLGMuZGVmZXJyZWREYXRhKSxpW2ZdPWMuZGVmZXJyZWREYXRhLmRhdGEpOmlbZl09Yy5kYXRhLGMuc3RhdHVzQ29kZSE9bnVsbCYmYy5zdGF0dXNDb2RlIT09MjAwJiYhYSYmKHM9Yy5zdGF0dXNDb2RlKSxjLmhlYWRlcnMmJih1W2ZdPWMuaGVhZGVycyl9KSxyJiYobD1yLGlbT2JqZWN0LmtleXMocilbMF1dPXZvaWQgMCkse2xvYWRlckRhdGE6aSxlcnJvcnM6bCxzdGF0dXNDb2RlOnN8fDIwMCxsb2FkZXJIZWFkZXJzOnV9fWZ1bmN0aW9uIFAwKGUsdCxuLHIsbyxpLGwscyl7bGV0e2xvYWRlckRhdGE6YSxlcnJvcnM6dX09Qk0odCxuLHIsbyxzKTtmb3IobGV0IGM9MDtjPGkubGVuZ3RoO2MrKyl7bGV0e2tleTpkLG1hdGNoOmYsY29udHJvbGxlcjpofT1pW2NdO3dlKGwhPT12b2lkIDAmJmxbY10hPT12b2lkIDAsIkRpZCBub3QgZmluZCBjb3JyZXNwb25kaW5nIGZldGNoZXIgcmVzdWx0Iik7bGV0IGc9bFtjXTtpZighKGgmJmguc2lnbmFsLmFib3J0ZWQpKWlmKFZzKGcpKXtsZXQgbT1VcyhlLm1hdGNoZXMsZj09bnVsbD92b2lkIDA6Zi5yb3V0ZS5pZCk7dSYmdVttLnJvdXRlLmlkXXx8KHU9cnQoe30sdSx7W20ucm91dGUuaWRdOmcuZXJyb3J9KSksZS5mZXRjaGVycy5kZWxldGUoZCl9ZWxzZSBpZihwbChnKSl3ZSghMSwiVW5oYW5kbGVkIGZldGNoZXIgcmV2YWxpZGF0aW9uIHJlZGlyZWN0Iik7ZWxzZSBpZihlaShnKSl3ZSghMSwiVW5oYW5kbGVkIGZldGNoZXIgZGVmZXJyZWQgZGF0YSIpO2Vsc2V7bGV0IG09aW8oZy5kYXRhKTtlLmZldGNoZXJzLnNldChkLG0pfX1yZXR1cm57bG9hZGVyRGF0YTphLGVycm9yczp1fX1mdW5jdGlvbiBPMChlLHQsbixyKXtsZXQgbz1ydCh7fSx0KTtmb3IobGV0IGkgb2Ygbil7bGV0IGw9aS5yb3V0ZS5pZDtpZih0Lmhhc093blByb3BlcnR5KGwpP3RbbF0hPT12b2lkIDAmJihvW2xdPXRbbF0pOmVbbF0hPT12b2lkIDAmJmkucm91dGUubG9hZGVyJiYob1tsXT1lW2xdKSxyJiZyLmhhc093blByb3BlcnR5KGwpKWJyZWFrfXJldHVybiBvfWZ1bmN0aW9uIFVzKGUsdCl7cmV0dXJuKHQ/ZS5zbGljZSgwLGUuZmluZEluZGV4KHI9PnIucm91dGUuaWQ9PT10KSsxKTpbLi4uZV0pLnJldmVyc2UoKS5maW5kKHI9PnIucm91dGUuaGFzRXJyb3JCb3VuZGFyeT09PSEwKXx8ZVswXX1mdW5jdGlvbiBBMChlKXtsZXQgdD1lLmxlbmd0aD09PTE/ZVswXTplLmZpbmQobj0+bi5pbmRleHx8IW4ucGF0aHx8bi5wYXRoPT09Ii8iKXx8e2lkOiJfX3NoaW0tZXJyb3Itcm91dGVfXyJ9O3JldHVybnttYXRjaGVzOlt7cGFyYW1zOnt9LHBhdGhuYW1lOiIiLHBhdGhuYW1lQmFzZToiIixyb3V0ZTp0fV0scm91dGU6dH19ZnVuY3Rpb24gUm4oZSx0KXtsZXR7cGF0aG5hbWU6bixyb3V0ZUlkOnIsbWV0aG9kOm8sdHlwZTppfT10PT09dm9pZCAwP3t9OnQsbD0iVW5rbm93biBTZXJ2ZXIgRXJyb3IiLHM9IlVua25vd24gQHJlbWl4LXJ1bi9yb3V0ZXIgZXJyb3IiO3JldHVybiBlPT09NDAwPyhsPSJCYWQgUmVxdWVzdCIsbyYmbiYmcj9zPSJZb3UgbWFkZSBhICIrbysnIHJlcXVlc3QgdG8gIicrbisnIiBidXQgJysoJ2RpZCBub3QgcHJvdmlkZSBhIGBsb2FkZXJgIGZvciByb3V0ZSAiJytyKyciLCAnKSsic28gdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4iOmk9PT0iZGVmZXItYWN0aW9uIj9zPSJkZWZlcigpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYWN0aW9ucyI6aT09PSJpbnZhbGlkLWJvZHkiJiYocz0iVW5hYmxlIHRvIGVuY29kZSBzdWJtaXNzaW9uIGJvZHkiKSk6ZT09PTQwMz8obD0iRm9yYmlkZGVuIixzPSdSb3V0ZSAiJytyKyciIGRvZXMgbm90IG1hdGNoIFVSTCAiJytuKyciJyk6ZT09PTQwND8obD0iTm90IEZvdW5kIixzPSdObyByb3V0ZSBtYXRjaGVzIFVSTCAiJytuKyciJyk6ZT09PTQwNSYmKGw9Ik1ldGhvZCBOb3QgQWxsb3dlZCIsbyYmbiYmcj9zPSJZb3UgbWFkZSBhICIrby50b1VwcGVyQ2FzZSgpKycgcmVxdWVzdCB0byAiJytuKyciIGJ1dCAnKygnZGlkIG5vdCBwcm92aWRlIGFuIGBhY3Rpb25gIGZvciByb3V0ZSAiJytyKyciLCAnKSsic28gdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4iOm8mJihzPSdJbnZhbGlkIHJlcXVlc3QgbWV0aG9kICInK28udG9VcHBlckNhc2UoKSsnIicpKSxuZXcgQ20oZXx8NTAwLGwsbmV3IEVycm9yKHMpLCEwKX1mdW5jdGlvbiBNMChlKXtmb3IobGV0IHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSl7bGV0IG49ZVt0XTtpZihwbChuKSlyZXR1cm57cmVzdWx0Om4saWR4OnR9fX1mdW5jdGlvbiBHRShlKXtsZXQgdD10eXBlb2YgZT09InN0cmluZyI/SnIoZSk6ZTtyZXR1cm4gRmEocnQoe30sdCx7aGFzaDoiIn0pKX1mdW5jdGlvbiBXTShlLHQpe3JldHVybiBlLnBhdGhuYW1lIT09dC5wYXRobmFtZXx8ZS5zZWFyY2ghPT10LnNlYXJjaD8hMTplLmhhc2g9PT0iIj90Lmhhc2ghPT0iIjplLmhhc2g9PT10Lmhhc2g/ITA6dC5oYXNoIT09IiJ9ZnVuY3Rpb24gZWkoZSl7cmV0dXJuIGUudHlwZT09PXN0LmRlZmVycmVkfWZ1bmN0aW9uIFZzKGUpe3JldHVybiBlLnR5cGU9PT1zdC5lcnJvcn1mdW5jdGlvbiBwbChlKXtyZXR1cm4oZSYmZS50eXBlKT09PXN0LnJlZGlyZWN0fWZ1bmN0aW9uIFVNKGUpe2xldCB0PWU7cmV0dXJuIHQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmdHlwZW9mIHQuZGF0YT09Im9iamVjdCImJnR5cGVvZiB0LnN1YnNjcmliZT09ImZ1bmN0aW9uIiYmdHlwZW9mIHQuY2FuY2VsPT0iZnVuY3Rpb24iJiZ0eXBlb2YgdC5yZXNvbHZlRGF0YT09ImZ1bmN0aW9uIn1mdW5jdGlvbiBWTShlKXtyZXR1cm4gZSE9bnVsbCYmdHlwZW9mIGUuc3RhdHVzPT0ibnVtYmVyIiYmdHlwZW9mIGUuc3RhdHVzVGV4dD09InN0cmluZyImJnR5cGVvZiBlLmhlYWRlcnM9PSJvYmplY3QiJiZ0eXBlb2YgZS5ib2R5PCJ1In1mdW5jdGlvbiBITShlKXtyZXR1cm4gT00uaGFzKGUudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gWW4oZSl7cmV0dXJuIFJNLmhhcyhlLnRvTG93ZXJDYXNlKCkpfWFzeW5jIGZ1bmN0aW9uIEQwKGUsdCxuLHIsbyxpKXtmb3IobGV0IGw9MDtsPG4ubGVuZ3RoO2wrKyl7bGV0IHM9bltsXSxhPXRbbF07aWYoIWEpY29udGludWU7bGV0IHU9ZS5maW5kKGQ9PmQucm91dGUuaWQ9PT1hLnJvdXRlLmlkKSxjPXUhPW51bGwmJiFLRSh1LGEpJiYoaSYmaVthLnJvdXRlLmlkXSkhPT12b2lkIDA7aWYoZWkocykmJihvfHxjKSl7bGV0IGQ9cltsXTt3ZShkLCJFeHBlY3RlZCBhbiBBYm9ydFNpZ25hbCBmb3IgcmV2YWxpZGF0aW5nIGZldGNoZXIgZGVmZXJyZWQgcmVzdWx0IiksYXdhaXQgWUUocyxkLG8pLnRoZW4oZj0+e2YmJihuW2xdPWZ8fG5bbF0pfSl9fX1hc3luYyBmdW5jdGlvbiBZRShlLHQsbil7aWYobj09PXZvaWQgMCYmKG49ITEpLCFhd2FpdCBlLmRlZmVycmVkRGF0YS5yZXNvbHZlRGF0YSh0KSl7aWYobil0cnl7cmV0dXJue3R5cGU6c3QuZGF0YSxkYXRhOmUuZGVmZXJyZWREYXRhLnVud3JhcHBlZERhdGF9fWNhdGNoKG8pe3JldHVybnt0eXBlOnN0LmVycm9yLGVycm9yOm99fXJldHVybnt0eXBlOnN0LmRhdGEsZGF0YTplLmRlZmVycmVkRGF0YS5kYXRhfX19ZnVuY3Rpb24gJG0oZSl7cmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoZSkuZ2V0QWxsKCJpbmRleCIpLnNvbWUodD0+dD09PSIiKX1mdW5jdGlvbiBrcChlLHQpe2xldCBuPXR5cGVvZiB0PT0ic3RyaW5nIj9Kcih0KS5zZWFyY2g6dC5zZWFyY2g7aWYoZVtlLmxlbmd0aC0xXS5yb3V0ZS5pbmRleCYmJG0obnx8IiIpKXJldHVybiBlW2UubGVuZ3RoLTFdO2xldCByPUVtKGUpO3JldHVybiByW3IubGVuZ3RoLTFdfWZ1bmN0aW9uIEwwKGUpe2xldHtmb3JtTWV0aG9kOnQsZm9ybUFjdGlvbjpuLGZvcm1FbmNUeXBlOnIsdGV4dDpvLGZvcm1EYXRhOmksanNvbjpsfT1lO2lmKCEoIXR8fCFufHwhcikpe2lmKG8hPW51bGwpcmV0dXJue2Zvcm1NZXRob2Q6dCxmb3JtQWN0aW9uOm4sZm9ybUVuY1R5cGU6cixmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDpvfTtpZihpIT1udWxsKXJldHVybntmb3JtTWV0aG9kOnQsZm9ybUFjdGlvbjpuLGZvcm1FbmNUeXBlOnIsZm9ybURhdGE6aSxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMH07aWYobCE9PXZvaWQgMClyZXR1cm57Zm9ybU1ldGhvZDp0LGZvcm1BY3Rpb246bixmb3JtRW5jVHlwZTpyLGZvcm1EYXRhOnZvaWQgMCxqc29uOmwsdGV4dDp2b2lkIDB9fX1mdW5jdGlvbiBBZihlLHQpe3JldHVybiB0P3tzdGF0ZToibG9hZGluZyIsbG9jYXRpb246ZSxmb3JtTWV0aG9kOnQuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOnQuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTp0LmZvcm1FbmNUeXBlLGZvcm1EYXRhOnQuZm9ybURhdGEsanNvbjp0Lmpzb24sdGV4dDp0LnRleHR9OntzdGF0ZToibG9hZGluZyIsbG9jYXRpb246ZSxmb3JtTWV0aG9kOnZvaWQgMCxmb3JtQWN0aW9uOnZvaWQgMCxmb3JtRW5jVHlwZTp2b2lkIDAsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfX1mdW5jdGlvbiBLTShlLHQpe3JldHVybntzdGF0ZToic3VibWl0dGluZyIsbG9jYXRpb246ZSxmb3JtTWV0aG9kOnQuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOnQuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTp0LmZvcm1FbmNUeXBlLGZvcm1EYXRhOnQuZm9ybURhdGEsanNvbjp0Lmpzb24sdGV4dDp0LnRleHR9fWZ1bmN0aW9uIGhzKGUsdCl7cmV0dXJuIGU/e3N0YXRlOiJsb2FkaW5nIixmb3JtTWV0aG9kOmUuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOmUuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTplLmZvcm1FbmNUeXBlLGZvcm1EYXRhOmUuZm9ybURhdGEsanNvbjplLmpzb24sdGV4dDplLnRleHQsZGF0YTp0fTp7c3RhdGU6ImxvYWRpbmciLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDAsZGF0YTp0fX1mdW5jdGlvbiBHTShlLHQpe3JldHVybntzdGF0ZToic3VibWl0dGluZyIsZm9ybU1ldGhvZDplLmZvcm1NZXRob2QsZm9ybUFjdGlvbjplLmZvcm1BY3Rpb24sZm9ybUVuY1R5cGU6ZS5mb3JtRW5jVHlwZSxmb3JtRGF0YTplLmZvcm1EYXRhLGpzb246ZS5qc29uLHRleHQ6ZS50ZXh0LGRhdGE6dD90LmRhdGE6dm9pZCAwfX1mdW5jdGlvbiBpbyhlKXtyZXR1cm57c3RhdGU6ImlkbGUiLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDAsZGF0YTplfX1mdW5jdGlvbiBZTShlLHQpe3RyeXtsZXQgbj1lLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oSEUpO2lmKG4pe2xldCByPUpTT04ucGFyc2Uobik7Zm9yKGxldFtvLGldb2YgT2JqZWN0LmVudHJpZXMocnx8e30pKWkmJkFycmF5LmlzQXJyYXkoaSkmJnQuc2V0KG8sbmV3IFNldChpfHxbXSkpfX1jYXRjaHt9fWZ1bmN0aW9uIFhNKGUsdCl7aWYodC5zaXplPjApe2xldCBuPXt9O2ZvcihsZXRbcixvXW9mIHQpbltyXT1bLi4ub107dHJ5e2Uuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShIRSxKU09OLnN0cmluZ2lmeShuKSl9Y2F0Y2gocil7dmkoITEsIkZhaWxlZCB0byBzYXZlIGFwcGxpZWQgdmlldyB0cmFuc2l0aW9ucyBpbiBzZXNzaW9uU3RvcmFnZSAoIityKyIpLiIpfX19LyoqCiAqIFJlYWN0IFJvdXRlciB2Ni4xOC4wCiAqCiAqIENvcHlyaWdodCAoYykgUmVtaXggU29mdHdhcmUgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRS5tZCBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKgogKiBAbGljZW5zZSBNSVQKICovZnVuY3Rpb24gSWMoKXtyZXR1cm4gSWM9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSxJYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9Y29uc3Qga2Q9cC5jcmVhdGVDb250ZXh0KG51bGwpLFhFPXAuY3JlYXRlQ29udGV4dChudWxsKSxUZD1wLmNyZWF0ZUNvbnRleHQobnVsbCksTmQ9cC5jcmVhdGVDb250ZXh0KG51bGwpLFJpPXAuY3JlYXRlQ29udGV4dCh7b3V0bGV0Om51bGwsbWF0Y2hlczpbXSxpc0RhdGFSb3V0ZTohMX0pLFFFPXAuY3JlYXRlQ29udGV4dChudWxsKTtmdW5jdGlvbiBiZCgpe3JldHVybiBwLnVzZUNvbnRleHQoTmQpIT1udWxsfWZ1bmN0aW9uIEpFKCl7cmV0dXJuIGJkKCl8fHdlKCExKSxwLnVzZUNvbnRleHQoTmQpLmxvY2F0aW9ufWZ1bmN0aW9uIFpFKGUpe3AudXNlQ29udGV4dChUZCkuc3RhdGljfHxwLnVzZUxheW91dEVmZmVjdChlKX1mdW5jdGlvbiBrbSgpe2xldHtpc0RhdGFSb3V0ZTplfT1wLnVzZUNvbnRleHQoUmkpO3JldHVybiBlP2EzKCk6UU0oKX1mdW5jdGlvbiBRTSgpe2JkKCl8fHdlKCExKTtsZXQgZT1wLnVzZUNvbnRleHQoa2QpLHtiYXNlbmFtZTp0LG5hdmlnYXRvcjpufT1wLnVzZUNvbnRleHQoVGQpLHttYXRjaGVzOnJ9PXAudXNlQ29udGV4dChSaSkse3BhdGhuYW1lOm99PUpFKCksaT1KU09OLnN0cmluZ2lmeShFbShyKS5tYXAoYT0+YS5wYXRobmFtZUJhc2UpKSxsPXAudXNlUmVmKCExKTtyZXR1cm4gWkUoKCk9PntsLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGEsdSl7aWYodT09PXZvaWQgMCYmKHU9e30pLCFsLmN1cnJlbnQpcmV0dXJuO2lmKHR5cGVvZiBhPT0ibnVtYmVyIil7bi5nbyhhKTtyZXR1cm59bGV0IGM9QkUoYSxKU09OLnBhcnNlKGkpLG8sdS5yZWxhdGl2ZT09PSJwYXRoIik7ZT09bnVsbCYmdCE9PSIvIiYmKGMucGF0aG5hbWU9Yy5wYXRobmFtZT09PSIvIj90OmtvKFt0LGMucGF0aG5hbWVdKSksKHUucmVwbGFjZT9uLnJlcGxhY2U6bi5wdXNoKShjLHUuc3RhdGUsdSl9LFt0LG4saSxvLGVdKX1mdW5jdGlvbiBKTSgpe2xldHttYXRjaGVzOmV9PXAudXNlQ29udGV4dChSaSksdD1lW2UubGVuZ3RoLTFdO3JldHVybiB0P3QucGFyYW1zOnt9fWZ1bmN0aW9uIFpNKGUsdCxuKXtiZCgpfHx3ZSghMSk7bGV0e25hdmlnYXRvcjpyfT1wLnVzZUNvbnRleHQoVGQpLHttYXRjaGVzOm99PXAudXNlQ29udGV4dChSaSksaT1vW28ubGVuZ3RoLTFdLGw9aT9pLnBhcmFtczp7fTtpJiZpLnBhdGhuYW1lO2xldCBzPWk/aS5wYXRobmFtZUJhc2U6Ii8iO2kmJmkucm91dGU7bGV0IGE9SkUoKSx1O2lmKHQpe3ZhciBjO2xldCBtPXR5cGVvZiB0PT0ic3RyaW5nIj9Kcih0KTp0O3M9PT0iLyJ8fChjPW0ucGF0aG5hbWUpIT1udWxsJiZjLnN0YXJ0c1dpdGgocyl8fHdlKCExKSx1PW19ZWxzZSB1PWE7bGV0IGQ9dS5wYXRobmFtZXx8Ii8iLGY9cz09PSIvIj9kOmQuc2xpY2Uocy5sZW5ndGgpfHwiLyIsaD1ybChlLHtwYXRobmFtZTpmfSksZz1yMyhoJiZoLm1hcChtPT5PYmplY3QuYXNzaWduKHt9LG0se3BhcmFtczpPYmplY3QuYXNzaWduKHt9LGwsbS5wYXJhbXMpLHBhdGhuYW1lOmtvKFtzLHIuZW5jb2RlTG9jYXRpb24/ci5lbmNvZGVMb2NhdGlvbihtLnBhdGhuYW1lKS5wYXRobmFtZTptLnBhdGhuYW1lXSkscGF0aG5hbWVCYXNlOm0ucGF0aG5hbWVCYXNlPT09Ii8iP3M6a28oW3Msci5lbmNvZGVMb2NhdGlvbj9yLmVuY29kZUxvY2F0aW9uKG0ucGF0aG5hbWVCYXNlKS5wYXRobmFtZTptLnBhdGhuYW1lQmFzZV0pfSkpLG8sbik7cmV0dXJuIHQmJmc/cC5jcmVhdGVFbGVtZW50KE5kLlByb3ZpZGVyLHt2YWx1ZTp7bG9jYXRpb246SWMoe3BhdGhuYW1lOiIvIixzZWFyY2g6IiIsaGFzaDoiIixzdGF0ZTpudWxsLGtleToiZGVmYXVsdCJ9LHUpLG5hdmlnYXRpb25UeXBlOmx0LlBvcH19LGcpOmd9ZnVuY3Rpb24gcU0oKXtsZXQgZT1zMygpLHQ9V0UoZSk/ZS5zdGF0dXMrIiAiK2Uuc3RhdHVzVGV4dDplIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOkpTT04uc3RyaW5naWZ5KGUpLG49ZSBpbnN0YW5jZW9mIEVycm9yP2Uuc3RhY2s6bnVsbCxvPXtwYWRkaW5nOiIwLjVyZW0iLGJhY2tncm91bmRDb2xvcjoicmdiYSgyMDAsMjAwLDIwMCwgMC41KSJ9LGk9bnVsbDtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoImgyIixudWxsLCJVbmV4cGVjdGVkIEFwcGxpY2F0aW9uIEVycm9yISIpLHAuY3JlYXRlRWxlbWVudCgiaDMiLHtzdHlsZTp7Zm9udFN0eWxlOiJpdGFsaWMifX0sdCksbj9wLmNyZWF0ZUVsZW1lbnQoInByZSIse3N0eWxlOm99LG4pOm51bGwsaSl9Y29uc3QgZTM9cC5jcmVhdGVFbGVtZW50KHFNLG51bGwpO2NsYXNzIHQzIGV4dGVuZHMgcC5Db21wb25lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5zdGF0ZT17bG9jYXRpb246dC5sb2NhdGlvbixyZXZhbGlkYXRpb246dC5yZXZhbGlkYXRpb24sZXJyb3I6dC5lcnJvcn19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcih0KXtyZXR1cm57ZXJyb3I6dH19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyh0LG4pe3JldHVybiBuLmxvY2F0aW9uIT09dC5sb2NhdGlvbnx8bi5yZXZhbGlkYXRpb24hPT0iaWRsZSImJnQucmV2YWxpZGF0aW9uPT09ImlkbGUiP3tlcnJvcjp0LmVycm9yLGxvY2F0aW9uOnQubG9jYXRpb24scmV2YWxpZGF0aW9uOnQucmV2YWxpZGF0aW9ufTp7ZXJyb3I6dC5lcnJvcnx8bi5lcnJvcixsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjp0LnJldmFsaWRhdGlvbnx8bi5yZXZhbGlkYXRpb259fWNvbXBvbmVudERpZENhdGNoKHQsbil7Y29uc29sZS5lcnJvcigiUmVhY3QgUm91dGVyIGNhdWdodCB0aGUgZm9sbG93aW5nIGVycm9yIGR1cmluZyByZW5kZXIiLHQsbil9cmVuZGVyKCl7cmV0dXJuIHRoaXMuc3RhdGUuZXJyb3I/cC5jcmVhdGVFbGVtZW50KFJpLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnByb3BzLnJvdXRlQ29udGV4dH0scC5jcmVhdGVFbGVtZW50KFFFLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnN0YXRlLmVycm9yLGNoaWxkcmVuOnRoaXMucHJvcHMuY29tcG9uZW50fSkpOnRoaXMucHJvcHMuY2hpbGRyZW59fWZ1bmN0aW9uIG4zKGUpe2xldHtyb3V0ZUNvbnRleHQ6dCxtYXRjaDpuLGNoaWxkcmVuOnJ9PWUsbz1wLnVzZUNvbnRleHQoa2QpO3JldHVybiBvJiZvLnN0YXRpYyYmby5zdGF0aWNDb250ZXh0JiYobi5yb3V0ZS5lcnJvckVsZW1lbnR8fG4ucm91dGUuRXJyb3JCb3VuZGFyeSkmJihvLnN0YXRpY0NvbnRleHQuX2RlZXBlc3RSZW5kZXJlZEJvdW5kYXJ5SWQ9bi5yb3V0ZS5pZCkscC5jcmVhdGVFbGVtZW50KFJpLlByb3ZpZGVyLHt2YWx1ZTp0fSxyKX1mdW5jdGlvbiByMyhlLHQsbil7dmFyIHI7aWYodD09PXZvaWQgMCYmKHQ9W10pLG49PT12b2lkIDAmJihuPW51bGwpLGU9PW51bGwpe3ZhciBvO2lmKChvPW4pIT1udWxsJiZvLmVycm9ycyllPW4ubWF0Y2hlcztlbHNlIHJldHVybiBudWxsfWxldCBpPWUsbD0ocj1uKT09bnVsbD92b2lkIDA6ci5lcnJvcnM7aWYobCE9bnVsbCl7bGV0IHM9aS5maW5kSW5kZXgoYT0+YS5yb3V0ZS5pZCYmKGw9PW51bGw/dm9pZCAwOmxbYS5yb3V0ZS5pZF0pKTtzPj0wfHx3ZSghMSksaT1pLnNsaWNlKDAsTWF0aC5taW4oaS5sZW5ndGgscysxKSl9cmV0dXJuIGkucmVkdWNlUmlnaHQoKHMsYSx1KT0+e2xldCBjPWEucm91dGUuaWQ/bD09bnVsbD92b2lkIDA6bFthLnJvdXRlLmlkXTpudWxsLGQ9bnVsbDtuJiYoZD1hLnJvdXRlLmVycm9yRWxlbWVudHx8ZTMpO2xldCBmPXQuY29uY2F0KGkuc2xpY2UoMCx1KzEpKSxoPSgpPT57bGV0IGc7cmV0dXJuIGM/Zz1kOmEucm91dGUuQ29tcG9uZW50P2c9cC5jcmVhdGVFbGVtZW50KGEucm91dGUuQ29tcG9uZW50LG51bGwpOmEucm91dGUuZWxlbWVudD9nPWEucm91dGUuZWxlbWVudDpnPXMscC5jcmVhdGVFbGVtZW50KG4zLHttYXRjaDphLHJvdXRlQ29udGV4dDp7b3V0bGV0OnMsbWF0Y2hlczpmLGlzRGF0YVJvdXRlOm4hPW51bGx9LGNoaWxkcmVuOmd9KX07cmV0dXJuIG4mJihhLnJvdXRlLkVycm9yQm91bmRhcnl8fGEucm91dGUuZXJyb3JFbGVtZW50fHx1PT09MCk/cC5jcmVhdGVFbGVtZW50KHQzLHtsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjpuLnJldmFsaWRhdGlvbixjb21wb25lbnQ6ZCxlcnJvcjpjLGNoaWxkcmVuOmgoKSxyb3V0ZUNvbnRleHQ6e291dGxldDpudWxsLG1hdGNoZXM6Zixpc0RhdGFSb3V0ZTohMH19KTpoKCl9LG51bGwpfXZhciBxRT1mdW5jdGlvbihlKXtyZXR1cm4gZS5Vc2VCbG9ja2VyPSJ1c2VCbG9ja2VyIixlLlVzZVJldmFsaWRhdG9yPSJ1c2VSZXZhbGlkYXRvciIsZS5Vc2VOYXZpZ2F0ZVN0YWJsZT0idXNlTmF2aWdhdGUiLGV9KHFFfHx7fSksamM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuVXNlQmxvY2tlcj0idXNlQmxvY2tlciIsZS5Vc2VMb2FkZXJEYXRhPSJ1c2VMb2FkZXJEYXRhIixlLlVzZUFjdGlvbkRhdGE9InVzZUFjdGlvbkRhdGEiLGUuVXNlUm91dGVFcnJvcj0idXNlUm91dGVFcnJvciIsZS5Vc2VOYXZpZ2F0aW9uPSJ1c2VOYXZpZ2F0aW9uIixlLlVzZVJvdXRlTG9hZGVyRGF0YT0idXNlUm91dGVMb2FkZXJEYXRhIixlLlVzZU1hdGNoZXM9InVzZU1hdGNoZXMiLGUuVXNlUmV2YWxpZGF0b3I9InVzZVJldmFsaWRhdG9yIixlLlVzZU5hdmlnYXRlU3RhYmxlPSJ1c2VOYXZpZ2F0ZSIsZS5Vc2VSb3V0ZUlkPSJ1c2VSb3V0ZUlkIixlfShqY3x8e30pO2Z1bmN0aW9uIG8zKGUpe2xldCB0PXAudXNlQ29udGV4dChrZCk7cmV0dXJuIHR8fHdlKCExKSx0fWZ1bmN0aW9uIGkzKGUpe2xldCB0PXAudXNlQ29udGV4dChYRSk7cmV0dXJuIHR8fHdlKCExKSx0fWZ1bmN0aW9uIGwzKGUpe2xldCB0PXAudXNlQ29udGV4dChSaSk7cmV0dXJuIHR8fHdlKCExKSx0fWZ1bmN0aW9uIGVDKGUpe2xldCB0PWwzKCksbj10Lm1hdGNoZXNbdC5tYXRjaGVzLmxlbmd0aC0xXTtyZXR1cm4gbi5yb3V0ZS5pZHx8d2UoITEpLG4ucm91dGUuaWR9ZnVuY3Rpb24gczMoKXt2YXIgZTtsZXQgdD1wLnVzZUNvbnRleHQoUUUpLG49aTMoamMuVXNlUm91dGVFcnJvcikscj1lQyhqYy5Vc2VSb3V0ZUVycm9yKTtyZXR1cm4gdHx8KChlPW4uZXJyb3JzKT09bnVsbD92b2lkIDA6ZVtyXSl9ZnVuY3Rpb24gYTMoKXtsZXR7cm91dGVyOmV9PW8zKHFFLlVzZU5hdmlnYXRlU3RhYmxlKSx0PWVDKGpjLlVzZU5hdmlnYXRlU3RhYmxlKSxuPXAudXNlUmVmKCExKTtyZXR1cm4gWkUoKCk9PntuLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKG8saSl7aT09PXZvaWQgMCYmKGk9e30pLG4uY3VycmVudCYmKHR5cGVvZiBvPT0ibnVtYmVyIj9lLm5hdmlnYXRlKG8pOmUubmF2aWdhdGUobyxJYyh7ZnJvbVJvdXRlSWQ6dH0saSkpKX0sW2UsdF0pfWZ1bmN0aW9uIHUzKGUpe2xldHtiYXNlbmFtZTp0PSIvIixjaGlsZHJlbjpuPW51bGwsbG9jYXRpb246cixuYXZpZ2F0aW9uVHlwZTpvPWx0LlBvcCxuYXZpZ2F0b3I6aSxzdGF0aWM6bD0hMX09ZTtiZCgpJiZ3ZSghMSk7bGV0IHM9dC5yZXBsYWNlKC9eXC8qLywiLyIpLGE9cC51c2VNZW1vKCgpPT4oe2Jhc2VuYW1lOnMsbmF2aWdhdG9yOmksc3RhdGljOmx9KSxbcyxpLGxdKTt0eXBlb2Ygcj09InN0cmluZyImJihyPUpyKHIpKTtsZXR7cGF0aG5hbWU6dT0iLyIsc2VhcmNoOmM9IiIsaGFzaDpkPSIiLHN0YXRlOmY9bnVsbCxrZXk6aD0iZGVmYXVsdCJ9PXIsZz1wLnVzZU1lbW8oKCk9PntsZXQgbT1CYSh1LHMpO3JldHVybiBtPT1udWxsP251bGw6e2xvY2F0aW9uOntwYXRobmFtZTptLHNlYXJjaDpjLGhhc2g6ZCxzdGF0ZTpmLGtleTpofSxuYXZpZ2F0aW9uVHlwZTpvfX0sW3MsdSxjLGQsZixoLG9dKTtyZXR1cm4gZz09bnVsbD9udWxsOnAuY3JlYXRlRWxlbWVudChUZC5Qcm92aWRlcix7dmFsdWU6YX0scC5jcmVhdGVFbGVtZW50KE5kLlByb3ZpZGVyLHtjaGlsZHJlbjpuLHZhbHVlOmd9KSl9bmV3IFByb21pc2UoKCk9Pnt9KTtmdW5jdGlvbiBjMyhlKXtsZXQgdD17aGFzRXJyb3JCb3VuZGFyeTplLkVycm9yQm91bmRhcnkhPW51bGx8fGUuZXJyb3JFbGVtZW50IT1udWxsfTtyZXR1cm4gZS5Db21wb25lbnQmJk9iamVjdC5hc3NpZ24odCx7ZWxlbWVudDpwLmNyZWF0ZUVsZW1lbnQoZS5Db21wb25lbnQpLENvbXBvbmVudDp2b2lkIDB9KSxlLkVycm9yQm91bmRhcnkmJk9iamVjdC5hc3NpZ24odCx7ZXJyb3JFbGVtZW50OnAuY3JlYXRlRWxlbWVudChlLkVycm9yQm91bmRhcnkpLEVycm9yQm91bmRhcnk6dm9pZCAwfSksdH1jb25zdCB0Qz1xLmNyZWF0ZUNvbnRleHQobnVsbCksZDM9ZT0+e3ZhciBzLGE7Y29uc3QgdD1xLnVzZUNvbnRleHQodEMpLFtuLHJdPXduLnNwbGl0TW9kdWxlSWRBbmRNb2R1bGVQYXRoKGUpLG89KHM9dD09bnVsbD92b2lkIDA6dFtuXSk9PW51bGw/dm9pZCAwOnMuc291cmNlLGk9KGE9dD09bnVsbD92b2lkIDA6dFtuXSk9PW51bGw/dm9pZCAwOmEuc2NoZW1hO2lmKCFvfHwhaSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbW9kdWxlOiAiK24pO2NvbnN0IGw9d24ucmVzb2x2ZVBhdGgocixvLGkpO3JldHVybnttb2R1bGVJZDpuLG1vZHVsZVNvdXJjZTpsLnNvdXJjZSxtb2R1bGVTY2hlbWE6bC5zY2hlbWF9fSxmMz0oe3ZhbEFwaTplfSk9Pnt2YXIgXyxFO2NvbnN0eyIqIjp0fT1KTSgpLFtuLHJdPXAudXNlU3RhdGUobnVsbCksW28saV09cC51c2VTdGF0ZShudWxsKSxbbCxzXT1wLnVzZVN0YXRlKCksW2FdPWw/d24uc3BsaXRNb2R1bGVJZEFuZE1vZHVsZVBhdGgobCk6W3ZvaWQgMCx2b2lkIDBdLHU9YSYmKChfPW49PW51bGw/dm9pZCAwOm5bYV0pPT1udWxsP3ZvaWQgMDpfLnNvdXJjZSksYz1hJiYoKEU9bj09bnVsbD92b2lkIDA6blthXSk9PW51bGw/dm9pZCAwOkUuc2NoZW1hKSxkPU9iamVjdC5lbnRyaWVzKG58fHt9KS5mbGF0TWFwKChbLCRdKT0+JC5lcnJvcnM/JC5lcnJvcnMuZmF0YWw/JC5lcnJvcnMuZmF0YWw6W106W10pLGY9T2JqZWN0LmVudHJpZXMobnx8e30pLmZsYXRNYXAoKFssJF0pPT4kLmVycm9ycyYmJC5lcnJvcnMudmFsaWRhdGlvbj9bJC5lcnJvcnMudmFsaWRhdGlvbl06W10pO2lmKGQmJmQubGVuZ3RoPjApe2NvbnN0ICQ9ZC5sZW5ndGg9PT0xP2RbMF0ubWVzc2FnZTpgTXVsdGlwbGUgZXJyb3JzIGRldGVjdGVkOgoke2QubWFwKChULE0pPT5gJHtNKzF9LiAke1QubWVzc2FnZX1gKS5qb2luKGAKYCl9CgpTaG93aW5nIHN0YWNrIHRyYWNlIG9mOiAwLiAke2RbMF0ubWVzc2FnZX1gLEM9bmV3IEVycm9yKCQpO3Rocm93IEMuc3RhY2s9ZFswXS5zdGFjayxDfWYmJmYubGVuZ3RoPjAmJmNvbnNvbGUud2FybigiVmFsIGVuY291bnRlcmVkIHZhbGlkYXRpb24gZXJyb3JzOiIsZikscC51c2VFZmZlY3QoKCk9PntzKHQ/YC8ke3R9YDpsKX0sW3RdKTtjb25zdFtoLGddPXAudXNlU3RhdGUobnVsbCk7cC51c2VFZmZlY3QoKCk9Pnt0cnl7bmV3IFdlYlNvY2tldChgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2luLnJlcGxhY2UoImh0dHA6Ly8iLCJ3czovLyIpfS9fbmV4dC93ZWJwYWNrLWhtcmApLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLEM9PntsZXQgVDt0cnl7VD1KU09OLnBhcnNlKEMuZGF0YSl9Y2F0Y2h7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIEhNUiIpfXR5cGVvZihUPT1udWxsP3ZvaWQgMDpULmhhc2gpPT0ic3RyaW5nIiYmKFQ9PW51bGw/dm9pZCAwOlQuYWN0aW9uKT09PSJidWlsdCImJmcoVC5oYXNoKX0pfWNhdGNoKCQpe2NvbnNvbGUud2FybigiRmFpbGVkIHRvIGluaXRpYWxpemUgSE1SIiwkKX19LFtdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnNvbGUubG9nKCIoUmUpLWZldGNoaW5nIG1vZHVsZXMiKSxlLmdldE1vZHVsZXMoe3BhdGNoOiEwLGluY2x1ZGVTY2hlbWE6ITAsaW5jbHVkZVNvdXJjZTohMH0pLnRoZW4oJD0+e1BzLmlzT2soJCk/cigkLnZhbHVlLm1vZHVsZXMpOihpKCJDb3VsZCBub3QgbG9hZCBtb2R1bGVzOiAiKyQuZXJyb3IubWVzc2FnZSksY29uc29sZS5lcnJvcigkLmVycm9yKSl9KX0sW2hdKTtjb25zdCBtPWttKCksW1Msdl09QVAoKTtwLnVzZUVmZmVjdCgoKT0+e2NvbnN0ICQ9Qz0+e2NvbnNvbGUubG9nKCJwb3BzdGF0ZSIsQyl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLCQpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIiwkKX19LFtdKTtjb25zdCB5PXEudXNlUmVmKG51bGwpLHg9cC51c2VDYWxsYmFjaygkPT5hc3luYyBDPT57Y29uc3RbVCxNXT13bi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aCgkKSxSPWF3YWl0IEMod24uY3JlYXRlUGF0Y2hKU09OUGF0aChNKSk7cmV0dXJuIGUucG9zdFBhdGNoZXMoVCxSKS50aGVuKGo9PntpZihQcy5pc0VycihqKSl0aHJvdyBqLmVycm9yO2lmKGNvbnNvbGUubG9nKCJzdWJtaXR0ZWQiLFIpLCFoKXJldHVybiBlLmdldE1vZHVsZXMoe3BhdGNoOiEwLGluY2x1ZGVTY2hlbWE6ITAsaW5jbHVkZVNvdXJjZTohMH0pLnRoZW4oRj0+e1BzLmlzT2soRik/cihGLnZhbHVlLm1vZHVsZXMpOihpKCJDb3VsZCBub3QgbG9hZCBtb2R1bGVzOiAiK0YuZXJyb3IubWVzc2FnZSksY29uc29sZS5lcnJvcihGLmVycm9yKSl9KX0pLmNhdGNoKGo9Pntjb25zb2xlLmVycm9yKGopfSl9LFtdKTtyZXR1cm4gdy5qc3goJFMuUHJvdmlkZXIse3ZhbHVlOnt0aGVtZTpTLHNldFRoZW1lOnYsYXBpOmUsZWRpdE1vZGU6ImZ1bGwiLHNlc3Npb246e3N0YXR1czoibm90LWFza2VkIn0saGlnaGxpZ2h0OiExLHNldEhpZ2hsaWdodDooKT0+e30sc2V0RWRpdE1vZGU6KCk9Pnt9LHNldFdpbmRvd1NpemU6KCk9Pnt9fSxjaGlsZHJlbjp3LmpzeHMoImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1jb250YWluZXIiLGNsYXNzTmFtZToicmVsYXRpdmUgZm9udC1zZXJpZiBhbnRpYWxpYXNlZCIsImRhdGEtbW9kZSI6UyxjaGlsZHJlbjpbdy5qc3goImRpdiIse2NsYXNzTmFtZToiZml4ZWQgLXRyYW5zbGF0ZS14LTEvMiB6LW92ZXJsYXkgbGVmdC0xLzIgYm90dG9tLTQiLGNoaWxkcmVuOncuanN4KGJQLHthcGk6ZX0pfSksdy5qc3goImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1ob3ZlciIscmVmOnl9KSx3LmpzeChuQy5Qcm92aWRlcix7dmFsdWU6e2hvdmVyRWxlbTp5PT1udWxsP3ZvaWQgMDp5LmN1cnJlbnR9LGNoaWxkcmVuOncuanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIixjaGlsZHJlbjp3LmpzeHMoQXMse2NoaWxkcmVuOlt3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweC00IGgtWzUwcHhdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIixjaGlsZHJlbjp3LmpzeChERSx7fSl9KSx3LmpzeChPcyx7Y2xhc3NOYW1lOiJweC00IixjaGlsZHJlbjpuP3cuanN4KHczLHtwYXRoczpPYmplY3Qua2V5cyhuKSxzZXRTZWxlY3RlZE1vZHVsZUlkOiQ9PnttKCQpfX0pOiFvJiZ3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweS00IixjaGlsZHJlbjoiTG9hZGluZy4uLiJ9KX0pLHcuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IHctZnVsbCBoLVs1MHB4XSBnYXAtMiBmb250LXNlcmlmIHRleHQteHMiLGNoaWxkcmVuOlt3LmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e2hpc3RvcnkuYmFjaygpfSxjaGlsZHJlbjp3LmpzeChfUCx7fSl9KSx3LmpzeCgicCIse2NoaWxkcmVuOmx8fCIvIn0pXX0pLHcuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQiLGNoaWxkcmVuOltvJiZ3LmpzeHMoImRpdiIse2NsYXNzTmFtZToidGV4dC1sZyB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQiLGNoaWxkcmVuOlsiRVJST1I6ICIsb119KSxuJiZsJiZhJiZ1IT09dm9pZCAwJiZjIT09dm9pZCAwJiZ3LmpzeCh0Qy5Qcm92aWRlcix7dmFsdWU6bixjaGlsZHJlbjp3LmpzeChwMyx7cGF0aDpsLHNvdXJjZTp1LHNjaGVtYTpjLHNldFNlbGVjdGVkUGF0aDpzLGluaXRPblN1Ym1pdDp4fSl9KV19KV19KX0pfSldfSl9KX0sbkM9cS5jcmVhdGVDb250ZXh0KHtob3ZlckVsZW06bnVsbH0pLGgzPSgpPT5xLnVzZUNvbnRleHQobkMpO2Z1bmN0aW9uIHAzKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0Om99KXtjb25zdFssaV09d24uc3BsaXRNb2R1bGVJZEFuZE1vZHVsZVBhdGgoZSksbD13bi5yZXNvbHZlUGF0aChpLHQsbik7aWYoIWwpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCByZXNvbHZlIG1vZHVsZTogIitlKTtyZXR1cm4gdy5qc3gockMse3BhdGg6ZSxzb3VyY2U6bC5zb3VyY2Usc2NoZW1hOmwuc2NoZW1hLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDpvLHRvcDohMH0pfWZ1bmN0aW9uIHJDKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsZmllbGQ6byxpbml0T25TdWJtaXQ6aSx0b3A6bH0pe3JldHVybiB0PT09bnVsbHx8bi5vcHQ/dy5qc3goeTMse3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixmaWVsZDpvLGluaXRPblN1Ym1pdDppLHNldFNlbGVjdGVkUGF0aDpyfSk6bi50eXBlPT09Im9iamVjdCI/dHlwZW9mIHQhPSJvYmplY3QifHxIcyh0KT93LmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGV4cGVjdGVkIG9iamVjdCwgYnV0IGZvdW5kICIsdHlwZW9mIHRdfSk6dy5qc3gob0Mse3NvdXJjZTp0LHBhdGg6ZSxzY2hlbWE6bixpbml0T25TdWJtaXQ6aSxzZXRTZWxlY3RlZFBhdGg6cix0b3A6bH0pOm4udHlwZT09PSJhcnJheSI/dHlwZW9mIHQhPSJvYmplY3QifHwhSHModCk/dy5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbIkVSUk9SOiBleHBlY3RlZCBhcnJheSwgYnV0IGZvdW5kICIsdHlwZW9mIHRdfSk6dy5qc3goaUMse3NvdXJjZTp0LHBhdGg6ZSxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pOm4udHlwZT09PSJyZWNvcmQiP3R5cGVvZiB0IT0ib2JqZWN0Ij93LmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGV4cGVjdGVkIG9iamVjdCBmb3IgIixuLnR5cGUsIiwgYnV0IGZvdW5kICIsdHlwZW9mIHRdfSk6SHModCk/dy5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbIkVSUk9SOiBkaWQgbm90IGV4cGVjdCBhcnJheSBmb3IgIixuLnR5cGVdfSk6dy5qc3goZzMse3NvdXJjZTp0LHBhdGg6ZSxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pOncuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJweS0yIGdhcC15LTQiLGNoaWxkcmVuOlt3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LWxlZnQiLGNoaWxkcmVuOm98fGV9KSx3LmpzeChNRSx7cGF0aDplLGRpc2FibGVkOiExLHNvdXJjZTp0LHNjaGVtYTpuLG9uU3VibWl0OmkoZSl9KV19KX1mdW5jdGlvbiBvQyh7cGF0aDplLHNvdXJjZTp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDpvLHRvcDppfSl7cmV0dXJuIHcuanN4KCJkaXYiLHtjbGFzc05hbWU6cmQoImZsZXggZmxleC1jb2wgZ2FwLXktOCIseyJib3JkZXItbC0yIGJvcmRlci1ib3JkZXIgcGwtNiI6IWl9KSxjaGlsZHJlbjpPYmplY3QuZW50cmllcyhuLml0ZW1zKS5tYXAoKFtsLHNdKT0+e2NvbnN0IGE9RWEoZSxsKTtyZXR1cm4gdy5qc3gockMse3BhdGg6YSxzb3VyY2U6dFtsXSxzY2hlbWE6cyxzZXRTZWxlY3RlZFBhdGg6cixmaWVsZDpsLGluaXRPblN1Ym1pdDpvfSxhKX0pfSxlKX1mdW5jdGlvbiBnMyh7cGF0aDplLHNvdXJjZTp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSl7Y29uc3Qgbz1rbSgpO3JldHVybiB3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGdhcC00IHAtMiIsY2hpbGRyZW46T2JqZWN0LmVudHJpZXModCkubWFwKChbaSxsXSk9Pntjb25zdCBzPUVhKGUsaSk7cmV0dXJuIHcuanN4KCJidXR0b24iLHtvbkNsaWNrOigpPT57cihzKSxvKHMpfSxjaGlsZHJlbjp3LmpzeChtMyx7cmVjb3JkS2V5OmkscGF0aDpzLHNvdXJjZTpsLHNjaGVtYTpuLml0ZW19KX0scyl9KX0sZSl9Y29uc3QgVHA9MTcwO2Z1bmN0aW9uIG0zKHtyZWNvcmRLZXk6ZSxwYXRoOnQsc291cmNlOm4sc2NoZW1hOnJ9KXtjb25zdCBvPXEudXNlUmVmKG51bGwpLFtpLGxdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e28uY3VycmVudCYmby5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodD49VHAmJmwoITApfSxbXSksdy5qc3hzKFNtLHtyZWY6byxjbGFzc05hbWU6InJlbGF0aXZlIHB4LTQgcHQtMiBwYi00IG92ZXJmbG93LWhpZGRlbiBib3JkZXIgZ2FwLXktMiIsc3R5bGU6e21heEhlaWdodDpUcH0sY2hpbGRyZW46W3cuanN4KCJkaXYiLHtjbGFzc05hbWU6InBiLTQgZm9udC1zZXJpZiB0ZXh0LWxlZnQgdGV4dC1hY2NlbnQiLGNoaWxkcmVuOmV9KSx3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjp3LmpzeChUbSx7cGF0aDp0LHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxpJiZ3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0sdCl9ZnVuY3Rpb24gaUMoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pe2NvbnN0IG89a20oKTtyZXR1cm4gdy5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBnYXAtNCBwLTIiLGNoaWxkcmVuOnQubWFwKChpLGwpPT57Y29uc3Qgcz1FYShlLGwpO3JldHVybiB3LmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e3IocyksbyhzKX0sY2hpbGRyZW46dy5qc3godjMse2luZGV4OmwscGF0aDpzLHNvdXJjZTppLHNjaGVtYTpuLml0ZW19LHMpfSxzKX0pfSxlKX1jb25zdCBJMD1UcDtmdW5jdGlvbiB2Myh7aW5kZXg6ZSxwYXRoOnQsc291cmNlOm4sc2NoZW1hOnJ9KXtjb25zdCBvPXEudXNlUmVmKG51bGwpLFtpLGxdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e28uY3VycmVudCYmby5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodD49STAmJmwoITApfSxbXSksdy5qc3hzKFNtLHtyZWY6byxjbGFzc05hbWU6InJlbGF0aXZlIHB4LTQgcHQtMiBwYi00IG92ZXJmbG93LWhpZGRlbiBib3JkZXIgZ2FwLXktMiIsc3R5bGU6e21heEhlaWdodDpJMH0sY2hpbGRyZW46W3cuanN4KCJkaXYiLHtjbGFzc05hbWU6InBiLTQgZm9udC1zZXJpZiB0ZXh0LWxlZnQgdXBwZXJjYXNlIHRleHQtYWNjZW50IixjaGlsZHJlbjplKzE8MTA/YDAke2UrMX1gOmUrMX0pLHcuanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQteHMiLGNoaWxkcmVuOncuanN4KFRtLHtwYXRoOnQsc291cmNlOm4sc2NoZW1hOnJ9KX0pLGkmJncuanN4KCJkaXYiLHtjbGFzc05hbWU6ImFic29sdXRlIGJvdHRvbS0wIGxlZnQtMCB3LWZ1bGwgaC1bMjBweF0gYmctZ3JhZGllbnQtdG8tYiBmcm9tLXRyYW5zcGFyZW50IHRvLWJhY2tncm91bmQifSldfSl9ZnVuY3Rpb24gRWEoZSx0KXtjb25zdCBuPXduLmNyZWF0ZVZhbFBhdGhPZkl0ZW0oZSx0KTtpZighbil0aHJvdyBFcnJvcihgQ291bGQgbm90IGNyZWF0ZSB2YWwgcGF0aDogJHtlfSBvZiAke3Q9PW51bGw/dm9pZCAwOnQudG9TdHJpbmcoKX1gKTtyZXR1cm4gbn1mdW5jdGlvbiBUbSh7cGF0aDplLHNvdXJjZTp0LHNjaGVtYTpufSl7Y29uc3RbcixvXT1wLnVzZVN0YXRlKG51bGwpLHtob3ZlckVsZW06aX09aDMoKTtpZihuLnR5cGU9PT0ib2JqZWN0IilyZXR1cm4gdy5qc3goImRpdiIse2NsYXNzTmFtZToiZ3JpZCBncmlkLWNvbHMtW21pbi1jb250ZW50XzFmcl0gZ2FwLTIgdGV4dC1sZWZ0IixjaGlsZHJlbjpPYmplY3QuZW50cmllcyhuLml0ZW1zKS5tYXAoKFtsXSk9PncuanN4cyhwLkZyYWdtZW50LHtjaGlsZHJlbjpbdy5qc3hzKCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LW11dGVkIixjaGlsZHJlbjpbbCwiOiJdfSksdy5qc3goInNwYW4iLHtjaGlsZHJlbjp3LmpzeChUbSx7c291cmNlOih0PT1udWxsP3ZvaWQgMDp0W2xdKT8/bnVsbCxzY2hlbWE6bi5pdGVtc1tsXSxwYXRoOkVhKGUsbCl9KX0pXX0sRWEoZSxsKSkpfSxlKTtpZihuLnR5cGU9PT0iYXJyYXkiKXJldHVybiB0PT09bnVsbD93LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOkFycmF5LmlzQXJyYXkodCk/dy5qc3hzKCJzcGFuIix7Y2hpbGRyZW46W3cuanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46dC5sZW5ndGh9KSx3LmpzeCgic3BhbiIse2NoaWxkcmVuOnQubGVuZ3RoPT09MT8iIGl0ZW0iOiIgaXRlbXMifSldfSxlKTp3LmpzeCgic3BhbiIse2NsYXNzTmFtZToicHgtMiBiZy1kZXN0cnVjdGl2ZSB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQiLGNoaWxkcmVuOiJVbmtub3duIGxlbmd0aCJ9LGUpO2lmKG4udHlwZT09PSJyaWNodGV4dCIpcmV0dXJuIHQ9PT1udWxsP3cuanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sZSk6dHlwZW9mIHQhPSJvYmplY3QiP3cuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjpbIkVSUk9SOiAiLHR5cGVvZiB0LCIgbm90IGFuIG9iamVjdCJdfSxlKTohKG5uIGluIHQpfHx0W25uXSE9PSJyaWNodGV4dCI/dy5qc3goImRpdiIse2NsYXNzTmFtZToicC00IHRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCBiZy1kZXN0cnVjdGl2ZSIsY2hpbGRyZW46IkVSUk9SOiBvYmplY3QgaXMgbm90IHJpY2h0ZXh0In0sZSk6dy5qc3goUzMse2NoaWxkcmVuOkJTKHQpfSxlKTtpZihuLnR5cGU9PT0ic3RyaW5nIilyZXR1cm4gdD09PW51bGw/dy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTp3LmpzeCgic3BhbiIse2NoaWxkcmVuOnR9KTtpZihuLnR5cGU9PT0iaW1hZ2UiKXtpZih0PT09bnVsbClyZXR1cm4gdy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTtpZih0eXBlb2YgdCE9Im9iamVjdCIpcmV0dXJuIHcuanN4KCJkaXYiLHtjbGFzc05hbWU6InAtNCB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQgYmctZGVzdHJ1Y3RpdmUiLGNoaWxkcmVuOiJFUlJPUjogbm90IGFuIG9iamVjdCJ9LGUpO2lmKCEoX24gaW4gdCl8fHR5cGVvZiB0W19uXSE9InN0cmluZyIpcmV0dXJuIHcuanN4KCJkaXYiLHtjbGFzc05hbWU6InAtNCB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQgYmctZGVzdHJ1Y3RpdmUiLGNoaWxkcmVuOiJFUlJPUjogb2JqZWN0IGlzIG5vdCBhbiBpbWFnZSJ9LGUpO2NvbnN0IGw9d24uY29udmVydEZpbGVTb3VyY2UodCkudXJsO3JldHVybiB3LmpzeHMoInNwYW4iLHtvbk1vdXNlT3ZlcjpzPT57byh7eDpzLmNsaWVudFgseTpzLmNsaWVudFl9KX0sb25Nb3VzZUxlYXZlOigpPT57byhudWxsKX0sY2xhc3NOYW1lOiJyZWxhdGl2ZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IGdhcC0xIixjaGlsZHJlbjpbdy5qc3goImEiLHtocmVmOmwsY2xhc3NOYW1lOiJvdmVyZmxvdy1oaWRkZW4gdW5kZXJsaW5lIHRydW5jYXRlICIsY2hpbGRyZW46dFtfbl19KSxyJiZpJiZIci5jcmVhdGVQb3J0YWwody5qc3goImltZyIse2NsYXNzTmFtZToiYWJzb2x1dGUgei1bNV0gbWF4LXctWzEwdnddIixzdHlsZTp7bGVmdDpyLngrMTAsdG9wOnIueSsxMH0sc3JjOmx9KSxpKV19LGUpfWVsc2V7aWYobi50eXBlPT09ImJvb2xlYW4iKXJldHVybiB0PT09bnVsbD93LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOncuanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46dD8idHJ1ZSI6ImZhbHNlIn0sZSk7aWYobi50eXBlPT09Im51bWJlciIpcmV0dXJuIHQ9PT1udWxsP3cuanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sZSk6dy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjp0LnRvU3RyaW5nKCl9KTtpZihuLnR5cGU9PT0ia2V5T2YiKXJldHVybiB0PT09bnVsbD93LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOncuanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46dC50b1N0cmluZygpfSxlKX1yZXR1cm4gdy5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbIlRPRE86ICIsbi50eXBlXX0sZSl9ZnVuY3Rpb24geTMoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixpbml0T25TdWJtaXQ6byxmaWVsZDppfSl7Y29uc3RbbCxzXT1wLnVzZVN0YXRlKHQhPT1udWxsKTtyZXR1cm4gdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgZ2FwLXktNiIsY2hpbGRyZW46W2k/dy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktc3RhcnQgZ2FwLXgtNCIsY2hpbGRyZW46W3cuanN4KFNwLHtjaGVja2VkOmwsb25DbGljazooKT0+e3MoYT0+IWEpfX0pLHcuanN4KCJzcGFuIix7Y2hpbGRyZW46aX0pXX0pOncuanN4KFNwLHtjaGVja2VkOmwsb25DbGljazooKT0+e3MoYT0+IWEpfX0pLGwmJncuanN4KHgzLHtzb3VyY2U6dCxzY2hlbWE6bixwYXRoOmUsc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0Om99KV19LGUpfWZ1bmN0aW9uIHgzKHtzb3VyY2U6ZSxwYXRoOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0Om99KXtpZihuLnR5cGU9PT0iYXJyYXkiKXtpZih0eXBlb2YgZT09Im9iamVjdCImJihlPT09bnVsbHx8SHMoZSkpKXJldHVybiB3LmpzeChpQyx7c291cmNlOmU9PT1udWxsP1tdOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSl9ZWxzZSBpZihuLnR5cGU9PT0ib2JqZWN0Iil7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYoZT09PW51bGx8fCFIcyhlKSkpcmV0dXJuIHcuanN4KG9DLHtzb3VyY2U6ZSxwYXRoOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0Om99KX1lbHNlIGlmKG4udHlwZT09PSJyaWNodGV4dCJ8fG4udHlwZT09PSJzdHJpbmcifHxuLnR5cGU9PT0iaW1hZ2UifHxuLnR5cGU9PT0ibnVtYmVyInx8bi50eXBlPT09ImtleU9mIilyZXR1cm4gdy5qc3goTUUse3BhdGg6dCxkaXNhYmxlZDohMSxzb3VyY2U6ZSxzY2hlbWE6bixvblN1Ym1pdDpvKHQpfSx0KTtyZXR1cm4gdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InAtNCBiZy1kZXN0cnVjdGl2ZSB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQiLGNoaWxkcmVuOlsiRVJST1I6IHVuZXhwZWN0ZWQgc291cmNlIHR5cGUgIix0eXBlb2YgZSwiIGZvciBzY2hlbWEgdHlwZSIsIiAiLG4udHlwZV19KX1mdW5jdGlvbiBIcyhlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiBfMyhlKXtjb25zdCB0PXt9O3JldHVybiBlLmZvckVhY2gobj0+e2NvbnN0IHI9bi5zcGxpdCgiLyIpLmZpbHRlcihpPT5pIT09IiIpO2xldCBvPXQ7ci5mb3JFYWNoKGk9PntvW2ldfHwob1tpXT17fSksbz1vW2ldfSl9KSx0fWZ1bmN0aW9uIHczKHtwYXRoczplLHNldFNlbGVjdGVkTW9kdWxlSWQ6dH0pe2NvbnN0IG49XzMoZSk7cmV0dXJuIHcuanN4KE9fLHtjaGlsZHJlbjpPYmplY3QuZW50cmllcyhuKS5tYXAoKFtyLG9dKT0+dy5qc3goImRpdiIse2NsYXNzTmFtZToicHgtNCBweS0yIixjaGlsZHJlbjp3LmpzeChsQyx7bmFtZTpyLHRyZWU6byxtb2R1bGVJZDpgLyR7cn1gLHNldFNlbGVjdGVkTW9kdWxlSWQ6dH0pfSxgLyR7cn1gKSl9KX1mdW5jdGlvbiBsQyh7bmFtZTplLHRyZWU6dCxtb2R1bGVJZDpuLHNldFNlbGVjdGVkTW9kdWxlSWQ6cn0pe3JldHVybiB3LmpzeHMoImRpdiIse2NoaWxkcmVuOlt3LmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e3Iobil9LGNoaWxkcmVuOmV9KSxPYmplY3QuZW50cmllcyh0KS5tYXAoKFtvLGldKT0+dy5qc3goImRpdiIse2NsYXNzTmFtZToicHgtNCBweS0xIixjaGlsZHJlbjp3LmpzeChsQyx7bmFtZTpvLHRyZWU6aSxtb2R1bGVJZDpgJHtufS8ke299YCxzZXRTZWxlY3RlZE1vZHVsZUlkOnJ9KX0sYCR7bn0vJHtvfWApKV19KX1jb25zdCBqMD17dGFnczp7aDE6ImZvbnQtYm9sZCIsaDI6ImZvbnQtYm9sZCIsaDM6ImZvbnQtYm9sZCIsaDQ6ImZvbnQtYm9sZCIsaDU6ImZvbnQtYm9sZCIsaDY6ImZvbnQtYm9sZCIscDoiIn0sY2xhc3Nlczp7Ym9sZDoiZm9udC1ib2xkIixpdGFsaWM6Iml0YWxpYyIsbGluZVRocm91Z2g6ImxpbmUtdGhyb3VnaCJ9fTtmdW5jdGlvbiBTMyh7Y2hpbGRyZW46ZX0pe2NvbnN0IHQ9ZTtmdW5jdGlvbiBuKGksbCl7Y29uc3Qgcz1qMC50YWdzW2ldO3JldHVybiBzJiZsP1tsLHNdLmpvaW4oIiAiKTpzfHxsfWZ1bmN0aW9uIHIoaSxsKXtjb25zdCBzPWowLmNsYXNzZXNbaV07cmV0dXJuIHMmJmw/W2wsc10uam9pbigiICIpOnN8fGx9ZnVuY3Rpb24gbyhpLGwpe3ZhciB1LGM7aWYodHlwZW9mIGk9PSJzdHJpbmciKXJldHVybiBpO2lmKGkudGFnPT09InAiKXJldHVybiB3LmpzeCgicCIse2NsYXNzTmFtZTpuKCJwIiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09ImltZyIpcmV0dXJuIHcuanN4KCJpbWciLHtjbGFzc05hbWU6bigiaW1nIiksc3JjOmkuc3JjfSxsKTtpZihpLnRhZz09PSJ1bCIpcmV0dXJuIHcuanN4KCJ1bCIse2NsYXNzTmFtZTpuKCJ1bCIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJvbCIpcmV0dXJuIHcuanN4KCJvbCIse2NsYXNzTmFtZTpuKCJvbCIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJsaSIpcmV0dXJuIHcuanN4KCJsaSIse2NsYXNzTmFtZTpuKCJsaSIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJzcGFuIilyZXR1cm4gdy5qc3goInNwYW4iLHtjbGFzc05hbWU6aS5jbGFzc2VzLm1hcChkPT57c3dpdGNoKGQpe2Nhc2UiYm9sZCI6cmV0dXJuIHIoImJvbGQiKTtjYXNlImxpbmUtdGhyb3VnaCI6cmV0dXJuIHIoImxpbmVUaHJvdWdoIik7Y2FzZSJpdGFsaWMiOnJldHVybiByKCJpdGFsaWMiKX19KS5qb2luKCIgIiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09ImgxIilyZXR1cm4gdy5qc3goImgxIix7Y2xhc3NOYW1lOm4oImgxIiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09ImgyIilyZXR1cm4gdy5qc3goImgyIix7Y2xhc3NOYW1lOm4oImgyIiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09ImgzIilyZXR1cm4gdy5qc3goImgzIix7Y2xhc3NOYW1lOm4oImgzIiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09Img0IilyZXR1cm4gdy5qc3goImg0Iix7Y2xhc3NOYW1lOm4oImg0IiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09Img1IilyZXR1cm4gdy5qc3goImg1Iix7Y2xhc3NOYW1lOm4oImg1IiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09Img2IilyZXR1cm4gdy5qc3goImg2Iix7Y2xhc3NOYW1lOm4oImg2IiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09ImJyIilyZXR1cm4gdy5qc3goImJyIix7fSxsKTtpZihpLnRhZz09PSJhIilyZXR1cm4gdy5qc3goImEiLHtocmVmOmkuaHJlZixjaGlsZHJlbjppLmNoaWxkcmVuLm1hcCgoZCxmKT0+byhkLGYpKX0sbCk7Y29uc29sZS5lcnJvcigiVW5rbm93biB0YWciLGkudGFnKTtjb25zdCBhPWkudGFnO3JldHVybiBhIT1udWxsJiZhLnRhZz9xLmNyZWF0ZUVsZW1lbnQoYS50YWcse2tleTpsLGNsYXNzTmFtZToodT1hLmNsYXNzKT09bnVsbD92b2lkIDA6dS5qb2luKCIgIiksY2hpbGRyZW46KGM9YS5jaGlsZHJlbik9PW51bGw/dm9pZCAwOmMubWFwKG8pfSk6bnVsbH1yZXR1cm4gdy5qc3goInNwYW4iLHsiZGF0YS12YWwtcGF0aCI6dC52YWxQYXRoLGNoaWxkcmVuOnQuY2hpbGRyZW4ubWFwKChpLGwpPT5vKGksbCkpfSl9Y29uc3QgRTM9cC5jcmVhdGVDb250ZXh0KG51bGwpLE1mPXtkaWRDYXRjaDohMSxlcnJvcjpudWxsfTtjbGFzcyBDMyBleHRlbmRzIHAuQ29tcG9uZW50e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMucmVzZXRFcnJvckJvdW5kYXJ5PXRoaXMucmVzZXRFcnJvckJvdW5kYXJ5LmJpbmQodGhpcyksdGhpcy5zdGF0ZT1NZn1zdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKHQpe3JldHVybntkaWRDYXRjaDohMCxlcnJvcjp0fX1yZXNldEVycm9yQm91bmRhcnkoKXtjb25zdHtlcnJvcjp0fT10aGlzLnN0YXRlO2lmKHQhPT1udWxsKXtmb3IodmFyIG4scixvPWFyZ3VtZW50cy5sZW5ndGgsaT1uZXcgQXJyYXkobyksbD0wO2w8bztsKyspaVtsXT1hcmd1bWVudHNbbF07KG49KHI9dGhpcy5wcm9wcykub25SZXNldCk9PT1udWxsfHxuPT09dm9pZCAwfHxuLmNhbGwocix7YXJnczppLHJlYXNvbjoiaW1wZXJhdGl2ZS1hcGkifSksdGhpcy5zZXRTdGF0ZShNZil9fWNvbXBvbmVudERpZENhdGNoKHQsbil7dmFyIHIsbzsocj0obz10aGlzLnByb3BzKS5vbkVycm9yKT09PW51bGx8fHI9PT12b2lkIDB8fHIuY2FsbChvLHQsbil9Y29tcG9uZW50RGlkVXBkYXRlKHQsbil7Y29uc3R7ZGlkQ2F0Y2g6cn09dGhpcy5zdGF0ZSx7cmVzZXRLZXlzOm99PXRoaXMucHJvcHM7aWYociYmbi5lcnJvciE9PW51bGwmJiQzKHQucmVzZXRLZXlzLG8pKXt2YXIgaSxsOyhpPShsPXRoaXMucHJvcHMpLm9uUmVzZXQpPT09bnVsbHx8aT09PXZvaWQgMHx8aS5jYWxsKGwse25leHQ6byxwcmV2OnQucmVzZXRLZXlzLHJlYXNvbjoia2V5cyJ9KSx0aGlzLnNldFN0YXRlKE1mKX19cmVuZGVyKCl7Y29uc3R7Y2hpbGRyZW46dCxmYWxsYmFja1JlbmRlcjpuLEZhbGxiYWNrQ29tcG9uZW50OnIsZmFsbGJhY2s6b309dGhpcy5wcm9wcyx7ZGlkQ2F0Y2g6aSxlcnJvcjpsfT10aGlzLnN0YXRlO2xldCBzPXQ7aWYoaSl7Y29uc3QgYT17ZXJyb3I6bCxyZXNldEVycm9yQm91bmRhcnk6dGhpcy5yZXNldEVycm9yQm91bmRhcnl9O2lmKHAuaXNWYWxpZEVsZW1lbnQobykpcz1vO2Vsc2UgaWYodHlwZW9mIG49PSJmdW5jdGlvbiIpcz1uKGEpO2Vsc2UgaWYocilzPXAuY3JlYXRlRWxlbWVudChyLGEpO2Vsc2UgdGhyb3cgbH1yZXR1cm4gcC5jcmVhdGVFbGVtZW50KEUzLlByb3ZpZGVyLHt2YWx1ZTp7ZGlkQ2F0Y2g6aSxlcnJvcjpsLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX19LHMpfX1mdW5jdGlvbiAkMygpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTpbXSx0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpbXTtyZXR1cm4gZS5sZW5ndGghPT10Lmxlbmd0aHx8ZS5zb21lKChuLHIpPT4hT2JqZWN0LmlzKG4sdFtyXSkpfWNvbnN0IHNDPSJDb2xsYXBzaWJsZSIsW2szLGFDXT1DaShzQyksW1QzLE5tXT1rMyhzQyksTjM9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUNvbGxhcHNpYmxlOm4sb3BlbjpyLGRlZmF1bHRPcGVuOm8sZGlzYWJsZWQ6aSxvbk9wZW5DaGFuZ2U6bCwuLi5zfT1lLFthPSExLHVdPWJsKHtwcm9wOnIsZGVmYXVsdFByb3A6byxvbkNoYW5nZTpsfSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChUMyx7c2NvcGU6bixkaXNhYmxlZDppLGNvbnRlbnRJZDp4ZCgpLG9wZW46YSxvbk9wZW5Ub2dnbGU6cC51c2VDYWxsYmFjaygoKT0+dShjPT4hYyksW3VdKX0scC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7ImRhdGEtc3RhdGUiOmJtKGEpLCJkYXRhLWRpc2FibGVkIjppPyIiOnZvaWQgMH0scyx7cmVmOnR9KSkpfSksYjM9IkNvbGxhcHNpYmxlVHJpZ2dlciIsUjM9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUNvbGxhcHNpYmxlOm4sLi4ucn09ZSxvPU5tKGIzLG4pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoRGUuYnV0dG9uLGVlKHt0eXBlOiJidXR0b24iLCJhcmlhLWNvbnRyb2xzIjpvLmNvbnRlbnRJZCwiYXJpYS1leHBhbmRlZCI6by5vcGVufHwhMSwiZGF0YS1zdGF0ZSI6Ym0oby5vcGVuKSwiZGF0YS1kaXNhYmxlZCI6by5kaXNhYmxlZD8iIjp2b2lkIDAsZGlzYWJsZWQ6by5kaXNhYmxlZH0scix7cmVmOnQsb25DbGljazpIZShlLm9uQ2xpY2ssby5vbk9wZW5Ub2dnbGUpfSkpfSksdUM9IkNvbGxhcHNpYmxlQ29udGVudCIsUDM9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PWUsbz1ObSh1QyxlLl9fc2NvcGVDb2xsYXBzaWJsZSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChEbCx7cHJlc2VudDpufHxvLm9wZW59LCh7cHJlc2VudDppfSk9PnAuY3JlYXRlRWxlbWVudChPMyxlZSh7fSxyLHtyZWY6dCxwcmVzZW50Oml9KSkpfSksTzM9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUNvbGxhcHNpYmxlOm4scHJlc2VudDpyLGNoaWxkcmVuOm8sLi4uaX09ZSxsPU5tKHVDLG4pLFtzLGFdPXAudXNlU3RhdGUociksdT1wLnVzZVJlZihudWxsKSxjPVhlKHQsdSksZD1wLnVzZVJlZigwKSxmPWQuY3VycmVudCxoPXAudXNlUmVmKDApLGc9aC5jdXJyZW50LG09bC5vcGVufHxzLFM9cC51c2VSZWYobSksdj1wLnVzZVJlZigpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHk9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5TLmN1cnJlbnQ9ITEpO3JldHVybigpPT5jYW5jZWxBbmltYXRpb25GcmFtZSh5KX0sW10pLCRuKCgpPT57Y29uc3QgeT11LmN1cnJlbnQ7aWYoeSl7di5jdXJyZW50PXYuY3VycmVudHx8e3RyYW5zaXRpb25EdXJhdGlvbjp5LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbixhbmltYXRpb25OYW1lOnkuc3R5bGUuYW5pbWF0aW9uTmFtZX0seS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IjBzIix5LnN0eWxlLmFuaW1hdGlvbk5hbWU9Im5vbmUiO2NvbnN0IHg9eS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtkLmN1cnJlbnQ9eC5oZWlnaHQsaC5jdXJyZW50PXgud2lkdGgsUy5jdXJyZW50fHwoeS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249di5jdXJyZW50LnRyYW5zaXRpb25EdXJhdGlvbix5LnN0eWxlLmFuaW1hdGlvbk5hbWU9di5jdXJyZW50LmFuaW1hdGlvbk5hbWUpLGEocil9fSxbbC5vcGVuLHJdKSxwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHsiZGF0YS1zdGF0ZSI6Ym0obC5vcGVuKSwiZGF0YS1kaXNhYmxlZCI6bC5kaXNhYmxlZD8iIjp2b2lkIDAsaWQ6bC5jb250ZW50SWQsaGlkZGVuOiFtfSxpLHtyZWY6YyxzdHlsZTp7Ii0tcmFkaXgtY29sbGFwc2libGUtY29udGVudC1oZWlnaHQiOmY/YCR7Zn1weGA6dm9pZCAwLCItLXJhZGl4LWNvbGxhcHNpYmxlLWNvbnRlbnQtd2lkdGgiOmc/YCR7Z31weGA6dm9pZCAwLC4uLmUuc3R5bGV9fSksbSYmbyl9KTtmdW5jdGlvbiBibShlKXtyZXR1cm4gZT8ib3BlbiI6ImNsb3NlZCJ9Y29uc3QgQTM9TjMsTTM9UjMsRDM9UDMsQm89IkFjY29yZGlvbiIsTDM9WyJIb21lIiwiRW5kIiwiQXJyb3dEb3duIiwiQXJyb3dVcCIsIkFycm93TGVmdCIsIkFycm93UmlnaHQiXSxbUm0sSTMsajNdPUhTKEJvKSxbUmQseDRdPUNpKEJvLFtqMyxhQ10pLFBtPWFDKCksY0M9cS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dHlwZTpuLC4uLnJ9PWUsbz1yLGk9cjtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KFJtLlByb3ZpZGVyLHtzY29wZTplLl9fc2NvcGVBY2NvcmRpb259LG49PT0ibXVsdGlwbGUiP3EuY3JlYXRlRWxlbWVudChXMyxlZSh7fSxpLHtyZWY6dH0pKTpxLmNyZWF0ZUVsZW1lbnQoQjMsZWUoe30sbyx7cmVmOnR9KSkpfSk7Y0MucHJvcFR5cGVzPXt0eXBlKGUpe2NvbnN0IHQ9ZS52YWx1ZXx8ZS5kZWZhdWx0VmFsdWU7cmV0dXJuIGUudHlwZSYmIVsic2luZ2xlIiwibXVsdGlwbGUiXS5pbmNsdWRlcyhlLnR5cGUpP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgb25lIG9mIGBzaW5nbGUgfCBtdWx0aXBsZWAuIik6ZS50eXBlPT09Im11bHRpcGxlIiYmdHlwZW9mIHQ9PSJzdHJpbmciP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgYHNpbmdsZWAgd2hlbiBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIGlzIHR5cGUgYHN0cmluZ2AuIik6ZS50eXBlPT09InNpbmdsZSImJkFycmF5LmlzQXJyYXkodCk/bmV3IEVycm9yKCJJbnZhbGlkIHByb3AgYHR5cGVgIHN1cHBsaWVkIHRvIGBBY2NvcmRpb25gLiBFeHBlY3RlZCBgbXVsdGlwbGVgIHdoZW4gYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBpcyB0eXBlIGBzdHJpbmdbXWAuIik6bnVsbH19O2NvbnN0W2RDLHozXT1SZChCbyksW2ZDLEYzXT1SZChCbyx7Y29sbGFwc2libGU6ITF9KSxCMz1xLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHt2YWx1ZTpuLGRlZmF1bHRWYWx1ZTpyLG9uVmFsdWVDaGFuZ2U6bz0oKT0+e30sY29sbGFwc2libGU6aT0hMSwuLi5sfT1lLFtzLGFdPWJsKHtwcm9wOm4sZGVmYXVsdFByb3A6cixvbkNoYW5nZTpvfSk7cmV0dXJuIHEuY3JlYXRlRWxlbWVudChkQyx7c2NvcGU6ZS5fX3Njb3BlQWNjb3JkaW9uLHZhbHVlOnM/W3NdOltdLG9uSXRlbU9wZW46YSxvbkl0ZW1DbG9zZTpxLnVzZUNhbGxiYWNrKCgpPT5pJiZhKCIiKSxbaSxhXSl9LHEuY3JlYXRlRWxlbWVudChmQyx7c2NvcGU6ZS5fX3Njb3BlQWNjb3JkaW9uLGNvbGxhcHNpYmxlOml9LHEuY3JlYXRlRWxlbWVudChoQyxlZSh7fSxsLHtyZWY6dH0pKSkpfSksVzM9cS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOm89KCk9Pnt9LC4uLml9PWUsW2w9W10sc109Ymwoe3Byb3A6bixkZWZhdWx0UHJvcDpyLG9uQ2hhbmdlOm99KSxhPXEudXNlQ2FsbGJhY2soYz0+cygoZD1bXSk9PlsuLi5kLGNdKSxbc10pLHU9cS51c2VDYWxsYmFjayhjPT5zKChkPVtdKT0+ZC5maWx0ZXIoZj0+ZiE9PWMpKSxbc10pO3JldHVybiBxLmNyZWF0ZUVsZW1lbnQoZEMse3Njb3BlOmUuX19zY29wZUFjY29yZGlvbix2YWx1ZTpsLG9uSXRlbU9wZW46YSxvbkl0ZW1DbG9zZTp1fSxxLmNyZWF0ZUVsZW1lbnQoZkMse3Njb3BlOmUuX19zY29wZUFjY29yZGlvbixjb2xsYXBzaWJsZTohMH0scS5jcmVhdGVFbGVtZW50KGhDLGVlKHt9LGkse3JlZjp0fSkpKSl9KSxbVTMsUGRdPVJkKEJvKSxoQz1xLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sZGlzYWJsZWQ6cixkaXI6byxvcmllbnRhdGlvbjppPSJ2ZXJ0aWNhbCIsLi4ubH09ZSxzPXEudXNlUmVmKG51bGwpLGE9WGUocyx0KSx1PUkzKG4pLGQ9VGcobyk9PT0ibHRyIixmPUhlKGUub25LZXlEb3duLGg9Pnt2YXIgZztpZighTDMuaW5jbHVkZXMoaC5rZXkpKXJldHVybjtjb25zdCBtPWgudGFyZ2V0LFM9dSgpLmZpbHRlcihNPT57dmFyIFI7cmV0dXJuISgoUj1NLnJlZi5jdXJyZW50KSE9PW51bGwmJlIhPT12b2lkIDAmJlIuZGlzYWJsZWQpfSksdj1TLmZpbmRJbmRleChNPT5NLnJlZi5jdXJyZW50PT09bSkseT1TLmxlbmd0aDtpZih2PT09LTEpcmV0dXJuO2gucHJldmVudERlZmF1bHQoKTtsZXQgeD12O2NvbnN0IF89MCxFPXktMSwkPSgpPT57eD12KzEseD5FJiYoeD1fKX0sQz0oKT0+e3g9di0xLHg8XyYmKHg9RSl9O3N3aXRjaChoLmtleSl7Y2FzZSJIb21lIjp4PV87YnJlYWs7Y2FzZSJFbmQiOng9RTticmVhaztjYXNlIkFycm93UmlnaHQiOmk9PT0iaG9yaXpvbnRhbCImJihkPyQoKTpDKCkpO2JyZWFrO2Nhc2UiQXJyb3dEb3duIjppPT09InZlcnRpY2FsIiYmJCgpO2JyZWFrO2Nhc2UiQXJyb3dMZWZ0IjppPT09Imhvcml6b250YWwiJiYoZD9DKCk6JCgpKTticmVhaztjYXNlIkFycm93VXAiOmk9PT0idmVydGljYWwiJiZDKCk7YnJlYWt9Y29uc3QgVD14JXk7KGc9U1tUXS5yZWYuY3VycmVudCk9PT1udWxsfHxnPT09dm9pZCAwfHxnLmZvY3VzKCl9KTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KFUzLHtzY29wZTpuLGRpc2FibGVkOnIsZGlyZWN0aW9uOm8sb3JpZW50YXRpb246aX0scS5jcmVhdGVFbGVtZW50KFJtLlNsb3Qse3Njb3BlOm59LHEuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoe30sbCx7ImRhdGEtb3JpZW50YXRpb24iOmkscmVmOmEsb25LZXlEb3duOnI/dm9pZCAwOmZ9KSkpKX0pLE5wPSJBY2NvcmRpb25JdGVtIixbVjMsT21dPVJkKE5wKSxIMz1xLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sdmFsdWU6ciwuLi5vfT1lLGk9UGQoTnAsbiksbD16MyhOcCxuKSxzPVBtKG4pLGE9eGQoKSx1PXImJmwudmFsdWUuaW5jbHVkZXMocil8fCExLGM9aS5kaXNhYmxlZHx8ZS5kaXNhYmxlZDtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KFYzLHtzY29wZTpuLG9wZW46dSxkaXNhYmxlZDpjLHRyaWdnZXJJZDphfSxxLmNyZWF0ZUVsZW1lbnQoQTMsZWUoeyJkYXRhLW9yaWVudGF0aW9uIjppLm9yaWVudGF0aW9uLCJkYXRhLXN0YXRlIjpwQyh1KX0scyxvLHtyZWY6dCxkaXNhYmxlZDpjLG9wZW46dSxvbk9wZW5DaGFuZ2U6ZD0+e2Q/bC5vbkl0ZW1PcGVuKHIpOmwub25JdGVtQ2xvc2Uocil9fSkpKX0pLEszPSJBY2NvcmRpb25IZWFkZXIiLEczPXEuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVBY2NvcmRpb246biwuLi5yfT1lLG89UGQoQm8sbiksaT1PbShLMyxuKTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KERlLmgzLGVlKHsiZGF0YS1vcmllbnRhdGlvbiI6by5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6cEMoaS5vcGVuKSwiZGF0YS1kaXNhYmxlZCI6aS5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjp0fSkpfSksejA9IkFjY29yZGlvblRyaWdnZXIiLFkzPXEuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVBY2NvcmRpb246biwuLi5yfT1lLG89UGQoQm8sbiksaT1PbSh6MCxuKSxsPUYzKHowLG4pLHM9UG0obik7cmV0dXJuIHEuY3JlYXRlRWxlbWVudChSbS5JdGVtU2xvdCx7c2NvcGU6bn0scS5jcmVhdGVFbGVtZW50KE0zLGVlKHsiYXJpYS1kaXNhYmxlZCI6aS5vcGVuJiYhbC5jb2xsYXBzaWJsZXx8dm9pZCAwLCJkYXRhLW9yaWVudGF0aW9uIjpvLm9yaWVudGF0aW9uLGlkOmkudHJpZ2dlcklkfSxzLHIse3JlZjp0fSkpKX0pLFgzPSJBY2NvcmRpb25Db250ZW50IixRMz1xLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sLi4ucn09ZSxvPVBkKEJvLG4pLGk9T20oWDMsbiksbD1QbShuKTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KEQzLGVlKHtyb2xlOiJyZWdpb24iLCJhcmlhLWxhYmVsbGVkYnkiOmkudHJpZ2dlcklkLCJkYXRhLW9yaWVudGF0aW9uIjpvLm9yaWVudGF0aW9ufSxsLHIse3JlZjp0LHN0eWxlOnsiLS1yYWRpeC1hY2NvcmRpb24tY29udGVudC1oZWlnaHQiOiJ2YXIoLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LWhlaWdodCkiLCItLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LXdpZHRoIjoidmFyKC0tcmFkaXgtY29sbGFwc2libGUtY29udGVudC13aWR0aCkiLC4uLmUuc3R5bGV9fSkpfSk7ZnVuY3Rpb24gcEMoZSl7cmV0dXJuIGU/Im9wZW4iOiJjbG9zZWQifWNvbnN0IEozPWNDLFozPUgzLHEzPUczLGdDPVkzLG1DPVEzLGU0PUozLHZDPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT53LmpzeChaMyx7cmVmOm4sY2xhc3NOYW1lOm90KCJib3JkZXItYiIsZSksLi4udH0pKTt2Qy5kaXNwbGF5TmFtZT0iQWNjb3JkaW9uSXRlbSI7Y29uc3QgeUM9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsY2hpbGRyZW46dCwuLi5ufSxyKT0+dy5qc3gocTMse2NsYXNzTmFtZToiZmxleCIsY2hpbGRyZW46dy5qc3hzKGdDLHtyZWY6cixjbGFzc05hbWU6b3QoImZsZXggZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHktNCBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBob3Zlcjp1bmRlcmxpbmUgWyZbZGF0YS1zdGF0ZT1vcGVuXT5zdmddOnJvdGF0ZS0xODAiLGUpLC4uLm4sY2hpbGRyZW46W3Qsdy5qc3goTVMse2NsYXNzTmFtZToidy00IGgtNCB0cmFuc2l0aW9uLXRyYW5zZm9ybSBkdXJhdGlvbi0yMDAgc2hyaW5rLTAifSldfSl9KSk7eUMuZGlzcGxheU5hbWU9Z0MuZGlzcGxheU5hbWU7Y29uc3QgeEM9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsY2hpbGRyZW46dCwuLi5ufSxyKT0+dy5qc3gobUMse3JlZjpyLGNsYXNzTmFtZTpvdCgib3ZlcmZsb3ctaGlkZGVuIHRleHQtc20gdHJhbnNpdGlvbi1hbGwgZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLWFjY29yZGlvbi11cCBkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWFjY29yZGlvbi1kb3duIixlKSwuLi5uLGNoaWxkcmVuOncuanN4KCJkaXYiLHtjbGFzc05hbWU6InB0LTAgcGItNCIsY2hpbGRyZW46dH0pfSkpO3hDLmRpc3BsYXlOYW1lPW1DLmRpc3BsYXlOYW1lOy8qKgogKiBSZWFjdCBSb3V0ZXIgRE9NIHY2LjE4LjAKICoKICogQ29weXJpZ2h0IChjKSBSZW1peCBTb2Z0d2FyZSBJbmMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFLm1kIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqCiAqIEBsaWNlbnNlIE1JVAogKi9mdW5jdGlvbiB6Yygpe3JldHVybiB6Yz1PYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ24uYmluZCgpOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LHpjLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiB0NChlLHQpe3JldHVybiBJTSh7YmFzZW5hbWU6dD09bnVsbD92b2lkIDA6dC5iYXNlbmFtZSxmdXR1cmU6emMoe30sdD09bnVsbD92b2lkIDA6dC5mdXR1cmUse3Y3X3ByZXBlbmRCYXNlbmFtZTohMH0pLGhpc3Rvcnk6aU0oe3dpbmRvdzp0PT1udWxsP3ZvaWQgMDp0LndpbmRvd30pLGh5ZHJhdGlvbkRhdGE6KHQ9PW51bGw/dm9pZCAwOnQuaHlkcmF0aW9uRGF0YSl8fG40KCkscm91dGVzOmUsbWFwUm91dGVQcm9wZXJ0aWVzOmMzLHdpbmRvdzp0PT1udWxsP3ZvaWQgMDp0LndpbmRvd30pLmluaXRpYWxpemUoKX1mdW5jdGlvbiBuNCgpe3ZhciBlO2xldCB0PShlPXdpbmRvdyk9PW51bGw/dm9pZCAwOmUuX19zdGF0aWNSb3V0ZXJIeWRyYXRpb25EYXRhO3JldHVybiB0JiZ0LmVycm9ycyYmKHQ9emMoe30sdCx7ZXJyb3JzOnI0KHQuZXJyb3JzKX0pKSx0fWZ1bmN0aW9uIHI0KGUpe2lmKCFlKXJldHVybiBudWxsO2xldCB0PU9iamVjdC5lbnRyaWVzKGUpLG49e307Zm9yKGxldFtyLG9db2YgdClpZihvJiZvLl9fdHlwZT09PSJSb3V0ZUVycm9yUmVzcG9uc2UiKW5bcl09bmV3IENtKG8uc3RhdHVzLG8uc3RhdHVzVGV4dCxvLmRhdGEsby5pbnRlcm5hbD09PSEwKTtlbHNlIGlmKG8mJm8uX190eXBlPT09IkVycm9yIil7aWYoby5fX3N1YlR5cGUpe2xldCBpPXdpbmRvd1tvLl9fc3ViVHlwZV07aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpdHJ5e2xldCBsPW5ldyBpKG8ubWVzc2FnZSk7bC5zdGFjaz0iIixuW3JdPWx9Y2F0Y2h7fX1pZihuW3JdPT1udWxsKXtsZXQgaT1uZXcgRXJyb3Ioby5tZXNzYWdlKTtpLnN0YWNrPSIiLG5bcl09aX19ZWxzZSBuW3JdPW87cmV0dXJuIG59Y29uc3QgbzQ9cC5jcmVhdGVDb250ZXh0KHtpc1RyYW5zaXRpb25pbmc6ITF9KSxpND1wLmNyZWF0ZUNvbnRleHQobmV3IE1hcCksbDQ9InN0YXJ0VHJhbnNpdGlvbiIsRjA9SjBbbDRdO2Z1bmN0aW9uIHM0KGUpe0YwP0YwKGUpOmUoKX1jbGFzcyBhNHtjb25zdHJ1Y3Rvcigpe3RoaXMuc3RhdHVzPSJwZW5kaW5nIix0aGlzLnByb21pc2U9bmV3IFByb21pc2UoKHQsbik9Pnt0aGlzLnJlc29sdmU9cj0+e3RoaXMuc3RhdHVzPT09InBlbmRpbmciJiYodGhpcy5zdGF0dXM9InJlc29sdmVkIix0KHIpKX0sdGhpcy5yZWplY3Q9cj0+e3RoaXMuc3RhdHVzPT09InBlbmRpbmciJiYodGhpcy5zdGF0dXM9InJlamVjdGVkIixuKHIpKX19KX19ZnVuY3Rpb24gdTQoZSl7bGV0e2ZhbGxiYWNrRWxlbWVudDp0LHJvdXRlcjpuLGZ1dHVyZTpyfT1lLFtvLGldPXAudXNlU3RhdGUobi5zdGF0ZSksW2wsc109cC51c2VTdGF0ZSgpLFthLHVdPXAudXNlU3RhdGUoe2lzVHJhbnNpdGlvbmluZzohMX0pLFtjLGRdPXAudXNlU3RhdGUoKSxbZixoXT1wLnVzZVN0YXRlKCksW2csbV09cC51c2VTdGF0ZSgpLFM9cC51c2VSZWYobmV3IE1hcCkse3Y3X3N0YXJ0VHJhbnNpdGlvbjp2fT1yfHx7fSx5PXAudXNlQ2FsbGJhY2soQz0+e3Y/czQoQyk6QygpfSxbdl0pLHg9cC51c2VDYWxsYmFjaygoQyxUKT0+e2xldHtkZWxldGVkRmV0Y2hlcnM6TSx1bnN0YWJsZV92aWV3VHJhbnNpdGlvbk9wdHM6Un09VDtNLmZvckVhY2goaj0+Uy5jdXJyZW50LmRlbGV0ZShqKSksQy5mZXRjaGVycy5mb3JFYWNoKChqLEYpPT57ai5kYXRhIT09dm9pZCAwJiZTLmN1cnJlbnQuc2V0KEYsai5kYXRhKX0pLCFSfHxuLndpbmRvdz09bnVsbHx8dHlwZW9mIG4ud2luZG93LmRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24hPSJmdW5jdGlvbiI/eSgoKT0+aShDKSk6ZiYmYz8oYy5yZXNvbHZlKCksZi5za2lwVHJhbnNpdGlvbigpLG0oe3N0YXRlOkMsY3VycmVudExvY2F0aW9uOlIuY3VycmVudExvY2F0aW9uLG5leHRMb2NhdGlvbjpSLm5leHRMb2NhdGlvbn0pKToocyhDKSx1KHtpc1RyYW5zaXRpb25pbmc6ITAsY3VycmVudExvY2F0aW9uOlIuY3VycmVudExvY2F0aW9uLG5leHRMb2NhdGlvbjpSLm5leHRMb2NhdGlvbn0pKX0sW24ud2luZG93LGYsYyxTLHldKTtwLnVzZUxheW91dEVmZmVjdCgoKT0+bi5zdWJzY3JpYmUoeCksW24seF0pLHAudXNlRWZmZWN0KCgpPT57YS5pc1RyYW5zaXRpb25pbmcmJmQobmV3IGE0KX0sW2EuaXNUcmFuc2l0aW9uaW5nXSkscC51c2VFZmZlY3QoKCk9PntpZihjJiZsJiZuLndpbmRvdyl7bGV0IEM9bCxUPWMucHJvbWlzZSxNPW4ud2luZG93LmRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oYXN5bmMoKT0+e3koKCk9PmkoQykpLGF3YWl0IFR9KTtNLmZpbmlzaGVkLmZpbmFsbHkoKCk9PntkKHZvaWQgMCksaCh2b2lkIDApLHModm9pZCAwKSx1KHtpc1RyYW5zaXRpb25pbmc6ITF9KX0pLGgoTSl9fSxbeSxsLGMsbi53aW5kb3ddKSxwLnVzZUVmZmVjdCgoKT0+e2MmJmwmJm8ubG9jYXRpb24ua2V5PT09bC5sb2NhdGlvbi5rZXkmJmMucmVzb2x2ZSgpfSxbYyxmLG8ubG9jYXRpb24sbF0pLHAudXNlRWZmZWN0KCgpPT57IWEuaXNUcmFuc2l0aW9uaW5nJiZnJiYocyhnLnN0YXRlKSx1KHtpc1RyYW5zaXRpb25pbmc6ITAsY3VycmVudExvY2F0aW9uOmcuY3VycmVudExvY2F0aW9uLG5leHRMb2NhdGlvbjpnLm5leHRMb2NhdGlvbn0pLG0odm9pZCAwKSl9LFthLmlzVHJhbnNpdGlvbmluZyxnXSk7bGV0IF89cC51c2VNZW1vKCgpPT4oe2NyZWF0ZUhyZWY6bi5jcmVhdGVIcmVmLGVuY29kZUxvY2F0aW9uOm4uZW5jb2RlTG9jYXRpb24sZ286Qz0+bi5uYXZpZ2F0ZShDKSxwdXNoOihDLFQsTSk9Pm4ubmF2aWdhdGUoQyx7c3RhdGU6VCxwcmV2ZW50U2Nyb2xsUmVzZXQ6TT09bnVsbD92b2lkIDA6TS5wcmV2ZW50U2Nyb2xsUmVzZXR9KSxyZXBsYWNlOihDLFQsTSk9Pm4ubmF2aWdhdGUoQyx7cmVwbGFjZTohMCxzdGF0ZTpULHByZXZlbnRTY3JvbGxSZXNldDpNPT1udWxsP3ZvaWQgMDpNLnByZXZlbnRTY3JvbGxSZXNldH0pfSksW25dKSxFPW4uYmFzZW5hbWV8fCIvIiwkPXAudXNlTWVtbygoKT0+KHtyb3V0ZXI6bixuYXZpZ2F0b3I6XyxzdGF0aWM6ITEsYmFzZW5hbWU6RX0pLFtuLF8sRV0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLHAuY3JlYXRlRWxlbWVudChrZC5Qcm92aWRlcix7dmFsdWU6JH0scC5jcmVhdGVFbGVtZW50KFhFLlByb3ZpZGVyLHt2YWx1ZTpvfSxwLmNyZWF0ZUVsZW1lbnQoaTQuUHJvdmlkZXIse3ZhbHVlOlMuY3VycmVudH0scC5jcmVhdGVFbGVtZW50KG80LlByb3ZpZGVyLHt2YWx1ZTphfSxwLmNyZWF0ZUVsZW1lbnQodTMse2Jhc2VuYW1lOkUsbG9jYXRpb246by5sb2NhdGlvbixuYXZpZ2F0aW9uVHlwZTpvLmhpc3RvcnlBY3Rpb24sbmF2aWdhdG9yOl99LG8uaW5pdGlhbGl6ZWQ/cC5jcmVhdGVFbGVtZW50KGM0LHtyb3V0ZXM6bi5yb3V0ZXMsc3RhdGU6b30pOnQpKSkpKSxudWxsKX1mdW5jdGlvbiBjNChlKXtsZXR7cm91dGVzOnQsc3RhdGU6bn09ZTtyZXR1cm4gWk0odCx2b2lkIDAsbil9dmFyIEIwOyhmdW5jdGlvbihlKXtlLlVzZVNjcm9sbFJlc3RvcmF0aW9uPSJ1c2VTY3JvbGxSZXN0b3JhdGlvbiIsZS5Vc2VTdWJtaXQ9InVzZVN1Ym1pdCIsZS5Vc2VTdWJtaXRGZXRjaGVyPSJ1c2VTdWJtaXRGZXRjaGVyIixlLlVzZUZldGNoZXI9InVzZUZldGNoZXIiLGUudXNlVmlld1RyYW5zaXRpb25TdGF0ZT0idXNlVmlld1RyYW5zaXRpb25TdGF0ZSJ9KShCMHx8KEIwPXt9KSk7dmFyIFcwOyhmdW5jdGlvbihlKXtlLlVzZUZldGNoZXI9InVzZUZldGNoZXIiLGUuVXNlRmV0Y2hlcnM9InVzZUZldGNoZXJzIixlLlVzZVNjcm9sbFJlc3RvcmF0aW9uPSJ1c2VTY3JvbGxSZXN0b3JhdGlvbiJ9KShXMHx8KFcwPXt9KSk7ZnVuY3Rpb24gZDQoe2Vycm9yOmUscmVzZXRFcnJvckJvdW5kYXJ5OnR9KXtyZXR1cm4gY29uc29sZS5lcnJvcihlKSx3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSB0b3AtMCBsZWZ0LTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1zY3JlZW4gaC1zY3JlZW4gYmctY2FyZC1mb3JlZ3JvdW5kIixjaGlsZHJlbjp3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ3LWZ1bGwgaC1mdWxsIHAtMTAiLGNoaWxkcmVuOncuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJ3LWZ1bGwgaC1mdWxsIHAtMTAgYmctY2FyZCB0ZXh0LXByaW1hcnkiLGNoaWxkcmVuOlt3LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIixjaGlsZHJlbjpbdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGdhcC1bMC41ZW1dIHRleHQtbGcgZm9udC1ib2xkIHRleHQtY2VudGVyIHB5LTIiLGNoaWxkcmVuOlt3LmpzeChERSx7fSksIiBlbmNvdW50ZXJlZCBhbiBlcnJvciJdfSksdy5qc3goImJ1dHRvbiIse29uQ2xpY2s6dCxjaGlsZHJlbjp3LmpzeChOUCx7fSl9KV19KSx3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LTR4bCBmb250LW5vcm1hbCAiLGNoaWxkcmVuOiJNZXNzYWdlOiJ9KSx3LmpzeCgicHJlIix7Y2hpbGRyZW46ZS5tZXNzYWdlfSksZS5zdGFjayYmdy5qc3goZTQse3R5cGU6InNpbmdsZSIsY2xhc3NOYW1lOiJmb250LXNlcmlmIixjb2xsYXBzaWJsZTohMCxkZWZhdWx0VmFsdWU6ImVycm9yIixjaGlsZHJlbjp3LmpzeHModkMse3ZhbHVlOiJlcnJvciIsY2hpbGRyZW46W3cuanN4KHlDLHtjaGlsZHJlbjoiU3RhY2sgdHJhY2U6In0pLHcuanN4KHhDLHtjbGFzc05hbWU6InAtNCBiZy1wb3BvdmVyIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIixjaGlsZHJlbjplLnN0YWNrJiZ3LmpzeCgicHJlIix7Y2hpbGRyZW46ZS5zdGFja30pfSldfSl9KV19KX0pfSl9ZnVuY3Rpb24gZjQoKXtjb25zdCBlPXQ0KFt7cGF0aDoiLyoiLGVsZW1lbnQ6dy5qc3goQzMse2ZhbGxiYWNrUmVuZGVyOmQ0LGNoaWxkcmVuOncuanN4KGYzLHt2YWxBcGk6bmV3IFVUKCIvYXBpL3ZhbCIpfSl9KX1dLHtiYXNlbmFtZToiL2FwaS92YWwvc3RhdGljL2VkaXQifSk7cmV0dXJuIHcuanN4KHU0LHtyb3V0ZXI6ZX0pfURmLmNyZWF0ZVJvb3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJvb3QiKSkucmVuZGVyKHEuY3JlYXRlRWxlbWVudChxLlN0cmljdE1vZGUsbnVsbCxxLmNyZWF0ZUVsZW1lbnQoZjQsbnVsbCkpKTsK","/index.html":"PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+VmFsPC90aXRsZT4KICAgIAogICAgPHNjcmlwdCB0eXBlPSJtb2R1bGUiIGNyb3Nzb3JpZ2luIHNyYz0iL2FwaS92YWwvc3RhdGljL2Fzc2V0cy9pbmRleC0zMTA4YWIyYS5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9hcGkvdmFsL3N0YXRpYy9hc3NldHMvaW5kZXgtMDgyZTY2NzYuY3NzIj4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJyb290Ij48L2Rpdj4KICA8L2JvZHk+CjwvaHRtbD4K"}`
|
|
4
|
+
`{"/assets/index-18cfa26c.css":"Kiw6YmVmb3JlLDphZnRlcntib3gtc2l6aW5nOmJvcmRlci1ib3g7Ym9yZGVyLXdpZHRoOjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci1jb2xvcjojZTVlN2VifTpiZWZvcmUsOmFmdGVyey0tdHctY29udGVudDogIiJ9aHRtbHtsaW5lLWhlaWdodDoxLjU7LXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OjEwMCU7LW1vei10YWItc2l6ZTo0Oy1vLXRhYi1zaXplOjQ7dGFiLXNpemU6NDtmb250LWZhbWlseTpSb2JvdG8sc2Fucy1zZXJpZjtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO2ZvbnQtdmFyaWF0aW9uLXNldHRpbmdzOm5vcm1hbH1ib2R5e21hcmdpbjowO2xpbmUtaGVpZ2h0OmluaGVyaXR9aHJ7aGVpZ2h0OjA7Y29sb3I6aW5oZXJpdDtib3JkZXItdG9wLXdpZHRoOjFweH1hYmJyOndoZXJlKFt0aXRsZV0pey13ZWJraXQtdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWQ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZSBkb3R0ZWR9aDEsaDIsaDMsaDQsaDUsaDZ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6aW5oZXJpdH1he2NvbG9yOmluaGVyaXQ7dGV4dC1kZWNvcmF0aW9uOmluaGVyaXR9YixzdHJvbmd7Zm9udC13ZWlnaHQ6Ym9sZGVyfWNvZGUsa2JkLHNhbXAscHJle2ZvbnQtZmFtaWx5OnVpLW1vbm9zcGFjZSxTRk1vbm8tUmVndWxhcixNZW5sbyxNb25hY28sQ29uc29sYXMsTGliZXJhdGlvbiBNb25vLENvdXJpZXIgTmV3LG1vbm9zcGFjZTtmb250LXNpemU6MWVtfXNtYWxse2ZvbnQtc2l6ZTo4MCV9c3ViLHN1cHtmb250LXNpemU6NzUlO2xpbmUtaGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9c3Vie2JvdHRvbTotLjI1ZW19c3Vwe3RvcDotLjVlbX10YWJsZXt0ZXh0LWluZGVudDowO2JvcmRlci1jb2xvcjppbmhlcml0O2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX1idXR0b24saW5wdXQsb3B0Z3JvdXAsc2VsZWN0LHRleHRhcmVhe2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOjEwMCU7Zm9udC13ZWlnaHQ6aW5oZXJpdDtsaW5lLWhlaWdodDppbmhlcml0O2NvbG9yOmluaGVyaXQ7bWFyZ2luOjA7cGFkZGluZzowfWJ1dHRvbixzZWxlY3R7dGV4dC10cmFuc2Zvcm06bm9uZX1idXR0b24sW3R5cGU9YnV0dG9uXSxbdHlwZT1yZXNldF0sW3R5cGU9c3VibWl0XXstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7YmFja2dyb3VuZC1pbWFnZTpub25lfTotbW96LWZvY3VzcmluZ3tvdXRsaW5lOmF1dG99Oi1tb3otdWktaW52YWxpZHtib3gtc2hhZG93Om5vbmV9cHJvZ3Jlc3N7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLDo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbntoZWlnaHQ6YXV0b31bdHlwZT1zZWFyY2hdey13ZWJraXQtYXBwZWFyYW5jZTp0ZXh0ZmllbGQ7b3V0bGluZS1vZmZzZXQ6LTJweH06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb257LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmV9Ojotd2Via2l0LWZpbGUtdXBsb2FkLWJ1dHRvbnstd2Via2l0LWFwcGVhcmFuY2U6YnV0dG9uO2ZvbnQ6aW5oZXJpdH1zdW1tYXJ5e2Rpc3BsYXk6bGlzdC1pdGVtfWJsb2NrcXVvdGUsZGwsZGQsaDEsaDIsaDMsaDQsaDUsaDYsaHIsZmlndXJlLHAscHJle21hcmdpbjowfWZpZWxkc2V0e21hcmdpbjowO3BhZGRpbmc6MH1sZWdlbmR7cGFkZGluZzowfW9sLHVsLG1lbnV7bGlzdC1zdHlsZTpub25lO21hcmdpbjowO3BhZGRpbmc6MH10ZXh0YXJlYXtyZXNpemU6dmVydGljYWx9aW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIsdGV4dGFyZWE6Oi1tb3otcGxhY2Vob2xkZXJ7b3BhY2l0eToxO2NvbG9yOiM5Y2EzYWZ9aW5wdXQ6OnBsYWNlaG9sZGVyLHRleHRhcmVhOjpwbGFjZWhvbGRlcntvcGFjaXR5OjE7Y29sb3I6IzljYTNhZn1idXR0b24sW3JvbGU9YnV0dG9uXXtjdXJzb3I6cG9pbnRlcn06ZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9aW1nLHN2Zyx2aWRlbyxjYW52YXMsYXVkaW8saWZyYW1lLGVtYmVkLG9iamVjdHtkaXNwbGF5OmJsb2NrO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX1pbWcsdmlkZW97bWF4LXdpZHRoOjEwMCU7aGVpZ2h0OmF1dG99W2hpZGRlbl17ZGlzcGxheTpub25lfTpob3N0ey0tYmFja2dyb3VuZDogMCAwJSAxMDAlOy0tZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1jYXJkOiAwIDAlIDEwMCU7LS1jYXJkLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tcG9wb3ZlcjogMCAwJSAxMDAlOy0tcG9wb3Zlci1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLXByaW1hcnk6IDIyMi4yIDQ3LjQlIDExLjIlOy0tcHJpbWFyeS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLXNlY29uZGFyeTogMjEwIDQwJSA5Ni4xJTstLXNlY29uZGFyeS1mb3JlZ3JvdW5kOiAyMjIuMiA0Ny40JSAxMS4yJTstLW11dGVkOiAwIDAlIDU3LjMlOy0tbXV0ZWQtZm9yZWdyb3VuZDogMjE1LjQgMTYuMyUgNDYuOSU7LS1hY2NlbnQ6IDE1OSwgNjAlLCA1MSUsIDE7LS1hY2NlbnQtZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1kZXN0cnVjdGl2ZTogMCA4NC4yJSA2MC4yJTstLWRlc3RydWN0aXZlLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tYm9yZGVyOiAyMTQuMyAzMS44JSA5MS40JTstLWlucHV0OiAyMTQuMyAzMS44JSA5MS40JTstLXJpbmc6IDIyMi4yIDg0JSA0LjklOy0tcmFkaXVzOiAuNXJlbX06cm9vdHstLWJhY2tncm91bmQ6IDAgMCUgMTAwJTstLWZvcmVncm91bmQ6IDIyMi4yIDg0JSA0LjklOy0tY2FyZDogMCAwJSAxMDAlOy0tY2FyZC1mb3JlZ3JvdW5kOiAyMjIuMiA4NCUgNC45JTstLXBvcG92ZXI6IDAgMCUgMTAwJTstLXBvcG92ZXItZm9yZWdyb3VuZDogMjIyLjIgODQlIDQuOSU7LS1wcmltYXJ5OiAyMjIuMiA0Ny40JSAxMS4yJTstLXByaW1hcnktZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1zZWNvbmRhcnk6IDIxMCA0MCUgOTYuMSU7LS1zZWNvbmRhcnktZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1tdXRlZDogMCAwJSA1Ny4zJTstLW11dGVkLWZvcmVncm91bmQ6IDIxNS40IDE2LjMlIDQ2LjklOy0tYWNjZW50OiAxNTksIDYwJSwgNTElLCAxOy0tYWNjZW50LWZvcmVncm91bmQ6IDIyMi4yIDQ3LjQlIDExLjIlOy0tZGVzdHJ1Y3RpdmU6IDAgODQuMiUgNjAuMiU7LS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kOiAyMTAgNDAlIDk4JTstLWJvcmRlcjogMjE0LjMgMzEuOCUgOTEuNCU7LS1pbnB1dDogMjE0LjMgMzEuOCUgOTEuNCU7LS1yaW5nOiAyMjIuMiA4NCUgNC45JTstLXJhZGl1czogLjVyZW19KltkYXRhLW1vZGU9ZGFya117LS1iYWNrZ3JvdW5kOiAwIDAlIDQlOy0tZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1jYXJkOiAyMjIuMiA4NCUgNC45JTstLWNhcmQtZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1wb3BvdmVyOiAyMjIuMiA4NCUgNC45JTstLXBvcG92ZXItZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1wcmltYXJ5OiAyMTAgNDAlIDk4JTstLXByaW1hcnktZm9yZWdyb3VuZDogMjIyLjIgNDcuNCUgMTEuMiU7LS1zZWNvbmRhcnk6IDIxNy4yIDMyLjYlIDE3LjUlOy0tc2Vjb25kYXJ5LWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tbXV0ZWQ6IDE3OCwgMjMlLCA3NiUsIDE7LS1tdXRlZC1mb3JlZ3JvdW5kOiAyMTUgMjAuMiUgNjUuMSU7LS1hY2NlbnQ6IDE1OSwgNjAlLCA1MSUsIDE7LS1hY2NlbnQtZm9yZWdyb3VuZDogMjEwIDQwJSA5OCU7LS1kZXN0cnVjdGl2ZTogMCA2Mi44JSAzMC42JTstLWRlc3RydWN0aXZlLWZvcmVncm91bmQ6IDIxMCA0MCUgOTglOy0tYm9yZGVyOiAyMTcuMiAzMi42JSAxNy41JTstLWlucHV0OiAyMTcuMiAzMi42JSAxNy41JTstLXJpbmc6IDIxMi43IDI2LjglIDgzLjklfSp7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1ib3JkZXIpKX1ib2R5e2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKTtjb2xvcjpoc2wodmFyKC0tZm9yZWdyb3VuZCkpfSosOmJlZm9yZSw6YWZ0ZXJ7LS10dy1ib3JkZXItc3BhY2luZy14OiAwOy0tdHctYm9yZGVyLXNwYWNpbmcteTogMDstLXR3LXRyYW5zbGF0ZS14OiAwOy0tdHctdHJhbnNsYXRlLXk6IDA7LS10dy1yb3RhdGU6IDA7LS10dy1za2V3LXg6IDA7LS10dy1za2V3LXk6IDA7LS10dy1zY2FsZS14OiAxOy0tdHctc2NhbGUteTogMTstLXR3LXBhbi14OiA7LS10dy1wYW4teTogOy0tdHctcGluY2gtem9vbTogOy0tdHctc2Nyb2xsLXNuYXAtc3RyaWN0bmVzczogcHJveGltaXR5Oy0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbjogOy0tdHctZ3JhZGllbnQtdmlhLXBvc2l0aW9uOiA7LS10dy1ncmFkaWVudC10by1wb3NpdGlvbjogOy0tdHctb3JkaW5hbDogOy0tdHctc2xhc2hlZC16ZXJvOiA7LS10dy1udW1lcmljLWZpZ3VyZTogOy0tdHctbnVtZXJpYy1zcGFjaW5nOiA7LS10dy1udW1lcmljLWZyYWN0aW9uOiA7LS10dy1yaW5nLWluc2V0OiA7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMHB4Oy0tdHctcmluZy1vZmZzZXQtY29sb3I6ICNmZmY7LS10dy1yaW5nLWNvbG9yOiByZ2IoNTkgMTMwIDI0NiAvIC41KTstLXR3LXJpbmctb2Zmc2V0LXNoYWRvdzogMCAwICMwMDAwOy0tdHctcmluZy1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXNoYWRvdzogMCAwICMwMDAwOy0tdHctc2hhZG93LWNvbG9yZWQ6IDAgMCAjMDAwMDstLXR3LWJsdXI6IDstLXR3LWJyaWdodG5lc3M6IDstLXR3LWNvbnRyYXN0OiA7LS10dy1ncmF5c2NhbGU6IDstLXR3LWh1ZS1yb3RhdGU6IDstLXR3LWludmVydDogOy0tdHctc2F0dXJhdGU6IDstLXR3LXNlcGlhOiA7LS10dy1kcm9wLXNoYWRvdzogOy0tdHctYmFja2Ryb3AtYmx1cjogOy0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzczogOy0tdHctYmFja2Ryb3AtY29udHJhc3Q6IDstLXR3LWJhY2tkcm9wLWdyYXlzY2FsZTogOy0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZTogOy0tdHctYmFja2Ryb3AtaW52ZXJ0OiA7LS10dy1iYWNrZHJvcC1vcGFjaXR5OiA7LS10dy1iYWNrZHJvcC1zYXR1cmF0ZTogOy0tdHctYmFja2Ryb3Atc2VwaWE6IH06OmJhY2tkcm9wey0tdHctYm9yZGVyLXNwYWNpbmcteDogMDstLXR3LWJvcmRlci1zcGFjaW5nLXk6IDA7LS10dy10cmFuc2xhdGUteDogMDstLXR3LXRyYW5zbGF0ZS15OiAwOy0tdHctcm90YXRlOiAwOy0tdHctc2tldy14OiAwOy0tdHctc2tldy15OiAwOy0tdHctc2NhbGUteDogMTstLXR3LXNjYWxlLXk6IDE7LS10dy1wYW4teDogOy0tdHctcGFuLXk6IDstLXR3LXBpbmNoLXpvb206IDstLXR3LXNjcm9sbC1zbmFwLXN0cmljdG5lc3M6IHByb3hpbWl0eTstLXR3LWdyYWRpZW50LWZyb20tcG9zaXRpb246IDstLXR3LWdyYWRpZW50LXZpYS1wb3NpdGlvbjogOy0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb246IDstLXR3LW9yZGluYWw6IDstLXR3LXNsYXNoZWQtemVybzogOy0tdHctbnVtZXJpYy1maWd1cmU6IDstLXR3LW51bWVyaWMtc3BhY2luZzogOy0tdHctbnVtZXJpYy1mcmFjdGlvbjogOy0tdHctcmluZy1pbnNldDogOy0tdHctcmluZy1vZmZzZXQtd2lkdGg6IDBweDstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiAjZmZmOy0tdHctcmluZy1jb2xvcjogcmdiKDU5IDEzMCAyNDYgLyAuNSk7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXJpbmctc2hhZG93OiAwIDAgIzAwMDA7LS10dy1zaGFkb3c6IDAgMCAjMDAwMDstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDAgIzAwMDA7LS10dy1ibHVyOiA7LS10dy1icmlnaHRuZXNzOiA7LS10dy1jb250cmFzdDogOy0tdHctZ3JheXNjYWxlOiA7LS10dy1odWUtcm90YXRlOiA7LS10dy1pbnZlcnQ6IDstLXR3LXNhdHVyYXRlOiA7LS10dy1zZXBpYTogOy0tdHctZHJvcC1zaGFkb3c6IDstLXR3LWJhY2tkcm9wLWJsdXI6IDstLXR3LWJhY2tkcm9wLWJyaWdodG5lc3M6IDstLXR3LWJhY2tkcm9wLWNvbnRyYXN0OiA7LS10dy1iYWNrZHJvcC1ncmF5c2NhbGU6IDstLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGU6IDstLXR3LWJhY2tkcm9wLWludmVydDogOy0tdHctYmFja2Ryb3Atb3BhY2l0eTogOy0tdHctYmFja2Ryb3Atc2F0dXJhdGU6IDstLXR3LWJhY2tkcm9wLXNlcGlhOiB9LnNyLW9ubHl7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O2hlaWdodDoxcHg7cGFkZGluZzowO21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtjbGlwOnJlY3QoMCwwLDAsMCk7d2hpdGUtc3BhY2U6bm93cmFwO2JvcmRlci13aWR0aDowfS5wb2ludGVyLWV2ZW50cy1ub25le3BvaW50ZXItZXZlbnRzOm5vbmV9LmludmlzaWJsZXt2aXNpYmlsaXR5OmhpZGRlbn0uc3RhdGlje3Bvc2l0aW9uOnN0YXRpY30uZml4ZWR7cG9zaXRpb246Zml4ZWR9LmFic29sdXRle3Bvc2l0aW9uOmFic29sdXRlfS5yZWxhdGl2ZXtwb3NpdGlvbjpyZWxhdGl2ZX0uc3RpY2t5e3Bvc2l0aW9uOnN0aWNreX0uaW5zZXQtMHt0b3A6MDtyaWdodDowO2JvdHRvbTowO2xlZnQ6MH0uaW5zZXQteS0we3RvcDowO2JvdHRvbTowfS4tbGVmdC0ye2xlZnQ6LS41cmVtfS4tdG9wLVxbNHB4XF17dG9wOi00cHh9LmJvdHRvbS0we2JvdHRvbTowfS5ib3R0b20tNHtib3R0b206MXJlbX0ubGVmdC0we2xlZnQ6MH0ubGVmdC0xe2xlZnQ6LjI1cmVtfS5sZWZ0LTFcLzJ7bGVmdDo1MCV9LmxlZnQtMntsZWZ0Oi41cmVtfS5sZWZ0LVxbNTBcJVxde2xlZnQ6NTAlfS5yaWdodC0we3JpZ2h0OjB9LnJpZ2h0LTF7cmlnaHQ6LjI1cmVtfS5yaWdodC00e3JpZ2h0OjFyZW19LnJpZ2h0LVxbMTZweFxde3JpZ2h0OjE2cHh9LnRvcC0we3RvcDowfS50b3AtNHt0b3A6MXJlbX0udG9wLVxbNTBcJVxde3RvcDo1MCV9LnotNTB7ei1pbmRleDo1MH0uei1cWzVcXXt6LWluZGV4OjV9Lnotb3ZlcmxheXt6LWluZGV4OjR9Li1teC0xe21hcmdpbi1sZWZ0Oi0uMjVyZW07bWFyZ2luLXJpZ2h0Oi0uMjVyZW19Li1teS0ye21hcmdpbi10b3A6LS41cmVtO21hcmdpbi1ib3R0b206LS41cmVtfS4tbXktXFsxMDBweFxde21hcmdpbi10b3A6LTEwMHB4O21hcmdpbi1ib3R0b206LTEwMHB4fS5teC0ye21hcmdpbi1sZWZ0Oi41cmVtO21hcmdpbi1yaWdodDouNXJlbX0ubXktMXttYXJnaW4tdG9wOi4yNXJlbTttYXJnaW4tYm90dG9tOi4yNXJlbX0ubWItNHttYXJnaW4tYm90dG9tOjFyZW19Lm1sLTJ7bWFyZ2luLWxlZnQ6LjVyZW19Lm1sLTR7bWFyZ2luLWxlZnQ6MXJlbX0ubWwtXFsyMHB4XF17bWFyZ2luLWxlZnQ6MjBweH0ubWwtYXV0b3ttYXJnaW4tbGVmdDphdXRvfS5tci0ye21hcmdpbi1yaWdodDouNXJlbX0ubXQtMnttYXJnaW4tdG9wOi41cmVtfS5ibG9ja3tkaXNwbGF5OmJsb2NrfS5pbmxpbmV7ZGlzcGxheTppbmxpbmV9LmZsZXh7ZGlzcGxheTpmbGV4fS5pbmxpbmUtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4fS50YWJsZXtkaXNwbGF5OnRhYmxlfS5ncmlke2Rpc3BsYXk6Z3JpZH0uaGlkZGVue2Rpc3BsYXk6bm9uZX0uYXNwZWN0LXNxdWFyZXthc3BlY3QtcmF0aW86MSAvIDF9LmgtMTB7aGVpZ2h0OjIuNXJlbX0uaC0xMXtoZWlnaHQ6Mi43NXJlbX0uaC0ye2hlaWdodDouNXJlbX0uaC0yXC41e2hlaWdodDouNjI1cmVtfS5oLTN7aGVpZ2h0Oi43NXJlbX0uaC0zXC41e2hlaWdodDouODc1cmVtfS5oLTR7aGVpZ2h0OjFyZW19LmgtN3toZWlnaHQ6MS43NXJlbX0uaC05e2hlaWdodDoyLjI1cmVtfS5oLVxbMTRweFxde2hlaWdodDoxNHB4fS5oLVxbMThweFxde2hlaWdodDoxOHB4fS5oLVxbMXB4XF17aGVpZ2h0OjFweH0uaC1cWzIwcHhcXXtoZWlnaHQ6MjBweH0uaC1cWzIycHhcXXtoZWlnaHQ6MjJweH0uaC1cWzI0cHhcXXtoZWlnaHQ6MjRweH0uaC1cWzMycHhcXXtoZWlnaHQ6MzJweH0uaC1cWzUwcHhcXXtoZWlnaHQ6NTBweH0uaC1cWzc1cHhcXXtoZWlnaHQ6NzVweH0uaC1cWzlweFxde2hlaWdodDo5cHh9LmgtXFt2YXJcKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0XClcXXtoZWlnaHQ6dmFyKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0KX0uaC1mdWxse2hlaWdodDoxMDAlfS5oLXB4e2hlaWdodDoxcHh9Lmgtc2NyZWVue2hlaWdodDoxMDB2aH0ubWF4LWgtXFszMDBweFxde21heC1oZWlnaHQ6MzAwcHh9Lm1pbi1oLVxbMjAwcHhcXXttaW4taGVpZ2h0OjIwMHB4fS5taW4taC1cWzMwMHB4XF17bWluLWhlaWdodDozMDBweH0ubWluLWgtc2NyZWVue21pbi1oZWlnaHQ6MTAwdmh9LnctMVwvM3t3aWR0aDozMy4zMzMzMzMlfS53LTEwe3dpZHRoOjIuNXJlbX0udy0ye3dpZHRoOi41cmVtfS53LTJcLjV7d2lkdGg6LjYyNXJlbX0udy0ze3dpZHRoOi43NXJlbX0udy0zXC41e3dpZHRoOi44NzVyZW19LnctNHt3aWR0aDoxcmVtfS53LTV7d2lkdGg6MS4yNXJlbX0udy03e3dpZHRoOjEuNzVyZW19LnctNzJ7d2lkdGg6MThyZW19LnctOXt3aWR0aDoyLjI1cmVtfS53LVxbMTRweFxde3dpZHRoOjE0cHh9LnctXFsxcHhcXXt3aWR0aDoxcHh9LnctXFsyMHB4XF17d2lkdGg6MjBweH0udy1cWzI0cHhcXXt3aWR0aDoyNHB4fS53LVxbMzJweFxde3dpZHRoOjMycHh9LnctXFs0NHB4XF17d2lkdGg6NDRweH0udy1cWzlweFxde3dpZHRoOjlweH0udy1maXR7d2lkdGg6LW1vei1maXQtY29udGVudDt3aWR0aDpmaXQtY29udGVudH0udy1mdWxse3dpZHRoOjEwMCV9Lnctc2NyZWVue3dpZHRoOjEwMHZ3fS5taW4tdy0we21pbi13aWR0aDowcHh9Lm1pbi13LVxbMzIwcHhcXXttaW4td2lkdGg6MzIwcHh9Lm1pbi13LVxbNTAwcHhcXXttaW4td2lkdGg6NTAwcHh9Lm1pbi13LVxbOHJlbVxde21pbi13aWR0aDo4cmVtfS5taW4tdy1cW3ZhclwoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aFwpXF17bWluLXdpZHRoOnZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLXdpZHRoKX0ubWF4LXctNHhse21heC13aWR0aDo1NnJlbX0ubWF4LXctXFsxMDAwcHhcXXttYXgtd2lkdGg6MTAwMHB4fS5tYXgtdy1cWzEwdndcXXttYXgtd2lkdGg6MTB2d30ubWF4LXctXFszMDBweFxde21heC13aWR0aDozMDBweH0ubWF4LXctXFs5MHZ3XF17bWF4LXdpZHRoOjkwdnd9Lm1heC13LWxne21heC13aWR0aDozMnJlbX0uZmxleC0xe2ZsZXg6MSAxIDAlfS5mbGV4LWF1dG97ZmxleDoxIDEgYXV0b30uZmxleC1zaHJpbmstMCwuc2hyaW5rLTB7ZmxleC1zaHJpbms6MH0uZmxleC1ncm93e2ZsZXgtZ3JvdzoxfS5ib3JkZXItY29sbGFwc2V7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlfS4tdHJhbnNsYXRlLXgtMVwvMiwudHJhbnNsYXRlLXgtXFstNTBcJVxdey0tdHctdHJhbnNsYXRlLXg6IC01MCU7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnRyYW5zbGF0ZS15LVxbLTUwXCVcXXstLXR3LXRyYW5zbGF0ZS15OiAtNTAlO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS4tcm90YXRlLTkwey0tdHctcm90YXRlOiAtOTBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnJvdGF0ZS05MHstLXR3LXJvdGF0ZTogOTBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnJvdGF0ZS1cWy05MGRlZ1xdey0tdHctcm90YXRlOiAtOTBkZWc7dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LnJvdGF0ZS1cWzkwZGVnXF17LS10dy1yb3RhdGU6IDkwZGVnO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS50cmFuc2Zvcm17dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmN1cnNvci1jb2wtcmVzaXple2N1cnNvcjpjb2wtcmVzaXplfS5jdXJzb3ItZGVmYXVsdHtjdXJzb3I6ZGVmYXVsdH0uY3Vyc29yLWdyYWJ7Y3Vyc29yOmdyYWJ9LmN1cnNvci1wb2ludGVye2N1cnNvcjpwb2ludGVyfS5jdXJzb3Itc2UtcmVzaXple2N1cnNvcjpzZS1yZXNpemV9LnRvdWNoLW5vbmV7dG91Y2gtYWN0aW9uOm5vbmV9LnNlbGVjdC1ub25ley13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZX0ucmVzaXplLW5vbmV7cmVzaXplOm5vbmV9LnJlc2l6ZXtyZXNpemU6Ym90aH0ubGlzdC1kZWNpbWFse2xpc3Qtc3R5bGUtdHlwZTpkZWNpbWFsfS5saXN0LWRpc2N7bGlzdC1zdHlsZS10eXBlOmRpc2N9LmdyaWQtY29scy1cW21pbi1jb250ZW50XzFmclxde2dyaWQtdGVtcGxhdGUtY29sdW1uczptaW4tY29udGVudCAxZnJ9LmdyaWQtcm93cy1cWzFmclwsX21pbi1jb250ZW50XF17Z3JpZC10ZW1wbGF0ZS1yb3dzOjFmciBtaW4tY29udGVudH0uZmxleC1yb3d7ZmxleC1kaXJlY3Rpb246cm93fS5mbGV4LWNvbHtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmZsZXgtY29sLXJldmVyc2V7ZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2V9Lml0ZW1zLXN0YXJ0e2FsaWduLWl0ZW1zOmZsZXgtc3RhcnR9Lml0ZW1zLWVuZHthbGlnbi1pdGVtczpmbGV4LWVuZH0uaXRlbXMtY2VudGVye2FsaWduLWl0ZW1zOmNlbnRlcn0uanVzdGlmeS1zdGFydHtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1zdGFydH0uanVzdGlmeS1lbmR7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5qdXN0aWZ5LWNlbnRlcntqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfS5qdXN0aWZ5LWJldHdlZW57anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59LmdhcC0xe2dhcDouMjVyZW19LmdhcC0ye2dhcDouNXJlbX0uZ2FwLTN7Z2FwOi43NXJlbX0uZ2FwLTR7Z2FwOjFyZW19LmdhcC01e2dhcDoxLjI1cmVtfS5nYXAtXFswXC41ZW1cXXtnYXA6LjVlbX0uZ2FwLVxbMzZweFxde2dhcDozNnB4fS5nYXAteC0zey1tb3otY29sdW1uLWdhcDouNzVyZW07Y29sdW1uLWdhcDouNzVyZW19LmdhcC14LTR7LW1vei1jb2x1bW4tZ2FwOjFyZW07Y29sdW1uLWdhcDoxcmVtfS5nYXAteS0ye3Jvdy1nYXA6LjVyZW19LmdhcC15LTR7cm93LWdhcDoxcmVtfS5nYXAteS02e3Jvdy1nYXA6MS41cmVtfS5nYXAteS04e3Jvdy1nYXA6MnJlbX0uc3BhY2UteC0xPjpub3QoW2hpZGRlbl0pfjpub3QoW2hpZGRlbl0pey0tdHctc3BhY2UteC1yZXZlcnNlOiAwO21hcmdpbi1yaWdodDpjYWxjKC4yNXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoLjI1cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteC1yZXZlcnNlKSkpfS5zcGFjZS15LTE+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKC4yNXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoLjI1cmVtICogdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSl9LnNwYWNlLXktMVwuNT46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoLjM3NXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpKTttYXJnaW4tYm90dG9tOmNhbGMoLjM3NXJlbSAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5zcGFjZS15LTI+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKC41cmVtICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYyguNXJlbSAqIHZhcigtLXR3LXNwYWNlLXktcmV2ZXJzZSkpfS5zcGFjZS15LTQ+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS15LXJldmVyc2U6IDA7bWFyZ2luLXRvcDpjYWxjKDFyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKSk7bWFyZ2luLWJvdHRvbTpjYWxjKDFyZW0gKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0ub3ZlcmZsb3ctYXV0b3tvdmVyZmxvdzphdXRvfS5vdmVyZmxvdy1oaWRkZW57b3ZlcmZsb3c6aGlkZGVufS5vdmVyZmxvdy1jbGlwe292ZXJmbG93OmNsaXB9Lm92ZXJmbG93LXNjcm9sbHtvdmVyZmxvdzpzY3JvbGx9Lm92ZXJmbG93LXktYXV0b3tvdmVyZmxvdy15OmF1dG99Lm92ZXJmbG93LXgtaGlkZGVue292ZXJmbG93LXg6aGlkZGVufS5vdmVyZmxvdy15LXNjcm9sbHtvdmVyZmxvdy15OnNjcm9sbH0udHJ1bmNhdGV7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwfS53aGl0ZXNwYWNlLW5vd3JhcHt3aGl0ZS1zcGFjZTpub3dyYXB9LnJvdW5kZWR7Ym9yZGVyLXJhZGl1czouMjVyZW19LnJvdW5kZWQtXFtpbmhlcml0XF17Ym9yZGVyLXJhZGl1czppbmhlcml0fS5yb3VuZGVkLWZ1bGx7Ym9yZGVyLXJhZGl1czo5OTk5cHh9LnJvdW5kZWQtbGd7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5yb3VuZGVkLW1ke2JvcmRlci1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KX0ucm91bmRlZC1zbXtib3JkZXItcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDRweCl9LmJvcmRlcntib3JkZXItd2lkdGg6MXB4fS5ib3JkZXItMiwuYm9yZGVyLVxbMnB4XF17Ym9yZGVyLXdpZHRoOjJweH0uYm9yZGVyLXl7Ym9yZGVyLXRvcC13aWR0aDoxcHg7Ym9yZGVyLWJvdHRvbS13aWR0aDoxcHh9LmJvcmRlci1ie2JvcmRlci1ib3R0b20td2lkdGg6MXB4fS5ib3JkZXItbHtib3JkZXItbGVmdC13aWR0aDoxcHh9LmJvcmRlci1sLTJ7Ym9yZGVyLWxlZnQtd2lkdGg6MnB4fS5ib3JkZXItcntib3JkZXItcmlnaHQtd2lkdGg6MXB4fS5ib3JkZXItdHtib3JkZXItdG9wLXdpZHRoOjFweH0uYm9yZGVyLWFjY2VudHtib3JkZXItY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5ib3JkZXItYm9yZGVye2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmJvcmRlci1jYXJke2JvcmRlci1jb2xvcjpoc2wodmFyKC0tY2FyZCkpfS5ib3JkZXItZ3JheS00MDB7LS10dy1ib3JkZXItb3BhY2l0eTogMTtib3JkZXItY29sb3I6cmdiKDE1NiAxNjMgMTc1IC8gdmFyKC0tdHctYm9yZGVyLW9wYWNpdHkpKX0uYm9yZGVyLWlucHV0e2JvcmRlci1jb2xvcjpoc2wodmFyKC0taW5wdXQpKX0uYm9yZGVyLXByaW1hcnl7Ym9yZGVyLWNvbG9yOmhzbCh2YXIoLS1wcmltYXJ5KSl9LmJvcmRlci10cmFuc3BhcmVudHtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9LmJvcmRlci1sLXRyYW5zcGFyZW50e2JvcmRlci1sZWZ0LWNvbG9yOnRyYW5zcGFyZW50fS5ib3JkZXItdC10cmFuc3BhcmVudHtib3JkZXItdG9wLWNvbG9yOnRyYW5zcGFyZW50fS5iZy1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmJnLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5iZy1iYWNrZ3JvdW5kXC84MHtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSAvIC44KX0uYmctYm9yZGVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJvcmRlcikpfS5iZy1jYXJke2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWNhcmQpKX0uYmctY2FyZC1mb3JlZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWNhcmQtZm9yZWdyb3VuZCkpfS5iZy1kZXN0cnVjdGl2ZXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZSkpfS5iZy1ncmF5LTMwMHstLXR3LWJnLW9wYWNpdHk6IDE7YmFja2dyb3VuZC1jb2xvcjpyZ2IoMjA5IDIxMyAyMTkgLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLWdyYXktNTAwey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigxMDcgMTE0IDEyOCAvIHZhcigtLXR3LWJnLW9wYWNpdHkpKX0uYmctbXV0ZWR7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tbXV0ZWQpKX0uYmctcG9wb3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1wb3BvdmVyKSl9LmJnLXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5iZy1yZWQtNTAwey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigyMzkgNjggNjggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmJnLXNlY29uZGFyeXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1zZWNvbmRhcnkpKX0uYmctdHJhbnNwYXJlbnR7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0uYmctd2hpdGV7LS10dy1iZy1vcGFjaXR5OiAxO2JhY2tncm91bmQtY29sb3I6cmdiKDI1NSAyNTUgMjU1IC8gdmFyKC0tdHctYmctb3BhY2l0eSkpfS5iZy1ncmFkaWVudC10by1ie2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSx2YXIoLS10dy1ncmFkaWVudC1zdG9wcykpfS5mcm9tLXRyYW5zcGFyZW50ey0tdHctZ3JhZGllbnQtZnJvbTogdHJhbnNwYXJlbnQgdmFyKC0tdHctZ3JhZGllbnQtZnJvbS1wb3NpdGlvbik7LS10dy1ncmFkaWVudC10bzogcmdiKDAgMCAwIC8gMCkgdmFyKC0tdHctZ3JhZGllbnQtdG8tcG9zaXRpb24pOy0tdHctZ3JhZGllbnQtc3RvcHM6IHZhcigtLXR3LWdyYWRpZW50LWZyb20pLCB2YXIoLS10dy1ncmFkaWVudC10byl9LnRvLWJhY2tncm91bmR7LS10dy1ncmFkaWVudC10bzogaHNsKHZhcigtLWJhY2tncm91bmQpKSB2YXIoLS10dy1ncmFkaWVudC10by1wb3NpdGlvbil9LmZpbGwtY3VycmVudHtmaWxsOmN1cnJlbnRDb2xvcn0uZmlsbC13aGl0ZXtmaWxsOiNmZmZ9LnN0cm9rZS1cWzJweFxde3N0cm9rZS13aWR0aDoycHh9LnN0cm9rZS1cWzNweFxde3N0cm9rZS13aWR0aDozcHh9Lm9iamVjdC1jb250YWluey1vLW9iamVjdC1maXQ6Y29udGFpbjtvYmplY3QtZml0OmNvbnRhaW59LnAtMHtwYWRkaW5nOjB9LnAtMXtwYWRkaW5nOi4yNXJlbX0ucC0xMHtwYWRkaW5nOjIuNXJlbX0ucC0ye3BhZGRpbmc6LjVyZW19LnAtM3twYWRkaW5nOi43NXJlbX0ucC00e3BhZGRpbmc6MXJlbX0ucC02e3BhZGRpbmc6MS41cmVtfS5wLVxbMXB4XF17cGFkZGluZzoxcHh9LnB4LTF7cGFkZGluZy1sZWZ0Oi4yNXJlbTtwYWRkaW5nLXJpZ2h0Oi4yNXJlbX0ucHgtMntwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0ucHgtMlwuNXtwYWRkaW5nLWxlZnQ6LjYyNXJlbTtwYWRkaW5nLXJpZ2h0Oi42MjVyZW19LnB4LTN7cGFkZGluZy1sZWZ0Oi43NXJlbTtwYWRkaW5nLXJpZ2h0Oi43NXJlbX0ucHgtNHtwYWRkaW5nLWxlZnQ6MXJlbTtwYWRkaW5nLXJpZ2h0OjFyZW19LnB4LTV7cGFkZGluZy1sZWZ0OjEuMjVyZW07cGFkZGluZy1yaWdodDoxLjI1cmVtfS5weC04e3BhZGRpbmctbGVmdDoycmVtO3BhZGRpbmctcmlnaHQ6MnJlbX0ucHgtXFsyNHB4XF17cGFkZGluZy1sZWZ0OjI0cHg7cGFkZGluZy1yaWdodDoyNHB4fS5weS0xe3BhZGRpbmctdG9wOi4yNXJlbTtwYWRkaW5nLWJvdHRvbTouMjVyZW19LnB5LTFcLjV7cGFkZGluZy10b3A6LjM3NXJlbTtwYWRkaW5nLWJvdHRvbTouMzc1cmVtfS5weS0ye3BhZGRpbmctdG9wOi41cmVtO3BhZGRpbmctYm90dG9tOi41cmVtfS5weS0ze3BhZGRpbmctdG9wOi43NXJlbTtwYWRkaW5nLWJvdHRvbTouNzVyZW19LnB5LTR7cGFkZGluZy10b3A6MXJlbTtwYWRkaW5nLWJvdHRvbToxcmVtfS5weS02e3BhZGRpbmctdG9wOjEuNXJlbTtwYWRkaW5nLWJvdHRvbToxLjVyZW19LnB5LTd7cGFkZGluZy10b3A6MS43NXJlbTtwYWRkaW5nLWJvdHRvbToxLjc1cmVtfS5weS1cWzJweFxde3BhZGRpbmctdG9wOjJweDtwYWRkaW5nLWJvdHRvbToycHh9LnBiLTB7cGFkZGluZy1ib3R0b206MH0ucGItMjB7cGFkZGluZy1ib3R0b206NXJlbX0ucGItNHtwYWRkaW5nLWJvdHRvbToxcmVtfS5wbC02e3BhZGRpbmctbGVmdDoxLjVyZW19LnBsLTh7cGFkZGluZy1sZWZ0OjJyZW19LnByLTF7cGFkZGluZy1yaWdodDouMjVyZW19LnByLTJ7cGFkZGluZy1yaWdodDouNXJlbX0ucHQtMHtwYWRkaW5nLXRvcDowfS5wdC0xe3BhZGRpbmctdG9wOi4yNXJlbX0ucHQtMntwYWRkaW5nLXRvcDouNXJlbX0ucHQtNHtwYWRkaW5nLXRvcDoxcmVtfS50ZXh0LWxlZnR7dGV4dC1hbGlnbjpsZWZ0fS50ZXh0LWNlbnRlcnt0ZXh0LWFsaWduOmNlbnRlcn0udGV4dC1zdGFydHt0ZXh0LWFsaWduOnN0YXJ0fS5mb250LXNhbnN7Zm9udC1mYW1pbHk6Um9ib3RvLHNhbnMtc2VyaWZ9LmZvbnQtc2VyaWZ7Zm9udC1mYW1pbHk6U3BhY2UgTW9ubyxtb25vc3BhY2V9LnRleHQtMnhse2ZvbnQtc2l6ZToxLjVyZW07bGluZS1oZWlnaHQ6MnJlbX0udGV4dC0zeGx7Zm9udC1zaXplOjEuODc1cmVtO2xpbmUtaGVpZ2h0OjIuMjVyZW19LnRleHQtNHhse2ZvbnQtc2l6ZToyLjI1cmVtO2xpbmUtaGVpZ2h0OjIuNXJlbX0udGV4dC1cWzBcLjhyZW1cXXtmb250LXNpemU6LjhyZW19LnRleHQtXFsxMnB4XF17Zm9udC1zaXplOjEycHh9LnRleHQtbGd7Zm9udC1zaXplOjEuMTI1cmVtO2xpbmUtaGVpZ2h0OjEuNzVyZW19LnRleHQtc217Zm9udC1zaXplOi44NzVyZW07bGluZS1oZWlnaHQ6MS4yNXJlbX0udGV4dC14bHtmb250LXNpemU6MS4yNXJlbTtsaW5lLWhlaWdodDoxLjc1cmVtfS50ZXh0LXhze2ZvbnQtc2l6ZTouNzVyZW07bGluZS1oZWlnaHQ6MXJlbX0uZm9udC1cWzEycHhcXXtmb250LXdlaWdodDoxMnB4fS5mb250LVxbNDAwXF17Zm9udC13ZWlnaHQ6NDAwfS5mb250LVxbNTAwXF17Zm9udC13ZWlnaHQ6NTAwfS5mb250LVxbNTUwXF17Zm9udC13ZWlnaHQ6NTUwfS5mb250LWJvbGR7Zm9udC13ZWlnaHQ6NzAwfS5mb250LWV4dHJhYm9sZHtmb250LXdlaWdodDo4MDB9LmZvbnQtbWVkaXVte2ZvbnQtd2VpZ2h0OjUwMH0uZm9udC1ub3JtYWx7Zm9udC13ZWlnaHQ6NDAwfS5mb250LXNlbWlib2xke2ZvbnQtd2VpZ2h0OjYwMH0udXBwZXJjYXNle3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0uaXRhbGlje2ZvbnQtc3R5bGU6aXRhbGljfS5sZWFkaW5nLTR7bGluZS1oZWlnaHQ6MXJlbX0ubGVhZGluZy1ub25le2xpbmUtaGVpZ2h0OjF9LnRyYWNraW5nLVxbMFwuMDRlbVxde2xldHRlci1zcGFjaW5nOi4wNGVtfS50cmFja2luZy10aWdodHtsZXR0ZXItc3BhY2luZzotLjAyNWVtfS50cmFja2luZy13aWRlcntsZXR0ZXItc3BhY2luZzouMDVlbX0udHJhY2tpbmctd2lkZXN0e2xldHRlci1zcGFjaW5nOi4xZW19LnRleHQtYWNjZW50e2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0udGV4dC1hY2NlbnQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0udGV4dC1iYWNrZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LnRleHQtY2FyZC1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1jYXJkLWZvcmVncm91bmQpKX0udGV4dC1jdXJyZW50e2NvbG9yOmN1cnJlbnRDb2xvcn0udGV4dC1kZXN0cnVjdGl2ZXtjb2xvcjpoc2wodmFyKC0tZGVzdHJ1Y3RpdmUpKX0udGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kKSl9LnRleHQtZm9yZWdyb3VuZHtjb2xvcjpoc2wodmFyKC0tZm9yZWdyb3VuZCkpfS50ZXh0LW11dGVke2NvbG9yOmhzbCh2YXIoLS1tdXRlZCkpfS50ZXh0LW11dGVkLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0udGV4dC1wb3BvdmVyLWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLXBvcG92ZXItZm9yZWdyb3VuZCkpfS50ZXh0LXByaW1hcnl7Y29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0udGV4dC1wcmltYXJ5LWZvcmVncm91bmR7Y29sb3I6aHNsKHZhcigtLXByaW1hcnktZm9yZWdyb3VuZCkpfS50ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5ke2NvbG9yOmhzbCh2YXIoLS1zZWNvbmRhcnktZm9yZWdyb3VuZCkpfS50ZXh0LXdoaXRley0tdHctdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpfS51bmRlcmxpbmV7dGV4dC1kZWNvcmF0aW9uLWxpbmU6dW5kZXJsaW5lfS5saW5lLXRocm91Z2h7dGV4dC1kZWNvcmF0aW9uLWxpbmU6bGluZS10aHJvdWdofS51bmRlcmxpbmUtb2Zmc2V0LTR7dGV4dC11bmRlcmxpbmUtb2Zmc2V0OjRweH0uYW50aWFsaWFzZWR7LXdlYmtpdC1mb250LXNtb290aGluZzphbnRpYWxpYXNlZDstbW96LW9zeC1mb250LXNtb290aGluZzpncmF5c2NhbGV9Lm9wYWNpdHktMHtvcGFjaXR5OjB9Lm9wYWNpdHktMTAwe29wYWNpdHk6MX0ub3BhY2l0eS01MHtvcGFjaXR5Oi41fS5vcGFjaXR5LTYwe29wYWNpdHk6LjZ9Lm9wYWNpdHktNzB7b3BhY2l0eTouN30ub3BhY2l0eS03NXtvcGFjaXR5Oi43NX0uc2hhZG93ey0tdHctc2hhZG93OiAwIDFweCAzcHggMCByZ2IoMCAwIDAgLyAuMSksIDAgMXB4IDJweCAtMXB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAzcHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDFweCAycHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LnNoYWRvdy1sZ3stLXR3LXNoYWRvdzogMCAxMHB4IDE1cHggLTNweCByZ2IoMCAwIDAgLyAuMSksIDAgNHB4IDZweCAtNHB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDEwcHggMTVweCAtM3B4IHZhcigtLXR3LXNoYWRvdy1jb2xvciksIDAgNHB4IDZweCAtNHB4IHZhcigtLXR3LXNoYWRvdy1jb2xvcik7Ym94LXNoYWRvdzp2YXIoLS10dy1yaW5nLW9mZnNldC1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctcmluZy1zaGFkb3csIDAgMCAjMDAwMCksdmFyKC0tdHctc2hhZG93KX0uc2hhZG93LW1key0tdHctc2hhZG93OiAwIDRweCA2cHggLTFweCByZ2IoMCAwIDAgLyAuMSksIDAgMnB4IDRweCAtMnB4IHJnYigwIDAgMCAvIC4xKTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDRweCA2cHggLTFweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpLCAwIDJweCA0cHggLTJweCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LnNoYWRvdy1zbXstLXR3LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gLjA1KTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAycHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9Lm91dGxpbmUtbm9uZXtvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9Lm91dGxpbmV7b3V0bGluZS1zdHlsZTpzb2xpZH0ucmluZy0wey0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpOy0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMHB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksdmFyKC0tdHctcmluZy1zaGFkb3cpLHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKX0ucmluZy1vZmZzZXQtYmFja2dyb3VuZHstLXR3LXJpbmctb2Zmc2V0LWNvbG9yOiBoc2wodmFyKC0tYmFja2dyb3VuZCkpfS5kcm9wLXNoYWRvdy0yeGx7LS10dy1kcm9wLXNoYWRvdzogZHJvcC1zaGFkb3coMCAyNXB4IDI1cHggcmdiKDAgMCAwIC8gLjE1KSk7ZmlsdGVyOnZhcigtLXR3LWJsdXIpIHZhcigtLXR3LWJyaWdodG5lc3MpIHZhcigtLXR3LWNvbnRyYXN0KSB2YXIoLS10dy1ncmF5c2NhbGUpIHZhcigtLXR3LWh1ZS1yb3RhdGUpIHZhcigtLXR3LWludmVydCkgdmFyKC0tdHctc2F0dXJhdGUpIHZhcigtLXR3LXNlcGlhKSB2YXIoLS10dy1kcm9wLXNoYWRvdyl9LmRyb3Atc2hhZG93LVxbMHB4XzBweF8xMnB4X3JnYmFcKDU2XCwyMDVcLDE1MlwsMFwuNjBcKVxdey0tdHctZHJvcC1zaGFkb3c6IGRyb3Atc2hhZG93KDBweCAwcHggMTJweCByZ2JhKDU2LDIwNSwxNTIsLjYpKTtmaWx0ZXI6dmFyKC0tdHctYmx1cikgdmFyKC0tdHctYnJpZ2h0bmVzcykgdmFyKC0tdHctY29udHJhc3QpIHZhcigtLXR3LWdyYXlzY2FsZSkgdmFyKC0tdHctaHVlLXJvdGF0ZSkgdmFyKC0tdHctaW52ZXJ0KSB2YXIoLS10dy1zYXR1cmF0ZSkgdmFyKC0tdHctc2VwaWEpIHZhcigtLXR3LWRyb3Atc2hhZG93KX0uZmlsdGVye2ZpbHRlcjp2YXIoLS10dy1ibHVyKSB2YXIoLS10dy1icmlnaHRuZXNzKSB2YXIoLS10dy1jb250cmFzdCkgdmFyKC0tdHctZ3JheXNjYWxlKSB2YXIoLS10dy1odWUtcm90YXRlKSB2YXIoLS10dy1pbnZlcnQpIHZhcigtLXR3LXNhdHVyYXRlKSB2YXIoLS10dy1zZXBpYSkgdmFyKC0tdHctZHJvcC1zaGFkb3cpfS5iYWNrZHJvcC1ibHVyLXNtey0tdHctYmFja2Ryb3AtYmx1cjogYmx1cig0cHgpOy13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOnZhcigtLXR3LWJhY2tkcm9wLWJsdXIpIHZhcigtLXR3LWJhY2tkcm9wLWJyaWdodG5lc3MpIHZhcigtLXR3LWJhY2tkcm9wLWNvbnRyYXN0KSB2YXIoLS10dy1iYWNrZHJvcC1ncmF5c2NhbGUpIHZhcigtLXR3LWJhY2tkcm9wLWh1ZS1yb3RhdGUpIHZhcigtLXR3LWJhY2tkcm9wLWludmVydCkgdmFyKC0tdHctYmFja2Ryb3Atb3BhY2l0eSkgdmFyKC0tdHctYmFja2Ryb3Atc2F0dXJhdGUpIHZhcigtLXR3LWJhY2tkcm9wLXNlcGlhKTtiYWNrZHJvcC1maWx0ZXI6dmFyKC0tdHctYmFja2Ryb3AtYmx1cikgdmFyKC0tdHctYmFja2Ryb3AtYnJpZ2h0bmVzcykgdmFyKC0tdHctYmFja2Ryb3AtY29udHJhc3QpIHZhcigtLXR3LWJhY2tkcm9wLWdyYXlzY2FsZSkgdmFyKC0tdHctYmFja2Ryb3AtaHVlLXJvdGF0ZSkgdmFyKC0tdHctYmFja2Ryb3AtaW52ZXJ0KSB2YXIoLS10dy1iYWNrZHJvcC1vcGFjaXR5KSB2YXIoLS10dy1iYWNrZHJvcC1zYXR1cmF0ZSkgdmFyKC0tdHctYmFja2Ryb3Atc2VwaWEpfS50cmFuc2l0aW9uLWFsbHt0cmFuc2l0aW9uLXByb3BlcnR5OmFsbDt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKTt0cmFuc2l0aW9uLWR1cmF0aW9uOi4xNXN9LnRyYW5zaXRpb24tY29sb3Jze3RyYW5zaXRpb24tcHJvcGVydHk6Y29sb3IsYmFja2dyb3VuZC1jb2xvcixib3JkZXItY29sb3IsdGV4dC1kZWNvcmF0aW9uLWNvbG9yLGZpbGwsc3Ryb2tlO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30udHJhbnNpdGlvbi1vcGFjaXR5e3RyYW5zaXRpb24tcHJvcGVydHk6b3BhY2l0eTt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKTt0cmFuc2l0aW9uLWR1cmF0aW9uOi4xNXN9LnRyYW5zaXRpb24tdHJhbnNmb3Jte3RyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtO3RyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllciguNCwwLC4yLDEpO3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30uZHVyYXRpb24tMTUwe3RyYW5zaXRpb24tZHVyYXRpb246LjE1c30uZHVyYXRpb24tMjAwe3RyYW5zaXRpb24tZHVyYXRpb246LjJzfS5lYXNlLWluLW91dHt0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKX1Aa2V5ZnJhbWVzIGVudGVyezAle29wYWNpdHk6dmFyKC0tdHctZW50ZXItb3BhY2l0eSwgMSk7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKHZhcigtLXR3LWVudGVyLXRyYW5zbGF0ZS14LCAwKSx2YXIoLS10dy1lbnRlci10cmFuc2xhdGUteSwgMCksMCkgc2NhbGUzZCh2YXIoLS10dy1lbnRlci1zY2FsZSwgMSksdmFyKC0tdHctZW50ZXItc2NhbGUsIDEpLHZhcigtLXR3LWVudGVyLXNjYWxlLCAxKSkgcm90YXRlKHZhcigtLXR3LWVudGVyLXJvdGF0ZSwgMCkpfX1Aa2V5ZnJhbWVzIGV4aXR7dG97b3BhY2l0eTp2YXIoLS10dy1leGl0LW9wYWNpdHksIDEpO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCh2YXIoLS10dy1leGl0LXRyYW5zbGF0ZS14LCAwKSx2YXIoLS10dy1leGl0LXRyYW5zbGF0ZS15LCAwKSwwKSBzY2FsZTNkKHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpLHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpLHZhcigtLXR3LWV4aXQtc2NhbGUsIDEpKSByb3RhdGUodmFyKC0tdHctZXhpdC1yb3RhdGUsIDApKX19LmFuaW1hdGUtaW57YW5pbWF0aW9uLW5hbWU6ZW50ZXI7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXM7LS10dy1lbnRlci1vcGFjaXR5OiBpbml0aWFsOy0tdHctZW50ZXItc2NhbGU6IGluaXRpYWw7LS10dy1lbnRlci1yb3RhdGU6IGluaXRpYWw7LS10dy1lbnRlci10cmFuc2xhdGUteDogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiBpbml0aWFsfS5mYWRlLWluLTB7LS10dy1lbnRlci1vcGFjaXR5OiAwfS56b29tLWluLTk1ey0tdHctZW50ZXItc2NhbGU6IC45NX0uZHVyYXRpb24tMTUwe2FuaW1hdGlvbi1kdXJhdGlvbjouMTVzfS5kdXJhdGlvbi0yMDB7YW5pbWF0aW9uLWR1cmF0aW9uOi4yc30uZWFzZS1pbi1vdXR7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoLjQsMCwuMiwxKX0uZmlsZVw6Ym9yZGVyLTA6OmZpbGUtc2VsZWN0b3ItYnV0dG9ue2JvcmRlci13aWR0aDowcHh9LmZpbGVcOmJnLXRyYW5zcGFyZW50OjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5maWxlXDp0ZXh0LXNtOjpmaWxlLXNlbGVjdG9yLWJ1dHRvbntmb250LXNpemU6Ljg3NXJlbTtsaW5lLWhlaWdodDoxLjI1cmVtfS5maWxlXDpmb250LW1lZGl1bTo6ZmlsZS1zZWxlY3Rvci1idXR0b257Zm9udC13ZWlnaHQ6NTAwfS5wbGFjZWhvbGRlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LnBsYWNlaG9sZGVyXDp0ZXh0LW11dGVkLWZvcmVncm91bmQ6OnBsYWNlaG9sZGVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LmZvY3VzLXdpdGhpblw6cmVsYXRpdmU6Zm9jdXMtd2l0aGlue3Bvc2l0aW9uOnJlbGF0aXZlfS5ob3Zlclw6dy1cWzJweFxdOmhvdmVye3dpZHRoOjJweH0uaG92ZXJcOnctXFszcHhcXTpob3Zlcnt3aWR0aDozcHh9LmhvdmVyXDpjdXJzb3ItcG9pbnRlcjpob3ZlcntjdXJzb3I6cG9pbnRlcn0uaG92ZXJcOnJvdW5kZWQtbGc6aG92ZXJ7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5ob3Zlclw6YmctYWNjZW50OmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5ob3Zlclw6YmctYmFja2dyb3VuZDpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1iYWNrZ3JvdW5kKSl9LmhvdmVyXDpiZy1ib3JkZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmhvdmVyXDpiZy1kZXN0cnVjdGl2ZVwvOTA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tZGVzdHJ1Y3RpdmUpIC8gLjkpfS5ob3Zlclw6YmctbXV0ZWQ6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tbXV0ZWQpKX0uaG92ZXJcOmJnLXByaW1hcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5ob3Zlclw6YmctcHJpbWFyeVwvOTA6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkgLyAuOSl9LmhvdmVyXDpiZy1yZWQtNzAwOmhvdmVyey0tdHctYmctb3BhY2l0eTogMTtiYWNrZ3JvdW5kLWNvbG9yOnJnYigxODUgMjggMjggLyB2YXIoLS10dy1iZy1vcGFjaXR5KSl9LmhvdmVyXDpiZy1zZWNvbmRhcnlcLzgwOmhvdmVye2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXNlY29uZGFyeSkgLyAuOCl9LmhvdmVyXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kOmhvdmVye2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5ob3Zlclw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kOmhvdmVye2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LmhvdmVyXDp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZDpob3Zlcntjb2xvcjpoc2wodmFyKC0tcHJpbWFyeS1mb3JlZ3JvdW5kKSl9LmhvdmVyXDp0ZXh0LXdoaXRlOmhvdmVyey0tdHctdGV4dC1vcGFjaXR5OiAxO2NvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LXRleHQtb3BhY2l0eSkpfS5ob3Zlclw6dW5kZXJsaW5lOmhvdmVye3RleHQtZGVjb3JhdGlvbi1saW5lOnVuZGVybGluZX0uaG92ZXJcOm9wYWNpdHktMTAwOmhvdmVye29wYWNpdHk6MX0uZm9jdXNcOmJnLWFjY2VudDpmb2N1c3tiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZm9jdXNcOmJnLXByaW1hcnk6Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5mb2N1c1w6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZDpmb2N1c3tjb2xvcjpoc2wodmFyKC0tYWNjZW50LWZvcmVncm91bmQpKX0uZm9jdXNcOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kOmZvY3Vze2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0uZm9jdXNcOm91dGxpbmUtbm9uZTpmb2N1c3tvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9LmZvY3VzXDpyaW5nLTI6Zm9jdXN7LS10dy1yaW5nLW9mZnNldC1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIHZhcigtLXR3LXJpbmctb2Zmc2V0LXdpZHRoKSB2YXIoLS10dy1yaW5nLW9mZnNldC1jb2xvcik7LS10dy1yaW5nLXNoYWRvdzogdmFyKC0tdHctcmluZy1pbnNldCkgMCAwIDAgY2FsYygycHggKyB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkpIHZhcigtLXR3LXJpbmctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93KSx2YXIoLS10dy1yaW5nLXNoYWRvdyksdmFyKC0tdHctc2hhZG93LCAwIDAgIzAwMDApfS5mb2N1c1w6cmluZy1yaW5nOmZvY3Vzey0tdHctcmluZy1jb2xvcjogaHNsKHZhcigtLXJpbmcpKX0uZm9jdXNcOnJpbmctb2Zmc2V0LTI6Zm9jdXN7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMnB4fS5mb2N1cy12aXNpYmxlXDpvdXRsaW5lLW5vbmU6Zm9jdXMtdmlzaWJsZXtvdXRsaW5lOjJweCBzb2xpZCB0cmFuc3BhcmVudDtvdXRsaW5lLW9mZnNldDoycHh9LmZvY3VzLXZpc2libGVcOm91dGxpbmUtYWNjZW50OmZvY3VzLXZpc2libGV7b3V0bGluZS1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmZvY3VzLXZpc2libGVcOnJpbmctMjpmb2N1cy12aXNpYmxley0tdHctcmluZy1vZmZzZXQtc2hhZG93OiB2YXIoLS10dy1yaW5nLWluc2V0KSAwIDAgMCB2YXIoLS10dy1yaW5nLW9mZnNldC13aWR0aCkgdmFyKC0tdHctcmluZy1vZmZzZXQtY29sb3IpOy0tdHctcmluZy1zaGFkb3c6IHZhcigtLXR3LXJpbmctaW5zZXQpIDAgMCAwIGNhbGMoMnB4ICsgdmFyKC0tdHctcmluZy1vZmZzZXQtd2lkdGgpKSB2YXIoLS10dy1yaW5nLWNvbG9yKTtib3gtc2hhZG93OnZhcigtLXR3LXJpbmctb2Zmc2V0LXNoYWRvdyksdmFyKC0tdHctcmluZy1zaGFkb3cpLHZhcigtLXR3LXNoYWRvdywgMCAwICMwMDAwKX0uZm9jdXMtdmlzaWJsZVw6cmluZy1yaW5nOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLWNvbG9yOiBoc2wodmFyKC0tcmluZykpfS5mb2N1cy12aXNpYmxlXDpyaW5nLW9mZnNldC0yOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLW9mZnNldC13aWR0aDogMnB4fS5mb2N1cy12aXNpYmxlXDpyaW5nLW9mZnNldC1iYWNrZ3JvdW5kOmZvY3VzLXZpc2libGV7LS10dy1yaW5nLW9mZnNldC1jb2xvcjogaHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGlzYWJsZWRcOnBvaW50ZXItZXZlbnRzLW5vbmU6ZGlzYWJsZWR7cG9pbnRlci1ldmVudHM6bm9uZX0uZGlzYWJsZWRcOmN1cnNvci1ub3QtYWxsb3dlZDpkaXNhYmxlZHtjdXJzb3I6bm90LWFsbG93ZWR9LmRpc2FibGVkXDpib3JkZXItYm9yZGVyOmRpc2FibGVke2JvcmRlci1jb2xvcjpoc2wodmFyKC0tYm9yZGVyKSl9LmRpc2FibGVkXDp0ZXh0LWJhY2tncm91bmQ6ZGlzYWJsZWR7Y29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGlzYWJsZWRcOm9wYWNpdHktNTA6ZGlzYWJsZWR7b3BhY2l0eTouNX0ucGVlcjpkaXNhYmxlZH4ucGVlci1kaXNhYmxlZFw6Y3Vyc29yLW5vdC1hbGxvd2Vke2N1cnNvcjpub3QtYWxsb3dlZH0ucGVlcjpkaXNhYmxlZH4ucGVlci1kaXNhYmxlZFw6b3BhY2l0eS03MHtvcGFjaXR5Oi43fS5hcmlhLXNlbGVjdGVkXDpiZy1hY2NlbnRbYXJpYS1zZWxlY3RlZD10cnVlXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uYXJpYS1zZWxlY3RlZFw6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZFthcmlhLXNlbGVjdGVkPXRydWVde2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5hcmlhLXNlbGVjdGVkXDpvcGFjaXR5LTEwMFthcmlhLXNlbGVjdGVkPXRydWVde29wYWNpdHk6MX0uZGF0YS1cW2Rpc2FibGVkXF1cOnBvaW50ZXItZXZlbnRzLW5vbmVbZGF0YS1kaXNhYmxlZF17cG9pbnRlci1ldmVudHM6bm9uZX0uZGF0YS1cW3NpZGVcPWJvdHRvbVxdXDp0cmFuc2xhdGUteS0xW2RhdGEtc2lkZT1ib3R0b21dey0tdHctdHJhbnNsYXRlLXk6IC4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3NpZGVcPWxlZnRcXVw6LXRyYW5zbGF0ZS14LTFbZGF0YS1zaWRlPWxlZnRdey0tdHctdHJhbnNsYXRlLXg6IC0uMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzaWRlXD1yaWdodFxdXDp0cmFuc2xhdGUteC0xW2RhdGEtc2lkZT1yaWdodF17LS10dy10cmFuc2xhdGUteDogLjI1cmVtO3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfS5kYXRhLVxbc2lkZVw9dG9wXF1cOi10cmFuc2xhdGUteS0xW2RhdGEtc2lkZT10b3Bdey0tdHctdHJhbnNsYXRlLXk6IC0uMjVyZW07dHJhbnNmb3JtOnRyYW5zbGF0ZSh2YXIoLS10dy10cmFuc2xhdGUteCksdmFyKC0tdHctdHJhbnNsYXRlLXkpKSByb3RhdGUodmFyKC0tdHctcm90YXRlKSkgc2tldyh2YXIoLS10dy1za2V3LXgpKSBza2V3WSh2YXIoLS10dy1za2V3LXkpKSBzY2FsZVgodmFyKC0tdHctc2NhbGUteCkpIHNjYWxlWSh2YXIoLS10dy1zY2FsZS15KSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDp0cmFuc2xhdGUteC01W2RhdGEtc3RhdGU9Y2hlY2tlZF17LS10dy10cmFuc2xhdGUteDogMS4yNXJlbTt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uZGF0YS1cW3N0YXRlXD11bmNoZWNrZWRcXVw6dHJhbnNsYXRlLXgtMFtkYXRhLXN0YXRlPXVuY2hlY2tlZF17LS10dy10cmFuc2xhdGUteDogMHB4O3RyYW5zZm9ybTp0cmFuc2xhdGUodmFyKC0tdHctdHJhbnNsYXRlLXgpLHZhcigtLXR3LXRyYW5zbGF0ZS15KSkgcm90YXRlKHZhcigtLXR3LXJvdGF0ZSkpIHNrZXcodmFyKC0tdHctc2tldy14KSkgc2tld1kodmFyKC0tdHctc2tldy15KSkgc2NhbGVYKHZhcigtLXR3LXNjYWxlLXgpKSBzY2FsZVkodmFyKC0tdHctc2NhbGUteSkpfUBrZXlmcmFtZXMgYWNjb3JkaW9uLXVwezAle2hlaWdodDp2YXIoLS1yYWRpeC1hY2NvcmRpb24tY29udGVudC1oZWlnaHQpfXRve2hlaWdodDowfX0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6YW5pbWF0ZS1hY2NvcmRpb24tdXBbZGF0YS1zdGF0ZT1jbG9zZWRde2FuaW1hdGlvbjphY2NvcmRpb24tdXAgLjJzIGVhc2Utb3V0fUBrZXlmcmFtZXMgYWNjb3JkaW9uLWRvd257MCV7aGVpZ2h0OjB9dG97aGVpZ2h0OnZhcigtLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LWhlaWdodCl9fS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6YW5pbWF0ZS1hY2NvcmRpb24tZG93bltkYXRhLXN0YXRlPW9wZW5de2FuaW1hdGlvbjphY2NvcmRpb24tZG93biAuMnMgZWFzZS1vdXR9LmRhdGEtXFtzdGF0ZVw9YWN0aXZlXF1cOmJnLWJhY2tncm91bmRbZGF0YS1zdGF0ZT1hY3RpdmVde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWJhY2tncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1jaGVja2VkXF1cOmJnLWFjY2VudFtkYXRhLXN0YXRlPWNoZWNrZWRde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLWFjY2VudCkpfS5kYXRhLVxbc3RhdGVcPWNoZWNrZWRcXVw6YmctcHJpbWFyeVtkYXRhLXN0YXRlPWNoZWNrZWRde2JhY2tncm91bmQtY29sb3I6aHNsKHZhcigtLXByaW1hcnkpKX0uZGF0YS1cW3N0YXRlXD1vblxdXDpiZy1hY2NlbnRbZGF0YS1zdGF0ZT1vbl0sLmRhdGEtXFtzdGF0ZVw9b3BlblxdXDpiZy1hY2NlbnRbZGF0YS1zdGF0ZT1vcGVuXXtiYWNrZ3JvdW5kLWNvbG9yOmhzbCh2YXIoLS1hY2NlbnQpKX0uZGF0YS1cW3N0YXRlXD11bmNoZWNrZWRcXVw6YmctcHJpbWFyeVtkYXRhLXN0YXRlPXVuY2hlY2tlZF17YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tcHJpbWFyeSkpfS5kYXRhLVxbc3RhdGVcPWFjdGl2ZVxdXDp0ZXh0LWZvcmVncm91bmRbZGF0YS1zdGF0ZT1hY3RpdmVde2NvbG9yOmhzbCh2YXIoLS1mb3JlZ3JvdW5kKSl9LmRhdGEtXFtzdGF0ZVw9Y2hlY2tlZFxdXDp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZFtkYXRhLXN0YXRlPWNoZWNrZWRde2NvbG9yOmhzbCh2YXIoLS1wcmltYXJ5LWZvcmVncm91bmQpKX0uZGF0YS1cW3N0YXRlXD1vblxdXDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9b25de2NvbG9yOmhzbCh2YXIoLS1hY2NlbnQtZm9yZWdyb3VuZCkpfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kW2RhdGEtc3RhdGU9b3Blbl17Y29sb3I6aHNsKHZhcigtLW11dGVkLWZvcmVncm91bmQpKX0uZGF0YS1cW2Rpc2FibGVkXF1cOm9wYWNpdHktNTBbZGF0YS1kaXNhYmxlZF17b3BhY2l0eTouNX0uZGF0YS1cW3N0YXRlXD1hY3RpdmVcXVw6c2hhZG93LXNtW2RhdGEtc3RhdGU9YWN0aXZlXXstLXR3LXNoYWRvdzogMCAxcHggMnB4IDAgcmdiKDAgMCAwIC8gLjA1KTstLXR3LXNoYWRvdy1jb2xvcmVkOiAwIDFweCAycHggMCB2YXIoLS10dy1zaGFkb3ctY29sb3IpO2JveC1zaGFkb3c6dmFyKC0tdHctcmluZy1vZmZzZXQtc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXJpbmctc2hhZG93LCAwIDAgIzAwMDApLHZhcigtLXR3LXNoYWRvdyl9LmRhdGEtXFtzdGF0ZVw9b3BlblxdXDphbmltYXRlLWluW2RhdGEtc3RhdGU9b3Blbl17YW5pbWF0aW9uLW5hbWU6ZW50ZXI7YW5pbWF0aW9uLWR1cmF0aW9uOi4xNXM7LS10dy1lbnRlci1vcGFjaXR5OiBpbml0aWFsOy0tdHctZW50ZXItc2NhbGU6IGluaXRpYWw7LS10dy1lbnRlci1yb3RhdGU6IGluaXRpYWw7LS10dy1lbnRlci10cmFuc2xhdGUteDogaW5pdGlhbDstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiBpbml0aWFsfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDphbmltYXRlLW91dFtkYXRhLXN0YXRlPWNsb3NlZF17YW5pbWF0aW9uLW5hbWU6ZXhpdDthbmltYXRpb24tZHVyYXRpb246LjE1czstLXR3LWV4aXQtb3BhY2l0eTogaW5pdGlhbDstLXR3LWV4aXQtc2NhbGU6IGluaXRpYWw7LS10dy1leGl0LXJvdGF0ZTogaW5pdGlhbDstLXR3LWV4aXQtdHJhbnNsYXRlLXg6IGluaXRpYWw7LS10dy1leGl0LXRyYW5zbGF0ZS15OiBpbml0aWFsfS5kYXRhLVxbc3RhdGVcPWNsb3NlZFxdXDpmYWRlLW91dC0wW2RhdGEtc3RhdGU9Y2xvc2VkXXstLXR3LWV4aXQtb3BhY2l0eTogMH0uZGF0YS1cW3N0YXRlXD1vcGVuXF1cOmZhZGUtaW4tMFtkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItb3BhY2l0eTogMH0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6em9vbS1vdXQtOTVbZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC1zY2FsZTogLjk1fS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6em9vbS1pbi05NVtkYXRhLXN0YXRlPW9wZW5dey0tdHctZW50ZXItc2NhbGU6IC45NX0uZGF0YS1cW3NpZGVcPWJvdHRvbVxdXDpzbGlkZS1pbi1mcm9tLXRvcC0yW2RhdGEtc2lkZT1ib3R0b21dey0tdHctZW50ZXItdHJhbnNsYXRlLXk6IC0uNXJlbX0uZGF0YS1cW3NpZGVcPWxlZnRcXVw6c2xpZGUtaW4tZnJvbS1yaWdodC0yW2RhdGEtc2lkZT1sZWZ0XXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiAuNXJlbX0uZGF0YS1cW3NpZGVcPXJpZ2h0XF1cOnNsaWRlLWluLWZyb20tbGVmdC0yW2RhdGEtc2lkZT1yaWdodF17LS10dy1lbnRlci10cmFuc2xhdGUteDogLS41cmVtfS5kYXRhLVxbc2lkZVw9dG9wXF1cOnNsaWRlLWluLWZyb20tYm90dG9tLTJbZGF0YS1zaWRlPXRvcF17LS10dy1lbnRlci10cmFuc2xhdGUteTogLjVyZW19LmRhdGEtXFtzdGF0ZVw9Y2xvc2VkXF1cOnNsaWRlLW91dC10by1sZWZ0LTFcLzJbZGF0YS1zdGF0ZT1jbG9zZWRdey0tdHctZXhpdC10cmFuc2xhdGUteDogLTUwJX0uZGF0YS1cW3N0YXRlXD1jbG9zZWRcXVw6c2xpZGUtb3V0LXRvLXRvcC1cWzQ4XCVcXVtkYXRhLXN0YXRlPWNsb3NlZF17LS10dy1leGl0LXRyYW5zbGF0ZS15OiAtNDglfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6c2xpZGUtaW4tZnJvbS1sZWZ0LTFcLzJbZGF0YS1zdGF0ZT1vcGVuXXstLXR3LWVudGVyLXRyYW5zbGF0ZS14OiAtNTAlfS5kYXRhLVxbc3RhdGVcPW9wZW5cXVw6c2xpZGUtaW4tZnJvbS10b3AtXFs0OFwlXF1bZGF0YS1zdGF0ZT1vcGVuXXstLXR3LWVudGVyLXRyYW5zbGF0ZS15OiAtNDglfTppcyhbZGF0YS1tb2RlPWRhcmtdIC5kYXJrXDpib3JkZXItd2hpdGUpey0tdHctYm9yZGVyLW9wYWNpdHk6IDE7Ym9yZGVyLWNvbG9yOnJnYigyNTUgMjU1IDI1NSAvIHZhcigtLXR3LWJvcmRlci1vcGFjaXR5KSl9QG1lZGlhIChtaW4td2lkdGg6IDY0MHB4KXsuc21cOm10LTB7bWFyZ2luLXRvcDowfS5zbVw6YmxvY2t7ZGlzcGxheTpibG9ja30uc21cOmZsZXgtcm93e2ZsZXgtZGlyZWN0aW9uOnJvd30uc21cOmp1c3RpZnktZW5ke2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uc21cOnNwYWNlLXgtMj46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXgtcmV2ZXJzZTogMDttYXJnaW4tcmlnaHQ6Y2FsYyguNXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoLjVyZW0gKiBjYWxjKDEgLSB2YXIoLS10dy1zcGFjZS14LXJldmVyc2UpKSl9LnNtXDpzcGFjZS14LTQ+Om5vdChbaGlkZGVuXSl+Om5vdChbaGlkZGVuXSl7LS10dy1zcGFjZS14LXJldmVyc2U6IDA7bWFyZ2luLXJpZ2h0OmNhbGMoMXJlbSAqIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpO21hcmdpbi1sZWZ0OmNhbGMoMXJlbSAqIGNhbGMoMSAtIHZhcigtLXR3LXNwYWNlLXgtcmV2ZXJzZSkpKX0uc21cOnNwYWNlLXktMD46bm90KFtoaWRkZW5dKX46bm90KFtoaWRkZW5dKXstLXR3LXNwYWNlLXktcmV2ZXJzZTogMDttYXJnaW4tdG9wOmNhbGMoMHB4ICogY2FsYygxIC0gdmFyKC0tdHctc3BhY2UteS1yZXZlcnNlKSkpO21hcmdpbi1ib3R0b206Y2FsYygwcHggKiB2YXIoLS10dy1zcGFjZS15LXJldmVyc2UpKX0uc21cOnJvdW5kZWQtbGd7Ym9yZGVyLXJhZGl1czp2YXIoLS1yYWRpdXMpfS5zbVw6cC0we3BhZGRpbmc6MH0uc21cOnRleHQtbGVmdHt0ZXh0LWFsaWduOmxlZnR9fUBtZWRpYSAobWluLXdpZHRoOiA3NjhweCl7Lm1kXDp3LWZ1bGx7d2lkdGg6MTAwJX19LlxbXCZcOmhhc1woXFthcmlhLXNlbGVjdGVkXF1cKVxdXDpiZy1hY2NlbnQ6aGFzKFthcmlhLXNlbGVjdGVkXSl7YmFja2dyb3VuZC1jb2xvcjpoc2wodmFyKC0tYWNjZW50KSl9LmZpcnN0XDpcW1wmXDpoYXNcKFxbYXJpYS1zZWxlY3RlZFxdXClcXVw6cm91bmRlZC1sLW1kOmhhcyhbYXJpYS1zZWxlY3RlZF0pOmZpcnN0LWNoaWxke2JvcmRlci10b3AtbGVmdC1yYWRpdXM6Y2FsYyh2YXIoLS1yYWRpdXMpIC0gMnB4KTtib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCl9Lmxhc3RcOlxbXCZcOmhhc1woXFthcmlhLXNlbGVjdGVkXF1cKVxdXDpyb3VuZGVkLXItbWQ6aGFzKFthcmlhLXNlbGVjdGVkXSk6bGFzdC1jaGlsZHtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czpjYWxjKHZhcigtLXJhZGl1cykgLSAycHgpO2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOmNhbGModmFyKC0tcmFkaXVzKSAtIDJweCl9LlxbXCZcW2RhdGEtc3RhdGVcPW9wZW5cXVw+c3ZnXF1cOnJvdGF0ZS0xODBbZGF0YS1zdGF0ZT1vcGVuXT5zdmd7LS10dy1yb3RhdGU6IDE4MGRlZzt0cmFuc2Zvcm06dHJhbnNsYXRlKHZhcigtLXR3LXRyYW5zbGF0ZS14KSx2YXIoLS10dy10cmFuc2xhdGUteSkpIHJvdGF0ZSh2YXIoLS10dy1yb3RhdGUpKSBza2V3KHZhcigtLXR3LXNrZXcteCkpIHNrZXdZKHZhcigtLXR3LXNrZXcteSkpIHNjYWxlWCh2YXIoLS10dy1zY2FsZS14KSkgc2NhbGVZKHZhcigtLXR3LXNjYWxlLXkpKX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnB4LTIgW2NtZGstZ3JvdXAtaGVhZGluZ117cGFkZGluZy1sZWZ0Oi41cmVtO3BhZGRpbmctcmlnaHQ6LjVyZW19LlxbXCZfXFtjbWRrLWdyb3VwLWhlYWRpbmdcXVxdXDpweS0xXC41IFtjbWRrLWdyb3VwLWhlYWRpbmdde3BhZGRpbmctdG9wOi4zNzVyZW07cGFkZGluZy1ib3R0b206LjM3NXJlbX0uXFtcJl9cW2NtZGstZ3JvdXAtaGVhZGluZ1xdXF1cOnRleHQteHMgW2NtZGstZ3JvdXAtaGVhZGluZ117Zm9udC1zaXplOi43NXJlbTtsaW5lLWhlaWdodDoxcmVtfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6Zm9udC1tZWRpdW0gW2NtZGstZ3JvdXAtaGVhZGluZ117Zm9udC13ZWlnaHQ6NTAwfS5cW1wmX1xbY21kay1ncm91cC1oZWFkaW5nXF1cXVw6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIFtjbWRrLWdyb3VwLWhlYWRpbmdde2NvbG9yOmhzbCh2YXIoLS1tdXRlZC1mb3JlZ3JvdW5kKSl9LlxbXCZfXFtjbWRrLWdyb3VwXF1cOm5vdFwoXFtoaWRkZW5cXVwpX1x+XFtjbWRrLWdyb3VwXF1cXVw6cHQtMCBbY21kay1ncm91cF06bm90KFtoaWRkZW5dKX5bY21kay1ncm91cF17cGFkZGluZy10b3A6MH0uXFtcJl9cW2NtZGstZ3JvdXBcXVxdXDpweC0yIFtjbWRrLWdyb3VwXXtwYWRkaW5nLWxlZnQ6LjVyZW07cGFkZGluZy1yaWdodDouNXJlbX0uXFtcJl9cW2NtZGstaW5wdXQtd3JhcHBlclxdX3N2Z1xdXDpoLTUgW2NtZGstaW5wdXQtd3JhcHBlcl0gc3Zne2hlaWdodDoxLjI1cmVtfS5cW1wmX1xbY21kay1pbnB1dC13cmFwcGVyXF1fc3ZnXF1cOnctNSBbY21kay1pbnB1dC13cmFwcGVyXSBzdmd7d2lkdGg6MS4yNXJlbX0uXFtcJl9cW2NtZGstaW5wdXRcXVxdXDpoLTEyIFtjbWRrLWlucHV0XXtoZWlnaHQ6M3JlbX0uXFtcJl9cW2NtZGstaXRlbVxdXF1cOnB4LTIgW2NtZGstaXRlbV17cGFkZGluZy1sZWZ0Oi41cmVtO3BhZGRpbmctcmlnaHQ6LjVyZW19LlxbXCZfXFtjbWRrLWl0ZW1cXVxdXDpweS0zIFtjbWRrLWl0ZW1de3BhZGRpbmctdG9wOi43NXJlbTtwYWRkaW5nLWJvdHRvbTouNzVyZW19LlxbXCZfXFtjbWRrLWl0ZW1cXV9zdmdcXVw6aC01IFtjbWRrLWl0ZW1dIHN2Z3toZWlnaHQ6MS4yNXJlbX0uXFtcJl9cW2NtZGstaXRlbVxdX3N2Z1xdXDp3LTUgW2NtZGstaXRlbV0gc3Zne3dpZHRoOjEuMjVyZW19Cg==","/assets/index-513f7a9c.js":"dmFyIENDPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgJEM9KGUsdCxuKT0+dCBpbiBlP0NDKGUsdCx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6bn0pOmVbdF09bjt2YXIgamU9KGUsdCxuKT0+KCRDKGUsdHlwZW9mIHQhPSJzeW1ib2wiP3QrIiI6dCxuKSxuKSxrQz0oZSx0LG4pPT57aWYoIXQuaGFzKGUpKXRocm93IFR5cGVFcnJvcigiQ2Fubm90ICIrbil9O3ZhciBJZD0oZSx0LG4pPT57aWYodC5oYXMoZSkpdGhyb3cgVHlwZUVycm9yKCJDYW5ub3QgYWRkIHRoZSBzYW1lIHByaXZhdGUgbWVtYmVyIG1vcmUgdGhhbiBvbmNlIik7dCBpbnN0YW5jZW9mIFdlYWtTZXQ/dC5hZGQoZSk6dC5zZXQoZSxuKX07dmFyIEhhPShlLHQsbik9PihrQyhlLHQsImFjY2VzcyBwcml2YXRlIG1ldGhvZCIpLG4pO2Z1bmN0aW9uIFRDKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXTtpZih0eXBlb2YgciE9InN0cmluZyImJiFBcnJheS5pc0FycmF5KHIpKXtmb3IoY29uc3QgbyBpbiByKWlmKG8hPT0iZGVmYXVsdCImJiEobyBpbiBlKSl7Y29uc3QgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHIsbyk7aSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbyxpLmdldD9pOntlbnVtZXJhYmxlOiEwLGdldDooKT0+cltvXX0pfX19cmV0dXJuIE9iamVjdC5mcmVlemUoT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pKX0oZnVuY3Rpb24oKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKS5yZWxMaXN0O2lmKHQmJnQuc3VwcG9ydHMmJnQuc3VwcG9ydHMoIm1vZHVsZXByZWxvYWQiKSlyZXR1cm47Zm9yKGNvbnN0IG8gb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnbGlua1tyZWw9Im1vZHVsZXByZWxvYWQiXScpKXIobyk7bmV3IE11dGF0aW9uT2JzZXJ2ZXIobz0+e2Zvcihjb25zdCBpIG9mIG8paWYoaS50eXBlPT09ImNoaWxkTGlzdCIpZm9yKGNvbnN0IGwgb2YgaS5hZGRlZE5vZGVzKWwudGFnTmFtZT09PSJMSU5LIiYmbC5yZWw9PT0ibW9kdWxlcHJlbG9hZCImJnIobCl9KS5vYnNlcnZlKGRvY3VtZW50LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pO2Z1bmN0aW9uIG4obyl7Y29uc3QgaT17fTtyZXR1cm4gby5pbnRlZ3JpdHkmJihpLmludGVncml0eT1vLmludGVncml0eSksby5yZWZlcnJlclBvbGljeSYmKGkucmVmZXJyZXJQb2xpY3k9by5yZWZlcnJlclBvbGljeSksby5jcm9zc09yaWdpbj09PSJ1c2UtY3JlZGVudGlhbHMiP2kuY3JlZGVudGlhbHM9ImluY2x1ZGUiOm8uY3Jvc3NPcmlnaW49PT0iYW5vbnltb3VzIj9pLmNyZWRlbnRpYWxzPSJvbWl0IjppLmNyZWRlbnRpYWxzPSJzYW1lLW9yaWdpbiIsaX1mdW5jdGlvbiByKG8pe2lmKG8uZXApcmV0dXJuO28uZXA9ITA7Y29uc3QgaT1uKG8pO2ZldGNoKG8uaHJlZixpKX19KSgpO2Z1bmN0aW9uICRhKGUpe3JldHVybiBlJiZlLl9fZXNNb2R1bGUmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJkZWZhdWx0Iik/ZS5kZWZhdWx0OmV9dmFyIEgwPXtleHBvcnRzOnt9fSxTZT17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBrYT1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksTkM9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksYkM9U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSxSQz1TeW1ib2wuZm9yKCJyZWFjdC5zdHJpY3RfbW9kZSIpLFBDPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksT0M9U3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKSxBQz1TeW1ib2wuZm9yKCJyZWFjdC5jb250ZXh0IiksTUM9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSxEQz1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLExDPVN5bWJvbC5mb3IoInJlYWN0Lm1lbW8iKSxJQz1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksRm09U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIGpDKGUpe3JldHVybiBlPT09bnVsbHx8dHlwZW9mIGUhPSJvYmplY3QiP251bGw6KGU9Rm0mJmVbRm1dfHxlWyJAQGl0ZXJhdG9yIl0sdHlwZW9mIGU9PSJmdW5jdGlvbiI/ZTpudWxsKX12YXIgSzA9e2lzTW91bnRlZDpmdW5jdGlvbigpe3JldHVybiExfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVSZXBsYWNlU3RhdGU6ZnVuY3Rpb24oKXt9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbigpe319LEcwPU9iamVjdC5hc3NpZ24sWTA9e307ZnVuY3Rpb24gUGwoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9WTAsdGhpcy51cGRhdGVyPW58fEswfVBsLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9O1BsLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLHQpe2lmKHR5cGVvZiBlIT0ib2JqZWN0IiYmdHlwZW9mIGUhPSJmdW5jdGlvbiImJmUhPW51bGwpdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxlLHQsInNldFN0YXRlIil9O1BsLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsZSwiZm9yY2VVcGRhdGUiKX07ZnVuY3Rpb24gWDAoKXt9WDAucHJvdG90eXBlPVBsLnByb3RvdHlwZTtmdW5jdGlvbiBicChlLHQsbil7dGhpcy5wcm9wcz1lLHRoaXMuY29udGV4dD10LHRoaXMucmVmcz1ZMCx0aGlzLnVwZGF0ZXI9bnx8SzB9dmFyIFJwPWJwLnByb3RvdHlwZT1uZXcgWDA7UnAuY29uc3RydWN0b3I9YnA7RzAoUnAsUGwucHJvdG90eXBlKTtScC5pc1B1cmVSZWFjdENvbXBvbmVudD0hMDt2YXIgQm09QXJyYXkuaXNBcnJheSxRMD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFBwPXtjdXJyZW50Om51bGx9LEowPXtrZXk6ITAscmVmOiEwLF9fc2VsZjohMCxfX3NvdXJjZTohMH07ZnVuY3Rpb24gWjAoZSx0LG4pe3ZhciByLG89e30saT1udWxsLGw9bnVsbDtpZih0IT1udWxsKWZvcihyIGluIHQucmVmIT09dm9pZCAwJiYobD10LnJlZiksdC5rZXkhPT12b2lkIDAmJihpPSIiK3Qua2V5KSx0KVEwLmNhbGwodCxyKSYmIUowLmhhc093blByb3BlcnR5KHIpJiYob1tyXT10W3JdKTt2YXIgcz1hcmd1bWVudHMubGVuZ3RoLTI7aWYocz09PTEpby5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxzKXtmb3IodmFyIGE9QXJyYXkocyksdT0wO3U8czt1KyspYVt1XT1hcmd1bWVudHNbdSsyXTtvLmNoaWxkcmVuPWF9aWYoZSYmZS5kZWZhdWx0UHJvcHMpZm9yKHIgaW4gcz1lLmRlZmF1bHRQcm9wcyxzKW9bcl09PT12b2lkIDAmJihvW3JdPXNbcl0pO3JldHVybnskJHR5cGVvZjprYSx0eXBlOmUsa2V5OmkscmVmOmwscHJvcHM6byxfb3duZXI6UHAuY3VycmVudH19ZnVuY3Rpb24gekMoZSx0KXtyZXR1cm57JCR0eXBlb2Y6a2EsdHlwZTplLnR5cGUsa2V5OnQscmVmOmUucmVmLHByb3BzOmUucHJvcHMsX293bmVyOmUuX293bmVyfX1mdW5jdGlvbiBPcChlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmZS4kJHR5cGVvZj09PWthfWZ1bmN0aW9uIEZDKGUpe3ZhciB0PXsiPSI6Ij0wIiwiOiI6Ij0yIn07cmV0dXJuIiQiK2UucmVwbGFjZSgvWz06XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0W25dfSl9dmFyIFdtPS9cLysvZztmdW5jdGlvbiBqZChlLHQpe3JldHVybiB0eXBlb2YgZT09Im9iamVjdCImJmUhPT1udWxsJiZlLmtleSE9bnVsbD9GQygiIitlLmtleSk6dC50b1N0cmluZygzNil9ZnVuY3Rpb24gU3UoZSx0LG4scixvKXt2YXIgaT10eXBlb2YgZTsoaT09PSJ1bmRlZmluZWQifHxpPT09ImJvb2xlYW4iKSYmKGU9bnVsbCk7dmFyIGw9ITE7aWYoZT09PW51bGwpbD0hMDtlbHNlIHN3aXRjaChpKXtjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOmw9ITA7YnJlYWs7Y2FzZSJvYmplY3QiOnN3aXRjaChlLiQkdHlwZW9mKXtjYXNlIGthOmNhc2UgTkM6bD0hMH19aWYobClyZXR1cm4gbD1lLG89byhsKSxlPXI9PT0iIj8iLiIramQobCwwKTpyLEJtKG8pPyhuPSIiLGUhPW51bGwmJihuPWUucmVwbGFjZShXbSwiJCYvIikrIi8iKSxTdShvLHQsbiwiIixmdW5jdGlvbih1KXtyZXR1cm4gdX0pKTpvIT1udWxsJiYoT3AobykmJihvPXpDKG8sbisoIW8ua2V5fHxsJiZsLmtleT09PW8ua2V5PyIiOigiIitvLmtleSkucmVwbGFjZShXbSwiJCYvIikrIi8iKStlKSksdC5wdXNoKG8pKSwxO2lmKGw9MCxyPXI9PT0iIj8iLiI6cisiOiIsQm0oZSkpZm9yKHZhciBzPTA7czxlLmxlbmd0aDtzKyspe2k9ZVtzXTt2YXIgYT1yK2pkKGkscyk7bCs9U3UoaSx0LG4sYSxvKX1lbHNlIGlmKGE9akMoZSksdHlwZW9mIGE9PSJmdW5jdGlvbiIpZm9yKGU9YS5jYWxsKGUpLHM9MDshKGk9ZS5uZXh0KCkpLmRvbmU7KWk9aS52YWx1ZSxhPXIramQoaSxzKyspLGwrPVN1KGksdCxuLGEsbyk7ZWxzZSBpZihpPT09Im9iamVjdCIpdGhyb3cgdD1TdHJpbmcoZSksRXJyb3IoIk9iamVjdHMgYXJlIG5vdCB2YWxpZCBhcyBhIFJlYWN0IGNoaWxkIChmb3VuZDogIisodD09PSJbb2JqZWN0IE9iamVjdF0iPyJvYmplY3Qgd2l0aCBrZXlzIHsiK09iamVjdC5rZXlzKGUpLmpvaW4oIiwgIikrIn0iOnQpKyIpLiBJZiB5b3UgbWVhbnQgdG8gcmVuZGVyIGEgY29sbGVjdGlvbiBvZiBjaGlsZHJlbiwgdXNlIGFuIGFycmF5IGluc3RlYWQuIik7cmV0dXJuIGx9ZnVuY3Rpb24gS2EoZSx0LG4pe2lmKGU9PW51bGwpcmV0dXJuIGU7dmFyIHI9W10sbz0wO3JldHVybiBTdShlLHIsIiIsIiIsZnVuY3Rpb24oaSl7cmV0dXJuIHQuY2FsbChuLGksbysrKX0pLHJ9ZnVuY3Rpb24gQkMoZSl7aWYoZS5fc3RhdHVzPT09LTEpe3ZhciB0PWUuX3Jlc3VsdDt0PXQoKSx0LnRoZW4oZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0xLGUuX3Jlc3VsdD1uKX0sZnVuY3Rpb24obil7KGUuX3N0YXR1cz09PTB8fGUuX3N0YXR1cz09PS0xKSYmKGUuX3N0YXR1cz0yLGUuX3Jlc3VsdD1uKX0pLGUuX3N0YXR1cz09PS0xJiYoZS5fc3RhdHVzPTAsZS5fcmVzdWx0PXQpfWlmKGUuX3N0YXR1cz09PTEpcmV0dXJuIGUuX3Jlc3VsdC5kZWZhdWx0O3Rocm93IGUuX3Jlc3VsdH12YXIgcm49e2N1cnJlbnQ6bnVsbH0sRXU9e3RyYW5zaXRpb246bnVsbH0sV0M9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6cm4sUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6RXUsUmVhY3RDdXJyZW50T3duZXI6UHB9O1NlLkNoaWxkcmVuPXttYXA6S2EsZm9yRWFjaDpmdW5jdGlvbihlLHQsbil7S2EoZSxmdW5jdGlvbigpe3QuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxuKX0sY291bnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9MDtyZXR1cm4gS2EoZSxmdW5jdGlvbigpe3QrK30pLHR9LHRvQXJyYXk6ZnVuY3Rpb24oZSl7cmV0dXJuIEthKGUsZnVuY3Rpb24odCl7cmV0dXJuIHR9KXx8W119LG9ubHk6ZnVuY3Rpb24oZSl7aWYoIU9wKGUpKXRocm93IEVycm9yKCJSZWFjdC5DaGlsZHJlbi5vbmx5IGV4cGVjdGVkIHRvIHJlY2VpdmUgYSBzaW5nbGUgUmVhY3QgZWxlbWVudCBjaGlsZC4iKTtyZXR1cm4gZX19O1NlLkNvbXBvbmVudD1QbDtTZS5GcmFnbWVudD1iQztTZS5Qcm9maWxlcj1QQztTZS5QdXJlQ29tcG9uZW50PWJwO1NlLlN0cmljdE1vZGU9UkM7U2UuU3VzcGVuc2U9REM7U2UuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ9V0M7U2UuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXtpZihlPT1udWxsKXRocm93IEVycm9yKCJSZWFjdC5jbG9uZUVsZW1lbnQoLi4uKTogVGhlIGFyZ3VtZW50IG11c3QgYmUgYSBSZWFjdCBlbGVtZW50LCBidXQgeW91IHBhc3NlZCAiK2UrIi4iKTt2YXIgcj1HMCh7fSxlLnByb3BzKSxvPWUua2V5LGk9ZS5yZWYsbD1lLl9vd25lcjtpZih0IT1udWxsKXtpZih0LnJlZiE9PXZvaWQgMCYmKGk9dC5yZWYsbD1QcC5jdXJyZW50KSx0LmtleSE9PXZvaWQgMCYmKG89IiIrdC5rZXkpLGUudHlwZSYmZS50eXBlLmRlZmF1bHRQcm9wcyl2YXIgcz1lLnR5cGUuZGVmYXVsdFByb3BzO2ZvcihhIGluIHQpUTAuY2FsbCh0LGEpJiYhSjAuaGFzT3duUHJvcGVydHkoYSkmJihyW2FdPXRbYV09PT12b2lkIDAmJnMhPT12b2lkIDA/c1thXTp0W2FdKX12YXIgYT1hcmd1bWVudHMubGVuZ3RoLTI7aWYoYT09PTEpci5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxhKXtzPUFycmF5KGEpO2Zvcih2YXIgdT0wO3U8YTt1Kyspc1t1XT1hcmd1bWVudHNbdSsyXTtyLmNoaWxkcmVuPXN9cmV0dXJueyQkdHlwZW9mOmthLHR5cGU6ZS50eXBlLGtleTpvLHJlZjppLHByb3BzOnIsX293bmVyOmx9fTtTZS5jcmVhdGVDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBlPXskJHR5cGVvZjpBQyxfY3VycmVudFZhbHVlOmUsX2N1cnJlbnRWYWx1ZTI6ZSxfdGhyZWFkQ291bnQ6MCxQcm92aWRlcjpudWxsLENvbnN1bWVyOm51bGwsX2RlZmF1bHRWYWx1ZTpudWxsLF9nbG9iYWxOYW1lOm51bGx9LGUuUHJvdmlkZXI9eyQkdHlwZW9mOk9DLF9jb250ZXh0OmV9LGUuQ29uc3VtZXI9ZX07U2UuY3JlYXRlRWxlbWVudD1aMDtTZS5jcmVhdGVGYWN0b3J5PWZ1bmN0aW9uKGUpe3ZhciB0PVowLmJpbmQobnVsbCxlKTtyZXR1cm4gdC50eXBlPWUsdH07U2UuY3JlYXRlUmVmPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19O1NlLmZvcndhcmRSZWY9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOk1DLHJlbmRlcjplfX07U2UuaXNWYWxpZEVsZW1lbnQ9T3A7U2UubGF6eT1mdW5jdGlvbihlKXtyZXR1cm57JCR0eXBlb2Y6SUMsX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDplfSxfaW5pdDpCQ319O1NlLm1lbW89ZnVuY3Rpb24oZSx0KXtyZXR1cm57JCR0eXBlb2Y6TEMsdHlwZTplLGNvbXBhcmU6dD09PXZvaWQgMD9udWxsOnR9fTtTZS5zdGFydFRyYW5zaXRpb249ZnVuY3Rpb24oZSl7dmFyIHQ9RXUudHJhbnNpdGlvbjtFdS50cmFuc2l0aW9uPXt9O3RyeXtlKCl9ZmluYWxseXtFdS50cmFuc2l0aW9uPXR9fTtTZS51bnN0YWJsZV9hY3Q9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiYWN0KC4uLikgaXMgbm90IHN1cHBvcnRlZCBpbiBwcm9kdWN0aW9uIGJ1aWxkcyBvZiBSZWFjdC4iKX07U2UudXNlQ2FsbGJhY2s9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcm4uY3VycmVudC51c2VDYWxsYmFjayhlLHQpfTtTZS51c2VDb250ZXh0PWZ1bmN0aW9uKGUpe3JldHVybiBybi5jdXJyZW50LnVzZUNvbnRleHQoZSl9O1NlLnVzZURlYnVnVmFsdWU9ZnVuY3Rpb24oKXt9O1NlLnVzZURlZmVycmVkVmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIHJuLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZShlKX07U2UudXNlRWZmZWN0PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHJuLmN1cnJlbnQudXNlRWZmZWN0KGUsdCl9O1NlLnVzZUlkPWZ1bmN0aW9uKCl7cmV0dXJuIHJuLmN1cnJlbnQudXNlSWQoKX07U2UudXNlSW1wZXJhdGl2ZUhhbmRsZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHJuLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZShlLHQsbil9O1NlLnVzZUluc2VydGlvbkVmZmVjdD1mdW5jdGlvbihlLHQpe3JldHVybiBybi5jdXJyZW50LnVzZUluc2VydGlvbkVmZmVjdChlLHQpfTtTZS51c2VMYXlvdXRFZmZlY3Q9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcm4uY3VycmVudC51c2VMYXlvdXRFZmZlY3QoZSx0KX07U2UudXNlTWVtbz1mdW5jdGlvbihlLHQpe3JldHVybiBybi5jdXJyZW50LnVzZU1lbW8oZSx0KX07U2UudXNlUmVkdWNlcj1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHJuLmN1cnJlbnQudXNlUmVkdWNlcihlLHQsbil9O1NlLnVzZVJlZj1mdW5jdGlvbihlKXtyZXR1cm4gcm4uY3VycmVudC51c2VSZWYoZSl9O1NlLnVzZVN0YXRlPWZ1bmN0aW9uKGUpe3JldHVybiBybi5jdXJyZW50LnVzZVN0YXRlKGUpfTtTZS51c2VTeW5jRXh0ZXJuYWxTdG9yZT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIHJuLmN1cnJlbnQudXNlU3luY0V4dGVybmFsU3RvcmUoZSx0LG4pfTtTZS51c2VUcmFuc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHJuLmN1cnJlbnQudXNlVHJhbnNpdGlvbigpfTtTZS52ZXJzaW9uPSIxOC4yLjAiO0gwLmV4cG9ydHM9U2U7dmFyIHA9SDAuZXhwb3J0cztjb25zdCBxPSRhKHApLHEwPVRDKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0OnF9LFtwXSk7dmFyIERmPXt9LGUxPXtleHBvcnRzOnt9fSxUbj17fSx0MT17ZXhwb3J0czp7fX0sbjE9e307LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHNjaGVkdWxlci5wcm9kdWN0aW9uLm1pbi5qcwogKgogKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovKGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoayxJKXt2YXIgTD1rLmxlbmd0aDtrLnB1c2goSSk7ZTpmb3IoOzA8TDspe3ZhciBWPUwtMT4+PjEsdGU9a1tWXTtpZigwPG8odGUsSSkpa1tWXT1JLGtbTF09dGUsTD1WO2Vsc2UgYnJlYWsgZX19ZnVuY3Rpb24gbihrKXtyZXR1cm4gay5sZW5ndGg9PT0wP251bGw6a1swXX1mdW5jdGlvbiByKGspe2lmKGsubGVuZ3RoPT09MClyZXR1cm4gbnVsbDt2YXIgST1rWzBdLEw9ay5wb3AoKTtpZihMIT09SSl7a1swXT1MO2U6Zm9yKHZhciBWPTAsdGU9ay5sZW5ndGgseWU9dGU+Pj4xO1Y8eWU7KXt2YXIgZmU9MiooVisxKS0xLE9lPWtbZmVdLGJlPWZlKzEsWj1rW2JlXTtpZigwPm8oT2UsTCkpYmU8dGUmJjA+byhaLE9lKT8oa1tWXT1aLGtbYmVdPUwsVj1iZSk6KGtbVl09T2Usa1tmZV09TCxWPWZlKTtlbHNlIGlmKGJlPHRlJiYwPm8oWixMKSlrW1ZdPVosa1tiZV09TCxWPWJlO2Vsc2UgYnJlYWsgZX19cmV0dXJuIEl9ZnVuY3Rpb24gbyhrLEkpe3ZhciBMPWsuc29ydEluZGV4LUkuc29ydEluZGV4O3JldHVybiBMIT09MD9MOmsuaWQtSS5pZH1pZih0eXBlb2YgcGVyZm9ybWFuY2U9PSJvYmplY3QiJiZ0eXBlb2YgcGVyZm9ybWFuY2Uubm93PT0iZnVuY3Rpb24iKXt2YXIgaT1wZXJmb3JtYW5jZTtlLnVuc3RhYmxlX25vdz1mdW5jdGlvbigpe3JldHVybiBpLm5vdygpfX1lbHNle3ZhciBsPURhdGUscz1sLm5vdygpO2UudW5zdGFibGVfbm93PWZ1bmN0aW9uKCl7cmV0dXJuIGwubm93KCktc319dmFyIGE9W10sdT1bXSxjPTEsZD1udWxsLGY9MyxoPSExLGc9ITEsbT0hMSxTPXR5cGVvZiBzZXRUaW1lb3V0PT0iZnVuY3Rpb24iP3NldFRpbWVvdXQ6bnVsbCx2PXR5cGVvZiBjbGVhclRpbWVvdXQ9PSJmdW5jdGlvbiI/Y2xlYXJUaW1lb3V0Om51bGwseT10eXBlb2Ygc2V0SW1tZWRpYXRlPCJ1Ij9zZXRJbW1lZGlhdGU6bnVsbDt0eXBlb2YgbmF2aWdhdG9yPCJ1IiYmbmF2aWdhdG9yLnNjaGVkdWxpbmchPT12b2lkIDAmJm5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nIT09dm9pZCAwJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKTtmdW5jdGlvbiB4KGspe2Zvcih2YXIgST1uKHUpO0khPT1udWxsOyl7aWYoSS5jYWxsYmFjaz09PW51bGwpcih1KTtlbHNlIGlmKEkuc3RhcnRUaW1lPD1rKXIodSksSS5zb3J0SW5kZXg9SS5leHBpcmF0aW9uVGltZSx0KGEsSSk7ZWxzZSBicmVhaztJPW4odSl9fWZ1bmN0aW9uIF8oayl7aWYobT0hMSx4KGspLCFnKWlmKG4oYSkhPT1udWxsKWc9ITAsUChFKTtlbHNle3ZhciBJPW4odSk7SSE9PW51bGwmJk8oXyxJLnN0YXJ0VGltZS1rKX19ZnVuY3Rpb24gRShrLEkpe2c9ITEsbSYmKG09ITEsdihUKSxUPS0xKSxoPSEwO3ZhciBMPWY7dHJ5e2Zvcih4KEkpLGQ9bihhKTtkIT09bnVsbCYmKCEoZC5leHBpcmF0aW9uVGltZT5JKXx8ayYmIWooKSk7KXt2YXIgVj1kLmNhbGxiYWNrO2lmKHR5cGVvZiBWPT0iZnVuY3Rpb24iKXtkLmNhbGxiYWNrPW51bGwsZj1kLnByaW9yaXR5TGV2ZWw7dmFyIHRlPVYoZC5leHBpcmF0aW9uVGltZTw9SSk7ST1lLnVuc3RhYmxlX25vdygpLHR5cGVvZiB0ZT09ImZ1bmN0aW9uIj9kLmNhbGxiYWNrPXRlOmQ9PT1uKGEpJiZyKGEpLHgoSSl9ZWxzZSByKGEpO2Q9bihhKX1pZihkIT09bnVsbCl2YXIgeWU9ITA7ZWxzZXt2YXIgZmU9bih1KTtmZSE9PW51bGwmJk8oXyxmZS5zdGFydFRpbWUtSSkseWU9ITF9cmV0dXJuIHllfWZpbmFsbHl7ZD1udWxsLGY9TCxoPSExfX12YXIgJD0hMSxDPW51bGwsVD0tMSxNPTUsUj0tMTtmdW5jdGlvbiBqKCl7cmV0dXJuIShlLnVuc3RhYmxlX25vdygpLVI8TSl9ZnVuY3Rpb24gRigpe2lmKEMhPT1udWxsKXt2YXIgaz1lLnVuc3RhYmxlX25vdygpO1I9azt2YXIgST0hMDt0cnl7ST1DKCEwLGspfWZpbmFsbHl7ST9hZSgpOigkPSExLEM9bnVsbCl9fWVsc2UgJD0hMX12YXIgYWU7aWYodHlwZW9mIHk9PSJmdW5jdGlvbiIpYWU9ZnVuY3Rpb24oKXt5KEYpfTtlbHNlIGlmKHR5cGVvZiBNZXNzYWdlQ2hhbm5lbDwidSIpe3ZhciBIPW5ldyBNZXNzYWdlQ2hhbm5lbCxYPUgucG9ydDI7SC5wb3J0MS5vbm1lc3NhZ2U9RixhZT1mdW5jdGlvbigpe1gucG9zdE1lc3NhZ2UobnVsbCl9fWVsc2UgYWU9ZnVuY3Rpb24oKXtTKEYsMCl9O2Z1bmN0aW9uIFAoayl7Qz1rLCR8fCgkPSEwLGFlKCkpfWZ1bmN0aW9uIE8oayxJKXtUPVMoZnVuY3Rpb24oKXtrKGUudW5zdGFibGVfbm93KCkpfSxJKX1lLnVuc3RhYmxlX0lkbGVQcmlvcml0eT01LGUudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHk9MSxlLnVuc3RhYmxlX0xvd1ByaW9yaXR5PTQsZS51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eT0zLGUudW5zdGFibGVfUHJvZmlsaW5nPW51bGwsZS51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eT0yLGUudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24oayl7ay5jYWxsYmFjaz1udWxsfSxlLnVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uPWZ1bmN0aW9uKCl7Z3x8aHx8KGc9ITAsUChFKSl9LGUudW5zdGFibGVfZm9yY2VGcmFtZVJhdGU9ZnVuY3Rpb24oayl7MD5rfHwxMjU8az9jb25zb2xlLmVycm9yKCJmb3JjZUZyYW1lUmF0ZSB0YWtlcyBhIHBvc2l0aXZlIGludCBiZXR3ZWVuIDAgYW5kIDEyNSwgZm9yY2luZyBmcmFtZSByYXRlcyBoaWdoZXIgdGhhbiAxMjUgZnBzIGlzIG5vdCBzdXBwb3J0ZWQiKTpNPTA8az9NYXRoLmZsb29yKDFlMy9rKTo1fSxlLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsPWZ1bmN0aW9uKCl7cmV0dXJuIGZ9LGUudW5zdGFibGVfZ2V0Rmlyc3RDYWxsYmFja05vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gbihhKX0sZS51bnN0YWJsZV9uZXh0PWZ1bmN0aW9uKGspe3N3aXRjaChmKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgST0zO2JyZWFrO2RlZmF1bHQ6ST1mfXZhciBMPWY7Zj1JO3RyeXtyZXR1cm4gaygpfWZpbmFsbHl7Zj1MfX0sZS51bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbj1mdW5jdGlvbigpe30sZS51bnN0YWJsZV9yZXF1ZXN0UGFpbnQ9ZnVuY3Rpb24oKXt9LGUudW5zdGFibGVfcnVuV2l0aFByaW9yaXR5PWZ1bmN0aW9uKGssSSl7c3dpdGNoKGspe2Nhc2UgMTpjYXNlIDI6Y2FzZSAzOmNhc2UgNDpjYXNlIDU6YnJlYWs7ZGVmYXVsdDprPTN9dmFyIEw9ZjtmPWs7dHJ5e3JldHVybiBJKCl9ZmluYWxseXtmPUx9fSxlLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2s9ZnVuY3Rpb24oayxJLEwpe3ZhciBWPWUudW5zdGFibGVfbm93KCk7c3dpdGNoKHR5cGVvZiBMPT0ib2JqZWN0IiYmTCE9PW51bGw/KEw9TC5kZWxheSxMPXR5cGVvZiBMPT0ibnVtYmVyIiYmMDxMP1YrTDpWKTpMPVYsayl7Y2FzZSAxOnZhciB0ZT0tMTticmVhaztjYXNlIDI6dGU9MjUwO2JyZWFrO2Nhc2UgNTp0ZT0xMDczNzQxODIzO2JyZWFrO2Nhc2UgNDp0ZT0xZTQ7YnJlYWs7ZGVmYXVsdDp0ZT01ZTN9cmV0dXJuIHRlPUwrdGUsaz17aWQ6YysrLGNhbGxiYWNrOkkscHJpb3JpdHlMZXZlbDprLHN0YXJ0VGltZTpMLGV4cGlyYXRpb25UaW1lOnRlLHNvcnRJbmRleDotMX0sTD5WPyhrLnNvcnRJbmRleD1MLHQodSxrKSxuKGEpPT09bnVsbCYmaz09PW4odSkmJihtPyh2KFQpLFQ9LTEpOm09ITAsTyhfLEwtVikpKTooay5zb3J0SW5kZXg9dGUsdChhLGspLGd8fGh8fChnPSEwLFAoRSkpKSxrfSxlLnVuc3RhYmxlX3Nob3VsZFlpZWxkPWosZS51bnN0YWJsZV93cmFwQ2FsbGJhY2s9ZnVuY3Rpb24oayl7dmFyIEk9ZjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgTD1mO2Y9STt0cnl7cmV0dXJuIGsuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZpbmFsbHl7Zj1MfX19fSkobjEpO3QxLmV4cG9ydHM9bjE7dmFyIFVDPXQxLmV4cG9ydHM7LyoqCiAqIEBsaWNlbnNlIFJlYWN0CiAqIHJlYWN0LWRvbS5wcm9kdWN0aW9uLm1pbi5qcwogKgogKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4KICovdmFyIHIxPXAsQ249VUM7ZnVuY3Rpb24gVyhlKXtmb3IodmFyIHQ9Imh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9lcnJvci1kZWNvZGVyLmh0bWw/aW52YXJpYW50PSIrZSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0Kz0iJmFyZ3NbXT0iK2VuY29kZVVSSUNvbXBvbmVudChhcmd1bWVudHNbbl0pO3JldHVybiJNaW5pZmllZCBSZWFjdCBlcnJvciAjIitlKyI7IHZpc2l0ICIrdCsiIGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy4ifXZhciBvMT1uZXcgU2V0LEtzPXt9O2Z1bmN0aW9uIHlpKGUsdCl7Z2woZSx0KSxnbChlKyJDYXB0dXJlIix0KX1mdW5jdGlvbiBnbChlLHQpe2ZvcihLc1tlXT10LGU9MDtlPHQubGVuZ3RoO2UrKylvMS5hZGQodFtlXSl9dmFyIElyPSEodHlwZW9mIHdpbmRvdz4idSJ8fHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ+InUifHx0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ+InUiKSxMZj1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFZDPS9eWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRdWzpBLVpfYS16XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMkZGXHUwMzcwLVx1MDM3RFx1MDM3Ri1cdTFGRkZcdTIwMEMtXHUyMDBEXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkRcLS4wLTlcdTAwQjdcdTAzMDAtXHUwMzZGXHUyMDNGLVx1MjA0MF0qJC8sVW09e30sVm09e307ZnVuY3Rpb24gSEMoZSl7cmV0dXJuIExmLmNhbGwoVm0sZSk/ITA6TGYuY2FsbChVbSxlKT8hMTpWQy50ZXN0KGUpP1ZtW2VdPSEwOihVbVtlXT0hMCwhMSl9ZnVuY3Rpb24gS0MoZSx0LG4scil7aWYobiE9PW51bGwmJm4udHlwZT09PTApcmV0dXJuITE7c3dpdGNoKHR5cGVvZiB0KXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6cmV0dXJuITA7Y2FzZSJib29sZWFuIjpyZXR1cm4gcj8hMTpuIT09bnVsbD8hbi5hY2NlcHRzQm9vbGVhbnM6KGU9ZS50b0xvd2VyQ2FzZSgpLnNsaWNlKDAsNSksZSE9PSJkYXRhLSImJmUhPT0iYXJpYS0iKTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBHQyhlLHQsbixyKXtpZih0PT09bnVsbHx8dHlwZW9mIHQ+InUifHxLQyhlLHQsbixyKSlyZXR1cm4hMDtpZihyKXJldHVybiExO2lmKG4hPT1udWxsKXN3aXRjaChuLnR5cGUpe2Nhc2UgMzpyZXR1cm4hdDtjYXNlIDQ6cmV0dXJuIHQ9PT0hMTtjYXNlIDU6cmV0dXJuIGlzTmFOKHQpO2Nhc2UgNjpyZXR1cm4gaXNOYU4odCl8fDE+dH1yZXR1cm4hMX1mdW5jdGlvbiBvbihlLHQsbixyLG8saSxsKXt0aGlzLmFjY2VwdHNCb29sZWFucz10PT09Mnx8dD09PTN8fHQ9PT00LHRoaXMuYXR0cmlidXRlTmFtZT1yLHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlPW8sdGhpcy5tdXN0VXNlUHJvcGVydHk9bix0aGlzLnByb3BlcnR5TmFtZT1lLHRoaXMudHlwZT10LHRoaXMuc2FuaXRpemVVUkw9aSx0aGlzLnJlbW92ZUVtcHR5U3RyaW5nPWx9dmFyIEx0PXt9OyJjaGlsZHJlbiBkYW5nZXJvdXNseVNldElubmVySFRNTCBkZWZhdWx0VmFsdWUgZGVmYXVsdENoZWNrZWQgaW5uZXJIVE1MIHN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyBzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcgc3R5bGUiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXtMdFtlXT1uZXcgb24oZSwwLCExLGUsbnVsbCwhMSwhMSl9KTtbWyJhY2NlcHRDaGFyc2V0IiwiYWNjZXB0LWNoYXJzZXQiXSxbImNsYXNzTmFtZSIsImNsYXNzIl0sWyJodG1sRm9yIiwiZm9yIl0sWyJodHRwRXF1aXYiLCJodHRwLWVxdWl2Il1dLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtMdFt0XT1uZXcgb24odCwxLCExLGVbMV0sbnVsbCwhMSwhMSl9KTtbImNvbnRlbnRFZGl0YWJsZSIsImRyYWdnYWJsZSIsInNwZWxsQ2hlY2siLCJ2YWx1ZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7THRbZV09bmV3IG9uKGUsMiwhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtbImF1dG9SZXZlcnNlIiwiZXh0ZXJuYWxSZXNvdXJjZXNSZXF1aXJlZCIsImZvY3VzYWJsZSIsInByZXNlcnZlQWxwaGEiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDIsITEsZSxudWxsLCExLCExKX0pOyJhbGxvd0Z1bGxTY3JlZW4gYXN5bmMgYXV0b0ZvY3VzIGF1dG9QbGF5IGNvbnRyb2xzIGRlZmF1bHQgZGVmZXIgZGlzYWJsZWQgZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgZGlzYWJsZVJlbW90ZVBsYXliYWNrIGZvcm1Ob1ZhbGlkYXRlIGhpZGRlbiBsb29wIG5vTW9kdWxlIG5vVmFsaWRhdGUgb3BlbiBwbGF5c0lubGluZSByZWFkT25seSByZXF1aXJlZCByZXZlcnNlZCBzY29wZWQgc2VhbWxlc3MgaXRlbVNjb3BlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7THRbZV09bmV3IG9uKGUsMywhMSxlLnRvTG93ZXJDYXNlKCksbnVsbCwhMSwhMSl9KTtbImNoZWNrZWQiLCJtdWx0aXBsZSIsIm11dGVkIiwic2VsZWN0ZWQiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDMsITAsZSxudWxsLCExLCExKX0pO1siY2FwdHVyZSIsImRvd25sb2FkIl0uZm9yRWFjaChmdW5jdGlvbihlKXtMdFtlXT1uZXcgb24oZSw0LCExLGUsbnVsbCwhMSwhMSl9KTtbImNvbHMiLCJyb3dzIiwic2l6ZSIsInNwYW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDYsITEsZSxudWxsLCExLCExKX0pO1sicm93U3BhbiIsInN0YXJ0Il0uZm9yRWFjaChmdW5jdGlvbihlKXtMdFtlXT1uZXcgb24oZSw1LCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pO3ZhciBBcD0vW1wtOl0oW2Etel0pL2c7ZnVuY3Rpb24gTXAoZSl7cmV0dXJuIGVbMV0udG9VcHBlckNhc2UoKX0iYWNjZW50LWhlaWdodCBhbGlnbm1lbnQtYmFzZWxpbmUgYXJhYmljLWZvcm0gYmFzZWxpbmUtc2hpZnQgY2FwLWhlaWdodCBjbGlwLXBhdGggY2xpcC1ydWxlIGNvbG9yLWludGVycG9sYXRpb24gY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIGNvbG9yLXByb2ZpbGUgY29sb3ItcmVuZGVyaW5nIGRvbWluYW50LWJhc2VsaW5lIGVuYWJsZS1iYWNrZ3JvdW5kIGZpbGwtb3BhY2l0eSBmaWxsLXJ1bGUgZmxvb2QtY29sb3IgZmxvb2Qtb3BhY2l0eSBmb250LWZhbWlseSBmb250LXNpemUgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXZhcmlhbnQgZm9udC13ZWlnaHQgZ2x5cGgtbmFtZSBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIGhvcml6LWFkdi14IGhvcml6LW9yaWdpbi14IGltYWdlLXJlbmRlcmluZyBsZXR0ZXItc3BhY2luZyBsaWdodGluZy1jb2xvciBtYXJrZXItZW5kIG1hcmtlci1taWQgbWFya2VyLXN0YXJ0IG92ZXJsaW5lLXBvc2l0aW9uIG92ZXJsaW5lLXRoaWNrbmVzcyBwYWludC1vcmRlciBwYW5vc2UtMSBwb2ludGVyLWV2ZW50cyByZW5kZXJpbmctaW50ZW50IHNoYXBlLXJlbmRlcmluZyBzdG9wLWNvbG9yIHN0b3Atb3BhY2l0eSBzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIHN0cm9rZS1kYXNoYXJyYXkgc3Ryb2tlLWRhc2hvZmZzZXQgc3Ryb2tlLWxpbmVjYXAgc3Ryb2tlLWxpbmVqb2luIHN0cm9rZS1taXRlcmxpbWl0IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCB0ZXh0LWFuY2hvciB0ZXh0LWRlY29yYXRpb24gdGV4dC1yZW5kZXJpbmcgdW5kZXJsaW5lLXBvc2l0aW9uIHVuZGVybGluZS10aGlja25lc3MgdW5pY29kZS1iaWRpIHVuaWNvZGUtcmFuZ2UgdW5pdHMtcGVyLWVtIHYtYWxwaGFiZXRpYyB2LWhhbmdpbmcgdi1pZGVvZ3JhcGhpYyB2LW1hdGhlbWF0aWNhbCB2ZWN0b3ItZWZmZWN0IHZlcnQtYWR2LXkgdmVydC1vcmlnaW4teCB2ZXJ0LW9yaWdpbi15IHdvcmQtc3BhY2luZyB3cml0aW5nLW1vZGUgeG1sbnM6eGxpbmsgeC1oZWlnaHQiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoQXAsTXApO0x0W3RdPW5ldyBvbih0LDEsITEsZSxudWxsLCExLCExKX0pOyJ4bGluazphY3R1YXRlIHhsaW5rOmFyY3JvbGUgeGxpbms6cm9sZSB4bGluazpzaG93IHhsaW5rOnRpdGxlIHhsaW5rOnR5cGUiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoQXAsTXApO0x0W3RdPW5ldyBvbih0LDEsITEsZSwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsITEsITEpfSk7WyJ4bWw6YmFzZSIsInhtbDpsYW5nIiwieG1sOnNwYWNlIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoQXAsTXApO0x0W3RdPW5ldyBvbih0LDEsITEsZSwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwhMSwhMSl9KTtbInRhYkluZGV4IiwiY3Jvc3NPcmlnaW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDEsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7THQueGxpbmtIcmVmPW5ldyBvbigieGxpbmtIcmVmIiwxLCExLCJ4bGluazpocmVmIiwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsITAsITEpO1sic3JjIiwiaHJlZiIsImFjdGlvbiIsImZvcm1BY3Rpb24iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0x0W2VdPW5ldyBvbihlLDEsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITAsITApfSk7ZnVuY3Rpb24gRHAoZSx0LG4scil7dmFyIG89THQuaGFzT3duUHJvcGVydHkodCk/THRbdF06bnVsbDsobyE9PW51bGw/by50eXBlIT09MDpyfHwhKDI8dC5sZW5ndGgpfHx0WzBdIT09Im8iJiZ0WzBdIT09Ik8ifHx0WzFdIT09Im4iJiZ0WzFdIT09Ik4iKSYmKEdDKHQsbixvLHIpJiYobj1udWxsKSxyfHxvPT09bnVsbD9IQyh0KSYmKG49PT1udWxsP2UucmVtb3ZlQXR0cmlidXRlKHQpOmUuc2V0QXR0cmlidXRlKHQsIiIrbikpOm8ubXVzdFVzZVByb3BlcnR5P2Vbby5wcm9wZXJ0eU5hbWVdPW49PT1udWxsP28udHlwZT09PTM/ITE6IiI6bjoodD1vLmF0dHJpYnV0ZU5hbWUscj1vLmF0dHJpYnV0ZU5hbWVzcGFjZSxuPT09bnVsbD9lLnJlbW92ZUF0dHJpYnV0ZSh0KToobz1vLnR5cGUsbj1vPT09M3x8bz09PTQmJm49PT0hMD8iIjoiIituLHI/ZS5zZXRBdHRyaWJ1dGVOUyhyLHQsbik6ZS5zZXRBdHRyaWJ1dGUodCxuKSkpKX12YXIgVnI9cjEuX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQsR2E9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLFdpPVN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpLFVpPVN5bWJvbC5mb3IoInJlYWN0LmZyYWdtZW50IiksTHA9U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSxJZj1TeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLGkxPVN5bWJvbC5mb3IoInJlYWN0LnByb3ZpZGVyIiksbDE9U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLElwPVN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIiksamY9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2UiKSx6Zj1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZV9saXN0IiksanA9U3ltYm9sLmZvcigicmVhY3QubWVtbyIpLGxvPVN5bWJvbC5mb3IoInJlYWN0LmxhenkiKSxzMT1TeW1ib2wuZm9yKCJyZWFjdC5vZmZzY3JlZW4iKSxIbT1TeW1ib2wuaXRlcmF0b3I7ZnVuY3Rpb24gcWwoZSl7cmV0dXJuIGU9PT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCI/bnVsbDooZT1IbSYmZVtIbV18fGVbIkBAaXRlcmF0b3IiXSx0eXBlb2YgZT09ImZ1bmN0aW9uIj9lOm51bGwpfXZhciB0dD1PYmplY3QuYXNzaWduLHpkO2Z1bmN0aW9uIHBzKGUpe2lmKHpkPT09dm9pZCAwKXRyeXt0aHJvdyBFcnJvcigpfWNhdGNoKG4pe3ZhciB0PW4uc3RhY2sudHJpbSgpLm1hdGNoKC9cbiggKihhdCApPykvKTt6ZD10JiZ0WzFdfHwiIn1yZXR1cm5gCmAremQrZX12YXIgRmQ9ITE7ZnVuY3Rpb24gQmQoZSx0KXtpZighZXx8RmQpcmV0dXJuIiI7RmQ9ITA7dmFyIG49RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9dm9pZCAwO3RyeXtpZih0KWlmKHQ9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigpfSxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsInByb3BzIix7c2V0OmZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX19KSx0eXBlb2YgUmVmbGVjdD09Im9iamVjdCImJlJlZmxlY3QuY29uc3RydWN0KXt0cnl7UmVmbGVjdC5jb25zdHJ1Y3QodCxbXSl9Y2F0Y2godSl7dmFyIHI9dX1SZWZsZWN0LmNvbnN0cnVjdChlLFtdLHQpfWVsc2V7dHJ5e3QuY2FsbCgpfWNhdGNoKHUpe3I9dX1lLmNhbGwodC5wcm90b3R5cGUpfWVsc2V7dHJ5e3Rocm93IEVycm9yKCl9Y2F0Y2godSl7cj11fWUoKX19Y2F0Y2godSl7aWYodSYmciYmdHlwZW9mIHUuc3RhY2s9PSJzdHJpbmciKXtmb3IodmFyIG89dS5zdGFjay5zcGxpdChgCmApLGk9ci5zdGFjay5zcGxpdChgCmApLGw9by5sZW5ndGgtMSxzPWkubGVuZ3RoLTE7MTw9bCYmMDw9cyYmb1tsXSE9PWlbc107KXMtLTtmb3IoOzE8PWwmJjA8PXM7bC0tLHMtLSlpZihvW2xdIT09aVtzXSl7aWYobCE9PTF8fHMhPT0xKWRvIGlmKGwtLSxzLS0sMD5zfHxvW2xdIT09aVtzXSl7dmFyIGE9YApgK29bbF0ucmVwbGFjZSgiIGF0IG5ldyAiLCIgYXQgIik7cmV0dXJuIGUuZGlzcGxheU5hbWUmJmEuaW5jbHVkZXMoIjxhbm9ueW1vdXM+IikmJihhPWEucmVwbGFjZSgiPGFub255bW91cz4iLGUuZGlzcGxheU5hbWUpKSxhfXdoaWxlKDE8PWwmJjA8PXMpO2JyZWFrfX19ZmluYWxseXtGZD0hMSxFcnJvci5wcmVwYXJlU3RhY2tUcmFjZT1ufXJldHVybihlPWU/ZS5kaXNwbGF5TmFtZXx8ZS5uYW1lOiIiKT9wcyhlKToiIn1mdW5jdGlvbiBZQyhlKXtzd2l0Y2goZS50YWcpe2Nhc2UgNTpyZXR1cm4gcHMoZS50eXBlKTtjYXNlIDE2OnJldHVybiBwcygiTGF6eSIpO2Nhc2UgMTM6cmV0dXJuIHBzKCJTdXNwZW5zZSIpO2Nhc2UgMTk6cmV0dXJuIHBzKCJTdXNwZW5zZUxpc3QiKTtjYXNlIDA6Y2FzZSAyOmNhc2UgMTU6cmV0dXJuIGU9QmQoZS50eXBlLCExKSxlO2Nhc2UgMTE6cmV0dXJuIGU9QmQoZS50eXBlLnJlbmRlciwhMSksZTtjYXNlIDE6cmV0dXJuIGU9QmQoZS50eXBlLCEwKSxlO2RlZmF1bHQ6cmV0dXJuIiJ9fWZ1bmN0aW9uIEZmKGUpe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYodHlwZW9mIGU9PSJmdW5jdGlvbiIpcmV0dXJuIGUuZGlzcGxheU5hbWV8fGUubmFtZXx8bnVsbDtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIGU7c3dpdGNoKGUpe2Nhc2UgVWk6cmV0dXJuIkZyYWdtZW50IjtjYXNlIFdpOnJldHVybiJQb3J0YWwiO2Nhc2UgSWY6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIExwOnJldHVybiJTdHJpY3RNb2RlIjtjYXNlIGpmOnJldHVybiJTdXNwZW5zZSI7Y2FzZSB6ZjpyZXR1cm4iU3VzcGVuc2VMaXN0In1pZih0eXBlb2YgZT09Im9iamVjdCIpc3dpdGNoKGUuJCR0eXBlb2Ype2Nhc2UgbDE6cmV0dXJuKGUuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Db25zdW1lciI7Y2FzZSBpMTpyZXR1cm4oZS5fY29udGV4dC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLlByb3ZpZGVyIjtjYXNlIElwOnZhciB0PWUucmVuZGVyO3JldHVybiBlPWUuZGlzcGxheU5hbWUsZXx8KGU9dC5kaXNwbGF5TmFtZXx8dC5uYW1lfHwiIixlPWUhPT0iIj8iRm9yd2FyZFJlZigiK2UrIikiOiJGb3J3YXJkUmVmIiksZTtjYXNlIGpwOnJldHVybiB0PWUuZGlzcGxheU5hbWV8fG51bGwsdCE9PW51bGw/dDpGZihlLnR5cGUpfHwiTWVtbyI7Y2FzZSBsbzp0PWUuX3BheWxvYWQsZT1lLl9pbml0O3RyeXtyZXR1cm4gRmYoZSh0KSl9Y2F0Y2h7fX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBYQyhlKXt2YXIgdD1lLnR5cGU7c3dpdGNoKGUudGFnKXtjYXNlIDI0OnJldHVybiJDYWNoZSI7Y2FzZSA5OnJldHVybih0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuQ29uc3VtZXIiO2Nhc2UgMTA6cmV0dXJuKHQuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSAxODpyZXR1cm4iRGVoeWRyYXRlZEZyYWdtZW50IjtjYXNlIDExOnJldHVybiBlPXQucmVuZGVyLGU9ZS5kaXNwbGF5TmFtZXx8ZS5uYW1lfHwiIix0LmRpc3BsYXlOYW1lfHwoZSE9PSIiPyJGb3J3YXJkUmVmKCIrZSsiKSI6IkZvcndhcmRSZWYiKTtjYXNlIDc6cmV0dXJuIkZyYWdtZW50IjtjYXNlIDU6cmV0dXJuIHQ7Y2FzZSA0OnJldHVybiJQb3J0YWwiO2Nhc2UgMzpyZXR1cm4iUm9vdCI7Y2FzZSA2OnJldHVybiJUZXh0IjtjYXNlIDE2OnJldHVybiBGZih0KTtjYXNlIDg6cmV0dXJuIHQ9PT1McD8iU3RyaWN0TW9kZSI6Ik1vZGUiO2Nhc2UgMjI6cmV0dXJuIk9mZnNjcmVlbiI7Y2FzZSAxMjpyZXR1cm4iUHJvZmlsZXIiO2Nhc2UgMjE6cmV0dXJuIlNjb3BlIjtjYXNlIDEzOnJldHVybiJTdXNwZW5zZSI7Y2FzZSAxOTpyZXR1cm4iU3VzcGVuc2VMaXN0IjtjYXNlIDI1OnJldHVybiJUcmFjaW5nTWFya2VyIjtjYXNlIDE6Y2FzZSAwOmNhc2UgMTc6Y2FzZSAyOmNhc2UgMTQ6Y2FzZSAxNTppZih0eXBlb2YgdD09ImZ1bmN0aW9uIilyZXR1cm4gdC5kaXNwbGF5TmFtZXx8dC5uYW1lfHxudWxsO2lmKHR5cGVvZiB0PT0ic3RyaW5nIilyZXR1cm4gdH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBUbyhlKXtzd2l0Y2godHlwZW9mIGUpe2Nhc2UiYm9vbGVhbiI6Y2FzZSJudW1iZXIiOmNhc2Uic3RyaW5nIjpjYXNlInVuZGVmaW5lZCI6cmV0dXJuIGU7Y2FzZSJvYmplY3QiOnJldHVybiBlO2RlZmF1bHQ6cmV0dXJuIiJ9fWZ1bmN0aW9uIGExKGUpe3ZhciB0PWUudHlwZTtyZXR1cm4oZT1lLm5vZGVOYW1lKSYmZS50b0xvd2VyQ2FzZSgpPT09ImlucHV0IiYmKHQ9PT0iY2hlY2tib3gifHx0PT09InJhZGlvIil9ZnVuY3Rpb24gUUMoZSl7dmFyIHQ9YTEoZSk/ImNoZWNrZWQiOiJ2YWx1ZSIsbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUuY29uc3RydWN0b3IucHJvdG90eXBlLHQpLHI9IiIrZVt0XTtpZighZS5oYXNPd25Qcm9wZXJ0eSh0KSYmdHlwZW9mIG48InUiJiZ0eXBlb2Ygbi5nZXQ9PSJmdW5jdGlvbiImJnR5cGVvZiBuLnNldD09ImZ1bmN0aW9uIil7dmFyIG89bi5nZXQsaT1uLnNldDtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Y29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBvLmNhbGwodGhpcyl9LHNldDpmdW5jdGlvbihsKXtyPSIiK2wsaS5jYWxsKHRoaXMsbCl9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7ZW51bWVyYWJsZTpuLmVudW1lcmFibGV9KSx7Z2V0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sc2V0VmFsdWU6ZnVuY3Rpb24obCl7cj0iIitsfSxzdG9wVHJhY2tpbmc6ZnVuY3Rpb24oKXtlLl92YWx1ZVRyYWNrZXI9bnVsbCxkZWxldGUgZVt0XX19fX1mdW5jdGlvbiBZYShlKXtlLl92YWx1ZVRyYWNrZXJ8fChlLl92YWx1ZVRyYWNrZXI9UUMoZSkpfWZ1bmN0aW9uIHUxKGUpe2lmKCFlKXJldHVybiExO3ZhciB0PWUuX3ZhbHVlVHJhY2tlcjtpZighdClyZXR1cm4hMDt2YXIgbj10LmdldFZhbHVlKCkscj0iIjtyZXR1cm4gZSYmKHI9YTEoZSk/ZS5jaGVja2VkPyJ0cnVlIjoiZmFsc2UiOmUudmFsdWUpLGU9cixlIT09bj8odC5zZXRWYWx1ZShlKSwhMCk6ITF9ZnVuY3Rpb24gV3UoZSl7aWYoZT1lfHwodHlwZW9mIGRvY3VtZW50PCJ1Ij9kb2N1bWVudDp2b2lkIDApLHR5cGVvZiBlPiJ1IilyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGUuYWN0aXZlRWxlbWVudHx8ZS5ib2R5fWNhdGNoe3JldHVybiBlLmJvZHl9fWZ1bmN0aW9uIEJmKGUsdCl7dmFyIG49dC5jaGVja2VkO3JldHVybiB0dCh7fSx0LHtkZWZhdWx0Q2hlY2tlZDp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCx2YWx1ZTp2b2lkIDAsY2hlY2tlZDpuPz9lLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWR9KX1mdW5jdGlvbiBLbShlLHQpe3ZhciBuPXQuZGVmYXVsdFZhbHVlPT1udWxsPyIiOnQuZGVmYXVsdFZhbHVlLHI9dC5jaGVja2VkIT1udWxsP3QuY2hlY2tlZDp0LmRlZmF1bHRDaGVja2VkO249VG8odC52YWx1ZSE9bnVsbD90LnZhbHVlOm4pLGUuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbENoZWNrZWQ6cixpbml0aWFsVmFsdWU6bixjb250cm9sbGVkOnQudHlwZT09PSJjaGVja2JveCJ8fHQudHlwZT09PSJyYWRpbyI/dC5jaGVja2VkIT1udWxsOnQudmFsdWUhPW51bGx9fWZ1bmN0aW9uIGMxKGUsdCl7dD10LmNoZWNrZWQsdCE9bnVsbCYmRHAoZSwiY2hlY2tlZCIsdCwhMSl9ZnVuY3Rpb24gV2YoZSx0KXtjMShlLHQpO3ZhciBuPVRvKHQudmFsdWUpLHI9dC50eXBlO2lmKG4hPW51bGwpcj09PSJudW1iZXIiPyhuPT09MCYmZS52YWx1ZT09PSIifHxlLnZhbHVlIT1uKSYmKGUudmFsdWU9IiIrbik6ZS52YWx1ZSE9PSIiK24mJihlLnZhbHVlPSIiK24pO2Vsc2UgaWYocj09PSJzdWJtaXQifHxyPT09InJlc2V0Iil7ZS5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik7cmV0dXJufXQuaGFzT3duUHJvcGVydHkoInZhbHVlIik/VWYoZSx0LnR5cGUsbik6dC5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikmJlVmKGUsdC50eXBlLFRvKHQuZGVmYXVsdFZhbHVlKSksdC5jaGVja2VkPT1udWxsJiZ0LmRlZmF1bHRDaGVja2VkIT1udWxsJiYoZS5kZWZhdWx0Q2hlY2tlZD0hIXQuZGVmYXVsdENoZWNrZWQpfWZ1bmN0aW9uIEdtKGUsdCxuKXtpZih0Lmhhc093blByb3BlcnR5KCJ2YWx1ZSIpfHx0Lmhhc093blByb3BlcnR5KCJkZWZhdWx0VmFsdWUiKSl7dmFyIHI9dC50eXBlO2lmKCEociE9PSJzdWJtaXQiJiZyIT09InJlc2V0Inx8dC52YWx1ZSE9PXZvaWQgMCYmdC52YWx1ZSE9PW51bGwpKXJldHVybjt0PSIiK2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsbnx8dD09PWUudmFsdWV8fChlLnZhbHVlPXQpLGUuZGVmYXVsdFZhbHVlPXR9bj1lLm5hbWUsbiE9PSIiJiYoZS5uYW1lPSIiKSxlLmRlZmF1bHRDaGVja2VkPSEhZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkLG4hPT0iIiYmKGUubmFtZT1uKX1mdW5jdGlvbiBVZihlLHQsbil7KHQhPT0ibnVtYmVyInx8V3UoZS5vd25lckRvY3VtZW50KSE9PWUpJiYobj09bnVsbD9lLmRlZmF1bHRWYWx1ZT0iIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlOmUuZGVmYXVsdFZhbHVlIT09IiIrbiYmKGUuZGVmYXVsdFZhbHVlPSIiK24pKX12YXIgZ3M9QXJyYXkuaXNBcnJheTtmdW5jdGlvbiBvbChlLHQsbixyKXtpZihlPWUub3B0aW9ucyx0KXt0PXt9O2Zvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKXRbIiQiK25bb11dPSEwO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspbz10Lmhhc093blByb3BlcnR5KCIkIitlW25dLnZhbHVlKSxlW25dLnNlbGVjdGVkIT09byYmKGVbbl0uc2VsZWN0ZWQ9byksbyYmciYmKGVbbl0uZGVmYXVsdFNlbGVjdGVkPSEwKX1lbHNle2ZvcihuPSIiK1RvKG4pLHQ9bnVsbCxvPTA7bzxlLmxlbmd0aDtvKyspe2lmKGVbb10udmFsdWU9PT1uKXtlW29dLnNlbGVjdGVkPSEwLHImJihlW29dLmRlZmF1bHRTZWxlY3RlZD0hMCk7cmV0dXJufXQhPT1udWxsfHxlW29dLmRpc2FibGVkfHwodD1lW29dKX10IT09bnVsbCYmKHQuc2VsZWN0ZWQ9ITApfX1mdW5jdGlvbiBWZihlLHQpe2lmKHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPW51bGwpdGhyb3cgRXJyb3IoVyg5MSkpO3JldHVybiB0dCh7fSx0LHt2YWx1ZTp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCxjaGlsZHJlbjoiIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlfSl9ZnVuY3Rpb24gWW0oZSx0KXt2YXIgbj10LnZhbHVlO2lmKG49PW51bGwpe2lmKG49dC5jaGlsZHJlbix0PXQuZGVmYXVsdFZhbHVlLG4hPW51bGwpe2lmKHQhPW51bGwpdGhyb3cgRXJyb3IoVyg5MikpO2lmKGdzKG4pKXtpZigxPG4ubGVuZ3RoKXRocm93IEVycm9yKFcoOTMpKTtuPW5bMF19dD1ufXQ9PW51bGwmJih0PSIiKSxuPXR9ZS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6VG8obil9fWZ1bmN0aW9uIGQxKGUsdCl7dmFyIG49VG8odC52YWx1ZSkscj1Ubyh0LmRlZmF1bHRWYWx1ZSk7biE9bnVsbCYmKG49IiIrbixuIT09ZS52YWx1ZSYmKGUudmFsdWU9biksdC5kZWZhdWx0VmFsdWU9PW51bGwmJmUuZGVmYXVsdFZhbHVlIT09biYmKGUuZGVmYXVsdFZhbHVlPW4pKSxyIT1udWxsJiYoZS5kZWZhdWx0VmFsdWU9IiIrcil9ZnVuY3Rpb24gWG0oZSl7dmFyIHQ9ZS50ZXh0Q29udGVudDt0PT09ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSYmdCE9PSIiJiZ0IT09bnVsbCYmKGUudmFsdWU9dCl9ZnVuY3Rpb24gZjEoZSl7c3dpdGNoKGUpe2Nhc2Uic3ZnIjpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2Nhc2UibWF0aCI6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiO2RlZmF1bHQ6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwifX1mdW5jdGlvbiBIZihlLHQpe3JldHVybiBlPT1udWxsfHxlPT09Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiP2YxKHQpOmU9PT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciJiZ0PT09ImZvcmVpZ25PYmplY3QiPyJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjplfXZhciBYYSxoMT1mdW5jdGlvbihlKXtyZXR1cm4gdHlwZW9mIE1TQXBwPCJ1IiYmTVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24/ZnVuY3Rpb24odCxuLHIsbyl7TVNBcHAuZXhlY1Vuc2FmZUxvY2FsRnVuY3Rpb24oZnVuY3Rpb24oKXtyZXR1cm4gZSh0LG4scixvKX0pfTplfShmdW5jdGlvbihlLHQpe2lmKGUubmFtZXNwYWNlVVJJIT09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnInx8ImlubmVySFRNTCJpbiBlKWUuaW5uZXJIVE1MPXQ7ZWxzZXtmb3IoWGE9WGF8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFhhLmlubmVySFRNTD0iPHN2Zz4iK3QudmFsdWVPZigpLnRvU3RyaW5nKCkrIjwvc3ZnPiIsdD1YYS5maXJzdENoaWxkO2UuZmlyc3RDaGlsZDspZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO2Zvcig7dC5maXJzdENoaWxkOyllLmFwcGVuZENoaWxkKHQuZmlyc3RDaGlsZCl9fSk7ZnVuY3Rpb24gR3MoZSx0KXtpZih0KXt2YXIgbj1lLmZpcnN0Q2hpbGQ7aWYobiYmbj09PWUubGFzdENoaWxkJiZuLm5vZGVUeXBlPT09Myl7bi5ub2RlVmFsdWU9dDtyZXR1cm59fWUudGV4dENvbnRlbnQ9dH12YXIgU3M9e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGFzcGVjdFJhdGlvOiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRlckltYWdlU2xpY2U6ITAsYm9yZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91cDohMCxib3hPcmRpbmFsR3JvdXA6ITAsY29sdW1uQ291bnQ6ITAsY29sdW1uczohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZEFyZWE6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTcGFuOiEwLGdyaWRSb3dTdGFydDohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblNwYW46ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHRhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLGZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VEYXNoYXJyYXk6ITAsc3Ryb2tlRGFzaG9mZnNldDohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6ITAsc3Ryb2tlV2lkdGg6ITB9LEpDPVsiV2Via2l0IiwibXMiLCJNb3oiLCJPIl07T2JqZWN0LmtleXMoU3MpLmZvckVhY2goZnVuY3Rpb24oZSl7SkMuZm9yRWFjaChmdW5jdGlvbih0KXt0PXQrZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnN1YnN0cmluZygxKSxTc1t0XT1Tc1tlXX0pfSk7ZnVuY3Rpb24gcDEoZSx0LG4pe3JldHVybiB0PT1udWxsfHx0eXBlb2YgdD09ImJvb2xlYW4ifHx0PT09IiI/IiI6bnx8dHlwZW9mIHQhPSJudW1iZXIifHx0PT09MHx8U3MuaGFzT3duUHJvcGVydHkoZSkmJlNzW2VdPygiIit0KS50cmltKCk6dCsicHgifWZ1bmN0aW9uIGcxKGUsdCl7ZT1lLnN0eWxlO2Zvcih2YXIgbiBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkobikpe3ZhciByPW4uaW5kZXhPZigiLS0iKT09PTAsbz1wMShuLHRbbl0scik7bj09PSJmbG9hdCImJihuPSJjc3NGbG9hdCIpLHI/ZS5zZXRQcm9wZXJ0eShuLG8pOmVbbl09b319dmFyIFpDPXR0KHttZW51aXRlbTohMH0se2FyZWE6ITAsYmFzZTohMCxicjohMCxjb2w6ITAsZW1iZWQ6ITAsaHI6ITAsaW1nOiEwLGlucHV0OiEwLGtleWdlbjohMCxsaW5rOiEwLG1ldGE6ITAscGFyYW06ITAsc291cmNlOiEwLHRyYWNrOiEwLHdicjohMH0pO2Z1bmN0aW9uIEtmKGUsdCl7aWYodCl7aWYoWkNbZV0mJih0LmNoaWxkcmVuIT1udWxsfHx0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIT1udWxsKSl0aHJvdyBFcnJvcihXKDEzNyxlKSk7aWYodC5kYW5nZXJvdXNseVNldElubmVySFRNTCE9bnVsbCl7aWYodC5jaGlsZHJlbiE9bnVsbCl0aHJvdyBFcnJvcihXKDYwKSk7aWYodHlwZW9mIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPSJvYmplY3QifHwhKCJfX2h0bWwiaW4gdC5kYW5nZXJvdXNseVNldElubmVySFRNTCkpdGhyb3cgRXJyb3IoVyg2MSkpfWlmKHQuc3R5bGUhPW51bGwmJnR5cGVvZiB0LnN0eWxlIT0ib2JqZWN0Iil0aHJvdyBFcnJvcihXKDYyKSl9fWZ1bmN0aW9uIEdmKGUsdCl7aWYoZS5pbmRleE9mKCItIik9PT0tMSlyZXR1cm4gdHlwZW9mIHQuaXM9PSJzdHJpbmciO3N3aXRjaChlKXtjYXNlImFubm90YXRpb24teG1sIjpjYXNlImNvbG9yLXByb2ZpbGUiOmNhc2UiZm9udC1mYWNlIjpjYXNlImZvbnQtZmFjZS1zcmMiOmNhc2UiZm9udC1mYWNlLXVyaSI6Y2FzZSJmb250LWZhY2UtZm9ybWF0IjpjYXNlImZvbnQtZmFjZS1uYW1lIjpjYXNlIm1pc3NpbmctZ2x5cGgiOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITB9fXZhciBZZj1udWxsO2Z1bmN0aW9uIHpwKGUpe3JldHVybiBlPWUudGFyZ2V0fHxlLnNyY0VsZW1lbnR8fHdpbmRvdyxlLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50JiYoZT1lLmNvcnJlc3BvbmRpbmdVc2VFbGVtZW50KSxlLm5vZGVUeXBlPT09Mz9lLnBhcmVudE5vZGU6ZX12YXIgWGY9bnVsbCxpbD1udWxsLGxsPW51bGw7ZnVuY3Rpb24gUW0oZSl7aWYoZT1iYShlKSl7aWYodHlwZW9mIFhmIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMjgwKSk7dmFyIHQ9ZS5zdGF0ZU5vZGU7dCYmKHQ9SGModCksWGYoZS5zdGF0ZU5vZGUsZS50eXBlLHQpKX19ZnVuY3Rpb24gbTEoZSl7aWw/bGw/bGwucHVzaChlKTpsbD1bZV06aWw9ZX1mdW5jdGlvbiB2MSgpe2lmKGlsKXt2YXIgZT1pbCx0PWxsO2lmKGxsPWlsPW51bGwsUW0oZSksdClmb3IoZT0wO2U8dC5sZW5ndGg7ZSsrKVFtKHRbZV0pfX1mdW5jdGlvbiB5MShlLHQpe3JldHVybiBlKHQpfWZ1bmN0aW9uIHgxKCl7fXZhciBXZD0hMTtmdW5jdGlvbiBfMShlLHQsbil7aWYoV2QpcmV0dXJuIGUodCxuKTtXZD0hMDt0cnl7cmV0dXJuIHkxKGUsdCxuKX1maW5hbGx5e1dkPSExLChpbCE9PW51bGx8fGxsIT09bnVsbCkmJih4MSgpLHYxKCkpfX1mdW5jdGlvbiBZcyhlLHQpe3ZhciBuPWUuc3RhdGVOb2RlO2lmKG49PT1udWxsKXJldHVybiBudWxsO3ZhciByPUhjKG4pO2lmKHI9PT1udWxsKXJldHVybiBudWxsO249clt0XTtlOnN3aXRjaCh0KXtjYXNlIm9uQ2xpY2siOmNhc2Uib25DbGlja0NhcHR1cmUiOmNhc2Uib25Eb3VibGVDbGljayI6Y2FzZSJvbkRvdWJsZUNsaWNrQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRG93biI6Y2FzZSJvbk1vdXNlRG93bkNhcHR1cmUiOmNhc2Uib25Nb3VzZU1vdmUiOmNhc2Uib25Nb3VzZU1vdmVDYXB0dXJlIjpjYXNlIm9uTW91c2VVcCI6Y2FzZSJvbk1vdXNlVXBDYXB0dXJlIjpjYXNlIm9uTW91c2VFbnRlciI6KHI9IXIuZGlzYWJsZWQpfHwoZT1lLnR5cGUscj0hKGU9PT0iYnV0dG9uInx8ZT09PSJpbnB1dCJ8fGU9PT0ic2VsZWN0Inx8ZT09PSJ0ZXh0YXJlYSIpKSxlPSFyO2JyZWFrIGU7ZGVmYXVsdDplPSExfWlmKGUpcmV0dXJuIG51bGw7aWYobiYmdHlwZW9mIG4hPSJmdW5jdGlvbiIpdGhyb3cgRXJyb3IoVygyMzEsdCx0eXBlb2YgbikpO3JldHVybiBufXZhciBRZj0hMTtpZihJcil0cnl7dmFyIGVzPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlcywicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe1FmPSEwfX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0Iixlcyxlcyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLGVzLGVzKX1jYXRjaHtRZj0hMX1mdW5jdGlvbiBxQyhlLHQsbixyLG8saSxsLHMsYSl7dmFyIHU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpO3RyeXt0LmFwcGx5KG4sdSl9Y2F0Y2goYyl7dGhpcy5vbkVycm9yKGMpfX12YXIgRXM9ITEsVXU9bnVsbCxWdT0hMSxKZj1udWxsLGUkPXtvbkVycm9yOmZ1bmN0aW9uKGUpe0VzPSEwLFV1PWV9fTtmdW5jdGlvbiB0JChlLHQsbixyLG8saSxsLHMsYSl7RXM9ITEsVXU9bnVsbCxxQy5hcHBseShlJCxhcmd1bWVudHMpfWZ1bmN0aW9uIG4kKGUsdCxuLHIsbyxpLGwscyxhKXtpZih0JC5hcHBseSh0aGlzLGFyZ3VtZW50cyksRXMpe2lmKEVzKXt2YXIgdT1VdTtFcz0hMSxVdT1udWxsfWVsc2UgdGhyb3cgRXJyb3IoVygxOTgpKTtWdXx8KFZ1PSEwLEpmPXUpfX1mdW5jdGlvbiB4aShlKXt2YXIgdD1lLG49ZTtpZihlLmFsdGVybmF0ZSlmb3IoO3QucmV0dXJuOyl0PXQucmV0dXJuO2Vsc2V7ZT10O2RvIHQ9ZSx0LmZsYWdzJjQwOTgmJihuPXQucmV0dXJuKSxlPXQucmV0dXJuO3doaWxlKGUpfXJldHVybiB0LnRhZz09PTM/bjpudWxsfWZ1bmN0aW9uIHcxKGUpe2lmKGUudGFnPT09MTMpe3ZhciB0PWUubWVtb2l6ZWRTdGF0ZTtpZih0PT09bnVsbCYmKGU9ZS5hbHRlcm5hdGUsZSE9PW51bGwmJih0PWUubWVtb2l6ZWRTdGF0ZSkpLHQhPT1udWxsKXJldHVybiB0LmRlaHlkcmF0ZWR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gSm0oZSl7aWYoeGkoZSkhPT1lKXRocm93IEVycm9yKFcoMTg4KSl9ZnVuY3Rpb24gciQoZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7aWYoIXQpe2lmKHQ9eGkoZSksdD09PW51bGwpdGhyb3cgRXJyb3IoVygxODgpKTtyZXR1cm4gdCE9PWU/bnVsbDplfWZvcih2YXIgbj1lLHI9dDs7KXt2YXIgbz1uLnJldHVybjtpZihvPT09bnVsbClicmVhazt2YXIgaT1vLmFsdGVybmF0ZTtpZihpPT09bnVsbCl7aWYocj1vLnJldHVybixyIT09bnVsbCl7bj1yO2NvbnRpbnVlfWJyZWFrfWlmKG8uY2hpbGQ9PT1pLmNoaWxkKXtmb3IoaT1vLmNoaWxkO2k7KXtpZihpPT09bilyZXR1cm4gSm0obyksZTtpZihpPT09cilyZXR1cm4gSm0obyksdDtpPWkuc2libGluZ310aHJvdyBFcnJvcihXKDE4OCkpfWlmKG4ucmV0dXJuIT09ci5yZXR1cm4pbj1vLHI9aTtlbHNle2Zvcih2YXIgbD0hMSxzPW8uY2hpbGQ7czspe2lmKHM9PT1uKXtsPSEwLG49byxyPWk7YnJlYWt9aWYocz09PXIpe2w9ITAscj1vLG49aTticmVha31zPXMuc2libGluZ31pZighbCl7Zm9yKHM9aS5jaGlsZDtzOyl7aWYocz09PW4pe2w9ITAsbj1pLHI9bzticmVha31pZihzPT09cil7bD0hMCxyPWksbj1vO2JyZWFrfXM9cy5zaWJsaW5nfWlmKCFsKXRocm93IEVycm9yKFcoMTg5KSl9fWlmKG4uYWx0ZXJuYXRlIT09cil0aHJvdyBFcnJvcihXKDE5MCkpfWlmKG4udGFnIT09Myl0aHJvdyBFcnJvcihXKDE4OCkpO3JldHVybiBuLnN0YXRlTm9kZS5jdXJyZW50PT09bj9lOnR9ZnVuY3Rpb24gUzEoZSl7cmV0dXJuIGU9ciQoZSksZSE9PW51bGw/RTEoZSk6bnVsbH1mdW5jdGlvbiBFMShlKXtpZihlLnRhZz09PTV8fGUudGFnPT09NilyZXR1cm4gZTtmb3IoZT1lLmNoaWxkO2UhPT1udWxsOyl7dmFyIHQ9RTEoZSk7aWYodCE9PW51bGwpcmV0dXJuIHQ7ZT1lLnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIEMxPUNuLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2ssWm09Q24udW5zdGFibGVfY2FuY2VsQ2FsbGJhY2ssbyQ9Q24udW5zdGFibGVfc2hvdWxkWWllbGQsaSQ9Q24udW5zdGFibGVfcmVxdWVzdFBhaW50LHV0PUNuLnVuc3RhYmxlX25vdyxsJD1Dbi51bnN0YWJsZV9nZXRDdXJyZW50UHJpb3JpdHlMZXZlbCxGcD1Dbi51bnN0YWJsZV9JbW1lZGlhdGVQcmlvcml0eSwkMT1Dbi51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSxIdT1Dbi51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSxzJD1Dbi51bnN0YWJsZV9Mb3dQcmlvcml0eSxrMT1Dbi51bnN0YWJsZV9JZGxlUHJpb3JpdHksQmM9bnVsbCxwcj1udWxsO2Z1bmN0aW9uIGEkKGUpe2lmKHByJiZ0eXBlb2YgcHIub25Db21taXRGaWJlclJvb3Q9PSJmdW5jdGlvbiIpdHJ5e3ByLm9uQ29tbWl0RmliZXJSb290KEJjLGUsdm9pZCAwLChlLmN1cnJlbnQuZmxhZ3MmMTI4KT09PTEyOCl9Y2F0Y2h7fX12YXIgWm49TWF0aC5jbHozMj9NYXRoLmNsejMyOmQkLHUkPU1hdGgubG9nLGMkPU1hdGguTE4yO2Z1bmN0aW9uIGQkKGUpe3JldHVybiBlPj4+PTAsZT09PTA/MzI6MzEtKHUkKGUpL2MkfDApfDB9dmFyIFFhPTY0LEphPTQxOTQzMDQ7ZnVuY3Rpb24gbXMoZSl7c3dpdGNoKGUmLWUpe2Nhc2UgMTpyZXR1cm4gMTtjYXNlIDI6cmV0dXJuIDI7Y2FzZSA0OnJldHVybiA0O2Nhc2UgODpyZXR1cm4gODtjYXNlIDE2OnJldHVybiAxNjtjYXNlIDMyOnJldHVybiAzMjtjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiBlJjQxOTQyNDA7Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpyZXR1cm4gZSYxMzAwMjM0MjQ7Y2FzZSAxMzQyMTc3Mjg6cmV0dXJuIDEzNDIxNzcyODtjYXNlIDI2ODQzNTQ1NjpyZXR1cm4gMjY4NDM1NDU2O2Nhc2UgNTM2ODcwOTEyOnJldHVybiA1MzY4NzA5MTI7Y2FzZSAxMDczNzQxODI0OnJldHVybiAxMDczNzQxODI0O2RlZmF1bHQ6cmV0dXJuIGV9fWZ1bmN0aW9uIEt1KGUsdCl7dmFyIG49ZS5wZW5kaW5nTGFuZXM7aWYobj09PTApcmV0dXJuIDA7dmFyIHI9MCxvPWUuc3VzcGVuZGVkTGFuZXMsaT1lLnBpbmdlZExhbmVzLGw9biYyNjg0MzU0NTU7aWYobCE9PTApe3ZhciBzPWwmfm87cyE9PTA/cj1tcyhzKTooaSY9bCxpIT09MCYmKHI9bXMoaSkpKX1lbHNlIGw9biZ+byxsIT09MD9yPW1zKGwpOmkhPT0wJiYocj1tcyhpKSk7aWYocj09PTApcmV0dXJuIDA7aWYodCE9PTAmJnQhPT1yJiYhKHQmbykmJihvPXImLXIsaT10Ji10LG8+PWl8fG89PT0xNiYmKGkmNDE5NDI0MCkhPT0wKSlyZXR1cm4gdDtpZihyJjQmJihyfD1uJjE2KSx0PWUuZW50YW5nbGVkTGFuZXMsdCE9PTApZm9yKGU9ZS5lbnRhbmdsZW1lbnRzLHQmPXI7MDx0OyluPTMxLVpuKHQpLG89MTw8bixyfD1lW25dLHQmPX5vO3JldHVybiByfWZ1bmN0aW9uIGYkKGUsdCl7c3dpdGNoKGUpe2Nhc2UgMTpjYXNlIDI6Y2FzZSA0OnJldHVybiB0KzI1MDtjYXNlIDg6Y2FzZSAxNjpjYXNlIDMyOmNhc2UgNjQ6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6cmV0dXJuIHQrNWUzO2Nhc2UgNDE5NDMwNDpjYXNlIDgzODg2MDg6Y2FzZSAxNjc3NzIxNjpjYXNlIDMzNTU0NDMyOmNhc2UgNjcxMDg4NjQ6cmV0dXJuLTE7Y2FzZSAxMzQyMTc3Mjg6Y2FzZSAyNjg0MzU0NTY6Y2FzZSA1MzY4NzA5MTI6Y2FzZSAxMDczNzQxODI0OnJldHVybi0xO2RlZmF1bHQ6cmV0dXJuLTF9fWZ1bmN0aW9uIGgkKGUsdCl7Zm9yKHZhciBuPWUuc3VzcGVuZGVkTGFuZXMscj1lLnBpbmdlZExhbmVzLG89ZS5leHBpcmF0aW9uVGltZXMsaT1lLnBlbmRpbmdMYW5lczswPGk7KXt2YXIgbD0zMS1abihpKSxzPTE8PGwsYT1vW2xdO2E9PT0tMT8oIShzJm4pfHxzJnIpJiYob1tsXT1mJChzLHQpKTphPD10JiYoZS5leHBpcmVkTGFuZXN8PXMpLGkmPX5zfX1mdW5jdGlvbiBaZihlKXtyZXR1cm4gZT1lLnBlbmRpbmdMYW5lcyYtMTA3Mzc0MTgyNSxlIT09MD9lOmUmMTA3Mzc0MTgyND8xMDczNzQxODI0OjB9ZnVuY3Rpb24gVDEoKXt2YXIgZT1RYTtyZXR1cm4gUWE8PD0xLCEoUWEmNDE5NDI0MCkmJihRYT02NCksZX1mdW5jdGlvbiBVZChlKXtmb3IodmFyIHQ9W10sbj0wOzMxPm47bisrKXQucHVzaChlKTtyZXR1cm4gdH1mdW5jdGlvbiBUYShlLHQsbil7ZS5wZW5kaW5nTGFuZXN8PXQsdCE9PTUzNjg3MDkxMiYmKGUuc3VzcGVuZGVkTGFuZXM9MCxlLnBpbmdlZExhbmVzPTApLGU9ZS5ldmVudFRpbWVzLHQ9MzEtWm4odCksZVt0XT1ufWZ1bmN0aW9uIHAkKGUsdCl7dmFyIG49ZS5wZW5kaW5nTGFuZXMmfnQ7ZS5wZW5kaW5nTGFuZXM9dCxlLnN1c3BlbmRlZExhbmVzPTAsZS5waW5nZWRMYW5lcz0wLGUuZXhwaXJlZExhbmVzJj10LGUubXV0YWJsZVJlYWRMYW5lcyY9dCxlLmVudGFuZ2xlZExhbmVzJj10LHQ9ZS5lbnRhbmdsZW1lbnRzO3ZhciByPWUuZXZlbnRUaW1lcztmb3IoZT1lLmV4cGlyYXRpb25UaW1lczswPG47KXt2YXIgbz0zMS1abihuKSxpPTE8PG87dFtvXT0wLHJbb109LTEsZVtvXT0tMSxuJj1+aX19ZnVuY3Rpb24gQnAoZSx0KXt2YXIgbj1lLmVudGFuZ2xlZExhbmVzfD10O2ZvcihlPWUuZW50YW5nbGVtZW50cztuOyl7dmFyIHI9MzEtWm4obiksbz0xPDxyO28mdHxlW3JdJnQmJihlW3JdfD10KSxuJj1+b319dmFyIFBlPTA7ZnVuY3Rpb24gTjEoZSl7cmV0dXJuIGUmPS1lLDE8ZT80PGU/ZSYyNjg0MzU0NTU/MTY6NTM2ODcwOTEyOjQ6MX12YXIgYjEsV3AsUjEsUDEsTzEscWY9ITEsWmE9W10sdm89bnVsbCx5bz1udWxsLHhvPW51bGwsWHM9bmV3IE1hcCxRcz1uZXcgTWFwLHVvPVtdLGckPSJtb3VzZWRvd24gbW91c2V1cCB0b3VjaGNhbmNlbCB0b3VjaGVuZCB0b3VjaHN0YXJ0IGF1eGNsaWNrIGRibGNsaWNrIHBvaW50ZXJjYW5jZWwgcG9pbnRlcmRvd24gcG9pbnRlcnVwIGRyYWdlbmQgZHJhZ3N0YXJ0IGRyb3AgY29tcG9zaXRpb25lbmQgY29tcG9zaXRpb25zdGFydCBrZXlkb3duIGtleXByZXNzIGtleXVwIGlucHV0IHRleHRJbnB1dCBjb3B5IGN1dCBwYXN0ZSBjbGljayBjaGFuZ2UgY29udGV4dG1lbnUgcmVzZXQgc3VibWl0Ii5zcGxpdCgiICIpO2Z1bmN0aW9uIHFtKGUsdCl7c3dpdGNoKGUpe2Nhc2UiZm9jdXNpbiI6Y2FzZSJmb2N1c291dCI6dm89bnVsbDticmVhaztjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnbGVhdmUiOnlvPW51bGw7YnJlYWs7Y2FzZSJtb3VzZW92ZXIiOmNhc2UibW91c2VvdXQiOnhvPW51bGw7YnJlYWs7Y2FzZSJwb2ludGVyb3ZlciI6Y2FzZSJwb2ludGVyb3V0IjpYcy5kZWxldGUodC5wb2ludGVySWQpO2JyZWFrO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOmNhc2UibG9zdHBvaW50ZXJjYXB0dXJlIjpRcy5kZWxldGUodC5wb2ludGVySWQpfX1mdW5jdGlvbiB0cyhlLHQsbixyLG8saSl7cmV0dXJuIGU9PT1udWxsfHxlLm5hdGl2ZUV2ZW50IT09aT8oZT17YmxvY2tlZE9uOnQsZG9tRXZlbnROYW1lOm4sZXZlbnRTeXN0ZW1GbGFnczpyLG5hdGl2ZUV2ZW50OmksdGFyZ2V0Q29udGFpbmVyczpbb119LHQhPT1udWxsJiYodD1iYSh0KSx0IT09bnVsbCYmV3AodCkpLGUpOihlLmV2ZW50U3lzdGVtRmxhZ3N8PXIsdD1lLnRhcmdldENvbnRhaW5lcnMsbyE9PW51bGwmJnQuaW5kZXhPZihvKT09PS0xJiZ0LnB1c2gobyksZSl9ZnVuY3Rpb24gbSQoZSx0LG4scixvKXtzd2l0Y2godCl7Y2FzZSJmb2N1c2luIjpyZXR1cm4gdm89dHModm8sZSx0LG4scixvKSwhMDtjYXNlImRyYWdlbnRlciI6cmV0dXJuIHlvPXRzKHlvLGUsdCxuLHIsbyksITA7Y2FzZSJtb3VzZW92ZXIiOnJldHVybiB4bz10cyh4byxlLHQsbixyLG8pLCEwO2Nhc2UicG9pbnRlcm92ZXIiOnZhciBpPW8ucG9pbnRlcklkO3JldHVybiBYcy5zZXQoaSx0cyhYcy5nZXQoaSl8fG51bGwsZSx0LG4scixvKSksITA7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6cmV0dXJuIGk9by5wb2ludGVySWQsUXMuc2V0KGksdHMoUXMuZ2V0KGkpfHxudWxsLGUsdCxuLHIsbykpLCEwfXJldHVybiExfWZ1bmN0aW9uIEExKGUpe3ZhciB0PVFvKGUudGFyZ2V0KTtpZih0IT09bnVsbCl7dmFyIG49eGkodCk7aWYobiE9PW51bGwpe2lmKHQ9bi50YWcsdD09PTEzKXtpZih0PXcxKG4pLHQhPT1udWxsKXtlLmJsb2NrZWRPbj10LE8xKGUucHJpb3JpdHksZnVuY3Rpb24oKXtSMShuKX0pO3JldHVybn19ZWxzZSBpZih0PT09MyYmbi5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7ZS5ibG9ja2VkT249bi50YWc9PT0zP24uc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtyZXR1cm59fX1lLmJsb2NrZWRPbj1udWxsfWZ1bmN0aW9uIEN1KGUpe2lmKGUuYmxvY2tlZE9uIT09bnVsbClyZXR1cm4hMTtmb3IodmFyIHQ9ZS50YXJnZXRDb250YWluZXJzOzA8dC5sZW5ndGg7KXt2YXIgbj1laChlLmRvbUV2ZW50TmFtZSxlLmV2ZW50U3lzdGVtRmxhZ3MsdFswXSxlLm5hdGl2ZUV2ZW50KTtpZihuPT09bnVsbCl7bj1lLm5hdGl2ZUV2ZW50O3ZhciByPW5ldyBuLmNvbnN0cnVjdG9yKG4udHlwZSxuKTtZZj1yLG4udGFyZ2V0LmRpc3BhdGNoRXZlbnQociksWWY9bnVsbH1lbHNlIHJldHVybiB0PWJhKG4pLHQhPT1udWxsJiZXcCh0KSxlLmJsb2NrZWRPbj1uLCExO3Quc2hpZnQoKX1yZXR1cm4hMH1mdW5jdGlvbiBldihlLHQsbil7Q3UoZSkmJm4uZGVsZXRlKHQpfWZ1bmN0aW9uIHYkKCl7cWY9ITEsdm8hPT1udWxsJiZDdSh2bykmJih2bz1udWxsKSx5byE9PW51bGwmJkN1KHlvKSYmKHlvPW51bGwpLHhvIT09bnVsbCYmQ3UoeG8pJiYoeG89bnVsbCksWHMuZm9yRWFjaChldiksUXMuZm9yRWFjaChldil9ZnVuY3Rpb24gbnMoZSx0KXtlLmJsb2NrZWRPbj09PXQmJihlLmJsb2NrZWRPbj1udWxsLHFmfHwocWY9ITAsQ24udW5zdGFibGVfc2NoZWR1bGVDYWxsYmFjayhDbi51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSx2JCkpKX1mdW5jdGlvbiBKcyhlKXtmdW5jdGlvbiB0KG8pe3JldHVybiBucyhvLGUpfWlmKDA8WmEubGVuZ3RoKXtucyhaYVswXSxlKTtmb3IodmFyIG49MTtuPFphLmxlbmd0aDtuKyspe3ZhciByPVphW25dO3IuYmxvY2tlZE9uPT09ZSYmKHIuYmxvY2tlZE9uPW51bGwpfX1mb3Iodm8hPT1udWxsJiZucyh2byxlKSx5byE9PW51bGwmJm5zKHlvLGUpLHhvIT09bnVsbCYmbnMoeG8sZSksWHMuZm9yRWFjaCh0KSxRcy5mb3JFYWNoKHQpLG49MDtuPHVvLmxlbmd0aDtuKyspcj11b1tuXSxyLmJsb2NrZWRPbj09PWUmJihyLmJsb2NrZWRPbj1udWxsKTtmb3IoOzA8dW8ubGVuZ3RoJiYobj11b1swXSxuLmJsb2NrZWRPbj09PW51bGwpOylBMShuKSxuLmJsb2NrZWRPbj09PW51bGwmJnVvLnNoaWZ0KCl9dmFyIHNsPVZyLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLEd1PSEwO2Z1bmN0aW9uIHkkKGUsdCxuLHIpe3ZhciBvPVBlLGk9c2wudHJhbnNpdGlvbjtzbC50cmFuc2l0aW9uPW51bGw7dHJ5e1BlPTEsVXAoZSx0LG4scil9ZmluYWxseXtQZT1vLHNsLnRyYW5zaXRpb249aX19ZnVuY3Rpb24geCQoZSx0LG4scil7dmFyIG89UGUsaT1zbC50cmFuc2l0aW9uO3NsLnRyYW5zaXRpb249bnVsbDt0cnl7UGU9NCxVcChlLHQsbixyKX1maW5hbGx5e1BlPW8sc2wudHJhbnNpdGlvbj1pfX1mdW5jdGlvbiBVcChlLHQsbixyKXtpZihHdSl7dmFyIG89ZWgoZSx0LG4scik7aWYobz09PW51bGwpcWQoZSx0LHIsWXUsbikscW0oZSxyKTtlbHNlIGlmKG0kKG8sZSx0LG4scikpci5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKHFtKGUsciksdCY0JiYtMTxnJC5pbmRleE9mKGUpKXtmb3IoO28hPT1udWxsOyl7dmFyIGk9YmEobyk7aWYoaSE9PW51bGwmJmIxKGkpLGk9ZWgoZSx0LG4sciksaT09PW51bGwmJnFkKGUsdCxyLFl1LG4pLGk9PT1vKWJyZWFrO289aX1vIT09bnVsbCYmci5zdG9wUHJvcGFnYXRpb24oKX1lbHNlIHFkKGUsdCxyLG51bGwsbil9fXZhciBZdT1udWxsO2Z1bmN0aW9uIGVoKGUsdCxuLHIpe2lmKFl1PW51bGwsZT16cChyKSxlPVFvKGUpLGUhPT1udWxsKWlmKHQ9eGkoZSksdD09PW51bGwpZT1udWxsO2Vsc2UgaWYobj10LnRhZyxuPT09MTMpe2lmKGU9dzEodCksZSE9PW51bGwpcmV0dXJuIGU7ZT1udWxsfWVsc2UgaWYobj09PTMpe2lmKHQuc3RhdGVOb2RlLmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpcmV0dXJuIHQudGFnPT09Mz90LnN0YXRlTm9kZS5jb250YWluZXJJbmZvOm51bGw7ZT1udWxsfWVsc2UgdCE9PWUmJihlPW51bGwpO3JldHVybiBZdT1lLG51bGx9ZnVuY3Rpb24gTTEoZSl7c3dpdGNoKGUpe2Nhc2UiY2FuY2VsIjpjYXNlImNsaWNrIjpjYXNlImNsb3NlIjpjYXNlImNvbnRleHRtZW51IjpjYXNlImNvcHkiOmNhc2UiY3V0IjpjYXNlImF1eGNsaWNrIjpjYXNlImRibGNsaWNrIjpjYXNlImRyYWdlbmQiOmNhc2UiZHJhZ3N0YXJ0IjpjYXNlImRyb3AiOmNhc2UiZm9jdXNpbiI6Y2FzZSJmb2N1c291dCI6Y2FzZSJpbnB1dCI6Y2FzZSJpbnZhbGlkIjpjYXNlImtleWRvd24iOmNhc2Uia2V5cHJlc3MiOmNhc2Uia2V5dXAiOmNhc2UibW91c2Vkb3duIjpjYXNlIm1vdXNldXAiOmNhc2UicGFzdGUiOmNhc2UicGF1c2UiOmNhc2UicGxheSI6Y2FzZSJwb2ludGVyY2FuY2VsIjpjYXNlInBvaW50ZXJkb3duIjpjYXNlInBvaW50ZXJ1cCI6Y2FzZSJyYXRlY2hhbmdlIjpjYXNlInJlc2V0IjpjYXNlInJlc2l6ZSI6Y2FzZSJzZWVrZWQiOmNhc2Uic3VibWl0IjpjYXNlInRvdWNoY2FuY2VsIjpjYXNlInRvdWNoZW5kIjpjYXNlInRvdWNoc3RhcnQiOmNhc2Uidm9sdW1lY2hhbmdlIjpjYXNlImNoYW5nZSI6Y2FzZSJzZWxlY3Rpb25jaGFuZ2UiOmNhc2UidGV4dElucHV0IjpjYXNlImNvbXBvc2l0aW9uc3RhcnQiOmNhc2UiY29tcG9zaXRpb25lbmQiOmNhc2UiY29tcG9zaXRpb251cGRhdGUiOmNhc2UiYmVmb3JlYmx1ciI6Y2FzZSJhZnRlcmJsdXIiOmNhc2UiYmVmb3JlaW5wdXQiOmNhc2UiYmx1ciI6Y2FzZSJmdWxsc2NyZWVuY2hhbmdlIjpjYXNlImZvY3VzIjpjYXNlImhhc2hjaGFuZ2UiOmNhc2UicG9wc3RhdGUiOmNhc2Uic2VsZWN0IjpjYXNlInNlbGVjdHN0YXJ0IjpyZXR1cm4gMTtjYXNlImRyYWciOmNhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdleGl0IjpjYXNlImRyYWdsZWF2ZSI6Y2FzZSJkcmFnb3ZlciI6Y2FzZSJtb3VzZW1vdmUiOmNhc2UibW91c2VvdXQiOmNhc2UibW91c2VvdmVyIjpjYXNlInBvaW50ZXJtb3ZlIjpjYXNlInBvaW50ZXJvdXQiOmNhc2UicG9pbnRlcm92ZXIiOmNhc2Uic2Nyb2xsIjpjYXNlInRvZ2dsZSI6Y2FzZSJ0b3VjaG1vdmUiOmNhc2Uid2hlZWwiOmNhc2UibW91c2VlbnRlciI6Y2FzZSJtb3VzZWxlYXZlIjpjYXNlInBvaW50ZXJlbnRlciI6Y2FzZSJwb2ludGVybGVhdmUiOnJldHVybiA0O2Nhc2UibWVzc2FnZSI6c3dpdGNoKGwkKCkpe2Nhc2UgRnA6cmV0dXJuIDE7Y2FzZSAkMTpyZXR1cm4gNDtjYXNlIEh1OmNhc2UgcyQ6cmV0dXJuIDE2O2Nhc2UgazE6cmV0dXJuIDUzNjg3MDkxMjtkZWZhdWx0OnJldHVybiAxNn1kZWZhdWx0OnJldHVybiAxNn19dmFyIGhvPW51bGwsVnA9bnVsbCwkdT1udWxsO2Z1bmN0aW9uIEQxKCl7aWYoJHUpcmV0dXJuICR1O3ZhciBlLHQ9VnAsbj10Lmxlbmd0aCxyLG89InZhbHVlImluIGhvP2hvLnZhbHVlOmhvLnRleHRDb250ZW50LGk9by5sZW5ndGg7Zm9yKGU9MDtlPG4mJnRbZV09PT1vW2VdO2UrKyk7dmFyIGw9bi1lO2ZvcihyPTE7cjw9bCYmdFtuLXJdPT09b1tpLXJdO3IrKyk7cmV0dXJuICR1PW8uc2xpY2UoZSwxPHI/MS1yOnZvaWQgMCl9ZnVuY3Rpb24ga3UoZSl7dmFyIHQ9ZS5rZXlDb2RlO3JldHVybiJjaGFyQ29kZSJpbiBlPyhlPWUuY2hhckNvZGUsZT09PTAmJnQ9PT0xMyYmKGU9MTMpKTplPXQsZT09PTEwJiYoZT0xMyksMzI8PWV8fGU9PT0xMz9lOjB9ZnVuY3Rpb24gcWEoKXtyZXR1cm4hMH1mdW5jdGlvbiB0digpe3JldHVybiExfWZ1bmN0aW9uIE5uKGUpe2Z1bmN0aW9uIHQobixyLG8saSxsKXt0aGlzLl9yZWFjdE5hbWU9bix0aGlzLl90YXJnZXRJbnN0PW8sdGhpcy50eXBlPXIsdGhpcy5uYXRpdmVFdmVudD1pLHRoaXMudGFyZ2V0PWwsdGhpcy5jdXJyZW50VGFyZ2V0PW51bGw7Zm9yKHZhciBzIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShzKSYmKG49ZVtzXSx0aGlzW3NdPW4/bihpKTppW3NdKTtyZXR1cm4gdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9KGkuZGVmYXVsdFByZXZlbnRlZCE9bnVsbD9pLmRlZmF1bHRQcmV2ZW50ZWQ6aS5yZXR1cm5WYWx1ZT09PSExKT9xYTp0dix0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPXR2LHRoaXN9cmV0dXJuIHR0KHQucHJvdG90eXBlLHtwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3RoaXMuZGVmYXVsdFByZXZlbnRlZD0hMDt2YXIgbj10aGlzLm5hdGl2ZUV2ZW50O24mJihuLnByZXZlbnREZWZhdWx0P24ucHJldmVudERlZmF1bHQoKTp0eXBlb2Ygbi5yZXR1cm5WYWx1ZSE9InVua25vd24iJiYobi5yZXR1cm5WYWx1ZT0hMSksdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9cWEpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgbj10aGlzLm5hdGl2ZUV2ZW50O24mJihuLnN0b3BQcm9wYWdhdGlvbj9uLnN0b3BQcm9wYWdhdGlvbigpOnR5cGVvZiBuLmNhbmNlbEJ1YmJsZSE9InVua25vd24iJiYobi5jYW5jZWxCdWJibGU9ITApLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9cWEpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7fSxpc1BlcnNpc3RlbnQ6cWF9KSx0fXZhciBPbD17ZXZlbnRQaGFzZTowLGJ1YmJsZXM6MCxjYW5jZWxhYmxlOjAsdGltZVN0YW1wOmZ1bmN0aW9uKGUpe3JldHVybiBlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKX0sZGVmYXVsdFByZXZlbnRlZDowLGlzVHJ1c3RlZDowfSxIcD1ObihPbCksTmE9dHQoe30sT2wse3ZpZXc6MCxkZXRhaWw6MH0pLF8kPU5uKE5hKSxWZCxIZCxycyxXYz10dCh7fSxOYSx7c2NyZWVuWDowLHNjcmVlblk6MCxjbGllbnRYOjAsY2xpZW50WTowLHBhZ2VYOjAscGFnZVk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxhbHRLZXk6MCxtZXRhS2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTpLcCxidXR0b246MCxidXR0b25zOjAscmVsYXRlZFRhcmdldDpmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWxhdGVkVGFyZ2V0PT09dm9pZCAwP2UuZnJvbUVsZW1lbnQ9PT1lLnNyY0VsZW1lbnQ/ZS50b0VsZW1lbnQ6ZS5mcm9tRWxlbWVudDplLnJlbGF0ZWRUYXJnZXR9LG1vdmVtZW50WDpmdW5jdGlvbihlKXtyZXR1cm4ibW92ZW1lbnRYImluIGU/ZS5tb3ZlbWVudFg6KGUhPT1ycyYmKHJzJiZlLnR5cGU9PT0ibW91c2Vtb3ZlIj8oVmQ9ZS5zY3JlZW5YLXJzLnNjcmVlblgsSGQ9ZS5zY3JlZW5ZLXJzLnNjcmVlblkpOkhkPVZkPTAscnM9ZSksVmQpfSxtb3ZlbWVudFk6ZnVuY3Rpb24oZSl7cmV0dXJuIm1vdmVtZW50WSJpbiBlP2UubW92ZW1lbnRZOkhkfX0pLG52PU5uKFdjKSx3JD10dCh7fSxXYyx7ZGF0YVRyYW5zZmVyOjB9KSxTJD1Obih3JCksRSQ9dHQoe30sTmEse3JlbGF0ZWRUYXJnZXQ6MH0pLEtkPU5uKEUkKSxDJD10dCh7fSxPbCx7YW5pbWF0aW9uTmFtZTowLGVsYXBzZWRUaW1lOjAscHNldWRvRWxlbWVudDowfSksJCQ9Tm4oQyQpLGskPXR0KHt9LE9sLHtjbGlwYm9hcmREYXRhOmZ1bmN0aW9uKGUpe3JldHVybiJjbGlwYm9hcmREYXRhImluIGU/ZS5jbGlwYm9hcmREYXRhOndpbmRvdy5jbGlwYm9hcmREYXRhfX0pLFQkPU5uKGskKSxOJD10dCh7fSxPbCx7ZGF0YTowfSkscnY9Tm4oTiQpLGIkPXtFc2M6IkVzY2FwZSIsU3BhY2ViYXI6IiAiLExlZnQ6IkFycm93TGVmdCIsVXA6IkFycm93VXAiLFJpZ2h0OiJBcnJvd1JpZ2h0IixEb3duOiJBcnJvd0Rvd24iLERlbDoiRGVsZXRlIixXaW46Ik9TIixNZW51OiJDb250ZXh0TWVudSIsQXBwczoiQ29udGV4dE1lbnUiLFNjcm9sbDoiU2Nyb2xsTG9jayIsTW96UHJpbnRhYmxlS2V5OiJVbmlkZW50aWZpZWQifSxSJD17ODoiQmFja3NwYWNlIiw5OiJUYWIiLDEyOiJDbGVhciIsMTM6IkVudGVyIiwxNjoiU2hpZnQiLDE3OiJDb250cm9sIiwxODoiQWx0IiwxOToiUGF1c2UiLDIwOiJDYXBzTG9jayIsMjc6IkVzY2FwZSIsMzI6IiAiLDMzOiJQYWdlVXAiLDM0OiJQYWdlRG93biIsMzU6IkVuZCIsMzY6IkhvbWUiLDM3OiJBcnJvd0xlZnQiLDM4OiJBcnJvd1VwIiwzOToiQXJyb3dSaWdodCIsNDA6IkFycm93RG93biIsNDU6Ikluc2VydCIsNDY6IkRlbGV0ZSIsMTEyOiJGMSIsMTEzOiJGMiIsMTE0OiJGMyIsMTE1OiJGNCIsMTE2OiJGNSIsMTE3OiJGNiIsMTE4OiJGNyIsMTE5OiJGOCIsMTIwOiJGOSIsMTIxOiJGMTAiLDEyMjoiRjExIiwxMjM6IkYxMiIsMTQ0OiJOdW1Mb2NrIiwxNDU6IlNjcm9sbExvY2siLDIyNDoiTWV0YSJ9LFAkPXtBbHQ6ImFsdEtleSIsQ29udHJvbDoiY3RybEtleSIsTWV0YToibWV0YUtleSIsU2hpZnQ6InNoaWZ0S2V5In07ZnVuY3Rpb24gTyQoZSl7dmFyIHQ9dGhpcy5uYXRpdmVFdmVudDtyZXR1cm4gdC5nZXRNb2RpZmllclN0YXRlP3QuZ2V0TW9kaWZpZXJTdGF0ZShlKTooZT1QJFtlXSk/ISF0W2VdOiExfWZ1bmN0aW9uIEtwKCl7cmV0dXJuIE8kfXZhciBBJD10dCh7fSxOYSx7a2V5OmZ1bmN0aW9uKGUpe2lmKGUua2V5KXt2YXIgdD1iJFtlLmtleV18fGUua2V5O2lmKHQhPT0iVW5pZGVudGlmaWVkIilyZXR1cm4gdH1yZXR1cm4gZS50eXBlPT09ImtleXByZXNzIj8oZT1rdShlKSxlPT09MTM/IkVudGVyIjpTdHJpbmcuZnJvbUNoYXJDb2RlKGUpKTplLnR5cGU9PT0ia2V5ZG93biJ8fGUudHlwZT09PSJrZXl1cCI/UiRbZS5rZXlDb2RlXXx8IlVuaWRlbnRpZmllZCI6IiJ9LGNvZGU6MCxsb2NhdGlvbjowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxyZXBlYXQ6MCxsb2NhbGU6MCxnZXRNb2RpZmllclN0YXRlOktwLGNoYXJDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnR5cGU9PT0ia2V5cHJlc3MiP2t1KGUpOjB9LGtleUNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PSJrZXlkb3duInx8ZS50eXBlPT09ImtleXVwIj9lLmtleUNvZGU6MH0sd2hpY2g6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudHlwZT09PSJrZXlwcmVzcyI/a3UoZSk6ZS50eXBlPT09ImtleWRvd24ifHxlLnR5cGU9PT0ia2V5dXAiP2Uua2V5Q29kZTowfX0pLE0kPU5uKEEkKSxEJD10dCh7fSxXYyx7cG9pbnRlcklkOjAsd2lkdGg6MCxoZWlnaHQ6MCxwcmVzc3VyZTowLHRhbmdlbnRpYWxQcmVzc3VyZTowLHRpbHRYOjAsdGlsdFk6MCx0d2lzdDowLHBvaW50ZXJUeXBlOjAsaXNQcmltYXJ5OjB9KSxvdj1ObihEJCksTCQ9dHQoe30sTmEse3RvdWNoZXM6MCx0YXJnZXRUb3VjaGVzOjAsY2hhbmdlZFRvdWNoZXM6MCxhbHRLZXk6MCxtZXRhS2V5OjAsY3RybEtleTowLHNoaWZ0S2V5OjAsZ2V0TW9kaWZpZXJTdGF0ZTpLcH0pLEkkPU5uKEwkKSxqJD10dCh7fSxPbCx7cHJvcGVydHlOYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSx6JD1ObihqJCksRiQ9dHQoe30sV2Mse2RlbHRhWDpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFYImluIGU/ZS5kZWx0YVg6IndoZWVsRGVsdGFYImluIGU/LWUud2hlZWxEZWx0YVg6MH0sZGVsdGFZOmZ1bmN0aW9uKGUpe3JldHVybiJkZWx0YVkiaW4gZT9lLmRlbHRhWToid2hlZWxEZWx0YVkiaW4gZT8tZS53aGVlbERlbHRhWToid2hlZWxEZWx0YSJpbiBlPy1lLndoZWVsRGVsdGE6MH0sZGVsdGFaOjAsZGVsdGFNb2RlOjB9KSxCJD1ObihGJCksVyQ9WzksMTMsMjcsMzJdLEdwPUlyJiYiQ29tcG9zaXRpb25FdmVudCJpbiB3aW5kb3csQ3M9bnVsbDtJciYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmKENzPWRvY3VtZW50LmRvY3VtZW50TW9kZSk7dmFyIFUkPUlyJiYiVGV4dEV2ZW50ImluIHdpbmRvdyYmIUNzLEwxPUlyJiYoIUdwfHxDcyYmODxDcyYmMTE+PUNzKSxpdj1TdHJpbmcuZnJvbUNoYXJDb2RlKDMyKSxsdj0hMTtmdW5jdGlvbiBJMShlLHQpe3N3aXRjaChlKXtjYXNlImtleXVwIjpyZXR1cm4gVyQuaW5kZXhPZih0LmtleUNvZGUpIT09LTE7Y2FzZSJrZXlkb3duIjpyZXR1cm4gdC5rZXlDb2RlIT09MjI5O2Nhc2Uia2V5cHJlc3MiOmNhc2UibW91c2Vkb3duIjpjYXNlImZvY3Vzb3V0IjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBqMShlKXtyZXR1cm4gZT1lLmRldGFpbCx0eXBlb2YgZT09Im9iamVjdCImJiJkYXRhImluIGU/ZS5kYXRhOm51bGx9dmFyIFZpPSExO2Z1bmN0aW9uIFYkKGUsdCl7c3dpdGNoKGUpe2Nhc2UiY29tcG9zaXRpb25lbmQiOnJldHVybiBqMSh0KTtjYXNlImtleXByZXNzIjpyZXR1cm4gdC53aGljaCE9PTMyP251bGw6KGx2PSEwLGl2KTtjYXNlInRleHRJbnB1dCI6cmV0dXJuIGU9dC5kYXRhLGU9PT1pdiYmbHY/bnVsbDplO2RlZmF1bHQ6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIEgkKGUsdCl7aWYoVmkpcmV0dXJuIGU9PT0iY29tcG9zaXRpb25lbmQifHwhR3AmJkkxKGUsdCk/KGU9RDEoKSwkdT1WcD1obz1udWxsLFZpPSExLGUpOm51bGw7c3dpdGNoKGUpe2Nhc2UicGFzdGUiOnJldHVybiBudWxsO2Nhc2Uia2V5cHJlc3MiOmlmKCEodC5jdHJsS2V5fHx0LmFsdEtleXx8dC5tZXRhS2V5KXx8dC5jdHJsS2V5JiZ0LmFsdEtleSl7aWYodC5jaGFyJiYxPHQuY2hhci5sZW5ndGgpcmV0dXJuIHQuY2hhcjtpZih0LndoaWNoKXJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHQud2hpY2gpfXJldHVybiBudWxsO2Nhc2UiY29tcG9zaXRpb25lbmQiOnJldHVybiBMMSYmdC5sb2NhbGUhPT0ia28iP251bGw6dC5kYXRhO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciBLJD17Y29sb3I6ITAsZGF0ZTohMCxkYXRldGltZTohMCwiZGF0ZXRpbWUtbG9jYWwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07ZnVuY3Rpb24gc3YoZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0PT09ImlucHV0Ij8hIUskW2UudHlwZV06dD09PSJ0ZXh0YXJlYSJ9ZnVuY3Rpb24gejEoZSx0LG4scil7bTEociksdD1YdSh0LCJvbkNoYW5nZSIpLDA8dC5sZW5ndGgmJihuPW5ldyBIcCgib25DaGFuZ2UiLCJjaGFuZ2UiLG51bGwsbixyKSxlLnB1c2goe2V2ZW50Om4sbGlzdGVuZXJzOnR9KSl9dmFyICRzPW51bGwsWnM9bnVsbDtmdW5jdGlvbiBHJChlKXtRMShlLDApfWZ1bmN0aW9uIFVjKGUpe3ZhciB0PUdpKGUpO2lmKHUxKHQpKXJldHVybiBlfWZ1bmN0aW9uIFkkKGUsdCl7aWYoZT09PSJjaGFuZ2UiKXJldHVybiB0fXZhciBGMT0hMTtpZihJcil7dmFyIEdkO2lmKElyKXt2YXIgWWQ9Im9uaW5wdXQiaW4gZG9jdW1lbnQ7aWYoIVlkKXt2YXIgYXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YXYuc2V0QXR0cmlidXRlKCJvbmlucHV0IiwicmV0dXJuOyIpLFlkPXR5cGVvZiBhdi5vbmlucHV0PT0iZnVuY3Rpb24ifUdkPVlkfWVsc2UgR2Q9ITE7RjE9R2QmJighZG9jdW1lbnQuZG9jdW1lbnRNb2RlfHw5PGRvY3VtZW50LmRvY3VtZW50TW9kZSl9ZnVuY3Rpb24gdXYoKXskcyYmKCRzLmRldGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixCMSksWnM9JHM9bnVsbCl9ZnVuY3Rpb24gQjEoZSl7aWYoZS5wcm9wZXJ0eU5hbWU9PT0idmFsdWUiJiZVYyhacykpe3ZhciB0PVtdO3oxKHQsWnMsZSx6cChlKSksXzEoRyQsdCl9fWZ1bmN0aW9uIFgkKGUsdCxuKXtlPT09ImZvY3VzaW4iPyh1digpLCRzPXQsWnM9biwkcy5hdHRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsQjEpKTplPT09ImZvY3Vzb3V0IiYmdXYoKX1mdW5jdGlvbiBRJChlKXtpZihlPT09InNlbGVjdGlvbmNoYW5nZSJ8fGU9PT0ia2V5dXAifHxlPT09ImtleWRvd24iKXJldHVybiBVYyhacyl9ZnVuY3Rpb24gSiQoZSx0KXtpZihlPT09ImNsaWNrIilyZXR1cm4gVWModCl9ZnVuY3Rpb24gWiQoZSx0KXtpZihlPT09ImlucHV0Inx8ZT09PSJjaGFuZ2UiKXJldHVybiBVYyh0KX1mdW5jdGlvbiBxJChlLHQpe3JldHVybiBlPT09dCYmKGUhPT0wfHwxL2U9PT0xL3QpfHxlIT09ZSYmdCE9PXR9dmFyIGVyPXR5cGVvZiBPYmplY3QuaXM9PSJmdW5jdGlvbiI/T2JqZWN0LmlzOnEkO2Z1bmN0aW9uIHFzKGUsdCl7aWYoZXIoZSx0KSlyZXR1cm4hMDtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsfHx0eXBlb2YgdCE9Im9iamVjdCJ8fHQ9PT1udWxsKXJldHVybiExO3ZhciBuPU9iamVjdC5rZXlzKGUpLHI9T2JqZWN0LmtleXModCk7aWYobi5sZW5ndGghPT1yLmxlbmd0aClyZXR1cm4hMTtmb3Iocj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdO2lmKCFMZi5jYWxsKHQsbyl8fCFlcihlW29dLHRbb10pKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIGN2KGUpe2Zvcig7ZSYmZS5maXJzdENoaWxkOyllPWUuZmlyc3RDaGlsZDtyZXR1cm4gZX1mdW5jdGlvbiBkdihlLHQpe3ZhciBuPWN2KGUpO2U9MDtmb3IodmFyIHI7bjspe2lmKG4ubm9kZVR5cGU9PT0zKXtpZihyPWUrbi50ZXh0Q29udGVudC5sZW5ndGgsZTw9dCYmcj49dClyZXR1cm57bm9kZTpuLG9mZnNldDp0LWV9O2U9cn1lOntmb3IoO247KXtpZihuLm5leHRTaWJsaW5nKXtuPW4ubmV4dFNpYmxpbmc7YnJlYWsgZX1uPW4ucGFyZW50Tm9kZX1uPXZvaWQgMH1uPWN2KG4pfX1mdW5jdGlvbiBXMShlLHQpe3JldHVybiBlJiZ0P2U9PT10PyEwOmUmJmUubm9kZVR5cGU9PT0zPyExOnQmJnQubm9kZVR5cGU9PT0zP1cxKGUsdC5wYXJlbnROb2RlKToiY29udGFpbnMiaW4gZT9lLmNvbnRhaW5zKHQpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSYxNik6ITE6ITF9ZnVuY3Rpb24gVTEoKXtmb3IodmFyIGU9d2luZG93LHQ9V3UoKTt0IGluc3RhbmNlb2YgZS5IVE1MSUZyYW1lRWxlbWVudDspe3RyeXt2YXIgbj10eXBlb2YgdC5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWY9PSJzdHJpbmcifWNhdGNoe249ITF9aWYobillPXQuY29udGVudFdpbmRvdztlbHNlIGJyZWFrO3Q9V3UoZS5kb2N1bWVudCl9cmV0dXJuIHR9ZnVuY3Rpb24gWXAoZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0JiYodD09PSJpbnB1dCImJihlLnR5cGU9PT0idGV4dCJ8fGUudHlwZT09PSJzZWFyY2gifHxlLnR5cGU9PT0idGVsInx8ZS50eXBlPT09InVybCJ8fGUudHlwZT09PSJwYXNzd29yZCIpfHx0PT09InRleHRhcmVhInx8ZS5jb250ZW50RWRpdGFibGU9PT0idHJ1ZSIpfWZ1bmN0aW9uIGVrKGUpe3ZhciB0PVUxKCksbj1lLmZvY3VzZWRFbGVtLHI9ZS5zZWxlY3Rpb25SYW5nZTtpZih0IT09biYmbiYmbi5vd25lckRvY3VtZW50JiZXMShuLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG4pKXtpZihyIT09bnVsbCYmWXAobikpe2lmKHQ9ci5zdGFydCxlPXIuZW5kLGU9PT12b2lkIDAmJihlPXQpLCJzZWxlY3Rpb25TdGFydCJpbiBuKW4uc2VsZWN0aW9uU3RhcnQ9dCxuLnNlbGVjdGlvbkVuZD1NYXRoLm1pbihlLG4udmFsdWUubGVuZ3RoKTtlbHNlIGlmKGU9KHQ9bi5vd25lckRvY3VtZW50fHxkb2N1bWVudCkmJnQuZGVmYXVsdFZpZXd8fHdpbmRvdyxlLmdldFNlbGVjdGlvbil7ZT1lLmdldFNlbGVjdGlvbigpO3ZhciBvPW4udGV4dENvbnRlbnQubGVuZ3RoLGk9TWF0aC5taW4oci5zdGFydCxvKTtyPXIuZW5kPT09dm9pZCAwP2k6TWF0aC5taW4oci5lbmQsbyksIWUuZXh0ZW5kJiZpPnImJihvPXIscj1pLGk9byksbz1kdihuLGkpO3ZhciBsPWR2KG4scik7byYmbCYmKGUucmFuZ2VDb3VudCE9PTF8fGUuYW5jaG9yTm9kZSE9PW8ubm9kZXx8ZS5hbmNob3JPZmZzZXQhPT1vLm9mZnNldHx8ZS5mb2N1c05vZGUhPT1sLm5vZGV8fGUuZm9jdXNPZmZzZXQhPT1sLm9mZnNldCkmJih0PXQuY3JlYXRlUmFuZ2UoKSx0LnNldFN0YXJ0KG8ubm9kZSxvLm9mZnNldCksZS5yZW1vdmVBbGxSYW5nZXMoKSxpPnI/KGUuYWRkUmFuZ2UodCksZS5leHRlbmQobC5ub2RlLGwub2Zmc2V0KSk6KHQuc2V0RW5kKGwubm9kZSxsLm9mZnNldCksZS5hZGRSYW5nZSh0KSkpfX1mb3IodD1bXSxlPW47ZT1lLnBhcmVudE5vZGU7KWUubm9kZVR5cGU9PT0xJiZ0LnB1c2goe2VsZW1lbnQ6ZSxsZWZ0OmUuc2Nyb2xsTGVmdCx0b3A6ZS5zY3JvbGxUb3B9KTtmb3IodHlwZW9mIG4uZm9jdXM9PSJmdW5jdGlvbiImJm4uZm9jdXMoKSxuPTA7bjx0Lmxlbmd0aDtuKyspZT10W25dLGUuZWxlbWVudC5zY3JvbGxMZWZ0PWUubGVmdCxlLmVsZW1lbnQuc2Nyb2xsVG9wPWUudG9wfX12YXIgdGs9SXImJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJjExPj1kb2N1bWVudC5kb2N1bWVudE1vZGUsSGk9bnVsbCx0aD1udWxsLGtzPW51bGwsbmg9ITE7ZnVuY3Rpb24gZnYoZSx0LG4pe3ZhciByPW4ud2luZG93PT09bj9uLmRvY3VtZW50Om4ubm9kZVR5cGU9PT05P246bi5vd25lckRvY3VtZW50O25ofHxIaT09bnVsbHx8SGkhPT1XdShyKXx8KHI9SGksInNlbGVjdGlvblN0YXJ0ImluIHImJllwKHIpP3I9e3N0YXJ0OnIuc2VsZWN0aW9uU3RhcnQsZW5kOnIuc2VsZWN0aW9uRW5kfToocj0oci5vd25lckRvY3VtZW50JiZyLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCkscj17YW5jaG9yTm9kZTpyLmFuY2hvck5vZGUsYW5jaG9yT2Zmc2V0OnIuYW5jaG9yT2Zmc2V0LGZvY3VzTm9kZTpyLmZvY3VzTm9kZSxmb2N1c09mZnNldDpyLmZvY3VzT2Zmc2V0fSksa3MmJnFzKGtzLHIpfHwoa3M9cixyPVh1KHRoLCJvblNlbGVjdCIpLDA8ci5sZW5ndGgmJih0PW5ldyBIcCgib25TZWxlY3QiLCJzZWxlY3QiLG51bGwsdCxuKSxlLnB1c2goe2V2ZW50OnQsbGlzdGVuZXJzOnJ9KSx0LnRhcmdldD1IaSkpKX1mdW5jdGlvbiBldShlLHQpe3ZhciBuPXt9O3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV09dC50b0xvd2VyQ2FzZSgpLG5bIldlYmtpdCIrZV09IndlYmtpdCIrdCxuWyJNb3oiK2VdPSJtb3oiK3Qsbn12YXIgS2k9e2FuaW1hdGlvbmVuZDpldSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uRW5kIiksYW5pbWF0aW9uaXRlcmF0aW9uOmV1KCJBbmltYXRpb24iLCJBbmltYXRpb25JdGVyYXRpb24iKSxhbmltYXRpb25zdGFydDpldSgiQW5pbWF0aW9uIiwiQW5pbWF0aW9uU3RhcnQiKSx0cmFuc2l0aW9uZW5kOmV1KCJUcmFuc2l0aW9uIiwiVHJhbnNpdGlvbkVuZCIpfSxYZD17fSxWMT17fTtJciYmKFYxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJBbmltYXRpb25FdmVudCJpbiB3aW5kb3d8fChkZWxldGUgS2kuYW5pbWF0aW9uZW5kLmFuaW1hdGlvbixkZWxldGUgS2kuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgS2kuYW5pbWF0aW9uc3RhcnQuYW5pbWF0aW9uKSwiVHJhbnNpdGlvbkV2ZW50ImluIHdpbmRvd3x8ZGVsZXRlIEtpLnRyYW5zaXRpb25lbmQudHJhbnNpdGlvbik7ZnVuY3Rpb24gVmMoZSl7aWYoWGRbZV0pcmV0dXJuIFhkW2VdO2lmKCFLaVtlXSlyZXR1cm4gZTt2YXIgdD1LaVtlXSxuO2ZvcihuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSYmbiBpbiBWMSlyZXR1cm4gWGRbZV09dFtuXTtyZXR1cm4gZX12YXIgSDE9VmMoImFuaW1hdGlvbmVuZCIpLEsxPVZjKCJhbmltYXRpb25pdGVyYXRpb24iKSxHMT1WYygiYW5pbWF0aW9uc3RhcnQiKSxZMT1WYygidHJhbnNpdGlvbmVuZCIpLFgxPW5ldyBNYXAsaHY9ImFib3J0IGF1eENsaWNrIGNhbmNlbCBjYW5QbGF5IGNhblBsYXlUaHJvdWdoIGNsaWNrIGNsb3NlIGNvbnRleHRNZW51IGNvcHkgY3V0IGRyYWcgZHJhZ0VuZCBkcmFnRW50ZXIgZHJhZ0V4aXQgZHJhZ0xlYXZlIGRyYWdPdmVyIGRyYWdTdGFydCBkcm9wIGR1cmF0aW9uQ2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGdvdFBvaW50ZXJDYXB0dXJlIGlucHV0IGludmFsaWQga2V5RG93biBrZXlQcmVzcyBrZXlVcCBsb2FkIGxvYWRlZERhdGEgbG9hZGVkTWV0YWRhdGEgbG9hZFN0YXJ0IGxvc3RQb2ludGVyQ2FwdHVyZSBtb3VzZURvd24gbW91c2VNb3ZlIG1vdXNlT3V0IG1vdXNlT3ZlciBtb3VzZVVwIHBhc3RlIHBhdXNlIHBsYXkgcGxheWluZyBwb2ludGVyQ2FuY2VsIHBvaW50ZXJEb3duIHBvaW50ZXJNb3ZlIHBvaW50ZXJPdXQgcG9pbnRlck92ZXIgcG9pbnRlclVwIHByb2dyZXNzIHJhdGVDaGFuZ2UgcmVzZXQgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VibWl0IHN1c3BlbmQgdGltZVVwZGF0ZSB0b3VjaENhbmNlbCB0b3VjaEVuZCB0b3VjaFN0YXJ0IHZvbHVtZUNoYW5nZSBzY3JvbGwgdG9nZ2xlIHRvdWNoTW92ZSB3YWl0aW5nIHdoZWVsIi5zcGxpdCgiICIpO2Z1bmN0aW9uIElvKGUsdCl7WDEuc2V0KGUsdCkseWkodCxbZV0pfWZvcih2YXIgUWQ9MDtRZDxodi5sZW5ndGg7UWQrKyl7dmFyIEpkPWh2W1FkXSxuaz1KZC50b0xvd2VyQ2FzZSgpLHJrPUpkWzBdLnRvVXBwZXJDYXNlKCkrSmQuc2xpY2UoMSk7SW8obmssIm9uIityayl9SW8oSDEsIm9uQW5pbWF0aW9uRW5kIik7SW8oSzEsIm9uQW5pbWF0aW9uSXRlcmF0aW9uIik7SW8oRzEsIm9uQW5pbWF0aW9uU3RhcnQiKTtJbygiZGJsY2xpY2siLCJvbkRvdWJsZUNsaWNrIik7SW8oImZvY3VzaW4iLCJvbkZvY3VzIik7SW8oImZvY3Vzb3V0Iiwib25CbHVyIik7SW8oWTEsIm9uVHJhbnNpdGlvbkVuZCIpO2dsKCJvbk1vdXNlRW50ZXIiLFsibW91c2VvdXQiLCJtb3VzZW92ZXIiXSk7Z2woIm9uTW91c2VMZWF2ZSIsWyJtb3VzZW91dCIsIm1vdXNlb3ZlciJdKTtnbCgib25Qb2ludGVyRW50ZXIiLFsicG9pbnRlcm91dCIsInBvaW50ZXJvdmVyIl0pO2dsKCJvblBvaW50ZXJMZWF2ZSIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSk7eWkoIm9uQ2hhbmdlIiwiY2hhbmdlIGNsaWNrIGZvY3VzaW4gZm9jdXNvdXQgaW5wdXQga2V5ZG93biBrZXl1cCBzZWxlY3Rpb25jaGFuZ2UiLnNwbGl0KCIgIikpO3lpKCJvblNlbGVjdCIsImZvY3Vzb3V0IGNvbnRleHRtZW51IGRyYWdlbmQgZm9jdXNpbiBrZXlkb3duIGtleXVwIG1vdXNlZG93biBtb3VzZXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSk7eWkoIm9uQmVmb3JlSW5wdXQiLFsiY29tcG9zaXRpb25lbmQiLCJrZXlwcmVzcyIsInRleHRJbnB1dCIsInBhc3RlIl0pO3lpKCJvbkNvbXBvc2l0aW9uRW5kIiwiY29tcG9zaXRpb25lbmQgZm9jdXNvdXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBtb3VzZWRvd24iLnNwbGl0KCIgIikpO3lpKCJvbkNvbXBvc2l0aW9uU3RhcnQiLCJjb21wb3NpdGlvbnN0YXJ0IGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTt5aSgib25Db21wb3NpdGlvblVwZGF0ZSIsImNvbXBvc2l0aW9udXBkYXRlIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTt2YXIgdnM9ImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nIi5zcGxpdCgiICIpLG9rPW5ldyBTZXQoImNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHRvZ2dsZSIuc3BsaXQoIiAiKS5jb25jYXQodnMpKTtmdW5jdGlvbiBwdihlLHQsbil7dmFyIHI9ZS50eXBlfHwidW5rbm93bi1ldmVudCI7ZS5jdXJyZW50VGFyZ2V0PW4sbiQocix0LHZvaWQgMCxlKSxlLmN1cnJlbnRUYXJnZXQ9bnVsbH1mdW5jdGlvbiBRMShlLHQpe3Q9KHQmNCkhPT0wO2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dLG89ci5ldmVudDtyPXIubGlzdGVuZXJzO2U6e3ZhciBpPXZvaWQgMDtpZih0KWZvcih2YXIgbD1yLmxlbmd0aC0xOzA8PWw7bC0tKXt2YXIgcz1yW2xdLGE9cy5pbnN0YW5jZSx1PXMuY3VycmVudFRhcmdldDtpZihzPXMubGlzdGVuZXIsYSE9PWkmJm8uaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBlO3B2KG8scyx1KSxpPWF9ZWxzZSBmb3IobD0wO2w8ci5sZW5ndGg7bCsrKXtpZihzPXJbbF0sYT1zLmluc3RhbmNlLHU9cy5jdXJyZW50VGFyZ2V0LHM9cy5saXN0ZW5lcixhIT09aSYmby5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKWJyZWFrIGU7cHYobyxzLHUpLGk9YX19fWlmKFZ1KXRocm93IGU9SmYsVnU9ITEsSmY9bnVsbCxlfWZ1bmN0aW9uIFVlKGUsdCl7dmFyIG49dFtzaF07bj09PXZvaWQgMCYmKG49dFtzaF09bmV3IFNldCk7dmFyIHI9ZSsiX19idWJibGUiO24uaGFzKHIpfHwoSjEodCxlLDIsITEpLG4uYWRkKHIpKX1mdW5jdGlvbiBaZChlLHQsbil7dmFyIHI9MDt0JiYocnw9NCksSjEobixlLHIsdCl9dmFyIHR1PSJfcmVhY3RMaXN0ZW5pbmciK01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpO2Z1bmN0aW9uIGVhKGUpe2lmKCFlW3R1XSl7ZVt0dV09ITAsbzEuZm9yRWFjaChmdW5jdGlvbihuKXtuIT09InNlbGVjdGlvbmNoYW5nZSImJihvay5oYXMobil8fFpkKG4sITEsZSksWmQobiwhMCxlKSl9KTt2YXIgdD1lLm5vZGVUeXBlPT09OT9lOmUub3duZXJEb2N1bWVudDt0PT09bnVsbHx8dFt0dV18fCh0W3R1XT0hMCxaZCgic2VsZWN0aW9uY2hhbmdlIiwhMSx0KSl9fWZ1bmN0aW9uIEoxKGUsdCxuLHIpe3N3aXRjaChNMSh0KSl7Y2FzZSAxOnZhciBvPXkkO2JyZWFrO2Nhc2UgNDpvPXgkO2JyZWFrO2RlZmF1bHQ6bz1VcH1uPW8uYmluZChudWxsLHQsbixlKSxvPXZvaWQgMCwhUWZ8fHQhPT0idG91Y2hzdGFydCImJnQhPT0idG91Y2htb3ZlIiYmdCE9PSJ3aGVlbCJ8fChvPSEwKSxyP28hPT12b2lkIDA/ZS5hZGRFdmVudExpc3RlbmVyKHQsbix7Y2FwdHVyZTohMCxwYXNzaXZlOm99KTplLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKTpvIT09dm9pZCAwP2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4se3Bhc3NpdmU6b30pOmUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpfWZ1bmN0aW9uIHFkKGUsdCxuLHIsbyl7dmFyIGk9cjtpZighKHQmMSkmJiEodCYyKSYmciE9PW51bGwpZTpmb3IoOzspe2lmKHI9PT1udWxsKXJldHVybjt2YXIgbD1yLnRhZztpZihsPT09M3x8bD09PTQpe3ZhciBzPXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm87aWYocz09PW98fHMubm9kZVR5cGU9PT04JiZzLnBhcmVudE5vZGU9PT1vKWJyZWFrO2lmKGw9PT00KWZvcihsPXIucmV0dXJuO2whPT1udWxsOyl7dmFyIGE9bC50YWc7aWYoKGE9PT0zfHxhPT09NCkmJihhPWwuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8sYT09PW98fGEubm9kZVR5cGU9PT04JiZhLnBhcmVudE5vZGU9PT1vKSlyZXR1cm47bD1sLnJldHVybn1mb3IoO3MhPT1udWxsOyl7aWYobD1RbyhzKSxsPT09bnVsbClyZXR1cm47aWYoYT1sLnRhZyxhPT09NXx8YT09PTYpe3I9aT1sO2NvbnRpbnVlIGV9cz1zLnBhcmVudE5vZGV9fXI9ci5yZXR1cm59XzEoZnVuY3Rpb24oKXt2YXIgdT1pLGM9enAobiksZD1bXTtlOnt2YXIgZj1YMS5nZXQoZSk7aWYoZiE9PXZvaWQgMCl7dmFyIGg9SHAsZz1lO3N3aXRjaChlKXtjYXNlImtleXByZXNzIjppZihrdShuKT09PTApYnJlYWsgZTtjYXNlImtleWRvd24iOmNhc2Uia2V5dXAiOmg9TSQ7YnJlYWs7Y2FzZSJmb2N1c2luIjpnPSJmb2N1cyIsaD1LZDticmVhaztjYXNlImZvY3Vzb3V0IjpnPSJibHVyIixoPUtkO2JyZWFrO2Nhc2UiYmVmb3JlYmx1ciI6Y2FzZSJhZnRlcmJsdXIiOmg9S2Q7YnJlYWs7Y2FzZSJjbGljayI6aWYobi5idXR0b249PT0yKWJyZWFrIGU7Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJtb3VzZWRvd24iOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNldXAiOmNhc2UibW91c2VvdXQiOmNhc2UibW91c2VvdmVyIjpjYXNlImNvbnRleHRtZW51IjpoPW52O2JyZWFrO2Nhc2UiZHJhZyI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UiZHJhZ3N0YXJ0IjpjYXNlImRyb3AiOmg9UyQ7YnJlYWs7Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaG1vdmUiOmNhc2UidG91Y2hzdGFydCI6aD1JJDticmVhaztjYXNlIEgxOmNhc2UgSzE6Y2FzZSBHMTpoPSQkO2JyZWFrO2Nhc2UgWTE6aD16JDticmVhaztjYXNlInNjcm9sbCI6aD1fJDticmVhaztjYXNlIndoZWVsIjpoPUIkO2JyZWFrO2Nhc2UiY29weSI6Y2FzZSJjdXQiOmNhc2UicGFzdGUiOmg9VCQ7YnJlYWs7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJsb3N0cG9pbnRlcmNhcHR1cmUiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInBvaW50ZXJ1cCI6aD1vdn12YXIgbT0odCY0KSE9PTAsUz0hbSYmZT09PSJzY3JvbGwiLHY9bT9mIT09bnVsbD9mKyJDYXB0dXJlIjpudWxsOmY7bT1bXTtmb3IodmFyIHk9dSx4O3khPT1udWxsOyl7eD15O3ZhciBfPXguc3RhdGVOb2RlO2lmKHgudGFnPT09NSYmXyE9PW51bGwmJih4PV8sdiE9PW51bGwmJihfPVlzKHksdiksXyE9bnVsbCYmbS5wdXNoKHRhKHksXyx4KSkpKSxTKWJyZWFrO3k9eS5yZXR1cm59MDxtLmxlbmd0aCYmKGY9bmV3IGgoZixnLG51bGwsbixjKSxkLnB1c2goe2V2ZW50OmYsbGlzdGVuZXJzOm19KSl9fWlmKCEodCY3KSl7ZTp7aWYoZj1lPT09Im1vdXNlb3ZlciJ8fGU9PT0icG9pbnRlcm92ZXIiLGg9ZT09PSJtb3VzZW91dCJ8fGU9PT0icG9pbnRlcm91dCIsZiYmbiE9PVlmJiYoZz1uLnJlbGF0ZWRUYXJnZXR8fG4uZnJvbUVsZW1lbnQpJiYoUW8oZyl8fGdbanJdKSlicmVhayBlO2lmKChofHxmKSYmKGY9Yy53aW5kb3c9PT1jP2M6KGY9Yy5vd25lckRvY3VtZW50KT9mLmRlZmF1bHRWaWV3fHxmLnBhcmVudFdpbmRvdzp3aW5kb3csaD8oZz1uLnJlbGF0ZWRUYXJnZXR8fG4udG9FbGVtZW50LGg9dSxnPWc/UW8oZyk6bnVsbCxnIT09bnVsbCYmKFM9eGkoZyksZyE9PVN8fGcudGFnIT09NSYmZy50YWchPT02KSYmKGc9bnVsbCkpOihoPW51bGwsZz11KSxoIT09Zykpe2lmKG09bnYsXz0ib25Nb3VzZUxlYXZlIix2PSJvbk1vdXNlRW50ZXIiLHk9Im1vdXNlIiwoZT09PSJwb2ludGVyb3V0Inx8ZT09PSJwb2ludGVyb3ZlciIpJiYobT1vdixfPSJvblBvaW50ZXJMZWF2ZSIsdj0ib25Qb2ludGVyRW50ZXIiLHk9InBvaW50ZXIiKSxTPWg9PW51bGw/ZjpHaShoKSx4PWc9PW51bGw/ZjpHaShnKSxmPW5ldyBtKF8seSsibGVhdmUiLGgsbixjKSxmLnRhcmdldD1TLGYucmVsYXRlZFRhcmdldD14LF89bnVsbCxRbyhjKT09PXUmJihtPW5ldyBtKHYseSsiZW50ZXIiLGcsbixjKSxtLnRhcmdldD14LG0ucmVsYXRlZFRhcmdldD1TLF89bSksUz1fLGgmJmcpdDp7Zm9yKG09aCx2PWcseT0wLHg9bTt4O3g9UGkoeCkpeSsrO2Zvcih4PTAsXz12O187Xz1QaShfKSl4Kys7Zm9yKDswPHkteDspbT1QaShtKSx5LS07Zm9yKDswPHgteTspdj1QaSh2KSx4LS07Zm9yKDt5LS07KXtpZihtPT09dnx8diE9PW51bGwmJm09PT12LmFsdGVybmF0ZSlicmVhayB0O209UGkobSksdj1QaSh2KX1tPW51bGx9ZWxzZSBtPW51bGw7aCE9PW51bGwmJmd2KGQsZixoLG0sITEpLGchPT1udWxsJiZTIT09bnVsbCYmZ3YoZCxTLGcsbSwhMCl9fWU6e2lmKGY9dT9HaSh1KTp3aW5kb3csaD1mLm5vZGVOYW1lJiZmLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksaD09PSJzZWxlY3QifHxoPT09ImlucHV0IiYmZi50eXBlPT09ImZpbGUiKXZhciBFPVkkO2Vsc2UgaWYoc3YoZikpaWYoRjEpRT1aJDtlbHNle0U9USQ7dmFyICQ9WCR9ZWxzZShoPWYubm9kZU5hbWUpJiZoLnRvTG93ZXJDYXNlKCk9PT0iaW5wdXQiJiYoZi50eXBlPT09ImNoZWNrYm94Inx8Zi50eXBlPT09InJhZGlvIikmJihFPUokKTtpZihFJiYoRT1FKGUsdSkpKXt6MShkLEUsbixjKTticmVhayBlfSQmJiQoZSxmLHUpLGU9PT0iZm9jdXNvdXQiJiYoJD1mLl93cmFwcGVyU3RhdGUpJiYkLmNvbnRyb2xsZWQmJmYudHlwZT09PSJudW1iZXIiJiZVZihmLCJudW1iZXIiLGYudmFsdWUpfXN3aXRjaCgkPXU/R2kodSk6d2luZG93LGUpe2Nhc2UiZm9jdXNpbiI6KHN2KCQpfHwkLmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIikmJihIaT0kLHRoPXUsa3M9bnVsbCk7YnJlYWs7Y2FzZSJmb2N1c291dCI6a3M9dGg9SGk9bnVsbDticmVhaztjYXNlIm1vdXNlZG93biI6bmg9ITA7YnJlYWs7Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJtb3VzZXVwIjpjYXNlImRyYWdlbmQiOm5oPSExLGZ2KGQsbixjKTticmVhaztjYXNlInNlbGVjdGlvbmNoYW5nZSI6aWYodGspYnJlYWs7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjpmdihkLG4sYyl9dmFyIEM7aWYoR3ApZTp7c3dpdGNoKGUpe2Nhc2UiY29tcG9zaXRpb25zdGFydCI6dmFyIFQ9Im9uQ29tcG9zaXRpb25TdGFydCI7YnJlYWsgZTtjYXNlImNvbXBvc2l0aW9uZW5kIjpUPSJvbkNvbXBvc2l0aW9uRW5kIjticmVhayBlO2Nhc2UiY29tcG9zaXRpb251cGRhdGUiOlQ9Im9uQ29tcG9zaXRpb25VcGRhdGUiO2JyZWFrIGV9VD12b2lkIDB9ZWxzZSBWaT9JMShlLG4pJiYoVD0ib25Db21wb3NpdGlvbkVuZCIpOmU9PT0ia2V5ZG93biImJm4ua2V5Q29kZT09PTIyOSYmKFQ9Im9uQ29tcG9zaXRpb25TdGFydCIpO1QmJihMMSYmbi5sb2NhbGUhPT0ia28iJiYoVml8fFQhPT0ib25Db21wb3NpdGlvblN0YXJ0Ij9UPT09Im9uQ29tcG9zaXRpb25FbmQiJiZWaSYmKEM9RDEoKSk6KGhvPWMsVnA9InZhbHVlImluIGhvP2hvLnZhbHVlOmhvLnRleHRDb250ZW50LFZpPSEwKSksJD1YdSh1LFQpLDA8JC5sZW5ndGgmJihUPW5ldyBydihULGUsbnVsbCxuLGMpLGQucHVzaCh7ZXZlbnQ6VCxsaXN0ZW5lcnM6JH0pLEM/VC5kYXRhPUM6KEM9ajEobiksQyE9PW51bGwmJihULmRhdGE9QykpKSksKEM9VSQ/ViQoZSxuKTpIJChlLG4pKSYmKHU9WHUodSwib25CZWZvcmVJbnB1dCIpLDA8dS5sZW5ndGgmJihjPW5ldyBydigib25CZWZvcmVJbnB1dCIsImJlZm9yZWlucHV0IixudWxsLG4sYyksZC5wdXNoKHtldmVudDpjLGxpc3RlbmVyczp1fSksYy5kYXRhPUMpKX1RMShkLHQpfSl9ZnVuY3Rpb24gdGEoZSx0LG4pe3JldHVybntpbnN0YW5jZTplLGxpc3RlbmVyOnQsY3VycmVudFRhcmdldDpufX1mdW5jdGlvbiBYdShlLHQpe2Zvcih2YXIgbj10KyJDYXB0dXJlIixyPVtdO2UhPT1udWxsOyl7dmFyIG89ZSxpPW8uc3RhdGVOb2RlO28udGFnPT09NSYmaSE9PW51bGwmJihvPWksaT1ZcyhlLG4pLGkhPW51bGwmJnIudW5zaGlmdCh0YShlLGksbykpLGk9WXMoZSx0KSxpIT1udWxsJiZyLnB1c2godGEoZSxpLG8pKSksZT1lLnJldHVybn1yZXR1cm4gcn1mdW5jdGlvbiBQaShlKXtpZihlPT09bnVsbClyZXR1cm4gbnVsbDtkbyBlPWUucmV0dXJuO3doaWxlKGUmJmUudGFnIT09NSk7cmV0dXJuIGV8fG51bGx9ZnVuY3Rpb24gZ3YoZSx0LG4scixvKXtmb3IodmFyIGk9dC5fcmVhY3ROYW1lLGw9W107biE9PW51bGwmJm4hPT1yOyl7dmFyIHM9bixhPXMuYWx0ZXJuYXRlLHU9cy5zdGF0ZU5vZGU7aWYoYSE9PW51bGwmJmE9PT1yKWJyZWFrO3MudGFnPT09NSYmdSE9PW51bGwmJihzPXUsbz8oYT1ZcyhuLGkpLGEhPW51bGwmJmwudW5zaGlmdCh0YShuLGEscykpKTpvfHwoYT1ZcyhuLGkpLGEhPW51bGwmJmwucHVzaCh0YShuLGEscykpKSksbj1uLnJldHVybn1sLmxlbmd0aCE9PTAmJmUucHVzaCh7ZXZlbnQ6dCxsaXN0ZW5lcnM6bH0pfXZhciBpaz0vXHJcbj8vZyxsaz0vXHUwMDAwfFx1RkZGRC9nO2Z1bmN0aW9uIG12KGUpe3JldHVybih0eXBlb2YgZT09InN0cmluZyI/ZToiIitlKS5yZXBsYWNlKGlrLGAKYCkucmVwbGFjZShsaywiIil9ZnVuY3Rpb24gbnUoZSx0LG4pe2lmKHQ9bXYodCksbXYoZSkhPT10JiZuKXRocm93IEVycm9yKFcoNDI1KSl9ZnVuY3Rpb24gUXUoKXt9dmFyIHJoPW51bGwsb2g9bnVsbDtmdW5jdGlvbiBpaChlLHQpe3JldHVybiBlPT09InRleHRhcmVhInx8ZT09PSJub3NjcmlwdCJ8fHR5cGVvZiB0LmNoaWxkcmVuPT0ic3RyaW5nInx8dHlwZW9mIHQuY2hpbGRyZW49PSJudW1iZXIifHx0eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTD09Im9iamVjdCImJnQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwhPT1udWxsJiZ0LmRhbmdlcm91c2x5U2V0SW5uZXJIVE1MLl9faHRtbCE9bnVsbH12YXIgbGg9dHlwZW9mIHNldFRpbWVvdXQ9PSJmdW5jdGlvbiI/c2V0VGltZW91dDp2b2lkIDAsc2s9dHlwZW9mIGNsZWFyVGltZW91dD09ImZ1bmN0aW9uIj9jbGVhclRpbWVvdXQ6dm9pZCAwLHZ2PXR5cGVvZiBQcm9taXNlPT0iZnVuY3Rpb24iP1Byb21pc2U6dm9pZCAwLGFrPXR5cGVvZiBxdWV1ZU1pY3JvdGFzaz09ImZ1bmN0aW9uIj9xdWV1ZU1pY3JvdGFzazp0eXBlb2YgdnY8InUiP2Z1bmN0aW9uKGUpe3JldHVybiB2di5yZXNvbHZlKG51bGwpLnRoZW4oZSkuY2F0Y2godWspfTpsaDtmdW5jdGlvbiB1ayhlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfWZ1bmN0aW9uIGVmKGUsdCl7dmFyIG49dCxyPTA7ZG97dmFyIG89bi5uZXh0U2libGluZztpZihlLnJlbW92ZUNoaWxkKG4pLG8mJm8ubm9kZVR5cGU9PT04KWlmKG49by5kYXRhLG49PT0iLyQiKXtpZihyPT09MCl7ZS5yZW1vdmVDaGlsZChvKSxKcyh0KTtyZXR1cm59ci0tfWVsc2UgbiE9PSIkIiYmbiE9PSIkPyImJm4hPT0iJCEifHxyKys7bj1vfXdoaWxlKG4pO0pzKHQpfWZ1bmN0aW9uIF9vKGUpe2Zvcig7ZSE9bnVsbDtlPWUubmV4dFNpYmxpbmcpe3ZhciB0PWUubm9kZVR5cGU7aWYodD09PTF8fHQ9PT0zKWJyZWFrO2lmKHQ9PT04KXtpZih0PWUuZGF0YSx0PT09IiQifHx0PT09IiQhInx8dD09PSIkPyIpYnJlYWs7aWYodD09PSIvJCIpcmV0dXJuIG51bGx9fXJldHVybiBlfWZ1bmN0aW9uIHl2KGUpe2U9ZS5wcmV2aW91c1NpYmxpbmc7Zm9yKHZhciB0PTA7ZTspe2lmKGUubm9kZVR5cGU9PT04KXt2YXIgbj1lLmRhdGE7aWYobj09PSIkInx8bj09PSIkISJ8fG49PT0iJD8iKXtpZih0PT09MClyZXR1cm4gZTt0LS19ZWxzZSBuPT09Ii8kIiYmdCsrfWU9ZS5wcmV2aW91c1NpYmxpbmd9cmV0dXJuIG51bGx9dmFyIEFsPU1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpLHVyPSJfX3JlYWN0RmliZXIkIitBbCxuYT0iX19yZWFjdFByb3BzJCIrQWwsanI9Il9fcmVhY3RDb250YWluZXIkIitBbCxzaD0iX19yZWFjdEV2ZW50cyQiK0FsLGNrPSJfX3JlYWN0TGlzdGVuZXJzJCIrQWwsZGs9Il9fcmVhY3RIYW5kbGVzJCIrQWw7ZnVuY3Rpb24gUW8oZSl7dmFyIHQ9ZVt1cl07aWYodClyZXR1cm4gdDtmb3IodmFyIG49ZS5wYXJlbnROb2RlO247KXtpZih0PW5banJdfHxuW3VyXSl7aWYobj10LmFsdGVybmF0ZSx0LmNoaWxkIT09bnVsbHx8biE9PW51bGwmJm4uY2hpbGQhPT1udWxsKWZvcihlPXl2KGUpO2UhPT1udWxsOyl7aWYobj1lW3VyXSlyZXR1cm4gbjtlPXl2KGUpfXJldHVybiB0fWU9bixuPWUucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBiYShlKXtyZXR1cm4gZT1lW3VyXXx8ZVtqcl0sIWV8fGUudGFnIT09NSYmZS50YWchPT02JiZlLnRhZyE9PTEzJiZlLnRhZyE9PTM/bnVsbDplfWZ1bmN0aW9uIEdpKGUpe2lmKGUudGFnPT09NXx8ZS50YWc9PT02KXJldHVybiBlLnN0YXRlTm9kZTt0aHJvdyBFcnJvcihXKDMzKSl9ZnVuY3Rpb24gSGMoZSl7cmV0dXJuIGVbbmFdfHxudWxsfXZhciBhaD1bXSxZaT0tMTtmdW5jdGlvbiBqbyhlKXtyZXR1cm57Y3VycmVudDplfX1mdW5jdGlvbiBHZShlKXswPllpfHwoZS5jdXJyZW50PWFoW1lpXSxhaFtZaV09bnVsbCxZaS0tKX1mdW5jdGlvbiBGZShlLHQpe1lpKyssYWhbWWldPWUuY3VycmVudCxlLmN1cnJlbnQ9dH12YXIgTm89e30sR3Q9am8oTm8pLGNuPWpvKCExKSxzaT1ObztmdW5jdGlvbiBtbChlLHQpe3ZhciBuPWUudHlwZS5jb250ZXh0VHlwZXM7aWYoIW4pcmV0dXJuIE5vO3ZhciByPWUuc3RhdGVOb2RlO2lmKHImJnIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD09PXQpcmV0dXJuIHIuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ7dmFyIG89e30saTtmb3IoaSBpbiBuKW9baV09dFtpXTtyZXR1cm4gciYmKGU9ZS5zdGF0ZU5vZGUsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZFVubWFza2VkQ2hpbGRDb250ZXh0PXQsZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1hc2tlZENoaWxkQ29udGV4dD1vKSxvfWZ1bmN0aW9uIGRuKGUpe3JldHVybiBlPWUuY2hpbGRDb250ZXh0VHlwZXMsZSE9bnVsbH1mdW5jdGlvbiBKdSgpe0dlKGNuKSxHZShHdCl9ZnVuY3Rpb24geHYoZSx0LG4pe2lmKEd0LmN1cnJlbnQhPT1Obyl0aHJvdyBFcnJvcihXKDE2OCkpO0ZlKEd0LHQpLEZlKGNuLG4pfWZ1bmN0aW9uIFoxKGUsdCxuKXt2YXIgcj1lLnN0YXRlTm9kZTtpZih0PXQuY2hpbGRDb250ZXh0VHlwZXMsdHlwZW9mIHIuZ2V0Q2hpbGRDb250ZXh0IT0iZnVuY3Rpb24iKXJldHVybiBuO3I9ci5nZXRDaGlsZENvbnRleHQoKTtmb3IodmFyIG8gaW4gcilpZighKG8gaW4gdCkpdGhyb3cgRXJyb3IoVygxMDgsWEMoZSl8fCJVbmtub3duIixvKSk7cmV0dXJuIHR0KHt9LG4scil9ZnVuY3Rpb24gWnUoZSl7cmV0dXJuIGU9KGU9ZS5zdGF0ZU5vZGUpJiZlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0fHxObyxzaT1HdC5jdXJyZW50LEZlKEd0LGUpLEZlKGNuLGNuLmN1cnJlbnQpLCEwfWZ1bmN0aW9uIF92KGUsdCxuKXt2YXIgcj1lLnN0YXRlTm9kZTtpZighcil0aHJvdyBFcnJvcihXKDE2OSkpO24/KGU9WjEoZSx0LHNpKSxyLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0PWUsR2UoY24pLEdlKEd0KSxGZShHdCxlKSk6R2UoY24pLEZlKGNuLG4pfXZhciBQcj1udWxsLEtjPSExLHRmPSExO2Z1bmN0aW9uIHExKGUpe1ByPT09bnVsbD9Qcj1bZV06UHIucHVzaChlKX1mdW5jdGlvbiBmayhlKXtLYz0hMCxxMShlKX1mdW5jdGlvbiB6bygpe2lmKCF0ZiYmUHIhPT1udWxsKXt0Zj0hMDt2YXIgZT0wLHQ9UGU7dHJ5e3ZhciBuPVByO2ZvcihQZT0xO2U8bi5sZW5ndGg7ZSsrKXt2YXIgcj1uW2VdO2RvIHI9cighMCk7d2hpbGUociE9PW51bGwpfVByPW51bGwsS2M9ITF9Y2F0Y2gobyl7dGhyb3cgUHIhPT1udWxsJiYoUHI9UHIuc2xpY2UoZSsxKSksQzEoRnAsem8pLG99ZmluYWxseXtQZT10LHRmPSExfX1yZXR1cm4gbnVsbH12YXIgWGk9W10sUWk9MCxxdT1udWxsLGVjPTAsUG49W10sT249MCxhaT1udWxsLE1yPTEsRHI9IiI7ZnVuY3Rpb24gS28oZSx0KXtYaVtRaSsrXT1lYyxYaVtRaSsrXT1xdSxxdT1lLGVjPXR9ZnVuY3Rpb24gZXgoZSx0LG4pe1BuW09uKytdPU1yLFBuW09uKytdPURyLFBuW09uKytdPWFpLGFpPWU7dmFyIHI9TXI7ZT1Ecjt2YXIgbz0zMi1abihyKS0xO3ImPX4oMTw8byksbis9MTt2YXIgaT0zMi1abih0KStvO2lmKDMwPGkpe3ZhciBsPW8tbyU1O2k9KHImKDE8PGwpLTEpLnRvU3RyaW5nKDMyKSxyPj49bCxvLT1sLE1yPTE8PDMyLVpuKHQpK298bjw8b3xyLERyPWkrZX1lbHNlIE1yPTE8PGl8bjw8b3xyLERyPWV9ZnVuY3Rpb24gWHAoZSl7ZS5yZXR1cm4hPT1udWxsJiYoS28oZSwxKSxleChlLDEsMCkpfWZ1bmN0aW9uIFFwKGUpe2Zvcig7ZT09PXF1OylxdT1YaVstLVFpXSxYaVtRaV09bnVsbCxlYz1YaVstLVFpXSxYaVtRaV09bnVsbDtmb3IoO2U9PT1haTspYWk9UG5bLS1Pbl0sUG5bT25dPW51bGwsRHI9UG5bLS1Pbl0sUG5bT25dPW51bGwsTXI9UG5bLS1Pbl0sUG5bT25dPW51bGx9dmFyIF9uPW51bGwseG49bnVsbCxZZT0hMSxYbj1udWxsO2Z1bmN0aW9uIHR4KGUsdCl7dmFyIG49RG4oNSxudWxsLG51bGwsMCk7bi5lbGVtZW50VHlwZT0iREVMRVRFRCIsbi5zdGF0ZU5vZGU9dCxuLnJldHVybj1lLHQ9ZS5kZWxldGlvbnMsdD09PW51bGw/KGUuZGVsZXRpb25zPVtuXSxlLmZsYWdzfD0xNik6dC5wdXNoKG4pfWZ1bmN0aW9uIHd2KGUsdCl7c3dpdGNoKGUudGFnKXtjYXNlIDU6dmFyIG49ZS50eXBlO3JldHVybiB0PXQubm9kZVR5cGUhPT0xfHxuLnRvTG93ZXJDYXNlKCkhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/bnVsbDp0LHQhPT1udWxsPyhlLnN0YXRlTm9kZT10LF9uPWUseG49X28odC5maXJzdENoaWxkKSwhMCk6ITE7Y2FzZSA2OnJldHVybiB0PWUucGVuZGluZ1Byb3BzPT09IiJ8fHQubm9kZVR5cGUhPT0zP251bGw6dCx0IT09bnVsbD8oZS5zdGF0ZU5vZGU9dCxfbj1lLHhuPW51bGwsITApOiExO2Nhc2UgMTM6cmV0dXJuIHQ9dC5ub2RlVHlwZSE9PTg/bnVsbDp0LHQhPT1udWxsPyhuPWFpIT09bnVsbD97aWQ6TXIsb3ZlcmZsb3c6RHJ9Om51bGwsZS5tZW1vaXplZFN0YXRlPXtkZWh5ZHJhdGVkOnQsdHJlZUNvbnRleHQ6bixyZXRyeUxhbmU6MTA3Mzc0MTgyNH0sbj1EbigxOCxudWxsLG51bGwsMCksbi5zdGF0ZU5vZGU9dCxuLnJldHVybj1lLGUuY2hpbGQ9bixfbj1lLHhuPW51bGwsITApOiExO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIHVoKGUpe3JldHVybihlLm1vZGUmMSkhPT0wJiYoZS5mbGFncyYxMjgpPT09MH1mdW5jdGlvbiBjaChlKXtpZihZZSl7dmFyIHQ9eG47aWYodCl7dmFyIG49dDtpZighd3YoZSx0KSl7aWYodWgoZSkpdGhyb3cgRXJyb3IoVyg0MTgpKTt0PV9vKG4ubmV4dFNpYmxpbmcpO3ZhciByPV9uO3QmJnd2KGUsdCk/dHgocixuKTooZS5mbGFncz1lLmZsYWdzJi00MDk3fDIsWWU9ITEsX249ZSl9fWVsc2V7aWYodWgoZSkpdGhyb3cgRXJyb3IoVyg0MTgpKTtlLmZsYWdzPWUuZmxhZ3MmLTQwOTd8MixZZT0hMSxfbj1lfX19ZnVuY3Rpb24gU3YoZSl7Zm9yKGU9ZS5yZXR1cm47ZSE9PW51bGwmJmUudGFnIT09NSYmZS50YWchPT0zJiZlLnRhZyE9PTEzOyllPWUucmV0dXJuO19uPWV9ZnVuY3Rpb24gcnUoZSl7aWYoZSE9PV9uKXJldHVybiExO2lmKCFZZSlyZXR1cm4gU3YoZSksWWU9ITAsITE7dmFyIHQ7aWYoKHQ9ZS50YWchPT0zKSYmISh0PWUudGFnIT09NSkmJih0PWUudHlwZSx0PXQhPT0iaGVhZCImJnQhPT0iYm9keSImJiFpaChlLnR5cGUsZS5tZW1vaXplZFByb3BzKSksdCYmKHQ9eG4pKXtpZih1aChlKSl0aHJvdyBueCgpLEVycm9yKFcoNDE4KSk7Zm9yKDt0Oyl0eChlLHQpLHQ9X28odC5uZXh0U2libGluZyl9aWYoU3YoZSksZS50YWc9PT0xMyl7aWYoZT1lLm1lbW9pemVkU3RhdGUsZT1lIT09bnVsbD9lLmRlaHlkcmF0ZWQ6bnVsbCwhZSl0aHJvdyBFcnJvcihXKDMxNykpO2U6e2ZvcihlPWUubmV4dFNpYmxpbmcsdD0wO2U7KXtpZihlLm5vZGVUeXBlPT09OCl7dmFyIG49ZS5kYXRhO2lmKG49PT0iLyQiKXtpZih0PT09MCl7eG49X28oZS5uZXh0U2libGluZyk7YnJlYWsgZX10LS19ZWxzZSBuIT09IiQiJiZuIT09IiQhIiYmbiE9PSIkPyJ8fHQrK31lPWUubmV4dFNpYmxpbmd9eG49bnVsbH19ZWxzZSB4bj1fbj9fbyhlLnN0YXRlTm9kZS5uZXh0U2libGluZyk6bnVsbDtyZXR1cm4hMH1mdW5jdGlvbiBueCgpe2Zvcih2YXIgZT14bjtlOyllPV9vKGUubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIHZsKCl7eG49X249bnVsbCxZZT0hMX1mdW5jdGlvbiBKcChlKXtYbj09PW51bGw/WG49W2VdOlhuLnB1c2goZSl9dmFyIGhrPVZyLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO2Z1bmN0aW9uIEtuKGUsdCl7aWYoZSYmZS5kZWZhdWx0UHJvcHMpe3Q9dHQoe30sdCksZT1lLmRlZmF1bHRQcm9wcztmb3IodmFyIG4gaW4gZSl0W25dPT09dm9pZCAwJiYodFtuXT1lW25dKTtyZXR1cm4gdH1yZXR1cm4gdH12YXIgdGM9am8obnVsbCksbmM9bnVsbCxKaT1udWxsLFpwPW51bGw7ZnVuY3Rpb24gcXAoKXtacD1KaT1uYz1udWxsfWZ1bmN0aW9uIGVnKGUpe3ZhciB0PXRjLmN1cnJlbnQ7R2UodGMpLGUuX2N1cnJlbnRWYWx1ZT10fWZ1bmN0aW9uIGRoKGUsdCxuKXtmb3IoO2UhPT1udWxsOyl7dmFyIHI9ZS5hbHRlcm5hdGU7aWYoKGUuY2hpbGRMYW5lcyZ0KSE9PXQ/KGUuY2hpbGRMYW5lc3w9dCxyIT09bnVsbCYmKHIuY2hpbGRMYW5lc3w9dCkpOnIhPT1udWxsJiYoci5jaGlsZExhbmVzJnQpIT09dCYmKHIuY2hpbGRMYW5lc3w9dCksZT09PW4pYnJlYWs7ZT1lLnJldHVybn19ZnVuY3Rpb24gYWwoZSx0KXtuYz1lLFpwPUppPW51bGwsZT1lLmRlcGVuZGVuY2llcyxlIT09bnVsbCYmZS5maXJzdENvbnRleHQhPT1udWxsJiYoZS5sYW5lcyZ0JiYodW49ITApLGUuZmlyc3RDb250ZXh0PW51bGwpfWZ1bmN0aW9uIGpuKGUpe3ZhciB0PWUuX2N1cnJlbnRWYWx1ZTtpZihacCE9PWUpaWYoZT17Y29udGV4dDplLG1lbW9pemVkVmFsdWU6dCxuZXh0Om51bGx9LEppPT09bnVsbCl7aWYobmM9PT1udWxsKXRocm93IEVycm9yKFcoMzA4KSk7Smk9ZSxuYy5kZXBlbmRlbmNpZXM9e2xhbmVzOjAsZmlyc3RDb250ZXh0OmV9fWVsc2UgSmk9SmkubmV4dD1lO3JldHVybiB0fXZhciBKbz1udWxsO2Z1bmN0aW9uIHRnKGUpe0pvPT09bnVsbD9Kbz1bZV06Sm8ucHVzaChlKX1mdW5jdGlvbiByeChlLHQsbixyKXt2YXIgbz10LmludGVybGVhdmVkO3JldHVybiBvPT09bnVsbD8obi5uZXh0PW4sdGcodCkpOihuLm5leHQ9by5uZXh0LG8ubmV4dD1uKSx0LmludGVybGVhdmVkPW4senIoZSxyKX1mdW5jdGlvbiB6cihlLHQpe2UubGFuZXN8PXQ7dmFyIG49ZS5hbHRlcm5hdGU7Zm9yKG4hPT1udWxsJiYobi5sYW5lc3w9dCksbj1lLGU9ZS5yZXR1cm47ZSE9PW51bGw7KWUuY2hpbGRMYW5lc3w9dCxuPWUuYWx0ZXJuYXRlLG4hPT1udWxsJiYobi5jaGlsZExhbmVzfD10KSxuPWUsZT1lLnJldHVybjtyZXR1cm4gbi50YWc9PT0zP24uc3RhdGVOb2RlOm51bGx9dmFyIHNvPSExO2Z1bmN0aW9uIG5nKGUpe2UudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTplLm1lbW9pemVkU3RhdGUsZmlyc3RCYXNlVXBkYXRlOm51bGwsbGFzdEJhc2VVcGRhdGU6bnVsbCxzaGFyZWQ6e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjB9LGVmZmVjdHM6bnVsbH19ZnVuY3Rpb24gb3goZSx0KXtlPWUudXBkYXRlUXVldWUsdC51cGRhdGVRdWV1ZT09PWUmJih0LnVwZGF0ZVF1ZXVlPXtiYXNlU3RhdGU6ZS5iYXNlU3RhdGUsZmlyc3RCYXNlVXBkYXRlOmUuZmlyc3RCYXNlVXBkYXRlLGxhc3RCYXNlVXBkYXRlOmUubGFzdEJhc2VVcGRhdGUsc2hhcmVkOmUuc2hhcmVkLGVmZmVjdHM6ZS5lZmZlY3RzfSl9ZnVuY3Rpb24gTHIoZSx0KXtyZXR1cm57ZXZlbnRUaW1lOmUsbGFuZTp0LHRhZzowLHBheWxvYWQ6bnVsbCxjYWxsYmFjazpudWxsLG5leHQ6bnVsbH19ZnVuY3Rpb24gd28oZSx0LG4pe3ZhciByPWUudXBkYXRlUXVldWU7aWYocj09PW51bGwpcmV0dXJuIG51bGw7aWYocj1yLnNoYXJlZCxDZSYyKXt2YXIgbz1yLnBlbmRpbmc7cmV0dXJuIG89PT1udWxsP3QubmV4dD10Oih0Lm5leHQ9by5uZXh0LG8ubmV4dD10KSxyLnBlbmRpbmc9dCx6cihlLG4pfXJldHVybiBvPXIuaW50ZXJsZWF2ZWQsbz09PW51bGw/KHQubmV4dD10LHRnKHIpKToodC5uZXh0PW8ubmV4dCxvLm5leHQ9dCksci5pbnRlcmxlYXZlZD10LHpyKGUsbil9ZnVuY3Rpb24gVHUoZSx0LG4pe2lmKHQ9dC51cGRhdGVRdWV1ZSx0IT09bnVsbCYmKHQ9dC5zaGFyZWQsKG4mNDE5NDI0MCkhPT0wKSl7dmFyIHI9dC5sYW5lcztyJj1lLnBlbmRpbmdMYW5lcyxufD1yLHQubGFuZXM9bixCcChlLG4pfX1mdW5jdGlvbiBFdihlLHQpe3ZhciBuPWUudXBkYXRlUXVldWUscj1lLmFsdGVybmF0ZTtpZihyIT09bnVsbCYmKHI9ci51cGRhdGVRdWV1ZSxuPT09cikpe3ZhciBvPW51bGwsaT1udWxsO2lmKG49bi5maXJzdEJhc2VVcGRhdGUsbiE9PW51bGwpe2Rve3ZhciBsPXtldmVudFRpbWU6bi5ldmVudFRpbWUsbGFuZTpuLmxhbmUsdGFnOm4udGFnLHBheWxvYWQ6bi5wYXlsb2FkLGNhbGxiYWNrOm4uY2FsbGJhY2ssbmV4dDpudWxsfTtpPT09bnVsbD9vPWk9bDppPWkubmV4dD1sLG49bi5uZXh0fXdoaWxlKG4hPT1udWxsKTtpPT09bnVsbD9vPWk9dDppPWkubmV4dD10fWVsc2Ugbz1pPXQ7bj17YmFzZVN0YXRlOnIuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTpvLGxhc3RCYXNlVXBkYXRlOmksc2hhcmVkOnIuc2hhcmVkLGVmZmVjdHM6ci5lZmZlY3RzfSxlLnVwZGF0ZVF1ZXVlPW47cmV0dXJufWU9bi5sYXN0QmFzZVVwZGF0ZSxlPT09bnVsbD9uLmZpcnN0QmFzZVVwZGF0ZT10OmUubmV4dD10LG4ubGFzdEJhc2VVcGRhdGU9dH1mdW5jdGlvbiByYyhlLHQsbixyKXt2YXIgbz1lLnVwZGF0ZVF1ZXVlO3NvPSExO3ZhciBpPW8uZmlyc3RCYXNlVXBkYXRlLGw9by5sYXN0QmFzZVVwZGF0ZSxzPW8uc2hhcmVkLnBlbmRpbmc7aWYocyE9PW51bGwpe28uc2hhcmVkLnBlbmRpbmc9bnVsbDt2YXIgYT1zLHU9YS5uZXh0O2EubmV4dD1udWxsLGw9PT1udWxsP2k9dTpsLm5leHQ9dSxsPWE7dmFyIGM9ZS5hbHRlcm5hdGU7YyE9PW51bGwmJihjPWMudXBkYXRlUXVldWUscz1jLmxhc3RCYXNlVXBkYXRlLHMhPT1sJiYocz09PW51bGw/Yy5maXJzdEJhc2VVcGRhdGU9dTpzLm5leHQ9dSxjLmxhc3RCYXNlVXBkYXRlPWEpKX1pZihpIT09bnVsbCl7dmFyIGQ9by5iYXNlU3RhdGU7bD0wLGM9dT1hPW51bGwscz1pO2Rve3ZhciBmPXMubGFuZSxoPXMuZXZlbnRUaW1lO2lmKChyJmYpPT09Zil7YyE9PW51bGwmJihjPWMubmV4dD17ZXZlbnRUaW1lOmgsbGFuZTowLHRhZzpzLnRhZyxwYXlsb2FkOnMucGF5bG9hZCxjYWxsYmFjazpzLmNhbGxiYWNrLG5leHQ6bnVsbH0pO2U6e3ZhciBnPWUsbT1zO3N3aXRjaChmPXQsaD1uLG0udGFnKXtjYXNlIDE6aWYoZz1tLnBheWxvYWQsdHlwZW9mIGc9PSJmdW5jdGlvbiIpe2Q9Zy5jYWxsKGgsZCxmKTticmVhayBlfWQ9ZzticmVhayBlO2Nhc2UgMzpnLmZsYWdzPWcuZmxhZ3MmLTY1NTM3fDEyODtjYXNlIDA6aWYoZz1tLnBheWxvYWQsZj10eXBlb2YgZz09ImZ1bmN0aW9uIj9nLmNhbGwoaCxkLGYpOmcsZj09bnVsbClicmVhayBlO2Q9dHQoe30sZCxmKTticmVhayBlO2Nhc2UgMjpzbz0hMH19cy5jYWxsYmFjayE9PW51bGwmJnMubGFuZSE9PTAmJihlLmZsYWdzfD02NCxmPW8uZWZmZWN0cyxmPT09bnVsbD9vLmVmZmVjdHM9W3NdOmYucHVzaChzKSl9ZWxzZSBoPXtldmVudFRpbWU6aCxsYW5lOmYsdGFnOnMudGFnLHBheWxvYWQ6cy5wYXlsb2FkLGNhbGxiYWNrOnMuY2FsbGJhY2ssbmV4dDpudWxsfSxjPT09bnVsbD8odT1jPWgsYT1kKTpjPWMubmV4dD1oLGx8PWY7aWYocz1zLm5leHQscz09PW51bGwpe2lmKHM9by5zaGFyZWQucGVuZGluZyxzPT09bnVsbClicmVhaztmPXMscz1mLm5leHQsZi5uZXh0PW51bGwsby5sYXN0QmFzZVVwZGF0ZT1mLG8uc2hhcmVkLnBlbmRpbmc9bnVsbH19d2hpbGUoMSk7aWYoYz09PW51bGwmJihhPWQpLG8uYmFzZVN0YXRlPWEsby5maXJzdEJhc2VVcGRhdGU9dSxvLmxhc3RCYXNlVXBkYXRlPWMsdD1vLnNoYXJlZC5pbnRlcmxlYXZlZCx0IT09bnVsbCl7bz10O2RvIGx8PW8ubGFuZSxvPW8ubmV4dDt3aGlsZShvIT09dCl9ZWxzZSBpPT09bnVsbCYmKG8uc2hhcmVkLmxhbmVzPTApO2NpfD1sLGUubGFuZXM9bCxlLm1lbW9pemVkU3RhdGU9ZH19ZnVuY3Rpb24gQ3YoZSx0LG4pe2lmKGU9dC5lZmZlY3RzLHQuZWZmZWN0cz1udWxsLGUhPT1udWxsKWZvcih0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF0sbz1yLmNhbGxiYWNrO2lmKG8hPT1udWxsKXtpZihyLmNhbGxiYWNrPW51bGwscj1uLHR5cGVvZiBvIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMTkxLG8pKTtvLmNhbGwocil9fX12YXIgaXg9bmV3IHIxLkNvbXBvbmVudCgpLnJlZnM7ZnVuY3Rpb24gZmgoZSx0LG4scil7dD1lLm1lbW9pemVkU3RhdGUsbj1uKHIsdCksbj1uPT1udWxsP3Q6dHQoe30sdCxuKSxlLm1lbW9pemVkU3RhdGU9bixlLmxhbmVzPT09MCYmKGUudXBkYXRlUXVldWUuYmFzZVN0YXRlPW4pfXZhciBHYz17aXNNb3VudGVkOmZ1bmN0aW9uKGUpe3JldHVybihlPWUuX3JlYWN0SW50ZXJuYWxzKT94aShlKT09PWU6ITF9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihlLHQsbil7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgcj1ubigpLG89RW8oZSksaT1McihyLG8pO2kucGF5bG9hZD10LG4hPW51bGwmJihpLmNhbGxiYWNrPW4pLHQ9d28oZSxpLG8pLHQhPT1udWxsJiYocW4odCxlLG8sciksVHUodCxlLG8pKX0sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbihlLHQsbil7ZT1lLl9yZWFjdEludGVybmFsczt2YXIgcj1ubigpLG89RW8oZSksaT1McihyLG8pO2kudGFnPTEsaS5wYXlsb2FkPXQsbiE9bnVsbCYmKGkuY2FsbGJhY2s9biksdD13byhlLGksbyksdCE9PW51bGwmJihxbih0LGUsbyxyKSxUdSh0LGUsbykpfSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oZSx0KXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciBuPW5uKCkscj1FbyhlKSxvPUxyKG4scik7by50YWc9Mix0IT1udWxsJiYoby5jYWxsYmFjaz10KSx0PXdvKGUsbyxyKSx0IT09bnVsbCYmKHFuKHQsZSxyLG4pLFR1KHQsZSxyKSl9fTtmdW5jdGlvbiAkdihlLHQsbixyLG8saSxsKXtyZXR1cm4gZT1lLnN0YXRlTm9kZSx0eXBlb2YgZS5zaG91bGRDb21wb25lbnRVcGRhdGU9PSJmdW5jdGlvbiI/ZS5zaG91bGRDb21wb25lbnRVcGRhdGUocixpLGwpOnQucHJvdG90eXBlJiZ0LnByb3RvdHlwZS5pc1B1cmVSZWFjdENvbXBvbmVudD8hcXMobixyKXx8IXFzKG8saSk6ITB9ZnVuY3Rpb24gbHgoZSx0LG4pe3ZhciByPSExLG89Tm8saT10LmNvbnRleHRUeXBlO3JldHVybiB0eXBlb2YgaT09Im9iamVjdCImJmkhPT1udWxsP2k9am4oaSk6KG89ZG4odCk/c2k6R3QuY3VycmVudCxyPXQuY29udGV4dFR5cGVzLGk9KHI9ciE9bnVsbCk/bWwoZSxvKTpObyksdD1uZXcgdChuLGkpLGUubWVtb2l6ZWRTdGF0ZT10LnN0YXRlIT09bnVsbCYmdC5zdGF0ZSE9PXZvaWQgMD90LnN0YXRlOm51bGwsdC51cGRhdGVyPUdjLGUuc3RhdGVOb2RlPXQsdC5fcmVhY3RJbnRlcm5hbHM9ZSxyJiYoZT1lLnN0YXRlTm9kZSxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9byxlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0PWkpLHR9ZnVuY3Rpb24ga3YoZSx0LG4scil7ZT10LnN0YXRlLHR5cGVvZiB0LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM9PSJmdW5jdGlvbiImJnQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyhuLHIpLHR5cGVvZiB0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzPT0iZnVuY3Rpb24iJiZ0LlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG4sciksdC5zdGF0ZSE9PWUmJkdjLmVucXVldWVSZXBsYWNlU3RhdGUodCx0LnN0YXRlLG51bGwpfWZ1bmN0aW9uIGhoKGUsdCxuLHIpe3ZhciBvPWUuc3RhdGVOb2RlO28ucHJvcHM9bixvLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxvLnJlZnM9aXgsbmcoZSk7dmFyIGk9dC5jb250ZXh0VHlwZTt0eXBlb2YgaT09Im9iamVjdCImJmkhPT1udWxsP28uY29udGV4dD1qbihpKTooaT1kbih0KT9zaTpHdC5jdXJyZW50LG8uY29udGV4dD1tbChlLGkpKSxvLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxpPXQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLHR5cGVvZiBpPT0iZnVuY3Rpb24iJiYoZmgoZSx0LGksbiksby5zdGF0ZT1lLm1lbW9pemVkU3RhdGUpLHR5cGVvZiB0LmdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcz09ImZ1bmN0aW9uInx8dHlwZW9mIG8uZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiJ8fHR5cGVvZiBvLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiImJnR5cGVvZiBvLmNvbXBvbmVudFdpbGxNb3VudCE9ImZ1bmN0aW9uInx8KHQ9by5zdGF0ZSx0eXBlb2Ygby5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJm8uY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIG8uVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmby5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCksdCE9PW8uc3RhdGUmJkdjLmVucXVldWVSZXBsYWNlU3RhdGUobyxvLnN0YXRlLG51bGwpLHJjKGUsbixvLHIpLG8uc3RhdGU9ZS5tZW1vaXplZFN0YXRlKSx0eXBlb2Ygby5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKGUuZmxhZ3N8PTQxOTQzMDgpfWZ1bmN0aW9uIG9zKGUsdCxuKXtpZihlPW4ucmVmLGUhPT1udWxsJiZ0eXBlb2YgZSE9ImZ1bmN0aW9uIiYmdHlwZW9mIGUhPSJvYmplY3QiKXtpZihuLl9vd25lcil7aWYobj1uLl9vd25lcixuKXtpZihuLnRhZyE9PTEpdGhyb3cgRXJyb3IoVygzMDkpKTt2YXIgcj1uLnN0YXRlTm9kZX1pZighcil0aHJvdyBFcnJvcihXKDE0NyxlKSk7dmFyIG89cixpPSIiK2U7cmV0dXJuIHQhPT1udWxsJiZ0LnJlZiE9PW51bGwmJnR5cGVvZiB0LnJlZj09ImZ1bmN0aW9uIiYmdC5yZWYuX3N0cmluZ1JlZj09PWk/dC5yZWY6KHQ9ZnVuY3Rpb24obCl7dmFyIHM9by5yZWZzO3M9PT1peCYmKHM9by5yZWZzPXt9KSxsPT09bnVsbD9kZWxldGUgc1tpXTpzW2ldPWx9LHQuX3N0cmluZ1JlZj1pLHQpfWlmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBFcnJvcihXKDI4NCkpO2lmKCFuLl9vd25lcil0aHJvdyBFcnJvcihXKDI5MCxlKSl9cmV0dXJuIGV9ZnVuY3Rpb24gb3UoZSx0KXt0aHJvdyBlPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KSxFcnJvcihXKDMxLGU9PT0iW29iamVjdCBPYmplY3RdIj8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyh0KS5qb2luKCIsICIpKyJ9IjplKSl9ZnVuY3Rpb24gVHYoZSl7dmFyIHQ9ZS5faW5pdDtyZXR1cm4gdChlLl9wYXlsb2FkKX1mdW5jdGlvbiBzeChlKXtmdW5jdGlvbiB0KHYseSl7aWYoZSl7dmFyIHg9di5kZWxldGlvbnM7eD09PW51bGw/KHYuZGVsZXRpb25zPVt5XSx2LmZsYWdzfD0xNik6eC5wdXNoKHkpfX1mdW5jdGlvbiBuKHYseSl7aWYoIWUpcmV0dXJuIG51bGw7Zm9yKDt5IT09bnVsbDspdCh2LHkpLHk9eS5zaWJsaW5nO3JldHVybiBudWxsfWZ1bmN0aW9uIHIodix5KXtmb3Iodj1uZXcgTWFwO3khPT1udWxsOyl5LmtleSE9PW51bGw/di5zZXQoeS5rZXkseSk6di5zZXQoeS5pbmRleCx5KSx5PXkuc2libGluZztyZXR1cm4gdn1mdW5jdGlvbiBvKHYseSl7cmV0dXJuIHY9Q28odix5KSx2LmluZGV4PTAsdi5zaWJsaW5nPW51bGwsdn1mdW5jdGlvbiBpKHYseSx4KXtyZXR1cm4gdi5pbmRleD14LGU/KHg9di5hbHRlcm5hdGUseCE9PW51bGw/KHg9eC5pbmRleCx4PHk/KHYuZmxhZ3N8PTIseSk6eCk6KHYuZmxhZ3N8PTIseSkpOih2LmZsYWdzfD0xMDQ4NTc2LHkpfWZ1bmN0aW9uIGwodil7cmV0dXJuIGUmJnYuYWx0ZXJuYXRlPT09bnVsbCYmKHYuZmxhZ3N8PTIpLHZ9ZnVuY3Rpb24gcyh2LHkseCxfKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nj8oeT11Zih4LHYubW9kZSxfKSx5LnJldHVybj12LHkpOih5PW8oeSx4KSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGEodix5LHgsXyl7dmFyIEU9eC50eXBlO3JldHVybiBFPT09VWk/Yyh2LHkseC5wcm9wcy5jaGlsZHJlbixfLHgua2V5KTp5IT09bnVsbCYmKHkuZWxlbWVudFR5cGU9PT1FfHx0eXBlb2YgRT09Im9iamVjdCImJkUhPT1udWxsJiZFLiQkdHlwZW9mPT09bG8mJlR2KEUpPT09eS50eXBlKT8oXz1vKHkseC5wcm9wcyksXy5yZWY9b3Modix5LHgpLF8ucmV0dXJuPXYsXyk6KF89QXUoeC50eXBlLHgua2V5LHgucHJvcHMsbnVsbCx2Lm1vZGUsXyksXy5yZWY9b3Modix5LHgpLF8ucmV0dXJuPXYsXyl9ZnVuY3Rpb24gdSh2LHkseCxfKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09NHx8eS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyE9PXguY29udGFpbmVySW5mb3x8eS5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb24hPT14LmltcGxlbWVudGF0aW9uPyh5PWNmKHgsdi5tb2RlLF8pLHkucmV0dXJuPXYseSk6KHk9byh5LHguY2hpbGRyZW58fFtdKSx5LnJldHVybj12LHkpfWZ1bmN0aW9uIGModix5LHgsXyxFKXtyZXR1cm4geT09PW51bGx8fHkudGFnIT09Nz8oeT1uaSh4LHYubW9kZSxfLEUpLHkucmV0dXJuPXYseSk6KHk9byh5LHgpLHkucmV0dXJuPXYseSl9ZnVuY3Rpb24gZCh2LHkseCl7aWYodHlwZW9mIHk9PSJzdHJpbmciJiZ5IT09IiJ8fHR5cGVvZiB5PT0ibnVtYmVyIilyZXR1cm4geT11ZigiIit5LHYubW9kZSx4KSx5LnJldHVybj12LHk7aWYodHlwZW9mIHk9PSJvYmplY3QiJiZ5IT09bnVsbCl7c3dpdGNoKHkuJCR0eXBlb2Ype2Nhc2UgR2E6cmV0dXJuIHg9QXUoeS50eXBlLHkua2V5LHkucHJvcHMsbnVsbCx2Lm1vZGUseCkseC5yZWY9b3ModixudWxsLHkpLHgucmV0dXJuPXYseDtjYXNlIFdpOnJldHVybiB5PWNmKHksdi5tb2RlLHgpLHkucmV0dXJuPXYseTtjYXNlIGxvOnZhciBfPXkuX2luaXQ7cmV0dXJuIGQodixfKHkuX3BheWxvYWQpLHgpfWlmKGdzKHkpfHxxbCh5KSlyZXR1cm4geT1uaSh5LHYubW9kZSx4LG51bGwpLHkucmV0dXJuPXYseTtvdSh2LHkpfXJldHVybiBudWxsfWZ1bmN0aW9uIGYodix5LHgsXyl7dmFyIEU9eSE9PW51bGw/eS5rZXk6bnVsbDtpZih0eXBlb2YgeD09InN0cmluZyImJnghPT0iInx8dHlwZW9mIHg9PSJudW1iZXIiKXJldHVybiBFIT09bnVsbD9udWxsOnModix5LCIiK3gsXyk7aWYodHlwZW9mIHg9PSJvYmplY3QiJiZ4IT09bnVsbCl7c3dpdGNoKHguJCR0eXBlb2Ype2Nhc2UgR2E6cmV0dXJuIHgua2V5PT09RT9hKHYseSx4LF8pOm51bGw7Y2FzZSBXaTpyZXR1cm4geC5rZXk9PT1FP3Uodix5LHgsXyk6bnVsbDtjYXNlIGxvOnJldHVybiBFPXguX2luaXQsZih2LHksRSh4Ll9wYXlsb2FkKSxfKX1pZihncyh4KXx8cWwoeCkpcmV0dXJuIEUhPT1udWxsP251bGw6Yyh2LHkseCxfLG51bGwpO291KHYseCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaCh2LHkseCxfLEUpe2lmKHR5cGVvZiBfPT0ic3RyaW5nIiYmXyE9PSIifHx0eXBlb2YgXz09Im51bWJlciIpcmV0dXJuIHY9di5nZXQoeCl8fG51bGwscyh5LHYsIiIrXyxFKTtpZih0eXBlb2YgXz09Im9iamVjdCImJl8hPT1udWxsKXtzd2l0Y2goXy4kJHR5cGVvZil7Y2FzZSBHYTpyZXR1cm4gdj12LmdldChfLmtleT09PW51bGw/eDpfLmtleSl8fG51bGwsYSh5LHYsXyxFKTtjYXNlIFdpOnJldHVybiB2PXYuZ2V0KF8ua2V5PT09bnVsbD94Ol8ua2V5KXx8bnVsbCx1KHksdixfLEUpO2Nhc2UgbG86dmFyICQ9Xy5faW5pdDtyZXR1cm4gaCh2LHkseCwkKF8uX3BheWxvYWQpLEUpfWlmKGdzKF8pfHxxbChfKSlyZXR1cm4gdj12LmdldCh4KXx8bnVsbCxjKHksdixfLEUsbnVsbCk7b3UoeSxfKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBnKHYseSx4LF8pe2Zvcih2YXIgRT1udWxsLCQ9bnVsbCxDPXksVD15PTAsTT1udWxsO0MhPT1udWxsJiZUPHgubGVuZ3RoO1QrKyl7Qy5pbmRleD5UPyhNPUMsQz1udWxsKTpNPUMuc2libGluZzt2YXIgUj1mKHYsQyx4W1RdLF8pO2lmKFI9PT1udWxsKXtDPT09bnVsbCYmKEM9TSk7YnJlYWt9ZSYmQyYmUi5hbHRlcm5hdGU9PT1udWxsJiZ0KHYsQykseT1pKFIseSxUKSwkPT09bnVsbD9FPVI6JC5zaWJsaW5nPVIsJD1SLEM9TX1pZihUPT09eC5sZW5ndGgpcmV0dXJuIG4odixDKSxZZSYmS28odixUKSxFO2lmKEM9PT1udWxsKXtmb3IoO1Q8eC5sZW5ndGg7VCsrKUM9ZCh2LHhbVF0sXyksQyE9PW51bGwmJih5PWkoQyx5LFQpLCQ9PT1udWxsP0U9QzokLnNpYmxpbmc9QywkPUMpO3JldHVybiBZZSYmS28odixUKSxFfWZvcihDPXIodixDKTtUPHgubGVuZ3RoO1QrKylNPWgoQyx2LFQseFtUXSxfKSxNIT09bnVsbCYmKGUmJk0uYWx0ZXJuYXRlIT09bnVsbCYmQy5kZWxldGUoTS5rZXk9PT1udWxsP1Q6TS5rZXkpLHk9aShNLHksVCksJD09PW51bGw/RT1NOiQuc2libGluZz1NLCQ9TSk7cmV0dXJuIGUmJkMuZm9yRWFjaChmdW5jdGlvbihqKXtyZXR1cm4gdCh2LGopfSksWWUmJktvKHYsVCksRX1mdW5jdGlvbiBtKHYseSx4LF8pe3ZhciBFPXFsKHgpO2lmKHR5cGVvZiBFIT0iZnVuY3Rpb24iKXRocm93IEVycm9yKFcoMTUwKSk7aWYoeD1FLmNhbGwoeCkseD09bnVsbCl0aHJvdyBFcnJvcihXKDE1MSkpO2Zvcih2YXIgJD1FPW51bGwsQz15LFQ9eT0wLE09bnVsbCxSPXgubmV4dCgpO0MhPT1udWxsJiYhUi5kb25lO1QrKyxSPXgubmV4dCgpKXtDLmluZGV4PlQ/KE09QyxDPW51bGwpOk09Qy5zaWJsaW5nO3ZhciBqPWYodixDLFIudmFsdWUsXyk7aWYoaj09PW51bGwpe0M9PT1udWxsJiYoQz1NKTticmVha31lJiZDJiZqLmFsdGVybmF0ZT09PW51bGwmJnQodixDKSx5PWkoaix5LFQpLCQ9PT1udWxsP0U9ajokLnNpYmxpbmc9aiwkPWosQz1NfWlmKFIuZG9uZSlyZXR1cm4gbih2LEMpLFllJiZLbyh2LFQpLEU7aWYoQz09PW51bGwpe2Zvcig7IVIuZG9uZTtUKyssUj14Lm5leHQoKSlSPWQodixSLnZhbHVlLF8pLFIhPT1udWxsJiYoeT1pKFIseSxUKSwkPT09bnVsbD9FPVI6JC5zaWJsaW5nPVIsJD1SKTtyZXR1cm4gWWUmJktvKHYsVCksRX1mb3IoQz1yKHYsQyk7IVIuZG9uZTtUKyssUj14Lm5leHQoKSlSPWgoQyx2LFQsUi52YWx1ZSxfKSxSIT09bnVsbCYmKGUmJlIuYWx0ZXJuYXRlIT09bnVsbCYmQy5kZWxldGUoUi5rZXk9PT1udWxsP1Q6Ui5rZXkpLHk9aShSLHksVCksJD09PW51bGw/RT1SOiQuc2libGluZz1SLCQ9Uik7cmV0dXJuIGUmJkMuZm9yRWFjaChmdW5jdGlvbihGKXtyZXR1cm4gdCh2LEYpfSksWWUmJktvKHYsVCksRX1mdW5jdGlvbiBTKHYseSx4LF8pe2lmKHR5cGVvZiB4PT0ib2JqZWN0IiYmeCE9PW51bGwmJngudHlwZT09PVVpJiZ4LmtleT09PW51bGwmJih4PXgucHJvcHMuY2hpbGRyZW4pLHR5cGVvZiB4PT0ib2JqZWN0IiYmeCE9PW51bGwpe3N3aXRjaCh4LiQkdHlwZW9mKXtjYXNlIEdhOmU6e2Zvcih2YXIgRT14LmtleSwkPXk7JCE9PW51bGw7KXtpZigkLmtleT09PUUpe2lmKEU9eC50eXBlLEU9PT1VaSl7aWYoJC50YWc9PT03KXtuKHYsJC5zaWJsaW5nKSx5PW8oJCx4LnByb3BzLmNoaWxkcmVuKSx5LnJldHVybj12LHY9eTticmVhayBlfX1lbHNlIGlmKCQuZWxlbWVudFR5cGU9PT1FfHx0eXBlb2YgRT09Im9iamVjdCImJkUhPT1udWxsJiZFLiQkdHlwZW9mPT09bG8mJlR2KEUpPT09JC50eXBlKXtuKHYsJC5zaWJsaW5nKSx5PW8oJCx4LnByb3BzKSx5LnJlZj1vcyh2LCQseCkseS5yZXR1cm49dix2PXk7YnJlYWsgZX1uKHYsJCk7YnJlYWt9ZWxzZSB0KHYsJCk7JD0kLnNpYmxpbmd9eC50eXBlPT09VWk/KHk9bmkoeC5wcm9wcy5jaGlsZHJlbix2Lm1vZGUsXyx4LmtleSkseS5yZXR1cm49dix2PXkpOihfPUF1KHgudHlwZSx4LmtleSx4LnByb3BzLG51bGwsdi5tb2RlLF8pLF8ucmVmPW9zKHYseSx4KSxfLnJldHVybj12LHY9Xyl9cmV0dXJuIGwodik7Y2FzZSBXaTplOntmb3IoJD14LmtleTt5IT09bnVsbDspe2lmKHkua2V5PT09JClpZih5LnRhZz09PTQmJnkuc3RhdGVOb2RlLmNvbnRhaW5lckluZm89PT14LmNvbnRhaW5lckluZm8mJnkuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uPT09eC5pbXBsZW1lbnRhdGlvbil7bih2LHkuc2libGluZykseT1vKHkseC5jaGlsZHJlbnx8W10pLHkucmV0dXJuPXYsdj15O2JyZWFrIGV9ZWxzZXtuKHYseSk7YnJlYWt9ZWxzZSB0KHYseSk7eT15LnNpYmxpbmd9eT1jZih4LHYubW9kZSxfKSx5LnJldHVybj12LHY9eX1yZXR1cm4gbCh2KTtjYXNlIGxvOnJldHVybiAkPXguX2luaXQsUyh2LHksJCh4Ll9wYXlsb2FkKSxfKX1pZihncyh4KSlyZXR1cm4gZyh2LHkseCxfKTtpZihxbCh4KSlyZXR1cm4gbSh2LHkseCxfKTtvdSh2LHgpfXJldHVybiB0eXBlb2YgeD09InN0cmluZyImJnghPT0iInx8dHlwZW9mIHg9PSJudW1iZXIiPyh4PSIiK3gseSE9PW51bGwmJnkudGFnPT09Nj8obih2LHkuc2libGluZykseT1vKHkseCkseS5yZXR1cm49dix2PXkpOihuKHYseSkseT11Zih4LHYubW9kZSxfKSx5LnJldHVybj12LHY9eSksbCh2KSk6bih2LHkpfXJldHVybiBTfXZhciB5bD1zeCghMCksYXg9c3goITEpLFJhPXt9LGdyPWpvKFJhKSxyYT1qbyhSYSksb2E9am8oUmEpO2Z1bmN0aW9uIFpvKGUpe2lmKGU9PT1SYSl0aHJvdyBFcnJvcihXKDE3NCkpO3JldHVybiBlfWZ1bmN0aW9uIHJnKGUsdCl7c3dpdGNoKEZlKG9hLHQpLEZlKHJhLGUpLEZlKGdyLFJhKSxlPXQubm9kZVR5cGUsZSl7Y2FzZSA5OmNhc2UgMTE6dD0odD10LmRvY3VtZW50RWxlbWVudCk/dC5uYW1lc3BhY2VVUkk6SGYobnVsbCwiIik7YnJlYWs7ZGVmYXVsdDplPWU9PT04P3QucGFyZW50Tm9kZTp0LHQ9ZS5uYW1lc3BhY2VVUkl8fG51bGwsZT1lLnRhZ05hbWUsdD1IZih0LGUpfUdlKGdyKSxGZShncix0KX1mdW5jdGlvbiB4bCgpe0dlKGdyKSxHZShyYSksR2Uob2EpfWZ1bmN0aW9uIHV4KGUpe1pvKG9hLmN1cnJlbnQpO3ZhciB0PVpvKGdyLmN1cnJlbnQpLG49SGYodCxlLnR5cGUpO3QhPT1uJiYoRmUocmEsZSksRmUoZ3IsbikpfWZ1bmN0aW9uIG9nKGUpe3JhLmN1cnJlbnQ9PT1lJiYoR2UoZ3IpLEdlKHJhKSl9dmFyIEplPWpvKDApO2Z1bmN0aW9uIG9jKGUpe2Zvcih2YXIgdD1lO3QhPT1udWxsOyl7aWYodC50YWc9PT0xMyl7dmFyIG49dC5tZW1vaXplZFN0YXRlO2lmKG4hPT1udWxsJiYobj1uLmRlaHlkcmF0ZWQsbj09PW51bGx8fG4uZGF0YT09PSIkPyJ8fG4uZGF0YT09PSIkISIpKXJldHVybiB0fWVsc2UgaWYodC50YWc9PT0xOSYmdC5tZW1vaXplZFByb3BzLnJldmVhbE9yZGVyIT09dm9pZCAwKXtpZih0LmZsYWdzJjEyOClyZXR1cm4gdH1lbHNlIGlmKHQuY2hpbGQhPT1udWxsKXt0LmNoaWxkLnJldHVybj10LHQ9dC5jaGlsZDtjb250aW51ZX1pZih0PT09ZSlicmVhaztmb3IoO3Quc2libGluZz09PW51bGw7KXtpZih0LnJldHVybj09PW51bGx8fHQucmV0dXJuPT09ZSlyZXR1cm4gbnVsbDt0PXQucmV0dXJufXQuc2libGluZy5yZXR1cm49dC5yZXR1cm4sdD10LnNpYmxpbmd9cmV0dXJuIG51bGx9dmFyIG5mPVtdO2Z1bmN0aW9uIGlnKCl7Zm9yKHZhciBlPTA7ZTxuZi5sZW5ndGg7ZSsrKW5mW2VdLl93b3JrSW5Qcm9ncmVzc1ZlcnNpb25QcmltYXJ5PW51bGw7bmYubGVuZ3RoPTB9dmFyIE51PVZyLlJlYWN0Q3VycmVudERpc3BhdGNoZXIscmY9VnIuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsdWk9MCxxZT1udWxsLG10PW51bGwsQ3Q9bnVsbCxpYz0hMSxUcz0hMSxpYT0wLHBrPTA7ZnVuY3Rpb24gRnQoKXt0aHJvdyBFcnJvcihXKDMyMSkpfWZ1bmN0aW9uIGxnKGUsdCl7aWYodD09PW51bGwpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aCYmbjxlLmxlbmd0aDtuKyspaWYoIWVyKGVbbl0sdFtuXSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gc2coZSx0LG4scixvLGkpe2lmKHVpPWkscWU9dCx0Lm1lbW9pemVkU3RhdGU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwsdC5sYW5lcz0wLE51LmN1cnJlbnQ9ZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZT09PW51bGw/eWs6eGssZT1uKHIsbyksVHMpe2k9MDtkb3tpZihUcz0hMSxpYT0wLDI1PD1pKXRocm93IEVycm9yKFcoMzAxKSk7aSs9MSxDdD1tdD1udWxsLHQudXBkYXRlUXVldWU9bnVsbCxOdS5jdXJyZW50PV9rLGU9bihyLG8pfXdoaWxlKFRzKX1pZihOdS5jdXJyZW50PWxjLHQ9bXQhPT1udWxsJiZtdC5uZXh0IT09bnVsbCx1aT0wLEN0PW10PXFlPW51bGwsaWM9ITEsdCl0aHJvdyBFcnJvcihXKDMwMCkpO3JldHVybiBlfWZ1bmN0aW9uIGFnKCl7dmFyIGU9aWEhPT0wO3JldHVybiBpYT0wLGV9ZnVuY3Rpb24gc3IoKXt2YXIgZT17bWVtb2l6ZWRTdGF0ZTpudWxsLGJhc2VTdGF0ZTpudWxsLGJhc2VRdWV1ZTpudWxsLHF1ZXVlOm51bGwsbmV4dDpudWxsfTtyZXR1cm4gQ3Q9PT1udWxsP3FlLm1lbW9pemVkU3RhdGU9Q3Q9ZTpDdD1DdC5uZXh0PWUsQ3R9ZnVuY3Rpb24gem4oKXtpZihtdD09PW51bGwpe3ZhciBlPXFlLmFsdGVybmF0ZTtlPWUhPT1udWxsP2UubWVtb2l6ZWRTdGF0ZTpudWxsfWVsc2UgZT1tdC5uZXh0O3ZhciB0PUN0PT09bnVsbD9xZS5tZW1vaXplZFN0YXRlOkN0Lm5leHQ7aWYodCE9PW51bGwpQ3Q9dCxtdD1lO2Vsc2V7aWYoZT09PW51bGwpdGhyb3cgRXJyb3IoVygzMTApKTttdD1lLGU9e21lbW9pemVkU3RhdGU6bXQubWVtb2l6ZWRTdGF0ZSxiYXNlU3RhdGU6bXQuYmFzZVN0YXRlLGJhc2VRdWV1ZTptdC5iYXNlUXVldWUscXVldWU6bXQucXVldWUsbmV4dDpudWxsfSxDdD09PW51bGw/cWUubWVtb2l6ZWRTdGF0ZT1DdD1lOkN0PUN0Lm5leHQ9ZX1yZXR1cm4gQ3R9ZnVuY3Rpb24gbGEoZSx0KXtyZXR1cm4gdHlwZW9mIHQ9PSJmdW5jdGlvbiI/dChlKTp0fWZ1bmN0aW9uIG9mKGUpe3ZhciB0PXpuKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFcoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9bXQsbz1yLmJhc2VRdWV1ZSxpPW4ucGVuZGluZztpZihpIT09bnVsbCl7aWYobyE9PW51bGwpe3ZhciBsPW8ubmV4dDtvLm5leHQ9aS5uZXh0LGkubmV4dD1sfXIuYmFzZVF1ZXVlPW89aSxuLnBlbmRpbmc9bnVsbH1pZihvIT09bnVsbCl7aT1vLm5leHQscj1yLmJhc2VTdGF0ZTt2YXIgcz1sPW51bGwsYT1udWxsLHU9aTtkb3t2YXIgYz11LmxhbmU7aWYoKHVpJmMpPT09YylhIT09bnVsbCYmKGE9YS5uZXh0PXtsYW5lOjAsYWN0aW9uOnUuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6dS5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6dS5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLHI9dS5oYXNFYWdlclN0YXRlP3UuZWFnZXJTdGF0ZTplKHIsdS5hY3Rpb24pO2Vsc2V7dmFyIGQ9e2xhbmU6YyxhY3Rpb246dS5hY3Rpb24saGFzRWFnZXJTdGF0ZTp1Lmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTp1LmVhZ2VyU3RhdGUsbmV4dDpudWxsfTthPT09bnVsbD8ocz1hPWQsbD1yKTphPWEubmV4dD1kLHFlLmxhbmVzfD1jLGNpfD1jfXU9dS5uZXh0fXdoaWxlKHUhPT1udWxsJiZ1IT09aSk7YT09PW51bGw/bD1yOmEubmV4dD1zLGVyKHIsdC5tZW1vaXplZFN0YXRlKXx8KHVuPSEwKSx0Lm1lbW9pemVkU3RhdGU9cix0LmJhc2VTdGF0ZT1sLHQuYmFzZVF1ZXVlPWEsbi5sYXN0UmVuZGVyZWRTdGF0ZT1yfWlmKGU9bi5pbnRlcmxlYXZlZCxlIT09bnVsbCl7bz1lO2RvIGk9by5sYW5lLHFlLmxhbmVzfD1pLGNpfD1pLG89by5uZXh0O3doaWxlKG8hPT1lKX1lbHNlIG89PT1udWxsJiYobi5sYW5lcz0wKTtyZXR1cm5bdC5tZW1vaXplZFN0YXRlLG4uZGlzcGF0Y2hdfWZ1bmN0aW9uIGxmKGUpe3ZhciB0PXpuKCksbj10LnF1ZXVlO2lmKG49PT1udWxsKXRocm93IEVycm9yKFcoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9bi5kaXNwYXRjaCxvPW4ucGVuZGluZyxpPXQubWVtb2l6ZWRTdGF0ZTtpZihvIT09bnVsbCl7bi5wZW5kaW5nPW51bGw7dmFyIGw9bz1vLm5leHQ7ZG8gaT1lKGksbC5hY3Rpb24pLGw9bC5uZXh0O3doaWxlKGwhPT1vKTtlcihpLHQubWVtb2l6ZWRTdGF0ZSl8fCh1bj0hMCksdC5tZW1vaXplZFN0YXRlPWksdC5iYXNlUXVldWU9PT1udWxsJiYodC5iYXNlU3RhdGU9aSksbi5sYXN0UmVuZGVyZWRTdGF0ZT1pfXJldHVybltpLHJdfWZ1bmN0aW9uIGN4KCl7fWZ1bmN0aW9uIGR4KGUsdCl7dmFyIG49cWUscj16bigpLG89dCgpLGk9IWVyKHIubWVtb2l6ZWRTdGF0ZSxvKTtpZihpJiYoci5tZW1vaXplZFN0YXRlPW8sdW49ITApLHI9ci5xdWV1ZSx1ZyhweC5iaW5kKG51bGwsbixyLGUpLFtlXSksci5nZXRTbmFwc2hvdCE9PXR8fGl8fEN0IT09bnVsbCYmQ3QubWVtb2l6ZWRTdGF0ZS50YWcmMSl7aWYobi5mbGFnc3w9MjA0OCxzYSg5LGh4LmJpbmQobnVsbCxuLHIsbyx0KSx2b2lkIDAsbnVsbCksYnQ9PT1udWxsKXRocm93IEVycm9yKFcoMzQ5KSk7dWkmMzB8fGZ4KG4sdCxvKX1yZXR1cm4gb31mdW5jdGlvbiBmeChlLHQsbil7ZS5mbGFnc3w9MTYzODQsZT17Z2V0U25hcHNob3Q6dCx2YWx1ZTpufSx0PXFlLnVwZGF0ZVF1ZXVlLHQ9PT1udWxsPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LHFlLnVwZGF0ZVF1ZXVlPXQsdC5zdG9yZXM9W2VdKToobj10LnN0b3JlcyxuPT09bnVsbD90LnN0b3Jlcz1bZV06bi5wdXNoKGUpKX1mdW5jdGlvbiBoeChlLHQsbixyKXt0LnZhbHVlPW4sdC5nZXRTbmFwc2hvdD1yLGd4KHQpJiZteChlKX1mdW5jdGlvbiBweChlLHQsbil7cmV0dXJuIG4oZnVuY3Rpb24oKXtneCh0KSYmbXgoZSl9KX1mdW5jdGlvbiBneChlKXt2YXIgdD1lLmdldFNuYXBzaG90O2U9ZS52YWx1ZTt0cnl7dmFyIG49dCgpO3JldHVybiFlcihlLG4pfWNhdGNoe3JldHVybiEwfX1mdW5jdGlvbiBteChlKXt2YXIgdD16cihlLDEpO3QhPT1udWxsJiZxbih0LGUsMSwtMSl9ZnVuY3Rpb24gTnYoZSl7dmFyIHQ9c3IoKTtyZXR1cm4gdHlwZW9mIGU9PSJmdW5jdGlvbiImJihlPWUoKSksdC5tZW1vaXplZFN0YXRlPXQuYmFzZVN0YXRlPWUsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6bGEsbGFzdFJlbmRlcmVkU3RhdGU6ZX0sdC5xdWV1ZT1lLGU9ZS5kaXNwYXRjaD12ay5iaW5kKG51bGwscWUsZSksW3QubWVtb2l6ZWRTdGF0ZSxlXX1mdW5jdGlvbiBzYShlLHQsbixyKXtyZXR1cm4gZT17dGFnOmUsY3JlYXRlOnQsZGVzdHJveTpuLGRlcHM6cixuZXh0Om51bGx9LHQ9cWUudXBkYXRlUXVldWUsdD09PW51bGw/KHQ9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0scWUudXBkYXRlUXVldWU9dCx0Lmxhc3RFZmZlY3Q9ZS5uZXh0PWUpOihuPXQubGFzdEVmZmVjdCxuPT09bnVsbD90Lmxhc3RFZmZlY3Q9ZS5uZXh0PWU6KHI9bi5uZXh0LG4ubmV4dD1lLGUubmV4dD1yLHQubGFzdEVmZmVjdD1lKSksZX1mdW5jdGlvbiB2eCgpe3JldHVybiB6bigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gYnUoZSx0LG4scil7dmFyIG89c3IoKTtxZS5mbGFnc3w9ZSxvLm1lbW9pemVkU3RhdGU9c2EoMXx0LG4sdm9pZCAwLHI9PT12b2lkIDA/bnVsbDpyKX1mdW5jdGlvbiBZYyhlLHQsbixyKXt2YXIgbz16bigpO3I9cj09PXZvaWQgMD9udWxsOnI7dmFyIGk9dm9pZCAwO2lmKG10IT09bnVsbCl7dmFyIGw9bXQubWVtb2l6ZWRTdGF0ZTtpZihpPWwuZGVzdHJveSxyIT09bnVsbCYmbGcocixsLmRlcHMpKXtvLm1lbW9pemVkU3RhdGU9c2EodCxuLGkscik7cmV0dXJufX1xZS5mbGFnc3w9ZSxvLm1lbW9pemVkU3RhdGU9c2EoMXx0LG4saSxyKX1mdW5jdGlvbiBidihlLHQpe3JldHVybiBidSg4MzkwNjU2LDgsZSx0KX1mdW5jdGlvbiB1ZyhlLHQpe3JldHVybiBZYygyMDQ4LDgsZSx0KX1mdW5jdGlvbiB5eChlLHQpe3JldHVybiBZYyg0LDIsZSx0KX1mdW5jdGlvbiB4eChlLHQpe3JldHVybiBZYyg0LDQsZSx0KX1mdW5jdGlvbiBfeChlLHQpe2lmKHR5cGVvZiB0PT0iZnVuY3Rpb24iKXJldHVybiBlPWUoKSx0KGUpLGZ1bmN0aW9uKCl7dChudWxsKX07aWYodCE9bnVsbClyZXR1cm4gZT1lKCksdC5jdXJyZW50PWUsZnVuY3Rpb24oKXt0LmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24gd3goZSx0LG4pe3JldHVybiBuPW4hPW51bGw/bi5jb25jYXQoW2VdKTpudWxsLFljKDQsNCxfeC5iaW5kKG51bGwsdCxlKSxuKX1mdW5jdGlvbiBjZygpe31mdW5jdGlvbiBTeChlLHQpe3ZhciBuPXpuKCk7dD10PT09dm9pZCAwP251bGw6dDt2YXIgcj1uLm1lbW9pemVkU3RhdGU7cmV0dXJuIHIhPT1udWxsJiZ0IT09bnVsbCYmbGcodCxyWzFdKT9yWzBdOihuLm1lbW9pemVkU3RhdGU9W2UsdF0sZSl9ZnVuY3Rpb24gRXgoZSx0KXt2YXIgbj16bigpO3Q9dD09PXZvaWQgMD9udWxsOnQ7dmFyIHI9bi5tZW1vaXplZFN0YXRlO3JldHVybiByIT09bnVsbCYmdCE9PW51bGwmJmxnKHQsclsxXSk/clswXTooZT1lKCksbi5tZW1vaXplZFN0YXRlPVtlLHRdLGUpfWZ1bmN0aW9uIEN4KGUsdCxuKXtyZXR1cm4gdWkmMjE/KGVyKG4sdCl8fChuPVQxKCkscWUubGFuZXN8PW4sY2l8PW4sZS5iYXNlU3RhdGU9ITApLHQpOihlLmJhc2VTdGF0ZSYmKGUuYmFzZVN0YXRlPSExLHVuPSEwKSxlLm1lbW9pemVkU3RhdGU9bil9ZnVuY3Rpb24gZ2soZSx0KXt2YXIgbj1QZTtQZT1uIT09MCYmND5uP246NCxlKCEwKTt2YXIgcj1yZi50cmFuc2l0aW9uO3JmLnRyYW5zaXRpb249e307dHJ5e2UoITEpLHQoKX1maW5hbGx5e1BlPW4scmYudHJhbnNpdGlvbj1yfX1mdW5jdGlvbiAkeCgpe3JldHVybiB6bigpLm1lbW9pemVkU3RhdGV9ZnVuY3Rpb24gbWsoZSx0LG4pe3ZhciByPUVvKGUpO2lmKG49e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9LGt4KGUpKVR4KHQsbik7ZWxzZSBpZihuPXJ4KGUsdCxuLHIpLG4hPT1udWxsKXt2YXIgbz1ubigpO3FuKG4sZSxyLG8pLE54KG4sdCxyKX19ZnVuY3Rpb24gdmsoZSx0LG4pe3ZhciByPUVvKGUpLG89e2xhbmU6cixhY3Rpb246bixoYXNFYWdlclN0YXRlOiExLGVhZ2VyU3RhdGU6bnVsbCxuZXh0Om51bGx9O2lmKGt4KGUpKVR4KHQsbyk7ZWxzZXt2YXIgaT1lLmFsdGVybmF0ZTtpZihlLmxhbmVzPT09MCYmKGk9PT1udWxsfHxpLmxhbmVzPT09MCkmJihpPXQubGFzdFJlbmRlcmVkUmVkdWNlcixpIT09bnVsbCkpdHJ5e3ZhciBsPXQubGFzdFJlbmRlcmVkU3RhdGUscz1pKGwsbik7aWYoby5oYXNFYWdlclN0YXRlPSEwLG8uZWFnZXJTdGF0ZT1zLGVyKHMsbCkpe3ZhciBhPXQuaW50ZXJsZWF2ZWQ7YT09PW51bGw/KG8ubmV4dD1vLHRnKHQpKTooby5uZXh0PWEubmV4dCxhLm5leHQ9byksdC5pbnRlcmxlYXZlZD1vO3JldHVybn19Y2F0Y2h7fWZpbmFsbHl7fW49cngoZSx0LG8sciksbiE9PW51bGwmJihvPW5uKCkscW4obixlLHIsbyksTngobix0LHIpKX19ZnVuY3Rpb24ga3goZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7cmV0dXJuIGU9PT1xZXx8dCE9PW51bGwmJnQ9PT1xZX1mdW5jdGlvbiBUeChlLHQpe1RzPWljPSEwO3ZhciBuPWUucGVuZGluZztuPT09bnVsbD90Lm5leHQ9dDoodC5uZXh0PW4ubmV4dCxuLm5leHQ9dCksZS5wZW5kaW5nPXR9ZnVuY3Rpb24gTngoZSx0LG4pe2lmKG4mNDE5NDI0MCl7dmFyIHI9dC5sYW5lcztyJj1lLnBlbmRpbmdMYW5lcyxufD1yLHQubGFuZXM9bixCcChlLG4pfX12YXIgbGM9e3JlYWRDb250ZXh0OmpuLHVzZUNhbGxiYWNrOkZ0LHVzZUNvbnRleHQ6RnQsdXNlRWZmZWN0OkZ0LHVzZUltcGVyYXRpdmVIYW5kbGU6RnQsdXNlSW5zZXJ0aW9uRWZmZWN0OkZ0LHVzZUxheW91dEVmZmVjdDpGdCx1c2VNZW1vOkZ0LHVzZVJlZHVjZXI6RnQsdXNlUmVmOkZ0LHVzZVN0YXRlOkZ0LHVzZURlYnVnVmFsdWU6RnQsdXNlRGVmZXJyZWRWYWx1ZTpGdCx1c2VUcmFuc2l0aW9uOkZ0LHVzZU11dGFibGVTb3VyY2U6RnQsdXNlU3luY0V4dGVybmFsU3RvcmU6RnQsdXNlSWQ6RnQsdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSx5az17cmVhZENvbnRleHQ6am4sdXNlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gc3IoKS5tZW1vaXplZFN0YXRlPVtlLHQ9PT12b2lkIDA/bnVsbDp0XSxlfSx1c2VDb250ZXh0OmpuLHVzZUVmZmVjdDpidix1c2VJbXBlcmF0aXZlSGFuZGxlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj1uIT1udWxsP24uY29uY2F0KFtlXSk6bnVsbCxidSg0MTk0MzA4LDQsX3guYmluZChudWxsLHQsZSksbil9LHVzZUxheW91dEVmZmVjdDpmdW5jdGlvbihlLHQpe3JldHVybiBidSg0MTk0MzA4LDQsZSx0KX0sdXNlSW5zZXJ0aW9uRWZmZWN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGJ1KDQsMixlLHQpfSx1c2VNZW1vOmZ1bmN0aW9uKGUsdCl7dmFyIG49c3IoKTtyZXR1cm4gdD10PT09dm9pZCAwP251bGw6dCxlPWUoKSxuLm1lbW9pemVkU3RhdGU9W2UsdF0sZX0sdXNlUmVkdWNlcjpmdW5jdGlvbihlLHQsbil7dmFyIHI9c3IoKTtyZXR1cm4gdD1uIT09dm9pZCAwP24odCk6dCxyLm1lbW9pemVkU3RhdGU9ci5iYXNlU3RhdGU9dCxlPXtwZW5kaW5nOm51bGwsaW50ZXJsZWF2ZWQ6bnVsbCxsYW5lczowLGRpc3BhdGNoOm51bGwsbGFzdFJlbmRlcmVkUmVkdWNlcjplLGxhc3RSZW5kZXJlZFN0YXRlOnR9LHIucXVldWU9ZSxlPWUuZGlzcGF0Y2g9bWsuYmluZChudWxsLHFlLGUpLFtyLm1lbW9pemVkU3RhdGUsZV19LHVzZVJlZjpmdW5jdGlvbihlKXt2YXIgdD1zcigpO3JldHVybiBlPXtjdXJyZW50OmV9LHQubWVtb2l6ZWRTdGF0ZT1lfSx1c2VTdGF0ZTpOdix1c2VEZWJ1Z1ZhbHVlOmNnLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHNyKCkubWVtb2l6ZWRTdGF0ZT1lfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9TnYoITEpLHQ9ZVswXTtyZXR1cm4gZT1nay5iaW5kKG51bGwsZVsxXSksc3IoKS5tZW1vaXplZFN0YXRlPWUsW3QsZV19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oKXt9LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1xZSxvPXNyKCk7aWYoWWUpe2lmKG49PT12b2lkIDApdGhyb3cgRXJyb3IoVyg0MDcpKTtuPW4oKX1lbHNle2lmKG49dCgpLGJ0PT09bnVsbCl0aHJvdyBFcnJvcihXKDM0OSkpO3VpJjMwfHxmeChyLHQsbil9by5tZW1vaXplZFN0YXRlPW47dmFyIGk9e3ZhbHVlOm4sZ2V0U25hcHNob3Q6dH07cmV0dXJuIG8ucXVldWU9aSxidihweC5iaW5kKG51bGwscixpLGUpLFtlXSksci5mbGFnc3w9MjA0OCxzYSg5LGh4LmJpbmQobnVsbCxyLGksbix0KSx2b2lkIDAsbnVsbCksbn0sdXNlSWQ6ZnVuY3Rpb24oKXt2YXIgZT1zcigpLHQ9YnQuaWRlbnRpZmllclByZWZpeDtpZihZZSl7dmFyIG49RHIscj1NcjtuPShyJn4oMTw8MzItWm4ociktMSkpLnRvU3RyaW5nKDMyKStuLHQ9IjoiK3QrIlIiK24sbj1pYSsrLDA8biYmKHQrPSJIIituLnRvU3RyaW5nKDMyKSksdCs9IjoifWVsc2Ugbj1waysrLHQ9IjoiK3QrInIiK24udG9TdHJpbmcoMzIpKyI6IjtyZXR1cm4gZS5tZW1vaXplZFN0YXRlPXR9LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX0seGs9e3JlYWRDb250ZXh0OmpuLHVzZUNhbGxiYWNrOlN4LHVzZUNvbnRleHQ6am4sdXNlRWZmZWN0OnVnLHVzZUltcGVyYXRpdmVIYW5kbGU6d3gsdXNlSW5zZXJ0aW9uRWZmZWN0Onl4LHVzZUxheW91dEVmZmVjdDp4eCx1c2VNZW1vOkV4LHVzZVJlZHVjZXI6b2YsdXNlUmVmOnZ4LHVzZVN0YXRlOmZ1bmN0aW9uKCl7cmV0dXJuIG9mKGxhKX0sdXNlRGVidWdWYWx1ZTpjZyx1c2VEZWZlcnJlZFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PXpuKCk7cmV0dXJuIEN4KHQsbXQubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3ZhciBlPW9mKGxhKVswXSx0PXpuKCkubWVtb2l6ZWRTdGF0ZTtyZXR1cm5bZSx0XX0sdXNlTXV0YWJsZVNvdXJjZTpjeCx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpkeCx1c2VJZDokeCx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LF9rPXtyZWFkQ29udGV4dDpqbix1c2VDYWxsYmFjazpTeCx1c2VDb250ZXh0OmpuLHVzZUVmZmVjdDp1Zyx1c2VJbXBlcmF0aXZlSGFuZGxlOnd4LHVzZUluc2VydGlvbkVmZmVjdDp5eCx1c2VMYXlvdXRFZmZlY3Q6eHgsdXNlTWVtbzpFeCx1c2VSZWR1Y2VyOmxmLHVzZVJlZjp2eCx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBsZihsYSl9LHVzZURlYnVnVmFsdWU6Y2csdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD16bigpO3JldHVybiBtdD09PW51bGw/dC5tZW1vaXplZFN0YXRlPWU6Q3godCxtdC5tZW1vaXplZFN0YXRlLGUpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9bGYobGEpWzBdLHQ9em4oKS5tZW1vaXplZFN0YXRlO3JldHVybltlLHRdfSx1c2VNdXRhYmxlU291cmNlOmN4LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmR4LHVzZUlkOiR4LHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gX2woZSx0KXt0cnl7dmFyIG49IiIscj10O2RvIG4rPVlDKHIpLHI9ci5yZXR1cm47d2hpbGUocik7dmFyIG89bn1jYXRjaChpKXtvPWAKRXJyb3IgZ2VuZXJhdGluZyBzdGFjazogYCtpLm1lc3NhZ2UrYApgK2kuc3RhY2t9cmV0dXJue3ZhbHVlOmUsc291cmNlOnQsc3RhY2s6byxkaWdlc3Q6bnVsbH19ZnVuY3Rpb24gc2YoZSx0LG4pe3JldHVybnt2YWx1ZTplLHNvdXJjZTpudWxsLHN0YWNrOm4/P251bGwsZGlnZXN0OnQ/P251bGx9fWZ1bmN0aW9uIHBoKGUsdCl7dHJ5e2NvbnNvbGUuZXJyb3IodC52YWx1ZSl9Y2F0Y2gobil7c2V0VGltZW91dChmdW5jdGlvbigpe3Rocm93IG59KX19dmFyIHdrPXR5cGVvZiBXZWFrTWFwPT0iZnVuY3Rpb24iP1dlYWtNYXA6TWFwO2Z1bmN0aW9uIGJ4KGUsdCxuKXtuPUxyKC0xLG4pLG4udGFnPTMsbi5wYXlsb2FkPXtlbGVtZW50Om51bGx9O3ZhciByPXQudmFsdWU7cmV0dXJuIG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXthY3x8KGFjPSEwLENoPXIpLHBoKGUsdCl9LG59ZnVuY3Rpb24gUngoZSx0LG4pe249THIoLTEsbiksbi50YWc9Mzt2YXIgcj1lLnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yO2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXt2YXIgbz10LnZhbHVlO24ucGF5bG9hZD1mdW5jdGlvbigpe3JldHVybiByKG8pfSxuLmNhbGxiYWNrPWZ1bmN0aW9uKCl7cGgoZSx0KX19dmFyIGk9ZS5zdGF0ZU5vZGU7cmV0dXJuIGkhPT1udWxsJiZ0eXBlb2YgaS5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtwaChlLHQpLHR5cGVvZiByIT0iZnVuY3Rpb24iJiYoU289PT1udWxsP1NvPW5ldyBTZXQoW3RoaXNdKTpTby5hZGQodGhpcykpO3ZhciBsPXQuc3RhY2s7dGhpcy5jb21wb25lbnREaWRDYXRjaCh0LnZhbHVlLHtjb21wb25lbnRTdGFjazpsIT09bnVsbD9sOiIifSl9KSxufWZ1bmN0aW9uIFJ2KGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtpZihyPT09bnVsbCl7cj1lLnBpbmdDYWNoZT1uZXcgd2s7dmFyIG89bmV3IFNldDtyLnNldCh0LG8pfWVsc2Ugbz1yLmdldCh0KSxvPT09dm9pZCAwJiYobz1uZXcgU2V0LHIuc2V0KHQsbykpO28uaGFzKG4pfHwoby5hZGQobiksZT1Eay5iaW5kKG51bGwsZSx0LG4pLHQudGhlbihlLGUpKX1mdW5jdGlvbiBQdihlKXtkb3t2YXIgdDtpZigodD1lLnRhZz09PTEzKSYmKHQ9ZS5tZW1vaXplZFN0YXRlLHQ9dCE9PW51bGw/dC5kZWh5ZHJhdGVkIT09bnVsbDohMCksdClyZXR1cm4gZTtlPWUucmV0dXJufXdoaWxlKGUhPT1udWxsKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBPdihlLHQsbixyLG8pe3JldHVybiBlLm1vZGUmMT8oZS5mbGFnc3w9NjU1MzYsZS5sYW5lcz1vLGUpOihlPT09dD9lLmZsYWdzfD02NTUzNjooZS5mbGFnc3w9MTI4LG4uZmxhZ3N8PTEzMTA3MixuLmZsYWdzJj0tNTI4MDUsbi50YWc9PT0xJiYobi5hbHRlcm5hdGU9PT1udWxsP24udGFnPTE3Oih0PUxyKC0xLDEpLHQudGFnPTIsd28obix0LDEpKSksbi5sYW5lc3w9MSksZSl9dmFyIFNrPVZyLlJlYWN0Q3VycmVudE93bmVyLHVuPSExO2Z1bmN0aW9uIFl0KGUsdCxuLHIpe3QuY2hpbGQ9ZT09PW51bGw/YXgodCxudWxsLG4scik6eWwodCxlLmNoaWxkLG4scil9ZnVuY3Rpb24gQXYoZSx0LG4scixvKXtuPW4ucmVuZGVyO3ZhciBpPXQucmVmO3JldHVybiBhbCh0LG8pLHI9c2coZSx0LG4scixpLG8pLG49YWcoKSxlIT09bnVsbCYmIXVuPyh0LnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdC5mbGFncyY9LTIwNTMsZS5sYW5lcyY9fm8sRnIoZSx0LG8pKTooWWUmJm4mJlhwKHQpLHQuZmxhZ3N8PTEsWXQoZSx0LHIsbyksdC5jaGlsZCl9ZnVuY3Rpb24gTXYoZSx0LG4scixvKXtpZihlPT09bnVsbCl7dmFyIGk9bi50eXBlO3JldHVybiB0eXBlb2YgaT09ImZ1bmN0aW9uIiYmIXlnKGkpJiZpLmRlZmF1bHRQcm9wcz09PXZvaWQgMCYmbi5jb21wYXJlPT09bnVsbCYmbi5kZWZhdWx0UHJvcHM9PT12b2lkIDA/KHQudGFnPTE1LHQudHlwZT1pLFB4KGUsdCxpLHIsbykpOihlPUF1KG4udHlwZSxudWxsLHIsdCx0Lm1vZGUsbyksZS5yZWY9dC5yZWYsZS5yZXR1cm49dCx0LmNoaWxkPWUpfWlmKGk9ZS5jaGlsZCwhKGUubGFuZXMmbykpe3ZhciBsPWkubWVtb2l6ZWRQcm9wcztpZihuPW4uY29tcGFyZSxuPW4hPT1udWxsP246cXMsbihsLHIpJiZlLnJlZj09PXQucmVmKXJldHVybiBGcihlLHQsbyl9cmV0dXJuIHQuZmxhZ3N8PTEsZT1DbyhpLHIpLGUucmVmPXQucmVmLGUucmV0dXJuPXQsdC5jaGlsZD1lfWZ1bmN0aW9uIFB4KGUsdCxuLHIsbyl7aWYoZSE9PW51bGwpe3ZhciBpPWUubWVtb2l6ZWRQcm9wcztpZihxcyhpLHIpJiZlLnJlZj09PXQucmVmKWlmKHVuPSExLHQucGVuZGluZ1Byb3BzPXI9aSwoZS5sYW5lcyZvKSE9PTApZS5mbGFncyYxMzEwNzImJih1bj0hMCk7ZWxzZSByZXR1cm4gdC5sYW5lcz1lLmxhbmVzLEZyKGUsdCxvKX1yZXR1cm4gZ2goZSx0LG4scixvKX1mdW5jdGlvbiBPeChlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHMsbz1yLmNoaWxkcmVuLGk9ZSE9PW51bGw/ZS5tZW1vaXplZFN0YXRlOm51bGw7aWYoci5tb2RlPT09ImhpZGRlbiIpaWYoISh0Lm1vZGUmMSkpdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxGZShxaSxtbiksbW58PW47ZWxzZXtpZighKG4mMTA3Mzc0MTgyNCkpcmV0dXJuIGU9aSE9PW51bGw/aS5iYXNlTGFuZXN8bjpuLHQubGFuZXM9dC5jaGlsZExhbmVzPTEwNzM3NDE4MjQsdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6ZSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSx0LnVwZGF0ZVF1ZXVlPW51bGwsRmUocWksbW4pLG1ufD1lLG51bGw7dC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxyPWkhPT1udWxsP2kuYmFzZUxhbmVzOm4sRmUocWksbW4pLG1ufD1yfWVsc2UgaSE9PW51bGw/KHI9aS5iYXNlTGFuZXN8bix0Lm1lbW9pemVkU3RhdGU9bnVsbCk6cj1uLEZlKHFpLG1uKSxtbnw9cjtyZXR1cm4gWXQoZSx0LG8sbiksdC5jaGlsZH1mdW5jdGlvbiBBeChlLHQpe3ZhciBuPXQucmVmOyhlPT09bnVsbCYmbiE9PW51bGx8fGUhPT1udWxsJiZlLnJlZiE9PW4pJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpfWZ1bmN0aW9uIGdoKGUsdCxuLHIsbyl7dmFyIGk9ZG4obik/c2k6R3QuY3VycmVudDtyZXR1cm4gaT1tbCh0LGkpLGFsKHQsbyksbj1zZyhlLHQsbixyLGksbykscj1hZygpLGUhPT1udWxsJiYhdW4/KHQudXBkYXRlUXVldWU9ZS51cGRhdGVRdWV1ZSx0LmZsYWdzJj0tMjA1MyxlLmxhbmVzJj1+byxGcihlLHQsbykpOihZZSYmciYmWHAodCksdC5mbGFnc3w9MSxZdChlLHQsbixvKSx0LmNoaWxkKX1mdW5jdGlvbiBEdihlLHQsbixyLG8pe2lmKGRuKG4pKXt2YXIgaT0hMDtadSh0KX1lbHNlIGk9ITE7aWYoYWwodCxvKSx0LnN0YXRlTm9kZT09PW51bGwpUnUoZSx0KSxseCh0LG4sciksaGgodCxuLHIsbykscj0hMDtlbHNlIGlmKGU9PT1udWxsKXt2YXIgbD10LnN0YXRlTm9kZSxzPXQubWVtb2l6ZWRQcm9wcztsLnByb3BzPXM7dmFyIGE9bC5jb250ZXh0LHU9bi5jb250ZXh0VHlwZTt0eXBlb2YgdT09Im9iamVjdCImJnUhPT1udWxsP3U9am4odSk6KHU9ZG4obik/c2k6R3QuY3VycmVudCx1PW1sKHQsdSkpO3ZhciBjPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLGQ9dHlwZW9mIGM9PSJmdW5jdGlvbiJ8fHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlPT0iZnVuY3Rpb24iO2R8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PXJ8fGEhPT11KSYma3YodCxsLHIsdSksc289ITE7dmFyIGY9dC5tZW1vaXplZFN0YXRlO2wuc3RhdGU9ZixyYyh0LHIsbCxvKSxhPXQubWVtb2l6ZWRTdGF0ZSxzIT09cnx8ZiE9PWF8fGNuLmN1cnJlbnR8fHNvPyh0eXBlb2YgYz09ImZ1bmN0aW9uIiYmKGZoKHQsbixjLHIpLGE9dC5tZW1vaXplZFN0YXRlKSwocz1zb3x8JHYodCxuLHMscixmLGEsdSkpPyhkfHx0eXBlb2YgbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50IT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsTW91bnQ9PSJmdW5jdGlvbiImJmwuY29tcG9uZW50V2lsbE1vdW50KCksdHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudD09ImZ1bmN0aW9uIiYmbC5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkpOih0eXBlb2YgbC5jb21wb25lbnREaWRNb3VudD09ImZ1bmN0aW9uIiYmKHQuZmxhZ3N8PTQxOTQzMDgpLHQubWVtb2l6ZWRQcm9wcz1yLHQubWVtb2l6ZWRTdGF0ZT1hKSxsLnByb3BzPXIsbC5zdGF0ZT1hLGwuY29udGV4dD11LHI9cyk6KHR5cGVvZiBsLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NDE5NDMwOCkscj0hMSl9ZWxzZXtsPXQuc3RhdGVOb2RlLG94KGUsdCkscz10Lm1lbW9pemVkUHJvcHMsdT10LnR5cGU9PT10LmVsZW1lbnRUeXBlP3M6S24odC50eXBlLHMpLGwucHJvcHM9dSxkPXQucGVuZGluZ1Byb3BzLGY9bC5jb250ZXh0LGE9bi5jb250ZXh0VHlwZSx0eXBlb2YgYT09Im9iamVjdCImJmEhPT1udWxsP2E9am4oYSk6KGE9ZG4obik/c2k6R3QuY3VycmVudCxhPW1sKHQsYSkpO3ZhciBoPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzOyhjPXR5cGVvZiBoPT0iZnVuY3Rpb24ifHx0eXBlb2YgbC5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZT09ImZ1bmN0aW9uIil8fHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24iJiZ0eXBlb2YgbC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIT0iZnVuY3Rpb24ifHwocyE9PWR8fGYhPT1hKSYma3YodCxsLHIsYSksc289ITEsZj10Lm1lbW9pemVkU3RhdGUsbC5zdGF0ZT1mLHJjKHQscixsLG8pO3ZhciBnPXQubWVtb2l6ZWRTdGF0ZTtzIT09ZHx8ZiE9PWd8fGNuLmN1cnJlbnR8fHNvPyh0eXBlb2YgaD09ImZ1bmN0aW9uIiYmKGZoKHQsbixoLHIpLGc9dC5tZW1vaXplZFN0YXRlKSwodT1zb3x8JHYodCxuLHUscixmLGcsYSl8fCExKT8oY3x8dHlwZW9mIGwuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiImJnR5cGVvZiBsLmNvbXBvbmVudFdpbGxVcGRhdGUhPSJmdW5jdGlvbiJ8fCh0eXBlb2YgbC5jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLmNvbXBvbmVudFdpbGxVcGRhdGUocixnLGEpLHR5cGVvZiBsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlPT0iZnVuY3Rpb24iJiZsLlVOU0FGRV9jb21wb25lbnRXaWxsVXBkYXRlKHIsZyxhKSksdHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlPT0iZnVuY3Rpb24iJiYodC5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGU9PSJmdW5jdGlvbiImJih0LmZsYWdzfD0xMDI0KSk6KHR5cGVvZiBsLmNvbXBvbmVudERpZFVwZGF0ZSE9ImZ1bmN0aW9uInx8cz09PWUubWVtb2l6ZWRQcm9wcyYmZj09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTQpLHR5cGVvZiBsLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZmPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9MTAyNCksdC5tZW1vaXplZFByb3BzPXIsdC5tZW1vaXplZFN0YXRlPWcpLGwucHJvcHM9cixsLnN0YXRlPWcsbC5jb250ZXh0PWEscj11KToodHlwZW9mIGwuY29tcG9uZW50RGlkVXBkYXRlIT0iZnVuY3Rpb24ifHxzPT09ZS5tZW1vaXplZFByb3BzJiZmPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9NCksdHlwZW9mIGwuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUhPSJmdW5jdGlvbiJ8fHM9PT1lLm1lbW9pemVkUHJvcHMmJmY9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD0xMDI0KSxyPSExKX1yZXR1cm4gbWgoZSx0LG4scixpLG8pfWZ1bmN0aW9uIG1oKGUsdCxuLHIsbyxpKXtBeChlLHQpO3ZhciBsPSh0LmZsYWdzJjEyOCkhPT0wO2lmKCFyJiYhbClyZXR1cm4gbyYmX3YodCxuLCExKSxGcihlLHQsaSk7cj10LnN0YXRlTm9kZSxTay5jdXJyZW50PXQ7dmFyIHM9bCYmdHlwZW9mIG4uZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yIT0iZnVuY3Rpb24iP251bGw6ci5yZW5kZXIoKTtyZXR1cm4gdC5mbGFnc3w9MSxlIT09bnVsbCYmbD8odC5jaGlsZD15bCh0LGUuY2hpbGQsbnVsbCxpKSx0LmNoaWxkPXlsKHQsbnVsbCxzLGkpKTpZdChlLHQscyxpKSx0Lm1lbW9pemVkU3RhdGU9ci5zdGF0ZSxvJiZfdih0LG4sITApLHQuY2hpbGR9ZnVuY3Rpb24gTXgoZSl7dmFyIHQ9ZS5zdGF0ZU5vZGU7dC5wZW5kaW5nQ29udGV4dD94dihlLHQucGVuZGluZ0NvbnRleHQsdC5wZW5kaW5nQ29udGV4dCE9PXQuY29udGV4dCk6dC5jb250ZXh0JiZ4dihlLHQuY29udGV4dCwhMSkscmcoZSx0LmNvbnRhaW5lckluZm8pfWZ1bmN0aW9uIEx2KGUsdCxuLHIsbyl7cmV0dXJuIHZsKCksSnAobyksdC5mbGFnc3w9MjU2LFl0KGUsdCxuLHIpLHQuY2hpbGR9dmFyIHZoPXtkZWh5ZHJhdGVkOm51bGwsdHJlZUNvbnRleHQ6bnVsbCxyZXRyeUxhbmU6MH07ZnVuY3Rpb24geWgoZSl7cmV0dXJue2Jhc2VMYW5lczplLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9fWZ1bmN0aW9uIER4KGUsdCxuKXt2YXIgcj10LnBlbmRpbmdQcm9wcyxvPUplLmN1cnJlbnQsaT0hMSxsPSh0LmZsYWdzJjEyOCkhPT0wLHM7aWYoKHM9bCl8fChzPWUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGU9PT1udWxsPyExOihvJjIpIT09MCkscz8oaT0hMCx0LmZsYWdzJj0tMTI5KTooZT09PW51bGx8fGUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiYob3w9MSksRmUoSmUsbyYxKSxlPT09bnVsbClyZXR1cm4gY2godCksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJihlPWUuZGVoeWRyYXRlZCxlIT09bnVsbCk/KHQubW9kZSYxP2UuZGF0YT09PSIkISI/dC5sYW5lcz04OnQubGFuZXM9MTA3Mzc0MTgyNDp0LmxhbmVzPTEsbnVsbCk6KGw9ci5jaGlsZHJlbixlPXIuZmFsbGJhY2ssaT8ocj10Lm1vZGUsaT10LmNoaWxkLGw9e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46bH0sIShyJjEpJiZpIT09bnVsbD8oaS5jaGlsZExhbmVzPTAsaS5wZW5kaW5nUHJvcHM9bCk6aT1KYyhsLHIsMCxudWxsKSxlPW5pKGUscixuLG51bGwpLGkucmV0dXJuPXQsZS5yZXR1cm49dCxpLnNpYmxpbmc9ZSx0LmNoaWxkPWksdC5jaGlsZC5tZW1vaXplZFN0YXRlPXloKG4pLHQubWVtb2l6ZWRTdGF0ZT12aCxlKTpkZyh0LGwpKTtpZihvPWUubWVtb2l6ZWRTdGF0ZSxvIT09bnVsbCYmKHM9by5kZWh5ZHJhdGVkLHMhPT1udWxsKSlyZXR1cm4gRWsoZSx0LGwscixzLG8sbik7aWYoaSl7aT1yLmZhbGxiYWNrLGw9dC5tb2RlLG89ZS5jaGlsZCxzPW8uc2libGluZzt2YXIgYT17bW9kZToiaGlkZGVuIixjaGlsZHJlbjpyLmNoaWxkcmVufTtyZXR1cm4hKGwmMSkmJnQuY2hpbGQhPT1vPyhyPXQuY2hpbGQsci5jaGlsZExhbmVzPTAsci5wZW5kaW5nUHJvcHM9YSx0LmRlbGV0aW9ucz1udWxsKToocj1DbyhvLGEpLHIuc3VidHJlZUZsYWdzPW8uc3VidHJlZUZsYWdzJjE0NjgwMDY0KSxzIT09bnVsbD9pPUNvKHMsaSk6KGk9bmkoaSxsLG4sbnVsbCksaS5mbGFnc3w9MiksaS5yZXR1cm49dCxyLnJldHVybj10LHIuc2libGluZz1pLHQuY2hpbGQ9cixyPWksaT10LmNoaWxkLGw9ZS5jaGlsZC5tZW1vaXplZFN0YXRlLGw9bD09PW51bGw/eWgobik6e2Jhc2VMYW5lczpsLmJhc2VMYW5lc3xuLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOmwudHJhbnNpdGlvbnN9LGkubWVtb2l6ZWRTdGF0ZT1sLGkuY2hpbGRMYW5lcz1lLmNoaWxkTGFuZXMmfm4sdC5tZW1vaXplZFN0YXRlPXZoLHJ9cmV0dXJuIGk9ZS5jaGlsZCxlPWkuc2libGluZyxyPUNvKGkse21vZGU6InZpc2libGUiLGNoaWxkcmVuOnIuY2hpbGRyZW59KSwhKHQubW9kZSYxKSYmKHIubGFuZXM9biksci5yZXR1cm49dCxyLnNpYmxpbmc9bnVsbCxlIT09bnVsbCYmKG49dC5kZWxldGlvbnMsbj09PW51bGw/KHQuZGVsZXRpb25zPVtlXSx0LmZsYWdzfD0xNik6bi5wdXNoKGUpKSx0LmNoaWxkPXIsdC5tZW1vaXplZFN0YXRlPW51bGwscn1mdW5jdGlvbiBkZyhlLHQpe3JldHVybiB0PUpjKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjp0fSxlLm1vZGUsMCxudWxsKSx0LnJldHVybj1lLGUuY2hpbGQ9dH1mdW5jdGlvbiBpdShlLHQsbixyKXtyZXR1cm4gciE9PW51bGwmJkpwKHIpLHlsKHQsZS5jaGlsZCxudWxsLG4pLGU9ZGcodCx0LnBlbmRpbmdQcm9wcy5jaGlsZHJlbiksZS5mbGFnc3w9Mix0Lm1lbW9pemVkU3RhdGU9bnVsbCxlfWZ1bmN0aW9uIEVrKGUsdCxuLHIsbyxpLGwpe2lmKG4pcmV0dXJuIHQuZmxhZ3MmMjU2Pyh0LmZsYWdzJj0tMjU3LHI9c2YoRXJyb3IoVyg0MjIpKSksaXUoZSx0LGwscikpOnQubWVtb2l6ZWRTdGF0ZSE9PW51bGw/KHQuY2hpbGQ9ZS5jaGlsZCx0LmZsYWdzfD0xMjgsbnVsbCk6KGk9ci5mYWxsYmFjayxvPXQubW9kZSxyPUpjKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpyLmNoaWxkcmVufSxvLDAsbnVsbCksaT1uaShpLG8sbCxudWxsKSxpLmZsYWdzfD0yLHIucmV0dXJuPXQsaS5yZXR1cm49dCxyLnNpYmxpbmc9aSx0LmNoaWxkPXIsdC5tb2RlJjEmJnlsKHQsZS5jaGlsZCxudWxsLGwpLHQuY2hpbGQubWVtb2l6ZWRTdGF0ZT15aChsKSx0Lm1lbW9pemVkU3RhdGU9dmgsaSk7aWYoISh0Lm1vZGUmMSkpcmV0dXJuIGl1KGUsdCxsLG51bGwpO2lmKG8uZGF0YT09PSIkISIpe2lmKHI9by5uZXh0U2libGluZyYmby5uZXh0U2libGluZy5kYXRhc2V0LHIpdmFyIHM9ci5kZ3N0O3JldHVybiByPXMsaT1FcnJvcihXKDQxOSkpLHI9c2YoaSxyLHZvaWQgMCksaXUoZSx0LGwscil9aWYocz0obCZlLmNoaWxkTGFuZXMpIT09MCx1bnx8cyl7aWYocj1idCxyIT09bnVsbCl7c3dpdGNoKGwmLWwpe2Nhc2UgNDpvPTI7YnJlYWs7Y2FzZSAxNjpvPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0Om89MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bz0yNjg0MzU0NTY7YnJlYWs7ZGVmYXVsdDpvPTB9bz1vJihyLnN1c3BlbmRlZExhbmVzfGwpPzA6byxvIT09MCYmbyE9PWkucmV0cnlMYW5lJiYoaS5yZXRyeUxhbmU9byx6cihlLG8pLHFuKHIsZSxvLC0xKSl9cmV0dXJuIHZnKCkscj1zZihFcnJvcihXKDQyMSkpKSxpdShlLHQsbCxyKX1yZXR1cm4gby5kYXRhPT09IiQ/Ij8odC5mbGFnc3w9MTI4LHQuY2hpbGQ9ZS5jaGlsZCx0PUxrLmJpbmQobnVsbCxlKSxvLl9yZWFjdFJldHJ5PXQsbnVsbCk6KGU9aS50cmVlQ29udGV4dCx4bj1fbyhvLm5leHRTaWJsaW5nKSxfbj10LFllPSEwLFhuPW51bGwsZSE9PW51bGwmJihQbltPbisrXT1NcixQbltPbisrXT1EcixQbltPbisrXT1haSxNcj1lLmlkLERyPWUub3ZlcmZsb3csYWk9dCksdD1kZyh0LHIuY2hpbGRyZW4pLHQuZmxhZ3N8PTQwOTYsdCl9ZnVuY3Rpb24gSXYoZSx0LG4pe2UubGFuZXN8PXQ7dmFyIHI9ZS5hbHRlcm5hdGU7ciE9PW51bGwmJihyLmxhbmVzfD10KSxkaChlLnJldHVybix0LG4pfWZ1bmN0aW9uIGFmKGUsdCxuLHIsbyl7dmFyIGk9ZS5tZW1vaXplZFN0YXRlO2k9PT1udWxsP2UubWVtb2l6ZWRTdGF0ZT17aXNCYWNrd2FyZHM6dCxyZW5kZXJpbmc6bnVsbCxyZW5kZXJpbmdTdGFydFRpbWU6MCxsYXN0OnIsdGFpbDpuLHRhaWxNb2RlOm99OihpLmlzQmFja3dhcmRzPXQsaS5yZW5kZXJpbmc9bnVsbCxpLnJlbmRlcmluZ1N0YXJ0VGltZT0wLGkubGFzdD1yLGkudGFpbD1uLGkudGFpbE1vZGU9byl9ZnVuY3Rpb24gTHgoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzLG89ci5yZXZlYWxPcmRlcixpPXIudGFpbDtpZihZdChlLHQsci5jaGlsZHJlbixuKSxyPUplLmN1cnJlbnQsciYyKXI9ciYxfDIsdC5mbGFnc3w9MTI4O2Vsc2V7aWYoZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWU6Zm9yKGU9dC5jaGlsZDtlIT09bnVsbDspe2lmKGUudGFnPT09MTMpZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmSXYoZSxuLHQpO2Vsc2UgaWYoZS50YWc9PT0xOSlJdihlLG4sdCk7ZWxzZSBpZihlLmNoaWxkIT09bnVsbCl7ZS5jaGlsZC5yZXR1cm49ZSxlPWUuY2hpbGQ7Y29udGludWV9aWYoZT09PXQpYnJlYWsgZTtmb3IoO2Uuc2libGluZz09PW51bGw7KXtpZihlLnJldHVybj09PW51bGx8fGUucmV0dXJuPT09dClicmVhayBlO2U9ZS5yZXR1cm59ZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZ31yJj0xfWlmKEZlKEplLHIpLCEodC5tb2RlJjEpKXQubWVtb2l6ZWRTdGF0ZT1udWxsO2Vsc2Ugc3dpdGNoKG8pe2Nhc2UiZm9yd2FyZHMiOmZvcihuPXQuY2hpbGQsbz1udWxsO24hPT1udWxsOyllPW4uYWx0ZXJuYXRlLGUhPT1udWxsJiZvYyhlKT09PW51bGwmJihvPW4pLG49bi5zaWJsaW5nO249byxuPT09bnVsbD8obz10LmNoaWxkLHQuY2hpbGQ9bnVsbCk6KG89bi5zaWJsaW5nLG4uc2libGluZz1udWxsKSxhZih0LCExLG8sbixpKTticmVhaztjYXNlImJhY2t3YXJkcyI6Zm9yKG49bnVsbCxvPXQuY2hpbGQsdC5jaGlsZD1udWxsO28hPT1udWxsOyl7aWYoZT1vLmFsdGVybmF0ZSxlIT09bnVsbCYmb2MoZSk9PT1udWxsKXt0LmNoaWxkPW87YnJlYWt9ZT1vLnNpYmxpbmcsby5zaWJsaW5nPW4sbj1vLG89ZX1hZih0LCEwLG4sbnVsbCxpKTticmVhaztjYXNlInRvZ2V0aGVyIjphZih0LCExLG51bGwsbnVsbCx2b2lkIDApO2JyZWFrO2RlZmF1bHQ6dC5tZW1vaXplZFN0YXRlPW51bGx9cmV0dXJuIHQuY2hpbGR9ZnVuY3Rpb24gUnUoZSx0KXshKHQubW9kZSYxKSYmZSE9PW51bGwmJihlLmFsdGVybmF0ZT1udWxsLHQuYWx0ZXJuYXRlPW51bGwsdC5mbGFnc3w9Mil9ZnVuY3Rpb24gRnIoZSx0LG4pe2lmKGUhPT1udWxsJiYodC5kZXBlbmRlbmNpZXM9ZS5kZXBlbmRlbmNpZXMpLGNpfD10LmxhbmVzLCEobiZ0LmNoaWxkTGFuZXMpKXJldHVybiBudWxsO2lmKGUhPT1udWxsJiZ0LmNoaWxkIT09ZS5jaGlsZCl0aHJvdyBFcnJvcihXKDE1MykpO2lmKHQuY2hpbGQhPT1udWxsKXtmb3IoZT10LmNoaWxkLG49Q28oZSxlLnBlbmRpbmdQcm9wcyksdC5jaGlsZD1uLG4ucmV0dXJuPXQ7ZS5zaWJsaW5nIT09bnVsbDspZT1lLnNpYmxpbmcsbj1uLnNpYmxpbmc9Q28oZSxlLnBlbmRpbmdQcm9wcyksbi5yZXR1cm49dDtuLnNpYmxpbmc9bnVsbH1yZXR1cm4gdC5jaGlsZH1mdW5jdGlvbiBDayhlLHQsbil7c3dpdGNoKHQudGFnKXtjYXNlIDM6TXgodCksdmwoKTticmVhaztjYXNlIDU6dXgodCk7YnJlYWs7Y2FzZSAxOmRuKHQudHlwZSkmJlp1KHQpO2JyZWFrO2Nhc2UgNDpyZyh0LHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pO2JyZWFrO2Nhc2UgMTA6dmFyIHI9dC50eXBlLl9jb250ZXh0LG89dC5tZW1vaXplZFByb3BzLnZhbHVlO0ZlKHRjLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPW87YnJlYWs7Y2FzZSAxMzppZihyPXQubWVtb2l6ZWRTdGF0ZSxyIT09bnVsbClyZXR1cm4gci5kZWh5ZHJhdGVkIT09bnVsbD8oRmUoSmUsSmUuY3VycmVudCYxKSx0LmZsYWdzfD0xMjgsbnVsbCk6biZ0LmNoaWxkLmNoaWxkTGFuZXM/RHgoZSx0LG4pOihGZShKZSxKZS5jdXJyZW50JjEpLGU9RnIoZSx0LG4pLGUhPT1udWxsP2Uuc2libGluZzpudWxsKTtGZShKZSxKZS5jdXJyZW50JjEpO2JyZWFrO2Nhc2UgMTk6aWYocj0obiZ0LmNoaWxkTGFuZXMpIT09MCxlLmZsYWdzJjEyOCl7aWYocilyZXR1cm4gTHgoZSx0LG4pO3QuZmxhZ3N8PTEyOH1pZihvPXQubWVtb2l6ZWRTdGF0ZSxvIT09bnVsbCYmKG8ucmVuZGVyaW5nPW51bGwsby50YWlsPW51bGwsby5sYXN0RWZmZWN0PW51bGwpLEZlKEplLEplLmN1cnJlbnQpLHIpYnJlYWs7cmV0dXJuIG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiB0LmxhbmVzPTAsT3goZSx0LG4pfXJldHVybiBGcihlLHQsbil9dmFyIEl4LHhoLGp4LHp4O0l4PWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXQuY2hpbGQ7biE9PW51bGw7KXtpZihuLnRhZz09PTV8fG4udGFnPT09NillLmFwcGVuZENoaWxkKG4uc3RhdGVOb2RlKTtlbHNlIGlmKG4udGFnIT09NCYmbi5jaGlsZCE9PW51bGwpe24uY2hpbGQucmV0dXJuPW4sbj1uLmNoaWxkO2NvbnRpbnVlfWlmKG49PT10KWJyZWFrO2Zvcig7bi5zaWJsaW5nPT09bnVsbDspe2lmKG4ucmV0dXJuPT09bnVsbHx8bi5yZXR1cm49PT10KXJldHVybjtuPW4ucmV0dXJufW4uc2libGluZy5yZXR1cm49bi5yZXR1cm4sbj1uLnNpYmxpbmd9fTt4aD1mdW5jdGlvbigpe307ang9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89ZS5tZW1vaXplZFByb3BzO2lmKG8hPT1yKXtlPXQuc3RhdGVOb2RlLFpvKGdyLmN1cnJlbnQpO3ZhciBpPW51bGw7c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOm89QmYoZSxvKSxyPUJmKGUsciksaT1bXTticmVhaztjYXNlInNlbGVjdCI6bz10dCh7fSxvLHt2YWx1ZTp2b2lkIDB9KSxyPXR0KHt9LHIse3ZhbHVlOnZvaWQgMH0pLGk9W107YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6bz1WZihlLG8pLHI9VmYoZSxyKSxpPVtdO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIG8ub25DbGljayE9ImZ1bmN0aW9uIiYmdHlwZW9mIHIub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz1RdSl9S2YobixyKTt2YXIgbDtuPW51bGw7Zm9yKHUgaW4gbylpZighci5oYXNPd25Qcm9wZXJ0eSh1KSYmby5oYXNPd25Qcm9wZXJ0eSh1KSYmb1t1XSE9bnVsbClpZih1PT09InN0eWxlIil7dmFyIHM9b1t1XTtmb3IobCBpbiBzKXMuaGFzT3duUHJvcGVydHkobCkmJihufHwobj17fSksbltsXT0iIil9ZWxzZSB1IT09ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIiYmdSE9PSJjaGlsZHJlbiImJnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiZ1IT09ImF1dG9Gb2N1cyImJihLcy5oYXNPd25Qcm9wZXJ0eSh1KT9pfHwoaT1bXSk6KGk9aXx8W10pLnB1c2godSxudWxsKSk7Zm9yKHUgaW4gcil7dmFyIGE9clt1XTtpZihzPW8hPW51bGw/b1t1XTp2b2lkIDAsci5oYXNPd25Qcm9wZXJ0eSh1KSYmYSE9PXMmJihhIT1udWxsfHxzIT1udWxsKSlpZih1PT09InN0eWxlIilpZihzKXtmb3IobCBpbiBzKSFzLmhhc093blByb3BlcnR5KGwpfHxhJiZhLmhhc093blByb3BlcnR5KGwpfHwobnx8KG49e30pLG5bbF09IiIpO2ZvcihsIGluIGEpYS5oYXNPd25Qcm9wZXJ0eShsKSYmc1tsXSE9PWFbbF0mJihufHwobj17fSksbltsXT1hW2xdKX1lbHNlIG58fChpfHwoaT1bXSksaS5wdXNoKHUsbikpLG49YTtlbHNlIHU9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiPyhhPWE/YS5fX2h0bWw6dm9pZCAwLHM9cz9zLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmcyE9PWEmJihpPWl8fFtdKS5wdXNoKHUsYSkpOnU9PT0iY2hpbGRyZW4iP3R5cGVvZiBhIT0ic3RyaW5nIiYmdHlwZW9mIGEhPSJudW1iZXIifHwoaT1pfHxbXSkucHVzaCh1LCIiK2EpOnUhPT0ic3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIiYmdSE9PSJzdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmciJiYoS3MuaGFzT3duUHJvcGVydHkodSk/KGEhPW51bGwmJnU9PT0ib25TY3JvbGwiJiZVZSgic2Nyb2xsIixlKSxpfHxzPT09YXx8KGk9W10pKTooaT1pfHxbXSkucHVzaCh1LGEpKX1uJiYoaT1pfHxbXSkucHVzaCgic3R5bGUiLG4pO3ZhciB1PWk7KHQudXBkYXRlUXVldWU9dSkmJih0LmZsYWdzfD00KX19O3p4PWZ1bmN0aW9uKGUsdCxuLHIpe24hPT1yJiYodC5mbGFnc3w9NCl9O2Z1bmN0aW9uIGlzKGUsdCl7aWYoIVllKXN3aXRjaChlLnRhaWxNb2RlKXtjYXNlImhpZGRlbiI6dD1lLnRhaWw7Zm9yKHZhciBuPW51bGw7dCE9PW51bGw7KXQuYWx0ZXJuYXRlIT09bnVsbCYmKG49dCksdD10LnNpYmxpbmc7bj09PW51bGw/ZS50YWlsPW51bGw6bi5zaWJsaW5nPW51bGw7YnJlYWs7Y2FzZSJjb2xsYXBzZWQiOm49ZS50YWlsO2Zvcih2YXIgcj1udWxsO24hPT1udWxsOyluLmFsdGVybmF0ZSE9PW51bGwmJihyPW4pLG49bi5zaWJsaW5nO3I9PT1udWxsP3R8fGUudGFpbD09PW51bGw/ZS50YWlsPW51bGw6ZS50YWlsLnNpYmxpbmc9bnVsbDpyLnNpYmxpbmc9bnVsbH19ZnVuY3Rpb24gQnQoZSl7dmFyIHQ9ZS5hbHRlcm5hdGUhPT1udWxsJiZlLmFsdGVybmF0ZS5jaGlsZD09PWUuY2hpbGQsbj0wLHI9MDtpZih0KWZvcih2YXIgbz1lLmNoaWxkO28hPT1udWxsOylufD1vLmxhbmVzfG8uY2hpbGRMYW5lcyxyfD1vLnN1YnRyZWVGbGFncyYxNDY4MDA2NCxyfD1vLmZsYWdzJjE0NjgwMDY0LG8ucmV0dXJuPWUsbz1vLnNpYmxpbmc7ZWxzZSBmb3Iobz1lLmNoaWxkO28hPT1udWxsOylufD1vLmxhbmVzfG8uY2hpbGRMYW5lcyxyfD1vLnN1YnRyZWVGbGFncyxyfD1vLmZsYWdzLG8ucmV0dXJuPWUsbz1vLnNpYmxpbmc7cmV0dXJuIGUuc3VidHJlZUZsYWdzfD1yLGUuY2hpbGRMYW5lcz1uLHR9ZnVuY3Rpb24gJGsoZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzO3N3aXRjaChRcCh0KSx0LnRhZyl7Y2FzZSAyOmNhc2UgMTY6Y2FzZSAxNTpjYXNlIDA6Y2FzZSAxMTpjYXNlIDc6Y2FzZSA4OmNhc2UgMTI6Y2FzZSA5OmNhc2UgMTQ6cmV0dXJuIEJ0KHQpLG51bGw7Y2FzZSAxOnJldHVybiBkbih0LnR5cGUpJiZKdSgpLEJ0KHQpLG51bGw7Y2FzZSAzOnJldHVybiByPXQuc3RhdGVOb2RlLHhsKCksR2UoY24pLEdlKEd0KSxpZygpLHIucGVuZGluZ0NvbnRleHQmJihyLmNvbnRleHQ9ci5wZW5kaW5nQ29udGV4dCxyLnBlbmRpbmdDb250ZXh0PW51bGwpLChlPT09bnVsbHx8ZS5jaGlsZD09PW51bGwpJiYocnUodCk/dC5mbGFnc3w9NDplPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmISh0LmZsYWdzJjI1Nil8fCh0LmZsYWdzfD0xMDI0LFhuIT09bnVsbCYmKFRoKFhuKSxYbj1udWxsKSkpLHhoKGUsdCksQnQodCksbnVsbDtjYXNlIDU6b2codCk7dmFyIG89Wm8ob2EuY3VycmVudCk7aWYobj10LnR5cGUsZSE9PW51bGwmJnQuc3RhdGVOb2RlIT1udWxsKWp4KGUsdCxuLHIsbyksZS5yZWYhPT10LnJlZiYmKHQuZmxhZ3N8PTUxMix0LmZsYWdzfD0yMDk3MTUyKTtlbHNle2lmKCFyKXtpZih0LnN0YXRlTm9kZT09PW51bGwpdGhyb3cgRXJyb3IoVygxNjYpKTtyZXR1cm4gQnQodCksbnVsbH1pZihlPVpvKGdyLmN1cnJlbnQpLHJ1KHQpKXtyPXQuc3RhdGVOb2RlLG49dC50eXBlO3ZhciBpPXQubWVtb2l6ZWRQcm9wcztzd2l0Y2goclt1cl09dCxyW25hXT1pLGU9KHQubW9kZSYxKSE9PTAsbil7Y2FzZSJkaWFsb2ciOlVlKCJjYW5jZWwiLHIpLFVlKCJjbG9zZSIscik7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjpVZSgibG9hZCIscik7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKG89MDtvPHZzLmxlbmd0aDtvKyspVWUodnNbb10scik7YnJlYWs7Y2FzZSJzb3VyY2UiOlVlKCJlcnJvciIscik7YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6VWUoImVycm9yIixyKSxVZSgibG9hZCIscik7YnJlYWs7Y2FzZSJkZXRhaWxzIjpVZSgidG9nZ2xlIixyKTticmVhaztjYXNlImlucHV0IjpLbShyLGkpLFVlKCJpbnZhbGlkIixyKTticmVhaztjYXNlInNlbGVjdCI6ci5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIWkubXVsdGlwbGV9LFVlKCJpbnZhbGlkIixyKTticmVhaztjYXNlInRleHRhcmVhIjpZbShyLGkpLFVlKCJpbnZhbGlkIixyKX1LZihuLGkpLG89bnVsbDtmb3IodmFyIGwgaW4gaSlpZihpLmhhc093blByb3BlcnR5KGwpKXt2YXIgcz1pW2xdO2w9PT0iY2hpbGRyZW4iP3R5cGVvZiBzPT0ic3RyaW5nIj9yLnRleHRDb250ZW50IT09cyYmKGkuc3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIT09ITAmJm51KHIudGV4dENvbnRlbnQscyxlKSxvPVsiY2hpbGRyZW4iLHNdKTp0eXBlb2Ygcz09Im51bWJlciImJnIudGV4dENvbnRlbnQhPT0iIitzJiYoaS5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmbnUoci50ZXh0Q29udGVudCxzLGUpLG89WyJjaGlsZHJlbiIsIiIrc10pOktzLmhhc093blByb3BlcnR5KGwpJiZzIT1udWxsJiZsPT09Im9uU2Nyb2xsIiYmVWUoInNjcm9sbCIscil9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOllhKHIpLEdtKHIsaSwhMCk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6WWEociksWG0ocik7YnJlYWs7Y2FzZSJzZWxlY3QiOmNhc2Uib3B0aW9uIjpicmVhaztkZWZhdWx0OnR5cGVvZiBpLm9uQ2xpY2s9PSJmdW5jdGlvbiImJihyLm9uY2xpY2s9UXUpfXI9byx0LnVwZGF0ZVF1ZXVlPXIsciE9PW51bGwmJih0LmZsYWdzfD00KX1lbHNle2w9by5ub2RlVHlwZT09PTk/bzpvLm93bmVyRG9jdW1lbnQsZT09PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiYmKGU9ZjEobikpLGU9PT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI/bj09PSJzY3JpcHQiPyhlPWwuY3JlYXRlRWxlbWVudCgiZGl2IiksZS5pbm5lckhUTUw9IjxzY3JpcHQ+PFwvc2NyaXB0PiIsZT1lLnJlbW92ZUNoaWxkKGUuZmlyc3RDaGlsZCkpOnR5cGVvZiByLmlzPT0ic3RyaW5nIj9lPWwuY3JlYXRlRWxlbWVudChuLHtpczpyLmlzfSk6KGU9bC5jcmVhdGVFbGVtZW50KG4pLG49PT0ic2VsZWN0IiYmKGw9ZSxyLm11bHRpcGxlP2wubXVsdGlwbGU9ITA6ci5zaXplJiYobC5zaXplPXIuc2l6ZSkpKTplPWwuY3JlYXRlRWxlbWVudE5TKGUsbiksZVt1cl09dCxlW25hXT1yLEl4KGUsdCwhMSwhMSksdC5zdGF0ZU5vZGU9ZTtlOntzd2l0Y2gobD1HZihuLHIpLG4pe2Nhc2UiZGlhbG9nIjpVZSgiY2FuY2VsIixlKSxVZSgiY2xvc2UiLGUpLG89cjticmVhaztjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiZW1iZWQiOlVlKCJsb2FkIixlKSxvPXI7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKG89MDtvPHZzLmxlbmd0aDtvKyspVWUodnNbb10sZSk7bz1yO2JyZWFrO2Nhc2Uic291cmNlIjpVZSgiZXJyb3IiLGUpLG89cjticmVhaztjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJsaW5rIjpVZSgiZXJyb3IiLGUpLFVlKCJsb2FkIixlKSxvPXI7YnJlYWs7Y2FzZSJkZXRhaWxzIjpVZSgidG9nZ2xlIixlKSxvPXI7YnJlYWs7Y2FzZSJpbnB1dCI6S20oZSxyKSxvPUJmKGUsciksVWUoImludmFsaWQiLGUpO2JyZWFrO2Nhc2Uib3B0aW9uIjpvPXI7YnJlYWs7Y2FzZSJzZWxlY3QiOmUuX3dyYXBwZXJTdGF0ZT17d2FzTXVsdGlwbGU6ISFyLm11bHRpcGxlfSxvPXR0KHt9LHIse3ZhbHVlOnZvaWQgMH0pLFVlKCJpbnZhbGlkIixlKTticmVhaztjYXNlInRleHRhcmVhIjpZbShlLHIpLG89VmYoZSxyKSxVZSgiaW52YWxpZCIsZSk7YnJlYWs7ZGVmYXVsdDpvPXJ9S2YobixvKSxzPW87Zm9yKGkgaW4gcylpZihzLmhhc093blByb3BlcnR5KGkpKXt2YXIgYT1zW2ldO2k9PT0ic3R5bGUiP2cxKGUsYSk6aT09PSJkYW5nZXJvdXNseVNldElubmVySFRNTCI/KGE9YT9hLl9faHRtbDp2b2lkIDAsYSE9bnVsbCYmaDEoZSxhKSk6aT09PSJjaGlsZHJlbiI/dHlwZW9mIGE9PSJzdHJpbmciPyhuIT09InRleHRhcmVhInx8YSE9PSIiKSYmR3MoZSxhKTp0eXBlb2YgYT09Im51bWJlciImJkdzKGUsIiIrYSk6aSE9PSJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciJiZpIT09InN1cHByZXNzSHlkcmF0aW9uV2FybmluZyImJmkhPT0iYXV0b0ZvY3VzIiYmKEtzLmhhc093blByb3BlcnR5KGkpP2EhPW51bGwmJmk9PT0ib25TY3JvbGwiJiZVZSgic2Nyb2xsIixlKTphIT1udWxsJiZEcChlLGksYSxsKSl9c3dpdGNoKG4pe2Nhc2UiaW5wdXQiOllhKGUpLEdtKGUsciwhMSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6WWEoZSksWG0oZSk7YnJlYWs7Y2FzZSJvcHRpb24iOnIudmFsdWUhPW51bGwmJmUuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIrVG8oci52YWx1ZSkpO2JyZWFrO2Nhc2Uic2VsZWN0IjplLm11bHRpcGxlPSEhci5tdWx0aXBsZSxpPXIudmFsdWUsaSE9bnVsbD9vbChlLCEhci5tdWx0aXBsZSxpLCExKTpyLmRlZmF1bHRWYWx1ZSE9bnVsbCYmb2woZSwhIXIubXVsdGlwbGUsci5kZWZhdWx0VmFsdWUsITApO2JyZWFrO2RlZmF1bHQ6dHlwZW9mIG8ub25DbGljaz09ImZ1bmN0aW9uIiYmKGUub25jbGljaz1RdSl9c3dpdGNoKG4pe2Nhc2UiYnV0dG9uIjpjYXNlImlucHV0IjpjYXNlInNlbGVjdCI6Y2FzZSJ0ZXh0YXJlYSI6cj0hIXIuYXV0b0ZvY3VzO2JyZWFrIGU7Y2FzZSJpbWciOnI9ITA7YnJlYWsgZTtkZWZhdWx0OnI9ITF9fXImJih0LmZsYWdzfD00KX10LnJlZiE9PW51bGwmJih0LmZsYWdzfD01MTIsdC5mbGFnc3w9MjA5NzE1Mil9cmV0dXJuIEJ0KHQpLG51bGw7Y2FzZSA2OmlmKGUmJnQuc3RhdGVOb2RlIT1udWxsKXp4KGUsdCxlLm1lbW9pemVkUHJvcHMscik7ZWxzZXtpZih0eXBlb2YgciE9InN0cmluZyImJnQuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihXKDE2NikpO2lmKG49Wm8ob2EuY3VycmVudCksWm8oZ3IuY3VycmVudCkscnUodCkpe2lmKHI9dC5zdGF0ZU5vZGUsbj10Lm1lbW9pemVkUHJvcHMsclt1cl09dCwoaT1yLm5vZGVWYWx1ZSE9PW4pJiYoZT1fbixlIT09bnVsbCkpc3dpdGNoKGUudGFnKXtjYXNlIDM6bnUoci5ub2RlVmFsdWUsbiwoZS5tb2RlJjEpIT09MCk7YnJlYWs7Y2FzZSA1OmUubWVtb2l6ZWRQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmchPT0hMCYmbnUoci5ub2RlVmFsdWUsbiwoZS5tb2RlJjEpIT09MCl9aSYmKHQuZmxhZ3N8PTQpfWVsc2Ugcj0obi5ub2RlVHlwZT09PTk/bjpuLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKHIpLHJbdXJdPXQsdC5zdGF0ZU5vZGU9cn1yZXR1cm4gQnQodCksbnVsbDtjYXNlIDEzOmlmKEdlKEplKSxyPXQubWVtb2l6ZWRTdGF0ZSxlPT09bnVsbHx8ZS5tZW1vaXplZFN0YXRlIT09bnVsbCYmZS5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihZZSYmeG4hPT1udWxsJiZ0Lm1vZGUmMSYmISh0LmZsYWdzJjEyOCkpbngoKSx2bCgpLHQuZmxhZ3N8PTk4NTYwLGk9ITE7ZWxzZSBpZihpPXJ1KHQpLHIhPT1udWxsJiZyLmRlaHlkcmF0ZWQhPT1udWxsKXtpZihlPT09bnVsbCl7aWYoIWkpdGhyb3cgRXJyb3IoVygzMTgpKTtpZihpPXQubWVtb2l6ZWRTdGF0ZSxpPWkhPT1udWxsP2kuZGVoeWRyYXRlZDpudWxsLCFpKXRocm93IEVycm9yKFcoMzE3KSk7aVt1cl09dH1lbHNlIHZsKCksISh0LmZsYWdzJjEyOCkmJih0Lm1lbW9pemVkU3RhdGU9bnVsbCksdC5mbGFnc3w9NDtCdCh0KSxpPSExfWVsc2UgWG4hPT1udWxsJiYoVGgoWG4pLFhuPW51bGwpLGk9ITA7aWYoIWkpcmV0dXJuIHQuZmxhZ3MmNjU1MzY/dDpudWxsfXJldHVybiB0LmZsYWdzJjEyOD8odC5sYW5lcz1uLHQpOihyPXIhPT1udWxsLHIhPT0oZSE9PW51bGwmJmUubWVtb2l6ZWRTdGF0ZSE9PW51bGwpJiZyJiYodC5jaGlsZC5mbGFnc3w9ODE5Mix0Lm1vZGUmMSYmKGU9PT1udWxsfHxKZS5jdXJyZW50JjE/eHQ9PT0wJiYoeHQ9Myk6dmcoKSkpLHQudXBkYXRlUXVldWUhPT1udWxsJiYodC5mbGFnc3w9NCksQnQodCksbnVsbCk7Y2FzZSA0OnJldHVybiB4bCgpLHhoKGUsdCksZT09PW51bGwmJmVhKHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pLEJ0KHQpLG51bGw7Y2FzZSAxMDpyZXR1cm4gZWcodC50eXBlLl9jb250ZXh0KSxCdCh0KSxudWxsO2Nhc2UgMTc6cmV0dXJuIGRuKHQudHlwZSkmJkp1KCksQnQodCksbnVsbDtjYXNlIDE5OmlmKEdlKEplKSxpPXQubWVtb2l6ZWRTdGF0ZSxpPT09bnVsbClyZXR1cm4gQnQodCksbnVsbDtpZihyPSh0LmZsYWdzJjEyOCkhPT0wLGw9aS5yZW5kZXJpbmcsbD09PW51bGwpaWYocilpcyhpLCExKTtlbHNle2lmKHh0IT09MHx8ZSE9PW51bGwmJmUuZmxhZ3MmMTI4KWZvcihlPXQuY2hpbGQ7ZSE9PW51bGw7KXtpZihsPW9jKGUpLGwhPT1udWxsKXtmb3IodC5mbGFnc3w9MTI4LGlzKGksITEpLHI9bC51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKHQudXBkYXRlUXVldWU9cix0LmZsYWdzfD00KSx0LnN1YnRyZWVGbGFncz0wLHI9bixuPXQuY2hpbGQ7biE9PW51bGw7KWk9bixlPXIsaS5mbGFncyY9MTQ2ODAwNjYsbD1pLmFsdGVybmF0ZSxsPT09bnVsbD8oaS5jaGlsZExhbmVzPTAsaS5sYW5lcz1lLGkuY2hpbGQ9bnVsbCxpLnN1YnRyZWVGbGFncz0wLGkubWVtb2l6ZWRQcm9wcz1udWxsLGkubWVtb2l6ZWRTdGF0ZT1udWxsLGkudXBkYXRlUXVldWU9bnVsbCxpLmRlcGVuZGVuY2llcz1udWxsLGkuc3RhdGVOb2RlPW51bGwpOihpLmNoaWxkTGFuZXM9bC5jaGlsZExhbmVzLGkubGFuZXM9bC5sYW5lcyxpLmNoaWxkPWwuY2hpbGQsaS5zdWJ0cmVlRmxhZ3M9MCxpLmRlbGV0aW9ucz1udWxsLGkubWVtb2l6ZWRQcm9wcz1sLm1lbW9pemVkUHJvcHMsaS5tZW1vaXplZFN0YXRlPWwubWVtb2l6ZWRTdGF0ZSxpLnVwZGF0ZVF1ZXVlPWwudXBkYXRlUXVldWUsaS50eXBlPWwudHlwZSxlPWwuZGVwZW5kZW5jaWVzLGkuZGVwZW5kZW5jaWVzPWU9PT1udWxsP251bGw6e2xhbmVzOmUubGFuZXMsZmlyc3RDb250ZXh0OmUuZmlyc3RDb250ZXh0fSksbj1uLnNpYmxpbmc7cmV0dXJuIEZlKEplLEplLmN1cnJlbnQmMXwyKSx0LmNoaWxkfWU9ZS5zaWJsaW5nfWkudGFpbCE9PW51bGwmJnV0KCk+d2wmJih0LmZsYWdzfD0xMjgscj0hMCxpcyhpLCExKSx0LmxhbmVzPTQxOTQzMDQpfWVsc2V7aWYoIXIpaWYoZT1vYyhsKSxlIT09bnVsbCl7aWYodC5mbGFnc3w9MTI4LHI9ITAsbj1lLnVwZGF0ZVF1ZXVlLG4hPT1udWxsJiYodC51cGRhdGVRdWV1ZT1uLHQuZmxhZ3N8PTQpLGlzKGksITApLGkudGFpbD09PW51bGwmJmkudGFpbE1vZGU9PT0iaGlkZGVuIiYmIWwuYWx0ZXJuYXRlJiYhWWUpcmV0dXJuIEJ0KHQpLG51bGx9ZWxzZSAyKnV0KCktaS5yZW5kZXJpbmdTdGFydFRpbWU+d2wmJm4hPT0xMDczNzQxODI0JiYodC5mbGFnc3w9MTI4LHI9ITAsaXMoaSwhMSksdC5sYW5lcz00MTk0MzA0KTtpLmlzQmFja3dhcmRzPyhsLnNpYmxpbmc9dC5jaGlsZCx0LmNoaWxkPWwpOihuPWkubGFzdCxuIT09bnVsbD9uLnNpYmxpbmc9bDp0LmNoaWxkPWwsaS5sYXN0PWwpfXJldHVybiBpLnRhaWwhPT1udWxsPyh0PWkudGFpbCxpLnJlbmRlcmluZz10LGkudGFpbD10LnNpYmxpbmcsaS5yZW5kZXJpbmdTdGFydFRpbWU9dXQoKSx0LnNpYmxpbmc9bnVsbCxuPUplLmN1cnJlbnQsRmUoSmUscj9uJjF8MjpuJjEpLHQpOihCdCh0KSxudWxsKTtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIG1nKCkscj10Lm1lbW9pemVkU3RhdGUhPT1udWxsLGUhPT1udWxsJiZlLm1lbW9pemVkU3RhdGUhPT1udWxsIT09ciYmKHQuZmxhZ3N8PTgxOTIpLHImJnQubW9kZSYxP21uJjEwNzM3NDE4MjQmJihCdCh0KSx0LnN1YnRyZWVGbGFncyY2JiYodC5mbGFnc3w9ODE5MikpOkJ0KHQpLG51bGw7Y2FzZSAyNDpyZXR1cm4gbnVsbDtjYXNlIDI1OnJldHVybiBudWxsfXRocm93IEVycm9yKFcoMTU2LHQudGFnKSl9ZnVuY3Rpb24ga2soZSx0KXtzd2l0Y2goUXAodCksdC50YWcpe2Nhc2UgMTpyZXR1cm4gZG4odC50eXBlKSYmSnUoKSxlPXQuZmxhZ3MsZSY2NTUzNj8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDM6cmV0dXJuIHhsKCksR2UoY24pLEdlKEd0KSxpZygpLGU9dC5mbGFncyxlJjY1NTM2JiYhKGUmMTI4KT8odC5mbGFncz1lJi02NTUzN3wxMjgsdCk6bnVsbDtjYXNlIDU6cmV0dXJuIG9nKHQpLG51bGw7Y2FzZSAxMzppZihHZShKZSksZT10Lm1lbW9pemVkU3RhdGUsZSE9PW51bGwmJmUuZGVoeWRyYXRlZCE9PW51bGwpe2lmKHQuYWx0ZXJuYXRlPT09bnVsbCl0aHJvdyBFcnJvcihXKDM0MCkpO3ZsKCl9cmV0dXJuIGU9dC5mbGFncyxlJjY1NTM2Pyh0LmZsYWdzPWUmLTY1NTM3fDEyOCx0KTpudWxsO2Nhc2UgMTk6cmV0dXJuIEdlKEplKSxudWxsO2Nhc2UgNDpyZXR1cm4geGwoKSxudWxsO2Nhc2UgMTA6cmV0dXJuIGVnKHQudHlwZS5fY29udGV4dCksbnVsbDtjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIG1nKCksbnVsbDtjYXNlIDI0OnJldHVybiBudWxsO2RlZmF1bHQ6cmV0dXJuIG51bGx9fXZhciBsdT0hMSxVdD0hMSxUaz10eXBlb2YgV2Vha1NldD09ImZ1bmN0aW9uIj9XZWFrU2V0OlNldCxKPW51bGw7ZnVuY3Rpb24gWmkoZSx0KXt2YXIgbj1lLnJlZjtpZihuIT09bnVsbClpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIil0cnl7bihudWxsKX1jYXRjaChyKXtudChlLHQscil9ZWxzZSBuLmN1cnJlbnQ9bnVsbH1mdW5jdGlvbiBfaChlLHQsbil7dHJ5e24oKX1jYXRjaChyKXtudChlLHQscil9fXZhciBqdj0hMTtmdW5jdGlvbiBOayhlLHQpe2lmKHJoPUd1LGU9VTEoKSxZcChlKSl7aWYoInNlbGVjdGlvblN0YXJ0ImluIGUpdmFyIG49e3N0YXJ0OmUuc2VsZWN0aW9uU3RhcnQsZW5kOmUuc2VsZWN0aW9uRW5kfTtlbHNlIGU6e249KG49ZS5vd25lckRvY3VtZW50KSYmbi5kZWZhdWx0Vmlld3x8d2luZG93O3ZhciByPW4uZ2V0U2VsZWN0aW9uJiZuLmdldFNlbGVjdGlvbigpO2lmKHImJnIucmFuZ2VDb3VudCE9PTApe249ci5hbmNob3JOb2RlO3ZhciBvPXIuYW5jaG9yT2Zmc2V0LGk9ci5mb2N1c05vZGU7cj1yLmZvY3VzT2Zmc2V0O3RyeXtuLm5vZGVUeXBlLGkubm9kZVR5cGV9Y2F0Y2h7bj1udWxsO2JyZWFrIGV9dmFyIGw9MCxzPS0xLGE9LTEsdT0wLGM9MCxkPWUsZj1udWxsO3Q6Zm9yKDs7KXtmb3IodmFyIGg7ZCE9PW58fG8hPT0wJiZkLm5vZGVUeXBlIT09M3x8KHM9bCtvKSxkIT09aXx8ciE9PTAmJmQubm9kZVR5cGUhPT0zfHwoYT1sK3IpLGQubm9kZVR5cGU9PT0zJiYobCs9ZC5ub2RlVmFsdWUubGVuZ3RoKSwoaD1kLmZpcnN0Q2hpbGQpIT09bnVsbDspZj1kLGQ9aDtmb3IoOzspe2lmKGQ9PT1lKWJyZWFrIHQ7aWYoZj09PW4mJisrdT09PW8mJihzPWwpLGY9PT1pJiYrK2M9PT1yJiYoYT1sKSwoaD1kLm5leHRTaWJsaW5nKSE9PW51bGwpYnJlYWs7ZD1mLGY9ZC5wYXJlbnROb2RlfWQ9aH1uPXM9PT0tMXx8YT09PS0xP251bGw6e3N0YXJ0OnMsZW5kOmF9fWVsc2Ugbj1udWxsfW49bnx8e3N0YXJ0OjAsZW5kOjB9fWVsc2Ugbj1udWxsO2ZvcihvaD17Zm9jdXNlZEVsZW06ZSxzZWxlY3Rpb25SYW5nZTpufSxHdT0hMSxKPXQ7SiE9PW51bGw7KWlmKHQ9SixlPXQuY2hpbGQsKHQuc3VidHJlZUZsYWdzJjEwMjgpIT09MCYmZSE9PW51bGwpZS5yZXR1cm49dCxKPWU7ZWxzZSBmb3IoO0ohPT1udWxsOyl7dD1KO3RyeXt2YXIgZz10LmFsdGVybmF0ZTtpZih0LmZsYWdzJjEwMjQpc3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmJyZWFrO2Nhc2UgMTppZihnIT09bnVsbCl7dmFyIG09Zy5tZW1vaXplZFByb3BzLFM9Zy5tZW1vaXplZFN0YXRlLHY9dC5zdGF0ZU5vZGUseT12LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKHQuZWxlbWVudFR5cGU9PT10LnR5cGU/bTpLbih0LnR5cGUsbSksUyk7di5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZT15fWJyZWFrO2Nhc2UgMzp2YXIgeD10LnN0YXRlTm9kZS5jb250YWluZXJJbmZvO3gubm9kZVR5cGU9PT0xP3gudGV4dENvbnRlbnQ9IiI6eC5ub2RlVHlwZT09PTkmJnguZG9jdW1lbnRFbGVtZW50JiZ4LnJlbW92ZUNoaWxkKHguZG9jdW1lbnRFbGVtZW50KTticmVhaztjYXNlIDU6Y2FzZSA2OmNhc2UgNDpjYXNlIDE3OmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoVygxNjMpKX19Y2F0Y2goXyl7bnQodCx0LnJldHVybixfKX1pZihlPXQuc2libGluZyxlIT09bnVsbCl7ZS5yZXR1cm49dC5yZXR1cm4sSj1lO2JyZWFrfUo9dC5yZXR1cm59cmV0dXJuIGc9anYsanY9ITEsZ31mdW5jdGlvbiBOcyhlLHQsbil7dmFyIHI9dC51cGRhdGVRdWV1ZTtpZihyPXIhPT1udWxsP3IubGFzdEVmZmVjdDpudWxsLHIhPT1udWxsKXt2YXIgbz1yPXIubmV4dDtkb3tpZigoby50YWcmZSk9PT1lKXt2YXIgaT1vLmRlc3Ryb3k7by5kZXN0cm95PXZvaWQgMCxpIT09dm9pZCAwJiZfaCh0LG4saSl9bz1vLm5leHR9d2hpbGUobyE9PXIpfX1mdW5jdGlvbiBYYyhlLHQpe2lmKHQ9dC51cGRhdGVRdWV1ZSx0PXQhPT1udWxsP3QubGFzdEVmZmVjdDpudWxsLHQhPT1udWxsKXt2YXIgbj10PXQubmV4dDtkb3tpZigobi50YWcmZSk9PT1lKXt2YXIgcj1uLmNyZWF0ZTtuLmRlc3Ryb3k9cigpfW49bi5uZXh0fXdoaWxlKG4hPT10KX19ZnVuY3Rpb24gd2goZSl7dmFyIHQ9ZS5yZWY7aWYodCE9PW51bGwpe3ZhciBuPWUuc3RhdGVOb2RlO3N3aXRjaChlLnRhZyl7Y2FzZSA1OmU9bjticmVhaztkZWZhdWx0OmU9bn10eXBlb2YgdD09ImZ1bmN0aW9uIj90KGUpOnQuY3VycmVudD1lfX1mdW5jdGlvbiBGeChlKXt2YXIgdD1lLmFsdGVybmF0ZTt0IT09bnVsbCYmKGUuYWx0ZXJuYXRlPW51bGwsRngodCkpLGUuY2hpbGQ9bnVsbCxlLmRlbGV0aW9ucz1udWxsLGUuc2libGluZz1udWxsLGUudGFnPT09NSYmKHQ9ZS5zdGF0ZU5vZGUsdCE9PW51bGwmJihkZWxldGUgdFt1cl0sZGVsZXRlIHRbbmFdLGRlbGV0ZSB0W3NoXSxkZWxldGUgdFtja10sZGVsZXRlIHRbZGtdKSksZS5zdGF0ZU5vZGU9bnVsbCxlLnJldHVybj1udWxsLGUuZGVwZW5kZW5jaWVzPW51bGwsZS5tZW1vaXplZFByb3BzPW51bGwsZS5tZW1vaXplZFN0YXRlPW51bGwsZS5wZW5kaW5nUHJvcHM9bnVsbCxlLnN0YXRlTm9kZT1udWxsLGUudXBkYXRlUXVldWU9bnVsbH1mdW5jdGlvbiBCeChlKXtyZXR1cm4gZS50YWc9PT01fHxlLnRhZz09PTN8fGUudGFnPT09NH1mdW5jdGlvbiB6dihlKXtlOmZvcig7Oyl7Zm9yKDtlLnNpYmxpbmc9PT1udWxsOyl7aWYoZS5yZXR1cm49PT1udWxsfHxCeChlLnJldHVybikpcmV0dXJuIG51bGw7ZT1lLnJldHVybn1mb3IoZS5zaWJsaW5nLnJldHVybj1lLnJldHVybixlPWUuc2libGluZztlLnRhZyE9PTUmJmUudGFnIT09NiYmZS50YWchPT0xODspe2lmKGUuZmxhZ3MmMnx8ZS5jaGlsZD09PW51bGx8fGUudGFnPT09NCljb250aW51ZSBlO2UuY2hpbGQucmV0dXJuPWUsZT1lLmNoaWxkfWlmKCEoZS5mbGFncyYyKSlyZXR1cm4gZS5zdGF0ZU5vZGV9fWZ1bmN0aW9uIFNoKGUsdCxuKXt2YXIgcj1lLnRhZztpZihyPT09NXx8cj09PTYpZT1lLnN0YXRlTm9kZSx0P24ubm9kZVR5cGU9PT04P24ucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0KTpuLmluc2VydEJlZm9yZShlLHQpOihuLm5vZGVUeXBlPT09OD8odD1uLnBhcmVudE5vZGUsdC5pbnNlcnRCZWZvcmUoZSxuKSk6KHQ9bix0LmFwcGVuZENoaWxkKGUpKSxuPW4uX3JlYWN0Um9vdENvbnRhaW5lcixuIT1udWxsfHx0Lm9uY2xpY2shPT1udWxsfHwodC5vbmNsaWNrPVF1KSk7ZWxzZSBpZihyIT09NCYmKGU9ZS5jaGlsZCxlIT09bnVsbCkpZm9yKFNoKGUsdCxuKSxlPWUuc2libGluZztlIT09bnVsbDspU2goZSx0LG4pLGU9ZS5zaWJsaW5nfWZ1bmN0aW9uIEVoKGUsdCxuKXt2YXIgcj1lLnRhZztpZihyPT09NXx8cj09PTYpZT1lLnN0YXRlTm9kZSx0P24uaW5zZXJ0QmVmb3JlKGUsdCk6bi5hcHBlbmRDaGlsZChlKTtlbHNlIGlmKHIhPT00JiYoZT1lLmNoaWxkLGUhPT1udWxsKSlmb3IoRWgoZSx0LG4pLGU9ZS5zaWJsaW5nO2UhPT1udWxsOylFaChlLHQsbiksZT1lLnNpYmxpbmd9dmFyIEF0PW51bGwsR249ITE7ZnVuY3Rpb24gZW8oZSx0LG4pe2ZvcihuPW4uY2hpbGQ7biE9PW51bGw7KVd4KGUsdCxuKSxuPW4uc2libGluZ31mdW5jdGlvbiBXeChlLHQsbil7aWYocHImJnR5cGVvZiBwci5vbkNvbW1pdEZpYmVyVW5tb3VudD09ImZ1bmN0aW9uIil0cnl7cHIub25Db21taXRGaWJlclVubW91bnQoQmMsbil9Y2F0Y2h7fXN3aXRjaChuLnRhZyl7Y2FzZSA1OlV0fHxaaShuLHQpO2Nhc2UgNjp2YXIgcj1BdCxvPUduO0F0PW51bGwsZW8oZSx0LG4pLEF0PXIsR249byxBdCE9PW51bGwmJihHbj8oZT1BdCxuPW4uc3RhdGVOb2RlLGUubm9kZVR5cGU9PT04P2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKTplLnJlbW92ZUNoaWxkKG4pKTpBdC5yZW1vdmVDaGlsZChuLnN0YXRlTm9kZSkpO2JyZWFrO2Nhc2UgMTg6QXQhPT1udWxsJiYoR24/KGU9QXQsbj1uLnN0YXRlTm9kZSxlLm5vZGVUeXBlPT09OD9lZihlLnBhcmVudE5vZGUsbik6ZS5ub2RlVHlwZT09PTEmJmVmKGUsbiksSnMoZSkpOmVmKEF0LG4uc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSA0OnI9QXQsbz1HbixBdD1uLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLEduPSEwLGVvKGUsdCxuKSxBdD1yLEduPW87YnJlYWs7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKCFVdCYmKHI9bi51cGRhdGVRdWV1ZSxyIT09bnVsbCYmKHI9ci5sYXN0RWZmZWN0LHIhPT1udWxsKSkpe289cj1yLm5leHQ7ZG97dmFyIGk9byxsPWkuZGVzdHJveTtpPWkudGFnLGwhPT12b2lkIDAmJihpJjJ8fGkmNCkmJl9oKG4sdCxsKSxvPW8ubmV4dH13aGlsZShvIT09cil9ZW8oZSx0LG4pO2JyZWFrO2Nhc2UgMTppZighVXQmJihaaShuLHQpLHI9bi5zdGF0ZU5vZGUsdHlwZW9mIHIuY29tcG9uZW50V2lsbFVubW91bnQ9PSJmdW5jdGlvbiIpKXRyeXtyLnByb3BzPW4ubWVtb2l6ZWRQcm9wcyxyLnN0YXRlPW4ubWVtb2l6ZWRTdGF0ZSxyLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2gocyl7bnQobix0LHMpfWVvKGUsdCxuKTticmVhaztjYXNlIDIxOmVvKGUsdCxuKTticmVhaztjYXNlIDIyOm4ubW9kZSYxPyhVdD0ocj1VdCl8fG4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsZW8oZSx0LG4pLFV0PXIpOmVvKGUsdCxuKTticmVhaztkZWZhdWx0OmVvKGUsdCxuKX19ZnVuY3Rpb24gRnYoZSl7dmFyIHQ9ZS51cGRhdGVRdWV1ZTtpZih0IT09bnVsbCl7ZS51cGRhdGVRdWV1ZT1udWxsO3ZhciBuPWUuc3RhdGVOb2RlO249PT1udWxsJiYobj1lLnN0YXRlTm9kZT1uZXcgVGspLHQuZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgbz1Jay5iaW5kKG51bGwsZSxyKTtuLmhhcyhyKXx8KG4uYWRkKHIpLHIudGhlbihvLG8pKX0pfX1mdW5jdGlvbiBVbihlLHQpe3ZhciBuPXQuZGVsZXRpb25zO2lmKG4hPT1udWxsKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdO3RyeXt2YXIgaT1lLGw9dCxzPWw7ZTpmb3IoO3MhPT1udWxsOyl7c3dpdGNoKHMudGFnKXtjYXNlIDU6QXQ9cy5zdGF0ZU5vZGUsR249ITE7YnJlYWsgZTtjYXNlIDM6QXQ9cy5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxHbj0hMDticmVhayBlO2Nhc2UgNDpBdD1zLnN0YXRlTm9kZS5jb250YWluZXJJbmZvLEduPSEwO2JyZWFrIGV9cz1zLnJldHVybn1pZihBdD09PW51bGwpdGhyb3cgRXJyb3IoVygxNjApKTtXeChpLGwsbyksQXQ9bnVsbCxHbj0hMTt2YXIgYT1vLmFsdGVybmF0ZTthIT09bnVsbCYmKGEucmV0dXJuPW51bGwpLG8ucmV0dXJuPW51bGx9Y2F0Y2godSl7bnQobyx0LHUpfX1pZih0LnN1YnRyZWVGbGFncyYxMjg1NClmb3IodD10LmNoaWxkO3QhPT1udWxsOylVeCh0LGUpLHQ9dC5zaWJsaW5nfWZ1bmN0aW9uIFV4KGUsdCl7dmFyIG49ZS5hbHRlcm5hdGUscj1lLmZsYWdzO3N3aXRjaChlLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1OmlmKFVuKHQsZSksbHIoZSksciY0KXt0cnl7TnMoMyxlLGUucmV0dXJuKSxYYygzLGUpfWNhdGNoKG0pe250KGUsZS5yZXR1cm4sbSl9dHJ5e05zKDUsZSxlLnJldHVybil9Y2F0Y2gobSl7bnQoZSxlLnJldHVybixtKX19YnJlYWs7Y2FzZSAxOlVuKHQsZSksbHIoZSksciY1MTImJm4hPT1udWxsJiZaaShuLG4ucmV0dXJuKTticmVhaztjYXNlIDU6aWYoVW4odCxlKSxscihlKSxyJjUxMiYmbiE9PW51bGwmJlppKG4sbi5yZXR1cm4pLGUuZmxhZ3MmMzIpe3ZhciBvPWUuc3RhdGVOb2RlO3RyeXtHcyhvLCIiKX1jYXRjaChtKXtudChlLGUucmV0dXJuLG0pfX1pZihyJjQmJihvPWUuc3RhdGVOb2RlLG8hPW51bGwpKXt2YXIgaT1lLm1lbW9pemVkUHJvcHMsbD1uIT09bnVsbD9uLm1lbW9pemVkUHJvcHM6aSxzPWUudHlwZSxhPWUudXBkYXRlUXVldWU7aWYoZS51cGRhdGVRdWV1ZT1udWxsLGEhPT1udWxsKXRyeXtzPT09ImlucHV0IiYmaS50eXBlPT09InJhZGlvIiYmaS5uYW1lIT1udWxsJiZjMShvLGkpLEdmKHMsbCk7dmFyIHU9R2YocyxpKTtmb3IobD0wO2w8YS5sZW5ndGg7bCs9Mil7dmFyIGM9YVtsXSxkPWFbbCsxXTtjPT09InN0eWxlIj9nMShvLGQpOmM9PT0iZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwiP2gxKG8sZCk6Yz09PSJjaGlsZHJlbiI/R3MobyxkKTpEcChvLGMsZCx1KX1zd2l0Y2gocyl7Y2FzZSJpbnB1dCI6V2YobyxpKTticmVhaztjYXNlInRleHRhcmVhIjpkMShvLGkpO2JyZWFrO2Nhc2Uic2VsZWN0Ijp2YXIgZj1vLl93cmFwcGVyU3RhdGUud2FzTXVsdGlwbGU7by5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlPSEhaS5tdWx0aXBsZTt2YXIgaD1pLnZhbHVlO2ghPW51bGw/b2wobywhIWkubXVsdGlwbGUsaCwhMSk6ZiE9PSEhaS5tdWx0aXBsZSYmKGkuZGVmYXVsdFZhbHVlIT1udWxsP29sKG8sISFpLm11bHRpcGxlLGkuZGVmYXVsdFZhbHVlLCEwKTpvbChvLCEhaS5tdWx0aXBsZSxpLm11bHRpcGxlP1tdOiIiLCExKSl9b1tuYV09aX1jYXRjaChtKXtudChlLGUucmV0dXJuLG0pfX1icmVhaztjYXNlIDY6aWYoVW4odCxlKSxscihlKSxyJjQpe2lmKGUuc3RhdGVOb2RlPT09bnVsbCl0aHJvdyBFcnJvcihXKDE2MikpO289ZS5zdGF0ZU5vZGUsaT1lLm1lbW9pemVkUHJvcHM7dHJ5e28ubm9kZVZhbHVlPWl9Y2F0Y2gobSl7bnQoZSxlLnJldHVybixtKX19YnJlYWs7Y2FzZSAzOmlmKFVuKHQsZSksbHIoZSksciY0JiZuIT09bnVsbCYmbi5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl0cnl7SnModC5jb250YWluZXJJbmZvKX1jYXRjaChtKXtudChlLGUucmV0dXJuLG0pfWJyZWFrO2Nhc2UgNDpVbih0LGUpLGxyKGUpO2JyZWFrO2Nhc2UgMTM6VW4odCxlKSxscihlKSxvPWUuY2hpbGQsby5mbGFncyY4MTkyJiYoaT1vLm1lbW9pemVkU3RhdGUhPT1udWxsLG8uc3RhdGVOb2RlLmlzSGlkZGVuPWksIWl8fG8uYWx0ZXJuYXRlIT09bnVsbCYmby5hbHRlcm5hdGUubWVtb2l6ZWRTdGF0ZSE9PW51bGx8fChwZz11dCgpKSksciY0JiZGdihlKTticmVhaztjYXNlIDIyOmlmKGM9biE9PW51bGwmJm4ubWVtb2l6ZWRTdGF0ZSE9PW51bGwsZS5tb2RlJjE/KFV0PSh1PVV0KXx8YyxVbih0LGUpLFV0PXUpOlVuKHQsZSksbHIoZSksciY4MTkyKXtpZih1PWUubWVtb2l6ZWRTdGF0ZSE9PW51bGwsKGUuc3RhdGVOb2RlLmlzSGlkZGVuPXUpJiYhYyYmZS5tb2RlJjEpZm9yKEo9ZSxjPWUuY2hpbGQ7YyE9PW51bGw7KXtmb3IoZD1KPWM7SiE9PW51bGw7KXtzd2l0Y2goZj1KLGg9Zi5jaGlsZCxmLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNDpjYXNlIDE1Ok5zKDQsZixmLnJldHVybik7YnJlYWs7Y2FzZSAxOlppKGYsZi5yZXR1cm4pO3ZhciBnPWYuc3RhdGVOb2RlO2lmKHR5cGVvZiBnLmNvbXBvbmVudFdpbGxVbm1vdW50PT0iZnVuY3Rpb24iKXtyPWYsbj1mLnJldHVybjt0cnl7dD1yLGcucHJvcHM9dC5tZW1vaXplZFByb3BzLGcuc3RhdGU9dC5tZW1vaXplZFN0YXRlLGcuY29tcG9uZW50V2lsbFVubW91bnQoKX1jYXRjaChtKXtudChyLG4sbSl9fWJyZWFrO2Nhc2UgNTpaaShmLGYucmV0dXJuKTticmVhaztjYXNlIDIyOmlmKGYubWVtb2l6ZWRTdGF0ZSE9PW51bGwpe1d2KGQpO2NvbnRpbnVlfX1oIT09bnVsbD8oaC5yZXR1cm49ZixKPWgpOld2KGQpfWM9Yy5zaWJsaW5nfWU6Zm9yKGM9bnVsbCxkPWU7Oyl7aWYoZC50YWc9PT01KXtpZihjPT09bnVsbCl7Yz1kO3RyeXtvPWQuc3RhdGVOb2RlLHU/KGk9by5zdHlsZSx0eXBlb2YgaS5zZXRQcm9wZXJ0eT09ImZ1bmN0aW9uIj9pLnNldFByb3BlcnR5KCJkaXNwbGF5Iiwibm9uZSIsImltcG9ydGFudCIpOmkuZGlzcGxheT0ibm9uZSIpOihzPWQuc3RhdGVOb2RlLGE9ZC5tZW1vaXplZFByb3BzLnN0eWxlLGw9YSE9bnVsbCYmYS5oYXNPd25Qcm9wZXJ0eSgiZGlzcGxheSIpP2EuZGlzcGxheTpudWxsLHMuc3R5bGUuZGlzcGxheT1wMSgiZGlzcGxheSIsbCkpfWNhdGNoKG0pe250KGUsZS5yZXR1cm4sbSl9fX1lbHNlIGlmKGQudGFnPT09Nil7aWYoYz09PW51bGwpdHJ5e2Quc3RhdGVOb2RlLm5vZGVWYWx1ZT11PyIiOmQubWVtb2l6ZWRQcm9wc31jYXRjaChtKXtudChlLGUucmV0dXJuLG0pfX1lbHNlIGlmKChkLnRhZyE9PTIyJiZkLnRhZyE9PTIzfHxkLm1lbW9pemVkU3RhdGU9PT1udWxsfHxkPT09ZSkmJmQuY2hpbGQhPT1udWxsKXtkLmNoaWxkLnJldHVybj1kLGQ9ZC5jaGlsZDtjb250aW51ZX1pZihkPT09ZSlicmVhayBlO2Zvcig7ZC5zaWJsaW5nPT09bnVsbDspe2lmKGQucmV0dXJuPT09bnVsbHx8ZC5yZXR1cm49PT1lKWJyZWFrIGU7Yz09PWQmJihjPW51bGwpLGQ9ZC5yZXR1cm59Yz09PWQmJihjPW51bGwpLGQuc2libGluZy5yZXR1cm49ZC5yZXR1cm4sZD1kLnNpYmxpbmd9fWJyZWFrO2Nhc2UgMTk6VW4odCxlKSxscihlKSxyJjQmJkZ2KGUpO2JyZWFrO2Nhc2UgMjE6YnJlYWs7ZGVmYXVsdDpVbih0LGUpLGxyKGUpfX1mdW5jdGlvbiBscihlKXt2YXIgdD1lLmZsYWdzO2lmKHQmMil7dHJ5e2U6e2Zvcih2YXIgbj1lLnJldHVybjtuIT09bnVsbDspe2lmKEJ4KG4pKXt2YXIgcj1uO2JyZWFrIGV9bj1uLnJldHVybn10aHJvdyBFcnJvcihXKDE2MCkpfXN3aXRjaChyLnRhZyl7Y2FzZSA1OnZhciBvPXIuc3RhdGVOb2RlO3IuZmxhZ3MmMzImJihHcyhvLCIiKSxyLmZsYWdzJj0tMzMpO3ZhciBpPXp2KGUpO0VoKGUsaSxvKTticmVhaztjYXNlIDM6Y2FzZSA0OnZhciBsPXIuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8scz16dihlKTtTaChlLHMsbCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihXKDE2MSkpfX1jYXRjaChhKXtudChlLGUucmV0dXJuLGEpfWUuZmxhZ3MmPS0zfXQmNDA5NiYmKGUuZmxhZ3MmPS00MDk3KX1mdW5jdGlvbiBiayhlLHQsbil7Sj1lLFZ4KGUpfWZ1bmN0aW9uIFZ4KGUsdCxuKXtmb3IodmFyIHI9KGUubW9kZSYxKSE9PTA7SiE9PW51bGw7KXt2YXIgbz1KLGk9by5jaGlsZDtpZihvLnRhZz09PTIyJiZyKXt2YXIgbD1vLm1lbW9pemVkU3RhdGUhPT1udWxsfHxsdTtpZighbCl7dmFyIHM9by5hbHRlcm5hdGUsYT1zIT09bnVsbCYmcy5tZW1vaXplZFN0YXRlIT09bnVsbHx8VXQ7cz1sdTt2YXIgdT1VdDtpZihsdT1sLChVdD1hKSYmIXUpZm9yKEo9bztKIT09bnVsbDspbD1KLGE9bC5jaGlsZCxsLnRhZz09PTIyJiZsLm1lbW9pemVkU3RhdGUhPT1udWxsP1V2KG8pOmEhPT1udWxsPyhhLnJldHVybj1sLEo9YSk6VXYobyk7Zm9yKDtpIT09bnVsbDspSj1pLFZ4KGkpLGk9aS5zaWJsaW5nO0o9byxsdT1zLFV0PXV9QnYoZSl9ZWxzZSBvLnN1YnRyZWVGbGFncyY4NzcyJiZpIT09bnVsbD8oaS5yZXR1cm49byxKPWkpOkJ2KGUpfX1mdW5jdGlvbiBCdihlKXtmb3IoO0ohPT1udWxsOyl7dmFyIHQ9SjtpZih0LmZsYWdzJjg3NzIpe3ZhciBuPXQuYWx0ZXJuYXRlO3RyeXtpZih0LmZsYWdzJjg3NzIpc3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OlV0fHxYYyg1LHQpO2JyZWFrO2Nhc2UgMTp2YXIgcj10LnN0YXRlTm9kZTtpZih0LmZsYWdzJjQmJiFVdClpZihuPT09bnVsbClyLmNvbXBvbmVudERpZE1vdW50KCk7ZWxzZXt2YXIgbz10LmVsZW1lbnRUeXBlPT09dC50eXBlP24ubWVtb2l6ZWRQcm9wczpLbih0LnR5cGUsbi5tZW1vaXplZFByb3BzKTtyLmNvbXBvbmVudERpZFVwZGF0ZShvLG4ubWVtb2l6ZWRTdGF0ZSxyLl9fcmVhY3RJbnRlcm5hbFNuYXBzaG90QmVmb3JlVXBkYXRlKX12YXIgaT10LnVwZGF0ZVF1ZXVlO2khPT1udWxsJiZDdih0LGkscik7YnJlYWs7Y2FzZSAzOnZhciBsPXQudXBkYXRlUXVldWU7aWYobCE9PW51bGwpe2lmKG49bnVsbCx0LmNoaWxkIT09bnVsbClzd2l0Y2godC5jaGlsZC50YWcpe2Nhc2UgNTpuPXQuY2hpbGQuc3RhdGVOb2RlO2JyZWFrO2Nhc2UgMTpuPXQuY2hpbGQuc3RhdGVOb2RlfUN2KHQsbCxuKX1icmVhaztjYXNlIDU6dmFyIHM9dC5zdGF0ZU5vZGU7aWYobj09PW51bGwmJnQuZmxhZ3MmNCl7bj1zO3ZhciBhPXQubWVtb2l6ZWRQcm9wcztzd2l0Y2godC50eXBlKXtjYXNlImJ1dHRvbiI6Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmEuYXV0b0ZvY3VzJiZuLmZvY3VzKCk7YnJlYWs7Y2FzZSJpbWciOmEuc3JjJiYobi5zcmM9YS5zcmMpfX1icmVhaztjYXNlIDY6YnJlYWs7Y2FzZSA0OmJyZWFrO2Nhc2UgMTI6YnJlYWs7Y2FzZSAxMzppZih0Lm1lbW9pemVkU3RhdGU9PT1udWxsKXt2YXIgdT10LmFsdGVybmF0ZTtpZih1IT09bnVsbCl7dmFyIGM9dS5tZW1vaXplZFN0YXRlO2lmKGMhPT1udWxsKXt2YXIgZD1jLmRlaHlkcmF0ZWQ7ZCE9PW51bGwmJkpzKGQpfX19YnJlYWs7Y2FzZSAxOTpjYXNlIDE3OmNhc2UgMjE6Y2FzZSAyMjpjYXNlIDIzOmNhc2UgMjU6YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihXKDE2MykpfVV0fHx0LmZsYWdzJjUxMiYmd2godCl9Y2F0Y2goZil7bnQodCx0LnJldHVybixmKX19aWYodD09PWUpe0o9bnVsbDticmVha31pZihuPXQuc2libGluZyxuIT09bnVsbCl7bi5yZXR1cm49dC5yZXR1cm4sSj1uO2JyZWFrfUo9dC5yZXR1cm59fWZ1bmN0aW9uIFd2KGUpe2Zvcig7SiE9PW51bGw7KXt2YXIgdD1KO2lmKHQ9PT1lKXtKPW51bGw7YnJlYWt9dmFyIG49dC5zaWJsaW5nO2lmKG4hPT1udWxsKXtuLnJldHVybj10LnJldHVybixKPW47YnJlYWt9Sj10LnJldHVybn19ZnVuY3Rpb24gVXYoZSl7Zm9yKDtKIT09bnVsbDspe3ZhciB0PUo7dHJ5e3N3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTp2YXIgbj10LnJldHVybjt0cnl7WGMoNCx0KX1jYXRjaChhKXtudCh0LG4sYSl9YnJlYWs7Y2FzZSAxOnZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiByLmNvbXBvbmVudERpZE1vdW50PT0iZnVuY3Rpb24iKXt2YXIgbz10LnJldHVybjt0cnl7ci5jb21wb25lbnREaWRNb3VudCgpfWNhdGNoKGEpe250KHQsbyxhKX19dmFyIGk9dC5yZXR1cm47dHJ5e3doKHQpfWNhdGNoKGEpe250KHQsaSxhKX1icmVhaztjYXNlIDU6dmFyIGw9dC5yZXR1cm47dHJ5e3doKHQpfWNhdGNoKGEpe250KHQsbCxhKX19fWNhdGNoKGEpe250KHQsdC5yZXR1cm4sYSl9aWYodD09PWUpe0o9bnVsbDticmVha312YXIgcz10LnNpYmxpbmc7aWYocyE9PW51bGwpe3MucmV0dXJuPXQucmV0dXJuLEo9czticmVha31KPXQucmV0dXJufX12YXIgUms9TWF0aC5jZWlsLHNjPVZyLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsZmc9VnIuUmVhY3RDdXJyZW50T3duZXIsSW49VnIuUmVhY3RDdXJyZW50QmF0Y2hDb25maWcsQ2U9MCxidD1udWxsLGN0PW51bGwsRHQ9MCxtbj0wLHFpPWpvKDApLHh0PTAsYWE9bnVsbCxjaT0wLFFjPTAsaGc9MCxicz1udWxsLGFuPW51bGwscGc9MCx3bD0xLzAsTnI9bnVsbCxhYz0hMSxDaD1udWxsLFNvPW51bGwsc3U9ITEscG89bnVsbCx1Yz0wLFJzPTAsJGg9bnVsbCxQdT0tMSxPdT0wO2Z1bmN0aW9uIG5uKCl7cmV0dXJuIENlJjY/dXQoKTpQdSE9PS0xP1B1OlB1PXV0KCl9ZnVuY3Rpb24gRW8oZSl7cmV0dXJuIGUubW9kZSYxP0NlJjImJkR0IT09MD9EdCYtRHQ6aGsudHJhbnNpdGlvbiE9PW51bGw/KE91PT09MCYmKE91PVQxKCkpLE91KTooZT1QZSxlIT09MHx8KGU9d2luZG93LmV2ZW50LGU9ZT09PXZvaWQgMD8xNjpNMShlLnR5cGUpKSxlKToxfWZ1bmN0aW9uIHFuKGUsdCxuLHIpe2lmKDUwPFJzKXRocm93IFJzPTAsJGg9bnVsbCxFcnJvcihXKDE4NSkpO1RhKGUsbixyKSwoIShDZSYyKXx8ZSE9PWJ0KSYmKGU9PT1idCYmKCEoQ2UmMikmJihRY3w9bikseHQ9PT00JiZjbyhlLER0KSksZm4oZSxyKSxuPT09MSYmQ2U9PT0wJiYhKHQubW9kZSYxKSYmKHdsPXV0KCkrNTAwLEtjJiZ6bygpKSl9ZnVuY3Rpb24gZm4oZSx0KXt2YXIgbj1lLmNhbGxiYWNrTm9kZTtoJChlLHQpO3ZhciByPUt1KGUsZT09PWJ0P0R0OjApO2lmKHI9PT0wKW4hPT1udWxsJiZabShuKSxlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO2Vsc2UgaWYodD1yJi1yLGUuY2FsbGJhY2tQcmlvcml0eSE9PXQpe2lmKG4hPW51bGwmJlptKG4pLHQ9PT0xKWUudGFnPT09MD9mayhWdi5iaW5kKG51bGwsZSkpOnExKFZ2LmJpbmQobnVsbCxlKSksYWsoZnVuY3Rpb24oKXshKENlJjYpJiZ6bygpfSksbj1udWxsO2Vsc2V7c3dpdGNoKE4xKHIpKXtjYXNlIDE6bj1GcDticmVhaztjYXNlIDQ6bj0kMTticmVhaztjYXNlIDE2Om49SHU7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6bj1rMTticmVhaztkZWZhdWx0Om49SHV9bj1aeChuLEh4LmJpbmQobnVsbCxlKSl9ZS5jYWxsYmFja1ByaW9yaXR5PXQsZS5jYWxsYmFja05vZGU9bn19ZnVuY3Rpb24gSHgoZSx0KXtpZihQdT0tMSxPdT0wLENlJjYpdGhyb3cgRXJyb3IoVygzMjcpKTt2YXIgbj1lLmNhbGxiYWNrTm9kZTtpZih1bCgpJiZlLmNhbGxiYWNrTm9kZSE9PW4pcmV0dXJuIG51bGw7dmFyIHI9S3UoZSxlPT09YnQ/RHQ6MCk7aWYocj09PTApcmV0dXJuIG51bGw7aWYociYzMHx8ciZlLmV4cGlyZWRMYW5lc3x8dCl0PWNjKGUscik7ZWxzZXt0PXI7dmFyIG89Q2U7Q2V8PTI7dmFyIGk9R3goKTsoYnQhPT1lfHxEdCE9PXQpJiYoTnI9bnVsbCx3bD11dCgpKzUwMCx0aShlLHQpKTtkbyB0cnl7QWsoKTticmVha31jYXRjaChzKXtLeChlLHMpfXdoaWxlKDEpO3FwKCksc2MuY3VycmVudD1pLENlPW8sY3QhPT1udWxsP3Q9MDooYnQ9bnVsbCxEdD0wLHQ9eHQpfWlmKHQhPT0wKXtpZih0PT09MiYmKG89WmYoZSksbyE9PTAmJihyPW8sdD1raChlLG8pKSksdD09PTEpdGhyb3cgbj1hYSx0aShlLDApLGNvKGUsciksZm4oZSx1dCgpKSxuO2lmKHQ9PT02KWNvKGUscik7ZWxzZXtpZihvPWUuY3VycmVudC5hbHRlcm5hdGUsIShyJjMwKSYmIVBrKG8pJiYodD1jYyhlLHIpLHQ9PT0yJiYoaT1aZihlKSxpIT09MCYmKHI9aSx0PWtoKGUsaSkpKSx0PT09MSkpdGhyb3cgbj1hYSx0aShlLDApLGNvKGUsciksZm4oZSx1dCgpKSxuO3N3aXRjaChlLmZpbmlzaGVkV29yaz1vLGUuZmluaXNoZWRMYW5lcz1yLHQpe2Nhc2UgMDpjYXNlIDE6dGhyb3cgRXJyb3IoVygzNDUpKTtjYXNlIDI6R28oZSxhbixOcik7YnJlYWs7Y2FzZSAzOmlmKGNvKGUsciksKHImMTMwMDIzNDI0KT09PXImJih0PXBnKzUwMC11dCgpLDEwPHQpKXtpZihLdShlLDApIT09MClicmVhaztpZihvPWUuc3VzcGVuZGVkTGFuZXMsKG8mcikhPT1yKXtubigpLGUucGluZ2VkTGFuZXN8PWUuc3VzcGVuZGVkTGFuZXMmbzticmVha31lLnRpbWVvdXRIYW5kbGU9bGgoR28uYmluZChudWxsLGUsYW4sTnIpLHQpO2JyZWFrfUdvKGUsYW4sTnIpO2JyZWFrO2Nhc2UgNDppZihjbyhlLHIpLChyJjQxOTQyNDApPT09cilicmVhaztmb3IodD1lLmV2ZW50VGltZXMsbz0tMTswPHI7KXt2YXIgbD0zMS1abihyKTtpPTE8PGwsbD10W2xdLGw+byYmKG89bCksciY9fml9aWYocj1vLHI9dXQoKS1yLHI9KDEyMD5yPzEyMDo0ODA+cj80ODA6MTA4MD5yPzEwODA6MTkyMD5yPzE5MjA6M2UzPnI/M2UzOjQzMjA+cj80MzIwOjE5NjAqUmsoci8xOTYwKSktciwxMDxyKXtlLnRpbWVvdXRIYW5kbGU9bGgoR28uYmluZChudWxsLGUsYW4sTnIpLHIpO2JyZWFrfUdvKGUsYW4sTnIpO2JyZWFrO2Nhc2UgNTpHbyhlLGFuLE5yKTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKFcoMzI5KSl9fX1yZXR1cm4gZm4oZSx1dCgpKSxlLmNhbGxiYWNrTm9kZT09PW4/SHguYmluZChudWxsLGUpOm51bGx9ZnVuY3Rpb24ga2goZSx0KXt2YXIgbj1icztyZXR1cm4gZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkJiYodGkoZSx0KS5mbGFnc3w9MjU2KSxlPWNjKGUsdCksZSE9PTImJih0PWFuLGFuPW4sdCE9PW51bGwmJlRoKHQpKSxlfWZ1bmN0aW9uIFRoKGUpe2FuPT09bnVsbD9hbj1lOmFuLnB1c2guYXBwbHkoYW4sZSl9ZnVuY3Rpb24gUGsoZSl7Zm9yKHZhciB0PWU7Oyl7aWYodC5mbGFncyYxNjM4NCl7dmFyIG49dC51cGRhdGVRdWV1ZTtpZihuIT09bnVsbCYmKG49bi5zdG9yZXMsbiE9PW51bGwpKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgbz1uW3JdLGk9by5nZXRTbmFwc2hvdDtvPW8udmFsdWU7dHJ5e2lmKCFlcihpKCksbykpcmV0dXJuITF9Y2F0Y2h7cmV0dXJuITF9fX1pZihuPXQuY2hpbGQsdC5zdWJ0cmVlRmxhZ3MmMTYzODQmJm4hPT1udWxsKW4ucmV0dXJuPXQsdD1uO2Vsc2V7aWYodD09PWUpYnJlYWs7Zm9yKDt0LnNpYmxpbmc9PT1udWxsOyl7aWYodC5yZXR1cm49PT1udWxsfHx0LnJldHVybj09PWUpcmV0dXJuITA7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfX1yZXR1cm4hMH1mdW5jdGlvbiBjbyhlLHQpe2Zvcih0Jj1+aGcsdCY9flFjLGUuc3VzcGVuZGVkTGFuZXN8PXQsZS5waW5nZWRMYW5lcyY9fnQsZT1lLmV4cGlyYXRpb25UaW1lczswPHQ7KXt2YXIgbj0zMS1abih0KSxyPTE8PG47ZVtuXT0tMSx0Jj1+cn19ZnVuY3Rpb24gVnYoZSl7aWYoQ2UmNil0aHJvdyBFcnJvcihXKDMyNykpO3VsKCk7dmFyIHQ9S3UoZSwwKTtpZighKHQmMSkpcmV0dXJuIGZuKGUsdXQoKSksbnVsbDt2YXIgbj1jYyhlLHQpO2lmKGUudGFnIT09MCYmbj09PTIpe3ZhciByPVpmKGUpO3IhPT0wJiYodD1yLG49a2goZSxyKSl9aWYobj09PTEpdGhyb3cgbj1hYSx0aShlLDApLGNvKGUsdCksZm4oZSx1dCgpKSxuO2lmKG49PT02KXRocm93IEVycm9yKFcoMzQ1KSk7cmV0dXJuIGUuZmluaXNoZWRXb3JrPWUuY3VycmVudC5hbHRlcm5hdGUsZS5maW5pc2hlZExhbmVzPXQsR28oZSxhbixOciksZm4oZSx1dCgpKSxudWxsfWZ1bmN0aW9uIGdnKGUsdCl7dmFyIG49Q2U7Q2V8PTE7dHJ5e3JldHVybiBlKHQpfWZpbmFsbHl7Q2U9bixDZT09PTAmJih3bD11dCgpKzUwMCxLYyYmem8oKSl9fWZ1bmN0aW9uIGRpKGUpe3BvIT09bnVsbCYmcG8udGFnPT09MCYmIShDZSY2KSYmdWwoKTt2YXIgdD1DZTtDZXw9MTt2YXIgbj1Jbi50cmFuc2l0aW9uLHI9UGU7dHJ5e2lmKEluLnRyYW5zaXRpb249bnVsbCxQZT0xLGUpcmV0dXJuIGUoKX1maW5hbGx5e1BlPXIsSW4udHJhbnNpdGlvbj1uLENlPXQsIShDZSY2KSYmem8oKX19ZnVuY3Rpb24gbWcoKXttbj1xaS5jdXJyZW50LEdlKHFpKX1mdW5jdGlvbiB0aShlLHQpe2UuZmluaXNoZWRXb3JrPW51bGwsZS5maW5pc2hlZExhbmVzPTA7dmFyIG49ZS50aW1lb3V0SGFuZGxlO2lmKG4hPT0tMSYmKGUudGltZW91dEhhbmRsZT0tMSxzayhuKSksY3QhPT1udWxsKWZvcihuPWN0LnJldHVybjtuIT09bnVsbDspe3ZhciByPW47c3dpdGNoKFFwKHIpLHIudGFnKXtjYXNlIDE6cj1yLnR5cGUuY2hpbGRDb250ZXh0VHlwZXMsciE9bnVsbCYmSnUoKTticmVhaztjYXNlIDM6eGwoKSxHZShjbiksR2UoR3QpLGlnKCk7YnJlYWs7Y2FzZSA1Om9nKHIpO2JyZWFrO2Nhc2UgNDp4bCgpO2JyZWFrO2Nhc2UgMTM6R2UoSmUpO2JyZWFrO2Nhc2UgMTk6R2UoSmUpO2JyZWFrO2Nhc2UgMTA6ZWcoci50eXBlLl9jb250ZXh0KTticmVhaztjYXNlIDIyOmNhc2UgMjM6bWcoKX1uPW4ucmV0dXJufWlmKGJ0PWUsY3Q9ZT1DbyhlLmN1cnJlbnQsbnVsbCksRHQ9bW49dCx4dD0wLGFhPW51bGwsaGc9UWM9Y2k9MCxhbj1icz1udWxsLEpvIT09bnVsbCl7Zm9yKHQ9MDt0PEpvLmxlbmd0aDt0KyspaWYobj1Kb1t0XSxyPW4uaW50ZXJsZWF2ZWQsciE9PW51bGwpe24uaW50ZXJsZWF2ZWQ9bnVsbDt2YXIgbz1yLm5leHQsaT1uLnBlbmRpbmc7aWYoaSE9PW51bGwpe3ZhciBsPWkubmV4dDtpLm5leHQ9byxyLm5leHQ9bH1uLnBlbmRpbmc9cn1Kbz1udWxsfXJldHVybiBlfWZ1bmN0aW9uIEt4KGUsdCl7ZG97dmFyIG49Y3Q7dHJ5e2lmKHFwKCksTnUuY3VycmVudD1sYyxpYyl7Zm9yKHZhciByPXFlLm1lbW9pemVkU3RhdGU7ciE9PW51bGw7KXt2YXIgbz1yLnF1ZXVlO28hPT1udWxsJiYoby5wZW5kaW5nPW51bGwpLHI9ci5uZXh0fWljPSExfWlmKHVpPTAsQ3Q9bXQ9cWU9bnVsbCxUcz0hMSxpYT0wLGZnLmN1cnJlbnQ9bnVsbCxuPT09bnVsbHx8bi5yZXR1cm49PT1udWxsKXt4dD0xLGFhPXQsY3Q9bnVsbDticmVha31lOnt2YXIgaT1lLGw9bi5yZXR1cm4scz1uLGE9dDtpZih0PUR0LHMuZmxhZ3N8PTMyNzY4LGEhPT1udWxsJiZ0eXBlb2YgYT09Im9iamVjdCImJnR5cGVvZiBhLnRoZW49PSJmdW5jdGlvbiIpe3ZhciB1PWEsYz1zLGQ9Yy50YWc7aWYoIShjLm1vZGUmMSkmJihkPT09MHx8ZD09PTExfHxkPT09MTUpKXt2YXIgZj1jLmFsdGVybmF0ZTtmPyhjLnVwZGF0ZVF1ZXVlPWYudXBkYXRlUXVldWUsYy5tZW1vaXplZFN0YXRlPWYubWVtb2l6ZWRTdGF0ZSxjLmxhbmVzPWYubGFuZXMpOihjLnVwZGF0ZVF1ZXVlPW51bGwsYy5tZW1vaXplZFN0YXRlPW51bGwpfXZhciBoPVB2KGwpO2lmKGghPT1udWxsKXtoLmZsYWdzJj0tMjU3LE92KGgsbCxzLGksdCksaC5tb2RlJjEmJlJ2KGksdSx0KSx0PWgsYT11O3ZhciBnPXQudXBkYXRlUXVldWU7aWYoZz09PW51bGwpe3ZhciBtPW5ldyBTZXQ7bS5hZGQoYSksdC51cGRhdGVRdWV1ZT1tfWVsc2UgZy5hZGQoYSk7YnJlYWsgZX1lbHNle2lmKCEodCYxKSl7UnYoaSx1LHQpLHZnKCk7YnJlYWsgZX1hPUVycm9yKFcoNDI2KSl9fWVsc2UgaWYoWWUmJnMubW9kZSYxKXt2YXIgUz1QdihsKTtpZihTIT09bnVsbCl7IShTLmZsYWdzJjY1NTM2KSYmKFMuZmxhZ3N8PTI1NiksT3YoUyxsLHMsaSx0KSxKcChfbChhLHMpKTticmVhayBlfX1pPWE9X2woYSxzKSx4dCE9PTQmJih4dD0yKSxicz09PW51bGw/YnM9W2ldOmJzLnB1c2goaSksaT1sO2Rve3N3aXRjaChpLnRhZyl7Y2FzZSAzOmkuZmxhZ3N8PTY1NTM2LHQmPS10LGkubGFuZXN8PXQ7dmFyIHY9YngoaSxhLHQpO0V2KGksdik7YnJlYWsgZTtjYXNlIDE6cz1hO3ZhciB5PWkudHlwZSx4PWkuc3RhdGVOb2RlO2lmKCEoaS5mbGFncyYxMjgpJiYodHlwZW9mIHkuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yPT0iZnVuY3Rpb24ifHx4IT09bnVsbCYmdHlwZW9mIHguY29tcG9uZW50RGlkQ2F0Y2g9PSJmdW5jdGlvbiImJihTbz09PW51bGx8fCFTby5oYXMoeCkpKSl7aS5mbGFnc3w9NjU1MzYsdCY9LXQsaS5sYW5lc3w9dDt2YXIgXz1SeChpLHMsdCk7RXYoaSxfKTticmVhayBlfX1pPWkucmV0dXJufXdoaWxlKGkhPT1udWxsKX1YeChuKX1jYXRjaChFKXt0PUUsY3Q9PT1uJiZuIT09bnVsbCYmKGN0PW49bi5yZXR1cm4pO2NvbnRpbnVlfWJyZWFrfXdoaWxlKDEpfWZ1bmN0aW9uIEd4KCl7dmFyIGU9c2MuY3VycmVudDtyZXR1cm4gc2MuY3VycmVudD1sYyxlPT09bnVsbD9sYzplfWZ1bmN0aW9uIHZnKCl7KHh0PT09MHx8eHQ9PT0zfHx4dD09PTIpJiYoeHQ9NCksYnQ9PT1udWxsfHwhKGNpJjI2ODQzNTQ1NSkmJiEoUWMmMjY4NDM1NDU1KXx8Y28oYnQsRHQpfWZ1bmN0aW9uIGNjKGUsdCl7dmFyIG49Q2U7Q2V8PTI7dmFyIHI9R3goKTsoYnQhPT1lfHxEdCE9PXQpJiYoTnI9bnVsbCx0aShlLHQpKTtkbyB0cnl7T2soKTticmVha31jYXRjaChvKXtLeChlLG8pfXdoaWxlKDEpO2lmKHFwKCksQ2U9bixzYy5jdXJyZW50PXIsY3QhPT1udWxsKXRocm93IEVycm9yKFcoMjYxKSk7cmV0dXJuIGJ0PW51bGwsRHQ9MCx4dH1mdW5jdGlvbiBPaygpe2Zvcig7Y3QhPT1udWxsOylZeChjdCl9ZnVuY3Rpb24gQWsoKXtmb3IoO2N0IT09bnVsbCYmIW8kKCk7KVl4KGN0KX1mdW5jdGlvbiBZeChlKXt2YXIgdD1KeChlLmFsdGVybmF0ZSxlLG1uKTtlLm1lbW9pemVkUHJvcHM9ZS5wZW5kaW5nUHJvcHMsdD09PW51bGw/WHgoZSk6Y3Q9dCxmZy5jdXJyZW50PW51bGx9ZnVuY3Rpb24gWHgoZSl7dmFyIHQ9ZTtkb3t2YXIgbj10LmFsdGVybmF0ZTtpZihlPXQucmV0dXJuLHQuZmxhZ3MmMzI3Njgpe2lmKG49a2sobix0KSxuIT09bnVsbCl7bi5mbGFncyY9MzI3NjcsY3Q9bjtyZXR1cm59aWYoZSE9PW51bGwpZS5mbGFnc3w9MzI3NjgsZS5zdWJ0cmVlRmxhZ3M9MCxlLmRlbGV0aW9ucz1udWxsO2Vsc2V7eHQ9NixjdD1udWxsO3JldHVybn19ZWxzZSBpZihuPSRrKG4sdCxtbiksbiE9PW51bGwpe2N0PW47cmV0dXJufWlmKHQ9dC5zaWJsaW5nLHQhPT1udWxsKXtjdD10O3JldHVybn1jdD10PWV9d2hpbGUodCE9PW51bGwpO3h0PT09MCYmKHh0PTUpfWZ1bmN0aW9uIEdvKGUsdCxuKXt2YXIgcj1QZSxvPUluLnRyYW5zaXRpb247dHJ5e0luLnRyYW5zaXRpb249bnVsbCxQZT0xLE1rKGUsdCxuLHIpfWZpbmFsbHl7SW4udHJhbnNpdGlvbj1vLFBlPXJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gTWsoZSx0LG4scil7ZG8gdWwoKTt3aGlsZShwbyE9PW51bGwpO2lmKENlJjYpdGhyb3cgRXJyb3IoVygzMjcpKTtuPWUuZmluaXNoZWRXb3JrO3ZhciBvPWUuZmluaXNoZWRMYW5lcztpZihuPT09bnVsbClyZXR1cm4gbnVsbDtpZihlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wLG49PT1lLmN1cnJlbnQpdGhyb3cgRXJyb3IoVygxNzcpKTtlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBpPW4ubGFuZXN8bi5jaGlsZExhbmVzO2lmKHAkKGUsaSksZT09PWJ0JiYoY3Q9YnQ9bnVsbCxEdD0wKSwhKG4uc3VidHJlZUZsYWdzJjIwNjQpJiYhKG4uZmxhZ3MmMjA2NCl8fHN1fHwoc3U9ITAsWngoSHUsZnVuY3Rpb24oKXtyZXR1cm4gdWwoKSxudWxsfSkpLGk9KG4uZmxhZ3MmMTU5OTApIT09MCxuLnN1YnRyZWVGbGFncyYxNTk5MHx8aSl7aT1Jbi50cmFuc2l0aW9uLEluLnRyYW5zaXRpb249bnVsbDt2YXIgbD1QZTtQZT0xO3ZhciBzPUNlO0NlfD00LGZnLmN1cnJlbnQ9bnVsbCxOayhlLG4pLFV4KG4sZSksZWsob2gpLEd1PSEhcmgsb2g9cmg9bnVsbCxlLmN1cnJlbnQ9bixiayhuKSxpJCgpLENlPXMsUGU9bCxJbi50cmFuc2l0aW9uPWl9ZWxzZSBlLmN1cnJlbnQ9bjtpZihzdSYmKHN1PSExLHBvPWUsdWM9byksaT1lLnBlbmRpbmdMYW5lcyxpPT09MCYmKFNvPW51bGwpLGEkKG4uc3RhdGVOb2RlKSxmbihlLHV0KCkpLHQhPT1udWxsKWZvcihyPWUub25SZWNvdmVyYWJsZUVycm9yLG49MDtuPHQubGVuZ3RoO24rKylvPXRbbl0scihvLnZhbHVlLHtjb21wb25lbnRTdGFjazpvLnN0YWNrLGRpZ2VzdDpvLmRpZ2VzdH0pO2lmKGFjKXRocm93IGFjPSExLGU9Q2gsQ2g9bnVsbCxlO3JldHVybiB1YyYxJiZlLnRhZyE9PTAmJnVsKCksaT1lLnBlbmRpbmdMYW5lcyxpJjE/ZT09PSRoP1JzKys6KFJzPTAsJGg9ZSk6UnM9MCx6bygpLG51bGx9ZnVuY3Rpb24gdWwoKXtpZihwbyE9PW51bGwpe3ZhciBlPU4xKHVjKSx0PUluLnRyYW5zaXRpb24sbj1QZTt0cnl7aWYoSW4udHJhbnNpdGlvbj1udWxsLFBlPTE2PmU/MTY6ZSxwbz09PW51bGwpdmFyIHI9ITE7ZWxzZXtpZihlPXBvLHBvPW51bGwsdWM9MCxDZSY2KXRocm93IEVycm9yKFcoMzMxKSk7dmFyIG89Q2U7Zm9yKENlfD00LEo9ZS5jdXJyZW50O0ohPT1udWxsOyl7dmFyIGk9SixsPWkuY2hpbGQ7aWYoSi5mbGFncyYxNil7dmFyIHM9aS5kZWxldGlvbnM7aWYocyE9PW51bGwpe2Zvcih2YXIgYT0wO2E8cy5sZW5ndGg7YSsrKXt2YXIgdT1zW2FdO2ZvcihKPXU7SiE9PW51bGw7KXt2YXIgYz1KO3N3aXRjaChjLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpOcyg4LGMsaSl9dmFyIGQ9Yy5jaGlsZDtpZihkIT09bnVsbClkLnJldHVybj1jLEo9ZDtlbHNlIGZvcig7SiE9PW51bGw7KXtjPUo7dmFyIGY9Yy5zaWJsaW5nLGg9Yy5yZXR1cm47aWYoRngoYyksYz09PXUpe0o9bnVsbDticmVha31pZihmIT09bnVsbCl7Zi5yZXR1cm49aCxKPWY7YnJlYWt9Sj1ofX19dmFyIGc9aS5hbHRlcm5hdGU7aWYoZyE9PW51bGwpe3ZhciBtPWcuY2hpbGQ7aWYobSE9PW51bGwpe2cuY2hpbGQ9bnVsbDtkb3t2YXIgUz1tLnNpYmxpbmc7bS5zaWJsaW5nPW51bGwsbT1TfXdoaWxlKG0hPT1udWxsKX19Sj1pfX1pZihpLnN1YnRyZWVGbGFncyYyMDY0JiZsIT09bnVsbClsLnJldHVybj1pLEo9bDtlbHNlIGU6Zm9yKDtKIT09bnVsbDspe2lmKGk9SixpLmZsYWdzJjIwNDgpc3dpdGNoKGkudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1Ok5zKDksaSxpLnJldHVybil9dmFyIHY9aS5zaWJsaW5nO2lmKHYhPT1udWxsKXt2LnJldHVybj1pLnJldHVybixKPXY7YnJlYWsgZX1KPWkucmV0dXJufX12YXIgeT1lLmN1cnJlbnQ7Zm9yKEo9eTtKIT09bnVsbDspe2w9Sjt2YXIgeD1sLmNoaWxkO2lmKGwuc3VidHJlZUZsYWdzJjIwNjQmJnghPT1udWxsKXgucmV0dXJuPWwsSj14O2Vsc2UgZTpmb3IobD15O0ohPT1udWxsOyl7aWYocz1KLHMuZmxhZ3MmMjA0OCl0cnl7c3dpdGNoKHMudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OlhjKDkscyl9fWNhdGNoKEUpe250KHMscy5yZXR1cm4sRSl9aWYocz09PWwpe0o9bnVsbDticmVhayBlfXZhciBfPXMuc2libGluZztpZihfIT09bnVsbCl7Xy5yZXR1cm49cy5yZXR1cm4sSj1fO2JyZWFrIGV9Sj1zLnJldHVybn19aWYoQ2U9byx6bygpLHByJiZ0eXBlb2YgcHIub25Qb3N0Q29tbWl0RmliZXJSb290PT0iZnVuY3Rpb24iKXRyeXtwci5vblBvc3RDb21taXRGaWJlclJvb3QoQmMsZSl9Y2F0Y2h7fXI9ITB9cmV0dXJuIHJ9ZmluYWxseXtQZT1uLEluLnRyYW5zaXRpb249dH19cmV0dXJuITF9ZnVuY3Rpb24gSHYoZSx0LG4pe3Q9X2wobix0KSx0PWJ4KGUsdCwxKSxlPXdvKGUsdCwxKSx0PW5uKCksZSE9PW51bGwmJihUYShlLDEsdCksZm4oZSx0KSl9ZnVuY3Rpb24gbnQoZSx0LG4pe2lmKGUudGFnPT09MylIdihlLGUsbik7ZWxzZSBmb3IoO3QhPT1udWxsOyl7aWYodC50YWc9PT0zKXtIdih0LGUsbik7YnJlYWt9ZWxzZSBpZih0LnRhZz09PTEpe3ZhciByPXQuc3RhdGVOb2RlO2lmKHR5cGVvZiB0LnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yPT0iZnVuY3Rpb24ifHx0eXBlb2Ygci5jb21wb25lbnREaWRDYXRjaD09ImZ1bmN0aW9uIiYmKFNvPT09bnVsbHx8IVNvLmhhcyhyKSkpe2U9X2wobixlKSxlPVJ4KHQsZSwxKSx0PXdvKHQsZSwxKSxlPW5uKCksdCE9PW51bGwmJihUYSh0LDEsZSksZm4odCxlKSk7YnJlYWt9fXQ9dC5yZXR1cm59fWZ1bmN0aW9uIERrKGUsdCxuKXt2YXIgcj1lLnBpbmdDYWNoZTtyIT09bnVsbCYmci5kZWxldGUodCksdD1ubigpLGUucGluZ2VkTGFuZXN8PWUuc3VzcGVuZGVkTGFuZXMmbixidD09PWUmJihEdCZuKT09PW4mJih4dD09PTR8fHh0PT09MyYmKER0JjEzMDAyMzQyNCk9PT1EdCYmNTAwPnV0KCktcGc/dGkoZSwwKTpoZ3w9biksZm4oZSx0KX1mdW5jdGlvbiBReChlLHQpe3Q9PT0wJiYoZS5tb2RlJjE/KHQ9SmEsSmE8PD0xLCEoSmEmMTMwMDIzNDI0KSYmKEphPTQxOTQzMDQpKTp0PTEpO3ZhciBuPW5uKCk7ZT16cihlLHQpLGUhPT1udWxsJiYoVGEoZSx0LG4pLGZuKGUsbikpfWZ1bmN0aW9uIExrKGUpe3ZhciB0PWUubWVtb2l6ZWRTdGF0ZSxuPTA7dCE9PW51bGwmJihuPXQucmV0cnlMYW5lKSxReChlLG4pfWZ1bmN0aW9uIElrKGUsdCl7dmFyIG49MDtzd2l0Y2goZS50YWcpe2Nhc2UgMTM6dmFyIHI9ZS5zdGF0ZU5vZGUsbz1lLm1lbW9pemVkU3RhdGU7byE9PW51bGwmJihuPW8ucmV0cnlMYW5lKTticmVhaztjYXNlIDE5OnI9ZS5zdGF0ZU5vZGU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihXKDMxNCkpfXIhPT1udWxsJiZyLmRlbGV0ZSh0KSxReChlLG4pfXZhciBKeDtKeD1mdW5jdGlvbihlLHQsbil7aWYoZSE9PW51bGwpaWYoZS5tZW1vaXplZFByb3BzIT09dC5wZW5kaW5nUHJvcHN8fGNuLmN1cnJlbnQpdW49ITA7ZWxzZXtpZighKGUubGFuZXMmbikmJiEodC5mbGFncyYxMjgpKXJldHVybiB1bj0hMSxDayhlLHQsbik7dW49ISEoZS5mbGFncyYxMzEwNzIpfWVsc2UgdW49ITEsWWUmJnQuZmxhZ3MmMTA0ODU3NiYmZXgodCxlYyx0LmluZGV4KTtzd2l0Y2godC5sYW5lcz0wLHQudGFnKXtjYXNlIDI6dmFyIHI9dC50eXBlO1J1KGUsdCksZT10LnBlbmRpbmdQcm9wczt2YXIgbz1tbCh0LEd0LmN1cnJlbnQpO2FsKHQsbiksbz1zZyhudWxsLHQscixlLG8sbik7dmFyIGk9YWcoKTtyZXR1cm4gdC5mbGFnc3w9MSx0eXBlb2Ygbz09Im9iamVjdCImJm8hPT1udWxsJiZ0eXBlb2Ygby5yZW5kZXI9PSJmdW5jdGlvbiImJm8uJCR0eXBlb2Y9PT12b2lkIDA/KHQudGFnPTEsdC5tZW1vaXplZFN0YXRlPW51bGwsdC51cGRhdGVRdWV1ZT1udWxsLGRuKHIpPyhpPSEwLFp1KHQpKTppPSExLHQubWVtb2l6ZWRTdGF0ZT1vLnN0YXRlIT09bnVsbCYmby5zdGF0ZSE9PXZvaWQgMD9vLnN0YXRlOm51bGwsbmcodCksby51cGRhdGVyPUdjLHQuc3RhdGVOb2RlPW8sby5fcmVhY3RJbnRlcm5hbHM9dCxoaCh0LHIsZSxuKSx0PW1oKG51bGwsdCxyLCEwLGksbikpOih0LnRhZz0wLFllJiZpJiZYcCh0KSxZdChudWxsLHQsbyxuKSx0PXQuY2hpbGQpLHQ7Y2FzZSAxNjpyPXQuZWxlbWVudFR5cGU7ZTp7c3dpdGNoKFJ1KGUsdCksZT10LnBlbmRpbmdQcm9wcyxvPXIuX2luaXQscj1vKHIuX3BheWxvYWQpLHQudHlwZT1yLG89dC50YWc9emsociksZT1LbihyLGUpLG8pe2Nhc2UgMDp0PWdoKG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDE6dD1EdihudWxsLHQscixlLG4pO2JyZWFrIGU7Y2FzZSAxMTp0PUF2KG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDE0OnQ9TXYobnVsbCx0LHIsS24oci50eXBlLGUpLG4pO2JyZWFrIGV9dGhyb3cgRXJyb3IoVygzMDYsciwiIikpfXJldHVybiB0O2Nhc2UgMDpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286S24ocixvKSxnaChlLHQscixvLG4pO2Nhc2UgMTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286S24ocixvKSxEdihlLHQscixvLG4pO2Nhc2UgMzplOntpZihNeCh0KSxlPT09bnVsbCl0aHJvdyBFcnJvcihXKDM4NykpO3I9dC5wZW5kaW5nUHJvcHMsaT10Lm1lbW9pemVkU3RhdGUsbz1pLmVsZW1lbnQsb3goZSx0KSxyYyh0LHIsbnVsbCxuKTt2YXIgbD10Lm1lbW9pemVkU3RhdGU7aWYocj1sLmVsZW1lbnQsaS5pc0RlaHlkcmF0ZWQpaWYoaT17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDohMSxjYWNoZTpsLmNhY2hlLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6bC5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLHRyYW5zaXRpb25zOmwudHJhbnNpdGlvbnN9LHQudXBkYXRlUXVldWUuYmFzZVN0YXRlPWksdC5tZW1vaXplZFN0YXRlPWksdC5mbGFncyYyNTYpe289X2woRXJyb3IoVyg0MjMpKSx0KSx0PUx2KGUsdCxyLG4sbyk7YnJlYWsgZX1lbHNlIGlmKHIhPT1vKXtvPV9sKEVycm9yKFcoNDI0KSksdCksdD1MdihlLHQscixuLG8pO2JyZWFrIGV9ZWxzZSBmb3IoeG49X28odC5zdGF0ZU5vZGUuY29udGFpbmVySW5mby5maXJzdENoaWxkKSxfbj10LFllPSEwLFhuPW51bGwsbj1heCh0LG51bGwscixuKSx0LmNoaWxkPW47bjspbi5mbGFncz1uLmZsYWdzJi0zfDQwOTYsbj1uLnNpYmxpbmc7ZWxzZXtpZih2bCgpLHI9PT1vKXt0PUZyKGUsdCxuKTticmVhayBlfVl0KGUsdCxyLG4pfXQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDU6cmV0dXJuIHV4KHQpLGU9PT1udWxsJiZjaCh0KSxyPXQudHlwZSxvPXQucGVuZGluZ1Byb3BzLGk9ZSE9PW51bGw/ZS5tZW1vaXplZFByb3BzOm51bGwsbD1vLmNoaWxkcmVuLGloKHIsbyk/bD1udWxsOmkhPT1udWxsJiZpaChyLGkpJiYodC5mbGFnc3w9MzIpLEF4KGUsdCksWXQoZSx0LGwsbiksdC5jaGlsZDtjYXNlIDY6cmV0dXJuIGU9PT1udWxsJiZjaCh0KSxudWxsO2Nhc2UgMTM6cmV0dXJuIER4KGUsdCxuKTtjYXNlIDQ6cmV0dXJuIHJnKHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbykscj10LnBlbmRpbmdQcm9wcyxlPT09bnVsbD90LmNoaWxkPXlsKHQsbnVsbCxyLG4pOll0KGUsdCxyLG4pLHQuY2hpbGQ7Y2FzZSAxMTpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286S24ocixvKSxBdihlLHQscixvLG4pO2Nhc2UgNzpyZXR1cm4gWXQoZSx0LHQucGVuZGluZ1Byb3BzLG4pLHQuY2hpbGQ7Y2FzZSA4OnJldHVybiBZdChlLHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sbiksdC5jaGlsZDtjYXNlIDEyOnJldHVybiBZdChlLHQsdC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sbiksdC5jaGlsZDtjYXNlIDEwOmU6e2lmKHI9dC50eXBlLl9jb250ZXh0LG89dC5wZW5kaW5nUHJvcHMsaT10Lm1lbW9pemVkUHJvcHMsbD1vLnZhbHVlLEZlKHRjLHIuX2N1cnJlbnRWYWx1ZSksci5fY3VycmVudFZhbHVlPWwsaSE9PW51bGwpaWYoZXIoaS52YWx1ZSxsKSl7aWYoaS5jaGlsZHJlbj09PW8uY2hpbGRyZW4mJiFjbi5jdXJyZW50KXt0PUZyKGUsdCxuKTticmVhayBlfX1lbHNlIGZvcihpPXQuY2hpbGQsaSE9PW51bGwmJihpLnJldHVybj10KTtpIT09bnVsbDspe3ZhciBzPWkuZGVwZW5kZW5jaWVzO2lmKHMhPT1udWxsKXtsPWkuY2hpbGQ7Zm9yKHZhciBhPXMuZmlyc3RDb250ZXh0O2EhPT1udWxsOyl7aWYoYS5jb250ZXh0PT09cil7aWYoaS50YWc9PT0xKXthPUxyKC0xLG4mLW4pLGEudGFnPTI7dmFyIHU9aS51cGRhdGVRdWV1ZTtpZih1IT09bnVsbCl7dT11LnNoYXJlZDt2YXIgYz11LnBlbmRpbmc7Yz09PW51bGw/YS5uZXh0PWE6KGEubmV4dD1jLm5leHQsYy5uZXh0PWEpLHUucGVuZGluZz1hfX1pLmxhbmVzfD1uLGE9aS5hbHRlcm5hdGUsYSE9PW51bGwmJihhLmxhbmVzfD1uKSxkaChpLnJldHVybixuLHQpLHMubGFuZXN8PW47YnJlYWt9YT1hLm5leHR9fWVsc2UgaWYoaS50YWc9PT0xMClsPWkudHlwZT09PXQudHlwZT9udWxsOmkuY2hpbGQ7ZWxzZSBpZihpLnRhZz09PTE4KXtpZihsPWkucmV0dXJuLGw9PT1udWxsKXRocm93IEVycm9yKFcoMzQxKSk7bC5sYW5lc3w9bixzPWwuYWx0ZXJuYXRlLHMhPT1udWxsJiYocy5sYW5lc3w9biksZGgobCxuLHQpLGw9aS5zaWJsaW5nfWVsc2UgbD1pLmNoaWxkO2lmKGwhPT1udWxsKWwucmV0dXJuPWk7ZWxzZSBmb3IobD1pO2whPT1udWxsOyl7aWYobD09PXQpe2w9bnVsbDticmVha31pZihpPWwuc2libGluZyxpIT09bnVsbCl7aS5yZXR1cm49bC5yZXR1cm4sbD1pO2JyZWFrfWw9bC5yZXR1cm59aT1sfVl0KGUsdCxvLmNoaWxkcmVuLG4pLHQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDk6cmV0dXJuIG89dC50eXBlLHI9dC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sYWwodCxuKSxvPWpuKG8pLHI9cihvKSx0LmZsYWdzfD0xLFl0KGUsdCxyLG4pLHQuY2hpbGQ7Y2FzZSAxNDpyZXR1cm4gcj10LnR5cGUsbz1LbihyLHQucGVuZGluZ1Byb3BzKSxvPUtuKHIudHlwZSxvKSxNdihlLHQscixvLG4pO2Nhc2UgMTU6cmV0dXJuIFB4KGUsdCx0LnR5cGUsdC5wZW5kaW5nUHJvcHMsbik7Y2FzZSAxNzpyZXR1cm4gcj10LnR5cGUsbz10LnBlbmRpbmdQcm9wcyxvPXQuZWxlbWVudFR5cGU9PT1yP286S24ocixvKSxSdShlLHQpLHQudGFnPTEsZG4ocik/KGU9ITAsWnUodCkpOmU9ITEsYWwodCxuKSxseCh0LHIsbyksaGgodCxyLG8sbiksbWgobnVsbCx0LHIsITAsZSxuKTtjYXNlIDE5OnJldHVybiBMeChlLHQsbik7Y2FzZSAyMjpyZXR1cm4gT3goZSx0LG4pfXRocm93IEVycm9yKFcoMTU2LHQudGFnKSl9O2Z1bmN0aW9uIFp4KGUsdCl7cmV0dXJuIEMxKGUsdCl9ZnVuY3Rpb24gamsoZSx0LG4scil7dGhpcy50YWc9ZSx0aGlzLmtleT1uLHRoaXMuc2libGluZz10aGlzLmNoaWxkPXRoaXMucmV0dXJuPXRoaXMuc3RhdGVOb2RlPXRoaXMudHlwZT10aGlzLmVsZW1lbnRUeXBlPW51bGwsdGhpcy5pbmRleD0wLHRoaXMucmVmPW51bGwsdGhpcy5wZW5kaW5nUHJvcHM9dCx0aGlzLmRlcGVuZGVuY2llcz10aGlzLm1lbW9pemVkU3RhdGU9dGhpcy51cGRhdGVRdWV1ZT10aGlzLm1lbW9pemVkUHJvcHM9bnVsbCx0aGlzLm1vZGU9cix0aGlzLnN1YnRyZWVGbGFncz10aGlzLmZsYWdzPTAsdGhpcy5kZWxldGlvbnM9bnVsbCx0aGlzLmNoaWxkTGFuZXM9dGhpcy5sYW5lcz0wLHRoaXMuYWx0ZXJuYXRlPW51bGx9ZnVuY3Rpb24gRG4oZSx0LG4scil7cmV0dXJuIG5ldyBqayhlLHQsbixyKX1mdW5jdGlvbiB5ZyhlKXtyZXR1cm4gZT1lLnByb3RvdHlwZSwhKCFlfHwhZS5pc1JlYWN0Q29tcG9uZW50KX1mdW5jdGlvbiB6ayhlKXtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIilyZXR1cm4geWcoZSk/MTowO2lmKGUhPW51bGwpe2lmKGU9ZS4kJHR5cGVvZixlPT09SXApcmV0dXJuIDExO2lmKGU9PT1qcClyZXR1cm4gMTR9cmV0dXJuIDJ9ZnVuY3Rpb24gQ28oZSx0KXt2YXIgbj1lLmFsdGVybmF0ZTtyZXR1cm4gbj09PW51bGw/KG49RG4oZS50YWcsdCxlLmtleSxlLm1vZGUpLG4uZWxlbWVudFR5cGU9ZS5lbGVtZW50VHlwZSxuLnR5cGU9ZS50eXBlLG4uc3RhdGVOb2RlPWUuc3RhdGVOb2RlLG4uYWx0ZXJuYXRlPWUsZS5hbHRlcm5hdGU9bik6KG4ucGVuZGluZ1Byb3BzPXQsbi50eXBlPWUudHlwZSxuLmZsYWdzPTAsbi5zdWJ0cmVlRmxhZ3M9MCxuLmRlbGV0aW9ucz1udWxsKSxuLmZsYWdzPWUuZmxhZ3MmMTQ2ODAwNjQsbi5jaGlsZExhbmVzPWUuY2hpbGRMYW5lcyxuLmxhbmVzPWUubGFuZXMsbi5jaGlsZD1lLmNoaWxkLG4ubWVtb2l6ZWRQcm9wcz1lLm1lbW9pemVkUHJvcHMsbi5tZW1vaXplZFN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxuLnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdD1lLmRlcGVuZGVuY2llcyxuLmRlcGVuZGVuY2llcz10PT09bnVsbD9udWxsOntsYW5lczp0LmxhbmVzLGZpcnN0Q29udGV4dDp0LmZpcnN0Q29udGV4dH0sbi5zaWJsaW5nPWUuc2libGluZyxuLmluZGV4PWUuaW5kZXgsbi5yZWY9ZS5yZWYsbn1mdW5jdGlvbiBBdShlLHQsbixyLG8saSl7dmFyIGw9MjtpZihyPWUsdHlwZW9mIGU9PSJmdW5jdGlvbiIpeWcoZSkmJihsPTEpO2Vsc2UgaWYodHlwZW9mIGU9PSJzdHJpbmciKWw9NTtlbHNlIGU6c3dpdGNoKGUpe2Nhc2UgVWk6cmV0dXJuIG5pKG4uY2hpbGRyZW4sbyxpLHQpO2Nhc2UgTHA6bD04LG98PTg7YnJlYWs7Y2FzZSBJZjpyZXR1cm4gZT1EbigxMixuLHQsb3wyKSxlLmVsZW1lbnRUeXBlPUlmLGUubGFuZXM9aSxlO2Nhc2UgamY6cmV0dXJuIGU9RG4oMTMsbix0LG8pLGUuZWxlbWVudFR5cGU9amYsZS5sYW5lcz1pLGU7Y2FzZSB6ZjpyZXR1cm4gZT1EbigxOSxuLHQsbyksZS5lbGVtZW50VHlwZT16ZixlLmxhbmVzPWksZTtjYXNlIHMxOnJldHVybiBKYyhuLG8saSx0KTtkZWZhdWx0OmlmKHR5cGVvZiBlPT0ib2JqZWN0IiYmZSE9PW51bGwpc3dpdGNoKGUuJCR0eXBlb2Ype2Nhc2UgaTE6bD0xMDticmVhayBlO2Nhc2UgbDE6bD05O2JyZWFrIGU7Y2FzZSBJcDpsPTExO2JyZWFrIGU7Y2FzZSBqcDpsPTE0O2JyZWFrIGU7Y2FzZSBsbzpsPTE2LHI9bnVsbDticmVhayBlfXRocm93IEVycm9yKFcoMTMwLGU9PW51bGw/ZTp0eXBlb2YgZSwiIikpfXJldHVybiB0PURuKGwsbix0LG8pLHQuZWxlbWVudFR5cGU9ZSx0LnR5cGU9cix0LmxhbmVzPWksdH1mdW5jdGlvbiBuaShlLHQsbixyKXtyZXR1cm4gZT1Ebig3LGUscix0KSxlLmxhbmVzPW4sZX1mdW5jdGlvbiBKYyhlLHQsbixyKXtyZXR1cm4gZT1EbigyMixlLHIsdCksZS5lbGVtZW50VHlwZT1zMSxlLmxhbmVzPW4sZS5zdGF0ZU5vZGU9e2lzSGlkZGVuOiExfSxlfWZ1bmN0aW9uIHVmKGUsdCxuKXtyZXR1cm4gZT1Ebig2LGUsbnVsbCx0KSxlLmxhbmVzPW4sZX1mdW5jdGlvbiBjZihlLHQsbil7cmV0dXJuIHQ9RG4oNCxlLmNoaWxkcmVuIT09bnVsbD9lLmNoaWxkcmVuOltdLGUua2V5LHQpLHQubGFuZXM9bix0LnN0YXRlTm9kZT17Y29udGFpbmVySW5mbzplLmNvbnRhaW5lckluZm8scGVuZGluZ0NoaWxkcmVuOm51bGwsaW1wbGVtZW50YXRpb246ZS5pbXBsZW1lbnRhdGlvbn0sdH1mdW5jdGlvbiBGayhlLHQsbixyLG8pe3RoaXMudGFnPXQsdGhpcy5jb250YWluZXJJbmZvPWUsdGhpcy5maW5pc2hlZFdvcms9dGhpcy5waW5nQ2FjaGU9dGhpcy5jdXJyZW50PXRoaXMucGVuZGluZ0NoaWxkcmVuPW51bGwsdGhpcy50aW1lb3V0SGFuZGxlPS0xLHRoaXMuY2FsbGJhY2tOb2RlPXRoaXMucGVuZGluZ0NvbnRleHQ9dGhpcy5jb250ZXh0PW51bGwsdGhpcy5jYWxsYmFja1ByaW9yaXR5PTAsdGhpcy5ldmVudFRpbWVzPVVkKDApLHRoaXMuZXhwaXJhdGlvblRpbWVzPVVkKC0xKSx0aGlzLmVudGFuZ2xlZExhbmVzPXRoaXMuZmluaXNoZWRMYW5lcz10aGlzLm11dGFibGVSZWFkTGFuZXM9dGhpcy5leHBpcmVkTGFuZXM9dGhpcy5waW5nZWRMYW5lcz10aGlzLnN1c3BlbmRlZExhbmVzPXRoaXMucGVuZGluZ0xhbmVzPTAsdGhpcy5lbnRhbmdsZW1lbnRzPVVkKDApLHRoaXMuaWRlbnRpZmllclByZWZpeD1yLHRoaXMub25SZWNvdmVyYWJsZUVycm9yPW8sdGhpcy5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPW51bGx9ZnVuY3Rpb24geGcoZSx0LG4scixvLGksbCxzLGEpe3JldHVybiBlPW5ldyBGayhlLHQsbixzLGEpLHQ9PT0xPyh0PTEsaT09PSEwJiYodHw9OCkpOnQ9MCxpPURuKDMsbnVsbCxudWxsLHQpLGUuY3VycmVudD1pLGkuc3RhdGVOb2RlPWUsaS5tZW1vaXplZFN0YXRlPXtlbGVtZW50OnIsaXNEZWh5ZHJhdGVkOm4sY2FjaGU6bnVsbCx0cmFuc2l0aW9uczpudWxsLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6bnVsbH0sbmcoaSksZX1mdW5jdGlvbiBCayhlLHQsbil7dmFyIHI9Mzxhcmd1bWVudHMubGVuZ3RoJiZhcmd1bWVudHNbM10hPT12b2lkIDA/YXJndW1lbnRzWzNdOm51bGw7cmV0dXJueyQkdHlwZW9mOldpLGtleTpyPT1udWxsP251bGw6IiIrcixjaGlsZHJlbjplLGNvbnRhaW5lckluZm86dCxpbXBsZW1lbnRhdGlvbjpufX1mdW5jdGlvbiBxeChlKXtpZighZSlyZXR1cm4gTm87ZT1lLl9yZWFjdEludGVybmFscztlOntpZih4aShlKSE9PWV8fGUudGFnIT09MSl0aHJvdyBFcnJvcihXKDE3MCkpO3ZhciB0PWU7ZG97c3dpdGNoKHQudGFnKXtjYXNlIDM6dD10LnN0YXRlTm9kZS5jb250ZXh0O2JyZWFrIGU7Y2FzZSAxOmlmKGRuKHQudHlwZSkpe3Q9dC5zdGF0ZU5vZGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNZXJnZWRDaGlsZENvbnRleHQ7YnJlYWsgZX19dD10LnJldHVybn13aGlsZSh0IT09bnVsbCk7dGhyb3cgRXJyb3IoVygxNzEpKX1pZihlLnRhZz09PTEpe3ZhciBuPWUudHlwZTtpZihkbihuKSlyZXR1cm4gWjEoZSxuLHQpfXJldHVybiB0fWZ1bmN0aW9uIGVfKGUsdCxuLHIsbyxpLGwscyxhKXtyZXR1cm4gZT14ZyhuLHIsITAsZSxvLGksbCxzLGEpLGUuY29udGV4dD1xeChudWxsKSxuPWUuY3VycmVudCxyPW5uKCksbz1FbyhuKSxpPUxyKHIsbyksaS5jYWxsYmFjaz10Pz9udWxsLHdvKG4saSxvKSxlLmN1cnJlbnQubGFuZXM9byxUYShlLG8sciksZm4oZSxyKSxlfWZ1bmN0aW9uIFpjKGUsdCxuLHIpe3ZhciBvPXQuY3VycmVudCxpPW5uKCksbD1FbyhvKTtyZXR1cm4gbj1xeChuKSx0LmNvbnRleHQ9PT1udWxsP3QuY29udGV4dD1uOnQucGVuZGluZ0NvbnRleHQ9bix0PUxyKGksbCksdC5wYXlsb2FkPXtlbGVtZW50OmV9LHI9cj09PXZvaWQgMD9udWxsOnIsciE9PW51bGwmJih0LmNhbGxiYWNrPXIpLGU9d28obyx0LGwpLGUhPT1udWxsJiYocW4oZSxvLGwsaSksVHUoZSxvLGwpKSxsfWZ1bmN0aW9uIGRjKGUpe2lmKGU9ZS5jdXJyZW50LCFlLmNoaWxkKXJldHVybiBudWxsO3N3aXRjaChlLmNoaWxkLnRhZyl7Y2FzZSA1OnJldHVybiBlLmNoaWxkLnN0YXRlTm9kZTtkZWZhdWx0OnJldHVybiBlLmNoaWxkLnN0YXRlTm9kZX19ZnVuY3Rpb24gS3YoZSx0KXtpZihlPWUubWVtb2l6ZWRTdGF0ZSxlIT09bnVsbCYmZS5kZWh5ZHJhdGVkIT09bnVsbCl7dmFyIG49ZS5yZXRyeUxhbmU7ZS5yZXRyeUxhbmU9biE9PTAmJm48dD9uOnR9fWZ1bmN0aW9uIF9nKGUsdCl7S3YoZSx0KSwoZT1lLmFsdGVybmF0ZSkmJkt2KGUsdCl9ZnVuY3Rpb24gV2soKXtyZXR1cm4gbnVsbH12YXIgdF89dHlwZW9mIHJlcG9ydEVycm9yPT0iZnVuY3Rpb24iP3JlcG9ydEVycm9yOmZ1bmN0aW9uKGUpe2NvbnNvbGUuZXJyb3IoZSl9O2Z1bmN0aW9uIHdnKGUpe3RoaXMuX2ludGVybmFsUm9vdD1lfXFjLnByb3RvdHlwZS5yZW5kZXI9d2cucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbihlKXt2YXIgdD10aGlzLl9pbnRlcm5hbFJvb3Q7aWYodD09PW51bGwpdGhyb3cgRXJyb3IoVyg0MDkpKTtaYyhlLHQsbnVsbCxudWxsKX07cWMucHJvdG90eXBlLnVubW91bnQ9d2cucHJvdG90eXBlLnVubW91bnQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9pbnRlcm5hbFJvb3Q7aWYoZSE9PW51bGwpe3RoaXMuX2ludGVybmFsUm9vdD1udWxsO3ZhciB0PWUuY29udGFpbmVySW5mbztkaShmdW5jdGlvbigpe1pjKG51bGwsZSxudWxsLG51bGwpfSksdFtqcl09bnVsbH19O2Z1bmN0aW9uIHFjKGUpe3RoaXMuX2ludGVybmFsUm9vdD1lfXFjLnByb3RvdHlwZS51bnN0YWJsZV9zY2hlZHVsZUh5ZHJhdGlvbj1mdW5jdGlvbihlKXtpZihlKXt2YXIgdD1QMSgpO2U9e2Jsb2NrZWRPbjpudWxsLHRhcmdldDplLHByaW9yaXR5OnR9O2Zvcih2YXIgbj0wO248dW8ubGVuZ3RoJiZ0IT09MCYmdDx1b1tuXS5wcmlvcml0eTtuKyspO3VvLnNwbGljZShuLDAsZSksbj09PTAmJkExKGUpfX07ZnVuY3Rpb24gU2coZSl7cmV0dXJuISghZXx8ZS5ub2RlVHlwZSE9PTEmJmUubm9kZVR5cGUhPT05JiZlLm5vZGVUeXBlIT09MTEpfWZ1bmN0aW9uIGVkKGUpe3JldHVybiEoIWV8fGUubm9kZVR5cGUhPT0xJiZlLm5vZGVUeXBlIT09OSYmZS5ub2RlVHlwZSE9PTExJiYoZS5ub2RlVHlwZSE9PTh8fGUubm9kZVZhbHVlIT09IiByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAiKSl9ZnVuY3Rpb24gR3YoKXt9ZnVuY3Rpb24gVWsoZSx0LG4scixvKXtpZihvKXtpZih0eXBlb2Ygcj09ImZ1bmN0aW9uIil7dmFyIGk9cjtyPWZ1bmN0aW9uKCl7dmFyIHU9ZGMobCk7aS5jYWxsKHUpfX12YXIgbD1lXyh0LHIsZSwwLG51bGwsITEsITEsIiIsR3YpO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI9bCxlW2pyXT1sLmN1cnJlbnQsZWEoZS5ub2RlVHlwZT09PTg/ZS5wYXJlbnROb2RlOmUpLGRpKCksbH1mb3IoO289ZS5sYXN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQobyk7aWYodHlwZW9mIHI9PSJmdW5jdGlvbiIpe3ZhciBzPXI7cj1mdW5jdGlvbigpe3ZhciB1PWRjKGEpO3MuY2FsbCh1KX19dmFyIGE9eGcoZSwwLCExLG51bGwsbnVsbCwhMSwhMSwiIixHdik7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj1hLGVbanJdPWEuY3VycmVudCxlYShlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGU6ZSksZGkoZnVuY3Rpb24oKXtaYyh0LGEsbixyKX0pLGF9ZnVuY3Rpb24gdGQoZSx0LG4scixvKXt2YXIgaT1uLl9yZWFjdFJvb3RDb250YWluZXI7aWYoaSl7dmFyIGw9aTtpZih0eXBlb2Ygbz09ImZ1bmN0aW9uIil7dmFyIHM9bztvPWZ1bmN0aW9uKCl7dmFyIGE9ZGMobCk7cy5jYWxsKGEpfX1aYyh0LGwsZSxvKX1lbHNlIGw9VWsobix0LGUsbyxyKTtyZXR1cm4gZGMobCl9YjE9ZnVuY3Rpb24oZSl7c3dpdGNoKGUudGFnKXtjYXNlIDM6dmFyIHQ9ZS5zdGF0ZU5vZGU7aWYodC5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXt2YXIgbj1tcyh0LnBlbmRpbmdMYW5lcyk7biE9PTAmJihCcCh0LG58MSksZm4odCx1dCgpKSwhKENlJjYpJiYod2w9dXQoKSs1MDAsem8oKSkpfWJyZWFrO2Nhc2UgMTM6ZGkoZnVuY3Rpb24oKXt2YXIgcj16cihlLDEpO2lmKHIhPT1udWxsKXt2YXIgbz1ubigpO3FuKHIsZSwxLG8pfX0pLF9nKGUsMSl9fTtXcD1mdW5jdGlvbihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD16cihlLDEzNDIxNzcyOCk7aWYodCE9PW51bGwpe3ZhciBuPW5uKCk7cW4odCxlLDEzNDIxNzcyOCxuKX1fZyhlLDEzNDIxNzcyOCl9fTtSMT1mdW5jdGlvbihlKXtpZihlLnRhZz09PTEzKXt2YXIgdD1FbyhlKSxuPXpyKGUsdCk7aWYobiE9PW51bGwpe3ZhciByPW5uKCk7cW4obixlLHQscil9X2coZSx0KX19O1AxPWZ1bmN0aW9uKCl7cmV0dXJuIFBlfTtPMT1mdW5jdGlvbihlLHQpe3ZhciBuPVBlO3RyeXtyZXR1cm4gUGU9ZSx0KCl9ZmluYWxseXtQZT1ufX07WGY9ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaCh0KXtjYXNlImlucHV0IjppZihXZihlLG4pLHQ9bi5uYW1lLG4udHlwZT09PSJyYWRpbyImJnQhPW51bGwpe2ZvcihuPWU7bi5wYXJlbnROb2RlOyluPW4ucGFyZW50Tm9kZTtmb3Iobj1uLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9IitKU09OLnN0cmluZ2lmeSgiIit0KSsnXVt0eXBlPSJyYWRpbyJdJyksdD0wO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdO2lmKHIhPT1lJiZyLmZvcm09PT1lLmZvcm0pe3ZhciBvPUhjKHIpO2lmKCFvKXRocm93IEVycm9yKFcoOTApKTt1MShyKSxXZihyLG8pfX19YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6ZDEoZSxuKTticmVhaztjYXNlInNlbGVjdCI6dD1uLnZhbHVlLHQhPW51bGwmJm9sKGUsISFuLm11bHRpcGxlLHQsITEpfX07eTE9Z2c7eDE9ZGk7dmFyIFZrPXt1c2luZ0NsaWVudEVudHJ5UG9pbnQ6ITEsRXZlbnRzOltiYSxHaSxIYyxtMSx2MSxnZ119LGxzPXtmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTpRbyxidW5kbGVUeXBlOjAsdmVyc2lvbjoiMTguMi4wIixyZW5kZXJlclBhY2thZ2VOYW1lOiJyZWFjdC1kb20ifSxIaz17YnVuZGxlVHlwZTpscy5idW5kbGVUeXBlLHZlcnNpb246bHMudmVyc2lvbixyZW5kZXJlclBhY2thZ2VOYW1lOmxzLnJlbmRlcmVyUGFja2FnZU5hbWUscmVuZGVyZXJDb25maWc6bHMucmVuZGVyZXJDb25maWcsb3ZlcnJpZGVIb29rU3RhdGU6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzOm51bGwsb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzUmVuYW1lUGF0aDpudWxsLHNldEVycm9ySGFuZGxlcjpudWxsLHNldFN1c3BlbnNlSGFuZGxlcjpudWxsLHNjaGVkdWxlVXBkYXRlOm51bGwsY3VycmVudERpc3BhdGNoZXJSZWY6VnIuUmVhY3RDdXJyZW50RGlzcGF0Y2hlcixmaW5kSG9zdEluc3RhbmNlQnlGaWJlcjpmdW5jdGlvbihlKXtyZXR1cm4gZT1TMShlKSxlPT09bnVsbD9udWxsOmUuc3RhdGVOb2RlfSxmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTpscy5maW5kRmliZXJCeUhvc3RJbnN0YW5jZXx8V2ssZmluZEhvc3RJbnN0YW5jZXNGb3JSZWZyZXNoOm51bGwsc2NoZWR1bGVSZWZyZXNoOm51bGwsc2NoZWR1bGVSb290Om51bGwsc2V0UmVmcmVzaEhhbmRsZXI6bnVsbCxnZXRDdXJyZW50RmliZXI6bnVsbCxyZWNvbmNpbGVyVmVyc2lvbjoiMTguMi4wLW5leHQtOWUzYjc3MmI4LTIwMjIwNjA4In07aWYodHlwZW9mIF9fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXzwidSIpe3ZhciBhdT1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187aWYoIWF1LmlzRGlzYWJsZWQmJmF1LnN1cHBvcnRzRmliZXIpdHJ5e0JjPWF1LmluamVjdChIaykscHI9YXV9Y2F0Y2h7fX1Ubi5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRD1WaztUbi5jcmVhdGVQb3J0YWw9ZnVuY3Rpb24oZSx0KXt2YXIgbj0yPGFyZ3VtZW50cy5sZW5ndGgmJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06bnVsbDtpZighU2codCkpdGhyb3cgRXJyb3IoVygyMDApKTtyZXR1cm4gQmsoZSx0LG51bGwsbil9O1RuLmNyZWF0ZVJvb3Q9ZnVuY3Rpb24oZSx0KXtpZighU2coZSkpdGhyb3cgRXJyb3IoVygyOTkpKTt2YXIgbj0hMSxyPSIiLG89dF87cmV0dXJuIHQhPW51bGwmJih0LnVuc3RhYmxlX3N0cmljdE1vZGU9PT0hMCYmKG49ITApLHQuaWRlbnRpZmllclByZWZpeCE9PXZvaWQgMCYmKHI9dC5pZGVudGlmaWVyUHJlZml4KSx0Lm9uUmVjb3ZlcmFibGVFcnJvciE9PXZvaWQgMCYmKG89dC5vblJlY292ZXJhYmxlRXJyb3IpKSx0PXhnKGUsMSwhMSxudWxsLG51bGwsbiwhMSxyLG8pLGVbanJdPXQuY3VycmVudCxlYShlLm5vZGVUeXBlPT09OD9lLnBhcmVudE5vZGU6ZSksbmV3IHdnKHQpfTtUbi5maW5kRE9NTm9kZT1mdW5jdGlvbihlKXtpZihlPT1udWxsKXJldHVybiBudWxsO2lmKGUubm9kZVR5cGU9PT0xKXJldHVybiBlO3ZhciB0PWUuX3JlYWN0SW50ZXJuYWxzO2lmKHQ9PT12b2lkIDApdGhyb3cgdHlwZW9mIGUucmVuZGVyPT0iZnVuY3Rpb24iP0Vycm9yKFcoMTg4KSk6KGU9T2JqZWN0LmtleXMoZSkuam9pbigiLCIpLEVycm9yKFcoMjY4LGUpKSk7cmV0dXJuIGU9UzEodCksZT1lPT09bnVsbD9udWxsOmUuc3RhdGVOb2RlLGV9O1RuLmZsdXNoU3luYz1mdW5jdGlvbihlKXtyZXR1cm4gZGkoZSl9O1RuLmh5ZHJhdGU9ZnVuY3Rpb24oZSx0LG4pe2lmKCFlZCh0KSl0aHJvdyBFcnJvcihXKDIwMCkpO3JldHVybiB0ZChudWxsLGUsdCwhMCxuKX07VG4uaHlkcmF0ZVJvb3Q9ZnVuY3Rpb24oZSx0LG4pe2lmKCFTZyhlKSl0aHJvdyBFcnJvcihXKDQwNSkpO3ZhciByPW4hPW51bGwmJm4uaHlkcmF0ZWRTb3VyY2VzfHxudWxsLG89ITEsaT0iIixsPXRfO2lmKG4hPW51bGwmJihuLnVuc3RhYmxlX3N0cmljdE1vZGU9PT0hMCYmKG89ITApLG4uaWRlbnRpZmllclByZWZpeCE9PXZvaWQgMCYmKGk9bi5pZGVudGlmaWVyUHJlZml4KSxuLm9uUmVjb3ZlcmFibGVFcnJvciE9PXZvaWQgMCYmKGw9bi5vblJlY292ZXJhYmxlRXJyb3IpKSx0PWVfKHQsbnVsbCxlLDEsbj8/bnVsbCxvLCExLGksbCksZVtqcl09dC5jdXJyZW50LGVhKGUpLHIpZm9yKGU9MDtlPHIubGVuZ3RoO2UrKyluPXJbZV0sbz1uLl9nZXRWZXJzaW9uLG89byhuLl9zb3VyY2UpLHQubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT09bnVsbD90Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE9W24sb106dC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhLnB1c2gobixvKTtyZXR1cm4gbmV3IHFjKHQpfTtUbi5yZW5kZXI9ZnVuY3Rpb24oZSx0LG4pe2lmKCFlZCh0KSl0aHJvdyBFcnJvcihXKDIwMCkpO3JldHVybiB0ZChudWxsLGUsdCwhMSxuKX07VG4udW5tb3VudENvbXBvbmVudEF0Tm9kZT1mdW5jdGlvbihlKXtpZighZWQoZSkpdGhyb3cgRXJyb3IoVyg0MCkpO3JldHVybiBlLl9yZWFjdFJvb3RDb250YWluZXI/KGRpKGZ1bmN0aW9uKCl7dGQobnVsbCxudWxsLGUsITEsZnVuY3Rpb24oKXtlLl9yZWFjdFJvb3RDb250YWluZXI9bnVsbCxlW2pyXT1udWxsfSl9KSwhMCk6ITF9O1RuLnVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzPWdnO1RuLnVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlZChuKSl0aHJvdyBFcnJvcihXKDIwMCkpO2lmKGU9PW51bGx8fGUuX3JlYWN0SW50ZXJuYWxzPT09dm9pZCAwKXRocm93IEVycm9yKFcoMzgpKTtyZXR1cm4gdGQoZSx0LG4sITEscil9O1RuLnZlcnNpb249IjE4LjIuMC1uZXh0LTllM2I3NzJiOC0yMDIyMDYwOCI7ZnVuY3Rpb24gbl8oKXtpZighKHR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18+InUifHx0eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFIT0iZnVuY3Rpb24iKSl0cnl7X19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmNoZWNrRENFKG5fKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX1uXygpLGUxLmV4cG9ydHM9VG47dmFyIEhyPWUxLmV4cG9ydHM7Y29uc3QgS2s9JGEoSHIpO3ZhciBZdj1IcjtEZi5jcmVhdGVSb290PVl2LmNyZWF0ZVJvb3QsRGYuaHlkcmF0ZVJvb3Q9WXYuaHlkcmF0ZVJvb3Q7dmFyIHJfPXtleHBvcnRzOnt9fSxuZD17fTsvKioKICogQGxpY2Vuc2UgUmVhY3QKICogcmVhY3QtanN4LXJ1bnRpbWUucHJvZHVjdGlvbi5taW4uanMKICoKICogQ29weXJpZ2h0IChjKSBGYWNlYm9vaywgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqL3ZhciBHaz1wLFlrPVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxYaz1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLFFrPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksSms9R2suX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQuUmVhY3RDdXJyZW50T3duZXIsWms9e2tleTohMCxyZWY6ITAsX19zZWxmOiEwLF9fc291cmNlOiEwfTtmdW5jdGlvbiBvXyhlLHQsbil7dmFyIHIsbz17fSxpPW51bGwsbD1udWxsO24hPT12b2lkIDAmJihpPSIiK24pLHQua2V5IT09dm9pZCAwJiYoaT0iIit0LmtleSksdC5yZWYhPT12b2lkIDAmJihsPXQucmVmKTtmb3IociBpbiB0KVFrLmNhbGwodCxyKSYmIVprLmhhc093blByb3BlcnR5KHIpJiYob1tyXT10W3JdKTtpZihlJiZlLmRlZmF1bHRQcm9wcylmb3IociBpbiB0PWUuZGVmYXVsdFByb3BzLHQpb1tyXT09PXZvaWQgMCYmKG9bcl09dFtyXSk7cmV0dXJueyQkdHlwZW9mOllrLHR5cGU6ZSxrZXk6aSxyZWY6bCxwcm9wczpvLF9vd25lcjpKay5jdXJyZW50fX1uZC5GcmFnbWVudD1YaztuZC5qc3g9b187bmQuanN4cz1vXztyXy5leHBvcnRzPW5kO3ZhciB3PXJfLmV4cG9ydHM7ZnVuY3Rpb24gTmgoZSx0KXsodD09bnVsbHx8dD5lLmxlbmd0aCkmJih0PWUubGVuZ3RoKTtmb3IodmFyIG49MCxyPW5ldyBBcnJheSh0KTtuPHQ7bisrKXJbbl09ZVtuXTtyZXR1cm4gcn1mdW5jdGlvbiBFZyhlLHQpe2lmKGUpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gTmgoZSx0KTt2YXIgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuc2xpY2UoOCwtMSk7aWYobj09PSJPYmplY3QiJiZlLmNvbnN0cnVjdG9yJiYobj1lLmNvbnN0cnVjdG9yLm5hbWUpLG49PT0iTWFwInx8bj09PSJTZXQiKXJldHVybiBBcnJheS5mcm9tKGUpO2lmKG49PT0iQXJndW1lbnRzInx8L14oPzpVaXxJKW50KD86OHwxNnwzMikoPzpDbGFtcGVkKT9BcnJheSQvLnRlc3QobikpcmV0dXJuIE5oKGUsdCl9fWZ1bmN0aW9uIENnKGUsdCl7dmFyIG49dHlwZW9mIFN5bWJvbDwidSImJmVbU3ltYm9sLml0ZXJhdG9yXXx8ZVsiQEBpdGVyYXRvciJdO2lmKCFuKXtpZihBcnJheS5pc0FycmF5KGUpfHwobj1FZyhlKSl8fHQmJmUmJnR5cGVvZiBlLmxlbmd0aD09Im51bWJlciIpe24mJihlPW4pO3ZhciByPTAsbz1mdW5jdGlvbigpe307cmV0dXJue3M6byxuOmZ1bmN0aW9uKCl7cmV0dXJuIHI+PWUubGVuZ3RoP3tkb25lOiEwfTp7ZG9uZTohMSx2YWx1ZTplW3IrK119fSxlOmZ1bmN0aW9uKGEpe3Rocm93IGF9LGY6b319dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIGl0ZXJhdGUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9dmFyIGk9ITAsbD0hMSxzO3JldHVybntzOmZ1bmN0aW9uKCl7bj1uLmNhbGwoZSl9LG46ZnVuY3Rpb24oKXt2YXIgYT1uLm5leHQoKTtyZXR1cm4gaT1hLmRvbmUsYX0sZTpmdW5jdGlvbihhKXtsPSEwLHM9YX0sZjpmdW5jdGlvbigpe3RyeXshaSYmbi5yZXR1cm4hPW51bGwmJm4ucmV0dXJuKCl9ZmluYWxseXtpZihsKXRocm93IHN9fX19ZnVuY3Rpb24gaV8oZSl7cmV0dXJuIGUubGVuZ3RoPjB9dmFyIFBhPU9iamVjdC5mcmVlemUoe2tpbmQ6Im9rIix2YWx1ZTp2b2lkIDB9KTtmdW5jdGlvbiBPYShlKXtyZXR1cm4gZT09PXZvaWQgMD9QYTp7a2luZDoib2siLHZhbHVlOmV9fWZ1bmN0aW9uIF9pKGUpe3JldHVybntraW5kOiJlcnIiLGVycm9yOmV9fWZ1bmN0aW9uIE1sKGUpe3JldHVybiBlPT09UGF8fGUua2luZD09PSJvayJ9ZnVuY3Rpb24gJGcoZSl7cmV0dXJuIGUhPT1QYSYmZS5raW5kPT09ImVyciJ9ZnVuY3Rpb24gbF8oZSl7dmFyIHQ9W10sbj1bXSxyPUNnKGUpLG87dHJ5e2ZvcihyLnMoKTshKG89ci5uKCkpLmRvbmU7KXt2YXIgaT1vLnZhbHVlO01sKGkpP3QucHVzaChpLnZhbHVlKTpuLnB1c2goaS5lcnJvcil9fWNhdGNoKGwpe3IuZShsKX1maW5hbGx5e3IuZigpfXJldHVybiBpXyhuKT9faShuKTpPYSh0KX1mdW5jdGlvbiBxayhlKXtyZXR1cm4gbF8oZSl9ZnVuY3Rpb24gZVQoZSl7dmFyIHQ9W10sbj1DZyhlKSxyO3RyeXtmb3Iobi5zKCk7IShyPW4ubigpKS5kb25lOyl7dmFyIG89ci52YWx1ZTskZyhvKSYmdC5wdXNoKG8uZXJyb3IpfX1jYXRjaChpKXtuLmUoaSl9ZmluYWxseXtuLmYoKX1yZXR1cm4gaV8odCk/X2kodCk6UGF9ZnVuY3Rpb24gdFQoZSx0KXtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKHZhciByPU9hKHQpLG89MDtvPG4ubGVuZ3RoJiZNbChyKTsrK28pcj1lKHIudmFsdWUsbltvXSxvKTtyZXR1cm4gcn19ZnVuY3Rpb24gblQoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNbCh0KT9PYShlKHQudmFsdWUpKTp0fX1mdW5jdGlvbiByVChlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIE1sKHQpP2UodC52YWx1ZSk6dH19ZnVuY3Rpb24gb1QoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAkZyh0KT9faShlKHQuZXJyb3IpKTp0fX1mdW5jdGlvbiBpVChlLHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gZShuKT9PYShuKTpfaSh0KG4pKX19dmFyIGxUPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKHIpe3JldHVybiBNbChyKT90KHIudmFsdWUpP3I6X2kobihyLnZhbHVlKSk6cn19LFBzPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHZvaWRPazpQYSxvazpPYSxlcnI6X2ksaXNPazpNbCxpc0VycjokZyxhbGxUOmxfLGFsbDpxayxhbGxWOmVULGZsYXRNYXBSZWR1Y2U6dFQsbWFwOm5ULGZsYXRNYXA6clQsbWFwRXJyOm9ULGZyb21QcmVkaWNhdGU6aVQsZmlsdGVyT3JFbHNlOmxUfSk7ZnVuY3Rpb24gc1QoZSx0KXtpZih0eXBlb2YgZSE9Im9iamVjdCJ8fGU9PT1udWxsKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZihuIT09dm9pZCAwKXt2YXIgcj1uLmNhbGwoZSx0fHwiZGVmYXVsdCIpO2lmKHR5cGVvZiByIT0ib2JqZWN0IilyZXR1cm4gcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybih0PT09InN0cmluZyI/U3RyaW5nOk51bWJlcikoZSl9ZnVuY3Rpb24gc18oZSl7dmFyIHQ9c1QoZSwic3RyaW5nIik7cmV0dXJuIHR5cGVvZiB0PT0ic3ltYm9sIj90OlN0cmluZyh0KX1mdW5jdGlvbiB2dChlLHQsbil7cmV0dXJuIHQ9c18odCksdCBpbiBlP09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTplW3RdPW4sZX1mdW5jdGlvbiBYdihlLHQpe3ZhciBuPU9iamVjdC5rZXlzKGUpO2lmKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpe3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZSk7dCYmKHI9ci5maWx0ZXIoZnVuY3Rpb24obyl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSxvKS5lbnVtZXJhYmxlfSkpLG4ucHVzaC5hcHBseShuLHIpfXJldHVybiBufWZ1bmN0aW9uIFNsKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XSE9bnVsbD9hcmd1bWVudHNbdF06e307dCUyP1h2KE9iamVjdChuKSwhMCkuZm9yRWFjaChmdW5jdGlvbihyKXt2dChlLHIsbltyXSl9KTpPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycz9PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG4pKTpYdihPYmplY3QobikpLmZvckVhY2goZnVuY3Rpb24ocil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUscixPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4scikpfSl9cmV0dXJuIGV9ZnVuY3Rpb24gYVQoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gTmgoZSl9ZnVuY3Rpb24gdVQoZSl7aWYodHlwZW9mIFN5bWJvbDwidSImJmVbU3ltYm9sLml0ZXJhdG9yXSE9bnVsbHx8ZVsiQEBpdGVyYXRvciJdIT1udWxsKXJldHVybiBBcnJheS5mcm9tKGUpfWZ1bmN0aW9uIGNUKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBhdHRlbXB0IHRvIHNwcmVhZCBub24taXRlcmFibGUgaW5zdGFuY2UuCkluIG9yZGVyIHRvIGJlIGl0ZXJhYmxlLCBub24tYXJyYXkgb2JqZWN0cyBtdXN0IGhhdmUgYSBbU3ltYm9sLml0ZXJhdG9yXSgpIG1ldGhvZC5gKX1mdW5jdGlvbiBkVChlKXtyZXR1cm4gYVQoZSl8fHVUKGUpfHxFZyhlKXx8Y1QoKX1mdW5jdGlvbiBwZShlKXsiQGJhYmVsL2hlbHBlcnMgLSB0eXBlb2YiO3JldHVybiBwZT10eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiZ0eXBlb2YgU3ltYm9sLml0ZXJhdG9yPT0ic3ltYm9sIj9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0eXBlb2YgU3ltYm9sPT0iZnVuY3Rpb24iJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT8ic3ltYm9sIjp0eXBlb2YgdH0scGUoZSl9ZnVuY3Rpb24gZlQoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZX1mdW5jdGlvbiBoVChlLHQpe3ZhciBuPWU9PW51bGw/bnVsbDp0eXBlb2YgU3ltYm9sPCJ1IiYmZVtTeW1ib2wuaXRlcmF0b3JdfHxlWyJAQGl0ZXJhdG9yIl07aWYobiE9bnVsbCl7dmFyIHIsbyxpLGwscz1bXSxhPSEwLHU9ITE7dHJ5e2lmKGk9KG49bi5jYWxsKGUpKS5uZXh0LHQ9PT0wKXtpZihPYmplY3QobikhPT1uKXJldHVybjthPSExfWVsc2UgZm9yKDshKGE9KHI9aS5jYWxsKG4pKS5kb25lKSYmKHMucHVzaChyLnZhbHVlKSxzLmxlbmd0aCE9PXQpO2E9ITApO31jYXRjaChjKXt1PSEwLG89Y31maW5hbGx5e3RyeXtpZighYSYmbi5yZXR1cm4hPW51bGwmJihsPW4ucmV0dXJuKCksT2JqZWN0KGwpIT09bCkpcmV0dXJufWZpbmFsbHl7aWYodSl0aHJvdyBvfX1yZXR1cm4gc319ZnVuY3Rpb24gcFQoKXt0aHJvdyBuZXcgVHlwZUVycm9yKGBJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlLgpJbiBvcmRlciB0byBiZSBpdGVyYWJsZSwgbm9uLWFycmF5IG9iamVjdHMgbXVzdCBoYXZlIGEgW1N5bWJvbC5pdGVyYXRvcl0oKSBtZXRob2QuYCl9ZnVuY3Rpb24gcmkoZSx0KXtyZXR1cm4gZlQoZSl8fGhUKGUsdCl8fEVnKGUsdCl8fHBUKCl9ZnVuY3Rpb24gX3IoZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX1mdW5jdGlvbiBRdihlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcj10W25dO3IuZW51bWVyYWJsZT1yLmVudW1lcmFibGV8fCExLHIuY29uZmlndXJhYmxlPSEwLCJ2YWx1ZSJpbiByJiYoci53cml0YWJsZT0hMCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsc18oci5rZXkpLHIpfX1mdW5jdGlvbiB3cihlLHQsbil7cmV0dXJuIHQmJlF2KGUucHJvdG90eXBlLHQpLG4mJlF2KGUsbiksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZX1mdW5jdGlvbiBiaChlLHQpe3JldHVybiBiaD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihyLG8pe3JldHVybiByLl9fcHJvdG9fXz1vLHJ9LGJoKGUsdCl9ZnVuY3Rpb24gd2koZSx0KXtpZih0eXBlb2YgdCE9ImZ1bmN0aW9uIiYmdCE9PW51bGwpdGhyb3cgbmV3IFR5cGVFcnJvcigiU3VwZXIgZXhwcmVzc2lvbiBtdXN0IGVpdGhlciBiZSBudWxsIG9yIGEgZnVuY3Rpb24iKTtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQmJnQucHJvdG90eXBlLHtjb25zdHJ1Y3Rvcjp7dmFsdWU6ZSx3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksdCYmYmgoZSx0KX1mdW5jdGlvbiBmYyhlKXtyZXR1cm4gZmM9T2JqZWN0LnNldFByb3RvdHlwZU9mP09iamVjdC5nZXRQcm90b3R5cGVPZi5iaW5kKCk6ZnVuY3Rpb24obil7cmV0dXJuIG4uX19wcm90b19ffHxPYmplY3QuZ2V0UHJvdG90eXBlT2Yobil9LGZjKGUpfWZ1bmN0aW9uIGdUKCl7aWYodHlwZW9mIFJlZmxlY3Q+InUifHwhUmVmbGVjdC5jb25zdHJ1Y3R8fFJlZmxlY3QuY29uc3RydWN0LnNoYW0pcmV0dXJuITE7aWYodHlwZW9mIFByb3h5PT0iZnVuY3Rpb24iKXJldHVybiEwO3RyeXtyZXR1cm4gQm9vbGVhbi5wcm90b3R5cGUudmFsdWVPZi5jYWxsKFJlZmxlY3QuY29uc3RydWN0KEJvb2xlYW4sW10sZnVuY3Rpb24oKXt9KSksITB9Y2F0Y2h7cmV0dXJuITF9fWZ1bmN0aW9uIGFfKGUpe2lmKGU9PT12b2lkIDApdGhyb3cgbmV3IFJlZmVyZW5jZUVycm9yKCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBtVChlLHQpe2lmKHQmJih0eXBlb2YgdD09Im9iamVjdCJ8fHR5cGVvZiB0PT0iZnVuY3Rpb24iKSlyZXR1cm4gdDtpZih0IT09dm9pZCAwKXRocm93IG5ldyBUeXBlRXJyb3IoIkRlcml2ZWQgY29uc3RydWN0b3JzIG1heSBvbmx5IHJldHVybiBvYmplY3Qgb3IgdW5kZWZpbmVkIik7cmV0dXJuIGFfKGUpfWZ1bmN0aW9uIFNpKGUpe3ZhciB0PWdUKCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9ZmMoZSksbztpZih0KXt2YXIgaT1mYyh0aGlzKS5jb25zdHJ1Y3RvcjtvPVJlZmxlY3QuY29uc3RydWN0KHIsYXJndW1lbnRzLGkpfWVsc2Ugbz1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbVQodGhpcyxvKX19dmFyIEVpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe19yKHRoaXMsZSl9cmV0dXJuIHdyKGUsW3trZXk6ImFwcGVuZFZhbGlkYXRpb25FcnJvciIsdmFsdWU6ZnVuY3Rpb24obixyLG8saSl7cmV0dXJuIG4/KG5bcl0/bltyXS5wdXNoKHttZXNzYWdlOm8sdmFsdWU6aX0pOm5bcl09W3ttZXNzYWdlOm8sdmFsdWU6aX1dLG4pOnZ0KHt9LHIsW3ttZXNzYWdlOm8sdmFsdWU6aX1dKX19XSksZX0oKSxNdT1TeW1ib2woIkdldFNjaGVtYSIpLHF0PVN5bWJvbCgiUGF0aCIpLHl0PVN5bWJvbCgiR2V0U291cmNlIik7ZnVuY3Rpb24gdlQoZSl7cmV0dXJuIGVbTXVdfXZhciBrZz13cihmdW5jdGlvbiBlKHQpe19yKHRoaXMsZSksdGhpcy5zcGFuPXR9KSx5VD1mdW5jdGlvbihlKXt3aShuLGUpO3ZhciB0PVNpKG4pO2Z1bmN0aW9uIG4ocixvKXt2YXIgaTtyZXR1cm4gX3IodGhpcyxuKSxpPXQuY2FsbCh0aGlzLG8pLHZ0KGFfKGkpLCJ0eXBlIiwiU3ltIiksaS52YWx1ZT1yLGl9cmV0dXJuIHdyKG4sW3trZXk6InRyYW5zcGlsZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZX19XSksbn0oa2cpO25ldyB5VCgiKCkiKTt2YXIgS3Q9Il90eXBlIixobj0iX3JlZiIseFQ9ZnVuY3Rpb24oZSl7d2kobixlKTt2YXIgdD1TaShuKTtmdW5jdGlvbiBuKHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBfcih0aGlzLG4pLG89dC5jYWxsKHRoaXMpLG8ub3B0aW9ucz1yLG8ub3B0PWksb31yZXR1cm4gd3Iobixbe2tleToidmFsaWRhdGUiLHZhbHVlOmZ1bmN0aW9uKG8saSl7cmV0dXJuIHRoaXMub3B0JiZpPT1udWxsPyExOmk9PW51bGw/dnQoe30sbyxbe21lc3NhZ2U6Ik5vbi1vcHRpb25hbCBpbWFnZSB3YXMgbnVsbCBvciB1bmRlZmluZWQuIix2YWx1ZTppfV0pOnR5cGVvZiBpW2huXSE9InN0cmluZyI/dnQoe30sbyxbe21lc3NhZ2U6IkltYWdlIGRpZCBub3QgaGF2ZSBhIGZpbGUgcmVmZXJlbmNlIHN0cmluZy4gR290OiAiLmNvbmNhdChwZShpW2huXSkpLHZhbHVlOml9XSk6aVtLdF0hPT0iZmlsZSI/dnQoe30sbyxbe21lc3NhZ2U6IkltYWdlIGRpZCBub3QgaGF2ZSB0aGUgdmFsaWQgZmlsZSBleHRlbnNpb24gdHlwZS4gR290OiAiLmNvbmNhdChpW0t0XSksdmFsdWU6aX1dKTppLm1ldGFkYXRhP3Z0KHt9LG8sW3ttZXNzYWdlOiJGb3VuZCBtZXRhZGF0YSwgYnV0IGl0IGNvdWxkIG5vdCBiZSB2YWxpZGF0ZWQuIEltYWdlIG1ldGFkYXRhIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggdGhlIHJlcXVpcmVkIHByb3BzOiB3aWR0aCAocG9zaXRpdmUgbnVtYmVyKSwgaGVpZ2h0IChwb3NpdGl2ZSBudW1iZXIpIGFuZCBzaGEyNTYgKHN0cmluZyBvZiBsZW5ndGggNjQgb2YgdGhlIGJhc2UxNiBoYXNoKS4iLHZhbHVlOmksZml4ZXM6WyJpbWFnZTpyZXBsYWNlLW1ldGFkYXRhIl19XSk6dnQoe30sbyxbe21lc3NhZ2U6IkNvdWxkIG5vdCB2YWxpZGF0ZSBJbWFnZSBtZXRhZGF0YS4iLHZhbHVlOmksZml4ZXM6WyJpbWFnZTphZGQtbWV0YWRhdGEiXX1dKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7cmV0dXJuIHRoaXMub3B0JiZvPT1udWxsPyEwOihvPT1udWxsP3ZvaWQgMDpvW2huXSk9PT0iaW1hZ2UiJiYobz09bnVsbD92b2lkIDA6b1tLdF0pPT09ImZpbGUifX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMub3B0aW9ucywhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6ImltYWdlIixvcHRpb25zOnRoaXMub3B0aW9ucyxvcHQ6dGhpcy5vcHR9fX1dKSxufShFaSksdV89ZnVuY3Rpb24odCl7dmFyIG47aWYoIXRbaG5dLnN0YXJ0c1dpdGgoIi9wdWJsaWMiKSl7dmFyIHI7cmV0dXJue3VybDp0W2huXSsiP3NoYTI1Nj0iLmNvbmNhdCgocj10Lm1ldGFkYXRhKT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIuc2hhMjU2KSxtZXRhZGF0YTp0Lm1ldGFkYXRhfX1yZXR1cm57dXJsOnRbaG5dLnNsaWNlKDcpKyI/c2hhMjU2PSIuY29uY2F0KChuPXQubWV0YWRhdGEpPT09bnVsbHx8bj09PXZvaWQgMD92b2lkIDA6bi5zaGEyNTYpLG1ldGFkYXRhOnQubWV0YWRhdGF9fTtmdW5jdGlvbiBjXyhlKXtyZXR1cm4gcGUoZSk9PT0ib2JqZWN0IiYmZSE9PW51bGwmJmUhPT12b2lkIDAmJigidmFsImluIGV8fCJ2YWxQYXRoImluIGUpfWZ1bmN0aW9uIF9UKGUpe3JldHVybiBwZShlKT09PSJvYmplY3QiJiZlIT09bnVsbCYmZSE9PXZvaWQgMCYmcXQgaW4gZSYmInZhbCJpbiBlfWZ1bmN0aW9uIHdUKGUpe3JldHVybiBlW3F0XX1mdW5jdGlvbiBTVChlLHQpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KX1mdW5jdGlvbiBKdihlLHQsbil7cmV0dXJuIHQ/U3QoZShTdCh0LG4pKSk6U3QodCxuKX1mdW5jdGlvbiAkbyhlKXtyZXR1cm4gcGUoZSk9PT0ib2JqZWN0IiYmZSE9PW51bGwmJih5dCBpbiBlfHxxdCBpbiBlKX1mdW5jdGlvbiBTdChlLHQsbil7dmFyIHI7aWYocGUoZSk9PT0ib2JqZWN0Iil7aWYoJG8oZSkpcmV0dXJuIGU7aWYoY18oZSkpcmV0dXJuIFN0KGUudmFsLGUudmFsUGF0aCl9aWYoZSYmZVtobl0mJmVbS3RdPT09ImZpbGUiKXt2YXIgbz1lW2huXTtpZih0eXBlb2YgbyE9InN0cmluZyIpdGhyb3cgRXJyb3IoIkludmFsaWQgZmlsZSByZWY6ICIrbyk7cmV0dXJuIFN0KHVfKGUpLHQsbil9c3dpdGNoKHBlKGUpKXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6dGhyb3cgRXJyb3IoIkludmFsaWQgc2VsZWN0b3IgdHlwZTogIi5jb25jYXQocGUoZSksIjogIikuY29uY2F0KGUpKTtjYXNlIm9iamVjdCI6aWYoZSE9PW51bGwpcmV0dXJuIG5ldyBQcm94eShlLHtoYXM6ZnVuY3Rpb24obCxzKXtyZXR1cm4gcz09PXl0fHxzPT09cXR8fHM9PT0iYW5kVGhlbiJ8fHM9PT1NdT8hMDpzIGluIGx9LGdldDpmdW5jdGlvbihsLHMpe2lmKHM9PT15dClyZXR1cm4gZTtpZihzPT09cXQpcmV0dXJuIHQ7aWYocz09PU11KXJldHVybiBuO2lmKHM9PT0iYW5kVGhlbiIpcmV0dXJuIGZ1bmN0aW9uKHUpe3JldHVybiBKdih1LGUsdCl9O2lmKEFycmF5LmlzQXJyYXkobCkpe2lmKHM9PT0iZmlsdGVyIilyZXR1cm4gZnVuY3Rpb24odSl7dmFyIGM9bC5tYXAoZnVuY3Rpb24oZCxmKXtyZXR1cm4gU3QoZCxRbih0LGYpLG49PW51bGw/dm9pZCAwOm4uaXRlbSl9KS5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIHUmJnUgaW5zdGFuY2VvZiBFaT91LmFzc2VydChadihkKSk6WnYodShkKSl9KTtyZXR1cm4gU3QoYyx0LG4pfTtpZihzPT09Im1hcCIpcmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciBjPWwubWFwKGZ1bmN0aW9uKGQsZil7dmFyIGg9dShTdChkLFFuKHQsZiksbj09bnVsbD92b2lkIDA6bi5pdGVtKSxTdChmKSk7cmV0dXJuICRvKGgpP2g6U3QoaCl9KTtyZXR1cm4gU3QoYyx0LG4pfX1pZihBcnJheS5pc0FycmF5KGwpJiZzPT09Imxlbmd0aCIpcmV0dXJuIFN0KGwubGVuZ3RoKTt2YXIgYT1SZWZsZWN0LmdldChsLHMpO3JldHVybiBTVChlLHMpP051bWJlci5pc05hTihOdW1iZXIocykpP1N0KGEsUW4odCxzKSxuPT1udWxsP3ZvaWQgMDpuLml0ZW1zW3NdKTpTdChhLFFuKHQsTnVtYmVyKHMpKSxuPT1udWxsP3ZvaWQgMDpuLml0ZW0pOmF9fSk7ZGVmYXVsdDpyZXR1cm4gcj17ZXE6ZnVuY3Rpb24obCl7dmFyIHM9bDtpZigkbyhsKSYmKHM9bFt5dF0scyBpbnN0YW5jZW9mIGtnKSl0aHJvdyBFcnJvcigiVE9ETzogQ2Fubm90IGV2YWx1YXRlIGVxdWFsaXR5IHdpdGggYW4gRXhwciIpO3JldHVybiBTdChlPT09cyx2b2lkIDApfSxhbmRUaGVuOmZ1bmN0aW9uKGwpe3JldHVybiBKdihsLGU9PT12b2lkIDA/bnVsbDplLHQpfX0sdnQocix5dCxlPT09dm9pZCAwP251bGw6ZSksdnQocixxdCx0KSx2dChyLE11LG4pLHJ9fWZ1bmN0aW9uIFFuKGUsdCl7aWYocGUodCk9PT0ic3ltYm9sIil0aHJvdyBFcnJvcigiQ2Fubm90IGNyZWF0ZSB2YWwgcGF0aCBvZiBhcnJheSBpdGVtIHdpdGggc3ltYm9sIHByb3A6ICIuY29uY2F0KHQudG9TdHJpbmcoKSkpO3JldHVybiBlJiYiIi5jb25jYXQoZSwiLiIpLmNvbmNhdChKU09OLnN0cmluZ2lmeSh0KSl9ZnVuY3Rpb24gWnYoZSl7aWYocGUoZSk9PT0ib2JqZWN0IiYmKHl0IGluIGV8fHF0IGluIGUpKXt2YXIgdD1lW3l0XTtyZXR1cm4gdH1yZXR1cm4gZX12YXIgRVQ9ZnVuY3Rpb24oZSl7d2kobixlKTt2YXIgdD1TaShuKTtmdW5jdGlvbiBuKHIpe3ZhciBvLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZhcmd1bWVudHNbMV0hPT12b2lkIDA/YXJndW1lbnRzWzFdOiExO3JldHVybiBfcih0aGlzLG4pLG89dC5jYWxsKHRoaXMpLG8uaXRlbXM9cixvLm9wdD1pLG99cmV0dXJuIHdyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihvLGkpe3ZhciBsPXRoaXMscz0hMTtyZXR1cm4gdGhpcy5vcHQmJmk9PW51bGw/ITE6cGUoaSkhPT0ib2JqZWN0Ij92dCh7fSxvLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnIi5jb25jYXQocGUoaSksIiciKX1dKTpBcnJheS5pc0FycmF5KGkpP3Z0KHt9LG8sW3ttZXNzYWdlOiJFeHBlY3RlZCAnb2JqZWN0JywgZ290ICdhcnJheScifV0pOihPYmplY3QuZW50cmllcyh0aGlzLml0ZW1zKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciB1PXJpKGEsMiksYz11WzBdLGQ9dVsxXSxmPVFuKG8sYyk7aWYoIWYpcz1sLmFwcGVuZFZhbGlkYXRpb25FcnJvcihzLG8sIkludGVybmFsIGVycm9yOiBjb3VsZCBub3QgY3JlYXRlIHBhdGggYXQgIi5jb25jYXQoIW8mJnR5cGVvZiBvPT0ic3RyaW5nIj8iPGVtcHR5IHN0cmluZz4iOm8sIiBhdCBrZXkgIikuY29uY2F0KGMpLGkpO2Vsc2V7dmFyIGg9ZC52YWxpZGF0ZShmLGlbY10pO2gmJnM/cz1TbChTbCh7fSxoKSxzKTpoJiYocz1oKX19KSxzKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7aWYodGhpcy5vcHQmJm89PW51bGwpcmV0dXJuITA7aWYoIW8pcmV0dXJuITE7Zm9yKHZhciBpPTAsbD1PYmplY3QuZW50cmllcyh0aGlzLml0ZW1zKTtpPGwubGVuZ3RoO2krKyl7dmFyIHM9cmkobFtpXSwyKSxhPXNbMF0sdT1zWzFdO2lmKCF1LmFzc2VydChvW2FdKSlyZXR1cm4hMX1yZXR1cm4gcGUobyk9PT0ib2JqZWN0IiYmIUFycmF5LmlzQXJyYXkobyl9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5pdGVtcywhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6Im9iamVjdCIsaXRlbXM6T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHRoaXMuaXRlbXMpLm1hcChmdW5jdGlvbihvKXt2YXIgaT1yaShvLDIpLGw9aVswXSxzPWlbMV07cmV0dXJuW2wscy5zZXJpYWxpemUoKV19KSksb3B0OnRoaXMub3B0fX19XSksbn0oRWkpLENUPWZ1bmN0aW9uKGUpe3dpKG4sZSk7dmFyIHQ9U2kobik7ZnVuY3Rpb24gbihyKXt2YXIgbyxpPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTohMTtyZXR1cm4gX3IodGhpcyxuKSxvPXQuY2FsbCh0aGlzKSxvLml0ZW09cixvLm9wdD1pLG99cmV0dXJuIHdyKG4sW3trZXk6InZhbGlkYXRlIix2YWx1ZTpmdW5jdGlvbihvLGkpe3ZhciBsPXRoaXMscz0hMTtyZXR1cm4gdGhpcy5vcHQmJmk9PW51bGw/ITE6cGUoaSkhPT0ib2JqZWN0Inx8IUFycmF5LmlzQXJyYXkoaSk/dnQoe30sbyxbe21lc3NhZ2U6IkV4cGVjdGVkICdhcnJheScsIGdvdCAnIi5jb25jYXQocGUoaSksIiciKX1dKTooaS5mb3JFYWNoKGZ1bmN0aW9uKGEsdSl7dmFyIGM9UW4obyx1KTtpZighYylzPWwuYXBwZW5kVmFsaWRhdGlvbkVycm9yKHMsbywiSW50ZXJuYWwgZXJyb3I6IGNvdWxkIG5vdCBjcmVhdGUgcGF0aCBhdCAiLmNvbmNhdCghbyYmdHlwZW9mIG89PSJzdHJpbmciPyI8ZW1wdHkgc3RyaW5nPiI6bywiIGF0IGluZGV4ICIpLmNvbmNhdCh1KSxpKTtlbHNle3ZhciBkPWwuaXRlbS52YWxpZGF0ZShjLGEpO2QmJnM/cz1TbChTbCh7fSxkKSxzKTpkJiYocz1kKX19KSxzKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7aWYodGhpcy5vcHQmJm89PW51bGwpcmV0dXJuITA7aWYoIW8pcmV0dXJuITE7dmFyIGk9Q2cobyksbDt0cnl7Zm9yKGkucygpOyEobD1pLm4oKSkuZG9uZTspe3ZhciBzPWwudmFsdWU7aWYoIXRoaXMuaXRlbS5hc3NlcnQocykpcmV0dXJuITF9fWNhdGNoKGEpe2kuZShhKX1maW5hbGx5e2kuZigpfXJldHVybiBwZShvKT09PSJvYmplY3QiJiZBcnJheS5pc0FycmF5KG8pfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuaXRlbSwhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6ImFycmF5IixpdGVtOnRoaXMuaXRlbS5zZXJpYWxpemUoKSxvcHQ6dGhpcy5vcHR9fX1dKSxufShFaSksJFQ9ZnVuY3Rpb24oZSl7d2kobixlKTt2YXIgdD1TaShuKTtmdW5jdGlvbiBuKHIsbyl7dmFyIGksbD1hcmd1bWVudHMubGVuZ3RoPjImJmFyZ3VtZW50c1syXSE9PXZvaWQgMD9hcmd1bWVudHNbMl06ITE7cmV0dXJuIF9yKHRoaXMsbiksaT10LmNhbGwodGhpcyksaS5rZXk9cixpLml0ZW1zPW8saS5vcHQ9bCxpfXJldHVybiB3cihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24obyxpKXt0aHJvdyBuZXcgRXJyb3IoIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuIil9fSx7a2V5OiJhc3NlcnQiLHZhbHVlOmZ1bmN0aW9uKG8pe3Rocm93IG5ldyBFcnJvcigiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4iKX19LHtrZXk6Im9wdGlvbmFsIix2YWx1ZTpmdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4iKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToidW5pb24iLGtleTp0aGlzLmtleSxpdGVtczp0aGlzLml0ZW1zLm1hcChmdW5jdGlvbihvKXtyZXR1cm4gby5zZXJpYWxpemUoKX0pLG9wdDp0aGlzLm9wdH19fV0pLG59KEVpKSxrVD1mdW5jdGlvbihlKXt3aShuLGUpO3ZhciB0PVNpKG4pO2Z1bmN0aW9uIG4ocil7dmFyIG8saT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIF9yKHRoaXMsbiksbz10LmNhbGwodGhpcyksby5vcHRpb25zPXIsby5vcHQ9aSxvfXJldHVybiB3cihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24obyxpKXtyZXR1cm4hMX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7cmV0dXJuITB9fSx7a2V5OiJvcHRpb25hbCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4odGhpcy5vcHRpb25zLCEwKX19LHtrZXk6InNlcmlhbGl6ZSIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToicmljaHRleHQiLG9wdDp0aGlzLm9wdH19fV0pLG59KEVpKSxUVD1mdW5jdGlvbihlKXt3aShuLGUpO3ZhciB0PVNpKG4pO2Z1bmN0aW9uIG4ocil7dmFyIG8saT1hcmd1bWVudHMubGVuZ3RoPjEmJmFyZ3VtZW50c1sxXSE9PXZvaWQgMD9hcmd1bWVudHNbMV06ITE7cmV0dXJuIF9yKHRoaXMsbiksbz10LmNhbGwodGhpcyksby5pdGVtPXIsby5vcHQ9aSxvfXJldHVybiB3cihuLFt7a2V5OiJ2YWxpZGF0ZSIsdmFsdWU6ZnVuY3Rpb24obyxpKXt2YXIgbD10aGlzLHM9ITE7cmV0dXJuIHRoaXMub3B0JiZpPT1udWxsPyExOnBlKGkpIT09Im9iamVjdCI/dnQoe30sbyxbe21lc3NhZ2U6IkV4cGVjdGVkICdvYmplY3QnLCBnb3QgJyIuY29uY2F0KHBlKGkpLCInIil9XSk6QXJyYXkuaXNBcnJheShpKT92dCh7fSxvLFt7bWVzc2FnZToiRXhwZWN0ZWQgJ29iamVjdCcsIGdvdCAnYXJyYXknIn1dKTooT2JqZWN0LmVudHJpZXMoaSkuZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgdT1yaShhLDIpLGM9dVswXSxkPXVbMV0sZj1RbihvLGMpO2lmKCFmKXM9bC5hcHBlbmRWYWxpZGF0aW9uRXJyb3IocyxvLCJJbnRlcm5hbCBlcnJvcjogY291bGQgbm90IGNyZWF0ZSBwYXRoIGF0ICIuY29uY2F0KCFvJiZ0eXBlb2Ygbz09InN0cmluZyI/IjxlbXB0eSBzdHJpbmc+IjpvLCIgYXQga2V5ICIpLmNvbmNhdChkKSxpKTtlbHNle3ZhciBoPWwuaXRlbS52YWxpZGF0ZShmLGQpO2gmJnM/cz1TbChTbCh7fSxoKSxzKTpoJiYocz1oKX19KSxzKX19LHtrZXk6ImFzc2VydCIsdmFsdWU6ZnVuY3Rpb24obyl7aWYodGhpcy5vcHQmJm89PW51bGwpcmV0dXJuITA7aWYoIW8pcmV0dXJuITE7Zm9yKHZhciBpPTAsbD1PYmplY3QuZW50cmllcyhvKTtpPGwubGVuZ3RoO2krKyl7dmFyIHM9cmkobFtpXSwyKSxhPXNbMV07aWYoIXRoaXMuaXRlbS5hc3NlcnQoYSkpcmV0dXJuITF9cmV0dXJuIHBlKG8pPT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KG8pfX0se2tleToib3B0aW9uYWwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuKHRoaXMuaXRlbSwhMCl9fSx7a2V5OiJzZXJpYWxpemUiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6InJlY29yZCIsaXRlbTp0aGlzLml0ZW0uc2VyaWFsaXplKCksb3B0OnRoaXMub3B0fX19XSksbn0oRWkpO2Z1bmN0aW9uIE5UKGUpe3ZhciB0PWVbeXRdO2lmKHQgaW5zdGFuY2VvZiBrZyl0aHJvdyBFcnJvcigiQ2Fubm90IGdldCByYXcgc291cmNlIG9mIGFuIEV4cHIiKTt2YXIgbj10O3JldHVybiBufWZ1bmN0aW9uIGJUKGUpe3JldHVybiBlLmluZGV4T2YoIi4iKT09PS0xP1tlLCIiXTpbZS5zbGljZSgwLGUuaW5kZXhPZigiLiIpKSxlLnNsaWNlKGUuaW5kZXhPZigiLiIpKzEpXX1mdW5jdGlvbiBSVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEVUfHxwZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0ib2JqZWN0In1mdW5jdGlvbiBQVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFRUfHxwZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0icmVjb3JkIn1mdW5jdGlvbiBPVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIENUfHxwZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0iYXJyYXkifWZ1bmN0aW9uIEFUKGUpe3JldHVybiBlIGluc3RhbmNlb2YgJFR8fHBlKGUpPT09Im9iamVjdCImJiJ0eXBlImluIGUmJmUudHlwZT09PSJ1bmlvbiJ9ZnVuY3Rpb24gTVQoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBrVHx8cGUoZSk9PT0ib2JqZWN0IiYmInR5cGUiaW4gZSYmZS50eXBlPT09InJpY2h0ZXh0In1mdW5jdGlvbiBEVChlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHhUfHxwZShlKT09PSJvYmplY3QiJiYidHlwZSJpbiBlJiZlLnR5cGU9PT0iaW1hZ2UifWZ1bmN0aW9uIExUKGUsdCxuKXtmb3IodmFyIHI9SVQoZSksbz1kVChyKSxpPW4sbD10LHM9ZnVuY3Rpb24oKXt2YXIgYz1yLnNoaWZ0KCk7aWYoYz09PXZvaWQgMCl0aHJvdyBFcnJvcigiVW5leHBlY3RlZCB1bmRlZmluZWQgcGFydCIpO2lmKE9UKGkpKXtpZihOdW1iZXIuaXNOYU4oTnVtYmVyKGMpKSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiBhcnJheSBzY2hlbWEgIi5jb25jYXQoSlNPTi5zdHJpbmdpZnkoaSksIiBtdXN0IGhhdmUgYSBudW1iZXIgYXMgcGF0aCwgYnV0IGdvdCAiKS5jb25jYXQoYywiLiBQYXRoOiAiKS5jb25jYXQoZSkpO2lmKHBlKGwpIT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGwpKXRocm93IEVycm9yKCJTY2hlbWEgdHlwZSBlcnJvcjogZXhwZWN0ZWQgc291cmNlIHRvIGJlIHR5cGUgb2YgYXJyYXksIGJ1dCBnb3QgIi5jb25jYXQocGUobCkpKTtpZighbFtjXSl7dmFyIGQ7dGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogYXJyYXkgc291cmNlIChsZW5ndGg6ICIuY29uY2F0KChkPWwpPT09bnVsbHx8ZD09PXZvaWQgMD92b2lkIDA6ZC5sZW5ndGgsIikgZGlkIG5vdCBoYXZlIGluZGV4ICIpLmNvbmNhdChjLCIgZnJvbSBwYXRoOiAiKS5jb25jYXQoZSkpfWw9bFtjXSxpPWkuaXRlbX1lbHNlIGlmKFBUKGkpKXtpZih0eXBlb2YgYyE9InN0cmluZyIpdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogcmVjb3JkIHNjaGVtYSAiLmNvbmNhdChpLCIgbXVzdCBoYXZlIHBhdGg6ICIpLmNvbmNhdChjLCIgYXMgc3RyaW5nIikpO2lmKHBlKGwpIT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGwpKXRocm93IEVycm9yKCJTY2hlbWEgdHlwZSBlcnJvcjogZXhwZWN0ZWQgc291cmNlIHRvIGJlIHR5cGUgb2YgcmVjb3JkLCBidXQgZ290ICIuY29uY2F0KHBlKGwpKSk7aWYoIWxbY10pdGhyb3cgRXJyb3IoIkludmFsaWQgcGF0aDogcmVjb3JkIHNvdXJjZSBkaWQgbm90IGhhdmUga2V5ICIuY29uY2F0KGMsIiBmcm9tIHBhdGg6ICIpLmNvbmNhdChlKSk7bD1sW2NdLGk9aS5pdGVtfWVsc2UgaWYoUlQoaSkpe2lmKHBlKGwpIT09Im9iamVjdCIpdGhyb3cgRXJyb3IoIlNjaGVtYSB0eXBlIGVycm9yOiBleHBlY3RlZCBzb3VyY2UgdG8gYmUgdHlwZSBvZiBvYmplY3QsIGJ1dCBnb3QgIi5jb25jYXQocGUobCkpKTtpZighbFtjXSl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiBvYmplY3Qgc291cmNlIGRpZCBub3QgaGF2ZSBrZXkgIi5jb25jYXQoYywiIGZyb20gcGF0aDogIikuY29uY2F0KGUpKTtsPWxbY10saT1pLml0ZW1zW2NdfWVsc2V7aWYoRFQoaSkpcmV0dXJue3Y6e3BhdGg6by5zbGljZSgwLG8ubGVuZ3RoLXIubGVuZ3RoLTEpLm1hcChmdW5jdGlvbihtKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobSl9KS5qb2luKCIuIiksc2NoZW1hOmksc291cmNlOmx9fTtpZihBVChpKSl7dmFyIGY9aS5rZXksaD1sW2ZdO2lmKCFoKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6IHVuaW9uIHNvdXJjZSAiLmNvbmNhdChpLCIgZGlkIG5vdCBoYXZlIHJlcXVpcmVkIGtleSAiKS5jb25jYXQoZiwiIGluIHBhdGg6ICIpLmNvbmNhdChlKSk7dmFyIGc9aS5pdGVtcy5maW5kKGZ1bmN0aW9uKG0pe3ZhciBTLHY7cmV0dXJuKG09PW51bGx8fChTPW0uaXRlbXMpPT09bnVsbHx8Uz09PXZvaWQgMHx8KHY9U1tmXSk9PT1udWxsfHx2PT09dm9pZCAwP3ZvaWQgMDp2LnZhbHVlKT09PWh9KTtpZighZyl0aHJvdyBFcnJvcigiSW52YWxpZCBwYXRoOiB1bmlvbiBzY2hlbWEgIi5jb25jYXQoaSwiIGRpZCBub3QgaGF2ZSBhIGNoaWxkIG9iamVjdCB3aXRoICIpLmNvbmNhdChmLCIgb2YgdmFsdWUgIikuY29uY2F0KGgsIiBpbiBwYXRoOiAiKS5jb25jYXQoZSkpO2k9Zy5pdGVtc1tjXSxsPWxbY119ZWxzZXtpZihNVChpKSlyZXR1cm57djp7cGF0aDpvLnNsaWNlKDAsby5sZW5ndGgtci5sZW5ndGgtMSkubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBKU09OLnN0cmluZ2lmeShtKX0pLmpvaW4oIi4iKSxzY2hlbWE6aSxzb3VyY2U6bH19O3Rocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6ICIuY29uY2F0KGMsIiByZXNvbHZlZCB0byBhbiB1bmV4cGVjdGVkIHNjaGVtYSAiKS5jb25jYXQoSlNPTi5zdHJpbmdpZnkoaSkpKX19fTtyLmxlbmd0aD4wOyl7dmFyIGE9cygpO2lmKHBlKGEpPT09Im9iamVjdCIpcmV0dXJuIGEudn1pZihyLmxlbmd0aD4wKXRocm93IEVycm9yKCJJbnZhbGlkIHBhdGg6ICIuY29uY2F0KHIuam9pbigiLiIpLCIgaXMgbm90IGEgdmFsaWQgcGF0aCIpKTtyZXR1cm57cGF0aDpvLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gTnVtYmVyLmlzTmFOKE51bWJlcih1KSk/SlNPTi5zdHJpbmdpZnkodSk6dX0pLmpvaW4oIi4iKSxzY2hlbWE6aSxzb3VyY2U6bH19ZnVuY3Rpb24gSVQoZSl7Zm9yKHZhciB0PVtdLG49MDtuPGUubGVuZ3RoOyl7dmFyIHI9IiI7aWYoZVtuXT09PSciJyl7Zm9yKG4rKztuPGUubGVuZ3RoJiZlW25dIT09JyInOyllW25dPT09IlxcIiYmZVtuKzFdPT09JyInPyhyKz0nIicsbisrKTpyKz1lW25dLG4rKztpZihlW25dIT09JyInKXt2YXIgbzt0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaW5wdXQgKCIuY29uY2F0KEpTT04uc3RyaW5naWZ5KGUpLCIpOiBNaXNzaW5nIGNsb3NpbmcgZG91YmxlIHF1b3RlOiAiKS5jb25jYXQoKG89ZVtuXSkhPT1udWxsJiZvIT09dm9pZCAwP286ImF0IGVuZCBvZiBzdHJpbmciLCIgKGNoYXI6ICIpLmNvbmNhdChuLCI7IGxlbmd0aDogIikuY29uY2F0KGUubGVuZ3RoLCIpIikpfX1lbHNlIGZvcig7bjxlLmxlbmd0aCYmZVtuXSE9PSIuIjspcis9ZVtuXSxuKys7ciE9PSIiJiZ0LnB1c2gociksbisrfXJldHVybiB0fWZ1bmN0aW9uIGpUKGUpe3JldHVybiBkXyhCVChlKSl9ZnVuY3Rpb24gelQoZSl7cmV0dXJuICRvKGUpP3BlKGVbeXRdKT09PSJvYmplY3QiJiZwZShlW3l0XSkhPT1udWxsJiZBcnJheS5pc0FycmF5KGVbeXRdKTpBcnJheS5pc0FycmF5KGUpfWZ1bmN0aW9uIEZUKGUpe3JldHVybiAkbyhlKT9wZShlW3l0XSk9PT0ib2JqZWN0IiYmcGUoZVt5dF0pIT09bnVsbCYmIUFycmF5LmlzQXJyYXkoZVt5dF0pOnBlKGUpPT09Im9iamVjdCJ9ZnVuY3Rpb24gQlQoZSl7dmFyIHQ9U3QoZSk7ZnVuY3Rpb24gbihyKXt2YXIgbz16VChyKSxpPUZUKHIpO2lmKG8pe3ZhciBsPXl0IGluIHI/clt5dF06cixzPXF0IGluIHI/cltxdF06dm9pZCAwO3JldHVybnt2YWw6bC5tYXAoZnVuY3Rpb24oYyxkKXtyZXR1cm4gbigkbyhjKT9jOlN0KGMsUW4ocyxkKSkpfSksdmFsUGF0aDpzfX1lbHNlIGlmKGkpe3ZhciBhPXl0IGluIHI/clt5dF06cix1PXF0IGluIHI/cltxdF06dm9pZCAwO3JldHVybnt2YWw6YSE9PW51bGwmJk9iamVjdC5mcm9tRW50cmllcyhPYmplY3QuZW50cmllcyhhKS5tYXAoZnVuY3Rpb24oYyl7dmFyIGQ9cmkoYywyKSxmPWRbMF0saD1kWzFdO3JldHVybltmLG4oJG8oaCk/aDpTdChoLFFuKHUsZikpKV19KSksdmFsUGF0aDp1fX1lbHNlIHJldHVybiAkbyhyKT97dmFsOm4oclt5dF0pLHZhbFBhdGg6cltxdF19OnJ9cmV0dXJuIG4odCl9ZnVuY3Rpb24gUmgoZSl7dmFyIHQ9Y18oZSk/ZS52YWw6ZTtzd2l0Y2gocGUodCkpe2Nhc2UiZnVuY3Rpb24iOmNhc2Uic3ltYm9sIjp0aHJvdyBFcnJvcigiSW52YWxpZCB2YWwgdHlwZTogIi5jb25jYXQocGUodCkpKTtjYXNlIm9iamVjdCI6cmV0dXJuIHQ9PT1udWxsP251bGw6QXJyYXkuaXNBcnJheSh0KT90Lm1hcChSaCk6T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKHQpLm1hcChmdW5jdGlvbihuKXt2YXIgcj1yaShuLDIpLG89clswXSxpPXJbMV07cmV0dXJuW28saSYmUmgoaSldfSkpO2RlZmF1bHQ6cmV0dXJuIHR9fWZ1bmN0aW9uIGRfKGUpe3ZhciB0LG49ZS52YWw7c3dpdGNoKHBlKG4pKXtjYXNlImZ1bmN0aW9uIjpjYXNlInN5bWJvbCI6dGhyb3cgRXJyb3IoIkludmFsaWQgdmFsIHR5cGU6ICIuY29uY2F0KHBlKG4pKSk7Y2FzZSJvYmplY3QiOmlmKG4hPT1udWxsKXJldHVybiBuZXcgUHJveHkobix7aGFzOmZ1bmN0aW9uKG8saSl7cmV0dXJuIGk9PT0idmFsInx8aT09PXF0PyEwOnF2KG8saSl9LGdldDpmdW5jdGlvbihvLGkpe2lmKGk9PT1xdClyZXR1cm4gZS52YWxQYXRoO2lmKGk9PT0idmFsIilyZXR1cm4gUmgoZSk7aWYoQXJyYXkuaXNBcnJheShvKSYmaT09PSJsZW5ndGgiKXJldHVybiBvLmxlbmd0aDtpZihxdihuLGkpKXt2YXIgbCxzO3JldHVybiBkXyh7dmFsOlJlZmxlY3QuZ2V0KG8saSkudmFsLHZhbFBhdGg6KGw9KHM9UmVmbGVjdC5nZXQobyxpKSk9PT1udWxsfHxzPT09dm9pZCAwP3ZvaWQgMDpzLnZhbFBhdGgpIT09bnVsbCYmbCE9PXZvaWQgMD9sOlFuKGUudmFsUGF0aCxBcnJheS5pc0FycmF5KG8pP051bWJlcihpKTppKX0pfXJldHVybiBSZWZsZWN0LmdldChvLGkpfX0pO2RlZmF1bHQ6cmV0dXJuIHQ9e30sdnQodCxxdCxlLnZhbFBhdGgpLHZ0KHQsInZhbCIsZS52YWwpLHR9fWZ1bmN0aW9uIHF2KGUsdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpfWZ1bmN0aW9uIHVhKCl7dWE9ZnVuY3Rpb24oKXtyZXR1cm4gdH07dmFyIGUsdD17fSxuPU9iamVjdC5wcm90b3R5cGUscj1uLmhhc093blByb3BlcnR5LG89T2JqZWN0LmRlZmluZVByb3BlcnR5fHxmdW5jdGlvbihQLE8sayl7UFtPXT1rLnZhbHVlfSxpPXR5cGVvZiBTeW1ib2w9PSJmdW5jdGlvbiI/U3ltYm9sOnt9LGw9aS5pdGVyYXRvcnx8IkBAaXRlcmF0b3IiLHM9aS5hc3luY0l0ZXJhdG9yfHwiQEBhc3luY0l0ZXJhdG9yIixhPWkudG9TdHJpbmdUYWd8fCJAQHRvU3RyaW5nVGFnIjtmdW5jdGlvbiB1KFAsTyxrKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KFAsTyx7dmFsdWU6ayxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pLFBbT119dHJ5e3Uoe30sIiIpfWNhdGNoe3U9ZnVuY3Rpb24oTyxrLEkpe3JldHVybiBPW2tdPUl9fWZ1bmN0aW9uIGMoUCxPLGssSSl7dmFyIEw9TyYmTy5wcm90b3R5cGUgaW5zdGFuY2VvZiB2P086dixWPU9iamVjdC5jcmVhdGUoTC5wcm90b3R5cGUpLHRlPW5ldyBIKEl8fFtdKTtyZXR1cm4gbyhWLCJfaW52b2tlIix7dmFsdWU6UihQLGssdGUpfSksVn1mdW5jdGlvbiBkKFAsTyxrKXt0cnl7cmV0dXJue3R5cGU6Im5vcm1hbCIsYXJnOlAuY2FsbChPLGspfX1jYXRjaChJKXtyZXR1cm57dHlwZToidGhyb3ciLGFyZzpJfX19dC53cmFwPWM7dmFyIGY9InN1c3BlbmRlZFN0YXJ0IixoPSJzdXNwZW5kZWRZaWVsZCIsZz0iZXhlY3V0aW5nIixtPSJjb21wbGV0ZWQiLFM9e307ZnVuY3Rpb24gdigpe31mdW5jdGlvbiB5KCl7fWZ1bmN0aW9uIHgoKXt9dmFyIF89e307dShfLGwsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pO3ZhciBFPU9iamVjdC5nZXRQcm90b3R5cGVPZiwkPUUmJkUoRShYKFtdKSkpOyQmJiQhPT1uJiZyLmNhbGwoJCxsKSYmKF89JCk7dmFyIEM9eC5wcm90b3R5cGU9di5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShfKTtmdW5jdGlvbiBUKFApe1sibmV4dCIsInRocm93IiwicmV0dXJuIl0uZm9yRWFjaChmdW5jdGlvbihPKXt1KFAsTyxmdW5jdGlvbihrKXtyZXR1cm4gdGhpcy5faW52b2tlKE8sayl9KX0pfWZ1bmN0aW9uIE0oUCxPKXtmdW5jdGlvbiBrKEwsVix0ZSx5ZSl7dmFyIGZlPWQoUFtMXSxQLFYpO2lmKGZlLnR5cGUhPT0idGhyb3ciKXt2YXIgT2U9ZmUuYXJnLGJlPU9lLnZhbHVlO3JldHVybiBiZSYmdHlwZW9mIGJlPT0ib2JqZWN0IiYmci5jYWxsKGJlLCJfX2F3YWl0Iik/Ty5yZXNvbHZlKGJlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24oWil7aygibmV4dCIsWix0ZSx5ZSl9LGZ1bmN0aW9uKFope2soInRocm93IixaLHRlLHllKX0pOk8ucmVzb2x2ZShiZSkudGhlbihmdW5jdGlvbihaKXtPZS52YWx1ZT1aLHRlKE9lKX0sZnVuY3Rpb24oWil7cmV0dXJuIGsoInRocm93IixaLHRlLHllKX0pfXllKGZlLmFyZyl9dmFyIEk7byh0aGlzLCJfaW52b2tlIix7dmFsdWU6ZnVuY3Rpb24oTCxWKXtmdW5jdGlvbiB0ZSgpe3JldHVybiBuZXcgTyhmdW5jdGlvbih5ZSxmZSl7ayhMLFYseWUsZmUpfSl9cmV0dXJuIEk9ST9JLnRoZW4odGUsdGUpOnRlKCl9fSl9ZnVuY3Rpb24gUihQLE8sayl7dmFyIEk9ZjtyZXR1cm4gZnVuY3Rpb24oTCxWKXtpZihJPT09Zyl0aHJvdyBuZXcgRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5IHJ1bm5pbmciKTtpZihJPT09bSl7aWYoTD09PSJ0aHJvdyIpdGhyb3cgVjtyZXR1cm57dmFsdWU6ZSxkb25lOiEwfX1mb3Ioay5tZXRob2Q9TCxrLmFyZz1WOzspe3ZhciB0ZT1rLmRlbGVnYXRlO2lmKHRlKXt2YXIgeWU9aih0ZSxrKTtpZih5ZSl7aWYoeWU9PT1TKWNvbnRpbnVlO3JldHVybiB5ZX19aWYoay5tZXRob2Q9PT0ibmV4dCIpay5zZW50PWsuX3NlbnQ9ay5hcmc7ZWxzZSBpZihrLm1ldGhvZD09PSJ0aHJvdyIpe2lmKEk9PT1mKXRocm93IEk9bSxrLmFyZztrLmRpc3BhdGNoRXhjZXB0aW9uKGsuYXJnKX1lbHNlIGsubWV0aG9kPT09InJldHVybiImJmsuYWJydXB0KCJyZXR1cm4iLGsuYXJnKTtJPWc7dmFyIGZlPWQoUCxPLGspO2lmKGZlLnR5cGU9PT0ibm9ybWFsIil7aWYoST1rLmRvbmU/bTpoLGZlLmFyZz09PVMpY29udGludWU7cmV0dXJue3ZhbHVlOmZlLmFyZyxkb25lOmsuZG9uZX19ZmUudHlwZT09PSJ0aHJvdyImJihJPW0say5tZXRob2Q9InRocm93IixrLmFyZz1mZS5hcmcpfX19ZnVuY3Rpb24gaihQLE8pe3ZhciBrPU8ubWV0aG9kLEk9UC5pdGVyYXRvcltrXTtpZihJPT09ZSlyZXR1cm4gTy5kZWxlZ2F0ZT1udWxsLGs9PT0idGhyb3ciJiZQLml0ZXJhdG9yLnJldHVybiYmKE8ubWV0aG9kPSJyZXR1cm4iLE8uYXJnPWUsaihQLE8pLE8ubWV0aG9kPT09InRocm93Iil8fGshPT0icmV0dXJuIiYmKE8ubWV0aG9kPSJ0aHJvdyIsTy5hcmc9bmV3IFR5cGVFcnJvcigiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAnIitrKyInIG1ldGhvZCIpKSxTO3ZhciBMPWQoSSxQLml0ZXJhdG9yLE8uYXJnKTtpZihMLnR5cGU9PT0idGhyb3ciKXJldHVybiBPLm1ldGhvZD0idGhyb3ciLE8uYXJnPUwuYXJnLE8uZGVsZWdhdGU9bnVsbCxTO3ZhciBWPUwuYXJnO3JldHVybiBWP1YuZG9uZT8oT1tQLnJlc3VsdE5hbWVdPVYudmFsdWUsTy5uZXh0PVAubmV4dExvYyxPLm1ldGhvZCE9PSJyZXR1cm4iJiYoTy5tZXRob2Q9Im5leHQiLE8uYXJnPWUpLE8uZGVsZWdhdGU9bnVsbCxTKTpWOihPLm1ldGhvZD0idGhyb3ciLE8uYXJnPW5ldyBUeXBlRXJyb3IoIml0ZXJhdG9yIHJlc3VsdCBpcyBub3QgYW4gb2JqZWN0IiksTy5kZWxlZ2F0ZT1udWxsLFMpfWZ1bmN0aW9uIEYoUCl7dmFyIE89e3RyeUxvYzpQWzBdfTsxIGluIFAmJihPLmNhdGNoTG9jPVBbMV0pLDIgaW4gUCYmKE8uZmluYWxseUxvYz1QWzJdLE8uYWZ0ZXJMb2M9UFszXSksdGhpcy50cnlFbnRyaWVzLnB1c2goTyl9ZnVuY3Rpb24gYWUoUCl7dmFyIE89UC5jb21wbGV0aW9ufHx7fTtPLnR5cGU9Im5vcm1hbCIsZGVsZXRlIE8uYXJnLFAuY29tcGxldGlvbj1PfWZ1bmN0aW9uIEgoUCl7dGhpcy50cnlFbnRyaWVzPVt7dHJ5TG9jOiJyb290In1dLFAuZm9yRWFjaChGLHRoaXMpLHRoaXMucmVzZXQoITApfWZ1bmN0aW9uIFgoUCl7aWYoUHx8UD09PSIiKXt2YXIgTz1QW2xdO2lmKE8pcmV0dXJuIE8uY2FsbChQKTtpZih0eXBlb2YgUC5uZXh0PT0iZnVuY3Rpb24iKXJldHVybiBQO2lmKCFpc05hTihQLmxlbmd0aCkpe3ZhciBrPS0xLEk9ZnVuY3Rpb24gTCgpe2Zvcig7KytrPFAubGVuZ3RoOylpZihyLmNhbGwoUCxrKSlyZXR1cm4gTC52YWx1ZT1QW2tdLEwuZG9uZT0hMSxMO3JldHVybiBMLnZhbHVlPWUsTC5kb25lPSEwLEx9O3JldHVybiBJLm5leHQ9SX19dGhyb3cgbmV3IFR5cGVFcnJvcih0eXBlb2YgUCsiIGlzIG5vdCBpdGVyYWJsZSIpfXJldHVybiB5LnByb3RvdHlwZT14LG8oQywiY29uc3RydWN0b3IiLHt2YWx1ZTp4LGNvbmZpZ3VyYWJsZTohMH0pLG8oeCwiY29uc3RydWN0b3IiLHt2YWx1ZTp5LGNvbmZpZ3VyYWJsZTohMH0pLHkuZGlzcGxheU5hbWU9dSh4LGEsIkdlbmVyYXRvckZ1bmN0aW9uIiksdC5pc0dlbmVyYXRvckZ1bmN0aW9uPWZ1bmN0aW9uKFApe3ZhciBPPXR5cGVvZiBQPT0iZnVuY3Rpb24iJiZQLmNvbnN0cnVjdG9yO3JldHVybiEhTyYmKE89PT15fHwoTy5kaXNwbGF5TmFtZXx8Ty5uYW1lKT09PSJHZW5lcmF0b3JGdW5jdGlvbiIpfSx0Lm1hcms9ZnVuY3Rpb24oUCl7cmV0dXJuIE9iamVjdC5zZXRQcm90b3R5cGVPZj9PYmplY3Quc2V0UHJvdG90eXBlT2YoUCx4KTooUC5fX3Byb3RvX189eCx1KFAsYSwiR2VuZXJhdG9yRnVuY3Rpb24iKSksUC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShDKSxQfSx0LmF3cmFwPWZ1bmN0aW9uKFApe3JldHVybntfX2F3YWl0OlB9fSxUKE0ucHJvdG90eXBlKSx1KE0ucHJvdG90eXBlLHMsZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLHQuQXN5bmNJdGVyYXRvcj1NLHQuYXN5bmM9ZnVuY3Rpb24oUCxPLGssSSxMKXtMPT09dm9pZCAwJiYoTD1Qcm9taXNlKTt2YXIgVj1uZXcgTShjKFAsTyxrLEkpLEwpO3JldHVybiB0LmlzR2VuZXJhdG9yRnVuY3Rpb24oTyk/VjpWLm5leHQoKS50aGVuKGZ1bmN0aW9uKHRlKXtyZXR1cm4gdGUuZG9uZT90ZS52YWx1ZTpWLm5leHQoKX0pfSxUKEMpLHUoQyxhLCJHZW5lcmF0b3IiKSx1KEMsbCxmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdShDLCJ0b1N0cmluZyIsZnVuY3Rpb24oKXtyZXR1cm4iW29iamVjdCBHZW5lcmF0b3JdIn0pLHQua2V5cz1mdW5jdGlvbihQKXt2YXIgTz1PYmplY3QoUCksaz1bXTtmb3IodmFyIEkgaW4gTylrLnB1c2goSSk7cmV0dXJuIGsucmV2ZXJzZSgpLGZ1bmN0aW9uIEwoKXtmb3IoO2subGVuZ3RoOyl7dmFyIFY9ay5wb3AoKTtpZihWIGluIE8pcmV0dXJuIEwudmFsdWU9VixMLmRvbmU9ITEsTH1yZXR1cm4gTC5kb25lPSEwLEx9fSx0LnZhbHVlcz1YLEgucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILHJlc2V0OmZ1bmN0aW9uKFApe2lmKHRoaXMucHJldj0wLHRoaXMubmV4dD0wLHRoaXMuc2VudD10aGlzLl9zZW50PWUsdGhpcy5kb25lPSExLHRoaXMuZGVsZWdhdGU9bnVsbCx0aGlzLm1ldGhvZD0ibmV4dCIsdGhpcy5hcmc9ZSx0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChhZSksIVApZm9yKHZhciBPIGluIHRoaXMpTy5jaGFyQXQoMCk9PT0idCImJnIuY2FsbCh0aGlzLE8pJiYhaXNOYU4oK08uc2xpY2UoMSkpJiYodGhpc1tPXT1lKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZG9uZT0hMDt2YXIgUD10aGlzLnRyeUVudHJpZXNbMF0uY29tcGxldGlvbjtpZihQLnR5cGU9PT0idGhyb3ciKXRocm93IFAuYXJnO3JldHVybiB0aGlzLnJ2YWx9LGRpc3BhdGNoRXhjZXB0aW9uOmZ1bmN0aW9uKFApe2lmKHRoaXMuZG9uZSl0aHJvdyBQO3ZhciBPPXRoaXM7ZnVuY3Rpb24gayhmZSxPZSl7cmV0dXJuIFYudHlwZT0idGhyb3ciLFYuYXJnPVAsTy5uZXh0PWZlLE9lJiYoTy5tZXRob2Q9Im5leHQiLE8uYXJnPWUpLCEhT2V9Zm9yKHZhciBJPXRoaXMudHJ5RW50cmllcy5sZW5ndGgtMTtJPj0wOy0tSSl7dmFyIEw9dGhpcy50cnlFbnRyaWVzW0ldLFY9TC5jb21wbGV0aW9uO2lmKEwudHJ5TG9jPT09InJvb3QiKXJldHVybiBrKCJlbmQiKTtpZihMLnRyeUxvYzw9dGhpcy5wcmV2KXt2YXIgdGU9ci5jYWxsKEwsImNhdGNoTG9jIikseWU9ci5jYWxsKEwsImZpbmFsbHlMb2MiKTtpZih0ZSYmeWUpe2lmKHRoaXMucHJldjxMLmNhdGNoTG9jKXJldHVybiBrKEwuY2F0Y2hMb2MsITApO2lmKHRoaXMucHJldjxMLmZpbmFsbHlMb2MpcmV0dXJuIGsoTC5maW5hbGx5TG9jKX1lbHNlIGlmKHRlKXtpZih0aGlzLnByZXY8TC5jYXRjaExvYylyZXR1cm4gayhMLmNhdGNoTG9jLCEwKX1lbHNle2lmKCF5ZSl0aHJvdyBuZXcgRXJyb3IoInRyeSBzdGF0ZW1lbnQgd2l0aG91dCBjYXRjaCBvciBmaW5hbGx5Iik7aWYodGhpcy5wcmV2PEwuZmluYWxseUxvYylyZXR1cm4gayhMLmZpbmFsbHlMb2MpfX19fSxhYnJ1cHQ6ZnVuY3Rpb24oUCxPKXtmb3IodmFyIGs9dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO2s+PTA7LS1rKXt2YXIgST10aGlzLnRyeUVudHJpZXNba107aWYoSS50cnlMb2M8PXRoaXMucHJldiYmci5jYWxsKEksImZpbmFsbHlMb2MiKSYmdGhpcy5wcmV2PEkuZmluYWxseUxvYyl7dmFyIEw9STticmVha319TCYmKFA9PT0iYnJlYWsifHxQPT09ImNvbnRpbnVlIikmJkwudHJ5TG9jPD1PJiZPPD1MLmZpbmFsbHlMb2MmJihMPW51bGwpO3ZhciBWPUw/TC5jb21wbGV0aW9uOnt9O3JldHVybiBWLnR5cGU9UCxWLmFyZz1PLEw/KHRoaXMubWV0aG9kPSJuZXh0Iix0aGlzLm5leHQ9TC5maW5hbGx5TG9jLFMpOnRoaXMuY29tcGxldGUoVil9LGNvbXBsZXRlOmZ1bmN0aW9uKFAsTyl7aWYoUC50eXBlPT09InRocm93Iil0aHJvdyBQLmFyZztyZXR1cm4gUC50eXBlPT09ImJyZWFrInx8UC50eXBlPT09ImNvbnRpbnVlIj90aGlzLm5leHQ9UC5hcmc6UC50eXBlPT09InJldHVybiI/KHRoaXMucnZhbD10aGlzLmFyZz1QLmFyZyx0aGlzLm1ldGhvZD0icmV0dXJuIix0aGlzLm5leHQ9ImVuZCIpOlAudHlwZT09PSJub3JtYWwiJiZPJiYodGhpcy5uZXh0PU8pLFN9LGZpbmlzaDpmdW5jdGlvbihQKXtmb3IodmFyIE89dGhpcy50cnlFbnRyaWVzLmxlbmd0aC0xO08+PTA7LS1PKXt2YXIgaz10aGlzLnRyeUVudHJpZXNbT107aWYoay5maW5hbGx5TG9jPT09UClyZXR1cm4gdGhpcy5jb21wbGV0ZShrLmNvbXBsZXRpb24say5hZnRlckxvYyksYWUoayksU319LGNhdGNoOmZ1bmN0aW9uKFApe2Zvcih2YXIgTz10aGlzLnRyeUVudHJpZXMubGVuZ3RoLTE7Tz49MDstLU8pe3ZhciBrPXRoaXMudHJ5RW50cmllc1tPXTtpZihrLnRyeUxvYz09PVApe3ZhciBJPWsuY29tcGxldGlvbjtpZihJLnR5cGU9PT0idGhyb3ciKXt2YXIgTD1JLmFyZzthZShrKX1yZXR1cm4gTH19dGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIGNhdGNoIGF0dGVtcHQiKX0sZGVsZWdhdGVZaWVsZDpmdW5jdGlvbihQLE8sayl7cmV0dXJuIHRoaXMuZGVsZWdhdGU9e2l0ZXJhdG9yOlgoUCkscmVzdWx0TmFtZTpPLG5leHRMb2M6a30sdGhpcy5tZXRob2Q9PT0ibmV4dCImJih0aGlzLmFyZz1lKSxTfX0sdH1mdW5jdGlvbiBleShlLHQsbixyLG8saSxsKXt0cnl7dmFyIHM9ZVtpXShsKSxhPXMudmFsdWV9Y2F0Y2godSl7bih1KTtyZXR1cm59cy5kb25lP3QoYSk6UHJvbWlzZS5yZXNvbHZlKGEpLnRoZW4ocixvKX1mdW5jdGlvbiBmXyhlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49YXJndW1lbnRzO3JldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyLG8pe3ZhciBpPWUuYXBwbHkodCxuKTtmdW5jdGlvbiBsKGEpe2V5KGkscixvLGwscywibmV4dCIsYSl9ZnVuY3Rpb24gcyhhKXtleShpLHIsbyxsLHMsInRocm93IixhKX1sKHZvaWQgMCl9KX19dmFyIFdUPWZ1bmN0aW9uKCl7dmFyIGU9Zl8odWEoKS5tYXJrKGZ1bmN0aW9uIHQobil7dmFyIHIsbyxpO3JldHVybiB1YSgpLndyYXAoZnVuY3Rpb24ocyl7Zm9yKDs7KXN3aXRjaChzLnByZXY9cy5uZXh0KXtjYXNlIDA6cmV0dXJuIHMubmV4dD0yLGNyeXB0by5zdWJ0bGUuZGlnZXN0KCJTSEEtMjU2IixuKTtjYXNlIDI6cmV0dXJuIHI9cy5zZW50LG89QXJyYXkuZnJvbShuZXcgVWludDhBcnJheShyKSksaT1vLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYS50b1N0cmluZygxNikucGFkU3RhcnQoMiwiMCIpfSkuam9pbigiIikscy5hYnJ1cHQoInJldHVybiIsaSk7Y2FzZSA2OmNhc2UiZW5kIjpyZXR1cm4gcy5zdG9wKCl9fSx0KX0pKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0oKSxVVD1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7X3IodGhpcyxlKSx0aGlzLmhvc3Q9dH1yZXR1cm4gd3IoZSxbe2tleToiZ2V0RGlzYWJsZVVybCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvZGlzYWJsZSIpfX0se2tleToiZ2V0RWRpdFVybCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4iIi5jb25jYXQodGhpcy5ob3N0LCIvc3RhdGljL2VkaXQiKX19LHtrZXk6InBvc3RQYXRjaGVzIix2YWx1ZTpmdW5jdGlvbihuLHIsbyl7cmV0dXJuIGZldGNoKCIiLmNvbmNhdCh0aGlzLmhvc3QsIi9wYXRjaGVzL34iKSx7aGVhZGVyczpvfHx7IkNvbnRlbnQtVHlwZSI6ImFwcGxpY2F0aW9uL2pzb24ifSxtZXRob2Q6IlBPU1QiLGJvZHk6SlNPTi5zdHJpbmdpZnkodnQoe30sbixyKSl9KS50aGVuKGZ1bmN0aW9uKGkpe3JldHVybiBkZihpKX0pfX0se2tleToiZ2V0U2Vzc2lvbiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3Nlc3Npb24iKSkudGhlbihmdW5jdGlvbihuKXtyZXR1cm4gZGYobil9KX19LHtrZXk6ImdldE1vZHVsZXMiLHZhbHVlOmZ1bmN0aW9uKG4pe3ZhciByPW4ucGF0Y2gsbz1yPT09dm9pZCAwPyExOnIsaT1uLmluY2x1ZGVTY2hlbWEsbD1pPT09dm9pZCAwPyExOmkscz1uLmluY2x1ZGVTb3VyY2UsYT1zPT09dm9pZCAwPyExOnMsdT1uLnRyZWVQYXRoLGM9dT09PXZvaWQgMD8iLyI6dSxkPW4uaGVhZGVycyxmPW5ldyBVUkxTZWFyY2hQYXJhbXM7cmV0dXJuIGYuc2V0KCJwYXRjaCIsby50b1N0cmluZygpKSxmLnNldCgic2NoZW1hIixsLnRvU3RyaW5nKCkpLGYuc2V0KCJzb3VyY2UiLGEudG9TdHJpbmcoKSksZmV0Y2goIiIuY29uY2F0KHRoaXMuaG9zdCwiL3RyZWUvfiIpLmNvbmNhdChjLCI/IikuY29uY2F0KGYudG9TdHJpbmcoKSkse2hlYWRlcnM6ZH0pLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIGRmKGgpfSl9fV0pLGV9KCk7ZnVuY3Rpb24gZGYoZSl7cmV0dXJuIFBoLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBQaCgpe3JldHVybiBQaD1mXyh1YSgpLm1hcmsoZnVuY3Rpb24gZSh0KXtyZXR1cm4gdWEoKS53cmFwKGZ1bmN0aW9uKHIpe2Zvcig7Oylzd2l0Y2goci5wcmV2PXIubmV4dCl7Y2FzZSAwOmlmKHIucHJldj0wLCF0Lm9rKXtyLm5leHQ9OTticmVha31yZXR1cm4gci50MD1QcyxyLm5leHQ9NSx0Lmpzb24oKTtjYXNlIDU6cmV0dXJuIHIudDE9ci5zZW50LHIuYWJydXB0KCJyZXR1cm4iLHIudDAub2suY2FsbChyLnQwLHIudDEpKTtjYXNlIDk6cmV0dXJuIHIudDI9UHMsci50Mz10LnN0YXR1cyxyLm5leHQ9MTMsdC50ZXh0KCk7Y2FzZSAxMzpyZXR1cm4gci50ND1yLnNlbnQsci50NT17c3RhdHVzQ29kZTpyLnQzLG1lc3NhZ2U6ci50NH0sci5hYnJ1cHQoInJldHVybiIsci50Mi5lcnIuY2FsbChyLnQyLHIudDUpKTtjYXNlIDE2OnIubmV4dD0yMTticmVhaztjYXNlIDE4OnJldHVybiByLnByZXY9MTgsci50Nj1yLmNhdGNoKDApLHIuYWJydXB0KCJyZXR1cm4iLF9pKHttZXNzYWdlOnIudDYgaW5zdGFuY2VvZiBFcnJvcj9yLnQ2Lm1lc3NhZ2U6IlVua25vd24gZXJyb3IifSkpO2Nhc2UgMjE6Y2FzZSJlbmQiOnJldHVybiByLnN0b3AoKX19LGUsbnVsbCxbWzAsMThdXSl9KSksUGguYXBwbHkodGhpcyxhcmd1bWVudHMpfXZhciB3bj17Y29udmVydEZpbGVTb3VyY2U6dV8sZ2V0U2NoZW1hOnZULGdldFZhbFBhdGg6d1QsZ2V0VmFsOmpULGdldFNvdXJjZTpOVCxyZXNvbHZlUGF0aDpMVCxzcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aDpiVCxpc1ZhbDpfVCxjcmVhdGVWYWxQYXRoT2ZJdGVtOlFuLGdldFNIQTI1Nkhhc2g6V1QsY3JlYXRlUGF0Y2hKU09OUGF0aDpmdW5jdGlvbih0KXtyZXR1cm4iLyIuY29uY2F0KHQuc3BsaXQoIi4iKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIEpTT04ucGFyc2Uobil9KS5qb2luKCIvIikpfSxWQUxfRFJBRlRfTU9ERV9DT09LSUU6InZhbF9kcmFmdF9tb2RlIixWQUxfRU5BQkxFX0NPT0tJRV9OQU1FOiJ2YWxfZW5hYmxlIixWQUxfU1RBVEVfQ09PS0lFOiJ2YWxfc3RhdGUiLFZBTF9TRVNTSU9OX0NPT0tJRToidmFsX3Nlc3Npb24ifSxoXz17ZXhwb3J0czp7fX07LyohCglDb3B5cmlnaHQgKGMpIDIwMTggSmVkIFdhdHNvbi4KCUxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAoTUlUKSwgc2VlCglodHRwOi8vamVkd2F0c29uLmdpdGh1Yi5pby9jbGFzc25hbWVzCiovKGZ1bmN0aW9uKGUpeyhmdW5jdGlvbigpe3ZhciB0PXt9Lmhhc093blByb3BlcnR5O2Z1bmN0aW9uIG4oKXtmb3IodmFyIHI9W10sbz0wO288YXJndW1lbnRzLmxlbmd0aDtvKyspe3ZhciBpPWFyZ3VtZW50c1tvXTtpZihpKXt2YXIgbD10eXBlb2YgaTtpZihsPT09InN0cmluZyJ8fGw9PT0ibnVtYmVyIilyLnB1c2goaSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGkpKXtpZihpLmxlbmd0aCl7dmFyIHM9bi5hcHBseShudWxsLGkpO3MmJnIucHVzaChzKX19ZWxzZSBpZihsPT09Im9iamVjdCIpe2lmKGkudG9TdHJpbmchPT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nJiYhaS50b1N0cmluZy50b1N0cmluZygpLmluY2x1ZGVzKCJbbmF0aXZlIGNvZGVdIikpe3IucHVzaChpLnRvU3RyaW5nKCkpO2NvbnRpbnVlfWZvcih2YXIgYSBpbiBpKXQuY2FsbChpLGEpJiZpW2FdJiZyLnB1c2goYSl9fX1yZXR1cm4gci5qb2luKCIgIil9ZS5leHBvcnRzPyhuLmRlZmF1bHQ9bixlLmV4cG9ydHM9bik6d2luZG93LmNsYXNzTmFtZXM9bn0pKCl9KShoXyk7dmFyIFZUPWhfLmV4cG9ydHM7Y29uc3QgcmQ9JGEoVlQpO2Z1bmN0aW9uIGVlKCl7cmV0dXJuIGVlPU9iamVjdC5hc3NpZ24/T2JqZWN0LmFzc2lnbi5iaW5kKCk6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sZWUuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEhUKGUsdCl7dHlwZW9mIGU9PSJmdW5jdGlvbiI/ZSh0KTplIT1udWxsJiYoZS5jdXJyZW50PXQpfWZ1bmN0aW9uIHBfKC4uLmUpe3JldHVybiB0PT5lLmZvckVhY2gobj0+SFQobix0KSl9ZnVuY3Rpb24gWGUoLi4uZSl7cmV0dXJuIHAudXNlQ2FsbGJhY2socF8oLi4uZSksZSl9Y29uc3QgRWw9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Y2hpbGRyZW46biwuLi5yfT1lLG89cC5DaGlsZHJlbi50b0FycmF5KG4pLGk9by5maW5kKEdUKTtpZihpKXtjb25zdCBsPWkucHJvcHMuY2hpbGRyZW4scz1vLm1hcChhPT5hPT09aT9wLkNoaWxkcmVuLmNvdW50KGwpPjE/cC5DaGlsZHJlbi5vbmx5KG51bGwpOnAuaXNWYWxpZEVsZW1lbnQobCk/bC5wcm9wcy5jaGlsZHJlbjpudWxsOmEpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoT2gsZWUoe30scix7cmVmOnR9KSxwLmlzVmFsaWRFbGVtZW50KGwpP3AuY2xvbmVFbGVtZW50KGwsdm9pZCAwLHMpOm51bGwpfXJldHVybiBwLmNyZWF0ZUVsZW1lbnQoT2gsZWUoe30scix7cmVmOnR9KSxuKX0pO0VsLmRpc3BsYXlOYW1lPSJTbG90Ijtjb25zdCBPaD1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtjaGlsZHJlbjpuLC4uLnJ9PWU7cmV0dXJuIHAuaXNWYWxpZEVsZW1lbnQobik/cC5jbG9uZUVsZW1lbnQobix7Li4uWVQocixuLnByb3BzKSxyZWY6dD9wXyh0LG4ucmVmKTpuLnJlZn0pOnAuQ2hpbGRyZW4uY291bnQobik+MT9wLkNoaWxkcmVuLm9ubHkobnVsbCk6bnVsbH0pO09oLmRpc3BsYXlOYW1lPSJTbG90Q2xvbmUiO2NvbnN0IEtUPSh7Y2hpbGRyZW46ZX0pPT5wLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLGUpO2Z1bmN0aW9uIEdUKGUpe3JldHVybiBwLmlzVmFsaWRFbGVtZW50KGUpJiZlLnR5cGU9PT1LVH1mdW5jdGlvbiBZVChlLHQpe2NvbnN0IG49ey4uLnR9O2Zvcihjb25zdCByIGluIHQpe2NvbnN0IG89ZVtyXSxpPXRbcl07L15vbltBLVpdLy50ZXN0KHIpP28mJmk/bltyXT0oLi4ucyk9PntpKC4uLnMpLG8oLi4ucyl9Om8mJihuW3JdPW8pOnI9PT0ic3R5bGUiP25bcl09ey4uLm8sLi4uaX06cj09PSJjbGFzc05hbWUiJiYobltyXT1bbyxpXS5maWx0ZXIoQm9vbGVhbikuam9pbigiICIpKX1yZXR1cm57Li4uZSwuLi5ufX1jb25zdCBYVD1bImEiLCJidXR0b24iLCJkaXYiLCJmb3JtIiwiaDIiLCJoMyIsImltZyIsImlucHV0IiwibGFiZWwiLCJsaSIsIm5hdiIsIm9sIiwicCIsInNwYW4iLCJzdmciLCJ1bCJdLERlPVhULnJlZHVjZSgoZSx0KT0+e2NvbnN0IG49cC5mb3J3YXJkUmVmKChyLG8pPT57Y29uc3R7YXNDaGlsZDppLC4uLmx9PXIscz1pP0VsOnQ7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57d2luZG93W1N5bWJvbC5mb3IoInJhZGl4LXVpIildPSEwfSxbXSkscC5jcmVhdGVFbGVtZW50KHMsZWUoe30sbCx7cmVmOm99KSl9KTtyZXR1cm4gbi5kaXNwbGF5TmFtZT1gUHJpbWl0aXZlLiR7dH1gLHsuLi5lLFt0XTpufX0se30pO2Z1bmN0aW9uIFFUKGUsdCl7ZSYmSHIuZmx1c2hTeW5jKCgpPT5lLmRpc3BhdGNoRXZlbnQodCkpfWNvbnN0ICRuPWdsb2JhbFRoaXMhPW51bGwmJmdsb2JhbFRoaXMuZG9jdW1lbnQ/cC51c2VMYXlvdXRFZmZlY3Q6KCk9Pnt9O2Z1bmN0aW9uIEpUKGUsdCl7cmV0dXJuIHAudXNlUmVkdWNlcigobixyKT0+e2NvbnN0IG89dFtuXVtyXTtyZXR1cm4gbz8/bn0sZSl9Y29uc3QgRGw9ZT0+e2NvbnN0e3ByZXNlbnQ6dCxjaGlsZHJlbjpufT1lLHI9WlQodCksbz10eXBlb2Ygbj09ImZ1bmN0aW9uIj9uKHtwcmVzZW50OnIuaXNQcmVzZW50fSk6cC5DaGlsZHJlbi5vbmx5KG4pLGk9WGUoci5yZWYsby5yZWYpO3JldHVybiB0eXBlb2Ygbj09ImZ1bmN0aW9uInx8ci5pc1ByZXNlbnQ/cC5jbG9uZUVsZW1lbnQobyx7cmVmOml9KTpudWxsfTtEbC5kaXNwbGF5TmFtZT0iUHJlc2VuY2UiO2Z1bmN0aW9uIFpUKGUpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZSgpLHI9cC51c2VSZWYoe30pLG89cC51c2VSZWYoZSksaT1wLnVzZVJlZigibm9uZSIpLGw9ZT8ibW91bnRlZCI6InVubW91bnRlZCIsW3MsYV09SlQobCx7bW91bnRlZDp7VU5NT1VOVDoidW5tb3VudGVkIixBTklNQVRJT05fT1VUOiJ1bm1vdW50U3VzcGVuZGVkIn0sdW5tb3VudFN1c3BlbmRlZDp7TU9VTlQ6Im1vdW50ZWQiLEFOSU1BVElPTl9FTkQ6InVubW91bnRlZCJ9LHVubW91bnRlZDp7TU9VTlQ6Im1vdW50ZWQifX0pO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHU9dXUoci5jdXJyZW50KTtpLmN1cnJlbnQ9cz09PSJtb3VudGVkIj91OiJub25lIn0sW3NdKSwkbigoKT0+e2NvbnN0IHU9ci5jdXJyZW50LGM9by5jdXJyZW50O2lmKGMhPT1lKXtjb25zdCBmPWkuY3VycmVudCxoPXV1KHUpO2U/YSgiTU9VTlQiKTpoPT09Im5vbmUifHwodT09bnVsbD92b2lkIDA6dS5kaXNwbGF5KT09PSJub25lIj9hKCJVTk1PVU5UIik6YShjJiZmIT09aD8iQU5JTUFUSU9OX09VVCI6IlVOTU9VTlQiKSxvLmN1cnJlbnQ9ZX19LFtlLGFdKSwkbigoKT0+e2lmKHQpe2NvbnN0IHU9ZD0+e2NvbnN0IGg9dXUoci5jdXJyZW50KS5pbmNsdWRlcyhkLmFuaW1hdGlvbk5hbWUpO2QudGFyZ2V0PT09dCYmaCYmSHIuZmx1c2hTeW5jKCgpPT5hKCJBTklNQVRJT05fRU5EIikpfSxjPWQ9PntkLnRhcmdldD09PXQmJihpLmN1cnJlbnQ9dXUoci5jdXJyZW50KSl9O3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbnN0YXJ0IixjKSx0LmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmNhbmNlbCIsdSksdC5hZGRFdmVudExpc3RlbmVyKCJhbmltYXRpb25lbmQiLHUpLCgpPT57dC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25zdGFydCIsYyksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJhbmltYXRpb25jYW5jZWwiLHUpLHQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYW5pbWF0aW9uZW5kIix1KX19ZWxzZSBhKCJBTklNQVRJT05fRU5EIil9LFt0LGFdKSx7aXNQcmVzZW50OlsibW91bnRlZCIsInVubW91bnRTdXNwZW5kZWQiXS5pbmNsdWRlcyhzKSxyZWY6cC51c2VDYWxsYmFjayh1PT57dSYmKHIuY3VycmVudD1nZXRDb21wdXRlZFN0eWxlKHUpKSxuKHUpfSxbXSl9fWZ1bmN0aW9uIHV1KGUpe3JldHVybihlPT1udWxsP3ZvaWQgMDplLmFuaW1hdGlvbk5hbWUpfHwibm9uZSJ9ZnVuY3Rpb24gQ2koZSx0PVtdKXtsZXQgbj1bXTtmdW5jdGlvbiByKGksbCl7Y29uc3Qgcz1wLmNyZWF0ZUNvbnRleHQobCksYT1uLmxlbmd0aDtuPVsuLi5uLGxdO2Z1bmN0aW9uIHUoZCl7Y29uc3R7c2NvcGU6ZixjaGlsZHJlbjpoLC4uLmd9PWQsbT0oZj09bnVsbD92b2lkIDA6ZltlXVthXSl8fHMsUz1wLnVzZU1lbW8oKCk9PmcsT2JqZWN0LnZhbHVlcyhnKSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChtLlByb3ZpZGVyLHt2YWx1ZTpTfSxoKX1mdW5jdGlvbiBjKGQsZil7Y29uc3QgaD0oZj09bnVsbD92b2lkIDA6ZltlXVthXSl8fHMsZz1wLnVzZUNvbnRleHQoaCk7aWYoZylyZXR1cm4gZztpZihsIT09dm9pZCAwKXJldHVybiBsO3Rocm93IG5ldyBFcnJvcihgXGAke2R9XGAgbXVzdCBiZSB1c2VkIHdpdGhpbiBcYCR7aX1cYGApfXJldHVybiB1LmRpc3BsYXlOYW1lPWkrIlByb3ZpZGVyIixbdSxjXX1jb25zdCBvPSgpPT57Y29uc3QgaT1uLm1hcChsPT5wLmNyZWF0ZUNvbnRleHQobCkpO3JldHVybiBmdW5jdGlvbihzKXtjb25zdCBhPShzPT1udWxsP3ZvaWQgMDpzW2VdKXx8aTtyZXR1cm4gcC51c2VNZW1vKCgpPT4oe1tgX19zY29wZSR7ZX1gXTp7Li4ucyxbZV06YX19KSxbcyxhXSl9fTtyZXR1cm4gby5zY29wZU5hbWU9ZSxbcixxVChvLC4uLnQpXX1mdW5jdGlvbiBxVCguLi5lKXtjb25zdCB0PWVbMF07aWYoZS5sZW5ndGg9PT0xKXJldHVybiB0O2NvbnN0IG49KCk9Pntjb25zdCByPWUubWFwKG89Pih7dXNlU2NvcGU6bygpLHNjb3BlTmFtZTpvLnNjb3BlTmFtZX0pKTtyZXR1cm4gZnVuY3Rpb24oaSl7Y29uc3QgbD1yLnJlZHVjZSgocyx7dXNlU2NvcGU6YSxzY29wZU5hbWU6dX0pPT57Y29uc3QgZD1hKGkpW2BfX3Njb3BlJHt1fWBdO3JldHVybnsuLi5zLC4uLmR9fSx7fSk7cmV0dXJuIHAudXNlTWVtbygoKT0+KHtbYF9fc2NvcGUke3Quc2NvcGVOYW1lfWBdOmx9KSxbbF0pfX07cmV0dXJuIG4uc2NvcGVOYW1lPXQuc2NvcGVOYW1lLG59ZnVuY3Rpb24gVnQoZSl7Y29uc3QgdD1wLnVzZVJlZihlKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pnt0LmN1cnJlbnQ9ZX0pLHAudXNlTWVtbygoKT0+KC4uLm4pPT57dmFyIHI7cmV0dXJuKHI9dC5jdXJyZW50KT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIuY2FsbCh0LC4uLm4pfSxbXSl9Y29uc3QgZU49cC5jcmVhdGVDb250ZXh0KHZvaWQgMCk7ZnVuY3Rpb24gVGcoZSl7Y29uc3QgdD1wLnVzZUNvbnRleHQoZU4pO3JldHVybiBlfHx0fHwibHRyIn1mdW5jdGlvbiBBaChlLFt0LG5dKXtyZXR1cm4gTWF0aC5taW4obixNYXRoLm1heCh0LGUpKX1mdW5jdGlvbiBIZShlLHQse2NoZWNrRm9yRGVmYXVsdFByZXZlbnRlZDpuPSEwfT17fSl7cmV0dXJuIGZ1bmN0aW9uKG8pe2lmKGU9PW51bGx8fGUobyksbj09PSExfHwhby5kZWZhdWx0UHJldmVudGVkKXJldHVybiB0PT1udWxsP3ZvaWQgMDp0KG8pfX1mdW5jdGlvbiB0TihlLHQpe3JldHVybiBwLnVzZVJlZHVjZXIoKG4scik9Pntjb25zdCBvPXRbbl1bcl07cmV0dXJuIG8/P259LGUpfWNvbnN0IGdfPSJTY3JvbGxBcmVhIixbbV8scDRdPUNpKGdfKSxbbk4sQm5dPW1fKGdfKSxyTj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU2Nyb2xsQXJlYTpuLHR5cGU6cj0iaG92ZXIiLGRpcjpvLHNjcm9sbEhpZGVEZWxheTppPTYwMCwuLi5sfT1lLFtzLGFdPXAudXNlU3RhdGUobnVsbCksW3UsY109cC51c2VTdGF0ZShudWxsKSxbZCxmXT1wLnVzZVN0YXRlKG51bGwpLFtoLGddPXAudXNlU3RhdGUobnVsbCksW20sU109cC51c2VTdGF0ZShudWxsKSxbdix5XT1wLnVzZVN0YXRlKDApLFt4LF9dPXAudXNlU3RhdGUoMCksW0UsJF09cC51c2VTdGF0ZSghMSksW0MsVF09cC51c2VTdGF0ZSghMSksTT1YZSh0LGo9PmEoaikpLFI9VGcobyk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChuTix7c2NvcGU6bix0eXBlOnIsZGlyOlIsc2Nyb2xsSGlkZURlbGF5Omksc2Nyb2xsQXJlYTpzLHZpZXdwb3J0OnUsb25WaWV3cG9ydENoYW5nZTpjLGNvbnRlbnQ6ZCxvbkNvbnRlbnRDaGFuZ2U6ZixzY3JvbGxiYXJYOmgsb25TY3JvbGxiYXJYQ2hhbmdlOmcsc2Nyb2xsYmFyWEVuYWJsZWQ6RSxvblNjcm9sbGJhclhFbmFibGVkQ2hhbmdlOiQsc2Nyb2xsYmFyWTptLG9uU2Nyb2xsYmFyWUNoYW5nZTpTLHNjcm9sbGJhcllFbmFibGVkOkMsb25TY3JvbGxiYXJZRW5hYmxlZENoYW5nZTpULG9uQ29ybmVyV2lkdGhDaGFuZ2U6eSxvbkNvcm5lckhlaWdodENoYW5nZTpffSxwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHtkaXI6Un0sbCx7cmVmOk0sc3R5bGU6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsIi0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLXdpZHRoIjp2KyJweCIsIi0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLWhlaWdodCI6eCsicHgiLC4uLmUuc3R5bGV9fSkpKX0pLG9OPSJTY3JvbGxBcmVhVmlld3BvcnQiLGlOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sY2hpbGRyZW46ciwuLi5vfT1lLGk9Qm4ob04sbiksbD1wLnVzZVJlZihudWxsKSxzPVhlKHQsbCxpLm9uVmlld3BvcnRDaGFuZ2UpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLHAuY3JlYXRlRWxlbWVudCgic3R5bGUiLHtkYW5nZXJvdXNseVNldElubmVySFRNTDp7X19odG1sOiJbZGF0YS1yYWRpeC1zY3JvbGwtYXJlYS12aWV3cG9ydF17c2Nyb2xsYmFyLXdpZHRoOm5vbmU7LW1zLW92ZXJmbG93LXN0eWxlOm5vbmU7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7fVtkYXRhLXJhZGl4LXNjcm9sbC1hcmVhLXZpZXdwb3J0XTo6LXdlYmtpdC1zY3JvbGxiYXJ7ZGlzcGxheTpub25lfSJ9fSkscC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7ImRhdGEtcmFkaXgtc2Nyb2xsLWFyZWEtdmlld3BvcnQiOiIifSxvLHtyZWY6cyxzdHlsZTp7b3ZlcmZsb3dYOmkuc2Nyb2xsYmFyWEVuYWJsZWQ/InNjcm9sbCI6ImhpZGRlbiIsb3ZlcmZsb3dZOmkuc2Nyb2xsYmFyWUVuYWJsZWQ/InNjcm9sbCI6ImhpZGRlbiIsLi4uZS5zdHlsZX19KSxwLmNyZWF0ZUVsZW1lbnQoImRpdiIse3JlZjppLm9uQ29udGVudENoYW5nZSxzdHlsZTp7bWluV2lkdGg6IjEwMCUiLGRpc3BsYXk6InRhYmxlIn19LHIpKSl9KSxLcj0iU2Nyb2xsQXJlYVNjcm9sbGJhciIsdl89cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PWUsbz1CbihLcixlLl9fc2NvcGVTY3JvbGxBcmVhKSx7b25TY3JvbGxiYXJYRW5hYmxlZENoYW5nZTppLG9uU2Nyb2xsYmFyWUVuYWJsZWRDaGFuZ2U6bH09byxzPWUub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCI7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4ocz9pKCEwKTpsKCEwKSwoKT0+e3M/aSghMSk6bCghMSl9KSxbcyxpLGxdKSxvLnR5cGU9PT0iaG92ZXIiP3AuY3JlYXRlRWxlbWVudChsTixlZSh7fSxyLHtyZWY6dCxmb3JjZU1vdW50Om59KSk6by50eXBlPT09InNjcm9sbCI/cC5jcmVhdGVFbGVtZW50KHNOLGVlKHt9LHIse3JlZjp0LGZvcmNlTW91bnQ6bn0pKTpvLnR5cGU9PT0iYXV0byI/cC5jcmVhdGVFbGVtZW50KHlfLGVlKHt9LHIse3JlZjp0LGZvcmNlTW91bnQ6bn0pKTpvLnR5cGU9PT0iYWx3YXlzIj9wLmNyZWF0ZUVsZW1lbnQoTmcsZWUoe30scix7cmVmOnR9KSk6bnVsbH0pLGxOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e2ZvcmNlTW91bnQ6biwuLi5yfT1lLG89Qm4oS3IsZS5fX3Njb3BlU2Nyb2xsQXJlYSksW2ksbF09cC51c2VTdGF0ZSghMSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3Qgcz1vLnNjcm9sbEFyZWE7bGV0IGE9MDtpZihzKXtjb25zdCB1PSgpPT57d2luZG93LmNsZWFyVGltZW91dChhKSxsKCEwKX0sYz0oKT0+e2E9d2luZG93LnNldFRpbWVvdXQoKCk9PmwoITEpLG8uc2Nyb2xsSGlkZURlbGF5KX07cmV0dXJuIHMuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmVudGVyIix1KSxzLmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJsZWF2ZSIsYyksKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KGEpLHMucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcmVudGVyIix1KSxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJsZWF2ZSIsYyl9fX0sW28uc2Nyb2xsQXJlYSxvLnNjcm9sbEhpZGVEZWxheV0pLHAuY3JlYXRlRWxlbWVudChEbCx7cHJlc2VudDpufHxpfSxwLmNyZWF0ZUVsZW1lbnQoeV8sZWUoeyJkYXRhLXN0YXRlIjppPyJ2aXNpYmxlIjoiaGlkZGVuIn0scix7cmVmOnR9KSkpfSksc049cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PWUsbz1CbihLcixlLl9fc2NvcGVTY3JvbGxBcmVhKSxpPWUub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCIsbD1pZCgoKT0+YSgiU0NST0xMX0VORCIpLDEwMCksW3MsYV09dE4oImhpZGRlbiIse2hpZGRlbjp7U0NST0xMOiJzY3JvbGxpbmcifSxzY3JvbGxpbmc6e1NDUk9MTF9FTkQ6ImlkbGUiLFBPSU5URVJfRU5URVI6ImludGVyYWN0aW5nIn0saW50ZXJhY3Rpbmc6e1NDUk9MTDoiaW50ZXJhY3RpbmciLFBPSU5URVJfTEVBVkU6ImlkbGUifSxpZGxlOntISURFOiJoaWRkZW4iLFNDUk9MTDoic2Nyb2xsaW5nIixQT0lOVEVSX0VOVEVSOiJpbnRlcmFjdGluZyJ9fSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57aWYocz09PSJpZGxlIil7Y29uc3QgdT13aW5kb3cuc2V0VGltZW91dCgoKT0+YSgiSElERSIpLG8uc2Nyb2xsSGlkZURlbGF5KTtyZXR1cm4oKT0+d2luZG93LmNsZWFyVGltZW91dCh1KX19LFtzLG8uc2Nyb2xsSGlkZURlbGF5LGFdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHU9by52aWV3cG9ydCxjPWk/InNjcm9sbExlZnQiOiJzY3JvbGxUb3AiO2lmKHUpe2xldCBkPXVbY107Y29uc3QgZj0oKT0+e2NvbnN0IGg9dVtjXTtkIT09aCYmKGEoIlNDUk9MTCIpLGwoKSksZD1ofTtyZXR1cm4gdS5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLGYpLCgpPT51LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZil9fSxbby52aWV3cG9ydCxpLGEsbF0pLHAuY3JlYXRlRWxlbWVudChEbCx7cHJlc2VudDpufHxzIT09ImhpZGRlbiJ9LHAuY3JlYXRlRWxlbWVudChOZyxlZSh7ImRhdGEtc3RhdGUiOnM9PT0iaGlkZGVuIj8iaGlkZGVuIjoidmlzaWJsZSJ9LHIse3JlZjp0LG9uUG9pbnRlckVudGVyOkhlKGUub25Qb2ludGVyRW50ZXIsKCk9PmEoIlBPSU5URVJfRU5URVIiKSksb25Qb2ludGVyTGVhdmU6SGUoZS5vblBvaW50ZXJMZWF2ZSwoKT0+YSgiUE9JTlRFUl9MRUFWRSIpKX0pKSl9KSx5Xz1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdCBuPUJuKEtyLGUuX19zY29wZVNjcm9sbEFyZWEpLHtmb3JjZU1vdW50OnIsLi4ub309ZSxbaSxsXT1wLnVzZVN0YXRlKCExKSxzPWUub3JpZW50YXRpb249PT0iaG9yaXpvbnRhbCIsYT1pZCgoKT0+e2lmKG4udmlld3BvcnQpe2NvbnN0IHU9bi52aWV3cG9ydC5vZmZzZXRXaWR0aDxuLnZpZXdwb3J0LnNjcm9sbFdpZHRoLGM9bi52aWV3cG9ydC5vZmZzZXRIZWlnaHQ8bi52aWV3cG9ydC5zY3JvbGxIZWlnaHQ7bChzP3U6Yyl9fSwxMCk7cmV0dXJuIENsKG4udmlld3BvcnQsYSksQ2wobi5jb250ZW50LGEpLHAuY3JlYXRlRWxlbWVudChEbCx7cHJlc2VudDpyfHxpfSxwLmNyZWF0ZUVsZW1lbnQoTmcsZWUoeyJkYXRhLXN0YXRlIjppPyJ2aXNpYmxlIjoiaGlkZGVuIn0sbyx7cmVmOnR9KSkpfSksTmc9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7b3JpZW50YXRpb246bj0idmVydGljYWwiLC4uLnJ9PWUsbz1CbihLcixlLl9fc2NvcGVTY3JvbGxBcmVhKSxpPXAudXNlUmVmKG51bGwpLGw9cC51c2VSZWYoMCksW3MsYV09cC51c2VTdGF0ZSh7Y29udGVudDowLHZpZXdwb3J0OjAsc2Nyb2xsYmFyOntzaXplOjAscGFkZGluZ1N0YXJ0OjAscGFkZGluZ0VuZDowfX0pLHU9U18ocy52aWV3cG9ydCxzLmNvbnRlbnQpLGM9ey4uLnIsc2l6ZXM6cyxvblNpemVzQ2hhbmdlOmEsaGFzVGh1bWI6dT4wJiZ1PDEsb25UaHVtYkNoYW5nZTpmPT5pLmN1cnJlbnQ9ZixvblRodW1iUG9pbnRlclVwOigpPT5sLmN1cnJlbnQ9MCxvblRodW1iUG9pbnRlckRvd246Zj0+bC5jdXJyZW50PWZ9O2Z1bmN0aW9uIGQoZixoKXtyZXR1cm4gZ04oZixsLmN1cnJlbnQscyxoKX1yZXR1cm4gbj09PSJob3Jpem9udGFsIj9wLmNyZWF0ZUVsZW1lbnQoYU4sZWUoe30sYyx7cmVmOnQsb25UaHVtYlBvc2l0aW9uQ2hhbmdlOigpPT57aWYoby52aWV3cG9ydCYmaS5jdXJyZW50KXtjb25zdCBmPW8udmlld3BvcnQuc2Nyb2xsTGVmdCxoPXR5KGYscyxvLmRpcik7aS5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybT1gdHJhbnNsYXRlM2QoJHtofXB4LCAwLCAwKWB9fSxvbldoZWVsU2Nyb2xsOmY9PntvLnZpZXdwb3J0JiYoby52aWV3cG9ydC5zY3JvbGxMZWZ0PWYpfSxvbkRyYWdTY3JvbGw6Zj0+e28udmlld3BvcnQmJihvLnZpZXdwb3J0LnNjcm9sbExlZnQ9ZChmLG8uZGlyKSl9fSkpOm49PT0idmVydGljYWwiP3AuY3JlYXRlRWxlbWVudCh1TixlZSh7fSxjLHtyZWY6dCxvblRodW1iUG9zaXRpb25DaGFuZ2U6KCk9PntpZihvLnZpZXdwb3J0JiZpLmN1cnJlbnQpe2NvbnN0IGY9by52aWV3cG9ydC5zY3JvbGxUb3AsaD10eShmLHMpO2kuY3VycmVudC5zdHlsZS50cmFuc2Zvcm09YHRyYW5zbGF0ZTNkKDAsICR7aH1weCwgMClgfX0sb25XaGVlbFNjcm9sbDpmPT57by52aWV3cG9ydCYmKG8udmlld3BvcnQuc2Nyb2xsVG9wPWYpfSxvbkRyYWdTY3JvbGw6Zj0+e28udmlld3BvcnQmJihvLnZpZXdwb3J0LnNjcm9sbFRvcD1kKGYpKX19KSk6bnVsbH0pLGFOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e3NpemVzOm4sb25TaXplc0NoYW5nZTpyLC4uLm99PWUsaT1CbihLcixlLl9fc2NvcGVTY3JvbGxBcmVhKSxbbCxzXT1wLnVzZVN0YXRlKCksYT1wLnVzZVJlZihudWxsKSx1PVhlKHQsYSxpLm9uU2Nyb2xsYmFyWENoYW5nZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57YS5jdXJyZW50JiZzKGdldENvbXB1dGVkU3R5bGUoYS5jdXJyZW50KSl9LFthXSkscC5jcmVhdGVFbGVtZW50KF9fLGVlKHsiZGF0YS1vcmllbnRhdGlvbiI6Imhvcml6b250YWwifSxvLHtyZWY6dSxzaXplczpuLHN0eWxlOntib3R0b206MCxsZWZ0OmkuZGlyPT09InJ0bCI/InZhcigtLXJhZGl4LXNjcm9sbC1hcmVhLWNvcm5lci13aWR0aCkiOjAscmlnaHQ6aS5kaXI9PT0ibHRyIj8idmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLXdpZHRoKSI6MCwiLS1yYWRpeC1zY3JvbGwtYXJlYS10aHVtYi13aWR0aCI6b2QobikrInB4IiwuLi5lLnN0eWxlfSxvblRodW1iUG9pbnRlckRvd246Yz0+ZS5vblRodW1iUG9pbnRlckRvd24oYy54KSxvbkRyYWdTY3JvbGw6Yz0+ZS5vbkRyYWdTY3JvbGwoYy54KSxvbldoZWVsU2Nyb2xsOihjLGQpPT57aWYoaS52aWV3cG9ydCl7Y29uc3QgZj1pLnZpZXdwb3J0LnNjcm9sbExlZnQrYy5kZWx0YVg7ZS5vbldoZWVsU2Nyb2xsKGYpLENfKGYsZCkmJmMucHJldmVudERlZmF1bHQoKX19LG9uUmVzaXplOigpPT57YS5jdXJyZW50JiZpLnZpZXdwb3J0JiZsJiZyKHtjb250ZW50Omkudmlld3BvcnQuc2Nyb2xsV2lkdGgsdmlld3BvcnQ6aS52aWV3cG9ydC5vZmZzZXRXaWR0aCxzY3JvbGxiYXI6e3NpemU6YS5jdXJyZW50LmNsaWVudFdpZHRoLHBhZGRpbmdTdGFydDpoYyhsLnBhZGRpbmdMZWZ0KSxwYWRkaW5nRW5kOmhjKGwucGFkZGluZ1JpZ2h0KX19KX19KSl9KSx1Tj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtzaXplczpuLG9uU2l6ZXNDaGFuZ2U6ciwuLi5vfT1lLGk9Qm4oS3IsZS5fX3Njb3BlU2Nyb2xsQXJlYSksW2wsc109cC51c2VTdGF0ZSgpLGE9cC51c2VSZWYobnVsbCksdT1YZSh0LGEsaS5vblNjcm9sbGJhcllDaGFuZ2UpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2EuY3VycmVudCYmcyhnZXRDb21wdXRlZFN0eWxlKGEuY3VycmVudCkpfSxbYV0pLHAuY3JlYXRlRWxlbWVudChfXyxlZSh7ImRhdGEtb3JpZW50YXRpb24iOiJ2ZXJ0aWNhbCJ9LG8se3JlZjp1LHNpemVzOm4sc3R5bGU6e3RvcDowLHJpZ2h0OmkuZGlyPT09Imx0ciI/MDp2b2lkIDAsbGVmdDppLmRpcj09PSJydGwiPzA6dm9pZCAwLGJvdHRvbToidmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtY29ybmVyLWhlaWdodCkiLCItLXJhZGl4LXNjcm9sbC1hcmVhLXRodW1iLWhlaWdodCI6b2QobikrInB4IiwuLi5lLnN0eWxlfSxvblRodW1iUG9pbnRlckRvd246Yz0+ZS5vblRodW1iUG9pbnRlckRvd24oYy55KSxvbkRyYWdTY3JvbGw6Yz0+ZS5vbkRyYWdTY3JvbGwoYy55KSxvbldoZWVsU2Nyb2xsOihjLGQpPT57aWYoaS52aWV3cG9ydCl7Y29uc3QgZj1pLnZpZXdwb3J0LnNjcm9sbFRvcCtjLmRlbHRhWTtlLm9uV2hlZWxTY3JvbGwoZiksQ18oZixkKSYmYy5wcmV2ZW50RGVmYXVsdCgpfX0sb25SZXNpemU6KCk9PnthLmN1cnJlbnQmJmkudmlld3BvcnQmJmwmJnIoe2NvbnRlbnQ6aS52aWV3cG9ydC5zY3JvbGxIZWlnaHQsdmlld3BvcnQ6aS52aWV3cG9ydC5vZmZzZXRIZWlnaHQsc2Nyb2xsYmFyOntzaXplOmEuY3VycmVudC5jbGllbnRIZWlnaHQscGFkZGluZ1N0YXJ0OmhjKGwucGFkZGluZ1RvcCkscGFkZGluZ0VuZDpoYyhsLnBhZGRpbmdCb3R0b20pfX0pfX0pKX0pLFtjTix4X109bV8oS3IpLF9fPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sc2l6ZXM6cixoYXNUaHVtYjpvLG9uVGh1bWJDaGFuZ2U6aSxvblRodW1iUG9pbnRlclVwOmwsb25UaHVtYlBvaW50ZXJEb3duOnMsb25UaHVtYlBvc2l0aW9uQ2hhbmdlOmEsb25EcmFnU2Nyb2xsOnUsb25XaGVlbFNjcm9sbDpjLG9uUmVzaXplOmQsLi4uZn09ZSxoPUJuKEtyLG4pLFtnLG1dPXAudXNlU3RhdGUobnVsbCksUz1YZSh0LE09Pm0oTSkpLHY9cC51c2VSZWYobnVsbCkseT1wLnVzZVJlZigiIikseD1oLnZpZXdwb3J0LF89ci5jb250ZW50LXIudmlld3BvcnQsRT1WdChjKSwkPVZ0KGEpLEM9aWQoZCwxMCk7ZnVuY3Rpb24gVChNKXtpZih2LmN1cnJlbnQpe2NvbnN0IFI9TS5jbGllbnRYLXYuY3VycmVudC5sZWZ0LGo9TS5jbGllbnRZLXYuY3VycmVudC50b3A7dSh7eDpSLHk6an0pfX1yZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBNPVI9Pntjb25zdCBqPVIudGFyZ2V0OyhnPT1udWxsP3ZvaWQgMDpnLmNvbnRhaW5zKGopKSYmRShSLF8pfTtyZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLE0se3Bhc3NpdmU6ITF9KSwoKT0+ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigid2hlZWwiLE0se3Bhc3NpdmU6ITF9KX0sW3gsZyxfLEVdKSxwLnVzZUVmZmVjdCgkLFtyLCRdKSxDbChnLEMpLENsKGguY29udGVudCxDKSxwLmNyZWF0ZUVsZW1lbnQoY04se3Njb3BlOm4sc2Nyb2xsYmFyOmcsaGFzVGh1bWI6byxvblRodW1iQ2hhbmdlOlZ0KGkpLG9uVGh1bWJQb2ludGVyVXA6VnQobCksb25UaHVtYlBvc2l0aW9uQ2hhbmdlOiQsb25UaHVtYlBvaW50ZXJEb3duOlZ0KHMpfSxwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHt9LGYse3JlZjpTLHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLC4uLmYuc3R5bGV9LG9uUG9pbnRlckRvd246SGUoZS5vblBvaW50ZXJEb3duLE09PntNLmJ1dHRvbj09PTAmJihNLnRhcmdldC5zZXRQb2ludGVyQ2FwdHVyZShNLnBvaW50ZXJJZCksdi5jdXJyZW50PWcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseS5jdXJyZW50PWRvY3VtZW50LmJvZHkuc3R5bGUud2Via2l0VXNlclNlbGVjdCxkb2N1bWVudC5ib2R5LnN0eWxlLndlYmtpdFVzZXJTZWxlY3Q9Im5vbmUiLGgudmlld3BvcnQmJihoLnZpZXdwb3J0LnN0eWxlLnNjcm9sbEJlaGF2aW9yPSJhdXRvIiksVChNKSl9KSxvblBvaW50ZXJNb3ZlOkhlKGUub25Qb2ludGVyTW92ZSxUKSxvblBvaW50ZXJVcDpIZShlLm9uUG9pbnRlclVwLE09Pntjb25zdCBSPU0udGFyZ2V0O1IuaGFzUG9pbnRlckNhcHR1cmUoTS5wb2ludGVySWQpJiZSLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShNLnBvaW50ZXJJZCksZG9jdW1lbnQuYm9keS5zdHlsZS53ZWJraXRVc2VyU2VsZWN0PXkuY3VycmVudCxoLnZpZXdwb3J0JiYoaC52aWV3cG9ydC5zdHlsZS5zY3JvbGxCZWhhdmlvcj0iIiksdi5jdXJyZW50PW51bGx9KX0pKSl9KSxNaD0iU2Nyb2xsQXJlYVRodW1iIixkTj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtmb3JjZU1vdW50Om4sLi4ucn09ZSxvPXhfKE1oLGUuX19zY29wZVNjcm9sbEFyZWEpO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoRGwse3ByZXNlbnQ6bnx8by5oYXNUaHVtYn0scC5jcmVhdGVFbGVtZW50KGZOLGVlKHtyZWY6dH0scikpKX0pLGZOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sc3R5bGU6ciwuLi5vfT1lLGk9Qm4oTWgsbiksbD14XyhNaCxuKSx7b25UaHVtYlBvc2l0aW9uQ2hhbmdlOnN9PWwsYT1YZSh0LGQ9Pmwub25UaHVtYkNoYW5nZShkKSksdT1wLnVzZVJlZigpLGM9aWQoKCk9Pnt1LmN1cnJlbnQmJih1LmN1cnJlbnQoKSx1LmN1cnJlbnQ9dm9pZCAwKX0sMTAwKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBkPWkudmlld3BvcnQ7aWYoZCl7Y29uc3QgZj0oKT0+e2lmKGMoKSwhdS5jdXJyZW50KXtjb25zdCBoPW1OKGQscyk7dS5jdXJyZW50PWgscygpfX07cmV0dXJuIHMoKSxkLmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsZiksKCk9PmQucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixmKX19LFtpLnZpZXdwb3J0LGMsc10pLHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoeyJkYXRhLXN0YXRlIjpsLmhhc1RodW1iPyJ2aXNpYmxlIjoiaGlkZGVuIn0sbyx7cmVmOmEsc3R5bGU6e3dpZHRoOiJ2YXIoLS1yYWRpeC1zY3JvbGwtYXJlYS10aHVtYi13aWR0aCkiLGhlaWdodDoidmFyKC0tcmFkaXgtc2Nyb2xsLWFyZWEtdGh1bWItaGVpZ2h0KSIsLi4ucn0sb25Qb2ludGVyRG93bkNhcHR1cmU6SGUoZS5vblBvaW50ZXJEb3duQ2FwdHVyZSxkPT57Y29uc3QgaD1kLnRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxnPWQuY2xpZW50WC1oLmxlZnQsbT1kLmNsaWVudFktaC50b3A7bC5vblRodW1iUG9pbnRlckRvd24oe3g6Zyx5Om19KX0pLG9uUG9pbnRlclVwOkhlKGUub25Qb2ludGVyVXAsbC5vblRodW1iUG9pbnRlclVwKX0pKX0pLHdfPSJTY3JvbGxBcmVhQ29ybmVyIixoTj1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdCBuPUJuKHdfLGUuX19zY29wZVNjcm9sbEFyZWEpLHI9ISEobi5zY3JvbGxiYXJYJiZuLnNjcm9sbGJhclkpO3JldHVybiBuLnR5cGUhPT0ic2Nyb2xsIiYmcj9wLmNyZWF0ZUVsZW1lbnQocE4sZWUoe30sZSx7cmVmOnR9KSk6bnVsbH0pLHBOPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTY3JvbGxBcmVhOm4sLi4ucn09ZSxvPUJuKHdfLG4pLFtpLGxdPXAudXNlU3RhdGUoMCksW3MsYV09cC51c2VTdGF0ZSgwKSx1PSEhKGkmJnMpO3JldHVybiBDbChvLnNjcm9sbGJhclgsKCk9Pnt2YXIgYztjb25zdCBkPSgoYz1vLnNjcm9sbGJhclgpPT09bnVsbHx8Yz09PXZvaWQgMD92b2lkIDA6Yy5vZmZzZXRIZWlnaHQpfHwwO28ub25Db3JuZXJIZWlnaHRDaGFuZ2UoZCksYShkKX0pLENsKG8uc2Nyb2xsYmFyWSwoKT0+e3ZhciBjO2NvbnN0IGQ9KChjPW8uc2Nyb2xsYmFyWSk9PT1udWxsfHxjPT09dm9pZCAwP3ZvaWQgMDpjLm9mZnNldFdpZHRoKXx8MDtvLm9uQ29ybmVyV2lkdGhDaGFuZ2UoZCksbChkKX0pLHU/cC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7fSxyLHtyZWY6dCxzdHlsZTp7d2lkdGg6aSxoZWlnaHQ6cyxwb3NpdGlvbjoiYWJzb2x1dGUiLHJpZ2h0Om8uZGlyPT09Imx0ciI/MDp2b2lkIDAsbGVmdDpvLmRpcj09PSJydGwiPzA6dm9pZCAwLGJvdHRvbTowLC4uLmUuc3R5bGV9fSkpOm51bGx9KTtmdW5jdGlvbiBoYyhlKXtyZXR1cm4gZT9wYXJzZUludChlLDEwKTowfWZ1bmN0aW9uIFNfKGUsdCl7Y29uc3Qgbj1lL3Q7cmV0dXJuIGlzTmFOKG4pPzA6bn1mdW5jdGlvbiBvZChlKXtjb25zdCB0PVNfKGUudmlld3BvcnQsZS5jb250ZW50KSxuPWUuc2Nyb2xsYmFyLnBhZGRpbmdTdGFydCtlLnNjcm9sbGJhci5wYWRkaW5nRW5kLHI9KGUuc2Nyb2xsYmFyLnNpemUtbikqdDtyZXR1cm4gTWF0aC5tYXgociwxOCl9ZnVuY3Rpb24gZ04oZSx0LG4scj0ibHRyIil7Y29uc3Qgbz1vZChuKSxpPW8vMixsPXR8fGkscz1vLWwsYT1uLnNjcm9sbGJhci5wYWRkaW5nU3RhcnQrbCx1PW4uc2Nyb2xsYmFyLnNpemUtbi5zY3JvbGxiYXIucGFkZGluZ0VuZC1zLGM9bi5jb250ZW50LW4udmlld3BvcnQsZD1yPT09Imx0ciI/WzAsY106W2MqLTEsMF07cmV0dXJuIEVfKFthLHVdLGQpKGUpfWZ1bmN0aW9uIHR5KGUsdCxuPSJsdHIiKXtjb25zdCByPW9kKHQpLG89dC5zY3JvbGxiYXIucGFkZGluZ1N0YXJ0K3Quc2Nyb2xsYmFyLnBhZGRpbmdFbmQsaT10LnNjcm9sbGJhci5zaXplLW8sbD10LmNvbnRlbnQtdC52aWV3cG9ydCxzPWktcixhPW49PT0ibHRyIj9bMCxsXTpbbCotMSwwXSx1PUFoKGUsYSk7cmV0dXJuIEVfKFswLGxdLFswLHNdKSh1KX1mdW5jdGlvbiBFXyhlLHQpe3JldHVybiBuPT57aWYoZVswXT09PWVbMV18fHRbMF09PT10WzFdKXJldHVybiB0WzBdO2NvbnN0IHI9KHRbMV0tdFswXSkvKGVbMV0tZVswXSk7cmV0dXJuIHRbMF0rcioobi1lWzBdKX19ZnVuY3Rpb24gQ18oZSx0KXtyZXR1cm4gZT4wJiZlPHR9Y29uc3QgbU49KGUsdD0oKT0+e30pPT57bGV0IG49e2xlZnQ6ZS5zY3JvbGxMZWZ0LHRvcDplLnNjcm9sbFRvcH0scj0wO3JldHVybiBmdW5jdGlvbiBvKCl7Y29uc3QgaT17bGVmdDplLnNjcm9sbExlZnQsdG9wOmUuc2Nyb2xsVG9wfSxsPW4ubGVmdCE9PWkubGVmdCxzPW4udG9wIT09aS50b3A7KGx8fHMpJiZ0KCksbj1pLHI9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShvKX0oKSwoKT0+d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHIpfTtmdW5jdGlvbiBpZChlLHQpe2NvbnN0IG49VnQoZSkscj1wLnVzZVJlZigwKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PigpPT53aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksW10pLHAudXNlQ2FsbGJhY2soKCk9Pnt3aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksci5jdXJyZW50PXdpbmRvdy5zZXRUaW1lb3V0KG4sdCl9LFtuLHRdKX1mdW5jdGlvbiBDbChlLHQpe2NvbnN0IG49VnQodCk7JG4oKCk9PntsZXQgcj0wO2lmKGUpe2NvbnN0IG89bmV3IFJlc2l6ZU9ic2VydmVyKCgpPT57Y2FuY2VsQW5pbWF0aW9uRnJhbWUocikscj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKG4pfSk7cmV0dXJuIG8ub2JzZXJ2ZShlKSwoKT0+e3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShyKSxvLnVub2JzZXJ2ZShlKX19fSxbZSxuXSl9Y29uc3QgJF89ck4sdk49aU4seU49aE47ZnVuY3Rpb24ga18oZSl7dmFyIHQsbixyPSIiO2lmKHR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJudW1iZXIiKXIrPWU7ZWxzZSBpZih0eXBlb2YgZT09Im9iamVjdCIpaWYoQXJyYXkuaXNBcnJheShlKSlmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0mJihuPWtfKGVbdF0pKSYmKHImJihyKz0iICIpLHIrPW4pO2Vsc2UgZm9yKHQgaW4gZSllW3RdJiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9ZnVuY3Rpb24geE4oKXtmb3IodmFyIGUsdCxuPTAscj0iIjtuPGFyZ3VtZW50cy5sZW5ndGg7KShlPWFyZ3VtZW50c1tuKytdKSYmKHQ9a18oZSkpJiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9Y29uc3QgYmc9Ii0iO2Z1bmN0aW9uIF9OKGUpe2NvbnN0IHQ9U04oZSkse2NvbmZsaWN0aW5nQ2xhc3NHcm91cHM6bixjb25mbGljdGluZ0NsYXNzR3JvdXBNb2RpZmllcnM6cn09ZTtmdW5jdGlvbiBvKGwpe2NvbnN0IHM9bC5zcGxpdChiZyk7cmV0dXJuIHNbMF09PT0iIiYmcy5sZW5ndGghPT0xJiZzLnNoaWZ0KCksVF8ocyx0KXx8d04obCl9ZnVuY3Rpb24gaShsLHMpe2NvbnN0IGE9bltsXXx8W107cmV0dXJuIHMmJnJbbF0/Wy4uLmEsLi4ucltsXV06YX1yZXR1cm57Z2V0Q2xhc3NHcm91cElkOm8sZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzOml9fWZ1bmN0aW9uIFRfKGUsdCl7dmFyIGw7aWYoZS5sZW5ndGg9PT0wKXJldHVybiB0LmNsYXNzR3JvdXBJZDtjb25zdCBuPWVbMF0scj10Lm5leHRQYXJ0LmdldChuKSxvPXI/VF8oZS5zbGljZSgxKSxyKTp2b2lkIDA7aWYobylyZXR1cm4gbztpZih0LnZhbGlkYXRvcnMubGVuZ3RoPT09MClyZXR1cm47Y29uc3QgaT1lLmpvaW4oYmcpO3JldHVybihsPXQudmFsaWRhdG9ycy5maW5kKCh7dmFsaWRhdG9yOnN9KT0+cyhpKSkpPT1udWxsP3ZvaWQgMDpsLmNsYXNzR3JvdXBJZH1jb25zdCBueT0vXlxbKC4rKVxdJC87ZnVuY3Rpb24gd04oZSl7aWYobnkudGVzdChlKSl7Y29uc3QgdD1ueS5leGVjKGUpWzFdLG49dD09bnVsbD92b2lkIDA6dC5zdWJzdHJpbmcoMCx0LmluZGV4T2YoIjoiKSk7aWYobilyZXR1cm4iYXJiaXRyYXJ5Li4iK259fWZ1bmN0aW9uIFNOKGUpe2NvbnN0e3RoZW1lOnQscHJlZml4Om59PWUscj17bmV4dFBhcnQ6bmV3IE1hcCx2YWxpZGF0b3JzOltdfTtyZXR1cm4gQ04oT2JqZWN0LmVudHJpZXMoZS5jbGFzc0dyb3VwcyksbikuZm9yRWFjaCgoW2ksbF0pPT57RGgobCxyLGksdCl9KSxyfWZ1bmN0aW9uIERoKGUsdCxuLHIpe2UuZm9yRWFjaChvPT57aWYodHlwZW9mIG89PSJzdHJpbmciKXtjb25zdCBpPW89PT0iIj90OnJ5KHQsbyk7aS5jbGFzc0dyb3VwSWQ9bjtyZXR1cm59aWYodHlwZW9mIG89PSJmdW5jdGlvbiIpe2lmKEVOKG8pKXtEaChvKHIpLHQsbixyKTtyZXR1cm59dC52YWxpZGF0b3JzLnB1c2goe3ZhbGlkYXRvcjpvLGNsYXNzR3JvdXBJZDpufSk7cmV0dXJufU9iamVjdC5lbnRyaWVzKG8pLmZvckVhY2goKFtpLGxdKT0+e0RoKGwscnkodCxpKSxuLHIpfSl9KX1mdW5jdGlvbiByeShlLHQpe2xldCBuPWU7cmV0dXJuIHQuc3BsaXQoYmcpLmZvckVhY2gocj0+e24ubmV4dFBhcnQuaGFzKHIpfHxuLm5leHRQYXJ0LnNldChyLHtuZXh0UGFydDpuZXcgTWFwLHZhbGlkYXRvcnM6W119KSxuPW4ubmV4dFBhcnQuZ2V0KHIpfSksbn1mdW5jdGlvbiBFTihlKXtyZXR1cm4gZS5pc1RoZW1lR2V0dGVyfWZ1bmN0aW9uIENOKGUsdCl7cmV0dXJuIHQ/ZS5tYXAoKFtuLHJdKT0+e2NvbnN0IG89ci5tYXAoaT0+dHlwZW9mIGk9PSJzdHJpbmciP3QraTp0eXBlb2YgaT09Im9iamVjdCI/T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKGkpLm1hcCgoW2wsc10pPT5bdCtsLHNdKSk6aSk7cmV0dXJuW24sb119KTplfWZ1bmN0aW9uICROKGUpe2lmKGU8MSlyZXR1cm57Z2V0OigpPT57fSxzZXQ6KCk9Pnt9fTtsZXQgdD0wLG49bmV3IE1hcCxyPW5ldyBNYXA7ZnVuY3Rpb24gbyhpLGwpe24uc2V0KGksbCksdCsrLHQ+ZSYmKHQ9MCxyPW4sbj1uZXcgTWFwKX1yZXR1cm57Z2V0KGkpe2xldCBsPW4uZ2V0KGkpO2lmKGwhPT12b2lkIDApcmV0dXJuIGw7aWYoKGw9ci5nZXQoaSkpIT09dm9pZCAwKXJldHVybiBvKGksbCksbH0sc2V0KGksbCl7bi5oYXMoaSk/bi5zZXQoaSxsKTpvKGksbCl9fX1jb25zdCBOXz0iISI7ZnVuY3Rpb24ga04oZSl7Y29uc3QgdD1lLnNlcGFyYXRvcixuPXQubGVuZ3RoPT09MSxyPXRbMF0sbz10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24obCl7Y29uc3Qgcz1bXTtsZXQgYT0wLHU9MCxjO2ZvcihsZXQgbT0wO208bC5sZW5ndGg7bSsrKXtsZXQgUz1sW21dO2lmKGE9PT0wKXtpZihTPT09ciYmKG58fGwuc2xpY2UobSxtK28pPT09dCkpe3MucHVzaChsLnNsaWNlKHUsbSkpLHU9bStvO2NvbnRpbnVlfWlmKFM9PT0iLyIpe2M9bTtjb250aW51ZX19Uz09PSJbIj9hKys6Uz09PSJdIiYmYS0tfWNvbnN0IGQ9cy5sZW5ndGg9PT0wP2w6bC5zdWJzdHJpbmcodSksZj1kLnN0YXJ0c1dpdGgoTl8pLGg9Zj9kLnN1YnN0cmluZygxKTpkLGc9YyYmYz51P2MtdTp2b2lkIDA7cmV0dXJue21vZGlmaWVyczpzLGhhc0ltcG9ydGFudE1vZGlmaWVyOmYsYmFzZUNsYXNzTmFtZTpoLG1heWJlUG9zdGZpeE1vZGlmaWVyUG9zaXRpb246Z319fWZ1bmN0aW9uIFROKGUpe2lmKGUubGVuZ3RoPD0xKXJldHVybiBlO2NvbnN0IHQ9W107bGV0IG49W107cmV0dXJuIGUuZm9yRWFjaChyPT57clswXT09PSJbIj8odC5wdXNoKC4uLm4uc29ydCgpLHIpLG49W10pOm4ucHVzaChyKX0pLHQucHVzaCguLi5uLnNvcnQoKSksdH1mdW5jdGlvbiBOTihlKXtyZXR1cm57Y2FjaGU6JE4oZS5jYWNoZVNpemUpLHNwbGl0TW9kaWZpZXJzOmtOKGUpLC4uLl9OKGUpfX1jb25zdCBiTj0vXHMrLztmdW5jdGlvbiBSTihlLHQpe2NvbnN0e3NwbGl0TW9kaWZpZXJzOm4sZ2V0Q2xhc3NHcm91cElkOnIsZ2V0Q29uZmxpY3RpbmdDbGFzc0dyb3VwSWRzOm99PXQsaT1uZXcgU2V0O3JldHVybiBlLnRyaW0oKS5zcGxpdChiTikubWFwKGw9Pntjb25zdHttb2RpZmllcnM6cyxoYXNJbXBvcnRhbnRNb2RpZmllcjphLGJhc2VDbGFzc05hbWU6dSxtYXliZVBvc3RmaXhNb2RpZmllclBvc2l0aW9uOmN9PW4obCk7bGV0IGQ9cihjP3Uuc3Vic3RyaW5nKDAsYyk6dSksZj0hIWM7aWYoIWQpe2lmKCFjKXJldHVybntpc1RhaWx3aW5kQ2xhc3M6ITEsb3JpZ2luYWxDbGFzc05hbWU6bH07aWYoZD1yKHUpLCFkKXJldHVybntpc1RhaWx3aW5kQ2xhc3M6ITEsb3JpZ2luYWxDbGFzc05hbWU6bH07Zj0hMX1jb25zdCBoPVROKHMpLmpvaW4oIjoiKTtyZXR1cm57aXNUYWlsd2luZENsYXNzOiEwLG1vZGlmaWVySWQ6YT9oK05fOmgsY2xhc3NHcm91cElkOmQsb3JpZ2luYWxDbGFzc05hbWU6bCxoYXNQb3N0Zml4TW9kaWZpZXI6Zn19KS5yZXZlcnNlKCkuZmlsdGVyKGw9PntpZighbC5pc1RhaWx3aW5kQ2xhc3MpcmV0dXJuITA7Y29uc3R7bW9kaWZpZXJJZDpzLGNsYXNzR3JvdXBJZDphLGhhc1Bvc3RmaXhNb2RpZmllcjp1fT1sLGM9cythO3JldHVybiBpLmhhcyhjKT8hMTooaS5hZGQoYyksbyhhLHUpLmZvckVhY2goZD0+aS5hZGQocytkKSksITApfSkucmV2ZXJzZSgpLm1hcChsPT5sLm9yaWdpbmFsQ2xhc3NOYW1lKS5qb2luKCIgIil9ZnVuY3Rpb24gUE4oKXtsZXQgZT0wLHQsbixyPSIiO2Zvcig7ZTxhcmd1bWVudHMubGVuZ3RoOykodD1hcmd1bWVudHNbZSsrXSkmJihuPWJfKHQpKSYmKHImJihyKz0iICIpLHIrPW4pO3JldHVybiByfWZ1bmN0aW9uIGJfKGUpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gZTtsZXQgdCxuPSIiO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJih0PWJfKGVbcl0pKSYmKG4mJihuKz0iICIpLG4rPXQpO3JldHVybiBufWZ1bmN0aW9uIE9OKGUsLi4udCl7bGV0IG4scixvLGk9bDtmdW5jdGlvbiBsKGEpe2NvbnN0IHU9dC5yZWR1Y2UoKGMsZCk9PmQoYyksZSgpKTtyZXR1cm4gbj1OTih1KSxyPW4uY2FjaGUuZ2V0LG89bi5jYWNoZS5zZXQsaT1zLHMoYSl9ZnVuY3Rpb24gcyhhKXtjb25zdCB1PXIoYSk7aWYodSlyZXR1cm4gdTtjb25zdCBjPVJOKGEsbik7cmV0dXJuIG8oYSxjKSxjfXJldHVybiBmdW5jdGlvbigpe3JldHVybiBpKFBOLmFwcGx5KG51bGwsYXJndW1lbnRzKSl9fWZ1bmN0aW9uIFdlKGUpe2NvbnN0IHQ9bj0+bltlXXx8W107cmV0dXJuIHQuaXNUaGVtZUdldHRlcj0hMCx0fWNvbnN0IFJfPS9eXFsoPzooW2Etei1dKyk6KT8oLispXF0kL2ksQU49L15cZCtcL1xkKyQvLE1OPW5ldyBTZXQoWyJweCIsImZ1bGwiLCJzY3JlZW4iXSksRE49L14oXGQrKFwuXGQrKT8pPyh4c3xzbXxtZHxsZ3x4bCkkLyxMTj0vXGQrKCV8cHh8cj9lbXxbc2RsXT92KFtod2liXXxtaW58bWF4KXxwdHxwY3xpbnxjbXxtbXxjYXB8Y2h8ZXh8cj9saHxjcSh3fGh8aXxifG1pbnxtYXgpKXxcYihjYWxjfG1pbnxtYXh8Y2xhbXApXCguK1wpfF4wJC8sSU49L14tPygoXGQrKT9cLj8oXGQrKVthLXpdK3wwKV8tPygoXGQrKT9cLj8oXGQrKVthLXpdK3wwKS8sak49L14odXJsfGltYWdlfGltYWdlLXNldHxjcm9zcy1mYWRlfGVsZW1lbnR8KHJlcGVhdGluZy0pPyhsaW5lYXJ8cmFkaWFsfGNvbmljKS1ncmFkaWVudClcKC4rXCkkLztmdW5jdGlvbiBWbihlKXtyZXR1cm4gcW8oZSl8fE1OLmhhcyhlKXx8QU4udGVzdChlKX1mdW5jdGlvbiB0byhlKXtyZXR1cm4gTGwoZSwibGVuZ3RoIixLTil9ZnVuY3Rpb24gcW8oZSl7cmV0dXJuISFlJiYhTnVtYmVyLmlzTmFOKE51bWJlcihlKSl9ZnVuY3Rpb24gY3UoZSl7cmV0dXJuIExsKGUsIm51bWJlciIscW8pfWZ1bmN0aW9uIHNzKGUpe3JldHVybiEhZSYmTnVtYmVyLmlzSW50ZWdlcihOdW1iZXIoZSkpfWZ1bmN0aW9uIHpOKGUpe3JldHVybiBlLmVuZHNXaXRoKCIlIikmJnFvKGUuc2xpY2UoMCwtMSkpfWZ1bmN0aW9uIHZlKGUpe3JldHVybiBSXy50ZXN0KGUpfWZ1bmN0aW9uIG5vKGUpe3JldHVybiBETi50ZXN0KGUpfWNvbnN0IEZOPW5ldyBTZXQoWyJsZW5ndGgiLCJzaXplIiwicGVyY2VudGFnZSJdKTtmdW5jdGlvbiBCTihlKXtyZXR1cm4gTGwoZSxGTixQXyl9ZnVuY3Rpb24gV04oZSl7cmV0dXJuIExsKGUsInBvc2l0aW9uIixQXyl9Y29uc3QgVU49bmV3IFNldChbImltYWdlIiwidXJsIl0pO2Z1bmN0aW9uIFZOKGUpe3JldHVybiBMbChlLFVOLFlOKX1mdW5jdGlvbiBITihlKXtyZXR1cm4gTGwoZSwiIixHTil9ZnVuY3Rpb24gYXMoKXtyZXR1cm4hMH1mdW5jdGlvbiBMbChlLHQsbil7Y29uc3Qgcj1SXy5leGVjKGUpO3JldHVybiByP3JbMV0/dHlwZW9mIHQ9PSJzdHJpbmciP3JbMV09PT10OnQuaGFzKHJbMV0pOm4oclsyXSk6ITF9ZnVuY3Rpb24gS04oZSl7cmV0dXJuIExOLnRlc3QoZSl9ZnVuY3Rpb24gUF8oKXtyZXR1cm4hMX1mdW5jdGlvbiBHTihlKXtyZXR1cm4gSU4udGVzdChlKX1mdW5jdGlvbiBZTihlKXtyZXR1cm4gak4udGVzdChlKX1mdW5jdGlvbiBYTigpe2NvbnN0IGU9V2UoImNvbG9ycyIpLHQ9V2UoInNwYWNpbmciKSxuPVdlKCJibHVyIikscj1XZSgiYnJpZ2h0bmVzcyIpLG89V2UoImJvcmRlckNvbG9yIiksaT1XZSgiYm9yZGVyUmFkaXVzIiksbD1XZSgiYm9yZGVyU3BhY2luZyIpLHM9V2UoImJvcmRlcldpZHRoIiksYT1XZSgiY29udHJhc3QiKSx1PVdlKCJncmF5c2NhbGUiKSxjPVdlKCJodWVSb3RhdGUiKSxkPVdlKCJpbnZlcnQiKSxmPVdlKCJnYXAiKSxoPVdlKCJncmFkaWVudENvbG9yU3RvcHMiKSxnPVdlKCJncmFkaWVudENvbG9yU3RvcFBvc2l0aW9ucyIpLG09V2UoImluc2V0IiksUz1XZSgibWFyZ2luIiksdj1XZSgib3BhY2l0eSIpLHk9V2UoInBhZGRpbmciKSx4PVdlKCJzYXR1cmF0ZSIpLF89V2UoInNjYWxlIiksRT1XZSgic2VwaWEiKSwkPVdlKCJza2V3IiksQz1XZSgic3BhY2UiKSxUPVdlKCJ0cmFuc2xhdGUiKSxNPSgpPT5bImF1dG8iLCJjb250YWluIiwibm9uZSJdLFI9KCk9PlsiYXV0byIsImhpZGRlbiIsImNsaXAiLCJ2aXNpYmxlIiwic2Nyb2xsIl0saj0oKT0+WyJhdXRvIix2ZSx0XSxGPSgpPT5bdmUsdF0sYWU9KCk9PlsiIixWbix0b10sSD0oKT0+WyJhdXRvIixxbyx2ZV0sWD0oKT0+WyJib3R0b20iLCJjZW50ZXIiLCJsZWZ0IiwibGVmdC1ib3R0b20iLCJsZWZ0LXRvcCIsInJpZ2h0IiwicmlnaHQtYm90dG9tIiwicmlnaHQtdG9wIiwidG9wIl0sUD0oKT0+WyJzb2xpZCIsImRhc2hlZCIsImRvdHRlZCIsImRvdWJsZSIsIm5vbmUiXSxPPSgpPT5bIm5vcm1hbCIsIm11bHRpcGx5Iiwic2NyZWVuIiwib3ZlcmxheSIsImRhcmtlbiIsImxpZ2h0ZW4iLCJjb2xvci1kb2RnZSIsImNvbG9yLWJ1cm4iLCJoYXJkLWxpZ2h0Iiwic29mdC1saWdodCIsImRpZmZlcmVuY2UiLCJleGNsdXNpb24iLCJodWUiLCJzYXR1cmF0aW9uIiwiY29sb3IiLCJsdW1pbm9zaXR5IiwicGx1cy1saWdodGVyIl0saz0oKT0+WyJzdGFydCIsImVuZCIsImNlbnRlciIsImJldHdlZW4iLCJhcm91bmQiLCJldmVubHkiLCJzdHJldGNoIl0sST0oKT0+WyIiLCIwIix2ZV0sTD0oKT0+WyJhdXRvIiwiYXZvaWQiLCJhbGwiLCJhdm9pZC1wYWdlIiwicGFnZSIsImxlZnQiLCJyaWdodCIsImNvbHVtbiJdLFY9KCk9PltxbyxjdV0sdGU9KCk9Pltxbyx2ZV07cmV0dXJue2NhY2hlU2l6ZTo1MDAsc2VwYXJhdG9yOiI6Iix0aGVtZTp7Y29sb3JzOlthc10sc3BhY2luZzpbVm4sdG9dLGJsdXI6WyJub25lIiwiIixubyx2ZV0sYnJpZ2h0bmVzczpWKCksYm9yZGVyQ29sb3I6W2VdLGJvcmRlclJhZGl1czpbIm5vbmUiLCIiLCJmdWxsIixubyx2ZV0sYm9yZGVyU3BhY2luZzpGKCksYm9yZGVyV2lkdGg6YWUoKSxjb250cmFzdDpWKCksZ3JheXNjYWxlOkkoKSxodWVSb3RhdGU6dGUoKSxpbnZlcnQ6SSgpLGdhcDpGKCksZ3JhZGllbnRDb2xvclN0b3BzOltlXSxncmFkaWVudENvbG9yU3RvcFBvc2l0aW9uczpbek4sdG9dLGluc2V0OmooKSxtYXJnaW46aigpLG9wYWNpdHk6VigpLHBhZGRpbmc6RigpLHNhdHVyYXRlOlYoKSxzY2FsZTpWKCksc2VwaWE6SSgpLHNrZXc6dGUoKSxzcGFjZTpGKCksdHJhbnNsYXRlOkYoKX0sY2xhc3NHcm91cHM6e2FzcGVjdDpbe2FzcGVjdDpbImF1dG8iLCJzcXVhcmUiLCJ2aWRlbyIsdmVdfV0sY29udGFpbmVyOlsiY29udGFpbmVyIl0sY29sdW1uczpbe2NvbHVtbnM6W25vXX1dLCJicmVhay1hZnRlciI6W3siYnJlYWstYWZ0ZXIiOkwoKX1dLCJicmVhay1iZWZvcmUiOlt7ImJyZWFrLWJlZm9yZSI6TCgpfV0sImJyZWFrLWluc2lkZSI6W3siYnJlYWstaW5zaWRlIjpbImF1dG8iLCJhdm9pZCIsImF2b2lkLXBhZ2UiLCJhdm9pZC1jb2x1bW4iXX1dLCJib3gtZGVjb3JhdGlvbiI6W3siYm94LWRlY29yYXRpb24iOlsic2xpY2UiLCJjbG9uZSJdfV0sYm94Olt7Ym94OlsiYm9yZGVyIiwiY29udGVudCJdfV0sZGlzcGxheTpbImJsb2NrIiwiaW5saW5lLWJsb2NrIiwiaW5saW5lIiwiZmxleCIsImlubGluZS1mbGV4IiwidGFibGUiLCJpbmxpbmUtdGFibGUiLCJ0YWJsZS1jYXB0aW9uIiwidGFibGUtY2VsbCIsInRhYmxlLWNvbHVtbiIsInRhYmxlLWNvbHVtbi1ncm91cCIsInRhYmxlLWZvb3Rlci1ncm91cCIsInRhYmxlLWhlYWRlci1ncm91cCIsInRhYmxlLXJvdy1ncm91cCIsInRhYmxlLXJvdyIsImZsb3ctcm9vdCIsImdyaWQiLCJpbmxpbmUtZ3JpZCIsImNvbnRlbnRzIiwibGlzdC1pdGVtIiwiaGlkZGVuIl0sZmxvYXQ6W3tmbG9hdDpbInJpZ2h0IiwibGVmdCIsIm5vbmUiXX1dLGNsZWFyOlt7Y2xlYXI6WyJsZWZ0IiwicmlnaHQiLCJib3RoIiwibm9uZSJdfV0saXNvbGF0aW9uOlsiaXNvbGF0ZSIsImlzb2xhdGlvbi1hdXRvIl0sIm9iamVjdC1maXQiOlt7b2JqZWN0OlsiY29udGFpbiIsImNvdmVyIiwiZmlsbCIsIm5vbmUiLCJzY2FsZS1kb3duIl19XSwib2JqZWN0LXBvc2l0aW9uIjpbe29iamVjdDpbLi4uWCgpLHZlXX1dLG92ZXJmbG93Olt7b3ZlcmZsb3c6UigpfV0sIm92ZXJmbG93LXgiOlt7Im92ZXJmbG93LXgiOlIoKX1dLCJvdmVyZmxvdy15IjpbeyJvdmVyZmxvdy15IjpSKCl9XSxvdmVyc2Nyb2xsOlt7b3ZlcnNjcm9sbDpNKCl9XSwib3ZlcnNjcm9sbC14IjpbeyJvdmVyc2Nyb2xsLXgiOk0oKX1dLCJvdmVyc2Nyb2xsLXkiOlt7Im92ZXJzY3JvbGwteSI6TSgpfV0scG9zaXRpb246WyJzdGF0aWMiLCJmaXhlZCIsImFic29sdXRlIiwicmVsYXRpdmUiLCJzdGlja3kiXSxpbnNldDpbe2luc2V0OlttXX1dLCJpbnNldC14IjpbeyJpbnNldC14IjpbbV19XSwiaW5zZXQteSI6W3siaW5zZXQteSI6W21dfV0sc3RhcnQ6W3tzdGFydDpbbV19XSxlbmQ6W3tlbmQ6W21dfV0sdG9wOlt7dG9wOlttXX1dLHJpZ2h0Olt7cmlnaHQ6W21dfV0sYm90dG9tOlt7Ym90dG9tOlttXX1dLGxlZnQ6W3tsZWZ0OlttXX1dLHZpc2liaWxpdHk6WyJ2aXNpYmxlIiwiaW52aXNpYmxlIiwiY29sbGFwc2UiXSx6Olt7ejpbImF1dG8iLHNzLHZlXX1dLGJhc2lzOlt7YmFzaXM6aigpfV0sImZsZXgtZGlyZWN0aW9uIjpbe2ZsZXg6WyJyb3ciLCJyb3ctcmV2ZXJzZSIsImNvbCIsImNvbC1yZXZlcnNlIl19XSwiZmxleC13cmFwIjpbe2ZsZXg6WyJ3cmFwIiwid3JhcC1yZXZlcnNlIiwibm93cmFwIl19XSxmbGV4Olt7ZmxleDpbIjEiLCJhdXRvIiwiaW5pdGlhbCIsIm5vbmUiLHZlXX1dLGdyb3c6W3tncm93OkkoKX1dLHNocmluazpbe3NocmluazpJKCl9XSxvcmRlcjpbe29yZGVyOlsiZmlyc3QiLCJsYXN0Iiwibm9uZSIsc3MsdmVdfV0sImdyaWQtY29scyI6W3siZ3JpZC1jb2xzIjpbYXNdfV0sImNvbC1zdGFydC1lbmQiOlt7Y29sOlsiYXV0byIse3NwYW46WyJmdWxsIixzcyx2ZV19LHZlXX1dLCJjb2wtc3RhcnQiOlt7ImNvbC1zdGFydCI6SCgpfV0sImNvbC1lbmQiOlt7ImNvbC1lbmQiOkgoKX1dLCJncmlkLXJvd3MiOlt7ImdyaWQtcm93cyI6W2FzXX1dLCJyb3ctc3RhcnQtZW5kIjpbe3JvdzpbImF1dG8iLHtzcGFuOltzcyx2ZV19LHZlXX1dLCJyb3ctc3RhcnQiOlt7InJvdy1zdGFydCI6SCgpfV0sInJvdy1lbmQiOlt7InJvdy1lbmQiOkgoKX1dLCJncmlkLWZsb3ciOlt7ImdyaWQtZmxvdyI6WyJyb3ciLCJjb2wiLCJkZW5zZSIsInJvdy1kZW5zZSIsImNvbC1kZW5zZSJdfV0sImF1dG8tY29scyI6W3siYXV0by1jb2xzIjpbImF1dG8iLCJtaW4iLCJtYXgiLCJmciIsdmVdfV0sImF1dG8tcm93cyI6W3siYXV0by1yb3dzIjpbImF1dG8iLCJtaW4iLCJtYXgiLCJmciIsdmVdfV0sZ2FwOlt7Z2FwOltmXX1dLCJnYXAteCI6W3siZ2FwLXgiOltmXX1dLCJnYXAteSI6W3siZ2FwLXkiOltmXX1dLCJqdXN0aWZ5LWNvbnRlbnQiOlt7anVzdGlmeTpbIm5vcm1hbCIsLi4uaygpXX1dLCJqdXN0aWZ5LWl0ZW1zIjpbeyJqdXN0aWZ5LWl0ZW1zIjpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCJdfV0sImp1c3RpZnktc2VsZiI6W3sianVzdGlmeS1zZWxmIjpbImF1dG8iLCJzdGFydCIsImVuZCIsImNlbnRlciIsInN0cmV0Y2giXX1dLCJhbGlnbi1jb250ZW50Ijpbe2NvbnRlbnQ6WyJub3JtYWwiLC4uLmsoKSwiYmFzZWxpbmUiXX1dLCJhbGlnbi1pdGVtcyI6W3tpdGVtczpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYmFzZWxpbmUiLCJzdHJldGNoIl19XSwiYWxpZ24tc2VsZiI6W3tzZWxmOlsiYXV0byIsInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwic3RyZXRjaCIsImJhc2VsaW5lIl19XSwicGxhY2UtY29udGVudCI6W3sicGxhY2UtY29udGVudCI6Wy4uLmsoKSwiYmFzZWxpbmUiXX1dLCJwbGFjZS1pdGVtcyI6W3sicGxhY2UtaXRlbXMiOlsic3RhcnQiLCJlbmQiLCJjZW50ZXIiLCJiYXNlbGluZSIsInN0cmV0Y2giXX1dLCJwbGFjZS1zZWxmIjpbeyJwbGFjZS1zZWxmIjpbImF1dG8iLCJzdGFydCIsImVuZCIsImNlbnRlciIsInN0cmV0Y2giXX1dLHA6W3twOlt5XX1dLHB4Olt7cHg6W3ldfV0scHk6W3tweTpbeV19XSxwczpbe3BzOlt5XX1dLHBlOlt7cGU6W3ldfV0scHQ6W3twdDpbeV19XSxwcjpbe3ByOlt5XX1dLHBiOlt7cGI6W3ldfV0scGw6W3twbDpbeV19XSxtOlt7bTpbU119XSxteDpbe214OltTXX1dLG15Olt7bXk6W1NdfV0sbXM6W3ttczpbU119XSxtZTpbe21lOltTXX1dLG10Olt7bXQ6W1NdfV0sbXI6W3ttcjpbU119XSxtYjpbe21iOltTXX1dLG1sOlt7bWw6W1NdfV0sInNwYWNlLXgiOlt7InNwYWNlLXgiOltDXX1dLCJzcGFjZS14LXJldmVyc2UiOlsic3BhY2UteC1yZXZlcnNlIl0sInNwYWNlLXkiOlt7InNwYWNlLXkiOltDXX1dLCJzcGFjZS15LXJldmVyc2UiOlsic3BhY2UteS1yZXZlcnNlIl0sdzpbe3c6WyJhdXRvIiwibWluIiwibWF4IiwiZml0Iix2ZSx0XX1dLCJtaW4tdyI6W3sibWluLXciOlsibWluIiwibWF4IiwiZml0Iix2ZSxWbl19XSwibWF4LXciOlt7Im1heC13IjpbIjAiLCJub25lIiwiZnVsbCIsIm1pbiIsIm1heCIsImZpdCIsInByb3NlIix7c2NyZWVuOltub119LG5vLHZlXX1dLGg6W3toOlt2ZSx0LCJhdXRvIiwibWluIiwibWF4IiwiZml0Il19XSwibWluLWgiOlt7Im1pbi1oIjpbIm1pbiIsIm1heCIsImZpdCIsVm4sdmVdfV0sIm1heC1oIjpbeyJtYXgtaCI6W3ZlLHQsIm1pbiIsIm1heCIsImZpdCJdfV0sImZvbnQtc2l6ZSI6W3t0ZXh0OlsiYmFzZSIsbm8sdG9dfV0sImZvbnQtc21vb3RoaW5nIjpbImFudGlhbGlhc2VkIiwic3VicGl4ZWwtYW50aWFsaWFzZWQiXSwiZm9udC1zdHlsZSI6WyJpdGFsaWMiLCJub3QtaXRhbGljIl0sImZvbnQtd2VpZ2h0Ijpbe2ZvbnQ6WyJ0aGluIiwiZXh0cmFsaWdodCIsImxpZ2h0Iiwibm9ybWFsIiwibWVkaXVtIiwic2VtaWJvbGQiLCJib2xkIiwiZXh0cmFib2xkIiwiYmxhY2siLGN1XX1dLCJmb250LWZhbWlseSI6W3tmb250Olthc119XSwiZnZuLW5vcm1hbCI6WyJub3JtYWwtbnVtcyJdLCJmdm4tb3JkaW5hbCI6WyJvcmRpbmFsIl0sImZ2bi1zbGFzaGVkLXplcm8iOlsic2xhc2hlZC16ZXJvIl0sImZ2bi1maWd1cmUiOlsibGluaW5nLW51bXMiLCJvbGRzdHlsZS1udW1zIl0sImZ2bi1zcGFjaW5nIjpbInByb3BvcnRpb25hbC1udW1zIiwidGFidWxhci1udW1zIl0sImZ2bi1mcmFjdGlvbiI6WyJkaWFnb25hbC1mcmFjdGlvbnMiLCJzdGFja2VkLWZyYWN0b25zIl0sdHJhY2tpbmc6W3t0cmFja2luZzpbInRpZ2h0ZXIiLCJ0aWdodCIsIm5vcm1hbCIsIndpZGUiLCJ3aWRlciIsIndpZGVzdCIsdmVdfV0sImxpbmUtY2xhbXAiOlt7ImxpbmUtY2xhbXAiOlsibm9uZSIscW8sY3VdfV0sbGVhZGluZzpbe2xlYWRpbmc6WyJub25lIiwidGlnaHQiLCJzbnVnIiwibm9ybWFsIiwicmVsYXhlZCIsImxvb3NlIixWbix2ZV19XSwibGlzdC1pbWFnZSI6W3sibGlzdC1pbWFnZSI6WyJub25lIix2ZV19XSwibGlzdC1zdHlsZS10eXBlIjpbe2xpc3Q6WyJub25lIiwiZGlzYyIsImRlY2ltYWwiLHZlXX1dLCJsaXN0LXN0eWxlLXBvc2l0aW9uIjpbe2xpc3Q6WyJpbnNpZGUiLCJvdXRzaWRlIl19XSwicGxhY2Vob2xkZXItY29sb3IiOlt7cGxhY2Vob2xkZXI6W2VdfV0sInBsYWNlaG9sZGVyLW9wYWNpdHkiOlt7InBsYWNlaG9sZGVyLW9wYWNpdHkiOlt2XX1dLCJ0ZXh0LWFsaWdubWVudCI6W3t0ZXh0OlsibGVmdCIsImNlbnRlciIsInJpZ2h0IiwianVzdGlmeSIsInN0YXJ0IiwiZW5kIl19XSwidGV4dC1jb2xvciI6W3t0ZXh0OltlXX1dLCJ0ZXh0LW9wYWNpdHkiOlt7InRleHQtb3BhY2l0eSI6W3ZdfV0sInRleHQtZGVjb3JhdGlvbiI6WyJ1bmRlcmxpbmUiLCJvdmVybGluZSIsImxpbmUtdGhyb3VnaCIsIm5vLXVuZGVybGluZSJdLCJ0ZXh0LWRlY29yYXRpb24tc3R5bGUiOlt7ZGVjb3JhdGlvbjpbLi4uUCgpLCJ3YXZ5Il19XSwidGV4dC1kZWNvcmF0aW9uLXRoaWNrbmVzcyI6W3tkZWNvcmF0aW9uOlsiYXV0byIsImZyb20tZm9udCIsVm4sdG9dfV0sInVuZGVybGluZS1vZmZzZXQiOlt7InVuZGVybGluZS1vZmZzZXQiOlsiYXV0byIsVm4sdmVdfV0sInRleHQtZGVjb3JhdGlvbi1jb2xvciI6W3tkZWNvcmF0aW9uOltlXX1dLCJ0ZXh0LXRyYW5zZm9ybSI6WyJ1cHBlcmNhc2UiLCJsb3dlcmNhc2UiLCJjYXBpdGFsaXplIiwibm9ybWFsLWNhc2UiXSwidGV4dC1vdmVyZmxvdyI6WyJ0cnVuY2F0ZSIsInRleHQtZWxsaXBzaXMiLCJ0ZXh0LWNsaXAiXSxpbmRlbnQ6W3tpbmRlbnQ6RigpfV0sInZlcnRpY2FsLWFsaWduIjpbe2FsaWduOlsiYmFzZWxpbmUiLCJ0b3AiLCJtaWRkbGUiLCJib3R0b20iLCJ0ZXh0LXRvcCIsInRleHQtYm90dG9tIiwic3ViIiwic3VwZXIiLHZlXX1dLHdoaXRlc3BhY2U6W3t3aGl0ZXNwYWNlOlsibm9ybWFsIiwibm93cmFwIiwicHJlIiwicHJlLWxpbmUiLCJwcmUtd3JhcCIsImJyZWFrLXNwYWNlcyJdfV0sYnJlYWs6W3ticmVhazpbIm5vcm1hbCIsIndvcmRzIiwiYWxsIiwia2VlcCJdfV0saHlwaGVuczpbe2h5cGhlbnM6WyJub25lIiwibWFudWFsIiwiYXV0byJdfV0sY29udGVudDpbe2NvbnRlbnQ6WyJub25lIix2ZV19XSwiYmctYXR0YWNobWVudCI6W3tiZzpbImZpeGVkIiwibG9jYWwiLCJzY3JvbGwiXX1dLCJiZy1jbGlwIjpbeyJiZy1jbGlwIjpbImJvcmRlciIsInBhZGRpbmciLCJjb250ZW50IiwidGV4dCJdfV0sImJnLW9wYWNpdHkiOlt7ImJnLW9wYWNpdHkiOlt2XX1dLCJiZy1vcmlnaW4iOlt7ImJnLW9yaWdpbiI6WyJib3JkZXIiLCJwYWRkaW5nIiwiY29udGVudCJdfV0sImJnLXBvc2l0aW9uIjpbe2JnOlsuLi5YKCksV05dfV0sImJnLXJlcGVhdCI6W3tiZzpbIm5vLXJlcGVhdCIse3JlcGVhdDpbIiIsIngiLCJ5Iiwicm91bmQiLCJzcGFjZSJdfV19XSwiYmctc2l6ZSI6W3tiZzpbImF1dG8iLCJjb3ZlciIsImNvbnRhaW4iLEJOXX1dLCJiZy1pbWFnZSI6W3tiZzpbIm5vbmUiLHsiZ3JhZGllbnQtdG8iOlsidCIsInRyIiwiciIsImJyIiwiYiIsImJsIiwibCIsInRsIl19LFZOXX1dLCJiZy1jb2xvciI6W3tiZzpbZV19XSwiZ3JhZGllbnQtZnJvbS1wb3MiOlt7ZnJvbTpbZ119XSwiZ3JhZGllbnQtdmlhLXBvcyI6W3t2aWE6W2ddfV0sImdyYWRpZW50LXRvLXBvcyI6W3t0bzpbZ119XSwiZ3JhZGllbnQtZnJvbSI6W3tmcm9tOltoXX1dLCJncmFkaWVudC12aWEiOlt7dmlhOltoXX1dLCJncmFkaWVudC10byI6W3t0bzpbaF19XSxyb3VuZGVkOlt7cm91bmRlZDpbaV19XSwicm91bmRlZC1zIjpbeyJyb3VuZGVkLXMiOltpXX1dLCJyb3VuZGVkLWUiOlt7InJvdW5kZWQtZSI6W2ldfV0sInJvdW5kZWQtdCI6W3sicm91bmRlZC10IjpbaV19XSwicm91bmRlZC1yIjpbeyJyb3VuZGVkLXIiOltpXX1dLCJyb3VuZGVkLWIiOlt7InJvdW5kZWQtYiI6W2ldfV0sInJvdW5kZWQtbCI6W3sicm91bmRlZC1sIjpbaV19XSwicm91bmRlZC1zcyI6W3sicm91bmRlZC1zcyI6W2ldfV0sInJvdW5kZWQtc2UiOlt7InJvdW5kZWQtc2UiOltpXX1dLCJyb3VuZGVkLWVlIjpbeyJyb3VuZGVkLWVlIjpbaV19XSwicm91bmRlZC1lcyI6W3sicm91bmRlZC1lcyI6W2ldfV0sInJvdW5kZWQtdGwiOlt7InJvdW5kZWQtdGwiOltpXX1dLCJyb3VuZGVkLXRyIjpbeyJyb3VuZGVkLXRyIjpbaV19XSwicm91bmRlZC1iciI6W3sicm91bmRlZC1iciI6W2ldfV0sInJvdW5kZWQtYmwiOlt7InJvdW5kZWQtYmwiOltpXX1dLCJib3JkZXItdyI6W3tib3JkZXI6W3NdfV0sImJvcmRlci13LXgiOlt7ImJvcmRlci14Ijpbc119XSwiYm9yZGVyLXcteSI6W3siYm9yZGVyLXkiOltzXX1dLCJib3JkZXItdy1zIjpbeyJib3JkZXItcyI6W3NdfV0sImJvcmRlci13LWUiOlt7ImJvcmRlci1lIjpbc119XSwiYm9yZGVyLXctdCI6W3siYm9yZGVyLXQiOltzXX1dLCJib3JkZXItdy1yIjpbeyJib3JkZXItciI6W3NdfV0sImJvcmRlci13LWIiOlt7ImJvcmRlci1iIjpbc119XSwiYm9yZGVyLXctbCI6W3siYm9yZGVyLWwiOltzXX1dLCJib3JkZXItb3BhY2l0eSI6W3siYm9yZGVyLW9wYWNpdHkiOlt2XX1dLCJib3JkZXItc3R5bGUiOlt7Ym9yZGVyOlsuLi5QKCksImhpZGRlbiJdfV0sImRpdmlkZS14IjpbeyJkaXZpZGUteCI6W3NdfV0sImRpdmlkZS14LXJldmVyc2UiOlsiZGl2aWRlLXgtcmV2ZXJzZSJdLCJkaXZpZGUteSI6W3siZGl2aWRlLXkiOltzXX1dLCJkaXZpZGUteS1yZXZlcnNlIjpbImRpdmlkZS15LXJldmVyc2UiXSwiZGl2aWRlLW9wYWNpdHkiOlt7ImRpdmlkZS1vcGFjaXR5Ijpbdl19XSwiZGl2aWRlLXN0eWxlIjpbe2RpdmlkZTpQKCl9XSwiYm9yZGVyLWNvbG9yIjpbe2JvcmRlcjpbb119XSwiYm9yZGVyLWNvbG9yLXgiOlt7ImJvcmRlci14Ijpbb119XSwiYm9yZGVyLWNvbG9yLXkiOlt7ImJvcmRlci15Ijpbb119XSwiYm9yZGVyLWNvbG9yLXQiOlt7ImJvcmRlci10Ijpbb119XSwiYm9yZGVyLWNvbG9yLXIiOlt7ImJvcmRlci1yIjpbb119XSwiYm9yZGVyLWNvbG9yLWIiOlt7ImJvcmRlci1iIjpbb119XSwiYm9yZGVyLWNvbG9yLWwiOlt7ImJvcmRlci1sIjpbb119XSwiZGl2aWRlLWNvbG9yIjpbe2RpdmlkZTpbb119XSwib3V0bGluZS1zdHlsZSI6W3tvdXRsaW5lOlsiIiwuLi5QKCldfV0sIm91dGxpbmUtb2Zmc2V0IjpbeyJvdXRsaW5lLW9mZnNldCI6W1ZuLHZlXX1dLCJvdXRsaW5lLXciOlt7b3V0bGluZTpbVm4sdG9dfV0sIm91dGxpbmUtY29sb3IiOlt7b3V0bGluZTpbZV19XSwicmluZy13Ijpbe3Jpbmc6YWUoKX1dLCJyaW5nLXctaW5zZXQiOlsicmluZy1pbnNldCJdLCJyaW5nLWNvbG9yIjpbe3Jpbmc6W2VdfV0sInJpbmctb3BhY2l0eSI6W3sicmluZy1vcGFjaXR5Ijpbdl19XSwicmluZy1vZmZzZXQtdyI6W3sicmluZy1vZmZzZXQiOltWbix0b119XSwicmluZy1vZmZzZXQtY29sb3IiOlt7InJpbmctb2Zmc2V0IjpbZV19XSxzaGFkb3c6W3tzaGFkb3c6WyIiLCJpbm5lciIsIm5vbmUiLG5vLEhOXX1dLCJzaGFkb3ctY29sb3IiOlt7c2hhZG93Olthc119XSxvcGFjaXR5Olt7b3BhY2l0eTpbdl19XSwibWl4LWJsZW5kIjpbeyJtaXgtYmxlbmQiOk8oKX1dLCJiZy1ibGVuZCI6W3siYmctYmxlbmQiOk8oKX1dLGZpbHRlcjpbe2ZpbHRlcjpbIiIsIm5vbmUiXX1dLGJsdXI6W3tibHVyOltuXX1dLGJyaWdodG5lc3M6W3ticmlnaHRuZXNzOltyXX1dLGNvbnRyYXN0Olt7Y29udHJhc3Q6W2FdfV0sImRyb3Atc2hhZG93IjpbeyJkcm9wLXNoYWRvdyI6WyIiLCJub25lIixubyx2ZV19XSxncmF5c2NhbGU6W3tncmF5c2NhbGU6W3VdfV0sImh1ZS1yb3RhdGUiOlt7Imh1ZS1yb3RhdGUiOltjXX1dLGludmVydDpbe2ludmVydDpbZF19XSxzYXR1cmF0ZTpbe3NhdHVyYXRlOlt4XX1dLHNlcGlhOlt7c2VwaWE6W0VdfV0sImJhY2tkcm9wLWZpbHRlciI6W3siYmFja2Ryb3AtZmlsdGVyIjpbIiIsIm5vbmUiXX1dLCJiYWNrZHJvcC1ibHVyIjpbeyJiYWNrZHJvcC1ibHVyIjpbbl19XSwiYmFja2Ryb3AtYnJpZ2h0bmVzcyI6W3siYmFja2Ryb3AtYnJpZ2h0bmVzcyI6W3JdfV0sImJhY2tkcm9wLWNvbnRyYXN0IjpbeyJiYWNrZHJvcC1jb250cmFzdCI6W2FdfV0sImJhY2tkcm9wLWdyYXlzY2FsZSI6W3siYmFja2Ryb3AtZ3JheXNjYWxlIjpbdV19XSwiYmFja2Ryb3AtaHVlLXJvdGF0ZSI6W3siYmFja2Ryb3AtaHVlLXJvdGF0ZSI6W2NdfV0sImJhY2tkcm9wLWludmVydCI6W3siYmFja2Ryb3AtaW52ZXJ0IjpbZF19XSwiYmFja2Ryb3Atb3BhY2l0eSI6W3siYmFja2Ryb3Atb3BhY2l0eSI6W3ZdfV0sImJhY2tkcm9wLXNhdHVyYXRlIjpbeyJiYWNrZHJvcC1zYXR1cmF0ZSI6W3hdfV0sImJhY2tkcm9wLXNlcGlhIjpbeyJiYWNrZHJvcC1zZXBpYSI6W0VdfV0sImJvcmRlci1jb2xsYXBzZSI6W3tib3JkZXI6WyJjb2xsYXBzZSIsInNlcGFyYXRlIl19XSwiYm9yZGVyLXNwYWNpbmciOlt7ImJvcmRlci1zcGFjaW5nIjpbbF19XSwiYm9yZGVyLXNwYWNpbmcteCI6W3siYm9yZGVyLXNwYWNpbmcteCI6W2xdfV0sImJvcmRlci1zcGFjaW5nLXkiOlt7ImJvcmRlci1zcGFjaW5nLXkiOltsXX1dLCJ0YWJsZS1sYXlvdXQiOlt7dGFibGU6WyJhdXRvIiwiZml4ZWQiXX1dLGNhcHRpb246W3tjYXB0aW9uOlsidG9wIiwiYm90dG9tIl19XSx0cmFuc2l0aW9uOlt7dHJhbnNpdGlvbjpbIm5vbmUiLCJhbGwiLCIiLCJjb2xvcnMiLCJvcGFjaXR5Iiwic2hhZG93IiwidHJhbnNmb3JtIix2ZV19XSxkdXJhdGlvbjpbe2R1cmF0aW9uOnRlKCl9XSxlYXNlOlt7ZWFzZTpbImxpbmVhciIsImluIiwib3V0IiwiaW4tb3V0Iix2ZV19XSxkZWxheTpbe2RlbGF5OnRlKCl9XSxhbmltYXRlOlt7YW5pbWF0ZTpbIm5vbmUiLCJzcGluIiwicGluZyIsInB1bHNlIiwiYm91bmNlIix2ZV19XSx0cmFuc2Zvcm06W3t0cmFuc2Zvcm06WyIiLCJncHUiLCJub25lIl19XSxzY2FsZTpbe3NjYWxlOltfXX1dLCJzY2FsZS14IjpbeyJzY2FsZS14IjpbX119XSwic2NhbGUteSI6W3sic2NhbGUteSI6W19dfV0scm90YXRlOlt7cm90YXRlOltzcyx2ZV19XSwidHJhbnNsYXRlLXgiOlt7InRyYW5zbGF0ZS14IjpbVF19XSwidHJhbnNsYXRlLXkiOlt7InRyYW5zbGF0ZS15IjpbVF19XSwic2tldy14IjpbeyJza2V3LXgiOlskXX1dLCJza2V3LXkiOlt7InNrZXcteSI6WyRdfV0sInRyYW5zZm9ybS1vcmlnaW4iOlt7b3JpZ2luOlsiY2VudGVyIiwidG9wIiwidG9wLXJpZ2h0IiwicmlnaHQiLCJib3R0b20tcmlnaHQiLCJib3R0b20iLCJib3R0b20tbGVmdCIsImxlZnQiLCJ0b3AtbGVmdCIsdmVdfV0sYWNjZW50Olt7YWNjZW50OlsiYXV0byIsZV19XSxhcHBlYXJhbmNlOlsiYXBwZWFyYW5jZS1ub25lIl0sY3Vyc29yOlt7Y3Vyc29yOlsiYXV0byIsImRlZmF1bHQiLCJwb2ludGVyIiwid2FpdCIsInRleHQiLCJtb3ZlIiwiaGVscCIsIm5vdC1hbGxvd2VkIiwibm9uZSIsImNvbnRleHQtbWVudSIsInByb2dyZXNzIiwiY2VsbCIsImNyb3NzaGFpciIsInZlcnRpY2FsLXRleHQiLCJhbGlhcyIsImNvcHkiLCJuby1kcm9wIiwiZ3JhYiIsImdyYWJiaW5nIiwiYWxsLXNjcm9sbCIsImNvbC1yZXNpemUiLCJyb3ctcmVzaXplIiwibi1yZXNpemUiLCJlLXJlc2l6ZSIsInMtcmVzaXplIiwidy1yZXNpemUiLCJuZS1yZXNpemUiLCJudy1yZXNpemUiLCJzZS1yZXNpemUiLCJzdy1yZXNpemUiLCJldy1yZXNpemUiLCJucy1yZXNpemUiLCJuZXN3LXJlc2l6ZSIsIm53c2UtcmVzaXplIiwiem9vbS1pbiIsInpvb20tb3V0Iix2ZV19XSwiY2FyZXQtY29sb3IiOlt7Y2FyZXQ6W2VdfV0sInBvaW50ZXItZXZlbnRzIjpbeyJwb2ludGVyLWV2ZW50cyI6WyJub25lIiwiYXV0byJdfV0scmVzaXplOlt7cmVzaXplOlsibm9uZSIsInkiLCJ4IiwiIl19XSwic2Nyb2xsLWJlaGF2aW9yIjpbe3Njcm9sbDpbImF1dG8iLCJzbW9vdGgiXX1dLCJzY3JvbGwtbSI6W3sic2Nyb2xsLW0iOkYoKX1dLCJzY3JvbGwtbXgiOlt7InNjcm9sbC1teCI6RigpfV0sInNjcm9sbC1teSI6W3sic2Nyb2xsLW15IjpGKCl9XSwic2Nyb2xsLW1zIjpbeyJzY3JvbGwtbXMiOkYoKX1dLCJzY3JvbGwtbWUiOlt7InNjcm9sbC1tZSI6RigpfV0sInNjcm9sbC1tdCI6W3sic2Nyb2xsLW10IjpGKCl9XSwic2Nyb2xsLW1yIjpbeyJzY3JvbGwtbXIiOkYoKX1dLCJzY3JvbGwtbWIiOlt7InNjcm9sbC1tYiI6RigpfV0sInNjcm9sbC1tbCI6W3sic2Nyb2xsLW1sIjpGKCl9XSwic2Nyb2xsLXAiOlt7InNjcm9sbC1wIjpGKCl9XSwic2Nyb2xsLXB4IjpbeyJzY3JvbGwtcHgiOkYoKX1dLCJzY3JvbGwtcHkiOlt7InNjcm9sbC1weSI6RigpfV0sInNjcm9sbC1wcyI6W3sic2Nyb2xsLXBzIjpGKCl9XSwic2Nyb2xsLXBlIjpbeyJzY3JvbGwtcGUiOkYoKX1dLCJzY3JvbGwtcHQiOlt7InNjcm9sbC1wdCI6RigpfV0sInNjcm9sbC1wciI6W3sic2Nyb2xsLXByIjpGKCl9XSwic2Nyb2xsLXBiIjpbeyJzY3JvbGwtcGIiOkYoKX1dLCJzY3JvbGwtcGwiOlt7InNjcm9sbC1wbCI6RigpfV0sInNuYXAtYWxpZ24iOlt7c25hcDpbInN0YXJ0IiwiZW5kIiwiY2VudGVyIiwiYWxpZ24tbm9uZSJdfV0sInNuYXAtc3RvcCI6W3tzbmFwOlsibm9ybWFsIiwiYWx3YXlzIl19XSwic25hcC10eXBlIjpbe3NuYXA6WyJub25lIiwieCIsInkiLCJib3RoIl19XSwic25hcC1zdHJpY3RuZXNzIjpbe3NuYXA6WyJtYW5kYXRvcnkiLCJwcm94aW1pdHkiXX1dLHRvdWNoOlt7dG91Y2g6WyJhdXRvIiwibm9uZSIsIm1hbmlwdWxhdGlvbiJdfV0sInRvdWNoLXgiOlt7InRvdWNoLXBhbiI6WyJ4IiwibGVmdCIsInJpZ2h0Il19XSwidG91Y2gteSI6W3sidG91Y2gtcGFuIjpbInkiLCJ1cCIsImRvd24iXX1dLCJ0b3VjaC1weiI6WyJ0b3VjaC1waW5jaC16b29tIl0sc2VsZWN0Olt7c2VsZWN0Olsibm9uZSIsInRleHQiLCJhbGwiLCJhdXRvIl19XSwid2lsbC1jaGFuZ2UiOlt7IndpbGwtY2hhbmdlIjpbImF1dG8iLCJzY3JvbGwiLCJjb250ZW50cyIsInRyYW5zZm9ybSIsdmVdfV0sZmlsbDpbe2ZpbGw6W2UsIm5vbmUiXX1dLCJzdHJva2UtdyI6W3tzdHJva2U6W1ZuLHRvLGN1XX1dLHN0cm9rZTpbe3N0cm9rZTpbZSwibm9uZSJdfV0sc3I6WyJzci1vbmx5Iiwibm90LXNyLW9ubHkiXX0sY29uZmxpY3RpbmdDbGFzc0dyb3Vwczp7b3ZlcmZsb3c6WyJvdmVyZmxvdy14Iiwib3ZlcmZsb3cteSJdLG92ZXJzY3JvbGw6WyJvdmVyc2Nyb2xsLXgiLCJvdmVyc2Nyb2xsLXkiXSxpbnNldDpbImluc2V0LXgiLCJpbnNldC15Iiwic3RhcnQiLCJlbmQiLCJ0b3AiLCJyaWdodCIsImJvdHRvbSIsImxlZnQiXSwiaW5zZXQteCI6WyJyaWdodCIsImxlZnQiXSwiaW5zZXQteSI6WyJ0b3AiLCJib3R0b20iXSxmbGV4OlsiYmFzaXMiLCJncm93Iiwic2hyaW5rIl0sZ2FwOlsiZ2FwLXgiLCJnYXAteSJdLHA6WyJweCIsInB5IiwicHMiLCJwZSIsInB0IiwicHIiLCJwYiIsInBsIl0scHg6WyJwciIsInBsIl0scHk6WyJwdCIsInBiIl0sbTpbIm14IiwibXkiLCJtcyIsIm1lIiwibXQiLCJtciIsIm1iIiwibWwiXSxteDpbIm1yIiwibWwiXSxteTpbIm10IiwibWIiXSwiZm9udC1zaXplIjpbImxlYWRpbmciXSwiZnZuLW5vcm1hbCI6WyJmdm4tb3JkaW5hbCIsImZ2bi1zbGFzaGVkLXplcm8iLCJmdm4tZmlndXJlIiwiZnZuLXNwYWNpbmciLCJmdm4tZnJhY3Rpb24iXSwiZnZuLW9yZGluYWwiOlsiZnZuLW5vcm1hbCJdLCJmdm4tc2xhc2hlZC16ZXJvIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZpZ3VyZSI6WyJmdm4tbm9ybWFsIl0sImZ2bi1zcGFjaW5nIjpbImZ2bi1ub3JtYWwiXSwiZnZuLWZyYWN0aW9uIjpbImZ2bi1ub3JtYWwiXSxyb3VuZGVkOlsicm91bmRlZC1zIiwicm91bmRlZC1lIiwicm91bmRlZC10Iiwicm91bmRlZC1yIiwicm91bmRlZC1iIiwicm91bmRlZC1sIiwicm91bmRlZC1zcyIsInJvdW5kZWQtc2UiLCJyb3VuZGVkLWVlIiwicm91bmRlZC1lcyIsInJvdW5kZWQtdGwiLCJyb3VuZGVkLXRyIiwicm91bmRlZC1iciIsInJvdW5kZWQtYmwiXSwicm91bmRlZC1zIjpbInJvdW5kZWQtc3MiLCJyb3VuZGVkLWVzIl0sInJvdW5kZWQtZSI6WyJyb3VuZGVkLXNlIiwicm91bmRlZC1lZSJdLCJyb3VuZGVkLXQiOlsicm91bmRlZC10bCIsInJvdW5kZWQtdHIiXSwicm91bmRlZC1yIjpbInJvdW5kZWQtdHIiLCJyb3VuZGVkLWJyIl0sInJvdW5kZWQtYiI6WyJyb3VuZGVkLWJyIiwicm91bmRlZC1ibCJdLCJyb3VuZGVkLWwiOlsicm91bmRlZC10bCIsInJvdW5kZWQtYmwiXSwiYm9yZGVyLXNwYWNpbmciOlsiYm9yZGVyLXNwYWNpbmcteCIsImJvcmRlci1zcGFjaW5nLXkiXSwiYm9yZGVyLXciOlsiYm9yZGVyLXctcyIsImJvcmRlci13LWUiLCJib3JkZXItdy10IiwiYm9yZGVyLXctciIsImJvcmRlci13LWIiLCJib3JkZXItdy1sIl0sImJvcmRlci13LXgiOlsiYm9yZGVyLXctciIsImJvcmRlci13LWwiXSwiYm9yZGVyLXcteSI6WyJib3JkZXItdy10IiwiYm9yZGVyLXctYiJdLCJib3JkZXItY29sb3IiOlsiYm9yZGVyLWNvbG9yLXQiLCJib3JkZXItY29sb3ItciIsImJvcmRlci1jb2xvci1iIiwiYm9yZGVyLWNvbG9yLWwiXSwiYm9yZGVyLWNvbG9yLXgiOlsiYm9yZGVyLWNvbG9yLXIiLCJib3JkZXItY29sb3ItbCJdLCJib3JkZXItY29sb3IteSI6WyJib3JkZXItY29sb3ItdCIsImJvcmRlci1jb2xvci1iIl0sInNjcm9sbC1tIjpbInNjcm9sbC1teCIsInNjcm9sbC1teSIsInNjcm9sbC1tcyIsInNjcm9sbC1tZSIsInNjcm9sbC1tdCIsInNjcm9sbC1tciIsInNjcm9sbC1tYiIsInNjcm9sbC1tbCJdLCJzY3JvbGwtbXgiOlsic2Nyb2xsLW1yIiwic2Nyb2xsLW1sIl0sInNjcm9sbC1teSI6WyJzY3JvbGwtbXQiLCJzY3JvbGwtbWIiXSwic2Nyb2xsLXAiOlsic2Nyb2xsLXB4Iiwic2Nyb2xsLXB5Iiwic2Nyb2xsLXBzIiwic2Nyb2xsLXBlIiwic2Nyb2xsLXB0Iiwic2Nyb2xsLXByIiwic2Nyb2xsLXBiIiwic2Nyb2xsLXBsIl0sInNjcm9sbC1weCI6WyJzY3JvbGwtcHIiLCJzY3JvbGwtcGwiXSwic2Nyb2xsLXB5IjpbInNjcm9sbC1wdCIsInNjcm9sbC1wYiJdLHRvdWNoOlsidG91Y2gteCIsInRvdWNoLXkiLCJ0b3VjaC1weiJdLCJ0b3VjaC14IjpbInRvdWNoIl0sInRvdWNoLXkiOlsidG91Y2giXSwidG91Y2gtcHoiOlsidG91Y2giXX0sY29uZmxpY3RpbmdDbGFzc0dyb3VwTW9kaWZpZXJzOnsiZm9udC1zaXplIjpbImxlYWRpbmciXX19fWNvbnN0IFFOPU9OKFhOKTtmdW5jdGlvbiBvdCguLi5lKXtyZXR1cm4gUU4oeE4oZSkpfWNvbnN0IE9zPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLGNoaWxkcmVuOnQsLi4ubn0scik9PncuanN4cygkXyx7cmVmOnIsY2xhc3NOYW1lOm90KCJyZWxhdGl2ZSBvdmVyZmxvdy1oaWRkZW4iLGUpLC4uLm4sY2hpbGRyZW46W3cuanN4KHZOLHtjbGFzc05hbWU6ImgtZnVsbCB3LWZ1bGwgcm91bmRlZC1baW5oZXJpdF0iLGNoaWxkcmVuOnR9KSx3LmpzeChPXyx7fSksdy5qc3goeU4se30pXX0pKTtPcy5kaXNwbGF5TmFtZT0kXy5kaXNwbGF5TmFtZTtjb25zdCBPXz1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxvcmllbnRhdGlvbjp0PSJ2ZXJ0aWNhbCIsLi4ubn0scik9PncuanN4KHZfLHtyZWY6cixvcmllbnRhdGlvbjp0LGNsYXNzTmFtZTpvdCgiZmxleCB0b3VjaC1ub25lIHNlbGVjdC1ub25lIHRyYW5zaXRpb24tY29sb3JzIix0PT09InZlcnRpY2FsIiYmImgtZnVsbCB3LTIuNSBib3JkZXItbCBib3JkZXItbC10cmFuc3BhcmVudCBwLVsxcHhdIix0PT09Imhvcml6b250YWwiJiYiaC0yLjUgZmxleC1jb2wgYm9yZGVyLXQgYm9yZGVyLXQtdHJhbnNwYXJlbnQgcC1bMXB4XSIsZSksLi4ubixjaGlsZHJlbjp3LmpzeChkTix7Y2xhc3NOYW1lOm90KCJyZWxhdGl2ZSByb3VuZGVkLWZ1bGwgYmctYm9yZGVyIix0PT09InZlcnRpY2FsIiYmImZsZXgtMSIpfSl9KSk7T18uZGlzcGxheU5hbWU9dl8uZGlzcGxheU5hbWU7ZnVuY3Rpb24gQXMoe2NoaWxkcmVuOmV9KXtjb25zdCB0PXAudXNlUmVmKG51bGwpLG49cC51c2VSZWYobnVsbCkscj1wLnVzZVJlZighMSksbz1wLnVzZVJlZigwKSxpPXAudXNlUmVmKG51bGwpLGw9cC51c2VSZWYoMCkscz0oKT0+e3IuY3VycmVudD0hMSxpLmN1cnJlbnQ9bnVsbCxvLmN1cnJlbnQ9MCxsLmN1cnJlbnQ9MH0sYT1TPT57Uy5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IHY9aS5jdXJyZW50PT09ImxlZnQiP3Q6bjtpZih2LmN1cnJlbnQmJnIuY3VycmVudCl7Y29uc3QgeT1pLmN1cnJlbnQ9PT0ibGVmdCI/Uy5zY3JlZW5YLW8uY3VycmVudDpvLmN1cnJlbnQtUy5zY3JlZW5YO3YuY3VycmVudC5zdHlsZS53aWR0aD1gJHtNYXRoLm1heChsLmN1cnJlbnQreSwxNTApfXB4YH19LHU9Uz0+dj0+e2lmKHYudGFyZ2V0KXtjb25zdCB4PVM9PT0ibGVmdCI/dDpTPT09InJpZ2h0Ij9uOm51bGw7ci5jdXJyZW50PSEwLHgmJnguY3VycmVudCYmKG8uY3VycmVudD12LnNjcmVlblgsaS5jdXJyZW50PVMseC5jdXJyZW50JiYobC5jdXJyZW50PXguY3VycmVudC5vZmZzZXRXaWR0aCkpfX0sW2MsZCxmLGgsZyxtXT1wLkNoaWxkcmVuLnRvQXJyYXkoZSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT4oZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIscyksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixhKSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLHMpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsYSl9KSxbXSksdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaC1zY3JlZW4iLGNoaWxkcmVuOlt3LmpzeHMoImRpdiIse3JlZjp0LGNsYXNzTmFtZToicmVsYXRpdmUgYm9yZGVyLXIgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W3cuanN4cyhBcy5Db2x1bW4se2NoaWxkcmVuOltjLHcuanN4KE9zLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpkfSldfSksdy5qc3goImRpdiIse2NsYXNzTmFtZToiYWJzb2x1dGUgaW5zZXQteS0wIHJpZ2h0LTAgY3Vyc29yLWNvbC1yZXNpemUgdy1bMXB4XSBob3Zlcjp3LVszcHhdIGgtZnVsbCBob3ZlcjpiZy1ib3JkZXIiLG9uTW91c2VEb3duOnUoImxlZnQiKX0pXX0pLHcuanN4KCJkaXYiLHtjbGFzc05hbWU6cmQoIiIseyJ3LWZ1bGwiOiFnJiYhbX0pLGNoaWxkcmVuOncuanN4cyhBcy5Db2x1bW4se2NoaWxkcmVuOltmLHcuanN4KE9zLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjpofSldfSl9KSxnfHxtJiZ3LmpzeHMoImRpdiIse3JlZjpuLGNsYXNzTmFtZToicmVsYXRpdmUgaC1zY3JlZW4gYm9yZGVyLWwgYm9yZGVyLWJvcmRlciIsc3R5bGU6e3dpZHRoOjMwMH0sY2hpbGRyZW46W3cuanN4cyhBcy5Db2x1bW4se2NoaWxkcmVuOltnLHcuanN4KE9zLHtzdHlsZTp7aGVpZ2h0OiJjYWxjKDEwMHZoIC0gNTBweCkifSxjaGlsZHJlbjptfSldfSksdy5qc3goImRpdiIse29uTW91c2VEb3duOnUoInJpZ2h0IiksY2xhc3NOYW1lOiJhYnNvbHV0ZSBpbnNldC15LTAgbGVmdC0wIGN1cnNvci1jb2wtcmVzaXplIHctWzFweF0gYmctYm9yZGVyIGhvdmVyOnctWzNweF0gaG92ZXI6YmctYm9yZGVyIn0pXX0pXX0pfUFzLkNvbHVtbj0oe2NoaWxkcmVuOmV9KT0+e2NvbnN0W3Qsbl09cC5DaGlsZHJlbi50b0FycmF5KGUpO3JldHVybiB3LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCIsY2hpbGRyZW46W3cuanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGJvcmRlci1iIGJvcmRlci1ib3JkZXIiLGNoaWxkcmVuOnR9KSxuXX0pfTtjb25zdCBKTj0oe2NsYXNzTmFtZTplfSk9PncuanN4cygic3ZnIix7d2lkdGg6IjEyIixoZWlnaHQ6IjEyIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoibm9uZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixjbGFzc05hbWU6ZSxjaGlsZHJlbjpbdy5qc3hzKCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyNV8xNjM4KSIsY2hpbGRyZW46W3cuanN4KCJyZWN0Iix7eToiMC41Iix3aWR0aDoiOSIsaGVpZ2h0OiI5In0pLHcuanN4KCJwYXRoIix7ZDoiTTAgN0w4LjUgNSIsc3Ryb2tlOiJjdXJyZW50Q29sb3IifSksdy5qc3goImNpcmNsZSIse2N4OiIzIixjeToiMy41IixyOiIxIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSksdy5qc3goInJlY3QiLHt4OiIwLjUiLHk6IjEiLHdpZHRoOiI4IixoZWlnaHQ6IjgiLHN0cm9rZToiY3VycmVudENvbG9yIn0pLHcuanN4KCJkZWZzIix7Y2hpbGRyZW46dy5qc3goImNsaXBQYXRoIix7aWQ6ImNsaXAwXzEyMjVfMTYzOCIsY2hpbGRyZW46dy5qc3goInJlY3QiLHt5OiIwLjUiLHdpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIn0pfSl9KV19KSxBXz1KTixaTj0oe2NsYXNzTmFtZTplfSk9PncuanN4cygic3ZnIix7d2lkdGg6IjkiLGhlaWdodDoiMTAiLHZpZXdCb3g6IjAgMCA5IDEwIixjbGFzc05hbWU6ZSxmaWxsOiJjdXJyZW50Q29sb3IiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2hpbGRyZW46W3cuanN4cygiZyIse2NsaXBQYXRoOiJ1cmwoI2NsaXAwXzEyMjJfMTYxOCkiLGNoaWxkcmVuOlt3LmpzeCgicGF0aCIse2ZpbGxSdWxlOiJldmVub2RkIixjbGlwUnVsZToiZXZlbm9kZCIsZDoiTTkgMS41SDBWMC41SDlWMS41WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLHcuanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNOSA5LjVIMFY4LjVIOVY5LjVaIixmaWxsOiJjdXJyZW50Q29sb3IifSldfSksdy5qc3goImRlZnMiLHtjaGlsZHJlbjp3LmpzeCgiY2xpcFBhdGgiLHtpZDoiY2xpcDBfMTIyMl8xNjE4IixjaGlsZHJlbjp3LmpzeCgicmVjdCIse3dpZHRoOiI5IixoZWlnaHQ6IjkiLGZpbGw6IndoaXRlIix0cmFuc2Zvcm06InRyYW5zbGF0ZSgwIDAuNSkifSl9KX0pXX0pLHFOPVpOLGViPSh7Y2xhc3NOYW1lOmV9KT0+dy5qc3goInN2ZyIse3dpZHRoOiI5IixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgOSAxMCIsZmlsbDoiY3VycmVudENvbG9yIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTplLGNoaWxkcmVuOncuanN4KCJnIix7Y2xpcFBhdGg6InVybCgjY2xpcDBfMTIyOV8xNjI1KSIsY2hpbGRyZW46dy5qc3goInBhdGgiLHtkOiJNMC4wMTQ1NTEzIDAuNUg4Ljk4NTQ1TDkgMy4xODU2OUg4LjU3MDc0QzguNDMwMDcgMi4yMjc2IDguMDI3NDkgMS41Nzk0OCA3LjM2Mjk4IDEuMjQxMzNDNi45ODk0OSAxLjA1NDkxIDYuNDMxNjkgMC45NTMwMzUgNS42ODk1NyAwLjkzNTY5NFY3Ljk0NTgxQzUuNjg5NTcgOC40MzU2OSA1Ljc4NDE2IDguNzYwODQgNS45NzMzMiA4LjkyMTI0QzYuMTY3MzQgOS4wODE2NSA2LjU2NzUgOS4xNjE4NSA3LjE3MzgxIDkuMTYxODVWOS41SDEuODYyNTdWOS4xNjE4NUMyLjQ0NDYyIDkuMTYxODUgMi44MzAyMyA5LjA4MTY1IDMuMDE5NCA4LjkyMTI0QzMuMjEzNDIgOC43NTY1IDMuMzEwNDMgOC40MzEzNiAzLjMxMDQzIDcuOTQ1ODFWMC45MzU2OTRDMi41ODI4NiAwLjk1MzAzNSAyLjAyNTA2IDEuMDU0OTEgMS42MzcwMyAxLjI0MTMzQzAuOTI0MDEgMS41ODgxNSAwLjUyMTQyMyAyLjIzNjI3IDAuNDI5MjY0IDMuMTg1NjlIMEwwLjAxNDU1MTMgMC41WiJ9KX0pfSksdGI9ZWI7ZnVuY3Rpb24gTV8oe2NoaWxkcmVuOmUscm9vdFBhdGg6dH0pe3JldHVybiB3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIHctZnVsbCBweS0yIHRleHQteHMiLGNoaWxkcmVuOnAuQ2hpbGRyZW4ubWFwKGUsbj0+cC5jbG9uZUVsZW1lbnQobix7cGF0aHM6W3RdfSkpfSl9TV8uTm9kZT0oe2NoaWxkcmVuOmUscGF0aHM6dD1bXSxwYXRoOm4sbGV2ZWw6cj0xLHR5cGU6byxzZXRBY3RpdmVQYXRoOml9KT0+e2NvbnN0IGw9ciozMCxzPW89PT0ic3RyaW5nIj93LmpzeCh0Yix7fSk6bz09PSJpbWFnZSI/dy5qc3goQV8se2NsYXNzTmFtZToiaC1bOXB4XSB3LVs5cHhdIn0pOncuanN4KHFOLHt9KTtyZXR1cm4gdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InctZnVsbCIsY2hpbGRyZW46W3cuanN4KCJidXR0b24iLHtjbGFzc05hbWU6ImZsZXgganVzdGlmeS1iZXR3ZWVuIHctZnVsbCBncm91cCBweS0yIHRleHQteHMgZm9udC1bNDAwXSBzaHJpbmstMCIsb25DbGljazooKT0+e2kmJmkobil9LHN0eWxlOntwYWRkaW5nTGVmdDpsfSxjaGlsZHJlbjp3LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltzLHcuanN4KCJwIix7Y2hpbGRyZW46bn0pXX0pfSksZSYmdy5qc3gody5GcmFnbWVudCx7Y2hpbGRyZW46cC5DaGlsZHJlbi5tYXAoZSxhPT5wLmNsb25lRWxlbWVudChhLHtsZXZlbDpyKzEscGF0aHM6Wy4uLnQsbl19KSl9KV19KX07Y29uc3QgbmI9L15kYXRhOihpbWFnZVwvKHBuZ3xqcGVnfGpwZ3xnaWZ8d2VicHxibXB8dGlmZnxpY298c3ZnXCt4bWwpKTtiYXNlNjQsLztmdW5jdGlvbiBSZyhlKXtjb25zdCB0PW5iLmV4ZWMoZSk7aWYodCYmdFsxXSlyZXR1cm4gdFsxXX1mdW5jdGlvbiBQZyhlKXtyZXR1cm4gZT09PSJpbWFnZS9zdmcreG1sIj8ic3ZnIjplPT09ImltYWdlL3ZuZC5taWNyb3NvZnQuaWNvbiI/ImljbyI6ZS5zdGFydHNXaXRoKCJpbWFnZS8iKT9lLnNsaWNlKDYpOmV9dmFyIGxuPXt9LEQ9e307bGV0IGxkPXt9LERfPXt9LGNhPXt9LE1zPXt9LExoPXt9LGNsPXt9LE9nPXt9LEloPXt9LGRhPXt9LGZhPXt9LGdvPXt9LEFnPXt9LE1nPXt9LExfPXt9LElfPXt9LGpfPXt9LHpfPXt9LEZfPXt9LEJfPXt9LFdfPXt9LHBjPXt9LFVfPXt9LFZfPXt9LEhfPXt9LEtfPXt9LEdfPXt9LFlfPXt9LFhfPXt9LFFfPXt9LEpfPXt9LERnPXt9LExnPXt9LGpoPXt9LFpfPXt9LHFfPXt9LGV3PXt9O2Z1bmN0aW9uIFUoZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWxldCBHcj10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIscmI9R3ImJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQ/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOm51bGwsV3Q9R3ImJi9NYWN8aVBvZHxpUGhvbmV8aVBhZC8udGVzdChuYXZpZ2F0b3IucGxhdGZvcm0pLGJvPUdyJiYvXig/IS4qU2VhbW9ua2V5KSg/PS4qRmlyZWZveCkuKi9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksZ2M9R3ImJiJJbnB1dEV2ZW50ImluIHdpbmRvdyYmIXJiPyJnZXRUYXJnZXRSYW5nZXMiaW4gbmV3IHdpbmRvdy5JbnB1dEV2ZW50KCJpbnB1dCIpOiExLElnPUdyJiYvVmVyc2lvblwvW1xkLl0rLipTYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksc2Q9R3ImJi9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhd2luZG93Lk1TU3RyZWFtLG9iPUdyJiYvXig/PS4qQ2hyb21lKS4qL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxqZz1HciYmL0FwcGxlV2ViS2l0XC9bXGQuXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFvYixhZD1JZ3x8c2R8fGpnPyLCoCI6IuKAiyIsaWI9Ym8/IsKgIjphZCxsYj0vXlteQS1aYS16XHUwMGMwLVx1MDBkNlx1MDBkOC1cdTAwZjZcdTAwZjgtXHUwMmI4XHUwMzAwLVx1MDU5MFx1MDgwMC1cdTFmZmZcdTIwMGVcdTJjMDAtXHVmYjFjXHVmZTAwLVx1ZmU2Zlx1ZmVmZC1cdWZmZmZdKltcdTA1OTEtXHUwN2ZmXHVmYjFkLVx1ZmRmZFx1ZmU3MC1cdWZlZmNdLyxzYj0vXlteXHUwNTkxLVx1MDdmZlx1ZmIxZC1cdWZkZmRcdWZlNzAtXHVmZWZjXSpbQS1aYS16XHUwMGMwLVx1MDBkNlx1MDBkOC1cdTAwZjZcdTAwZjgtXHUwMmI4XHUwMzAwLVx1MDU5MFx1MDgwMC1cdTFmZmZcdTIwMGVcdTJjMDAtXHVmYjFjXHVmZTAwLVx1ZmU2Zlx1ZmVmZC1cdWZmZmZdLyxvaT17Ym9sZDoxLGNvZGU6MTYsaGlnaGxpZ2h0OjEyOCxpdGFsaWM6MixzdHJpa2V0aHJvdWdoOjQsc3Vic2NyaXB0OjMyLHN1cGVyc2NyaXB0OjY0LHVuZGVybGluZTo4fSxhYj17ZGlyZWN0aW9ubGVzczoxLHVubWVyZ2VhYmxlOjJ9LG95PXtjZW50ZXI6MixlbmQ6NixqdXN0aWZ5OjQsbGVmdDoxLHJpZ2h0OjMsc3RhcnQ6NX0sdWI9ezI6ImNlbnRlciIsNjoiZW5kIiw0OiJqdXN0aWZ5IiwxOiJsZWZ0IiwzOiJyaWdodCIsNToic3RhcnQifSxjYj17bm9ybWFsOjAsc2VnbWVudGVkOjIsdG9rZW46MX0sZGI9ezA6Im5vcm1hbCIsMjoic2VnbWVudGVkIiwxOiJ0b2tlbiJ9LHpoPSExLHpnPTA7ZnVuY3Rpb24gZmIoZSl7emc9ZS50aW1lU3RhbXB9ZnVuY3Rpb24gZmYoZSx0LG4pe3JldHVybiB0Ll9fbGV4aWNhbExpbmVCcmVhaz09PWV8fGVbYF9fbGV4aWNhbEtleV8ke24uX2tleX1gXSE9PXZvaWQgMH1mdW5jdGlvbiBoYihlKXtyZXR1cm4gZS5nZXRFZGl0b3JTdGF0ZSgpLnJlYWQoKCk9PntsZXQgdD1LZSgpO3JldHVybiB0IT09bnVsbD90LmNsb25lKCk6bnVsbH0pfWZ1bmN0aW9uIHR3KGUsdCxuKXt6aD0hMDtsZXQgcj0xMDA8cGVyZm9ybWFuY2Uubm93KCktemc7dHJ5e2tuKGUsKCk9PntsZXQgbz1LZSgpfHxoYihlKTt2YXIgaT1uZXcgTWFwLGw9ZS5nZXRSb290RWxlbWVudCgpLHM9ZS5fZWRpdG9yU3RhdGUsYT1lLl9ibG9ja0N1cnNvckVsZW1lbnQ7bGV0IHU9ITEsYz0iIjtmb3IodmFyIGQ9MDtkPHQubGVuZ3RoO2QrKyl7dmFyIGY9dFtkXSxoPWYudHlwZSxnPWYudGFyZ2V0LG09TWEoZyxzKTtpZighKG09PT1udWxsJiZnIT09bHx8VmUobSkpKXtpZihoPT09ImNoYXJhY3RlckRhdGEiKXtpZihmPXImJlEobSkpZTp7Zj1vLGg9Zzt2YXIgUz1tO2lmKGRlKGYpKXt2YXIgdj1mLmFuY2hvci5nZXROb2RlKCk7aWYodi5pcyhTKSYmZi5mb3JtYXQhPT12LmdldEZvcm1hdCgpKXtmPSExO2JyZWFrIGV9fWY9aC5ub2RlVHlwZT09PTMmJlMuaXNBdHRhY2hlZCgpfWYmJihTPUVyKGUuX3dpbmRvdyksaD1mPW51bGwsUyE9PW51bGwmJlMuYW5jaG9yTm9kZT09PWcmJihmPVMuYW5jaG9yT2Zmc2V0LGg9Uy5mb2N1c09mZnNldCksZz1nLm5vZGVWYWx1ZSxnIT09bnVsbCYmSGcobSxnLGYsaCwhMSkpfWVsc2UgaWYoaD09PSJjaGlsZExpc3QiKXtmb3IodT0hMCxoPWYuYWRkZWROb2RlcyxTPTA7UzxoLmxlbmd0aDtTKyspe3Y9aFtTXTt2YXIgeT1hdyh2KSx4PXYucGFyZW50Tm9kZTt4PT1udWxsfHx2PT09YXx8eSE9PW51bGx8fHYubm9kZU5hbWU9PT0iQlIiJiZmZih2LHgsZSl8fChibyYmKHk9di5pbm5lclRleHR8fHYubm9kZVZhbHVlKSYmKGMrPXkpLHgucmVtb3ZlQ2hpbGQodikpfWlmKGY9Zi5yZW1vdmVkTm9kZXMsaD1mLmxlbmd0aCwwPGgpe2ZvcihTPTAsdj0wO3Y8aDt2KyspeD1mW3ZdLCh4Lm5vZGVOYW1lPT09IkJSIiYmZmYoeCxnLGUpfHxhPT09eCkmJihnLmFwcGVuZENoaWxkKHgpLFMrKyk7aCE9PVMmJihnPT09bCYmKG09cy5fbm9kZU1hcC5nZXQoInJvb3QiKSksaS5zZXQoZyxtKSl9fX19aWYoMDxpLnNpemUpZm9yKGxldFtfLEVdb2YgaSlpZihCKEUpKWZvcihpPUUuZ2V0Q2hpbGRyZW5LZXlzKCksbD1fLmZpcnN0Q2hpbGQscz0wO3M8aS5sZW5ndGg7cysrKWE9ZS5nZXRFbGVtZW50QnlLZXkoaVtzXSksYSE9PW51bGwmJihsPT1udWxsPyhfLmFwcGVuZENoaWxkKGEpLGw9YSk6bCE9PWEmJl8ucmVwbGFjZUNoaWxkKGEsbCksbD1sLm5leHRTaWJsaW5nKTtlbHNlIFEoRSkmJkUubWFya0RpcnR5KCk7aWYoaT1uLnRha2VSZWNvcmRzKCksMDxpLmxlbmd0aCl7Zm9yKGw9MDtsPGkubGVuZ3RoO2wrKylmb3IoYT1pW2xdLHM9YS5hZGRlZE5vZGVzLGE9YS50YXJnZXQsZD0wO2Q8cy5sZW5ndGg7ZCsrKW09c1tkXSxnPW0ucGFyZW50Tm9kZSxnPT1udWxsfHxtLm5vZGVOYW1lIT09IkJSInx8ZmYobSxhLGUpfHxnLnJlbW92ZUNoaWxkKG0pO24udGFrZVJlY29yZHMoKX1vIT09bnVsbCYmKHUmJihvLmRpcnR5PSEwLHZyKG8pKSxibyYmZncoZSkmJm8uaW5zZXJ0UmF3VGV4dChjKSl9KX1maW5hbGx5e3poPSExfX1mdW5jdGlvbiBudyhlKXtsZXQgdD1lLl9vYnNlcnZlcjtpZih0IT09bnVsbCl7bGV0IG49dC50YWtlUmVjb3JkcygpO3R3KGUsbix0KX19ZnVuY3Rpb24gcncoZSl7emc9PT0wJiZjZChlKS5hZGRFdmVudExpc3RlbmVyKCJ0ZXh0SW5wdXQiLGZiLCEwKSxlLl9vYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcigodCxuKT0+e3R3KGUsdCxuKX0pfWZ1bmN0aW9uIGl5KGUsdCl7bGV0IG49ZS5fX21vZGUscj1lLl9fZm9ybWF0O2U9ZS5fX3N0eWxlO2xldCBvPXQuX19tb2RlLGk9dC5fX2Zvcm1hdDtyZXR1cm4gdD10Ll9fc3R5bGUsKG49PT1udWxsfHxuPT09bykmJihyPT09bnVsbHx8cj09PWkpJiYoZT09PW51bGx8fGU9PT10KX1mdW5jdGlvbiBseShlLHQpe2xldCBuPWUubWVyZ2VXaXRoU2libGluZyh0KSxyPWV0KCkuX25vcm1hbGl6ZWROb2RlcztyZXR1cm4gci5hZGQoZS5fX2tleSksci5hZGQodC5fX2tleSksbn1mdW5jdGlvbiBvdyhlKXtpZihlLl9fdGV4dD09PSIiJiZlLmlzU2ltcGxlVGV4dCgpJiYhZS5pc1VubWVyZ2VhYmxlKCkpZS5yZW1vdmUoKTtlbHNle2Zvcih2YXIgdDsodD1lLmdldFByZXZpb3VzU2libGluZygpKSE9PW51bGwmJlEodCkmJnQuaXNTaW1wbGVUZXh0KCkmJiF0LmlzVW5tZXJnZWFibGUoKTspaWYodC5fX3RleHQ9PT0iIil0LnJlbW92ZSgpO2Vsc2V7aXkodCxlKSYmKGU9bHkodCxlKSk7YnJlYWt9Zm9yKHZhciBuOyhuPWUuZ2V0TmV4dFNpYmxpbmcoKSkhPT1udWxsJiZRKG4pJiZuLmlzU2ltcGxlVGV4dCgpJiYhbi5pc1VubWVyZ2VhYmxlKCk7KWlmKG4uX190ZXh0PT09IiIpbi5yZW1vdmUoKTtlbHNle2l5KGUsbikmJmx5KGUsbik7YnJlYWt9fX1mdW5jdGlvbiBGZyhlKXtyZXR1cm4gc3koZS5hbmNob3IpLHN5KGUuZm9jdXMpLGV9ZnVuY3Rpb24gc3koZSl7Zm9yKDtlLnR5cGU9PT0iZWxlbWVudCI7KXt2YXIgdD1lLmdldE5vZGUoKSxuPWUub2Zmc2V0O2lmKG49PT10LmdldENoaWxkcmVuU2l6ZSgpPyh0PXQuZ2V0Q2hpbGRBdEluZGV4KG4tMSksbj0hMCk6KHQ9dC5nZXRDaGlsZEF0SW5kZXgobiksbj0hMSksUSh0KSl7ZS5zZXQodC5fX2tleSxuP3QuZ2V0VGV4dENvbnRlbnRTaXplKCk6MCwidGV4dCIpO2JyZWFrfWVsc2UgaWYoIUIodCkpYnJlYWs7ZS5zZXQodC5fX2tleSxuP3QuZ2V0Q2hpbGRyZW5TaXplKCk6MCwiZWxlbWVudCIpfX1sZXQgcGI9MSxnYj10eXBlb2YgcXVldWVNaWNyb3Rhc2s9PSJmdW5jdGlvbiI/cXVldWVNaWNyb3Rhc2s6ZT0+e1Byb21pc2UucmVzb2x2ZSgpLnRoZW4oZSl9O2Z1bmN0aW9uIEJnKGUpe2xldCB0PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYodD09PW51bGwpcmV0dXJuITE7bGV0IG49dC5ub2RlTmFtZTtyZXR1cm4gVmUoTWEoZSkpJiYobj09PSJJTlBVVCJ8fG49PT0iVEVYVEFSRUEifHx0LmNvbnRlbnRFZGl0YWJsZT09PSJ0cnVlIiYmdC5fX2xleGljYWxFZGl0b3I9PW51bGwpfWZ1bmN0aW9uIEFhKGUsdCxuKXtsZXQgcj1lLmdldFJvb3RFbGVtZW50KCk7dHJ5e3JldHVybiByIT09bnVsbCYmci5jb250YWlucyh0KSYmci5jb250YWlucyhuKSYmdCE9PW51bGwmJiFCZyh0KSYmV2codCk9PT1lfWNhdGNoe3JldHVybiExfX1mdW5jdGlvbiBXZyhlKXtmb3IoO2UhPW51bGw7KXtsZXQgdD1lLl9fbGV4aWNhbEVkaXRvcjtpZih0IT1udWxsKXJldHVybiB0O2U9dWQoZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gRmgoZSl7cmV0dXJuIGUuaXNUb2tlbigpfHxlLmlzU2VnbWVudGVkKCl9ZnVuY3Rpb24gbWMoZSl7Zm9yKDtlIT1udWxsOyl7aWYoZS5ub2RlVHlwZT09PTMpcmV0dXJuIGU7ZT1lLmZpcnN0Q2hpbGR9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaXcoZSx0LG4pe3JldHVybiB0PW9pW3RdLGUmdCYmKG49PT1udWxsfHwhKG4mdCkpP2VedDpuPT09bnVsbHx8biZ0P2V8dDplfWZ1bmN0aW9uIGx3KGUpe3JldHVybiBRKGUpfHxtYShlKXx8VmUoZSl9ZnVuY3Rpb24gc3coZSx0KXtpZih0IT1udWxsKWUuX19rZXk9dDtlbHNle1p0KCksOTk8dmEmJlUoMTQpLHQ9ZXQoKTt2YXIgbj1DcigpLHI9IiIrcGIrKztuLl9ub2RlTWFwLnNldChyLGUpLEIoZSk/dC5fZGlydHlFbGVtZW50cy5zZXQociwhMCk6dC5fZGlydHlMZWF2ZXMuYWRkKHIpLHQuX2Nsb25lTm90TmVlZGVkLmFkZChyKSx0Ll9kaXJ0eVR5cGU9MSxlLl9fa2V5PXJ9fWZ1bmN0aW9uIGlpKGUpe3ZhciB0PWUuZ2V0UGFyZW50KCk7aWYodCE9PW51bGwpe2xldCBvPWUuZ2V0V3JpdGFibGUoKTt0PXQuZ2V0V3JpdGFibGUoKTt2YXIgbj1lLmdldFByZXZpb3VzU2libGluZygpO2lmKGU9ZS5nZXROZXh0U2libGluZygpLG49PT1udWxsKWlmKGUhPT1udWxsKXt2YXIgcj1lLmdldFdyaXRhYmxlKCk7dC5fX2ZpcnN0PWUuX19rZXksci5fX3ByZXY9bnVsbH1lbHNlIHQuX19maXJzdD1udWxsO2Vsc2V7aWYocj1uLmdldFdyaXRhYmxlKCksZSE9PW51bGwpe2xldCBpPWUuZ2V0V3JpdGFibGUoKTtpLl9fcHJldj1yLl9fa2V5LHIuX19uZXh0PWkuX19rZXl9ZWxzZSByLl9fbmV4dD1udWxsO28uX19wcmV2PW51bGx9ZT09PW51bGw/biE9PW51bGw/KGU9bi5nZXRXcml0YWJsZSgpLHQuX19sYXN0PW4uX19rZXksZS5fX25leHQ9bnVsbCk6dC5fX2xhc3Q9bnVsbDooZT1lLmdldFdyaXRhYmxlKCksbiE9PW51bGw/KG49bi5nZXRXcml0YWJsZSgpLG4uX19uZXh0PWUuX19rZXksZS5fX3ByZXY9bi5fX2tleSk6ZS5fX3ByZXY9bnVsbCxvLl9fbmV4dD1udWxsKSx0Ll9fc2l6ZS0tLG8uX19wYXJlbnQ9bnVsbH19ZnVuY3Rpb24gdmMoZSl7OTk8dmEmJlUoMTQpO3ZhciB0PWUuZ2V0TGF0ZXN0KCksbj10Ll9fcGFyZW50LHI9Q3IoKTtsZXQgbz1ldCgpLGk9ci5fbm9kZU1hcDtpZihyPW8uX2RpcnR5RWxlbWVudHMsbiE9PW51bGwpZTpmb3IoO24hPT1udWxsOyl7aWYoci5oYXMobikpYnJlYWsgZTtsZXQgbD1pLmdldChuKTtpZihsPT09dm9pZCAwKWJyZWFrO3Iuc2V0KG4sITEpLG49bC5fX3BhcmVudH10PXQuX19rZXksby5fZGlydHlUeXBlPTEsQihlKT9yLnNldCh0LCEwKTpvLl9kaXJ0eUxlYXZlcy5hZGQodCl9ZnVuY3Rpb24gTXQoZSl7WnQoKTt2YXIgdD1ldCgpO2xldCBuPXQuX2NvbXBvc2l0aW9uS2V5O2UhPT1uJiYodC5fY29tcG9zaXRpb25LZXk9ZSxuIT09bnVsbCYmKHQ9JHQobiksdCE9PW51bGwmJnQuZ2V0V3JpdGFibGUoKSksZSE9PW51bGwmJihlPSR0KGUpLGUhPT1udWxsJiZlLmdldFdyaXRhYmxlKCkpKX1mdW5jdGlvbiBtbygpe3JldHVybiBCbCgpP251bGw6ZXQoKS5fY29tcG9zaXRpb25LZXl9ZnVuY3Rpb24gJHQoZSx0KXtyZXR1cm4gZT0odHx8Q3IoKSkuX25vZGVNYXAuZ2V0KGUpLGU9PT12b2lkIDA/bnVsbDplfWZ1bmN0aW9uIGF3KGUsdCl7bGV0IG49ZXQoKTtyZXR1cm4gZT1lW2BfX2xleGljYWxLZXlfJHtuLl9rZXl9YF0sZSE9PXZvaWQgMD8kdChlLHQpOm51bGx9ZnVuY3Rpb24gTWEoZSx0KXtmb3IoO2UhPW51bGw7KXtsZXQgbj1hdyhlLHQpO2lmKG4hPT1udWxsKXJldHVybiBuO2U9dWQoZSl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gdXcoZSl7bGV0IHQ9T2JqZWN0LmFzc2lnbih7fSxlLl9kZWNvcmF0b3JzKTtyZXR1cm4gZS5fcGVuZGluZ0RlY29yYXRvcnM9dH1mdW5jdGlvbiBheShlKXtyZXR1cm4gZS5yZWFkKCgpPT5TcigpLmdldFRleHRDb250ZW50KCkpfWZ1bmN0aW9uIG1iKGUsdCl7a24oZSwoKT0+e3ZhciBuPUNyKCk7aWYoIW4uaXNFbXB0eSgpKWlmKHQ9PT0icm9vdCIpU3IoKS5tYXJrRGlydHkoKTtlbHNle249bi5fbm9kZU1hcDtmb3IobGV0WyxyXW9mIG4pci5tYXJrRGlydHkoKX19LGUuX3BlbmRpbmdFZGl0b3JTdGF0ZT09PW51bGw/e3RhZzoiaGlzdG9yeS1tZXJnZSJ9OnZvaWQgMCl9ZnVuY3Rpb24gU3IoKXtyZXR1cm4gQ3IoKS5fbm9kZU1hcC5nZXQoInJvb3QiKX1mdW5jdGlvbiB2cihlKXtadCgpO2xldCB0PUNyKCk7ZSE9PW51bGwmJihlLmRpcnR5PSEwLGUuX2NhY2hlZE5vZGVzPW51bGwpLHQuX3NlbGVjdGlvbj1lfWZ1bmN0aW9uIGVsKGUpe3ZhciB0PWV0KCksbjtlOntmb3Iobj1lO24hPW51bGw7KXtsZXQgcj1uW2BfX2xleGljYWxLZXlfJHt0Ll9rZXl9YF07aWYociE9PXZvaWQgMCl7bj1yO2JyZWFrIGV9bj11ZChuKX1uPW51bGx9cmV0dXJuIG49PT1udWxsPyh0PXQuZ2V0Um9vdEVsZW1lbnQoKSxlPT09dD8kdCgicm9vdCIpOm51bGwpOiR0KG4pfWZ1bmN0aW9uIGN3KGUpe3JldHVybi9bXHVEODAwLVx1REJGRl1bXHVEQzAwLVx1REZGRl0vZy50ZXN0KGUpfWZ1bmN0aW9uIFVnKGUpe2xldCB0PVtdO2Zvcig7ZSE9PW51bGw7KXQucHVzaChlKSxlPWUuX3BhcmVudEVkaXRvcjtyZXR1cm4gdH1mdW5jdGlvbiBkdygpe3JldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5yZXBsYWNlKC9bXmEtel0rL2csIiIpLnN1YnN0cigwLDUpfWZ1bmN0aW9uIFZnKGUsdCxuKXtpZih0PUVyKHQuX3dpbmRvdyksdCE9PW51bGwpe3ZhciByPXQuYW5jaG9yTm9kZSx7YW5jaG9yT2Zmc2V0Om8sZm9jdXNPZmZzZXQ6aX09dDtpZihyIT09bnVsbCYmKHQ9ci5ub2RlVHlwZT09PTM/ci5ub2RlVmFsdWU6bnVsbCxyPU1hKHIpLHQhPT1udWxsJiZRKHIpKSl7aWYodD09PWFkJiZuKXtsZXQgbD1uLmxlbmd0aDt0PW4saT1vPWx9dCE9PW51bGwmJkhnKHIsdCxvLGksZSl9fX1mdW5jdGlvbiBIZyhlLHQsbixyLG8pe2xldCBpPWU7aWYoaS5pc0F0dGFjaGVkKCkmJihvfHwhaS5pc0RpcnR5KCkpKXtsZXQgdT1pLmlzQ29tcG9zaW5nKCksYz10O2lmKCh1fHxvKSYmdFt0Lmxlbmd0aC0xXT09PWFkJiYoYz10LnNsaWNlKDAsLTEpKSx0PWkuZ2V0VGV4dENvbnRlbnQoKSxvfHxjIT09dClpZihjPT09IiIpaWYoTXQobnVsbCksSWd8fHNkfHxqZylpLnJlbW92ZSgpO2Vsc2V7bGV0IGQ9ZXQoKTtzZXRUaW1lb3V0KCgpPT57ZC51cGRhdGUoKCk9PntpLmlzQXR0YWNoZWQoKSYmaS5yZW1vdmUoKX0pfSwyMCl9ZWxzZXtvPWkuZ2V0UGFyZW50KCksdD1GbCgpO3ZhciBsPWkuZ2V0VGV4dENvbnRlbnRTaXplKCkscz1tbygpLGE9aS5nZXRLZXkoKTtpLmlzVG9rZW4oKXx8cyE9PW51bGwmJmE9PT1zJiYhdXx8ZGUodCkmJihvIT09bnVsbCYmIW8uY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZ0LmFuY2hvci5vZmZzZXQ9PT0wfHx0LmFuY2hvci5rZXk9PT1lLl9fa2V5JiZ0LmFuY2hvci5vZmZzZXQ9PT0wJiYhaS5jYW5JbnNlcnRUZXh0QmVmb3JlKCl8fHQuZm9jdXMua2V5PT09ZS5fX2tleSYmdC5mb2N1cy5vZmZzZXQ9PT1sJiYhaS5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSk/aS5tYXJrRGlydHkoKTooZT1LZSgpLGRlKGUpJiZuIT09bnVsbCYmciE9PW51bGwmJihlLnNldFRleHROb2RlUmFuZ2UoaSxuLGksciksaS5pc1NlZ21lbnRlZCgpJiYobj1pLmdldFRleHRDb250ZW50KCksbj1FdChuKSxpLnJlcGxhY2UobiksaT1uKSksaS5zZXRUZXh0Q29udGVudChjKSl9fX1mdW5jdGlvbiB2YihlLHQpe2lmKHQuaXNTZWdtZW50ZWQoKSlyZXR1cm4hMDtpZighZS5pc0NvbGxhcHNlZCgpKXJldHVybiExO2U9ZS5hbmNob3Iub2Zmc2V0O2xldCBuPXQuZ2V0UGFyZW50T3JUaHJvdygpLHI9dC5pc1Rva2VuKCk7cmV0dXJuIGU9PT0wPygoZT0hdC5jYW5JbnNlcnRUZXh0QmVmb3JlKCl8fCFuLmNhbkluc2VydFRleHRCZWZvcmUoKXx8cil8fCh0PXQuZ2V0UHJldmlvdXNTaWJsaW5nKCksZT0oUSh0KXx8Qih0KSYmdC5pc0lubGluZSgpKSYmIXQuY2FuSW5zZXJ0VGV4dEFmdGVyKCkpLGUpOmU9PT10LmdldFRleHRDb250ZW50U2l6ZSgpPyF0LmNhbkluc2VydFRleHRBZnRlcigpfHwhbi5jYW5JbnNlcnRUZXh0QWZ0ZXIoKXx8cjohMX1mdW5jdGlvbiBEcyhlLHQpe2UuX19sZXhpY2FsQ2xhc3NOYW1lQ2FjaGU9PT12b2lkIDAmJihlLl9fbGV4aWNhbENsYXNzTmFtZUNhY2hlPXt9KTtsZXQgbj1lLl9fbGV4aWNhbENsYXNzTmFtZUNhY2hlLHI9blt0XTtyZXR1cm4gciE9PXZvaWQgMD9yOihlPWVbdF0sdHlwZW9mIGU9PSJzdHJpbmciPyhlPWUuc3BsaXQoIiAiKSxuW3RdPWUpOmUpfWZ1bmN0aW9uIEtnKGUsdCxuLHIsbyl7bi5zaXplIT09MCYmKG49ci5fX3R5cGUscj1yLl9fa2V5LHQ9dC5nZXQobiksdD09PXZvaWQgMCYmVSgzMyxuKSxuPXQua2xhc3MsdD1lLmdldChuKSx0PT09dm9pZCAwJiYodD1uZXcgTWFwLGUuc2V0KG4sdCkpLGU9dC5nZXQociksbj1lPT09ImRlc3Ryb3llZCImJm89PT0iY3JlYXRlZCIsKGU9PT12b2lkIDB8fG4pJiZ0LnNldChyLG4/InVwZGF0ZWQiOm8pKX1mdW5jdGlvbiB1eShlLHQsbil7bGV0IHI9ZS5nZXRQYXJlbnQoKSxvPW47cmV0dXJuIHIhPT1udWxsJiYodCYmbj09PTA/KG89ZS5nZXRJbmRleFdpdGhpblBhcmVudCgpLGU9cik6dHx8biE9PWUuZ2V0Q2hpbGRyZW5TaXplKCl8fChvPWUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLGU9cikpLGUuZ2V0Q2hpbGRBdEluZGV4KHQ/by0xOm8pfWZ1bmN0aW9uIEJoKGUsdCl7dmFyIG49ZS5vZmZzZXQ7cmV0dXJuIGUudHlwZT09PSJlbGVtZW50Ij8oZT1lLmdldE5vZGUoKSx1eShlLHQsbikpOihlPWUuZ2V0Tm9kZSgpLHQmJm49PT0wfHwhdCYmbj09PWUuZ2V0VGV4dENvbnRlbnRTaXplKCk/KG49dD9lLmdldFByZXZpb3VzU2libGluZygpOmUuZ2V0TmV4dFNpYmxpbmcoKSxuPT09bnVsbD91eShlLmdldFBhcmVudE9yVGhyb3coKSx0LGUuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsodD8wOjEpKTpuKTpudWxsKX1mdW5jdGlvbiBmdyhlKXtyZXR1cm4gZT0oZT1jZChlKS5ldmVudCkmJmUuaW5wdXRUeXBlLGU9PT0iaW5zZXJ0RnJvbVBhc3RlInx8ZT09PSJpbnNlcnRGcm9tUGFzdGVBc1F1b3RhdGlvbiJ9ZnVuY3Rpb24geWMoZSl7cmV0dXJuIWVuKGUpJiYhZS5pc0xhc3RDaGlsZCgpJiYhZS5pc0lubGluZSgpfWZ1bmN0aW9uIHhjKGUsdCl7cmV0dXJuIGU9ZS5fa2V5VG9ET01NYXAuZ2V0KHQpLGU9PT12b2lkIDAmJlUoNzUsdCksZX1mdW5jdGlvbiB1ZChlKXtyZXR1cm4gZT1lLmFzc2lnbmVkU2xvdHx8ZS5wYXJlbnRFbGVtZW50LGUhPT1udWxsJiZlLm5vZGVUeXBlPT09MTE/ZS5ob3N0OmV9ZnVuY3Rpb24gX2MoZSx0KXtmb3IoZT1lLmdldFBhcmVudCgpO2UhPT1udWxsOyl7aWYoZS5pcyh0KSlyZXR1cm4hMDtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuITF9ZnVuY3Rpb24gY2QoZSl7cmV0dXJuIGU9ZS5fd2luZG93LGU9PT1udWxsJiZVKDc4KSxlfWZ1bmN0aW9uIGh3KGUpe2ZvcihlPWUuZ2V0UGFyZW50T3JUaHJvdygpO2UhPT1udWxsJiYhSm4oZSk7KWU9ZS5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIGV9ZnVuY3Rpb24gSm4oZSl7cmV0dXJuIGVuKGUpfHxCKGUpJiZlLmlzU2hhZG93Um9vdCgpfWZ1bmN0aW9uIHB3KGUpe3JldHVybiBlPWUuY29uc3RydWN0b3IuY2xvbmUoZSksc3coZSxudWxsKSxlfWZ1bmN0aW9uIERhKGUpe3ZhciB0PWV0KCk7bGV0IG49ZS5jb25zdHJ1Y3Rvci5nZXRUeXBlKCk7cmV0dXJuIHQ9dC5fbm9kZXMuZ2V0KG4pLHQ9PT12b2lkIDAmJlUoOTcpLHQ9dC5yZXBsYWNlLHQhPT1udWxsPyh0PXQoZSksdCBpbnN0YW5jZW9mIGUuY29uc3RydWN0b3J8fFUoOTgpLHQpOmV9ZnVuY3Rpb24gaGYoZSx0KXtlPWUuZ2V0UGFyZW50KCksIWVuKGUpfHxCKHQpfHxWZSh0KXx8VSg5OSl9ZnVuY3Rpb24gcGYoZSl7cmV0dXJuKFZlKGUpfHxCKGUpJiYhZS5jYW5CZUVtcHR5KCkpJiYhZS5pc0lubGluZSgpfWZ1bmN0aW9uIFdoKGUsdCxuKXtuLnN0eWxlLnJlbW92ZVByb3BlcnR5KCJjYXJldC1jb2xvciIpLHQuX2Jsb2NrQ3Vyc29yRWxlbWVudD1udWxsLHQ9ZS5wYXJlbnRFbGVtZW50LHQhPT1udWxsJiZ0LnJlbW92ZUNoaWxkKGUpfWZ1bmN0aW9uIEVyKGUpe3JldHVybiBHcj8oZXx8d2luZG93KS5nZXRTZWxlY3Rpb24oKTpudWxsfWZ1bmN0aW9uIGd3KGUsdCl7bGV0IG49ZS5nZXRDaGlsZEF0SW5kZXgodCk7bj09bnVsbCYmKG49ZSksSm4oZSkmJlUoMTAyKTtsZXQgcj1sPT57Y29uc3Qgcz1sLmdldFBhcmVudE9yVGhyb3coKSxhPUpuKHMpLHU9bCE9PW58fGE/cHcobCk6bDtpZihhKXJldHVybiBsLmluc2VydEFmdGVyKHUpLFtsLHUsdV07Y29uc3RbYyxkLGZdPXIocyk7cmV0dXJuIGw9bC5nZXROZXh0U2libGluZ3MoKSxmLmFwcGVuZCh1LC4uLmwpLFtjLGQsdV19LFtvLGldPXIobik7cmV0dXJuW28saV19ZnVuY3Rpb24gd2MoZSx0KXtmb3IoO2UhPT1TcigpJiZlIT1udWxsOyl7aWYodChlKSlyZXR1cm4gZTtlPWUuZ2V0UGFyZW50KCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24geWIoZSl7bGV0IHQ9W10sbj1bZV07Zm9yKDswPG4ubGVuZ3RoOyl7bGV0IHI9bi5wb3AoKTtyPT09dm9pZCAwJiZVKDExMiksQihyKSYmbi51bnNoaWZ0KC4uLnIuZ2V0Q2hpbGRyZW4oKSksciE9PWUmJnQucHVzaChyKX1yZXR1cm4gdH1mdW5jdGlvbiBkZChlKXtyZXR1cm4gZS5ub2RlVHlwZT09PTF9ZnVuY3Rpb24gbXcoZSx0LG4scixvLGkpe2ZvcihlPWUuZ2V0Rmlyc3RDaGlsZCgpO2UhPT1udWxsOyl7bGV0IGw9ZS5fX2tleTtlLl9fcGFyZW50PT09dCYmKEIoZSkmJm13KGUsbCxuLHIsbyxpKSxuLmhhcyhsKXx8aS5kZWxldGUobCksby5wdXNoKGwpKSxlPWUuZ2V0TmV4dFNpYmxpbmcoKX19ZnVuY3Rpb24geGIoZSx0LG4scil7ZT1lLl9ub2RlTWFwLHQ9dC5fbm9kZU1hcDtsZXQgbz1bXTtmb3IobGV0W2ldb2Ygcil7bGV0IGw9dC5nZXQoaSk7bD09PXZvaWQgMHx8bC5pc0F0dGFjaGVkKCl8fChCKGwpJiZtdyhsLGksZSx0LG8sciksZS5oYXMoaSl8fHIuZGVsZXRlKGkpLG8ucHVzaChpKSl9Zm9yKGxldCBpIG9mIG8pdC5kZWxldGUoaSk7Zm9yKGxldCBpIG9mIG4pcj10LmdldChpKSxyPT09dm9pZCAwfHxyLmlzQXR0YWNoZWQoKXx8KGUuaGFzKGkpfHxuLmRlbGV0ZShpKSx0LmRlbGV0ZShpKSl9bGV0IGd0PSIiLEp0PSIiLE9yPSIiLFJvLEh0LGhhLHZ3PSExLEdnPSExLGZkLER1PW51bGwsVWgsVmgsZmksUG8sSGgscGE7ZnVuY3Rpb24gTHUoZSx0KXtsZXQgbj1maS5nZXQoZSk7aWYodCE9PW51bGwpe2xldCByPVloKGUpO3IucGFyZW50Tm9kZT09PXQmJnQucmVtb3ZlQ2hpbGQocil9UG8uaGFzKGUpfHxIdC5fa2V5VG9ET01NYXAuZGVsZXRlKGUpLEIobikmJihlPVNjKG4sZmkpLEtoKGUsMCxlLmxlbmd0aC0xLG51bGwpKSxuIT09dm9pZCAwJiZLZyhwYSxoYSxmZCxuLCJkZXN0cm95ZWQiKX1mdW5jdGlvbiBLaChlLHQsbixyKXtmb3IoO3Q8PW47Kyt0KXtsZXQgbz1lW3RdO28hPT12b2lkIDAmJkx1KG8scil9fWZ1bmN0aW9uIEhvKGUsdCl7ZS5zZXRQcm9wZXJ0eSgidGV4dC1hbGlnbiIsdCl9ZnVuY3Rpb24geXcoZSx0KXt2YXIgbj1Sby50aGVtZS5pbmRlbnQ7aWYodHlwZW9mIG49PSJzdHJpbmciKXtsZXQgcj1lLmNsYXNzTGlzdC5jb250YWlucyhuKTswPHQmJiFyP2UuY2xhc3NMaXN0LmFkZChuKToxPnQmJnImJmUuY2xhc3NMaXN0LnJlbW92ZShuKX1uPWdldENvbXB1dGVkU3R5bGUoZSkuZ2V0UHJvcGVydHlWYWx1ZSgiLS1sZXhpY2FsLWluZGVudC1iYXNlLXZhbHVlIil8fCI0MHB4IixlLnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLWlubGluZS1zdGFydCIsdD09PTA/IiI6YGNhbGMoJHt0fSAqICR7bn0pYCl9ZnVuY3Rpb24geHcoZSx0KXtlPWUuc3R5bGUsdD09PTA/SG8oZSwiIik6dD09PTE/SG8oZSwibGVmdCIpOnQ9PT0yP0hvKGUsImNlbnRlciIpOnQ9PT0zP0hvKGUsInJpZ2h0Iik6dD09PTQ/SG8oZSwianVzdGlmeSIpOnQ9PT01P0hvKGUsInN0YXJ0Iik6dD09PTYmJkhvKGUsImVuZCIpfWZ1bmN0aW9uIEl1KGUsdCxuKXtsZXQgcj1Qby5nZXQoZSk7cj09PXZvaWQgMCYmVSg2MCk7bGV0IG89ci5jcmVhdGVET00oUm8sSHQpO3ZhciBpPUh0Ll9rZXlUb0RPTU1hcDtpZihvWyJfX2xleGljYWxLZXlfIitIdC5fa2V5XT1lLGkuc2V0KGUsbyksUShyKT9vLnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLXRleHQiLCJ0cnVlIik6VmUocikmJm8uc2V0QXR0cmlidXRlKCJkYXRhLWxleGljYWwtZGVjb3JhdG9yIiwidHJ1ZSIpLEIocikpe2lmKGU9ci5fX2luZGVudCxpPXIuX19zaXplLGUhPT0wJiZ5dyhvLGUpLGkhPT0wKXstLWksZT1TYyhyLFBvKTt2YXIgbD1KdDtKdD0iIixHaChlLHIsMCxpLG8sbnVsbCksd3cocixvKSxKdD1sfWU9ci5fX2Zvcm1hdCxlIT09MCYmeHcobyxlKSxyLmlzSW5saW5lKCl8fF93KG51bGwscixvKSx5YyhyKSYmKGd0Kz1gCgpgLE9yKz1gCgpgKX1lbHNlIGk9ci5nZXRUZXh0Q29udGVudCgpLFZlKHIpPyhsPXIuZGVjb3JhdGUoSHQsUm8pLGwhPT1udWxsJiZTdyhlLGwpLG8uY29udGVudEVkaXRhYmxlPSJmYWxzZSIpOlEocikmJihyLmlzRGlyZWN0aW9ubGVzcygpfHwoSnQrPWkpKSxndCs9aSxPcis9aTtyZXR1cm4gdCE9PW51bGwmJihuIT1udWxsP3QuaW5zZXJ0QmVmb3JlKG8sbik6KG49dC5fX2xleGljYWxMaW5lQnJlYWssbiE9bnVsbD90Lmluc2VydEJlZm9yZShvLG4pOnQuYXBwZW5kQ2hpbGQobykpKSxLZyhwYSxoYSxmZCxyLCJjcmVhdGVkIiksb31mdW5jdGlvbiBHaChlLHQsbixyLG8saSl7bGV0IGw9Z3Q7Zm9yKGd0PSIiO248PXI7KytuKUl1KGVbbl0sbyxpKTt5Yyh0KSYmKGd0Kz1gCgpgKSxvLl9fbGV4aWNhbFRleHRDb250ZW50PWd0LGd0PWwrZ3R9ZnVuY3Rpb24gY3koZSx0KXtyZXR1cm4gZT10LmdldChlKSxtYShlKXx8VmUoZSkmJmUuaXNJbmxpbmUoKX1mdW5jdGlvbiBfdyhlLHQsbil7ZT1lIT09bnVsbCYmKGUuX19zaXplPT09MHx8Y3koZS5fX2xhc3QsZmkpKSx0PXQuX19zaXplPT09MHx8Y3kodC5fX2xhc3QsUG8pLGU/dHx8KHQ9bi5fX2xleGljYWxMaW5lQnJlYWssdCE9bnVsbCYmbi5yZW1vdmVDaGlsZCh0KSxuLl9fbGV4aWNhbExpbmVCcmVhaz1udWxsKTp0JiYodD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpLG4uX19sZXhpY2FsTGluZUJyZWFrPXQsbi5hcHBlbmRDaGlsZCh0KSl9ZnVuY3Rpb24gd3coZSx0KXt2YXIgbj10Ll9fbGV4aWNhbERpcjtpZih0Ll9fbGV4aWNhbERpclRleHRDb250ZW50IT09SnR8fG4hPT1EdSl7bGV0IGk9SnQ9PT0iIjtpZihpKXZhciByPUR1O2Vsc2Ugcj1KdCxyPWxiLnRlc3Qocik/InJ0bCI6c2IudGVzdChyKT8ibHRyIjpudWxsO2lmKHIhPT1uKXtsZXQgbD10LmNsYXNzTGlzdCxzPVJvLnRoZW1lO3ZhciBvPW4hPT1udWxsP3Nbbl06dm9pZCAwO2xldCBhPXIhPT1udWxsP3Nbcl06dm9pZCAwO28hPT12b2lkIDAmJih0eXBlb2Ygbz09InN0cmluZyImJihvPW8uc3BsaXQoIiAiKSxvPXNbbl09byksbC5yZW1vdmUoLi4ubykpLHI9PT1udWxsfHxpJiZyPT09Imx0ciI/dC5yZW1vdmVBdHRyaWJ1dGUoImRpciIpOihhIT09dm9pZCAwJiYodHlwZW9mIGE9PSJzdHJpbmciJiYobj1hLnNwbGl0KCIgIiksYT1zW3JdPW4pLGEhPT12b2lkIDAmJmwuYWRkKC4uLmEpKSx0LmRpcj1yKSxHZ3x8KGUuZ2V0V3JpdGFibGUoKS5fX2Rpcj1yKX1EdT1yLHQuX19sZXhpY2FsRGlyVGV4dENvbnRlbnQ9SnQsdC5fX2xleGljYWxEaXI9cn19ZnVuY3Rpb24gU2MoZSx0KXtsZXQgbj1bXTtmb3IoZT1lLl9fZmlyc3Q7ZSE9PW51bGw7KXtsZXQgcj10LmdldChlKTtyPT09dm9pZCAwJiZVKDEwMSksbi5wdXNoKGUpLGU9ci5fX25leHR9cmV0dXJuIG59ZnVuY3Rpb24geXMoZSx0KXt2YXIgbj1maS5nZXQoZSkscj1Qby5nZXQoZSk7biE9PXZvaWQgMCYmciE9PXZvaWQgMHx8VSg2MSk7dmFyIG89dnd8fFZoLmhhcyhlKXx8VWguaGFzKGUpO2xldCBpPXhjKEh0LGUpO2lmKG49PT1yJiYhbylyZXR1cm4gQihuKT8ocj1pLl9fbGV4aWNhbFRleHRDb250ZW50LHIhPT12b2lkIDAmJihndCs9cixPcis9cikscj1pLl9fbGV4aWNhbERpclRleHRDb250ZW50LHIhPT12b2lkIDAmJihKdCs9cikpOihyPW4uZ2V0VGV4dENvbnRlbnQoKSxRKG4pJiYhbi5pc0RpcmVjdGlvbmxlc3MoKSYmKEp0Kz1yKSxPcis9cixndCs9ciksaTtpZihuIT09ciYmbyYmS2cocGEsaGEsZmQsciwidXBkYXRlZCIpLHIudXBkYXRlRE9NKG4saSxSbykpcmV0dXJuIHI9SXUoZSxudWxsLG51bGwpLHQ9PT1udWxsJiZVKDYyKSx0LnJlcGxhY2VDaGlsZChyLGkpLEx1KGUsbnVsbCkscjtpZihCKG4pJiZCKHIpKXtpZihlPXIuX19pbmRlbnQsZSE9PW4uX19pbmRlbnQmJnl3KGksZSksZT1yLl9fZm9ybWF0LGUhPT1uLl9fZm9ybWF0JiZ4dyhpLGUpLG8pe2U9cixvPUp0LEp0PSIiLHQ9Z3Q7dmFyIGw9bi5fX3NpemUscz1lLl9fc2l6ZTtpZihndD0iIixsPT09MSYmcz09PTEpe3ZhciBhPW4uX19maXJzdCx1PWUuX19maXJzdDtpZihhPT09dSl5cyhhLGkpO2Vsc2V7dmFyIGM9WWgoYSk7dT1JdSh1LG51bGwsbnVsbCksaS5yZXBsYWNlQ2hpbGQodSxjKSxMdShhLG51bGwpfX1lbHNle3U9U2MobixmaSk7dmFyIGQ9U2MoZSxQbyk7aWYobD09PTApcyE9PTAmJkdoKGQsZSwwLHMtMSxpLG51bGwpO2Vsc2UgaWYocz09PTApbCE9PTAmJihhPWkuX19sZXhpY2FsTGluZUJyZWFrPT1udWxsLEtoKHUsMCxsLTEsYT9udWxsOmkpLGEmJihpLnRleHRDb250ZW50PSIiKSk7ZWxzZXt2YXIgZj11O3U9ZCxkPWwtMSxsPXMtMTtsZXQgZz1pLmZpcnN0Q2hpbGQsbT0wO2ZvcihzPTA7bTw9ZCYmczw9bDspe3ZhciBoPWZbbV07bGV0IFM9dVtzXTtpZihoPT09UylnPWdmKHlzKFMsaSkpLG0rKyxzKys7ZWxzZXthPT09dm9pZCAwJiYoYT1uZXcgU2V0KGYpKSxjPT09dm9pZCAwJiYoYz1uZXcgU2V0KHUpKTtsZXQgdj1jLmhhcyhoKSx5PWEuaGFzKFMpO3Y/KHk/KGg9eGMoSHQsUyksaD09PWc/Zz1nZih5cyhTLGkpKTooZyE9bnVsbD9pLmluc2VydEJlZm9yZShoLGcpOmkuYXBwZW5kQ2hpbGQoaCkseXMoUyxpKSksbSsrKTpJdShTLGksZykscysrKTooZz1nZihZaChoKSksTHUoaCxpKSxtKyspfX1hPW0+ZCxjPXM+bCxhJiYhYz8oYT11W2wrMV0sYT1hPT09dm9pZCAwP251bGw6SHQuZ2V0RWxlbWVudEJ5S2V5KGEpLEdoKHUsZSxzLGwsaSxhKSk6YyYmIWEmJktoKGYsbSxkLGkpfX15YyhlKSYmKGd0Kz1gCgpgKSxpLl9fbGV4aWNhbFRleHRDb250ZW50PWd0LGd0PXQrZ3Qsd3coZSxpKSxKdD1vLGVuKHIpfHxyLmlzSW5saW5lKCl8fF93KG4scixpKX15YyhyKSYmKGd0Kz1gCgpgLE9yKz1gCgpgKX1lbHNlIG49ci5nZXRUZXh0Q29udGVudCgpLFZlKHIpPyhvPXIuZGVjb3JhdGUoSHQsUm8pLG8hPT1udWxsJiZTdyhlLG8pKTpRKHIpJiYhci5pc0RpcmVjdGlvbmxlc3MoKSYmKEp0Kz1uKSxndCs9bixPcis9bjtyZXR1cm4hR2cmJmVuKHIpJiZyLl9fY2FjaGVkVGV4dCE9PU9yJiYocj1yLmdldFdyaXRhYmxlKCksci5fX2NhY2hlZFRleHQ9T3IpLGl9ZnVuY3Rpb24gU3coZSx0KXtsZXQgbj1IdC5fcGVuZGluZ0RlY29yYXRvcnMscj1IdC5fZGVjb3JhdG9ycztpZihuPT09bnVsbCl7aWYocltlXT09PXQpcmV0dXJuO249dXcoSHQpfW5bZV09dH1mdW5jdGlvbiBnZihlKXtyZXR1cm4gZT1lLm5leHRTaWJsaW5nLGUhPT1udWxsJiZlPT09SHQuX2Jsb2NrQ3Vyc29yRWxlbWVudCYmKGU9ZS5uZXh0U2libGluZyksZX1mdW5jdGlvbiBZaChlKXtsZXQgdD1IaC5nZXQoZSk7cmV0dXJuIHQ9PT12b2lkIDAmJlUoNzUsZSksdH1sZXQgVHI9T2JqZWN0LmZyZWV6ZSh7fSksWGg9W1sia2V5ZG93biIsVGJdLFsicG9pbnRlcmRvd24iLHdiXSxbImNvbXBvc2l0aW9uc3RhcnQiLCRiXSxbImNvbXBvc2l0aW9uZW5kIixrYl0sWyJpbnB1dCIsQ2JdLFsiY2xpY2siLF9iXSxbImN1dCIsVHJdLFsiY29weSIsVHJdLFsiZHJhZ3N0YXJ0IixUcl0sWyJkcmFnb3ZlciIsVHJdLFsiZHJhZ2VuZCIsVHJdLFsicGFzdGUiLFRyXSxbImZvY3VzIixUcl0sWyJibHVyIixUcl0sWyJkcm9wIixUcl1dO2djJiZYaC5wdXNoKFsiYmVmb3JlaW5wdXQiLChlLHQpPT5FYihlLHQpXSk7bGV0IGdhPTAsRXc9MCxDdz0wLEJpPW51bGwsTHM9MCxRaD0hMSxKaD0hMSxJcz0hMSx4cz0hMSwkdz1bMCwiIiwwLCJyb290IiwwXTtmdW5jdGlvbiBrdyhlLHQsbixyLG8pe2xldCBpPWUuYW5jaG9yLGw9ZS5mb2N1cyxzPWkuZ2V0Tm9kZSgpO3ZhciBhPWV0KCk7bGV0IHU9RXIoYS5fd2luZG93KSxjPXUhPT1udWxsP3UuYW5jaG9yTm9kZTpudWxsLGQ9aS5rZXk7YT1hLmdldEVsZW1lbnRCeUtleShkKTtsZXQgZj1uLmxlbmd0aDtyZXR1cm4gZCE9PWwua2V5fHwhUShzKXx8KCFvJiYoIWdjfHxDdzxyKzUwKXx8cy5pc0RpcnR5KCkmJjI+Znx8Y3cobikpJiZpLm9mZnNldCE9PWwub2Zmc2V0JiYhcy5pc0NvbXBvc2luZygpfHxGaChzKXx8cy5pc0RpcnR5KCkmJjE8Znx8KG98fCFnYykmJmEhPT1udWxsJiYhcy5pc0NvbXBvc2luZygpJiZjIT09bWMoYSl8fHUhPT1udWxsJiZ0IT09bnVsbCYmKCF0LmNvbGxhcHNlZHx8dC5zdGFydENvbnRhaW5lciE9PXUuYW5jaG9yTm9kZXx8dC5zdGFydE9mZnNldCE9PXUuYW5jaG9yT2Zmc2V0KXx8cy5nZXRGb3JtYXQoKSE9PWUuZm9ybWF0fHxzLmdldFN0eWxlKCkhPT1lLnN0eWxlfHx2YihlLHMpfWZ1bmN0aW9uIGR5KGUsdCl7cmV0dXJuIGUhPT1udWxsJiZlLm5vZGVWYWx1ZSE9PW51bGwmJmUubm9kZVR5cGU9PT0zJiZ0IT09MCYmdCE9PWUubm9kZVZhbHVlLmxlbmd0aH1mdW5jdGlvbiBmeShlLHQsbil7bGV0e2FuY2hvck5vZGU6cixhbmNob3JPZmZzZXQ6byxmb2N1c05vZGU6aSxmb2N1c09mZnNldDpsfT1lO1FoJiYoUWg9ITEsZHkocixvKSYmZHkoaSxsKSl8fGtuKHQsKCk9PntpZighbil2cihudWxsKTtlbHNlIGlmKEFhKHQscixpKSl7dmFyIHM9S2UoKTtpZihkZShzKSl7dmFyIGE9cy5hbmNob3IsdT1hLmdldE5vZGUoKTtpZihzLmlzQ29sbGFwc2VkKCkpe2UudHlwZT09PSJSYW5nZSImJmUuYW5jaG9yTm9kZT09PWUuZm9jdXNOb2RlJiYocy5kaXJ0eT0hMCk7dmFyIGM9Y2QodCkuZXZlbnQ7Yz1jP2MudGltZVN0YW1wOnBlcmZvcm1hbmNlLm5vdygpO2xldFtkLGYsaCxnLG1dPSR3O2M8bSsyMDAmJmEub2Zmc2V0PT09aCYmYS5rZXk9PT1nPyhzLmZvcm1hdD1kLHMuc3R5bGU9Zik6YS50eXBlPT09InRleHQiPyhzLmZvcm1hdD11LmdldEZvcm1hdCgpLHMuc3R5bGU9dS5nZXRTdHlsZSgpKTphLnR5cGU9PT0iZWxlbWVudCImJihzLmZvcm1hdD0wLHMuc3R5bGU9IiIpfWVsc2V7YT0yNTUsdT0hMSxjPXMuZ2V0Tm9kZXMoKTtsZXQgZD1jLmxlbmd0aDtmb3IobGV0IGY9MDtmPGQ7ZisrKXtsZXQgaD1jW2ZdO2lmKFEoaCkmJih1PSEwLGEmPWguZ2V0Rm9ybWF0KCksYT09PTApKWJyZWFrfXMuZm9ybWF0PXU/YTowfX1ZKHQsbGQsdm9pZCAwKX19KX1mdW5jdGlvbiBfYihlLHQpe2tuKHQsKCk9PntsZXQgbj1LZSgpO3ZhciByPUVyKHQuX3dpbmRvdyk7bGV0IG89RmwoKTtpZihyKWlmKGRlKG4pKXtsZXQgbD1uLmFuY2hvcjt2YXIgaT1sLmdldE5vZGUoKTtsLnR5cGU9PT0iZWxlbWVudCImJmwub2Zmc2V0PT09MCYmbi5pc0NvbGxhcHNlZCgpJiYhZW4oaSkmJlNyKCkuZ2V0Q2hpbGRyZW5TaXplKCk9PT0xJiZpLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5pc0VtcHR5KCkmJm8hPT1udWxsJiZuLmlzKG8pPyhyLnJlbW92ZUFsbFJhbmdlcygpLG4uZGlydHk9ITApOmUuZGV0YWlsIT09M3x8bi5pc0NvbGxhcHNlZCgpfHwocj1uLmZvY3VzLmdldE5vZGUoKSxpIT09ciYmKEIoaSk/aS5zZWxlY3QoMCk6aS5nZXRQYXJlbnRPclRocm93KCkuc2VsZWN0KDApKSl9ZWxzZSBlLnBvaW50ZXJUeXBlPT09InRvdWNoIiYmKGk9ci5hbmNob3JOb2RlLGkhPT1udWxsJiYoaT1pLm5vZGVUeXBlLGk9PT0xfHxpPT09MykpJiYocj1YZyhvLHIsdCksdnIocikpO1kodCxEXyxlKX0pfWZ1bmN0aW9uIHdiKGUsdCl7bGV0IG49ZS50YXJnZXQ7ZT1lLnBvaW50ZXJUeXBlLG4gaW5zdGFuY2VvZiBOb2RlJiZlIT09InRvdWNoIiYma24odCwoKT0+e1ZlKE1hKG4pKXx8KEpoPSEwKX0pfWZ1bmN0aW9uIFR3KGUpe3JldHVybiBlLmdldFRhcmdldFJhbmdlcz8oZT1lLmdldFRhcmdldFJhbmdlcygpLGUubGVuZ3RoPT09MD9udWxsOmVbMF0pOm51bGx9ZnVuY3Rpb24gU2IoZSx0KXtyZXR1cm4gZSE9PXR8fEIoZSl8fEIodCl8fCFlLmlzVG9rZW4oKXx8IXQuaXNUb2tlbigpfWZ1bmN0aW9uIEViKGUsdCl7bGV0IG49ZS5pbnB1dFR5cGUscj1UdyhlKTtuPT09ImRlbGV0ZUNvbXBvc2l0aW9uVGV4dCJ8fGJvJiZmdyh0KXx8biE9PSJpbnNlcnRDb21wb3NpdGlvblRleHQiJiZrbih0LCgpPT57bGV0IG89S2UoKTtpZihuPT09ImRlbGV0ZUNvbnRlbnRCYWNrd2FyZCIpe2lmKG89PT1udWxsKXt2YXIgaT1GbCgpO2lmKCFkZShpKSlyZXR1cm47dnIoaS5jbG9uZSgpKX1pZihkZShvKSl7RXc9PT0yMjkmJmUudGltZVN0YW1wPGdhKzMwJiZ0LmlzQ29tcG9zaW5nKCkmJm8uYW5jaG9yLmtleT09PW8uZm9jdXMua2V5PyhNdChudWxsKSxnYT0wLHNldFRpbWVvdXQoKCk9Pntrbih0LCgpPT57TXQobnVsbCl9KX0sMzApLGRlKG8pJiYoaT1vLmFuY2hvci5nZXROb2RlKCksaS5tYXJrRGlydHkoKSxvLmZvcm1hdD1pLmdldEZvcm1hdCgpLG8uc3R5bGU9aS5nZXRTdHlsZSgpKSk6KGUucHJldmVudERlZmF1bHQoKSxZKHQsY2EsITApKTtyZXR1cm59fWlmKGRlKG8pKXtpPWUuZGF0YSxCaSE9PW51bGwmJlZnKCExLHQsQmkpLG8uZGlydHkmJkJpPT09bnVsbHx8IW8uaXNDb2xsYXBzZWQoKXx8ZW4oby5hbmNob3IuZ2V0Tm9kZSgpKXx8cj09PW51bGx8fG8uYXBwbHlET01SYW5nZShyKSxCaT1udWxsO3ZhciBsPW8uZm9jdXMscz1vLmFuY2hvci5nZXROb2RlKCk7aWYobD1sLmdldE5vZGUoKSxuPT09Imluc2VydFRleHQifHxuPT09Imluc2VydFRyYW5zcG9zZSIpaT09PWAKYD8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxNcywhMSkpOmk9PT1gCgpgPyhlLnByZXZlbnREZWZhdWx0KCksWSh0LExoLHZvaWQgMCkpOmk9PW51bGwmJmUuZGF0YVRyYW5zZmVyPyhpPWUuZGF0YVRyYW5zZmVyLmdldERhdGEoInRleHQvcGxhaW4iKSxlLnByZXZlbnREZWZhdWx0KCksby5pbnNlcnRSYXdUZXh0KGkpKTppIT1udWxsJiZrdyhvLHIsaSxlLnRpbWVTdGFtcCwhMCk/KGUucHJldmVudERlZmF1bHQoKSxZKHQsY2wsaSkpOkJpPWksQ3c9ZS50aW1lU3RhbXA7ZWxzZSBzd2l0Y2goZS5wcmV2ZW50RGVmYXVsdCgpLG4pe2Nhc2UiaW5zZXJ0RnJvbVlhbmsiOmNhc2UiaW5zZXJ0RnJvbURyb3AiOmNhc2UiaW5zZXJ0UmVwbGFjZW1lbnRUZXh0IjpZKHQsY2wsZSk7YnJlYWs7Y2FzZSJpbnNlcnRGcm9tQ29tcG9zaXRpb24iOk10KG51bGwpLFkodCxjbCxlKTticmVhaztjYXNlImluc2VydExpbmVCcmVhayI6TXQobnVsbCksWSh0LE1zLCExKTticmVhaztjYXNlImluc2VydFBhcmFncmFwaCI6TXQobnVsbCksSXMmJiFzZD8oSXM9ITEsWSh0LE1zLCExKSk6WSh0LExoLHZvaWQgMCk7YnJlYWs7Y2FzZSJpbnNlcnRGcm9tUGFzdGUiOmNhc2UiaW5zZXJ0RnJvbVBhc3RlQXNRdW90YXRpb24iOlkodCxPZyxlKTticmVhaztjYXNlImRlbGV0ZUJ5Q29tcG9zaXRpb24iOlNiKHMsbCkmJlkodCxJaCxlKTticmVhaztjYXNlImRlbGV0ZUJ5RHJhZyI6Y2FzZSJkZWxldGVCeUN1dCI6WSh0LEloLGUpO2JyZWFrO2Nhc2UiZGVsZXRlQ29udGVudCI6WSh0LGNhLCExKTticmVhaztjYXNlImRlbGV0ZVdvcmRCYWNrd2FyZCI6WSh0LGRhLCEwKTticmVhaztjYXNlImRlbGV0ZVdvcmRGb3J3YXJkIjpZKHQsZGEsITEpO2JyZWFrO2Nhc2UiZGVsZXRlSGFyZExpbmVCYWNrd2FyZCI6Y2FzZSJkZWxldGVTb2Z0TGluZUJhY2t3YXJkIjpZKHQsZmEsITApO2JyZWFrO2Nhc2UiZGVsZXRlQ29udGVudEZvcndhcmQiOmNhc2UiZGVsZXRlSGFyZExpbmVGb3J3YXJkIjpjYXNlImRlbGV0ZVNvZnRMaW5lRm9yd2FyZCI6WSh0LGZhLCExKTticmVhaztjYXNlImZvcm1hdFN0cmlrZVRocm91Z2giOlkodCxnbywic3RyaWtldGhyb3VnaCIpO2JyZWFrO2Nhc2UiZm9ybWF0Qm9sZCI6WSh0LGdvLCJib2xkIik7YnJlYWs7Y2FzZSJmb3JtYXRJdGFsaWMiOlkodCxnbywiaXRhbGljIik7YnJlYWs7Y2FzZSJmb3JtYXRVbmRlcmxpbmUiOlkodCxnbywidW5kZXJsaW5lIik7YnJlYWs7Y2FzZSJoaXN0b3J5VW5kbyI6WSh0LEFnLHZvaWQgMCk7YnJlYWs7Y2FzZSJoaXN0b3J5UmVkbyI6WSh0LE1nLHZvaWQgMCl9fX0pfWZ1bmN0aW9uIENiKGUsdCl7ZS5zdG9wUHJvcGFnYXRpb24oKSxrbih0LCgpPT57dmFyIG49S2UoKSxyPWUuZGF0YSxvPVR3KGUpO2lmKHIhPW51bGwmJmRlKG4pJiZrdyhuLG8scixlLnRpbWVTdGFtcCwhMSkpe3hzJiYoWmgodCxyKSx4cz0hMSk7dmFyIGk9bi5hbmNob3IsbD1pLmdldE5vZGUoKTtpZihvPUVyKHQuX3dpbmRvdyksbz09PW51bGwpcmV0dXJuO2xldCBzPWkub2Zmc2V0OyhpPWdjJiYhbi5pc0NvbGxhcHNlZCgpJiZRKGwpJiZvLmFuY2hvck5vZGUhPT1udWxsKSYmKGw9bC5nZXRUZXh0Q29udGVudCgpLnNsaWNlKDAscykrcitsLmdldFRleHRDb250ZW50KCkuc2xpY2UocytuLmZvY3VzLm9mZnNldCksbz1vLmFuY2hvck5vZGUsaT1sPT09KG8ubm9kZVR5cGU9PT0zP28ubm9kZVZhbHVlOm51bGwpKSxpfHxZKHQsY2wscikscj1yLmxlbmd0aCxibyYmMTxyJiZlLmlucHV0VHlwZT09PSJpbnNlcnRDb21wb3NpdGlvblRleHQiJiYhdC5pc0NvbXBvc2luZygpJiYobi5hbmNob3Iub2Zmc2V0LT1yKSxJZ3x8c2R8fGpnfHwhdC5pc0NvbXBvc2luZygpfHwoZ2E9MCxNdChudWxsKSl9ZWxzZSBWZyghMSx0LHIhPT1udWxsP3I6dm9pZCAwKSx4cyYmKFpoKHQscnx8dm9pZCAwKSx4cz0hMSk7WnQoKSxuPWV0KCksbncobil9KSxCaT1udWxsfWZ1bmN0aW9uICRiKGUsdCl7a24odCwoKT0+e2xldCBuPUtlKCk7aWYoZGUobikmJiF0LmlzQ29tcG9zaW5nKCkpe2xldCByPW4uYW5jaG9yLG89bi5hbmNob3IuZ2V0Tm9kZSgpO010KHIua2V5KSwoZS50aW1lU3RhbXA8Z2ErMzB8fHIudHlwZT09PSJlbGVtZW50Inx8IW4uaXNDb2xsYXBzZWQoKXx8by5nZXRGb3JtYXQoKSE9PW4uZm9ybWF0fHxvLmdldFN0eWxlKCkhPT1uLnN0eWxlKSYmWSh0LGNsLGliKX19KX1mdW5jdGlvbiBaaChlLHQpe3ZhciBuPWUuX2NvbXBvc2l0aW9uS2V5O2lmKE10KG51bGwpLG4hPT1udWxsJiZ0IT1udWxsKXtpZih0PT09IiIpe3Q9JHQobiksZT1tYyhlLmdldEVsZW1lbnRCeUtleShuKSksZSE9PW51bGwmJmUubm9kZVZhbHVlIT09bnVsbCYmUSh0KSYmSGcodCxlLm5vZGVWYWx1ZSxudWxsLG51bGwsITApO3JldHVybn1pZih0W3QubGVuZ3RoLTFdPT09YApgJiYobj1LZSgpLGRlKG4pKSl7dD1uLmZvY3VzLG4uYW5jaG9yLnNldCh0LmtleSx0Lm9mZnNldCx0LnR5cGUpLFkoZSxwYyxudWxsKTtyZXR1cm59fVZnKCEwLGUsdCl9ZnVuY3Rpb24ga2IoZSx0KXtibz94cz0hMDprbih0LCgpPT57WmgodCxlLmRhdGEpfSl9ZnVuY3Rpb24gVGIoZSx0KXtpZihnYT1lLnRpbWVTdGFtcCxFdz1lLmtleUNvZGUsIXQuaXNDb21wb3NpbmcoKSl7dmFye2tleUNvZGU6bixzaGlmdEtleTpyLGN0cmxLZXk6byxtZXRhS2V5OmksYWx0S2V5Omx9PWU7aWYoIVkodCxMXyxlKSl7aWYobiE9PTM5fHxvfHxpfHxsKWlmKG4hPT0zOXx8bHx8cnx8IW8mJiFpKWlmKG4hPT0zN3x8b3x8aXx8bClpZihuIT09Mzd8fGx8fHJ8fCFvJiYhaSlpZihuIT09Mzh8fG98fGkpaWYobiE9PTQwfHxvfHxpKWlmKG49PT0xMyYmcilJcz0hMCxZKHQscGMsZSk7ZWxzZSBpZihuPT09MzIpWSh0LFVfLGUpO2Vsc2UgaWYoV3QmJm8mJm49PT03OSllLnByZXZlbnREZWZhdWx0KCksSXM9ITAsWSh0LE1zLCEwKTtlbHNlIGlmKG4hPT0xM3x8cil7dmFyIHM9V3Q/bHx8aT8hMTpuPT09OHx8bj09PTcyJiZvOm98fGx8fGk/ITE6bj09PTg7cz9uPT09OD9ZKHQsVl8sZSk6KGUucHJldmVudERlZmF1bHQoKSxZKHQsY2EsITApKTpuPT09Mjc/WSh0LEhfLGUpOihzPVd0P3J8fGx8fGk/ITE6bj09PTQ2fHxuPT09NjgmJm86b3x8bHx8aT8hMTpuPT09NDYscz9uPT09NDY/WSh0LEtfLGUpOihlLnByZXZlbnREZWZhdWx0KCksWSh0LGNhLCExKSk6bj09PTgmJihXdD9sOm8pPyhlLnByZXZlbnREZWZhdWx0KCksWSh0LGRhLCEwKSk6bj09PTQ2JiYoV3Q/bDpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxkYSwhMSkpOld0JiZpJiZuPT09OD8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxmYSwhMCkpOld0JiZpJiZuPT09NDY/KGUucHJldmVudERlZmF1bHQoKSxZKHQsZmEsITEpKTpuPT09NjYmJiFsJiYoV3Q/aTpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxnbywiYm9sZCIpKTpuPT09ODUmJiFsJiYoV3Q/aTpvKT8oZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxnbywidW5kZXJsaW5lIikpOm49PT03MyYmIWwmJihXdD9pOm8pPyhlLnByZXZlbnREZWZhdWx0KCksWSh0LGdvLCJpdGFsaWMiKSk6biE9PTl8fGx8fG98fGk/bj09PTkwJiYhciYmKFd0P2k6byk/KGUucHJldmVudERlZmF1bHQoKSxZKHQsQWcsdm9pZCAwKSk6KHM9V3Q/bj09PTkwJiZpJiZyOm49PT04OSYmb3x8bj09PTkwJiZvJiZyLHM/KGUucHJldmVudERlZmF1bHQoKSxZKHQsTWcsdm9pZCAwKSk6emwodC5fZWRpdG9yU3RhdGUuX3NlbGVjdGlvbik/KHM9cj8hMTpuPT09Njc/V3Q/aTpvOiExLHM/KGUucHJldmVudERlZmF1bHQoKSxZKHQsRGcsZSkpOihzPXI/ITE6bj09PTg4P1d0P2k6bzohMSxzPyhlLnByZXZlbnREZWZhdWx0KCksWSh0LExnLGUpKTpuPT09NjUmJihXdD9pOm8pJiYoZS5wcmV2ZW50RGVmYXVsdCgpLFkodCxqaCxlKSkpKTohYm8mJm49PT02NSYmKFd0P2k6bykmJihlLnByZXZlbnREZWZhdWx0KCksWSh0LGpoLGUpKSk6WSh0LEdfLGUpKX1lbHNlIElzPSExLFkodCxwYyxlKTtlbHNlIFkodCxXXyxlKTtlbHNlIFkodCxCXyxlKTtlbHNlIFkodCxGXyxlKTtlbHNlIFkodCx6XyxlKTtlbHNlIFkodCxqXyxlKTtlbHNlIFkodCxJXyxlKTsob3x8cnx8bHx8aSkmJlkodCxldyxlKX19fWZ1bmN0aW9uIE53KGUpe2xldCB0PWUuX19sZXhpY2FsRXZlbnRIYW5kbGVzO3JldHVybiB0PT09dm9pZCAwJiYodD1bXSxlLl9fbGV4aWNhbEV2ZW50SGFuZGxlcz10KSx0fWxldCBkbD1uZXcgTWFwO2Z1bmN0aW9uIGJ3KGUpe2U9ZS50YXJnZXQ7bGV0IHQ9RXIoZT09bnVsbD9udWxsOmUubm9kZVR5cGU9PT05P2UuZGVmYXVsdFZpZXc6ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KTtpZih0IT09bnVsbCl7dmFyIG49V2codC5hbmNob3JOb2RlKTtpZihuIT09bnVsbCl7SmgmJihKaD0hMSxrbihuLCgpPT57dmFyIGw9RmwoKSxzPXQuYW5jaG9yTm9kZTtzIT09bnVsbCYmKHM9cy5ub2RlVHlwZSxzPT09MXx8cz09PTMpJiYobD1YZyhsLHQsbiksdnIobCkpfSkpLGU9VWcobiksZT1lW2UubGVuZ3RoLTFdO3ZhciByPWUuX2tleSxvPWRsLmdldChyKSxpPW98fGU7aSE9PW4mJmZ5KHQsaSwhMSksZnkodCxuLCEwKSxuIT09ZT9kbC5zZXQocixuKTpvJiZkbC5kZWxldGUocil9fX1mdW5jdGlvbiBOYihlLHQpe0xzPT09MCYmZS5vd25lckRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInNlbGVjdGlvbmNoYW5nZSIsYncpLExzKyssZS5fX2xleGljYWxFZGl0b3I9dDtsZXQgbj1OdyhlKTtmb3IobGV0IHI9MDtyPFhoLmxlbmd0aDtyKyspe2xldFtvLGldPVhoW3JdLGw9dHlwZW9mIGk9PSJmdW5jdGlvbiI/cz0+e3MuX2xleGljYWxIYW5kbGVkIT09ITAmJihzLl9sZXhpY2FsSGFuZGxlZD0hMCx0LmlzRWRpdGFibGUoKSYmaShzLHQpKX06cz0+e2lmKHMuX2xleGljYWxIYW5kbGVkIT09ITAmJihzLl9sZXhpY2FsSGFuZGxlZD0hMCx0LmlzRWRpdGFibGUoKSkpc3dpdGNoKG8pe2Nhc2UiY3V0IjpyZXR1cm4gWSh0LExnLHMpO2Nhc2UiY29weSI6cmV0dXJuIFkodCxEZyxzKTtjYXNlInBhc3RlIjpyZXR1cm4gWSh0LE9nLHMpO2Nhc2UiZHJhZ3N0YXJ0IjpyZXR1cm4gWSh0LFhfLHMpO2Nhc2UiZHJhZ292ZXIiOnJldHVybiBZKHQsUV8scyk7Y2FzZSJkcmFnZW5kIjpyZXR1cm4gWSh0LEpfLHMpO2Nhc2UiZm9jdXMiOnJldHVybiBZKHQsWl8scyk7Y2FzZSJibHVyIjpyZXR1cm4gWSh0LHFfLHMpO2Nhc2UiZHJvcCI6cmV0dXJuIFkodCxZXyxzKX19O2UuYWRkRXZlbnRMaXN0ZW5lcihvLGwpLG4ucHVzaCgoKT0+e2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLGwpfSl9fWZ1bmN0aW9uIHFoKGUsdCxuKXtadCgpO3ZhciByPWUuX19rZXk7bGV0IG89ZS5nZXRQYXJlbnQoKTtpZihvIT09bnVsbCl7dmFyIGk9S2UoKTtpZihkZShpKSYmQihlKSl7dmFye2FuY2hvcjpsLGZvY3VzOnN9PWksYT1sLmdldE5vZGUoKSx1PXMuZ2V0Tm9kZSgpO19jKGEsZSkmJmwuc2V0KGUuX19rZXksMCwiZWxlbWVudCIpLF9jKHUsZSkmJnMuc2V0KGUuX19rZXksMCwiZWxlbWVudCIpfWlmKGE9aSx1PSExLGRlKGEpJiZ0KXtpPWEuYW5jaG9yO2xldCBjPWEuZm9jdXM7aS5rZXk9PT1yJiYoQ2MoaSxlLG8sZS5nZXRQcmV2aW91c1NpYmxpbmcoKSxlLmdldE5leHRTaWJsaW5nKCkpLHU9ITApLGMua2V5PT09ciYmKENjKGMsZSxvLGUuZ2V0UHJldmlvdXNTaWJsaW5nKCksZS5nZXROZXh0U2libGluZygpKSx1PSEwKX1lbHNlIHpsKGEpJiZ0JiZlLmlzU2VsZWN0ZWQoKSYmZS5zZWxlY3RQcmV2aW91cygpO2RlKGEpJiZ0JiYhdT8ocj1lLmdldEluZGV4V2l0aGluUGFyZW50KCksaWkoZSksRWMoYSxvLHIsLTEpKTppaShlKSxufHxKbihvKXx8by5jYW5CZUVtcHR5KCl8fCFvLmlzRW1wdHkoKXx8cWgobyx0KSx0JiZlbihvKSYmby5pc0VtcHR5KCkmJm8uc2VsZWN0RW5kKCl9fWNsYXNzIExhe3N0YXRpYyBnZXRUeXBlKCl7VSg2NCx0aGlzLm5hbWUpfXN0YXRpYyBjbG9uZSgpe1UoNjUsdGhpcy5uYW1lKX1jb25zdHJ1Y3Rvcih0KXt0aGlzLl9fdHlwZT10aGlzLmNvbnN0cnVjdG9yLmdldFR5cGUoKSx0aGlzLl9fbmV4dD10aGlzLl9fcHJldj10aGlzLl9fcGFyZW50PW51bGwsc3codGhpcyx0KX1nZXRUeXBlKCl7cmV0dXJuIHRoaXMuX190eXBlfWlzQXR0YWNoZWQoKXtmb3IodmFyIHQ9dGhpcy5fX2tleTt0IT09bnVsbDspe2lmKHQ9PT0icm9vdCIpcmV0dXJuITA7aWYodD0kdCh0KSx0PT09bnVsbClicmVhazt0PXQuX19wYXJlbnR9cmV0dXJuITF9aXNTZWxlY3RlZCh0KXtpZih0PXR8fEtlKCksdD09bnVsbClyZXR1cm4hMTtsZXQgbj10LmdldE5vZGVzKCkuc29tZShyPT5yLl9fa2V5PT09dGhpcy5fX2tleSk7cmV0dXJuIFEodGhpcyk/bjpkZSh0KSYmdC5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmdC5mb2N1cy50eXBlPT09ImVsZW1lbnQiJiZ0LmFuY2hvci5rZXk9PT10LmZvY3VzLmtleSYmdC5hbmNob3Iub2Zmc2V0PT09dC5mb2N1cy5vZmZzZXQ/ITE6bn1nZXRLZXkoKXtyZXR1cm4gdGhpcy5fX2tleX1nZXRJbmRleFdpdGhpblBhcmVudCgpe3ZhciB0PXRoaXMuZ2V0UGFyZW50KCk7aWYodD09PW51bGwpcmV0dXJuLTE7dD10LmdldEZpcnN0Q2hpbGQoKTtsZXQgbj0wO2Zvcig7dCE9PW51bGw7KXtpZih0aGlzLmlzKHQpKXJldHVybiBuO24rKyx0PXQuZ2V0TmV4dFNpYmxpbmcoKX1yZXR1cm4tMX1nZXRQYXJlbnQoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLl9fcGFyZW50O3JldHVybiB0PT09bnVsbD9udWxsOiR0KHQpfWdldFBhcmVudE9yVGhyb3coKXtsZXQgdD10aGlzLmdldFBhcmVudCgpO3JldHVybiB0PT09bnVsbCYmVSg2Nix0aGlzLl9fa2V5KSx0fWdldFRvcExldmVsRWxlbWVudCgpe2xldCB0PXRoaXM7Zm9yKDt0IT09bnVsbDspe2xldCBuPXQuZ2V0UGFyZW50KCk7aWYoSm4obikpcmV0dXJuIHQ7dD1ufXJldHVybiBudWxsfWdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKXtsZXQgdD10aGlzLmdldFRvcExldmVsRWxlbWVudCgpO3JldHVybiB0PT09bnVsbCYmVSg2Nyx0aGlzLl9fa2V5KSx0fWdldFBhcmVudHMoKXtsZXQgdD1bXSxuPXRoaXMuZ2V0UGFyZW50KCk7Zm9yKDtuIT09bnVsbDspdC5wdXNoKG4pLG49bi5nZXRQYXJlbnQoKTtyZXR1cm4gdH1nZXRQYXJlbnRLZXlzKCl7bGV0IHQ9W10sbj10aGlzLmdldFBhcmVudCgpO2Zvcig7biE9PW51bGw7KXQucHVzaChuLl9fa2V5KSxuPW4uZ2V0UGFyZW50KCk7cmV0dXJuIHR9Z2V0UHJldmlvdXNTaWJsaW5nKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX3ByZXY7cmV0dXJuIHQ9PT1udWxsP251bGw6JHQodCl9Z2V0UHJldmlvdXNTaWJsaW5ncygpe2xldCB0PVtdO3ZhciBuPXRoaXMuZ2V0UGFyZW50KCk7aWYobj09PW51bGwpcmV0dXJuIHQ7Zm9yKG49bi5nZXRGaXJzdENoaWxkKCk7biE9PW51bGwmJiFuLmlzKHRoaXMpOyl0LnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0TmV4dFNpYmxpbmcoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpLl9fbmV4dDtyZXR1cm4gdD09PW51bGw/bnVsbDokdCh0KX1nZXROZXh0U2libGluZ3MoKXtsZXQgdD1bXSxuPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q29tbW9uQW5jZXN0b3IodCl7bGV0IG49dGhpcy5nZXRQYXJlbnRzKCk7dmFyIHI9dC5nZXRQYXJlbnRzKCk7Qih0aGlzKSYmbi51bnNoaWZ0KHRoaXMpLEIodCkmJnIudW5zaGlmdCh0KSx0PW4ubGVuZ3RoO3ZhciBvPXIubGVuZ3RoO2lmKHQ9PT0wfHxvPT09MHx8blt0LTFdIT09cltvLTFdKXJldHVybiBudWxsO2ZvcihyPW5ldyBTZXQociksbz0wO288dDtvKyspe2xldCBpPW5bb107aWYoci5oYXMoaSkpcmV0dXJuIGl9cmV0dXJuIG51bGx9aXModCl7cmV0dXJuIHQ9PW51bGw/ITE6dGhpcy5fX2tleT09PXQuX19rZXl9aXNCZWZvcmUodCl7aWYodGhpcz09PXQpcmV0dXJuITE7aWYodC5pc1BhcmVudE9mKHRoaXMpKXJldHVybiEwO2lmKHRoaXMuaXNQYXJlbnRPZih0KSlyZXR1cm4hMTt2YXIgbj10aGlzLmdldENvbW1vbkFuY2VzdG9yKHQpO2xldCByPXRoaXM7Zm9yKDs7KXt2YXIgbz1yLmdldFBhcmVudE9yVGhyb3coKTtpZihvPT09bil7bz1yLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9cj1vfWZvcihyPXQ7Oyl7aWYodD1yLmdldFBhcmVudE9yVGhyb3coKSx0PT09bil7bj1yLmdldEluZGV4V2l0aGluUGFyZW50KCk7YnJlYWt9cj10fXJldHVybiBvPG59aXNQYXJlbnRPZih0KXtsZXQgbj10aGlzLl9fa2V5O2lmKG49PT10Ll9fa2V5KXJldHVybiExO2Zvcig7dCE9PW51bGw7KXtpZih0Ll9fa2V5PT09bilyZXR1cm4hMDt0PXQuZ2V0UGFyZW50KCl9cmV0dXJuITF9Z2V0Tm9kZXNCZXR3ZWVuKHQpe2xldCBuPXRoaXMuaXNCZWZvcmUodCkscj1bXSxvPW5ldyBTZXQ7Zm9yKHZhciBpPXRoaXM7Oyl7dmFyIGw9aS5fX2tleTtpZihvLmhhcyhsKXx8KG8uYWRkKGwpLHIucHVzaChpKSksaT09PXQpYnJlYWs7aWYobD1CKGkpP24/aS5nZXRGaXJzdENoaWxkKCk6aS5nZXRMYXN0Q2hpbGQoKTpudWxsLGwhPT1udWxsKWk9bDtlbHNlIGlmKGw9bj9pLmdldE5leHRTaWJsaW5nKCk6aS5nZXRQcmV2aW91c1NpYmxpbmcoKSxsIT09bnVsbClpPWw7ZWxzZXtpZihpPWkuZ2V0UGFyZW50T3JUaHJvdygpLG8uaGFzKGkuX19rZXkpfHxyLnB1c2goaSksaT09PXQpYnJlYWs7bD1pO2RvIGw9PT1udWxsJiZVKDY4KSxpPW4/bC5nZXROZXh0U2libGluZygpOmwuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD1sLmdldFBhcmVudCgpLGwhPT1udWxsJiYoaSE9PW51bGx8fG8uaGFzKGwuX19rZXkpfHxyLnB1c2gobCkpO3doaWxlKGk9PT1udWxsKX19cmV0dXJuIG58fHIucmV2ZXJzZSgpLHJ9aXNEaXJ0eSgpe2xldCB0PWV0KCkuX2RpcnR5TGVhdmVzO3JldHVybiB0IT09bnVsbCYmdC5oYXModGhpcy5fX2tleSl9Z2V0TGF0ZXN0KCl7bGV0IHQ9JHQodGhpcy5fX2tleSk7cmV0dXJuIHQ9PT1udWxsJiZVKDExMyksdH1nZXRXcml0YWJsZSgpe1p0KCk7dmFyIHQ9Q3IoKSxuPWV0KCk7dD10Ll9ub2RlTWFwO2xldCByPXRoaXMuX19rZXksbz10aGlzLmdldExhdGVzdCgpLGk9by5fX3BhcmVudDtuPW4uX2Nsb25lTm90TmVlZGVkO3ZhciBsPUtlKCk7cmV0dXJuIGwhPT1udWxsJiYobC5fY2FjaGVkTm9kZXM9bnVsbCksbi5oYXMocik/KHZjKG8pLG8pOihsPW8uY29uc3RydWN0b3IuY2xvbmUobyksbC5fX3BhcmVudD1pLGwuX19uZXh0PW8uX19uZXh0LGwuX19wcmV2PW8uX19wcmV2LEIobykmJkIobCk/KGwuX19maXJzdD1vLl9fZmlyc3QsbC5fX2xhc3Q9by5fX2xhc3QsbC5fX3NpemU9by5fX3NpemUsbC5fX2luZGVudD1vLl9faW5kZW50LGwuX19mb3JtYXQ9by5fX2Zvcm1hdCxsLl9fZGlyPW8uX19kaXIpOlEobykmJlEobCkmJihsLl9fZm9ybWF0PW8uX19mb3JtYXQsbC5fX3N0eWxlPW8uX19zdHlsZSxsLl9fbW9kZT1vLl9fbW9kZSxsLl9fZGV0YWlsPW8uX19kZXRhaWwpLG4uYWRkKHIpLGwuX19rZXk9cix2YyhsKSx0LnNldChyLGwpLGwpfWdldFRleHRDb250ZW50KCl7cmV0dXJuIiJ9Z2V0VGV4dENvbnRlbnRTaXplKCl7cmV0dXJuIHRoaXMuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9Y3JlYXRlRE9NKCl7VSg3MCl9dXBkYXRlRE9NKCl7VSg3MSl9ZXhwb3J0RE9NKHQpe3JldHVybntlbGVtZW50OnRoaXMuY3JlYXRlRE9NKHQuX2NvbmZpZyx0KX19ZXhwb3J0SlNPTigpe1UoNzIpfXN0YXRpYyBpbXBvcnRKU09OKCl7VSgxOCx0aGlzLm5hbWUpfXN0YXRpYyB0cmFuc2Zvcm0oKXtyZXR1cm4gbnVsbH1yZW1vdmUodCl7cWgodGhpcywhMCx0KX1yZXBsYWNlKHQsbil7WnQoKTt2YXIgcj1LZSgpO3IhPT1udWxsJiYocj1yLmNsb25lKCkpLGhmKHRoaXMsdCk7bGV0IG89dGhpcy5nZXRMYXRlc3QoKSxpPXRoaXMuX19rZXksbD10Ll9fa2V5LHM9dC5nZXRXcml0YWJsZSgpO3Q9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0V3JpdGFibGUoKTtsZXQgYT10Ll9fc2l6ZTtpaShzKTtsZXQgdT1vLmdldFByZXZpb3VzU2libGluZygpLGM9by5nZXROZXh0U2libGluZygpLGQ9by5fX3ByZXYsZj1vLl9fbmV4dCxoPW8uX19wYXJlbnQ7cmV0dXJuIHFoKG8sITEsITApLHU9PT1udWxsP3QuX19maXJzdD1sOnUuZ2V0V3JpdGFibGUoKS5fX25leHQ9bCxzLl9fcHJldj1kLGM9PT1udWxsP3QuX19sYXN0PWw6Yy5nZXRXcml0YWJsZSgpLl9fcHJldj1sLHMuX19uZXh0PWYscy5fX3BhcmVudD1oLHQuX19zaXplPWEsbiYmdGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2goZz0+e3MuYXBwZW5kKGcpfSksZGUocikmJih2cihyKSxuPXIuYW5jaG9yLHI9ci5mb2N1cyxuLmtleT09PWkmJmd5KG4scyksci5rZXk9PT1pJiZneShyLHMpKSxtbygpPT09aSYmTXQobCksc31pbnNlcnRBZnRlcih0LG49ITApe1p0KCksaGYodGhpcyx0KTt2YXIgcj10aGlzLmdldFdyaXRhYmxlKCk7bGV0IG89dC5nZXRXcml0YWJsZSgpO3ZhciBpPW8uZ2V0UGFyZW50KCk7bGV0IGw9S2UoKTt2YXIgcz0hMSxhPSExO2lmKGkhPT1udWxsKXt2YXIgdT10LmdldEluZGV4V2l0aGluUGFyZW50KCk7aWkobyksZGUobCkmJihhPWkuX19rZXkscz1sLmFuY2hvcixpPWwuZm9jdXMscz1zLnR5cGU9PT0iZWxlbWVudCImJnMua2V5PT09YSYmcy5vZmZzZXQ9PT11KzEsYT1pLnR5cGU9PT0iZWxlbWVudCImJmkua2V5PT09YSYmaS5vZmZzZXQ9PT11KzEpfWk9dGhpcy5nZXROZXh0U2libGluZygpLHU9dGhpcy5nZXRQYXJlbnRPclRocm93KCkuZ2V0V3JpdGFibGUoKTtsZXQgYz1vLl9fa2V5LGQ9ci5fX25leHQ7cmV0dXJuIGk9PT1udWxsP3UuX19sYXN0PWM6aS5nZXRXcml0YWJsZSgpLl9fcHJldj1jLHUuX19zaXplKyssci5fX25leHQ9YyxvLl9fbmV4dD1kLG8uX19wcmV2PXIuX19rZXksby5fX3BhcmVudD1yLl9fcGFyZW50LG4mJmRlKGwpJiYobj10aGlzLmdldEluZGV4V2l0aGluUGFyZW50KCksRWMobCx1LG4rMSkscj11Ll9fa2V5LHMmJmwuYW5jaG9yLnNldChyLG4rMiwiZWxlbWVudCIpLGEmJmwuZm9jdXMuc2V0KHIsbisyLCJlbGVtZW50IikpLHR9aW5zZXJ0QmVmb3JlKHQsbj0hMCl7WnQoKSxoZih0aGlzLHQpO3ZhciByPXRoaXMuZ2V0V3JpdGFibGUoKTtsZXQgbz10LmdldFdyaXRhYmxlKCksaT1vLl9fa2V5O2lpKG8pO2xldCBsPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkscz10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRXcml0YWJsZSgpLGE9ci5fX3ByZXYsdT10aGlzLmdldEluZGV4V2l0aGluUGFyZW50KCk7cmV0dXJuIGw9PT1udWxsP3MuX19maXJzdD1pOmwuZ2V0V3JpdGFibGUoKS5fX25leHQ9aSxzLl9fc2l6ZSsrLHIuX19wcmV2PWksby5fX3ByZXY9YSxvLl9fbmV4dD1yLl9fa2V5LG8uX19wYXJlbnQ9ci5fX3BhcmVudCxyPUtlKCksbiYmZGUocikmJihuPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLEVjKHIsbix1KSksdH1pc1BhcmVudFJlcXVpcmVkKCl7cmV0dXJuITF9Y3JlYXRlUGFyZW50RWxlbWVudE5vZGUoKXtyZXR1cm4gaGkoKX1zZWxlY3RQcmV2aW91cyh0LG4pe1p0KCk7bGV0IHI9dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSxvPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpO3JldHVybiByPT09bnVsbD9vLnNlbGVjdCgwLDApOkIocik/ci5zZWxlY3QoKTpRKHIpP3Iuc2VsZWN0KHQsbik6KHQ9ci5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsby5zZWxlY3QodCx0KSl9c2VsZWN0TmV4dCh0LG4pe1p0KCk7bGV0IHI9dGhpcy5nZXROZXh0U2libGluZygpLG89dGhpcy5nZXRQYXJlbnRPclRocm93KCk7cmV0dXJuIHI9PT1udWxsP28uc2VsZWN0KCk6QihyKT9yLnNlbGVjdCgwLDApOlEocik/ci5zZWxlY3QodCxuKToodD1yLmdldEluZGV4V2l0aGluUGFyZW50KCksby5zZWxlY3QodCx0KSl9bWFya0RpcnR5KCl7dGhpcy5nZXRXcml0YWJsZSgpfX1jbGFzcyBJbCBleHRlbmRzIExhe3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImxpbmVicmVhayJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgSWwodC5fX2tleSl9Y29uc3RydWN0b3IodCl7c3VwZXIodCl9Z2V0VGV4dENvbnRlbnQoKXtyZXR1cm5gCmB9Y3JlYXRlRE9NKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIil9dXBkYXRlRE9NKCl7cmV0dXJuITF9c3RhdGljIGltcG9ydERPTSgpe3JldHVybnticjp0PT57bGV0IG49dC5wYXJlbnRFbGVtZW50LHIsbztyZXR1cm4gbiE9PW51bGwmJigocj1uLmZpcnN0Q2hpbGQpPT09dHx8ci5uZXh0U2libGluZz09PXQmJnIubm9kZVR5cGU9PT0zJiYoci50ZXh0Q29udGVudHx8IiIpLm1hdGNoKC9eKCB8XHR8XHI/XG4pKyQvKSE9PW51bGwpJiYoKG89bi5sYXN0Q2hpbGQpPT09dHx8by5wcmV2aW91c1NpYmxpbmc9PT10JiZvLm5vZGVUeXBlPT09MyYmKG8udGV4dENvbnRlbnR8fCIiKS5tYXRjaCgvXiggfFx0fFxyP1xuKSskLykhPT1udWxsKT9udWxsOntjb252ZXJzaW9uOmJiLHByaW9yaXR5OjB9fX19c3RhdGljIGltcG9ydEpTT04oKXtyZXR1cm4gJGwoKX1leHBvcnRKU09OKCl7cmV0dXJue3R5cGU6ImxpbmVicmVhayIsdmVyc2lvbjoxfX19ZnVuY3Rpb24gYmIoKXtyZXR1cm57bm9kZTokbCgpfX1mdW5jdGlvbiAkbCgpe3JldHVybiBEYShuZXcgSWwpfWZ1bmN0aW9uIG1hKGUpe3JldHVybiBlIGluc3RhbmNlb2YgSWx9ZnVuY3Rpb24gbWYoZSx0KXtyZXR1cm4gdCYxNj8iY29kZSI6dCYxMjg/Im1hcmsiOnQmMzI/InN1YiI6dCY2ND8ic3VwIjpudWxsfWZ1bmN0aW9uIHZmKGUsdCl7cmV0dXJuIHQmMT8ic3Ryb25nIjp0JjI/ImVtIjoic3BhbiJ9ZnVuY3Rpb24geWYoZSx0LG4scixvKXtlPXIuY2xhc3NMaXN0LHI9RHMobywiYmFzZSIpLHIhPT12b2lkIDAmJmUuYWRkKC4uLnIpLHI9RHMobywidW5kZXJsaW5lU3RyaWtldGhyb3VnaCIpO2xldCBpPSExLGw9dCY4JiZ0JjQ7dmFyIHM9biY4JiZuJjQ7ciE9PXZvaWQgMCYmKHM/KGk9ITAsbHx8ZS5hZGQoLi4ucikpOmwmJmUucmVtb3ZlKC4uLnIpKTtmb3IobGV0IGEgaW4gb2kpcz1vaVthXSxyPURzKG8sYSksciE9PXZvaWQgMCYmKG4mcz8haXx8YSE9PSJ1bmRlcmxpbmUiJiZhIT09InN0cmlrZXRocm91Z2giPyghKHQmcyl8fGwmJmE9PT0idW5kZXJsaW5lInx8YT09PSJzdHJpa2V0aHJvdWdoIikmJmUuYWRkKC4uLnIpOnQmcyYmZS5yZW1vdmUoLi4ucik6dCZzJiZlLnJlbW92ZSguLi5yKSl9ZnVuY3Rpb24geGYoZSx0LG4pe2xldCByPXQuZmlyc3RDaGlsZDtpZihuPW4uaXNDb21wb3NpbmcoKSxlKz1uP2FkOiIiLHI9PW51bGwpdC50ZXh0Q29udGVudD1lO2Vsc2UgaWYodD1yLm5vZGVWYWx1ZSx0IT09ZSlpZihufHxibyl7bj10Lmxlbmd0aDtsZXQgbz1lLmxlbmd0aCxpPTAsbD0wO2Zvcig7aTxuJiZpPG8mJnRbaV09PT1lW2ldOylpKys7Zm9yKDtsK2k8biYmbCtpPG8mJnRbbi1sLTFdPT09ZVtvLWwtMV07KWwrKztlPVtpLG4taS1sLGUuc2xpY2UoaSxvLWwpXTtsZXRbcyxhLHVdPWU7YSE9PTAmJnIuZGVsZXRlRGF0YShzLGEpLHIuaW5zZXJ0RGF0YShzLHUpfWVsc2Ugci5ub2RlVmFsdWU9ZX1mdW5jdGlvbiBkdShlLHQpe3JldHVybiB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCksdC5hcHBlbmRDaGlsZChlKSx0fWNsYXNzICRpIGV4dGVuZHMgTGF7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4idGV4dCJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgJGkodC5fX3RleHQsdC5fX2tleSl9Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLl9fdGV4dD10LHRoaXMuX19mb3JtYXQ9MCx0aGlzLl9fc3R5bGU9IiIsdGhpcy5fX2RldGFpbD10aGlzLl9fbW9kZT0wfWdldEZvcm1hdCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fZm9ybWF0fWdldERldGFpbCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fZGV0YWlsfWdldE1vZGUoKXtsZXQgdD10aGlzLmdldExhdGVzdCgpO3JldHVybiBkYlt0Ll9fbW9kZV19Z2V0U3R5bGUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3N0eWxlfWlzVG9rZW4oKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX21vZGU9PT0xfWlzQ29tcG9zaW5nKCl7cmV0dXJuIHRoaXMuX19rZXk9PT1tbygpfWlzU2VnbWVudGVkKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19tb2RlPT09Mn1pc0RpcmVjdGlvbmxlc3MoKXtyZXR1cm4odGhpcy5nZXRMYXRlc3QoKS5fX2RldGFpbCYxKSE9PTB9aXNVbm1lcmdlYWJsZSgpe3JldHVybih0aGlzLmdldExhdGVzdCgpLl9fZGV0YWlsJjIpIT09MH1oYXNGb3JtYXQodCl7cmV0dXJuIHQ9b2lbdF0sKHRoaXMuZ2V0Rm9ybWF0KCkmdCkhPT0wfWlzU2ltcGxlVGV4dCgpe3JldHVybiB0aGlzLl9fdHlwZT09PSJ0ZXh0IiYmdGhpcy5fX21vZGU9PT0wfWdldFRleHRDb250ZW50KCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX190ZXh0fWdldEZvcm1hdEZsYWdzKHQsbil7bGV0IHI9dGhpcy5nZXRMYXRlc3QoKS5fX2Zvcm1hdDtyZXR1cm4gaXcocix0LG4pfWNyZWF0ZURPTSh0KXt2YXIgbj10aGlzLl9fZm9ybWF0LHI9bWYodGhpcyxuKTtsZXQgbz12Zih0aGlzLG4pLGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChyPT09bnVsbD9vOnIpLGw9aTtyZXR1cm4gdGhpcy5oYXNGb3JtYXQoImNvZGUiKSYmaS5zZXRBdHRyaWJ1dGUoInNwZWxsY2hlY2siLCJmYWxzZSIpLHIhPT1udWxsJiYobD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KG8pLGkuYXBwZW5kQ2hpbGQobCkpLHI9bCx4Zih0aGlzLl9fdGV4dCxyLHRoaXMpLHQ9dC50aGVtZS50ZXh0LHQhPT12b2lkIDAmJnlmKG8sMCxuLHIsdCksbj10aGlzLl9fc3R5bGUsbiE9PSIiJiYoaS5zdHlsZS5jc3NUZXh0PW4pLGl9dXBkYXRlRE9NKHQsbixyKXtsZXQgbz10aGlzLl9fdGV4dDt2YXIgaT10Ll9fZm9ybWF0LGw9dGhpcy5fX2Zvcm1hdCxzPW1mKHRoaXMsaSk7bGV0IGE9bWYodGhpcyxsKTt2YXIgdT12Zih0aGlzLGkpO2xldCBjPXZmKHRoaXMsbCk7cmV0dXJuKHM9PT1udWxsP3U6cykhPT0oYT09PW51bGw/YzphKT8hMDpzPT09YSYmdSE9PWM/KGk9bi5maXJzdENoaWxkLGk9PW51bGwmJlUoNDgpLHQ9cz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGMpLHhmKG8sdCx0aGlzKSxyPXIudGhlbWUudGV4dCxyIT09dm9pZCAwJiZ5ZihjLDAsbCx0LHIpLG4ucmVwbGFjZUNoaWxkKHMsaSksITEpOih1PW4sYSE9PW51bGwmJnMhPT1udWxsJiYodT1uLmZpcnN0Q2hpbGQsdT09bnVsbCYmVSg0OSkpLHhmKG8sdSx0aGlzKSxyPXIudGhlbWUudGV4dCxyIT09dm9pZCAwJiZpIT09bCYmeWYoYyxpLGwsdSxyKSxsPXRoaXMuX19zdHlsZSx0Ll9fc3R5bGUhPT1sJiYobi5zdHlsZS5jc3NUZXh0PWwpLCExKX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJueyIjdGV4dCI6KCk9Pih7Y29udmVyc2lvbjpPYixwcmlvcml0eTowfSksYjooKT0+KHtjb252ZXJzaW9uOlBiLHByaW9yaXR5OjB9KSxjb2RlOigpPT4oe2NvbnZlcnNpb246cm8scHJpb3JpdHk6MH0pLGVtOigpPT4oe2NvbnZlcnNpb246cm8scHJpb3JpdHk6MH0pLGk6KCk9Pih7Y29udmVyc2lvbjpybyxwcmlvcml0eTowfSksczooKT0+KHtjb252ZXJzaW9uOnJvLHByaW9yaXR5OjB9KSxzcGFuOigpPT4oe2NvbnZlcnNpb246UmIscHJpb3JpdHk6MH0pLHN0cm9uZzooKT0+KHtjb252ZXJzaW9uOnJvLHByaW9yaXR5OjB9KSxzdWI6KCk9Pih7Y29udmVyc2lvbjpybyxwcmlvcml0eTowfSksc3VwOigpPT4oe2NvbnZlcnNpb246cm8scHJpb3JpdHk6MH0pLHU6KCk9Pih7Y29udmVyc2lvbjpybyxwcmlvcml0eTowfSl9fXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPUV0KHQudGV4dCk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldERldGFpbCh0LmRldGFpbCksbi5zZXRNb2RlKHQubW9kZSksbi5zZXRTdHlsZSh0LnN0eWxlKSxufWV4cG9ydERPTSh0KXtyZXR1cm57ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCE9PW51bGwmJmRkKHQpfHxVKDEzMiksdC5zdHlsZS53aGl0ZVNwYWNlPSJwcmUtd3JhcCIsdGhpcy5oYXNGb3JtYXQoImJvbGQiKSYmKHQ9ZHUodCwiYiIpKSx0aGlzLmhhc0Zvcm1hdCgiaXRhbGljIikmJih0PWR1KHQsImkiKSksdGhpcy5oYXNGb3JtYXQoInN0cmlrZXRocm91Z2giKSYmKHQ9ZHUodCwicyIpKSx0aGlzLmhhc0Zvcm1hdCgidW5kZXJsaW5lIikmJih0PWR1KHQsInUiKSkse2VsZW1lbnQ6dH19ZXhwb3J0SlNPTigpe3JldHVybntkZXRhaWw6dGhpcy5nZXREZXRhaWwoKSxmb3JtYXQ6dGhpcy5nZXRGb3JtYXQoKSxtb2RlOnRoaXMuZ2V0TW9kZSgpLHN0eWxlOnRoaXMuZ2V0U3R5bGUoKSx0ZXh0OnRoaXMuZ2V0VGV4dENvbnRlbnQoKSx0eXBlOiJ0ZXh0Iix2ZXJzaW9uOjF9fXNlbGVjdGlvblRyYW5zZm9ybSgpe31zZXRGb3JtYXQodCl7bGV0IG49dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiBuLl9fZm9ybWF0PXR5cGVvZiB0PT0ic3RyaW5nIj9vaVt0XTp0LG59c2V0RGV0YWlsKHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX2RldGFpbD10eXBlb2YgdD09InN0cmluZyI/YWJbdF06dCxufXNldFN0eWxlKHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX3N0eWxlPXQsbn10b2dnbGVGb3JtYXQodCl7cmV0dXJuIHQ9b2lbdF0sdGhpcy5zZXRGb3JtYXQodGhpcy5nZXRGb3JtYXQoKV50KX10b2dnbGVEaXJlY3Rpb25sZXNzKCl7bGV0IHQ9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiB0Ll9fZGV0YWlsXj0xLHR9dG9nZ2xlVW5tZXJnZWFibGUoKXtsZXQgdD10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIHQuX19kZXRhaWxePTIsdH1zZXRNb2RlKHQpe2lmKHQ9Y2JbdF0sdGhpcy5fX21vZGU9PT10KXJldHVybiB0aGlzO2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtyZXR1cm4gbi5fX21vZGU9dCxufXNldFRleHRDb250ZW50KHQpe2lmKHRoaXMuX190ZXh0PT09dClyZXR1cm4gdGhpcztsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX190ZXh0PXQsbn1zZWxlY3QodCxuKXtadCgpO2xldCByPUtlKCk7dmFyIG89dGhpcy5nZXRUZXh0Q29udGVudCgpO2xldCBpPXRoaXMuX19rZXk7aWYodHlwZW9mIG89PSJzdHJpbmciPyhvPW8ubGVuZ3RoLHQ9PT12b2lkIDAmJih0PW8pLG49PT12b2lkIDAmJihuPW8pKTpuPXQ9MCxkZShyKSlvPW1vKCksbyE9PXIuYW5jaG9yLmtleSYmbyE9PXIuZm9jdXMua2V5fHxNdChpKSxyLnNldFRleHROb2RlUmFuZ2UodGhpcyx0LHRoaXMsbik7ZWxzZSByZXR1cm4gT3coaSx0LGksbiwidGV4dCIsInRleHQiKTtyZXR1cm4gcn1zcGxpY2VUZXh0KHQsbixyLG8pe2xldCBpPXRoaXMuZ2V0V3JpdGFibGUoKSxsPWkuX190ZXh0LHM9ci5sZW5ndGgsYT10OzA+YSYmKGE9cythLDA+YSYmKGE9MCkpO2xldCB1PUtlKCk7cmV0dXJuIG8mJmRlKHUpJiYodCs9cyx1LnNldFRleHROb2RlUmFuZ2UoaSx0LGksdCkpLG49bC5zbGljZSgwLGEpK3IrbC5zbGljZShhK24pLGkuX190ZXh0PW4saX1jYW5JbnNlcnRUZXh0QmVmb3JlKCl7cmV0dXJuITB9Y2FuSW5zZXJ0VGV4dEFmdGVyKCl7cmV0dXJuITB9c3BsaXRUZXh0KC4uLnQpe1p0KCk7dmFyIG49dGhpcy5nZXRMYXRlc3QoKSxyPW4uZ2V0VGV4dENvbnRlbnQoKSxvPW4uX19rZXksaT1tbygpLGw9bmV3IFNldCh0KTt0PVtdO2Zvcih2YXIgcz1yLmxlbmd0aCxhPSIiLHU9MDt1PHM7dSsrKWEhPT0iIiYmbC5oYXModSkmJih0LnB1c2goYSksYT0iIiksYSs9clt1XTtpZihhIT09IiImJnQucHVzaChhKSxsPXQubGVuZ3RoLGw9PT0wKXJldHVybltdO2lmKHRbMF09PT1yKXJldHVybltuXTt2YXIgYz10WzBdO3I9bi5nZXRQYXJlbnRPclRocm93KCksdT1uLmdldEZvcm1hdCgpO2xldCBkPW4uZ2V0U3R5bGUoKSxmPW4uX19kZXRhaWw7cz0hMSxuLmlzU2VnbWVudGVkKCk/KGE9RXQoYyksYS5fX2Zvcm1hdD11LGEuX19zdHlsZT1kLGEuX19kZXRhaWw9ZixzPSEwKTooYT1uLmdldFdyaXRhYmxlKCksYS5fX3RleHQ9Yyksbj1LZSgpLGE9W2FdLGM9Yy5sZW5ndGg7Zm9yKGxldCBtPTE7bTxsO20rKyl7dmFyIGg9dFttXSxnPWgubGVuZ3RoO2g9RXQoaCkuZ2V0V3JpdGFibGUoKSxoLl9fZm9ybWF0PXUsaC5fX3N0eWxlPWQsaC5fX2RldGFpbD1mO2xldCBTPWguX19rZXk7aWYoZz1jK2csZGUobikpe2xldCB2PW4uYW5jaG9yLHk9bi5mb2N1czt2LmtleT09PW8mJnYudHlwZT09PSJ0ZXh0IiYmdi5vZmZzZXQ+YyYmdi5vZmZzZXQ8PWcmJih2LmtleT1TLHYub2Zmc2V0LT1jLG4uZGlydHk9ITApLHkua2V5PT09byYmeS50eXBlPT09InRleHQiJiZ5Lm9mZnNldD5jJiZ5Lm9mZnNldDw9ZyYmKHkua2V5PVMseS5vZmZzZXQtPWMsbi5kaXJ0eT0hMCl9aT09PW8mJk10KFMpLGM9ZyxhLnB1c2goaCl9cmV0dXJuIG89dGhpcy5nZXRQcmV2aW91c1NpYmxpbmcoKSxpPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSxvIT09bnVsbCYmdmMobyksaSE9PW51bGwmJnZjKGkpLG89ci5nZXRXcml0YWJsZSgpLGk9dGhpcy5nZXRJbmRleFdpdGhpblBhcmVudCgpLHM/KG8uc3BsaWNlKGksMCxhKSx0aGlzLnJlbW92ZSgpKTpvLnNwbGljZShpLDEsYSksZGUobikmJkVjKG4scixpLGwtMSksYX1tZXJnZVdpdGhTaWJsaW5nKHQpe3ZhciBuPXQ9PT10aGlzLmdldFByZXZpb3VzU2libGluZygpO258fHQ9PT10aGlzLmdldE5leHRTaWJsaW5nKCl8fFUoNTApO3ZhciByPXRoaXMuX19rZXk7bGV0IG89dC5fX2tleSxpPXRoaXMuX190ZXh0LGw9aS5sZW5ndGg7bW8oKT09PW8mJk10KHIpO2xldCBzPUtlKCk7aWYoZGUocykpe2xldCBhPXMuYW5jaG9yLHU9cy5mb2N1czthIT09bnVsbCYmYS5rZXk9PT1vJiYoU3koYSxuLHIsdCxsKSxzLmRpcnR5PSEwKSx1IT09bnVsbCYmdS5rZXk9PT1vJiYoU3kodSxuLHIsdCxsKSxzLmRpcnR5PSEwKX1yZXR1cm4gcj10Ll9fdGV4dCx0aGlzLnNldFRleHRDb250ZW50KG4/citpOmkrciksbj10aGlzLmdldFdyaXRhYmxlKCksdC5yZW1vdmUoKSxufWlzVGV4dEVudGl0eSgpe3JldHVybiExfX1mdW5jdGlvbiBSYihlKXtsZXQgdD1lLnN0eWxlLmZvbnRXZWlnaHQ9PT0iNzAwIixuPWUuc3R5bGUudGV4dERlY29yYXRpb249PT0ibGluZS10aHJvdWdoIixyPWUuc3R5bGUuZm9udFN0eWxlPT09Iml0YWxpYyIsbz1lLnN0eWxlLnRleHREZWNvcmF0aW9uPT09InVuZGVybGluZSIsaT1lLnN0eWxlLnZlcnRpY2FsQWxpZ247cmV0dXJue2ZvckNoaWxkOmw9PihRKGwpJiYodCYmbC50b2dnbGVGb3JtYXQoImJvbGQiKSxuJiZsLnRvZ2dsZUZvcm1hdCgic3RyaWtldGhyb3VnaCIpLHImJmwudG9nZ2xlRm9ybWF0KCJpdGFsaWMiKSxvJiZsLnRvZ2dsZUZvcm1hdCgidW5kZXJsaW5lIiksaT09PSJzdWIiJiZsLnRvZ2dsZUZvcm1hdCgic3Vic2NyaXB0IiksaT09PSJzdXBlciImJmwudG9nZ2xlRm9ybWF0KCJzdXBlcnNjcmlwdCIpKSxsKSxub2RlOm51bGx9fWZ1bmN0aW9uIFBiKGUpe2xldCB0PWUuc3R5bGUuZm9udFdlaWdodD09PSJub3JtYWwiO3JldHVybntmb3JDaGlsZDpuPT4oUShuKSYmIXQmJm4udG9nZ2xlRm9ybWF0KCJib2xkIiksbiksbm9kZTpudWxsfX1sZXQgaHk9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gT2IoZSl7ZS5wYXJlbnRFbGVtZW50PT09bnVsbCYmVSgxMjkpO2Zvcih2YXIgdD1lLnRleHRDb250ZW50fHwiIixuLHI9ZS5wYXJlbnROb2RlLG89W2VdO3IhPT1udWxsJiYobj1oeS5nZXQocikpPT09dm9pZCAwJiYhKHIubm9kZU5hbWU9PT0iUFJFInx8ci5ub2RlVHlwZT09PTEmJnIuc3R5bGUud2hpdGVTcGFjZS5zdGFydHNXaXRoKCJwcmUiKSk7KW8ucHVzaChyKSxyPXIucGFyZW50Tm9kZTtmb3Iobj1uPT09dm9pZCAwP3I6bixyPTA7cjxvLmxlbmd0aDtyKyspaHkuc2V0KG9bcl0sbik7aWYobiE9PW51bGwpe2Zvcih0PXQuc3BsaXQoLyhccj9cbnxcdCkvKSxlPVtdLG89dC5sZW5ndGgsbj0wO248bztuKyspcj10W25dLHI9PT1gCmB8fHI9PT1gXHIKYD9lLnB1c2goJGwoKSk6cj09PSIJIj9lLnB1c2goaGQoKSk6ciE9PSIiJiZlLnB1c2goRXQocikpO3JldHVybntub2RlOmV9fWlmKHQ9dC5yZXBsYWNlKC9cci9nLCIiKS5yZXBsYWNlKC9bIFx0XG5dKy9nLCIgIiksdD09PSIiKXJldHVybntub2RlOm51bGx9O2lmKHRbMF09PT0iICIpe2ZvcihvPWUsbj0hMDtvIT09bnVsbCYmKG89cHkobywhMSkpIT09bnVsbDspaWYocj1vLnRleHRDb250ZW50fHwiIiwwPHIubGVuZ3RoKXsvWyBcdFxuXSQvLnRlc3QocikmJih0PXQuc2xpY2UoMSkpLG49ITE7YnJlYWt9biYmKHQ9dC5zbGljZSgxKSl9aWYodFt0Lmxlbmd0aC0xXT09PSIgIil7Zm9yKG89ITA7ZSE9PW51bGwmJihlPXB5KGUsITApKSE9PW51bGw7KWlmKDA8KGUudGV4dENvbnRlbnR8fCIiKS5yZXBsYWNlKC9eKCB8XHR8XHI/XG4pKy8sIiIpLmxlbmd0aCl7bz0hMTticmVha31vJiYodD10LnNsaWNlKDAsdC5sZW5ndGgtMSkpfXJldHVybiB0PT09IiI/e25vZGU6bnVsbH06e25vZGU6RXQodCl9fWxldCBBYj1uZXcgUmVnRXhwKC9eKGF8YWJicnxhY3JvbnltfGJ8Y2l0ZXxjb2RlfGRlbHxlbXxpfGluc3xrYmR8bGFiZWx8b3V0cHV0fHF8cnVieXxzfHNhbXB8c3BhbnxzdHJvbmd8c3VifHN1cHx0aW1lfHV8dHR8dmFyKSQvLCJpIik7ZnVuY3Rpb24gcHkoZSx0KXtmb3IoOzspe2Zvcih2YXIgbj12b2lkIDA7KG49dD9lLm5leHRTaWJsaW5nOmUucHJldmlvdXNTaWJsaW5nKT09PW51bGw7KWlmKGU9ZS5wYXJlbnRFbGVtZW50LGU9PT1udWxsKXJldHVybiBudWxsO2lmKGU9bixlLm5vZGVUeXBlPT09MSYmKG49ZS5zdHlsZS5kaXNwbGF5LG49PT0iIiYmZS5ub2RlTmFtZS5tYXRjaChBYik9PT1udWxsfHxuIT09IiImJiFuLnN0YXJ0c1dpdGgoImlubGluZSIpKSlyZXR1cm4gbnVsbDtmb3IoOyhuPXQ/ZS5maXJzdENoaWxkOmUubGFzdENoaWxkKSE9PW51bGw7KWU9bjtpZihlLm5vZGVUeXBlPT09MylyZXR1cm4gZTtpZihlLm5vZGVOYW1lPT09IkJSIilyZXR1cm4gbnVsbH19bGV0IE1iPXtjb2RlOiJjb2RlIixlbToiaXRhbGljIixpOiJpdGFsaWMiLHM6InN0cmlrZXRocm91Z2giLHN0cm9uZzoiYm9sZCIsc3ViOiJzdWJzY3JpcHQiLHN1cDoic3VwZXJzY3JpcHQiLHU6InVuZGVybGluZSJ9O2Z1bmN0aW9uIHJvKGUpe2xldCB0PU1iW2Uubm9kZU5hbWUudG9Mb3dlckNhc2UoKV07cmV0dXJuIHQ9PT12b2lkIDA/e25vZGU6bnVsbH06e2ZvckNoaWxkOm49PihRKG4pJiYhbi5oYXNGb3JtYXQodCkmJm4udG9nZ2xlRm9ybWF0KHQpLG4pLG5vZGU6bnVsbH19ZnVuY3Rpb24gRXQoZT0iIil7cmV0dXJuIERhKG5ldyAkaShlKSl9ZnVuY3Rpb24gUShlKXtyZXR1cm4gZSBpbnN0YW5jZW9mICRpfWNsYXNzIGpsIGV4dGVuZHMgJGl7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4idGFiIn1zdGF0aWMgY2xvbmUodCl7bGV0IG49bmV3IGpsKHQuX19rZXkpO3JldHVybiBuLl9fdGV4dD10Ll9fdGV4dCxuLl9fZm9ybWF0PXQuX19mb3JtYXQsbi5fX3N0eWxlPXQuX19zdHlsZSxufWNvbnN0cnVjdG9yKHQpe3N1cGVyKCIJIix0KSx0aGlzLl9fZGV0YWlsPTJ9c3RhdGljIGltcG9ydERPTSgpe3JldHVybiBudWxsfXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPWhkKCk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldFN0eWxlKHQuc3R5bGUpLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToidGFiIix2ZXJzaW9uOjF9fXNldFRleHRDb250ZW50KCl7VSgxMjYpfXNldERldGFpbCgpe1UoMTI3KX1zZXRNb2RlKCl7VSgxMjgpfWNhbkluc2VydFRleHRCZWZvcmUoKXtyZXR1cm4hMX1jYW5JbnNlcnRUZXh0QWZ0ZXIoKXtyZXR1cm4hMX19ZnVuY3Rpb24gaGQoKXtyZXR1cm4gRGEobmV3IGpsKX1jbGFzcyB5cntjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5fc2VsZWN0aW9uPW51bGwsdGhpcy5rZXk9dCx0aGlzLm9mZnNldD1uLHRoaXMudHlwZT1yfWlzKHQpe3JldHVybiB0aGlzLmtleT09PXQua2V5JiZ0aGlzLm9mZnNldD09PXQub2Zmc2V0JiZ0aGlzLnR5cGU9PT10LnR5cGV9aXNCZWZvcmUodCl7bGV0IG49dGhpcy5nZXROb2RlKCkscj10LmdldE5vZGUoKSxvPXRoaXMub2Zmc2V0O2lmKHQ9dC5vZmZzZXQsQihuKSl7dmFyIGk9bi5nZXREZXNjZW5kYW50QnlJbmRleChvKTtuPWk/P259cmV0dXJuIEIocikmJihpPXIuZ2V0RGVzY2VuZGFudEJ5SW5kZXgodCkscj1pPz9yKSxuPT09cj9vPHQ6bi5pc0JlZm9yZShyKX1nZXROb2RlKCl7bGV0IHQ9JHQodGhpcy5rZXkpO3JldHVybiB0PT09bnVsbCYmVSgyMCksdH1zZXQodCxuLHIpe2xldCBvPXRoaXMuX3NlbGVjdGlvbixpPXRoaXMua2V5O3RoaXMua2V5PXQsdGhpcy5vZmZzZXQ9bix0aGlzLnR5cGU9cixCbCgpfHwobW8oKT09PWkmJk10KHQpLG8hPT1udWxsJiYoby5fY2FjaGVkTm9kZXM9bnVsbCxvLmRpcnR5PSEwKSl9fWZ1bmN0aW9uIF9mKGUsdCl7bGV0IG49dC5fX2tleSxyPWUub2Zmc2V0LG89ImVsZW1lbnQiO2lmKFEodCkpbz0idGV4dCIsdD10LmdldFRleHRDb250ZW50U2l6ZSgpLHI+dCYmKHI9dCk7ZWxzZSBpZighQih0KSl7dmFyIGk9dC5nZXROZXh0U2libGluZygpO1EoaSk/KG49aS5fX2tleSxyPTAsbz0idGV4dCIpOihpPXQuZ2V0UGFyZW50KCkpJiYobj1pLl9fa2V5LHI9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEpfWUuc2V0KG4scixvKX1mdW5jdGlvbiBneShlLHQpe2lmKEIodCkpe2xldCBuPXQuZ2V0TGFzdERlc2NlbmRhbnQoKTtCKG4pfHxRKG4pP19mKGUsbik6X2YoZSx0KX1lbHNlIF9mKGUsdCl9ZnVuY3Rpb24gbXkoZSx0LG4scil7bGV0IG89ZS5nZXROb2RlKCksaT1vLmdldENoaWxkQXRJbmRleChlLm9mZnNldCksbD1FdCgpLHM9ZW4obyk/aGkoKS5hcHBlbmQobCk6bDtsLnNldEZvcm1hdChuKSxsLnNldFN0eWxlKHIpLGk9PT1udWxsP28uYXBwZW5kKHMpOihpLmluc2VydEJlZm9yZShzKSx0LnR5cGU9PT0iZWxlbWVudCImJnQua2V5PT09ZS5rZXkmJnQub2Zmc2V0IT09ZS5vZmZzZXQmJnQuc2V0KHQua2V5LHQub2Zmc2V0KzEsImVsZW1lbnQiKSksZS5pcyh0KSYmdC5zZXQobC5fX2tleSwwLCJ0ZXh0IiksZS5zZXQobC5fX2tleSwwLCJ0ZXh0Iil9ZnVuY3Rpb24gYW8oZSx0LG4scil7ZS5rZXk9dCxlLm9mZnNldD1uLGUudHlwZT1yfWNsYXNzIHBke2NvbnN0cnVjdG9yKHQpe3RoaXMuZGlydHk9ITEsdGhpcy5fbm9kZXM9dCx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWlzKHQpe2lmKCF6bCh0KSlyZXR1cm4hMTtsZXQgbj10aGlzLl9ub2RlcyxyPXQuX25vZGVzO3JldHVybiBuLnNpemU9PT1yLnNpemUmJkFycmF5LmZyb20obikuZXZlcnkobz0+ci5oYXMobykpfWFkZCh0KXt0aGlzLmRpcnR5PSEwLHRoaXMuX25vZGVzLmFkZCh0KSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWRlbGV0ZSh0KXt0aGlzLmRpcnR5PSEwLHRoaXMuX25vZGVzLmRlbGV0ZSh0KSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsfWNsZWFyKCl7dGhpcy5kaXJ0eT0hMCx0aGlzLl9ub2Rlcy5jbGVhcigpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9aGFzKHQpe3JldHVybiB0aGlzLl9ub2Rlcy5oYXModCl9Y2xvbmUoKXtyZXR1cm4gbmV3IHBkKG5ldyBTZXQodGhpcy5fbm9kZXMpKX1leHRyYWN0KCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZXMoKX1pbnNlcnRSYXdUZXh0KCl7fWluc2VydFRleHQoKXt9aW5zZXJ0Tm9kZXModCxuKXtsZXQgcj10aGlzLmdldE5vZGVzKCksbz1yLmxlbmd0aDt2YXIgaT1yW28tMV07aWYoUShpKSlpPWkuc2VsZWN0KCk7ZWxzZXtsZXQgbD1pLmdldEluZGV4V2l0aGluUGFyZW50KCkrMTtpPWkuZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdChsLGwpfWZvcihpLmluc2VydE5vZGVzKHQsbiksdD0wO3Q8bzt0Kyspclt0XS5yZW1vdmUoKTtyZXR1cm4hMH1nZXROb2Rlcygpe3ZhciB0PXRoaXMuX2NhY2hlZE5vZGVzO2lmKHQhPT1udWxsKXJldHVybiB0O3ZhciBuPXRoaXMuX25vZGVzO3Q9W107Zm9yKGxldCByIG9mIG4pbj0kdChyKSxuIT09bnVsbCYmdC5wdXNoKG4pO3JldHVybiBCbCgpfHwodGhpcy5fY2FjaGVkTm9kZXM9dCksdH1nZXRUZXh0Q29udGVudCgpe2xldCB0PXRoaXMuZ2V0Tm9kZXMoKSxuPSIiO2ZvcihsZXQgcj0wO3I8dC5sZW5ndGg7cisrKW4rPXRbcl0uZ2V0VGV4dENvbnRlbnQoKTtyZXR1cm4gbn19ZnVuY3Rpb24gZGUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBraX1mdW5jdGlvbiBlcChlKXtsZXRbdCwsbl09TXcoZSk7ZT1uLmdldENoaWxkcmVuKCk7bGV0IHI9ZS5sZW5ndGg7dmFyIG89ZVswXS5nZXRDaGlsZHJlbigpLmxlbmd0aDtsZXQgaT1BcnJheShyKTtmb3IodmFyIGw9MDtsPHI7bCsrKWlbbF09QXJyYXkobyk7Zm9yKG89MDtvPHI7bysrKXtsPWVbb10uZ2V0Q2hpbGRyZW4oKTtsZXQgcz0wO2ZvcihsZXQgYT0wO2E8bC5sZW5ndGg7YSsrKXtmb3IoO2lbb11bc107KXMrKztsZXQgdT1sW2FdLGM9dS5fX3Jvd1NwYW58fDEsZD11Ll9fY29sU3Bhbnx8MTtmb3IobGV0IGY9MDtmPGM7ZisrKWZvcihsZXQgaD0wO2g8ZDtoKyspaVtvK2ZdW3MraF09dTtpZih0PT09dSlyZXR1cm57Y29sU3BhbjpkLGNvbHVtbkluZGV4OnMscm93SW5kZXg6byxyb3dTcGFuOmN9O3MrPWR9fXJldHVybiBudWxsfWNsYXNzIGdke2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLmdyaWRLZXk9dCx0aGlzLmFuY2hvcj1uLHRoaXMuZm9jdXM9cix0aGlzLmRpcnR5PSExLHRoaXMuX2NhY2hlZE5vZGVzPW51bGwsbi5fc2VsZWN0aW9uPXRoaXMsci5fc2VsZWN0aW9uPXRoaXN9aXModCl7cmV0dXJuIFlnKHQpP3RoaXMuZ3JpZEtleT09PXQuZ3JpZEtleSYmdGhpcy5hbmNob3IuaXModC5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKHQuZm9jdXMpOiExfXNldCh0LG4scil7dGhpcy5kaXJ0eT0hMCx0aGlzLmdyaWRLZXk9dCx0aGlzLmFuY2hvci5rZXk9bix0aGlzLmZvY3VzLmtleT1yLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9Y2xvbmUoKXtyZXR1cm4gbmV3IGdkKHRoaXMuZ3JpZEtleSx0aGlzLmFuY2hvcix0aGlzLmZvY3VzKX1pc0NvbGxhcHNlZCgpe3JldHVybiExfWlzQmFja3dhcmQoKXtyZXR1cm4gdGhpcy5mb2N1cy5pc0JlZm9yZSh0aGlzLmFuY2hvcil9Z2V0Q2hhcmFjdGVyT2Zmc2V0cygpe3JldHVybiBqdSh0aGlzKX1leHRyYWN0KCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZXMoKX1pbnNlcnRSYXdUZXh0KCl7fWluc2VydFRleHQoKXt9aW5zZXJ0Tm9kZXModCxuKXtsZXQgcj10aGlzLmZvY3VzLmdldE5vZGUoKTtyZXR1cm4gRmcoci5zZWxlY3QoMCxyLmdldENoaWxkcmVuU2l6ZSgpKSkuaW5zZXJ0Tm9kZXModCxuKX1nZXRTaGFwZSgpe3ZhciB0PSR0KHRoaXMuYW5jaG9yLmtleSk7aWYoQW4odCl8fFUoMTAzKSx0PWVwKHQpLHQ9PT1udWxsKXRocm93IEVycm9yKCJnZXRDZWxsUmVjdDogZXhwZWN0ZWQgdG8gZmluZCBBbmNob3JOb2RlIik7dmFyIG49JHQodGhpcy5mb2N1cy5rZXkpO0FuKG4pfHxVKDEwNCk7bGV0IHI9ZXAobik7aWYocj09PW51bGwpdGhyb3cgRXJyb3IoImdldENlbGxSZWN0OiBleHBlY3RlZCB0byBmaW5kIGZvY3VzQ2VsbE5vZGUiKTtuPU1hdGgubWluKHQuY29sdW1uSW5kZXgsci5jb2x1bW5JbmRleCk7bGV0IG89TWF0aC5tYXgodC5jb2x1bW5JbmRleCxyLmNvbHVtbkluZGV4KSxpPU1hdGgubWluKHQucm93SW5kZXgsci5yb3dJbmRleCk7cmV0dXJuIHQ9TWF0aC5tYXgodC5yb3dJbmRleCxyLnJvd0luZGV4KSx7ZnJvbVg6TWF0aC5taW4obixvKSxmcm9tWTpNYXRoLm1pbihpLHQpLHRvWDpNYXRoLm1heChuLG8pLHRvWTpNYXRoLm1heChpLHQpfX1nZXROb2Rlcygpe2Z1bmN0aW9uIHQoUyl7bGV0e2NlbGw6dixzdGFydENvbHVtbjp5LHN0YXJ0Um93Onh9PVM7YT1NYXRoLm1pbihhLHkpLHU9TWF0aC5taW4odSx4KSxjPU1hdGgubWF4KGMseSt2Ll9fY29sU3Bhbi0xKSxkPU1hdGgubWF4KGQseCt2Ll9fcm93U3Bhbi0xKX12YXIgbj10aGlzLl9jYWNoZWROb2RlcztpZihuIT09bnVsbClyZXR1cm4gbjt2YXIgcj10aGlzLmFuY2hvci5nZXROb2RlKCk7bj10aGlzLmZvY3VzLmdldE5vZGUoKSxyPXdjKHIsQW4pO3ZhciBvPXdjKG4sQW4pO0FuKHIpfHxVKDEwMyksQW4obyl8fFUoMTA0KSxuPXIuZ2V0UGFyZW50KCkseWEobil8fFUoMTA1KSxuPW4uZ2V0UGFyZW50KCkscWcobil8fFUoMTA2KTtsZXRbaSxsLHNdPUF3KG4scixvKSxhPU1hdGgubWluKGwuc3RhcnRDb2x1bW4scy5zdGFydENvbHVtbiksdT1NYXRoLm1pbihsLnN0YXJ0Um93LHMuc3RhcnRSb3cpLGM9TWF0aC5tYXgobC5zdGFydENvbHVtbitsLmNlbGwuX19jb2xTcGFuLTEscy5zdGFydENvbHVtbitzLmNlbGwuX19jb2xTcGFuLTEpLGQ9TWF0aC5tYXgobC5zdGFydFJvdytsLmNlbGwuX19yb3dTcGFuLTEscy5zdGFydFJvdytzLmNlbGwuX19yb3dTcGFuLTEpO3I9YSxvPXU7Zm9yKHZhciBmPWEsaD11O2E8cnx8dTxvfHxjPmZ8fGQ+aDspe2lmKGE8cil7dmFyIGc9aC1vOy0tcjtmb3IodmFyIG09MDttPD1nO20rKyl0KGlbbyttXVtyXSl9aWYodTxvKWZvcihnPWYtciwtLW8sbT0wO208PWc7bSsrKXQoaVtvXVtyK21dKTtpZihjPmYpZm9yKGc9aC1vLGYrPTEsbT0wO208PWc7bSsrKXQoaVtvK21dW2ZdKTtpZihkPmgpZm9yKGc9Zi1yLGgrPTEsbT0wO208PWc7bSsrKXQoaVtoXVtyK21dKX1mb3Iobj1bbl0scj1udWxsLG89dTtvPD1kO28rKylmb3IoZj1hO2Y8PWM7ZisrKSh7Y2VsbDpofT1pW29dW2ZdKSxnPWguZ2V0UGFyZW50KCkseWEoZyl8fFUoMTA3KSxnIT09ciYmbi5wdXNoKGcpLG4ucHVzaChoLC4uLnliKGgpKSxyPWc7cmV0dXJuIEJsKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz1uKSxufWdldFRleHRDb250ZW50KCl7bGV0IHQ9dGhpcy5nZXROb2RlcygpLG49IiI7Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspbis9dFtyXS5nZXRUZXh0Q29udGVudCgpO3JldHVybiBufX1mdW5jdGlvbiBZZyhlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGdkfWNsYXNzIGtpe2NvbnN0cnVjdG9yKHQsbixyLG8pe3RoaXMuYW5jaG9yPXQsdGhpcy5mb2N1cz1uLHRoaXMuZGlydHk9ITEsdGhpcy5mb3JtYXQ9cix0aGlzLnN0eWxlPW8sdGhpcy5fY2FjaGVkTm9kZXM9bnVsbCx0Ll9zZWxlY3Rpb249dGhpcyxuLl9zZWxlY3Rpb249dGhpc31pcyh0KXtyZXR1cm4gZGUodCk/dGhpcy5hbmNob3IuaXModC5hbmNob3IpJiZ0aGlzLmZvY3VzLmlzKHQuZm9jdXMpJiZ0aGlzLmZvcm1hdD09PXQuZm9ybWF0JiZ0aGlzLnN0eWxlPT09dC5zdHlsZTohMX1pc0JhY2t3YXJkKCl7cmV0dXJuIHRoaXMuZm9jdXMuaXNCZWZvcmUodGhpcy5hbmNob3IpfWlzQ29sbGFwc2VkKCl7cmV0dXJuIHRoaXMuYW5jaG9yLmlzKHRoaXMuZm9jdXMpfWdldE5vZGVzKCl7dmFyIHQ9dGhpcy5fY2FjaGVkTm9kZXM7aWYodCE9PW51bGwpcmV0dXJuIHQ7dD10aGlzLmFuY2hvcjt2YXIgbj10aGlzLmZvY3VzLHI9dC5pc0JlZm9yZShuKSxvPXI/dDpuO3I9cj9uOnQsdD1vLmdldE5vZGUoKSxuPXIuZ2V0Tm9kZSgpO2xldCBpPW8ub2Zmc2V0O3JldHVybiBvPXIub2Zmc2V0LEIodCkmJihyPXQuZ2V0RGVzY2VuZGFudEJ5SW5kZXgoaSksdD1yPz90KSxCKG4pJiYocj1uLmdldERlc2NlbmRhbnRCeUluZGV4KG8pLHIhPT1udWxsJiZyIT09dCYmbi5nZXRDaGlsZEF0SW5kZXgobyk9PT1yJiYocj1yLmdldFByZXZpb3VzU2libGluZygpKSxuPXI/P24pLHQ9dC5pcyhuKT9CKHQpJiYwPHQuZ2V0Q2hpbGRyZW5TaXplKCk/W106W3RdOnQuZ2V0Tm9kZXNCZXR3ZWVuKG4pLEJsKCl8fCh0aGlzLl9jYWNoZWROb2Rlcz10KSx0fXNldFRleHROb2RlUmFuZ2UodCxuLHIsbyl7YW8odGhpcy5hbmNob3IsdC5fX2tleSxuLCJ0ZXh0IiksYW8odGhpcy5mb2N1cyxyLl9fa2V5LG8sInRleHQiKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsLHRoaXMuZGlydHk9ITB9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD10aGlzLmdldE5vZGVzKCk7aWYodC5sZW5ndGg9PT0wKXJldHVybiIiO2xldCBuPXRbMF0scj10W3QubGVuZ3RoLTFdLG89dGhpcy5hbmNob3IsaT10aGlzLmZvY3VzLGw9by5pc0JlZm9yZShpKSxbcyxhXT1qdSh0aGlzKSx1PSIiLGM9ITA7Zm9yKGxldCBkPTA7ZDx0Lmxlbmd0aDtkKyspe2xldCBmPXRbZF07aWYoQihmKSYmIWYuaXNJbmxpbmUoKSljfHwodSs9YApgKSxjPSFmLmlzRW1wdHkoKTtlbHNlIGlmKGM9ITEsUShmKSl7bGV0IGg9Zi5nZXRUZXh0Q29udGVudCgpO2Y9PT1uP2Y9PT1yPyhvLnR5cGUhPT0iZWxlbWVudCJ8fGkudHlwZSE9PSJlbGVtZW50Inx8aS5vZmZzZXQ9PT1vLm9mZnNldCkmJihoPXM8YT9oLnNsaWNlKHMsYSk6aC5zbGljZShhLHMpKTpoPWw/aC5zbGljZShzKTpoLnNsaWNlKGEpOmY9PT1yJiYoaD1sP2guc2xpY2UoMCxhKTpoLnNsaWNlKDAscykpLHUrPWh9ZWxzZSFWZShmKSYmIW1hKGYpfHxmPT09ciYmdGhpcy5pc0NvbGxhcHNlZCgpfHwodSs9Zi5nZXRUZXh0Q29udGVudCgpKX1yZXR1cm4gdX1hcHBseURPTVJhbmdlKHQpe2xldCBuPWV0KCkscj1uLmdldEVkaXRvclN0YXRlKCkuX3NlbGVjdGlvbjtpZih0PVB3KHQuc3RhcnRDb250YWluZXIsdC5zdGFydE9mZnNldCx0LmVuZENvbnRhaW5lcix0LmVuZE9mZnNldCxuLHIpLHQhPT1udWxsKXt2YXJbbyxpXT10O2FvKHRoaXMuYW5jaG9yLG8ua2V5LG8ub2Zmc2V0LG8udHlwZSksYW8odGhpcy5mb2N1cyxpLmtleSxpLm9mZnNldCxpLnR5cGUpLHRoaXMuX2NhY2hlZE5vZGVzPW51bGx9fWNsb25lKCl7bGV0IHQ9dGhpcy5hbmNob3Isbj10aGlzLmZvY3VzO3JldHVybiBuZXcga2kobmV3IHlyKHQua2V5LHQub2Zmc2V0LHQudHlwZSksbmV3IHlyKG4ua2V5LG4ub2Zmc2V0LG4udHlwZSksdGhpcy5mb3JtYXQsdGhpcy5zdHlsZSl9dG9nZ2xlRm9ybWF0KHQpe3RoaXMuZm9ybWF0PWl3KHRoaXMuZm9ybWF0LHQsbnVsbCksdGhpcy5kaXJ0eT0hMH1zZXRTdHlsZSh0KXt0aGlzLnN0eWxlPXQsdGhpcy5kaXJ0eT0hMH1oYXNGb3JtYXQodCl7cmV0dXJuKHRoaXMuZm9ybWF0Jm9pW3RdKSE9PTB9aW5zZXJ0UmF3VGV4dCh0KXt0PXQuc3BsaXQoLyhccj9cbnxcdCkvKTtsZXQgbj1bXSxyPXQubGVuZ3RoO2ZvcihsZXQgbz0wO288cjtvKyspe2xldCBpPXRbb107aT09PWAKYHx8aT09PWBccgpgP24ucHVzaCgkbCgpKTppPT09IgkiP24ucHVzaChoZCgpKTpuLnB1c2goRXQoaSkpfXRoaXMuaW5zZXJ0Tm9kZXMobil9aW5zZXJ0VGV4dCh0KXt2YXIgbj10aGlzLmFuY2hvcixyPXRoaXMuZm9jdXMsbz10aGlzLmlzQ29sbGFwc2VkKCl8fG4uaXNCZWZvcmUociksaT10aGlzLmZvcm1hdCxsPXRoaXMuc3R5bGU7byYmbi50eXBlPT09ImVsZW1lbnQiP215KG4scixpLGwpOm98fHIudHlwZSE9PSJlbGVtZW50Inx8bXkocixuLGksbCk7dmFyIHM9dGhpcy5nZXROb2RlcygpLGE9cy5sZW5ndGgsdT1vP3I6bjtyPShvP246cikub2Zmc2V0O3ZhciBjPXUub2Zmc2V0O249c1swXSxRKG4pfHxVKDI2KSxvPW4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg7dmFyIGQ9bi5nZXRQYXJlbnRPclRocm93KCksZj1zW2EtMV07aWYodGhpcy5pc0NvbGxhcHNlZCgpJiZyPT09byYmKG4uaXNTZWdtZW50ZWQoKXx8bi5pc1Rva2VuKCl8fCFuLmNhbkluc2VydFRleHRBZnRlcigpfHwhZC5jYW5JbnNlcnRUZXh0QWZ0ZXIoKSYmbi5nZXROZXh0U2libGluZygpPT09bnVsbCkpe3ZhciBoPW4uZ2V0TmV4dFNpYmxpbmcoKTtpZihRKGgpJiZoLmNhbkluc2VydFRleHRCZWZvcmUoKSYmIUZoKGgpfHwoaD1FdCgpLGguc2V0Rm9ybWF0KGkpLGQuY2FuSW5zZXJ0VGV4dEFmdGVyKCk/bi5pbnNlcnRBZnRlcihoKTpkLmluc2VydEFmdGVyKGgpKSxoLnNlbGVjdCgwLDApLG49aCx0IT09IiIpe3RoaXMuaW5zZXJ0VGV4dCh0KTtyZXR1cm59fWVsc2UgaWYodGhpcy5pc0NvbGxhcHNlZCgpJiZyPT09MCYmKG4uaXNTZWdtZW50ZWQoKXx8bi5pc1Rva2VuKCl8fCFuLmNhbkluc2VydFRleHRCZWZvcmUoKXx8IWQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZuLmdldFByZXZpb3VzU2libGluZygpPT09bnVsbCkpe2lmKGg9bi5nZXRQcmV2aW91c1NpYmxpbmcoKSwoIVEoaCl8fEZoKGgpKSYmKGg9RXQoKSxoLnNldEZvcm1hdChpKSxkLmNhbkluc2VydFRleHRCZWZvcmUoKT9uLmluc2VydEJlZm9yZShoKTpkLmluc2VydEJlZm9yZShoKSksaC5zZWxlY3QoKSxuPWgsdCE9PSIiKXt0aGlzLmluc2VydFRleHQodCk7cmV0dXJufX1lbHNlIGlmKG4uaXNTZWdtZW50ZWQoKSYmciE9PW8pZD1FdChuLmdldFRleHRDb250ZW50KCkpLGQuc2V0Rm9ybWF0KGkpLG4ucmVwbGFjZShkKSxuPWQ7ZWxzZSBpZighKHRoaXMuaXNDb2xsYXBzZWQoKXx8dD09PSIifHwoaD1mLmdldFBhcmVudCgpLGQuY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZkLmNhbkluc2VydFRleHRBZnRlcigpJiYoIUIoaCl8fGguY2FuSW5zZXJ0VGV4dEJlZm9yZSgpJiZoLmNhbkluc2VydFRleHRBZnRlcigpKSkpKXt0aGlzLmluc2VydFRleHQoIiIpLFJ3KHRoaXMuYW5jaG9yLHRoaXMuZm9jdXMsbnVsbCksdGhpcy5pbnNlcnRUZXh0KHQpO3JldHVybn1pZihhPT09MSlpZihuLmlzVG9rZW4oKSl0PUV0KHQpLHQuc2VsZWN0KCksbi5yZXBsYWNlKHQpO2Vsc2V7aWYocz1uLmdldEZvcm1hdCgpLGE9bi5nZXRTdHlsZSgpLHI9PT1jJiYocyE9PWl8fGEhPT1sKSlpZihuLmdldFRleHRDb250ZW50KCk9PT0iIiluLnNldEZvcm1hdChpKSxuLnNldFN0eWxlKGwpO2Vsc2V7cz1FdCh0KSxzLnNldEZvcm1hdChpKSxzLnNldFN0eWxlKGwpLHMuc2VsZWN0KCkscj09PTA/bi5pbnNlcnRCZWZvcmUocywhMSk6KFthXT1uLnNwbGl0VGV4dChyKSxhLmluc2VydEFmdGVyKHMsITEpKSxzLmlzQ29tcG9zaW5nKCkmJnRoaXMuYW5jaG9yLnR5cGU9PT0idGV4dCImJih0aGlzLmFuY2hvci5vZmZzZXQtPXQubGVuZ3RoKTtyZXR1cm59bj1uLnNwbGljZVRleHQocixjLXIsdCwhMCksbi5nZXRUZXh0Q29udGVudCgpPT09IiI/bi5yZW1vdmUoKTp0aGlzLmFuY2hvci50eXBlPT09InRleHQiJiYobi5pc0NvbXBvc2luZygpP3RoaXMuYW5jaG9yLm9mZnNldC09dC5sZW5ndGg6KHRoaXMuZm9ybWF0PXMsdGhpcy5zdHlsZT1hKSl9ZWxzZXtpZihpPW5ldyBTZXQoWy4uLm4uZ2V0UGFyZW50S2V5cygpLC4uLmYuZ2V0UGFyZW50S2V5cygpXSksaD1CKG4pP246bi5nZXRQYXJlbnRPclRocm93KCksbD1CKGYpP2Y6Zi5nZXRQYXJlbnRPclRocm93KCksZD1mLCFoLmlzKGwpJiZsLmlzSW5saW5lKCkpZG8gZD1sLGw9bC5nZXRQYXJlbnRPclRocm93KCk7d2hpbGUobC5pc0lubGluZSgpKTtpZih1LnR5cGU9PT0idGV4dCImJihjIT09MHx8Zi5nZXRUZXh0Q29udGVudCgpPT09IiIpfHx1LnR5cGU9PT0iZWxlbWVudCImJmYuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKTxjKWlmKFEoZikmJiFmLmlzVG9rZW4oKSYmYyE9PWYuZ2V0VGV4dENvbnRlbnRTaXplKCkpe2lmKGYuaXNTZWdtZW50ZWQoKSl7dmFyIGc9RXQoZi5nZXRUZXh0Q29udGVudCgpKTtmLnJlcGxhY2UoZyksZj1nfWVuKHUuZ2V0Tm9kZSgpKXx8KGY9Zi5zcGxpY2VUZXh0KDAsYywiIikpLGkuYWRkKGYuX19rZXkpfWVsc2UgdT1mLmdldFBhcmVudE9yVGhyb3coKSx1LmNhbkJlRW1wdHkoKXx8dS5nZXRDaGlsZHJlblNpemUoKSE9PTE/Zi5yZW1vdmUoKTp1LnJlbW92ZSgpO2Vsc2UgaS5hZGQoZi5fX2tleSk7Zm9yKHU9bC5nZXRDaGlsZHJlbigpLGM9bmV3IFNldChzKSxmPWguaXMobCksaD1oLmlzSW5saW5lKCkmJm4uZ2V0TmV4dFNpYmxpbmcoKT09PW51bGw/aDpuLGc9dS5sZW5ndGgtMTswPD1nO2ctLSl7bGV0IG09dVtnXTtpZihtLmlzKG4pfHxCKG0pJiZtLmlzUGFyZW50T2YobikpYnJlYWs7bS5pc0F0dGFjaGVkKCkmJighYy5oYXMobSl8fG0uaXMoZCk/Znx8aC5pbnNlcnRBZnRlcihtLCExKTptLnJlbW92ZSgpKX1pZighZilmb3IodT1sLGM9bnVsbDt1IT09bnVsbDspbD11LmdldENoaWxkcmVuKCksZj1sLmxlbmd0aCwoZj09PTB8fGxbZi0xXS5pcyhjKSkmJihpLmRlbGV0ZSh1Ll9fa2V5KSxjPXUpLHU9dS5nZXRQYXJlbnQoKTtmb3Iobi5pc1Rva2VuKCk/cj09PW8/bi5zZWxlY3QoKToodD1FdCh0KSx0LnNlbGVjdCgpLG4ucmVwbGFjZSh0KSk6KG49bi5zcGxpY2VUZXh0KHIsby1yLHQsITApLG4uZ2V0VGV4dENvbnRlbnQoKT09PSIiP24ucmVtb3ZlKCk6bi5pc0NvbXBvc2luZygpJiZ0aGlzLmFuY2hvci50eXBlPT09InRleHQiJiYodGhpcy5hbmNob3Iub2Zmc2V0LT10Lmxlbmd0aCkpLHQ9MTt0PGE7dCsrKW49c1t0XSxpLmhhcyhuLl9fa2V5KXx8bi5yZW1vdmUoKX19cmVtb3ZlVGV4dCgpe3RoaXMuaW5zZXJ0VGV4dCgiIil9Zm9ybWF0VGV4dCh0KXtpZih0aGlzLmlzQ29sbGFwc2VkKCkpdGhpcy50b2dnbGVGb3JtYXQodCksTXQobnVsbCk7ZWxzZXt2YXIgbj10aGlzLmdldE5vZGVzKCkscj1bXTtmb3IodmFyIG8gb2YgbilRKG8pJiZyLnB1c2gobyk7dmFyIGk9ci5sZW5ndGg7aWYoaT09PTApdGhpcy50b2dnbGVGb3JtYXQodCksTXQobnVsbCk7ZWxzZXtvPXRoaXMuYW5jaG9yO3ZhciBsPXRoaXMuZm9jdXMscz10aGlzLmlzQmFja3dhcmQoKTtuPXM/bDpvLG89cz9vOmw7dmFyIGE9MCx1PXJbMF07aWYobD1uLnR5cGU9PT0iZWxlbWVudCI/MDpuLm9mZnNldCxuLnR5cGU9PT0idGV4dCImJmw9PT11LmdldFRleHRDb250ZW50U2l6ZSgpJiYoYT0xLHU9clsxXSxsPTApLHUhPW51bGwpe3M9dS5nZXRGb3JtYXRGbGFncyh0LG51bGwpO3ZhciBjPWktMSxkPXJbY107aWYoaT1vLnR5cGU9PT0idGV4dCI/by5vZmZzZXQ6ZC5nZXRUZXh0Q29udGVudFNpemUoKSx1LmlzKGQpKWwhPT1pJiYobD09PTAmJmk9PT11LmdldFRleHRDb250ZW50U2l6ZSgpP3Uuc2V0Rm9ybWF0KHMpOih0PXUuc3BsaXRUZXh0KGwsaSksdD1sPT09MD90WzBdOnRbMV0sdC5zZXRGb3JtYXQocyksbi50eXBlPT09InRleHQiJiZuLnNldCh0Ll9fa2V5LDAsInRleHQiKSxvLnR5cGU9PT0idGV4dCImJm8uc2V0KHQuX19rZXksaS1sLCJ0ZXh0IikpLHRoaXMuZm9ybWF0PXMpO2Vsc2V7bCE9PTAmJihbLHVdPXUuc3BsaXRUZXh0KGwpLGw9MCksdS5zZXRGb3JtYXQocyk7dmFyIGY9ZC5nZXRGb3JtYXRGbGFncyh0LHMpO2ZvcigwPGkmJihpIT09ZC5nZXRUZXh0Q29udGVudFNpemUoKSYmKFtkXT1kLnNwbGl0VGV4dChpKSksZC5zZXRGb3JtYXQoZikpLGErPTE7YTxjO2ErKyl7bGV0IGg9clthXTtpZighaC5pc1Rva2VuKCkpe2xldCBnPWguZ2V0Rm9ybWF0RmxhZ3ModCxmKTtoLnNldEZvcm1hdChnKX19bi50eXBlPT09InRleHQiJiZuLnNldCh1Ll9fa2V5LGwsInRleHQiKSxvLnR5cGU9PT0idGV4dCImJm8uc2V0KGQuX19rZXksaSwidGV4dCIpLHRoaXMuZm9ybWF0PXN8Zn19fX19aW5zZXJ0Tm9kZXModCxuKXtpZighdGhpcy5pc0NvbGxhcHNlZCgpKXt2YXIgcj10aGlzLmlzQmFja3dhcmQoKT90aGlzLmFuY2hvcjp0aGlzLmZvY3VzLG89ci5nZXROb2RlKCkuZ2V0TmV4dFNpYmxpbmcoKTtpZihvPW8/by5nZXRLZXkoKTpudWxsLHI9KHI9ci5nZXROb2RlKCkuZ2V0UHJldmlvdXNTaWJsaW5nKCkpP3IuZ2V0S2V5KCk6bnVsbCx0aGlzLnJlbW92ZVRleHQoKSx0aGlzLmlzQ29sbGFwc2VkKCkmJnRoaXMuZm9jdXMudHlwZT09PSJlbGVtZW50Iil7aWYodGhpcy5mb2N1cy5rZXk9PT1vJiZ0aGlzLmZvY3VzLm9mZnNldD09PTApe3ZhciBpPUV0KCk7dGhpcy5mb2N1cy5nZXROb2RlKCkuaW5zZXJ0QmVmb3JlKGkpfWVsc2UgdGhpcy5mb2N1cy5rZXk9PT1yJiZ0aGlzLmZvY3VzLm9mZnNldD09PXRoaXMuZm9jdXMuZ2V0Tm9kZSgpLmdldENoaWxkcmVuU2l6ZSgpJiYoaT1FdCgpLHRoaXMuZm9jdXMuZ2V0Tm9kZSgpLmluc2VydEFmdGVyKGkpKTtpJiYodGhpcy5mb2N1cy5zZXQoaS5fX2tleSwwLCJ0ZXh0IiksdGhpcy5hbmNob3Iuc2V0KGkuX19rZXksMCwidGV4dCIpKX19aT10aGlzLmFuY2hvcixyPWkub2Zmc2V0O3ZhciBsPWkuZ2V0Tm9kZSgpO289bCxpLnR5cGU9PT0iZWxlbWVudCImJihpPWkuZ2V0Tm9kZSgpLG89aS5nZXRDaGlsZEF0SW5kZXgoci0xKSxvPW89PT1udWxsP2k6byksaT1bXTt2YXIgcz1sLmdldE5leHRTaWJsaW5ncygpLGE9Sm4obCk/bnVsbDpsLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKTtpZihRKGwpKWlmKG89bC5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCxyPT09MCYmbyE9PTApbz1sLmdldFByZXZpb3VzU2libGluZygpLG89byE9PW51bGw/bzpsLmdldFBhcmVudE9yVGhyb3coKSxpLnB1c2gobCk7ZWxzZSBpZihyPT09bylvPWw7ZWxzZXtpZihsLmlzVG9rZW4oKSlyZXR1cm4hMTtbbyxsXT1sLnNwbGl0VGV4dChyKSxpLnB1c2gobCl9bD1vLGkucHVzaCguLi5zKSxzPXRbMF07dmFyIHU9ITEsYz1udWxsO2ZvcihsZXQgZz0wO2c8dC5sZW5ndGg7ZysrKXt2YXIgZD10W2ddO2lmKEpuKG8pfHxWZShvKXx8IUIoZCl8fGQuaXNJbmxpbmUoKSl1JiYhQihkKSYmIVZlKGQpJiZKbihvLmdldFBhcmVudCgpKSYmVSgyOCk7ZWxzZXtpZihkLmlzKHMpKXtpZihCKG8pJiZvLmlzRW1wdHkoKSYmby5jYW5SZXBsYWNlV2l0aChkKSl7by5yZXBsYWNlKGQpLG89ZCx1PSEwO2NvbnRpbnVlfWlmKHU9ZC5nZXRGaXJzdERlc2NlbmRhbnQoKSxsdyh1KSl7Zm9yKHZhciBmPXUuZ2V0UGFyZW50T3JUaHJvdygpO2YuaXNJbmxpbmUoKTspZj1mLmdldFBhcmVudE9yVGhyb3coKTtpZihjPWYuZ2V0Q2hpbGRyZW4oKSx1PWMubGVuZ3RoLEIobykpe3ZhciBoPW8uZ2V0Rmlyc3RDaGlsZCgpO2ZvcihsZXQgbT0wO208dTttKyspe2xldCBTPWNbbV07aD09PW51bGw/by5hcHBlbmQoUyk6aC5pbnNlcnRBZnRlcihTKSxoPVN9fWVsc2V7Zm9yKGg9dS0xOzA8PWg7aC0tKW8uaW5zZXJ0QWZ0ZXIoY1toXSk7bz1vLmdldFBhcmVudE9yVGhyb3coKX1pZihjPWNbdS0xXSxmLnJlbW92ZSgpLHU9ITAsZi5pcyhkKSljb250aW51ZX19UShvKSYmKGE9PT1udWxsJiZVKDI3KSxvPWEpfXU9ITEsQihvKSYmIW8uaXNJbmxpbmUoKT8oYz1kLFZlKGQpJiYhZC5pc0lubGluZSgpP289dC5sZW5ndGg9PT0xJiZvLmNhbkJlRW1wdHkoKSYmby5pc0VtcHR5KCk/by5pbnNlcnRCZWZvcmUoZCwhMSk6by5pbnNlcnRBZnRlcihkLCExKTpCKGQpPyhkLmNhbkJlRW1wdHkoKXx8IWQuaXNFbXB0eSgpKSYmKGVuKG8pPyhmPW8uZ2V0Q2hpbGRBdEluZGV4KHIpLGYhPT1udWxsP2YuaW5zZXJ0QmVmb3JlKGQpOm8uYXBwZW5kKGQpLG89ZCk6ZC5pc0lubGluZSgpPyhvLmFwcGVuZChkKSxvPWQpOm89by5pbnNlcnRBZnRlcihkLCExKSk6KGY9by5nZXRGaXJzdENoaWxkKCksZiE9PW51bGw/Zi5pbnNlcnRCZWZvcmUoZCk6by5hcHBlbmQoZCksbz1kKSk6IUIoZCl8fEIoZCkmJmQuaXNJbmxpbmUoKXx8VmUobykmJiFvLmlzSW5saW5lKCk/KGM9ZCxkZSh0aGlzKSYmVmUoZCkmJihCKG8pfHxRKG8pKSYmIWQuaXNJbmxpbmUoKT8oUShvKT8oZj1vLmdldFBhcmVudE9yVGhyb3coKSxbb109by5zcGxpdFRleHQociksbz1vLmdldEluZGV4V2l0aGluUGFyZW50KCkrMSk6KGY9byxvPXIpLFssb109Z3coZixvKSxvPW8uaW5zZXJ0QmVmb3JlKGQpKTpvPW8uaW5zZXJ0QWZ0ZXIoZCwhMSkpOihkPW8uZ2V0UGFyZW50T3JUaHJvdygpLG1hKG8pJiZvLnJlbW92ZSgpLG89ZCxnLS0pfWlmKG4mJihRKGwpP2wuc2VsZWN0KCk6KHQ9by5nZXRQcmV2aW91c1NpYmxpbmcoKSxRKHQpP3Quc2VsZWN0KCk6KHQ9by5nZXRJbmRleFdpdGhpblBhcmVudCgpLG8uZ2V0UGFyZW50T3JUaHJvdygpLnNlbGVjdCh0LHQpKSkpLEIobykpe2lmKHQ9UShjKT9jOkIoYykmJmMuaXNJbmxpbmUoKT9jLmdldExhc3REZXNjZW5kYW50KCk6by5nZXRMYXN0RGVzY2VuZGFudCgpLG58fCh0PT09bnVsbD9vLnNlbGVjdCgpOlEodCk/dC5nZXRUZXh0Q29udGVudCgpPT09IiI/dC5zZWxlY3RQcmV2aW91cygpOnQuc2VsZWN0KCk6dC5zZWxlY3ROZXh0KCkpLGkubGVuZ3RoIT09MClmb3Iobj1vLHQ9aS5sZW5ndGgtMTswPD10O3QtLSlyPWlbdF0sYT1yLmdldFBhcmVudE9yVGhyb3coKSwhQihvKXx8dHAocil8fFZlKHIpJiYoIXIuaXNJbmxpbmUoKXx8ci5pc0lzb2xhdGVkKCkpP0Iobyl8fHRwKHIpP0IocikmJiFyLmNhbkluc2VydEFmdGVyKG8pPyhsPWEuY29uc3RydWN0b3IuY2xvbmUoYSksQihsKXx8VSgyOSksbC5hcHBlbmQociksby5pbnNlcnRBZnRlcihsKSk6by5pbnNlcnRBZnRlcihyKTooby5pbnNlcnRCZWZvcmUociksbz1yKToobj09PW8/by5hcHBlbmQocik6by5pbnNlcnRCZWZvcmUociksbz1yKSxhLmlzRW1wdHkoKSYmIWEuY2FuQmVFbXB0eSgpJiZhLnJlbW92ZSgpfWVsc2Ugbnx8KFEobyk/by5zZWxlY3QoKToobj1vLmdldFBhcmVudE9yVGhyb3coKSx0PW8uZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSsxLG4uc2VsZWN0KHQsdCkpKTtyZXR1cm4hMH1pbnNlcnRQYXJhZ3JhcGgoKXt0aGlzLmlzQ29sbGFwc2VkKCl8fHRoaXMucmVtb3ZlVGV4dCgpO3ZhciB0PXRoaXMuYW5jaG9yLG49dC5vZmZzZXQscj1bXTtpZih0LnR5cGU9PT0idGV4dCIpe3ZhciBvPXQuZ2V0Tm9kZSgpLGk9by5nZXROZXh0U2libGluZ3MoKS5yZXZlcnNlKCksbD1vLmdldFBhcmVudE9yVGhyb3coKSxzPWwuaXNJbmxpbmUoKSxhPXM/bC5nZXRUZXh0Q29udGVudFNpemUoKTpvLmdldFRleHRDb250ZW50U2l6ZSgpO249PT0wP2kucHVzaChvKToocyYmKHI9bC5nZXROZXh0U2libGluZ3MoKSksbj09PWF8fHMmJm49PT1vLmdldFRleHRDb250ZW50U2l6ZSgpfHwoWyxvXT1vLnNwbGl0VGV4dChuKSxpLnB1c2gobykpKX1lbHNle2lmKGw9dC5nZXROb2RlKCksSm4obCkpe2k9aGkoKSxyPWwuZ2V0Q2hpbGRBdEluZGV4KG4pLGkuc2VsZWN0KCksciE9PW51bGw/ci5pbnNlcnRCZWZvcmUoaSwhMSk6bC5hcHBlbmQoaSk7cmV0dXJufWk9bC5nZXRDaGlsZHJlbigpLnNsaWNlKG4pLnJldmVyc2UoKX1pZihvPWkubGVuZ3RoLG49PT0wJiYwPG8mJmwuaXNJbmxpbmUoKSl7aWYocj1sLmdldFBhcmVudE9yVGhyb3coKSxpPXIuaW5zZXJ0TmV3QWZ0ZXIodGhpcywhMSksQihpKSlmb3Iocj1yLmdldENoaWxkcmVuKCksbD0wO2w8ci5sZW5ndGg7bCsrKWkuYXBwZW5kKHJbbF0pfWVsc2UgaWYocz1sLmluc2VydE5ld0FmdGVyKHRoaXMsITEpLHM9PT1udWxsKXRoaXMuaW5zZXJ0TGluZUJyZWFrKCk7ZWxzZSBpZihCKHMpKWlmKGE9bC5nZXRGaXJzdENoaWxkKCksbj09PTAmJihsLmlzKHQuZ2V0Tm9kZSgpKXx8YSYmYS5pcyh0LmdldE5vZGUoKSkpJiYwPG8pbC5pbnNlcnRCZWZvcmUocyk7ZWxzZXtpZihsPW51bGwsbj1yLmxlbmd0aCx0PXMuZ2V0UGFyZW50T3JUaHJvdygpLDA8bilmb3IoYT0wO2E8bjthKyspdC5hcHBlbmQoclthXSk7aWYobyE9PTApZm9yKHI9MDtyPG87cisrKW49aVtyXSxsPT09bnVsbD9zLmFwcGVuZChuKTpsLmluc2VydEJlZm9yZShuKSxsPW47cy5jYW5CZUVtcHR5KCl8fHMuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wP3Muc2VsZWN0U3RhcnQoKToocy5zZWxlY3RQcmV2aW91cygpLHMucmVtb3ZlKCkpfX1pbnNlcnRMaW5lQnJlYWsodCl7bGV0IG49JGwoKTt2YXIgcj10aGlzLmFuY2hvcjtyLnR5cGU9PT0iZWxlbWVudCImJihyPXIuZ2V0Tm9kZSgpLGVuKHIpJiZ0aGlzLmluc2VydFBhcmFncmFwaCgpKSx0P3RoaXMuaW5zZXJ0Tm9kZXMoW25dLCEwKTp0aGlzLmluc2VydE5vZGVzKFtuXSkmJm4uc2VsZWN0TmV4dCgwLDApfWdldENoYXJhY3Rlck9mZnNldHMoKXtyZXR1cm4ganUodGhpcyl9ZXh0cmFjdCgpe3ZhciB0PXRoaXMuZ2V0Tm9kZXMoKSxuPXQubGVuZ3RoLHI9bi0xLG89dGhpcy5hbmNob3I7bGV0IGk9dGhpcy5mb2N1czt2YXIgbD10WzBdO2xldCBzPXRbcl0sW2EsdV09anUodGhpcyk7cmV0dXJuIG49PT0wP1tdOm49PT0xP1EobCkmJiF0aGlzLmlzQ29sbGFwc2VkKCk/KHQ9YT51P3U6YSxyPWwuc3BsaXRUZXh0KHQsYT51P2E6dSksdD10PT09MD9yWzBdOnJbMV0sdCE9bnVsbD9bdF06W10pOltsXToobj1vLmlzQmVmb3JlKGkpLFEobCkmJihvPW4/YTp1LG89PT1sLmdldFRleHRDb250ZW50U2l6ZSgpP3Quc2hpZnQoKTpvIT09MCYmKFssbF09bC5zcGxpdFRleHQobyksdFswXT1sKSksUShzKSYmKGw9cy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCxuPW4/dTphLG49PT0wP3QucG9wKCk6biE9PWwmJihbc109cy5zcGxpdFRleHQobiksdFtyXT1zKSksdCl9bW9kaWZ5KHQsbixyKXt2YXIgbz10aGlzLmZvY3VzLGk9dGhpcy5hbmNob3IsbD10PT09Im1vdmUiLHM9QmgobyxuKTtpZihWZShzKSYmIXMuaXNJc29sYXRlZCgpKWwmJnMuaXNLZXlib2FyZFNlbGVjdGFibGUoKT8obj1ucCgpLG4uYWRkKHMuX19rZXkpLHZyKG4pKToodD1uP3MuZ2V0UHJldmlvdXNTaWJsaW5nKCk6cy5nZXROZXh0U2libGluZygpLFEodCk/KHM9dC5fX2tleSxuPW4/dC5nZXRUZXh0Q29udGVudCgpLmxlbmd0aDowLG8uc2V0KHMsbiwidGV4dCIpLGwmJmkuc2V0KHMsbiwidGV4dCIpKToocj1zLmdldFBhcmVudE9yVGhyb3coKSxCKHQpPyhyPXQuX19rZXkscz1uP3QuZ2V0Q2hpbGRyZW5TaXplKCk6MCk6KHM9cy5nZXRJbmRleFdpdGhpblBhcmVudCgpLHI9ci5fX2tleSxufHxzKyspLG8uc2V0KHIscywiZWxlbWVudCIpLGwmJmkuc2V0KHIscywiZWxlbWVudCIpKSk7ZWxzZSBpZihpPWV0KCksbz1FcihpLl93aW5kb3cpKXt2YXIgYT1pLl9ibG9ja0N1cnNvckVsZW1lbnQsdT1pLl9yb290RWxlbWVudDtpZih1PT09bnVsbHx8YT09PW51bGx8fCFCKHMpfHxzLmlzSW5saW5lKCl8fHMuY2FuQmVFbXB0eSgpfHxXaChhLGksdSksby5tb2RpZnkodCxuPyJiYWNrd2FyZCI6ImZvcndhcmQiLHIpLDA8by5yYW5nZUNvdW50JiYocz1vLmdldFJhbmdlQXQoMCksaT10aGlzLmFuY2hvci5nZXROb2RlKCksaT1lbihpKT9pOmh3KGkpLHRoaXMuYXBwbHlET01SYW5nZShzKSx0aGlzLmRpcnR5PSEwLCFsKSl7Zm9yKGw9dGhpcy5nZXROb2RlcygpLHQ9W10scj0hMSxhPTA7YTxsLmxlbmd0aDthKyspdT1sW2FdLF9jKHUsaSk/dC5wdXNoKHUpOnI9ITA7ciYmMDx0Lmxlbmd0aCYmKG4/KG49dFswXSxCKG4pP24uc2VsZWN0U3RhcnQoKTpuLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3RTdGFydCgpKToobj10W3QubGVuZ3RoLTFdLEIobik/bi5zZWxlY3RFbmQoKTpuLmdldFBhcmVudE9yVGhyb3coKS5zZWxlY3RFbmQoKSkpLChvLmFuY2hvck5vZGUhPT1zLnN0YXJ0Q29udGFpbmVyfHxvLmFuY2hvck9mZnNldCE9PXMuc3RhcnRPZmZzZXQpJiYobj10aGlzLmZvY3VzLGw9dGhpcy5hbmNob3Isbz1sLmtleSxzPWwub2Zmc2V0LGk9bC50eXBlLGFvKGwsbi5rZXksbi5vZmZzZXQsbi50eXBlKSxhbyhuLG8scyxpKSx0aGlzLl9jYWNoZWROb2Rlcz1udWxsKX19fWRlbGV0ZUNoYXJhY3Rlcih0KXtsZXQgbj10aGlzLmlzQ29sbGFwc2VkKCk7aWYodGhpcy5pc0NvbGxhcHNlZCgpKXt2YXIgcj10aGlzLmFuY2hvcixvPXRoaXMuZm9jdXMsaT1yLmdldE5vZGUoKTtpZighdCYmKHIudHlwZT09PSJlbGVtZW50IiYmQihpKSYmci5vZmZzZXQ9PT1pLmdldENoaWxkcmVuU2l6ZSgpfHxyLnR5cGU9PT0idGV4dCImJnIub2Zmc2V0PT09aS5nZXRUZXh0Q29udGVudFNpemUoKSkpe3ZhciBsPWkuZ2V0UGFyZW50KCk7aWYobD1pLmdldE5leHRTaWJsaW5nKCl8fChsPT09bnVsbD9udWxsOmwuZ2V0TmV4dFNpYmxpbmcoKSksQihsKSYmbC5pc1NoYWRvd1Jvb3QoKSlyZXR1cm59aWYobD1CaChvLHQpLFZlKGwpJiYhbC5pc0lzb2xhdGVkKCkpe2wuaXNLZXlib2FyZFNlbGVjdGFibGUoKSYmQihpKSYmaS5nZXRDaGlsZHJlblNpemUoKT09PTA/KGkucmVtb3ZlKCksdD1ucCgpLHQuYWRkKGwuX19rZXkpLHZyKHQpKToobC5yZW1vdmUoKSxldCgpLmRpc3BhdGNoQ29tbWFuZChsZCx2b2lkIDApKTtyZXR1cm59aWYoIXQmJkIobCkmJkIoaSkmJmkuaXNFbXB0eSgpKXtpLnJlbW92ZSgpLGwuc2VsZWN0U3RhcnQoKTtyZXR1cm59aWYodGhpcy5tb2RpZnkoImV4dGVuZCIsdCwiY2hhcmFjdGVyIiksdGhpcy5pc0NvbGxhcHNlZCgpKXtpZih0JiZyLm9mZnNldD09PTAmJihyLnR5cGU9PT0iZWxlbWVudCI/ci5nZXROb2RlKCk6ci5nZXROb2RlKCkuZ2V0UGFyZW50T3JUaHJvdygpKS5jb2xsYXBzZUF0U3RhcnQodGhpcykpcmV0dXJufWVsc2V7aWYobD1vLnR5cGU9PT0idGV4dCI/by5nZXROb2RlKCk6bnVsbCxpPXIudHlwZT09PSJ0ZXh0Ij9yLmdldE5vZGUoKTpudWxsLGwhPT1udWxsJiZsLmlzU2VnbWVudGVkKCkpe2lmKHI9by5vZmZzZXQsbz1sLmdldFRleHRDb250ZW50U2l6ZSgpLGwuaXMoaSl8fHQmJnIhPT1vfHwhdCYmciE9PTApe3l5KGwsdCxyKTtyZXR1cm59fWVsc2UgaWYoaSE9PW51bGwmJmkuaXNTZWdtZW50ZWQoKSYmKHI9ci5vZmZzZXQsbz1pLmdldFRleHRDb250ZW50U2l6ZSgpLGkuaXMobCl8fHQmJnIhPT0wfHwhdCYmciE9PW8pKXt5eShpLHQscik7cmV0dXJufWlmKGk9dGhpcy5hbmNob3IsbD10aGlzLmZvY3VzLHI9aS5nZXROb2RlKCksbz1sLmdldE5vZGUoKSxyPT09byYmaS50eXBlPT09InRleHQiJiZsLnR5cGU9PT0idGV4dCIpe3ZhciBzPWkub2Zmc2V0LGE9bC5vZmZzZXQ7bGV0IHU9czxhO289dT9zOmEsYT11P2E6cyxzPWEtMSxvIT09cyYmKHI9ci5nZXRUZXh0Q29udGVudCgpLnNsaWNlKG8sYSksY3cocil8fCh0P2wub2Zmc2V0PXM6aS5vZmZzZXQ9cykpfX19dGhpcy5yZW1vdmVUZXh0KCksdCYmIW4mJnRoaXMuaXNDb2xsYXBzZWQoKSYmdGhpcy5hbmNob3IudHlwZT09PSJlbGVtZW50IiYmdGhpcy5hbmNob3Iub2Zmc2V0PT09MCYmKHQ9dGhpcy5hbmNob3IuZ2V0Tm9kZSgpLHQuaXNFbXB0eSgpJiZlbih0LmdldFBhcmVudCgpKSYmdC5nZXRJbmRleFdpdGhpblBhcmVudCgpPT09MCYmdC5jb2xsYXBzZUF0U3RhcnQodGhpcykpfWRlbGV0ZUxpbmUodCl7dGhpcy5pc0NvbGxhcHNlZCgpJiYodGhpcy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmdGhpcy5tb2RpZnkoImV4dGVuZCIsdCwibGluZWJvdW5kYXJ5IiksKHQ/dGhpcy5mb2N1czp0aGlzLmFuY2hvcikub2Zmc2V0PT09MCYmdGhpcy5tb2RpZnkoImV4dGVuZCIsdCwiY2hhcmFjdGVyIikpLHRoaXMucmVtb3ZlVGV4dCgpfWRlbGV0ZVdvcmQodCl7dGhpcy5pc0NvbGxhcHNlZCgpJiZ0aGlzLm1vZGlmeSgiZXh0ZW5kIix0LCJ3b3JkIiksdGhpcy5yZW1vdmVUZXh0KCl9fWZ1bmN0aW9uIHpsKGUpe3JldHVybiBlIGluc3RhbmNlb2YgcGR9ZnVuY3Rpb24gdnkoZSl7bGV0IHQ9ZS5vZmZzZXQ7cmV0dXJuIGUudHlwZT09PSJ0ZXh0Ij90OihlPWUuZ2V0Tm9kZSgpLHQ9PT1lLmdldENoaWxkcmVuU2l6ZSgpP2UuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGg6MCl9ZnVuY3Rpb24ganUoZSl7bGV0IHQ9ZS5hbmNob3I7cmV0dXJuIGU9ZS5mb2N1cyx0LnR5cGU9PT0iZWxlbWVudCImJmUudHlwZT09PSJlbGVtZW50IiYmdC5rZXk9PT1lLmtleSYmdC5vZmZzZXQ9PT1lLm9mZnNldD9bMCwwXTpbdnkodCksdnkoZSldfWZ1bmN0aW9uIHl5KGUsdCxuKXtsZXQgcj1lLmdldFRleHRDb250ZW50KCkuc3BsaXQoLyg/PVxzKS9nKSxvPXIubGVuZ3RoLGk9MCxsPTA7Zm9yKGxldCBzPTA7czxvO3MrKyl7bGV0IGE9cltzXSx1PXM9PT1vLTE7aWYobD1pLGkrPWEubGVuZ3RoLHQmJmk9PT1ufHxpPm58fHUpe3Iuc3BsaWNlKHMsMSksdSYmKGw9dm9pZCAwKTticmVha319dD1yLmpvaW4oIiIpLnRyaW0oKSx0PT09IiI/ZS5yZW1vdmUoKTooZS5zZXRUZXh0Q29udGVudCh0KSxlLnNlbGVjdChsLGwpKX1mdW5jdGlvbiB4eShlLHQsbixyKXt2YXIgbz10O2lmKGUubm9kZVR5cGU9PT0xKXtsZXQgcz0hMTt2YXIgaT1lLmNoaWxkTm9kZXMsbD1pLmxlbmd0aDtvPT09bCYmKHM9ITAsbz1sLTEpO2xldCBhPWlbb107aWYobD0hMSxhPT09ci5fYmxvY2tDdXJzb3JFbGVtZW50PyhhPWlbbysxXSxsPSEwKTpyLl9ibG9ja0N1cnNvckVsZW1lbnQhPT1udWxsJiZvLS0scj1lbChhKSxRKHIpKW89cz9yLmdldFRleHRDb250ZW50U2l6ZSgpOjA7ZWxzZXtpZihpPWVsKGUpLGk9PT1udWxsKXJldHVybiBudWxsO2lmKEIoaSk/KGU9aS5nZXRDaGlsZEF0SW5kZXgobyksKHQ9QihlKSkmJih0PWUuZ2V0UGFyZW50KCksdD1uPT09bnVsbHx8dD09PW51bGx8fCF0LmNhbkJlRW1wdHkoKXx8dCE9PW4uZ2V0Tm9kZSgpKSx0JiYobj1zP2UuZ2V0TGFzdERlc2NlbmRhbnQoKTplLmdldEZpcnN0RGVzY2VuZGFudCgpLG49PT1udWxsPyhpPWUsbz0wKTooZT1uLGk9QihlKT9lOmUuZ2V0UGFyZW50T3JUaHJvdygpKSksUShlKT8ocj1lLGk9bnVsbCxvPXM/ZS5nZXRUZXh0Q29udGVudFNpemUoKTowKTplIT09aSYmcyYmIWwmJm8rKyk6KG89aS5nZXRJbmRleFdpdGhpblBhcmVudCgpLG89dD09PTAmJlZlKGkpJiZlbChlKT09PWk/bzpvKzEsaT1pLmdldFBhcmVudE9yVGhyb3coKSksQihpKSlyZXR1cm4gbmV3IHlyKGkuX19rZXksbywiZWxlbWVudCIpfX1lbHNlIHI9ZWwoZSk7cmV0dXJuIFEocik/bmV3IHlyKHIuX19rZXksbywidGV4dCIpOm51bGx9ZnVuY3Rpb24gX3koZSx0LG4pe3ZhciByPWUub2Zmc2V0LG89ZS5nZXROb2RlKCk7cj09PTA/KHI9by5nZXRQcmV2aW91c1NpYmxpbmcoKSxvPW8uZ2V0UGFyZW50KCksdD8obnx8IXQpJiZyPT09bnVsbCYmQihvKSYmby5pc0lubGluZSgpJiYodD1vLmdldFByZXZpb3VzU2libGluZygpLFEodCkmJihlLmtleT10Ll9fa2V5LGUub2Zmc2V0PXQuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgpKTpCKHIpJiYhbiYmci5pc0lubGluZSgpPyhlLmtleT1yLl9fa2V5LGUub2Zmc2V0PXIuZ2V0Q2hpbGRyZW5TaXplKCksZS50eXBlPSJlbGVtZW50Iik6UShyKSYmKGUua2V5PXIuX19rZXksZS5vZmZzZXQ9ci5nZXRUZXh0Q29udGVudCgpLmxlbmd0aCkpOnI9PT1vLmdldFRleHRDb250ZW50KCkubGVuZ3RoJiYocj1vLmdldE5leHRTaWJsaW5nKCksbz1vLmdldFBhcmVudCgpLHQmJkIocikmJnIuaXNJbmxpbmUoKT8oZS5rZXk9ci5fX2tleSxlLm9mZnNldD0wLGUudHlwZT0iZWxlbWVudCIpOihufHx0KSYmcj09PW51bGwmJkIobykmJm8uaXNJbmxpbmUoKSYmIW8uY2FuSW5zZXJ0VGV4dEFmdGVyKCkmJih0PW8uZ2V0TmV4dFNpYmxpbmcoKSxRKHQpJiYoZS5rZXk9dC5fX2tleSxlLm9mZnNldD0wKSkpfWZ1bmN0aW9uIFJ3KGUsdCxuKXtpZihlLnR5cGU9PT0idGV4dCImJnQudHlwZT09PSJ0ZXh0Iil7dmFyIHI9ZS5pc0JlZm9yZSh0KTtsZXQgbz1lLmlzKHQpO195KGUscixvKSxfeSh0LCFyLG8pLG8mJih0LmtleT1lLmtleSx0Lm9mZnNldD1lLm9mZnNldCx0LnR5cGU9ZS50eXBlKSxyPWV0KCksci5pc0NvbXBvc2luZygpJiZyLl9jb21wb3NpdGlvbktleSE9PWUua2V5JiZkZShuKSYmKHI9bi5hbmNob3Isbj1uLmZvY3VzLGFvKGUsci5rZXksci5vZmZzZXQsci50eXBlKSxhbyh0LG4ua2V5LG4ub2Zmc2V0LG4udHlwZSkpfX1mdW5jdGlvbiBQdyhlLHQsbixyLG8saSl7cmV0dXJuIGU9PT1udWxsfHxuPT09bnVsbHx8IUFhKG8sZSxuKXx8KHQ9eHkoZSx0LGRlKGkpP2kuYW5jaG9yOm51bGwsbyksdD09PW51bGwpfHwocj14eShuLHIsZGUoaSk/aS5mb2N1czpudWxsLG8pLHI9PT1udWxsfHx0LnR5cGU9PT0iZWxlbWVudCImJnIudHlwZT09PSJlbGVtZW50IiYmKGU9ZWwoZSksbj1lbChuKSxWZShlKSYmVmUobikpKT9udWxsOihSdyh0LHIsaSksW3Qscl0pfWZ1bmN0aW9uIHRwKGUpe3JldHVybiBCKGUpJiYhZS5pc0lubGluZSgpfWZ1bmN0aW9uIE93KGUsdCxuLHIsbyxpKXtsZXQgbD1DcigpO3JldHVybiBlPW5ldyBraShuZXcgeXIoZSx0LG8pLG5ldyB5cihuLHIsaSksMCwiIiksZS5kaXJ0eT0hMCxsLl9zZWxlY3Rpb249ZX1mdW5jdGlvbiBucCgpe3JldHVybiBuZXcgcGQobmV3IFNldCl9ZnVuY3Rpb24gRGIoZSl7bGV0IHQ9ZS5nZXRFZGl0b3JTdGF0ZSgpLl9zZWxlY3Rpb24sbj1FcihlLl93aW5kb3cpO3JldHVybiB6bCh0KXx8WWcodCk/dC5jbG9uZSgpOlhnKHQsbixlKX1mdW5jdGlvbiBYZyhlLHQsbil7dmFyIHI9bi5fd2luZG93O2lmKHI9PT1udWxsKXJldHVybiBudWxsO3ZhciBvPXIuZXZlbnQsaT1vP28udHlwZTp2b2lkIDA7cj1pPT09InNlbGVjdGlvbmNoYW5nZSIsbz0hemgmJihyfHxpPT09ImJlZm9yZWlucHV0Inx8aT09PSJjb21wb3NpdGlvbnN0YXJ0Inx8aT09PSJjb21wb3NpdGlvbmVuZCJ8fGk9PT0iY2xpY2siJiZvJiZvLmRldGFpbD09PTN8fGk9PT0iZHJvcCJ8fGk9PT12b2lkIDApO2xldCBsO2lmKCFkZShlKXx8byl7aWYodD09PW51bGwpcmV0dXJuIG51bGw7aWYobz10LmFuY2hvck5vZGUsaT10LmZvY3VzTm9kZSxsPXQuYW5jaG9yT2Zmc2V0LHQ9dC5mb2N1c09mZnNldCxyJiZkZShlKSYmIUFhKG4sbyxpKSlyZXR1cm4gZS5jbG9uZSgpfWVsc2UgcmV0dXJuIGUuY2xvbmUoKTtpZihuPVB3KG8sbCxpLHQsbixlKSxuPT09bnVsbClyZXR1cm4gbnVsbDtsZXRbcyxhXT1uO3JldHVybiBuZXcga2kocyxhLGRlKGUpP2UuZm9ybWF0OjAsZGUoZSk/ZS5zdHlsZToiIil9ZnVuY3Rpb24gS2UoKXtyZXR1cm4gQ3IoKS5fc2VsZWN0aW9ufWZ1bmN0aW9uIEZsKCl7cmV0dXJuIGV0KCkuX2VkaXRvclN0YXRlLl9zZWxlY3Rpb259ZnVuY3Rpb24gRWMoZSx0LG4scj0xKXt2YXIgbz1lLmFuY2hvcixpPWUuZm9jdXMsbD1vLmdldE5vZGUoKSxzPWkuZ2V0Tm9kZSgpO2lmKHQuaXMobCl8fHQuaXMocykpe2lmKGw9dC5fX2tleSxlLmlzQ29sbGFwc2VkKCkpdD1vLm9mZnNldCwobjw9dCYmMDxyfHxuPHQmJjA+cikmJihuPU1hdGgubWF4KDAsdCtyKSxvLnNldChsLG4sImVsZW1lbnQiKSxpLnNldChsLG4sImVsZW1lbnQiKSx3eShlKSk7ZWxzZXtsZXQgdT1lLmlzQmFja3dhcmQoKTtzPXU/aTpvO3ZhciBhPXMuZ2V0Tm9kZSgpO289dT9vOmksaT1vLmdldE5vZGUoKSx0LmlzKGEpJiYoYT1zLm9mZnNldCwobjw9YSYmMDxyfHxuPGEmJjA+cikmJnMuc2V0KGwsTWF0aC5tYXgoMCxhK3IpLCJlbGVtZW50IikpLHQuaXMoaSkmJih0PW8ub2Zmc2V0LChuPD10JiYwPHJ8fG48dCYmMD5yKSYmby5zZXQobCxNYXRoLm1heCgwLHQrciksImVsZW1lbnQiKSl9d3koZSl9fWZ1bmN0aW9uIHd5KGUpe3ZhciB0PWUuYW5jaG9yLG49dC5vZmZzZXQ7bGV0IHI9ZS5mb2N1czt2YXIgbz1yLm9mZnNldCxpPXQuZ2V0Tm9kZSgpLGw9ci5nZXROb2RlKCk7aWYoZS5pc0NvbGxhcHNlZCgpKUIoaSkmJihsPWkuZ2V0Q2hpbGRyZW5TaXplKCksbD0obz1uPj1sKT9pLmdldENoaWxkQXRJbmRleChsLTEpOmkuZ2V0Q2hpbGRBdEluZGV4KG4pLFEobCkmJihuPTAsbyYmKG49bC5nZXRUZXh0Q29udGVudFNpemUoKSksdC5zZXQobC5fX2tleSxuLCJ0ZXh0Iiksci5zZXQobC5fX2tleSxuLCJ0ZXh0IikpKTtlbHNle2lmKEIoaSkpe2xldCBzPWkuZ2V0Q2hpbGRyZW5TaXplKCk7bj0oZT1uPj1zKT9pLmdldENoaWxkQXRJbmRleChzLTEpOmkuZ2V0Q2hpbGRBdEluZGV4KG4pLFEobikmJihpPTAsZSYmKGk9bi5nZXRUZXh0Q29udGVudFNpemUoKSksdC5zZXQobi5fX2tleSxpLCJ0ZXh0IikpfUIobCkmJihuPWwuZ2V0Q2hpbGRyZW5TaXplKCksbz0odD1vPj1uKT9sLmdldENoaWxkQXRJbmRleChuLTEpOmwuZ2V0Q2hpbGRBdEluZGV4KG8pLFEobykmJihsPTAsdCYmKGw9by5nZXRUZXh0Q29udGVudFNpemUoKSksci5zZXQoby5fX2tleSxsLCJ0ZXh0IikpKX19ZnVuY3Rpb24gTGIoZSx0KXtpZih0PXQuZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uLGU9ZS5fc2VsZWN0aW9uLGRlKGUpKXt2YXIgbj1lLmFuY2hvcjtsZXQgcj1lLmZvY3VzLG87bi50eXBlPT09InRleHQiJiYobz1uLmdldE5vZGUoKSxvLnNlbGVjdGlvblRyYW5zZm9ybSh0LGUpKSxyLnR5cGU9PT0idGV4dCImJihuPXIuZ2V0Tm9kZSgpLG8hPT1uJiZuLnNlbGVjdGlvblRyYW5zZm9ybSh0LGUpKX19ZnVuY3Rpb24gQ2MoZSx0LG4scixvKXtsZXQgaT1udWxsLGw9MCxzPW51bGw7ciE9PW51bGw/KGk9ci5fX2tleSxRKHIpPyhsPXIuZ2V0VGV4dENvbnRlbnRTaXplKCkscz0idGV4dCIpOkIocikmJihsPXIuZ2V0Q2hpbGRyZW5TaXplKCkscz0iZWxlbWVudCIpKTpvIT09bnVsbCYmKGk9by5fX2tleSxRKG8pP3M9InRleHQiOkIobykmJihzPSJlbGVtZW50IikpLGkhPT1udWxsJiZzIT09bnVsbD9lLnNldChpLGwscyk6KGw9dC5nZXRJbmRleFdpdGhpblBhcmVudCgpLGw9PT0tMSYmKGw9bi5nZXRDaGlsZHJlblNpemUoKSksZS5zZXQobi5fX2tleSxsLCJlbGVtZW50IikpfWZ1bmN0aW9uIFN5KGUsdCxuLHIsbyl7ZS50eXBlPT09InRleHQiPyhlLmtleT1uLHR8fChlLm9mZnNldCs9bykpOmUub2Zmc2V0PnIuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSYmLS1lLm9mZnNldH1mdW5jdGlvbiBBdyhlLHQsbil7bGV0IHI9W10sbz1udWxsLGk9bnVsbDtlPWUuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IGM9MDtjPGUubGVuZ3RoO2MrKyl7dmFyIGw9ZVtjXTt5YShsKXx8VSgxMDgpO3ZhciBzPWwuZ2V0Q2hpbGRyZW4oKTtsPTA7Zm9yKGxldCBkIG9mIHMpe2ZvcihBbihkKXx8VSgxMDkpO3JbY10hPT12b2lkIDAmJnJbY11bbF0hPT12b2lkIDA7KWwrKztzPWM7dmFyIGE9bCx1PWQ7bGV0IGY9e2NlbGw6dSxzdGFydENvbHVtbjphLHN0YXJ0Um93OnN9LGg9dS5fX3Jvd1NwYW4sZz11Ll9fY29sU3Bhbjtmb3IobGV0IG09MDttPGg7bSsrKXtyW3MrbV09PT12b2lkIDAmJihyW3MrbV09W10pO2ZvcihsZXQgUz0wO1M8ZztTKyspcltzK21dW2ErU109Zn10LmlzKHUpJiYobz1mKSxuLmlzKHUpJiYoaT1mKSxsKz1kLl9fY29sU3Bhbn19cmV0dXJuIG89PT1udWxsJiZVKDExMCksaT09PW51bGwmJlUoMTExKSxbcixvLGldfWZ1bmN0aW9uIE13KGUpe2UgaW5zdGFuY2VvZiBaZ3x8KGUgaW5zdGFuY2VvZiBMYT8oZT13YyhlLEFuKSxBbihlKXx8VSgxMTQpKTooZT13YyhlLmdldE5vZGUoKSxBbiksQW4oZSl8fFUoMTE0KSkpO2xldCB0PWUuZ2V0UGFyZW50KCk7eWEodCl8fFUoMTE1KTtsZXQgbj10LmdldFBhcmVudCgpO3JldHVybiBxZyhuKXx8VSgxMTYpLFtlLHQsbl19bGV0IGt0PW51bGwsVHQ9bnVsbCxwbj0hMSx3Zj0hMSx2YT0wLEV5PXtjaGFyYWN0ZXJEYXRhOiEwLGNoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfTtmdW5jdGlvbiBCbCgpe3JldHVybiBwbnx8a3QhPT1udWxsJiZrdC5fcmVhZE9ubHl9ZnVuY3Rpb24gWnQoKXtwbiYmVSgxMyl9ZnVuY3Rpb24gQ3IoKXtyZXR1cm4ga3Q9PT1udWxsJiZVKDE1KSxrdH1mdW5jdGlvbiBldCgpe3JldHVybiBUdD09PW51bGwmJlUoMTYpLFR0fWZ1bmN0aW9uIEN5KGUsdCxuKXt2YXIgcj10Ll9fdHlwZTtsZXQgbz1lLl9ub2Rlcy5nZXQocik7Zm9yKG89PT12b2lkIDAmJlUoMzAsciksZT1uLmdldChyKSxlPT09dm9pZCAwJiYoZT1BcnJheS5mcm9tKG8udHJhbnNmb3Jtcyksbi5zZXQocixlKSksbj1lLmxlbmd0aCxyPTA7cjxuJiYoZVtyXSh0KSx0LmlzQXR0YWNoZWQoKSk7cisrKTt9ZnVuY3Rpb24gSWIoZSx0KXt0PXQuX2RpcnR5TGVhdmVzLGU9ZS5fbm9kZU1hcDtmb3IobGV0IG4gb2YgdCl0PWUuZ2V0KG4pLFEodCkmJnQuaXNBdHRhY2hlZCgpJiZ0LmlzU2ltcGxlVGV4dCgpJiYhdC5pc1VubWVyZ2VhYmxlKCkmJm93KHQpfWZ1bmN0aW9uIGpiKGUsdCl7bGV0IG49dC5fZGlydHlMZWF2ZXMscj10Ll9kaXJ0eUVsZW1lbnRzO2U9ZS5fbm9kZU1hcDtsZXQgbz1tbygpLGk9bmV3IE1hcDt2YXIgbD1uO2xldCBzPWwuc2l6ZTtmb3IodmFyIGE9cix1PWEuc2l6ZTswPHN8fDA8dTspe2lmKDA8cyl7dC5fZGlydHlMZWF2ZXM9bmV3IFNldDtmb3IobGV0IGMgb2YgbClsPWUuZ2V0KGMpLFEobCkmJmwuaXNBdHRhY2hlZCgpJiZsLmlzU2ltcGxlVGV4dCgpJiYhbC5pc1VubWVyZ2VhYmxlKCkmJm93KGwpLGwhPT12b2lkIDAmJmwhPT12b2lkIDAmJmwuX19rZXkhPT1vJiZsLmlzQXR0YWNoZWQoKSYmQ3kodCxsLGkpLG4uYWRkKGMpO2lmKGw9dC5fZGlydHlMZWF2ZXMscz1sLnNpemUsMDxzKXt2YSsrO2NvbnRpbnVlfX10Ll9kaXJ0eUxlYXZlcz1uZXcgU2V0LHQuX2RpcnR5RWxlbWVudHM9bmV3IE1hcDtmb3IobGV0IGMgb2YgYSlhPWNbMF0sdT1jWzFdLChhPT09InJvb3QifHx1KSYmKGw9ZS5nZXQoYSksbCE9PXZvaWQgMCYmbCE9PXZvaWQgMCYmbC5fX2tleSE9PW8mJmwuaXNBdHRhY2hlZCgpJiZDeSh0LGwsaSksci5zZXQoYSx1KSk7bD10Ll9kaXJ0eUxlYXZlcyxzPWwuc2l6ZSxhPXQuX2RpcnR5RWxlbWVudHMsdT1hLnNpemUsdmErK310Ll9kaXJ0eUxlYXZlcz1uLHQuX2RpcnR5RWxlbWVudHM9cn1mdW5jdGlvbiBRZyhlLHQpe3ZhciBuPWUudHlwZSxyPXQuZ2V0KG4pO2lmKHI9PT12b2lkIDAmJlUoMTcsbiksbj1yLmtsYXNzLGUudHlwZSE9PW4uZ2V0VHlwZSgpJiZVKDE4LG4ubmFtZSksbj1uLmltcG9ydEpTT04oZSksZT1lLmNoaWxkcmVuLEIobikmJkFycmF5LmlzQXJyYXkoZSkpZm9yKHI9MDtyPGUubGVuZ3RoO3IrKyl7bGV0IG89UWcoZVtyXSx0KTtuLmFwcGVuZChvKX1yZXR1cm4gbn1mdW5jdGlvbiAkeShlLHQpe2xldCBuPWt0LHI9cG4sbz1UdDtrdD1lLHBuPSEwLFR0PW51bGw7dHJ5e3JldHVybiB0KCl9ZmluYWxseXtrdD1uLHBuPXIsVHQ9b319ZnVuY3Rpb24gbGkoZSx0KXtsZXQgbj1lLl9wZW5kaW5nRWRpdG9yU3RhdGUscj1lLl9yb290RWxlbWVudCxvPWUuX2hlYWRsZXNzfHxyPT09bnVsbDtpZihuIT09bnVsbCl7dmFyIGk9ZS5fZWRpdG9yU3RhdGUsbD1pLl9zZWxlY3Rpb24scz1uLl9zZWxlY3Rpb24sYT1lLl9kaXJ0eVR5cGUhPT0wLHU9a3QsYz1wbixkPVR0LGY9ZS5fdXBkYXRpbmcsaD1lLl9vYnNlcnZlcixnPW51bGw7aWYoZS5fcGVuZGluZ0VkaXRvclN0YXRlPW51bGwsZS5fZWRpdG9yU3RhdGU9biwhbyYmYSYmaCE9PW51bGwpe1R0PWUsa3Q9bixwbj0hMSxlLl91cGRhdGluZz0hMDt0cnl7bGV0IFRlPWUuX2RpcnR5VHlwZSxmdD1lLl9kaXJ0eUVsZW1lbnRzLGh0PWUuX2RpcnR5TGVhdmVzO2guZGlzY29ubmVjdCgpO3ZhciBtPVRlLFM9ZnQsdj1odDtKdD1Pcj1ndD0iIix2dz1tPT09MixEdT1udWxsLEh0PWUsUm89ZS5fY29uZmlnLGhhPWUuX25vZGVzLGZkPUh0Ll9saXN0ZW5lcnMubXV0YXRpb24sVWg9UyxWaD12LGZpPWkuX25vZGVNYXAsUG89bi5fbm9kZU1hcCxHZz1uLl9yZWFkT25seSxIaD1uZXcgTWFwKGUuX2tleVRvRE9NTWFwKTtsZXQgX3Q9bmV3IE1hcDtwYT1fdCx5cygicm9vdCIsbnVsbCkscGE9SGg9Um89UG89Zmk9Vmg9VWg9aGE9SHQ9dm9pZCAwLGc9X3R9Y2F0Y2goVGUpe2lmKFRlIGluc3RhbmNlb2YgRXJyb3ImJmUuX29uRXJyb3IoVGUpLHdmKXRocm93IFRlO2p3KGUsbnVsbCxyLG4pLHJ3KGUpLGUuX2RpcnR5VHlwZT0yLHdmPSEwLGxpKGUsaSksd2Y9ITE7cmV0dXJufWZpbmFsbHl7aC5vYnNlcnZlKHIsRXkpLGUuX3VwZGF0aW5nPWYsa3Q9dSxwbj1jLFR0PWR9fW4uX3JlYWRPbmx5fHwobi5fcmVhZE9ubHk9ITApO3ZhciB5PWUuX2RpcnR5TGVhdmVzLHg9ZS5fZGlydHlFbGVtZW50cyxfPWUuX25vcm1hbGl6ZWROb2RlcyxFPWUuX3VwZGF0ZVRhZ3MsJD1lLl9kZWZlcnJlZDthJiYoZS5fZGlydHlUeXBlPTAsZS5fY2xvbmVOb3ROZWVkZWQuY2xlYXIoKSxlLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LGUuX2RpcnR5RWxlbWVudHM9bmV3IE1hcCxlLl9ub3JtYWxpemVkTm9kZXM9bmV3IFNldCxlLl91cGRhdGVUYWdzPW5ldyBTZXQpO3ZhciBDPWUuX2RlY29yYXRvcnMsVD1lLl9wZW5kaW5nRGVjb3JhdG9yc3x8QyxNPW4uX25vZGVNYXAsUjtmb3IoUiBpbiBUKU0uaGFzKFIpfHwoVD09PUMmJihUPXV3KGUpKSxkZWxldGUgVFtSXSk7dmFyIGo9bz9udWxsOkVyKGUuX3dpbmRvdyk7aWYoZS5fZWRpdGFibGUmJmohPT1udWxsJiYoYXx8cz09PW51bGx8fHMuZGlydHkpKXtUdD1lLGt0PW47dHJ5e2lmKGghPT1udWxsJiZoLmRpc2Nvbm5lY3QoKSxhfHxzPT09bnVsbHx8cy5kaXJ0eSl7bGV0IFRlPWUuX2Jsb2NrQ3Vyc29yRWxlbWVudDtUZSE9PW51bGwmJldoKFRlLGUscik7ZTp7bGV0IGZ0PWouYW5jaG9yTm9kZSxodD1qLmZvY3VzTm9kZSxfdD1qLmFuY2hvck9mZnNldCxnbj1qLmZvY3VzT2Zmc2V0LEl0PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoIShFLmhhcygiY29sbGFib3JhdGlvbiIpJiZJdCE9PXJ8fEl0IT09bnVsbCYmQmcoSXQpKSlpZihkZShzKSl7dmFyIEY9cy5hbmNob3IsYWU9cy5mb2N1cyxIPUYua2V5LFg9YWUua2V5LFA9eGMoZSxIKSxPPXhjKGUsWCksaz1GLm9mZnNldCxJPWFlLm9mZnNldCxMPXMuZm9ybWF0LFY9cy5zdHlsZSx0ZT1zLmlzQ29sbGFwc2VkKCkseWU9UCxmZT1PLE9lPSExO2lmKEYudHlwZT09PSJ0ZXh0Iil7eWU9bWMoUCk7bGV0IHd0PUYuZ2V0Tm9kZSgpO09lPXd0LmdldEZvcm1hdCgpIT09THx8d3QuZ2V0U3R5bGUoKSE9PVZ9ZWxzZSBkZShsKSYmbC5hbmNob3IudHlwZT09PSJ0ZXh0IiYmKE9lPSEwKTtpZihhZS50eXBlPT09InRleHQiJiYoZmU9bWMoTykpLHllIT09bnVsbCYmZmUhPT1udWxsKXtpZih0ZSYmKGw9PT1udWxsfHxPZXx8ZGUobCkmJihsLmZvcm1hdCE9PUx8fGwuc3R5bGUhPT1WKSkpe3ZhciBiZT1wZXJmb3JtYW5jZS5ub3coKTskdz1bTCxWLGssSCxiZV19aWYoX3Q9PT1rJiZnbj09PUkmJmZ0PT09eWUmJmh0PT09ZmUmJihqLnR5cGUhPT0iUmFuZ2UifHwhdGUpJiYoSXQhPT1udWxsJiZyLmNvbnRhaW5zKEl0KXx8ci5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLEYudHlwZSE9PSJlbGVtZW50IikpYnJlYWsgZTt0cnl7ai5zZXRCYXNlQW5kRXh0ZW50KHllLGssZmUsSSl9Y2F0Y2h7fWlmKCFFLmhhcygic2tpcC1zY3JvbGwtaW50by12aWV3IikmJnMuaXNDb2xsYXBzZWQoKSYmciE9PW51bGwmJnI9PT1kb2N1bWVudC5hY3RpdmVFbGVtZW50KXtsZXQgd3Q9cyBpbnN0YW5jZW9mIGtpJiZzLmFuY2hvci50eXBlPT09ImVsZW1lbnQiP3llLmNoaWxkTm9kZXNba118fG51bGw6MDxqLnJhbmdlQ291bnQ/ai5nZXRSYW5nZUF0KDApOm51bGw7aWYod3QhPT1udWxsKXtsZXQgT3Q7aWYod3QgaW5zdGFuY2VvZiBUZXh0KXtsZXQgenQ9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTt6dC5zZWxlY3ROb2RlKHd0KSxPdD16dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1lbHNlIE90PXd0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2xldCBvcj1yLm93bmVyRG9jdW1lbnQsanQ9b3IuZGVmYXVsdFZpZXc7aWYoanQhPT1udWxsKWZvcih2YXJ7dG9wOlosYm90dG9tOmtlfT1PdCxjZSxfZSxtZT1yO21lIT09bnVsbDspe2xldCB6dD1tZT09PW9yLmJvZHk7aWYoenQpY2U9MCxfZT1jZChlKS5pbm5lckhlaWdodDtlbHNle2xldCBXbz1tZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtjZT1Xby50b3AsX2U9V28uYm90dG9tfWxldCBpcj0wO2lmKFo8Y2U/aXI9LShjZS1aKTprZT5fZSYmKGlyPWtlLV9lKSxpciE9PTApaWYoenQpanQuc2Nyb2xsQnkoMCxpcik7ZWxzZXtsZXQgV289bWUuc2Nyb2xsVG9wO21lLnNjcm9sbFRvcCs9aXI7bGV0IFdhPW1lLnNjcm9sbFRvcC1XbztaLT1XYSxrZS09V2F9aWYoenQpYnJlYWs7bWU9dWQobWUpfX19UWg9ITB9fWVsc2UgbCE9PW51bGwmJkFhKGUsZnQsaHQpJiZqLnJlbW92ZUFsbFJhbmdlcygpfX1lOntsZXQgVGU9ZS5fYmxvY2tDdXJzb3JFbGVtZW50O2lmKGRlKHMpJiZzLmlzQ29sbGFwc2VkKCkmJnMuYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJnIuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpe2xldCBmdD1zLmFuY2hvcixodD1mdC5nZXROb2RlKCksX3Q9ZnQub2Zmc2V0LGduPWh0LmdldENoaWxkcmVuU2l6ZSgpLEl0PSExLHd0PW51bGw7aWYoX3Q9PT1nbil7bGV0IE90PWh0LmdldENoaWxkQXRJbmRleChfdC0xKTtwZihPdCkmJihJdD0hMCl9ZWxzZXtsZXQgT3Q9aHQuZ2V0Q2hpbGRBdEluZGV4KF90KTtpZihwZihPdCkpe2xldCBvcj1PdC5nZXRQcmV2aW91c1NpYmxpbmcoKTsob3I9PT1udWxsfHxwZihvcikpJiYoSXQ9ITAsd3Q9ZS5nZXRFbGVtZW50QnlLZXkoT3QuX19rZXkpKX19aWYoSXQpe2xldCBPdD1lLmdldEVsZW1lbnRCeUtleShodC5fX2tleSk7aWYoVGU9PT1udWxsKXtsZXQgb3I9ZS5fY29uZmlnLnRoZW1lLGp0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2p0LmNvbnRlbnRFZGl0YWJsZT0iZmFsc2UiLGp0LnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLWN1cnNvciIsInRydWUiKTtsZXQgenQ9b3IuYmxvY2tDdXJzb3I7aWYoenQhPT12b2lkIDApe2lmKHR5cGVvZiB6dD09InN0cmluZyIpe2xldCBpcj16dC5zcGxpdCgiICIpO3p0PW9yLmJsb2NrQ3Vyc29yPWlyfXp0IT09dm9pZCAwJiZqdC5jbGFzc0xpc3QuYWRkKC4uLnp0KX1lLl9ibG9ja0N1cnNvckVsZW1lbnQ9VGU9anR9ci5zdHlsZS5jYXJldENvbG9yPSJ0cmFuc3BhcmVudCIsd3Q9PT1udWxsP090LmFwcGVuZENoaWxkKFRlKTpPdC5pbnNlcnRCZWZvcmUoVGUsd3QpO2JyZWFrIGV9fVRlIT09bnVsbCYmV2goVGUsZSxyKX1oIT09bnVsbCYmaC5vYnNlcnZlKHIsRXkpfWZpbmFsbHl7VHQ9ZCxrdD11fX1pZihnIT09bnVsbCl7dmFyICRlPWc7bGV0IFRlPUFycmF5LmZyb20oZS5fbGlzdGVuZXJzLm11dGF0aW9uKSxmdD1UZS5sZW5ndGg7Zm9yKGxldCBodD0wO2h0PGZ0O2h0Kyspe2xldFtfdCxnbl09VGVbaHRdLEl0PSRlLmdldChnbik7SXQhPT12b2lkIDAmJl90KEl0LHtkaXJ0eUxlYXZlczp5LHByZXZFZGl0b3JTdGF0ZTppLHVwZGF0ZVRhZ3M6RX0pfX1kZShzKXx8cz09PW51bGx8fGwhPT1udWxsJiZsLmlzKHMpfHxlLmRpc3BhdGNoQ29tbWFuZChsZCx2b2lkIDApO3ZhciBCZT1lLl9wZW5kaW5nRGVjb3JhdG9ycztCZSE9PW51bGwmJihlLl9kZWNvcmF0b3JzPUJlLGUuX3BlbmRpbmdEZWNvcmF0b3JzPW51bGwsanMoImRlY29yYXRvciIsZSwhMCxCZSkpO3ZhciBQdD1heSh0fHxpKSxzbj1heShuKTtpZihQdCE9PXNuJiZqcygidGV4dGNvbnRlbnQiLGUsITAsc24pLGpzKCJ1cGRhdGUiLGUsITAse2RpcnR5RWxlbWVudHM6eCxkaXJ0eUxlYXZlczp5LGVkaXRvclN0YXRlOm4sbm9ybWFsaXplZE5vZGVzOl8scHJldkVkaXRvclN0YXRlOnR8fGksdGFnczpFfSksZS5fZGVmZXJyZWQ9W10sJC5sZW5ndGghPT0wKXtsZXQgVGU9ZS5fdXBkYXRpbmc7ZS5fdXBkYXRpbmc9ITA7dHJ5e2ZvcihsZXQgZnQ9MDtmdDwkLmxlbmd0aDtmdCsrKSRbZnRdKCl9ZmluYWxseXtlLl91cGRhdGluZz1UZX19dmFyIGJuPWUuX3VwZGF0ZXM7aWYoYm4ubGVuZ3RoIT09MCl7bGV0IFRlPWJuLnNoaWZ0KCk7aWYoVGUpe2xldFtmdCxodF09VGU7RHcoZSxmdCxodCl9fX19ZnVuY3Rpb24ganMoZSx0LG4sLi4ucil7bGV0IG89dC5fdXBkYXRpbmc7dC5fdXBkYXRpbmc9bjt0cnl7bGV0IGk9QXJyYXkuZnJvbSh0Ll9saXN0ZW5lcnNbZV0pO2ZvcihlPTA7ZTxpLmxlbmd0aDtlKyspaVtlXS5hcHBseShudWxsLHIpfWZpbmFsbHl7dC5fdXBkYXRpbmc9b319ZnVuY3Rpb24gWShlLHQsbil7aWYoZS5fdXBkYXRpbmc9PT0hMXx8VHQhPT1lKXtsZXQgaT0hMTtyZXR1cm4gZS51cGRhdGUoKCk9PntpPVkoZSx0LG4pfSksaX1sZXQgcj1VZyhlKTtmb3IobGV0IGk9NDswPD1pO2ktLSlmb3IobGV0IGw9MDtsPHIubGVuZ3RoO2wrKyl7dmFyIG89cltsXS5fY29tbWFuZHMuZ2V0KHQpO2lmKG8hPT12b2lkIDAmJihvPW9baV0sbyE9PXZvaWQgMCkpe289QXJyYXkuZnJvbShvKTtsZXQgcz1vLmxlbmd0aDtmb3IobGV0IGE9MDthPHM7YSsrKWlmKG9bYV0obixlKT09PSEwKXJldHVybiEwfX1yZXR1cm4hMX1mdW5jdGlvbiBreShlLHQpe2xldCBuPWUuX3VwZGF0ZXM7Zm9yKHQ9dHx8ITE7bi5sZW5ndGghPT0wOyl7dmFyIHI9bi5zaGlmdCgpO2lmKHIpe2xldFtvLGldPXIsbDtpIT09dm9pZCAwJiYocj1pLm9uVXBkYXRlLGw9aS50YWcsaS5za2lwVHJhbnNmb3JtcyYmKHQ9ITApLHImJmUuX2RlZmVycmVkLnB1c2gociksbCYmZS5fdXBkYXRlVGFncy5hZGQobCkpLG8oKX19cmV0dXJuIHR9ZnVuY3Rpb24gRHcoZSx0LG4pe2xldCByPWUuX3VwZGF0ZVRhZ3M7dmFyIG8saT1vPSExO2lmKG4hPT12b2lkIDApe3ZhciBsPW4ub25VcGRhdGU7bz1uLnRhZyxvIT1udWxsJiZyLmFkZChvKSxvPW4uc2tpcFRyYW5zZm9ybXN8fCExLGk9bi5kaXNjcmV0ZXx8ITF9bCYmZS5fZGVmZXJyZWQucHVzaChsKSxuPWUuX2VkaXRvclN0YXRlLGw9ZS5fcGVuZGluZ0VkaXRvclN0YXRlO2xldCBzPSExOyhsPT09bnVsbHx8bC5fcmVhZE9ubHkpJiYobD1lLl9wZW5kaW5nRWRpdG9yU3RhdGU9bmV3IG1kKG5ldyBNYXAoKGx8fG4pLl9ub2RlTWFwKSkscz0hMCksbC5fZmx1c2hTeW5jPWksaT1rdDtsZXQgYT1wbix1PVR0LGM9ZS5fdXBkYXRpbmc7a3Q9bCxwbj0hMSxlLl91cGRhdGluZz0hMCxUdD1lO3RyeXtzJiYoZS5faGVhZGxlc3M/bi5fc2VsZWN0aW9uIT1udWxsJiYobC5fc2VsZWN0aW9uPW4uX3NlbGVjdGlvbi5jbG9uZSgpKTpsLl9zZWxlY3Rpb249RGIoZSkpO2xldCBkPWUuX2NvbXBvc2l0aW9uS2V5O3QoKSxvPWt5KGUsbyksTGIobCxlKSxlLl9kaXJ0eVR5cGUhPT0wJiYobz9JYihsLGUpOmpiKGwsZSksa3koZSkseGIobixsLGUuX2RpcnR5TGVhdmVzLGUuX2RpcnR5RWxlbWVudHMpKSxkIT09ZS5fY29tcG9zaXRpb25LZXkmJihsLl9mbHVzaFN5bmM9ITApO2xldCBmPWwuX3NlbGVjdGlvbjtpZihkZShmKSl7bGV0IGg9bC5fbm9kZU1hcCxnPWYuZm9jdXMua2V5O2guZ2V0KGYuYW5jaG9yLmtleSkhPT12b2lkIDAmJmguZ2V0KGcpIT09dm9pZCAwfHxVKDE5KX1lbHNlIHpsKGYpJiZmLl9ub2Rlcy5zaXplPT09MCYmKGwuX3NlbGVjdGlvbj1udWxsKX1jYXRjaChkKXtkIGluc3RhbmNlb2YgRXJyb3ImJmUuX29uRXJyb3IoZCksZS5fcGVuZGluZ0VkaXRvclN0YXRlPW4sZS5fZGlydHlUeXBlPTIsZS5fY2xvbmVOb3ROZWVkZWQuY2xlYXIoKSxlLl9kaXJ0eUxlYXZlcz1uZXcgU2V0LGUuX2RpcnR5RWxlbWVudHMuY2xlYXIoKSxsaShlKTtyZXR1cm59ZmluYWxseXtrdD1pLHBuPWEsVHQ9dSxlLl91cGRhdGluZz1jLHZhPTB9ZS5fZGlydHlUeXBlIT09MHx8emIobCxlKT9sLl9mbHVzaFN5bmM/KGwuX2ZsdXNoU3luYz0hMSxsaShlKSk6cyYmZ2IoKCk9PntsaShlKX0pOihsLl9mbHVzaFN5bmM9ITEscyYmKHIuY2xlYXIoKSxlLl9kZWZlcnJlZD1bXSxlLl9wZW5kaW5nRWRpdG9yU3RhdGU9bnVsbCkpfWZ1bmN0aW9uIGtuKGUsdCxuKXtlLl91cGRhdGluZz9lLl91cGRhdGVzLnB1c2goW3Qsbl0pOkR3KGUsdCxuKX1jbGFzcyBMdyBleHRlbmRzIExhe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpfWRlY29yYXRlKCl7VSg0Nyl9aXNJc29sYXRlZCgpe3JldHVybiExfWlzSW5saW5lKCl7cmV0dXJuITB9aXNLZXlib2FyZFNlbGVjdGFibGUoKXtyZXR1cm4hMH19ZnVuY3Rpb24gVmUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBMd31jbGFzcyBUaSBleHRlbmRzIExhe2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMuX19sYXN0PXRoaXMuX19maXJzdD1udWxsLHRoaXMuX19pbmRlbnQ9dGhpcy5fX2Zvcm1hdD10aGlzLl9fc2l6ZT0wLHRoaXMuX19kaXI9bnVsbH1nZXRGb3JtYXQoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Zvcm1hdH1nZXRGb3JtYXRUeXBlKCl7bGV0IHQ9dGhpcy5nZXRGb3JtYXQoKTtyZXR1cm4gdWJbdF18fCIifWdldEluZGVudCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9faW5kZW50fWdldENoaWxkcmVuKCl7bGV0IHQ9W10sbj10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobiksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q2hpbGRyZW5LZXlzKCl7bGV0IHQ9W10sbj10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO24hPT1udWxsOyl0LnB1c2gobi5fX2tleSksbj1uLmdldE5leHRTaWJsaW5nKCk7cmV0dXJuIHR9Z2V0Q2hpbGRyZW5TaXplKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19zaXplfWlzRW1wdHkoKXtyZXR1cm4gdGhpcy5nZXRDaGlsZHJlblNpemUoKT09PTB9aXNEaXJ0eSgpe2xldCB0PWV0KCkuX2RpcnR5RWxlbWVudHM7cmV0dXJuIHQhPT1udWxsJiZ0Lmhhcyh0aGlzLl9fa2V5KX1pc0xhc3RDaGlsZCgpe2xldCB0PXRoaXMuZ2V0TGF0ZXN0KCksbj10aGlzLmdldFBhcmVudE9yVGhyb3coKS5nZXRMYXN0Q2hpbGQoKTtyZXR1cm4gbiE9PW51bGwmJm4uaXModCl9Z2V0QWxsVGV4dE5vZGVzKCl7bGV0IHQ9W10sbj10aGlzLmdldEZpcnN0Q2hpbGQoKTtmb3IoO24hPT1udWxsOyl7aWYoUShuKSYmdC5wdXNoKG4pLEIobikpe2xldCByPW4uZ2V0QWxsVGV4dE5vZGVzKCk7dC5wdXNoKC4uLnIpfW49bi5nZXROZXh0U2libGluZygpfXJldHVybiB0fWdldEZpcnN0RGVzY2VuZGFudCgpe2xldCB0PXRoaXMuZ2V0Rmlyc3RDaGlsZCgpO2Zvcig7dCE9PW51bGw7KXtpZihCKHQpKXtsZXQgbj10LmdldEZpcnN0Q2hpbGQoKTtpZihuIT09bnVsbCl7dD1uO2NvbnRpbnVlfX1icmVha31yZXR1cm4gdH1nZXRMYXN0RGVzY2VuZGFudCgpe2xldCB0PXRoaXMuZ2V0TGFzdENoaWxkKCk7Zm9yKDt0IT09bnVsbDspe2lmKEIodCkpe2xldCBuPXQuZ2V0TGFzdENoaWxkKCk7aWYobiE9PW51bGwpe3Q9bjtjb250aW51ZX19YnJlYWt9cmV0dXJuIHR9Z2V0RGVzY2VuZGFudEJ5SW5kZXgodCl7bGV0IG49dGhpcy5nZXRDaGlsZHJlbigpLHI9bi5sZW5ndGg7cmV0dXJuIHQ+PXI/KHQ9bltyLTFdLEIodCkmJnQuZ2V0TGFzdERlc2NlbmRhbnQoKXx8dHx8bnVsbCk6KHQ9blt0XSxCKHQpJiZ0LmdldEZpcnN0RGVzY2VuZGFudCgpfHx0fHxudWxsKX1nZXRGaXJzdENoaWxkKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX2ZpcnN0O3JldHVybiB0PT09bnVsbD9udWxsOiR0KHQpfWdldEZpcnN0Q2hpbGRPclRocm93KCl7bGV0IHQ9dGhpcy5nZXRGaXJzdENoaWxkKCk7cmV0dXJuIHQ9PT1udWxsJiZVKDQ1LHRoaXMuX19rZXkpLHR9Z2V0TGFzdENoaWxkKCl7bGV0IHQ9dGhpcy5nZXRMYXRlc3QoKS5fX2xhc3Q7cmV0dXJuIHQ9PT1udWxsP251bGw6JHQodCl9Z2V0TGFzdENoaWxkT3JUaHJvdygpe2xldCB0PXRoaXMuZ2V0TGFzdENoaWxkKCk7cmV0dXJuIHQ9PT1udWxsJiZVKDk2LHRoaXMuX19rZXkpLHR9Z2V0Q2hpbGRBdEluZGV4KHQpe3ZhciBuPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7bGV0IHI7aWYodDxuLzIpe2ZvcihyPXRoaXMuZ2V0Rmlyc3RDaGlsZCgpLG49MDtyIT09bnVsbCYmbjw9dDspe2lmKG49PT10KXJldHVybiByO3I9ci5nZXROZXh0U2libGluZygpLG4rK31yZXR1cm4gbnVsbH1mb3Iocj10aGlzLmdldExhc3RDaGlsZCgpLC0tbjtyIT09bnVsbCYmbj49dDspe2lmKG49PT10KXJldHVybiByO3I9ci5nZXRQcmV2aW91c1NpYmxpbmcoKSxuLS19cmV0dXJuIG51bGx9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD0iIixuPXRoaXMuZ2V0Q2hpbGRyZW4oKSxyPW4ubGVuZ3RoO2ZvcihsZXQgbz0wO288cjtvKyspe2xldCBpPW5bb107dCs9aS5nZXRUZXh0Q29udGVudCgpLEIoaSkmJm8hPT1yLTEmJiFpLmlzSW5saW5lKCkmJih0Kz1gCgpgKX1yZXR1cm4gdH1nZXRUZXh0Q29udGVudFNpemUoKXtsZXQgdD0wLG49dGhpcy5nZXRDaGlsZHJlbigpLHI9bi5sZW5ndGg7Zm9yKGxldCBvPTA7bzxyO28rKyl7bGV0IGk9bltvXTt0Kz1pLmdldFRleHRDb250ZW50U2l6ZSgpLEIoaSkmJm8hPT1yLTEmJiFpLmlzSW5saW5lKCkmJih0Kz0yKX1yZXR1cm4gdH1nZXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX2Rpcn1oYXNGb3JtYXQodCl7cmV0dXJuIHQhPT0iIj8odD1veVt0XSwodGhpcy5nZXRGb3JtYXQoKSZ0KSE9PTApOiExfXNlbGVjdCh0LG4pe1p0KCk7bGV0IHI9S2UoKSxvPXQsaT1uO3ZhciBsPXRoaXMuZ2V0Q2hpbGRyZW5TaXplKCk7aWYoIXRoaXMuY2FuQmVFbXB0eSgpKXtpZih0PT09MCYmbj09PTApe2lmKHQ9dGhpcy5nZXRGaXJzdENoaWxkKCksUSh0KXx8Qih0KSlyZXR1cm4gdC5zZWxlY3QoMCwwKX1lbHNlIGlmKCEodCE9PXZvaWQgMCYmdCE9PWx8fG4hPT12b2lkIDAmJm4hPT1sKSYmKHQ9dGhpcy5nZXRMYXN0Q2hpbGQoKSxRKHQpfHxCKHQpKSlyZXR1cm4gdC5zZWxlY3QoKX1pZihvPT09dm9pZCAwJiYobz1sKSxpPT09dm9pZCAwJiYoaT1sKSxsPXRoaXMuX19rZXksZGUocikpci5hbmNob3Iuc2V0KGwsbywiZWxlbWVudCIpLHIuZm9jdXMuc2V0KGwsaSwiZWxlbWVudCIpLHIuZGlydHk9ITA7ZWxzZSByZXR1cm4gT3cobCxvLGwsaSwiZWxlbWVudCIsImVsZW1lbnQiKTtyZXR1cm4gcn1zZWxlY3RTdGFydCgpe2xldCB0PXRoaXMuZ2V0Rmlyc3REZXNjZW5kYW50KCk7cmV0dXJuIEIodCl8fFEodCk/dC5zZWxlY3QoMCwwKTp0IT09bnVsbD90LnNlbGVjdFByZXZpb3VzKCk6dGhpcy5zZWxlY3QoMCwwKX1zZWxlY3RFbmQoKXtsZXQgdD10aGlzLmdldExhc3REZXNjZW5kYW50KCk7cmV0dXJuIEIodCl8fFEodCk/dC5zZWxlY3QoKTp0IT09bnVsbD90LnNlbGVjdE5leHQoKTp0aGlzLnNlbGVjdCgpfWNsZWFyKCl7bGV0IHQ9dGhpcy5nZXRXcml0YWJsZSgpO3JldHVybiB0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChuPT5uLnJlbW92ZSgpKSx0fWFwcGVuZCguLi50KXtyZXR1cm4gdGhpcy5zcGxpY2UodGhpcy5nZXRDaGlsZHJlblNpemUoKSwwLHQpfXNldERpcmVjdGlvbih0KXtsZXQgbj10aGlzLmdldFdyaXRhYmxlKCk7cmV0dXJuIG4uX19kaXI9dCxufXNldEZvcm1hdCh0KXtyZXR1cm4gdGhpcy5nZXRXcml0YWJsZSgpLl9fZm9ybWF0PXQhPT0iIj9veVt0XTowLHRoaXN9c2V0SW5kZW50KHQpe3JldHVybiB0aGlzLmdldFdyaXRhYmxlKCkuX19pbmRlbnQ9dCx0aGlzfXNwbGljZSh0LG4scil7bGV0IG89ci5sZW5ndGgsaT10aGlzLmdldENoaWxkcmVuU2l6ZSgpLGw9dGhpcy5nZXRXcml0YWJsZSgpLHM9bC5fX2tleTt2YXIgYT1bXSx1PVtdO2xldCBjPXRoaXMuZ2V0Q2hpbGRBdEluZGV4KHQrbiksZD1udWxsLGY9aS1uK287aWYodCE9PTApaWYodD09PWkpZD10aGlzLmdldExhc3RDaGlsZCgpO2Vsc2V7dmFyIGg9dGhpcy5nZXRDaGlsZEF0SW5kZXgodCk7aCE9PW51bGwmJihkPWguZ2V0UHJldmlvdXNTaWJsaW5nKCkpfWlmKDA8bil7dmFyIGc9ZD09PW51bGw/dGhpcy5nZXRGaXJzdENoaWxkKCk6ZC5nZXROZXh0U2libGluZygpO2ZvcihoPTA7aDxuO2grKyl7Zz09PW51bGwmJlUoMTAwKTt2YXIgbT1nLmdldE5leHRTaWJsaW5nKCksUz1nLl9fa2V5O2c9Zy5nZXRXcml0YWJsZSgpLGlpKGcpLHUucHVzaChTKSxnPW19fWZvcihoPWQsbT0wO208bzttKyspe1M9clttXSxoIT09bnVsbCYmUy5pcyhoKSYmKGQ9aD1oLmdldFByZXZpb3VzU2libGluZygpKSxnPVMuZ2V0V3JpdGFibGUoKSxnLl9fcGFyZW50PT09cyYmZi0tLGlpKGcpO2xldCB2PVMuX19rZXk7aD09PW51bGw/KGwuX19maXJzdD12LGcuX19wcmV2PW51bGwpOihoPWguZ2V0V3JpdGFibGUoKSxoLl9fbmV4dD12LGcuX19wcmV2PWguX19rZXkpLFMuX19rZXk9PT1zJiZVKDc2KSxnLl9fcGFyZW50PXMsYS5wdXNoKHYpLGg9U31pZih0K249PT1pP2ghPT1udWxsJiYoaC5nZXRXcml0YWJsZSgpLl9fbmV4dD1udWxsLGwuX19sYXN0PWguX19rZXkpOmMhPT1udWxsJiYodD1jLmdldFdyaXRhYmxlKCksaCE9PW51bGw/KG49aC5nZXRXcml0YWJsZSgpLHQuX19wcmV2PWguX19rZXksbi5fX25leHQ9Yy5fX2tleSk6dC5fX3ByZXY9bnVsbCksbC5fX3NpemU9Zix1Lmxlbmd0aCYmKHQ9S2UoKSxkZSh0KSkpe3U9bmV3IFNldCh1KSxhPW5ldyBTZXQoYSk7bGV0e2FuY2hvcjp2LGZvY3VzOnl9PXQ7VHkodix1LGEpJiZDYyh2LHYuZ2V0Tm9kZSgpLHRoaXMsZCxjKSxUeSh5LHUsYSkmJkNjKHkseS5nZXROb2RlKCksdGhpcyxkLGMpLGYhPT0wfHx0aGlzLmNhbkJlRW1wdHkoKXx8Sm4odGhpcyl8fHRoaXMucmVtb3ZlKCl9cmV0dXJuIGx9ZXhwb3J0SlNPTigpe3JldHVybntjaGlsZHJlbjpbXSxkaXJlY3Rpb246dGhpcy5nZXREaXJlY3Rpb24oKSxmb3JtYXQ6dGhpcy5nZXRGb3JtYXRUeXBlKCksaW5kZW50OnRoaXMuZ2V0SW5kZW50KCksdHlwZToiZWxlbWVudCIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcigpe3JldHVybiBudWxsfWNhbkluZGVudCgpe3JldHVybiEwfWNvbGxhcHNlQXRTdGFydCgpe3JldHVybiExfWV4Y2x1ZGVGcm9tQ29weSgpe3JldHVybiExfWNhbkV4dHJhY3RDb250ZW50cygpe3JldHVybiEwfWNhblJlcGxhY2VXaXRoKCl7cmV0dXJuITB9Y2FuSW5zZXJ0QWZ0ZXIoKXtyZXR1cm4hMH1jYW5CZUVtcHR5KCl7cmV0dXJuITB9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiEwfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiEwfWlzSW5saW5lKCl7cmV0dXJuITF9aXNTaGFkb3dSb290KCl7cmV0dXJuITF9Y2FuTWVyZ2VXaXRoKCl7cmV0dXJuITF9ZXh0cmFjdFdpdGhDaGlsZCgpe3JldHVybiExfX1mdW5jdGlvbiBCKGUpe3JldHVybiBlIGluc3RhbmNlb2YgVGl9ZnVuY3Rpb24gVHkoZSx0LG4pe2ZvcihlPWUuZ2V0Tm9kZSgpO2U7KXtsZXQgcj1lLl9fa2V5O2lmKHQuaGFzKHIpJiYhbi5oYXMocikpcmV0dXJuITA7ZT1lLmdldFBhcmVudCgpfXJldHVybiExfWNsYXNzIFdsIGV4dGVuZHMgVGl7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4icm9vdCJ9c3RhdGljIGNsb25lKCl7cmV0dXJuIG5ldyBXbH1jb25zdHJ1Y3Rvcigpe3N1cGVyKCJyb290IiksdGhpcy5fX2NhY2hlZFRleHQ9bnVsbH1nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCl7VSg1MSl9Z2V0VGV4dENvbnRlbnQoKXtsZXQgdD10aGlzLl9fY2FjaGVkVGV4dDtyZXR1cm4hQmwoKSYmZXQoKS5fZGlydHlUeXBlIT09MHx8dD09PW51bGw/c3VwZXIuZ2V0VGV4dENvbnRlbnQoKTp0fXJlbW92ZSgpe1UoNTIpfXJlcGxhY2UoKXtVKDUzKX1pbnNlcnRCZWZvcmUoKXtVKDU0KX1pbnNlcnRBZnRlcigpe1UoNTUpfXVwZGF0ZURPTSgpe3JldHVybiExfWFwcGVuZCguLi50KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7bGV0IHI9dFtuXTtCKHIpfHxWZShyKXx8VSg1Nil9cmV0dXJuIHN1cGVyLmFwcGVuZCguLi50KX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1TcigpO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Y2hpbGRyZW46W10sZGlyZWN0aW9uOnRoaXMuZ2V0RGlyZWN0aW9uKCksZm9ybWF0OnRoaXMuZ2V0Rm9ybWF0VHlwZSgpLGluZGVudDp0aGlzLmdldEluZGVudCgpLHR5cGU6InJvb3QiLHZlcnNpb246MX19Y29sbGFwc2VBdFN0YXJ0KCl7cmV0dXJuITB9fWZ1bmN0aW9uIGVuKGUpe3JldHVybiBlIGluc3RhbmNlb2YgV2x9ZnVuY3Rpb24gemIoZSx0KXtpZih0PXQuZ2V0RWRpdG9yU3RhdGUoKS5fc2VsZWN0aW9uLGU9ZS5fc2VsZWN0aW9uLGUhPT1udWxsKXtpZihlLmRpcnR5fHwhZS5pcyh0KSlyZXR1cm4hMH1lbHNlIGlmKHQhPT1udWxsKXJldHVybiEwO3JldHVybiExfWZ1bmN0aW9uIEpnKCl7cmV0dXJuIG5ldyBtZChuZXcgTWFwKFtbInJvb3QiLG5ldyBXbF1dKSl9ZnVuY3Rpb24gSXcoZSl7bGV0IHQ9ZS5leHBvcnRKU09OKCk7dmFyIG49ZS5jb25zdHJ1Y3Rvcjt0LnR5cGUhPT1uLmdldFR5cGUoKSYmVSgxMzAsbi5uYW1lKTtsZXQgcj10LmNoaWxkcmVuO2lmKEIoZSkpZm9yKEFycmF5LmlzQXJyYXkocil8fFUoNTksbi5uYW1lKSxlPWUuZ2V0Q2hpbGRyZW4oKSxuPTA7bjxlLmxlbmd0aDtuKyspe2xldCBvPUl3KGVbbl0pO3IucHVzaChvKX1yZXR1cm4gdH1jbGFzcyBtZHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX25vZGVNYXA9dCx0aGlzLl9zZWxlY3Rpb249bnx8bnVsbCx0aGlzLl9yZWFkT25seT10aGlzLl9mbHVzaFN5bmM9ITF9aXNFbXB0eSgpe3JldHVybiB0aGlzLl9ub2RlTWFwLnNpemU9PT0xJiZ0aGlzLl9zZWxlY3Rpb249PT1udWxsfXJlYWQodCl7cmV0dXJuICR5KHRoaXMsdCl9Y2xvbmUodCl7cmV0dXJuIHQ9bmV3IG1kKHRoaXMuX25vZGVNYXAsdD09PXZvaWQgMD90aGlzLl9zZWxlY3Rpb246dCksdC5fcmVhZE9ubHk9ITAsdH10b0pTT04oKXtyZXR1cm4gJHkodGhpcywoKT0+KHtyb290Okl3KFNyKCkpfSkpfX1jbGFzcyBVbCBleHRlbmRzIFRpe3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInBhcmFncmFwaCJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgVWwodC5fX2tleSl9Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKTtyZXR1cm4gdD1Ecyh0LnRoZW1lLCJwYXJhZ3JhcGgiKSx0IT09dm9pZCAwJiZuLmNsYXNzTGlzdC5hZGQoLi4udCksbn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue3A6KCk9Pih7Y29udmVyc2lvbjpGYixwcmlvcml0eTowfSl9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmZGQodCkpe3RoaXMuaXNFbXB0eSgpJiZ0LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJiciIpKTt2YXIgbj10aGlzLmdldEZvcm1hdFR5cGUoKTt0LnN0eWxlLnRleHRBbGlnbj1uLChuPXRoaXMuZ2V0RGlyZWN0aW9uKCkpJiYodC5kaXI9biksbj10aGlzLmdldEluZGVudCgpLDA8biYmKHQuc3R5bGUudGV4dEluZGVudD1gJHsyMCpufXB4YCl9cmV0dXJue2VsZW1lbnQ6dH19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49aGkoKTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSx0eXBlOiJwYXJhZ3JhcGgiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIodCxuKXt0PWhpKCk7bGV0IHI9dGhpcy5nZXREaXJlY3Rpb24oKTtyZXR1cm4gdC5zZXREaXJlY3Rpb24ociksdGhpcy5pbnNlcnRBZnRlcih0LG4pLHR9Y29sbGFwc2VBdFN0YXJ0KCl7bGV0IHQ9dGhpcy5nZXRDaGlsZHJlbigpO2lmKHQubGVuZ3RoPT09MHx8USh0WzBdKSYmdFswXS5nZXRUZXh0Q29udGVudCgpLnRyaW0oKT09PSIiKXtpZih0aGlzLmdldE5leHRTaWJsaW5nKCkhPT1udWxsKXJldHVybiB0aGlzLnNlbGVjdE5leHQoKSx0aGlzLnJlbW92ZSgpLCEwO2lmKHRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkhPT1udWxsKXJldHVybiB0aGlzLnNlbGVjdFByZXZpb3VzKCksdGhpcy5yZW1vdmUoKSwhMH1yZXR1cm4hMX19ZnVuY3Rpb24gRmIoZSl7bGV0IHQ9aGkoKTtyZXR1cm4gZS5zdHlsZSYmKHQuc2V0Rm9ybWF0KGUuc3R5bGUudGV4dEFsaWduKSxlPXBhcnNlSW50KGUuc3R5bGUudGV4dEluZGVudCwxMCkvMjAsMDxlJiZ0LnNldEluZGVudChlKSkse25vZGU6dH19ZnVuY3Rpb24gaGkoKXtyZXR1cm4gRGEobmV3IFVsKX1mdW5jdGlvbiBqdyhlLHQsbixyKXtsZXQgbz1lLl9rZXlUb0RPTU1hcDtvLmNsZWFyKCksZS5fZWRpdG9yU3RhdGU9SmcoKSxlLl9wZW5kaW5nRWRpdG9yU3RhdGU9cixlLl9jb21wb3NpdGlvbktleT1udWxsLGUuX2RpcnR5VHlwZT0wLGUuX2Nsb25lTm90TmVlZGVkLmNsZWFyKCksZS5fZGlydHlMZWF2ZXM9bmV3IFNldCxlLl9kaXJ0eUVsZW1lbnRzLmNsZWFyKCksZS5fbm9ybWFsaXplZE5vZGVzPW5ldyBTZXQsZS5fdXBkYXRlVGFncz1uZXcgU2V0LGUuX3VwZGF0ZXM9W10sZS5fYmxvY2tDdXJzb3JFbGVtZW50PW51bGwscj1lLl9vYnNlcnZlcixyIT09bnVsbCYmKHIuZGlzY29ubmVjdCgpLGUuX29ic2VydmVyPW51bGwpLHQhPT1udWxsJiYodC50ZXh0Q29udGVudD0iIiksbiE9PW51bGwmJihuLnRleHRDb250ZW50PSIiLG8uc2V0KCJyb290IixuKSl9ZnVuY3Rpb24gQmIoZSl7bGV0IHQ9bmV3IE1hcCxuPW5ldyBTZXQ7cmV0dXJuIGUuZm9yRWFjaChyPT57aWYocj1yLmtsYXNzLmltcG9ydERPTSE9bnVsbD9yLmtsYXNzLmltcG9ydERPTS5iaW5kKHIua2xhc3MpOm51bGwsciE9bnVsbCYmIW4uaGFzKHIpKXtuLmFkZChyKTt2YXIgbz1yKCk7byE9PW51bGwmJk9iamVjdC5rZXlzKG8pLmZvckVhY2goaT0+e2xldCBsPXQuZ2V0KGkpO2w9PT12b2lkIDAmJihsPVtdLHQuc2V0KGksbCkpLGwucHVzaChvW2ldKX0pfX0pLHR9Y2xhc3MgV2J7Y29uc3RydWN0b3IodCxuLHIsbyxpLGwscyl7dGhpcy5fcGFyZW50RWRpdG9yPW4sdGhpcy5fcm9vdEVsZW1lbnQ9bnVsbCx0aGlzLl9lZGl0b3JTdGF0ZT10LHRoaXMuX2NvbXBvc2l0aW9uS2V5PXRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT1udWxsLHRoaXMuX2RlZmVycmVkPVtdLHRoaXMuX2tleVRvRE9NTWFwPW5ldyBNYXAsdGhpcy5fdXBkYXRlcz1bXSx0aGlzLl91cGRhdGluZz0hMSx0aGlzLl9saXN0ZW5lcnM9e2RlY29yYXRvcjpuZXcgU2V0LGVkaXRhYmxlOm5ldyBTZXQsbXV0YXRpb246bmV3IE1hcCxyb290Om5ldyBTZXQsdGV4dGNvbnRlbnQ6bmV3IFNldCx1cGRhdGU6bmV3IFNldH0sdGhpcy5fY29tbWFuZHM9bmV3IE1hcCx0aGlzLl9jb25maWc9byx0aGlzLl9ub2Rlcz1yLHRoaXMuX2RlY29yYXRvcnM9e30sdGhpcy5fcGVuZGluZ0RlY29yYXRvcnM9bnVsbCx0aGlzLl9kaXJ0eVR5cGU9MCx0aGlzLl9jbG9uZU5vdE5lZWRlZD1uZXcgU2V0LHRoaXMuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdGhpcy5fZGlydHlFbGVtZW50cz1uZXcgTWFwLHRoaXMuX25vcm1hbGl6ZWROb2Rlcz1uZXcgU2V0LHRoaXMuX3VwZGF0ZVRhZ3M9bmV3IFNldCx0aGlzLl9vYnNlcnZlcj1udWxsLHRoaXMuX2tleT1kdygpLHRoaXMuX29uRXJyb3I9aSx0aGlzLl9odG1sQ29udmVyc2lvbnM9bCx0aGlzLl9lZGl0YWJsZT1zLHRoaXMuX2hlYWRsZXNzPW4hPT1udWxsJiZuLl9oZWFkbGVzcyx0aGlzLl9ibG9ja0N1cnNvckVsZW1lbnQ9dGhpcy5fd2luZG93PW51bGx9aXNDb21wb3NpbmcoKXtyZXR1cm4gdGhpcy5fY29tcG9zaXRpb25LZXkhPW51bGx9cmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcih0KXtsZXQgbj10aGlzLl9saXN0ZW5lcnMudXBkYXRlO3JldHVybiBuLmFkZCh0KSwoKT0+e24uZGVsZXRlKHQpfX1yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIodCl7bGV0IG49dGhpcy5fbGlzdGVuZXJzLmVkaXRhYmxlO3JldHVybiBuLmFkZCh0KSwoKT0+e24uZGVsZXRlKHQpfX1yZWdpc3RlckRlY29yYXRvckxpc3RlbmVyKHQpe2xldCBuPXRoaXMuX2xpc3RlbmVycy5kZWNvcmF0b3I7cmV0dXJuIG4uYWRkKHQpLCgpPT57bi5kZWxldGUodCl9fXJlZ2lzdGVyVGV4dENvbnRlbnRMaXN0ZW5lcih0KXtsZXQgbj10aGlzLl9saXN0ZW5lcnMudGV4dGNvbnRlbnQ7cmV0dXJuIG4uYWRkKHQpLCgpPT57bi5kZWxldGUodCl9fXJlZ2lzdGVyUm9vdExpc3RlbmVyKHQpe2xldCBuPXRoaXMuX2xpc3RlbmVycy5yb290O3JldHVybiB0KHRoaXMuX3Jvb3RFbGVtZW50LG51bGwpLG4uYWRkKHQpLCgpPT57dChudWxsLHRoaXMuX3Jvb3RFbGVtZW50KSxuLmRlbGV0ZSh0KX19cmVnaXN0ZXJDb21tYW5kKHQsbixyKXtyPT09dm9pZCAwJiZVKDM1KTtsZXQgbz10aGlzLl9jb21tYW5kcztvLmhhcyh0KXx8by5zZXQodCxbbmV3IFNldCxuZXcgU2V0LG5ldyBTZXQsbmV3IFNldCxuZXcgU2V0XSk7bGV0IGk9by5nZXQodCk7aT09PXZvaWQgMCYmVSgzNixTdHJpbmcodCkpO2xldCBsPWlbcl07cmV0dXJuIGwuYWRkKG4pLCgpPT57bC5kZWxldGUobiksaS5ldmVyeShzPT5zLnNpemU9PT0wKSYmby5kZWxldGUodCl9fXJlZ2lzdGVyTXV0YXRpb25MaXN0ZW5lcih0LG4pe3RoaXMuX25vZGVzLmdldCh0LmdldFR5cGUoKSk9PT12b2lkIDAmJlUoMzcsdC5uYW1lKTtsZXQgcj10aGlzLl9saXN0ZW5lcnMubXV0YXRpb247cmV0dXJuIHIuc2V0KG4sdCksKCk9PntyLmRlbGV0ZShuKX19cmVnaXN0ZXJOb2RlVHJhbnNmb3JtVG9LbGFzcyh0LG4pe3ZhciByPXQuZ2V0VHlwZSgpO3JldHVybiByPXRoaXMuX25vZGVzLmdldChyKSxyPT09dm9pZCAwJiZVKDM3LHQubmFtZSksci50cmFuc2Zvcm1zLmFkZChuKSxyfXJlZ2lzdGVyTm9kZVRyYW5zZm9ybSh0LG4pe3ZhciByPXRoaXMucmVnaXN0ZXJOb2RlVHJhbnNmb3JtVG9LbGFzcyh0LG4pO2xldCBvPVtyXTtyZXR1cm4gcj1yLnJlcGxhY2VXaXRoS2xhc3MsciE9bnVsbCYmKHI9dGhpcy5yZWdpc3Rlck5vZGVUcmFuc2Zvcm1Ub0tsYXNzKHIsbiksby5wdXNoKHIpKSxtYih0aGlzLHQuZ2V0VHlwZSgpKSwoKT0+e28uZm9yRWFjaChpPT5pLnRyYW5zZm9ybXMuZGVsZXRlKG4pKX19aGFzTm9kZSh0KXtyZXR1cm4gdGhpcy5fbm9kZXMuaGFzKHQuZ2V0VHlwZSgpKX1oYXNOb2Rlcyh0KXtyZXR1cm4gdC5ldmVyeSh0aGlzLmhhc05vZGUuYmluZCh0aGlzKSl9ZGlzcGF0Y2hDb21tYW5kKHQsbil7cmV0dXJuIFkodGhpcyx0LG4pfWdldERlY29yYXRvcnMoKXtyZXR1cm4gdGhpcy5fZGVjb3JhdG9yc31nZXRSb290RWxlbWVudCgpe3JldHVybiB0aGlzLl9yb290RWxlbWVudH1nZXRLZXkoKXtyZXR1cm4gdGhpcy5fa2V5fXNldFJvb3RFbGVtZW50KHQpe2xldCBuPXRoaXMuX3Jvb3RFbGVtZW50O2lmKHQhPT1uKXtsZXQgbD1Ecyh0aGlzLl9jb25maWcudGhlbWUsInJvb3QiKTt2YXIgcj10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGV8fHRoaXMuX2VkaXRvclN0YXRlO2lmKHRoaXMuX3Jvb3RFbGVtZW50PXQsancodGhpcyxuLHQsciksbiE9PW51bGwpe2lmKCF0aGlzLl9jb25maWcuZGlzYWJsZUV2ZW50cyl7THMhPT0wJiYoTHMtLSxMcz09PTAmJm4ub3duZXJEb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLGJ3KSk7dmFyIG89bi5fX2xleGljYWxFZGl0b3I7aWYobyE9bnVsbCl7aWYoby5fcGFyZW50RWRpdG9yIT09bnVsbCl7dmFyIGk9VWcobyk7aT1pW2kubGVuZ3RoLTFdLl9rZXksZGwuZ2V0KGkpPT09byYmZGwuZGVsZXRlKGkpfWVsc2UgZGwuZGVsZXRlKG8uX2tleSk7bi5fX2xleGljYWxFZGl0b3I9bnVsbH1mb3Iobz1OdyhuKSxpPTA7aTxvLmxlbmd0aDtpKyspb1tpXSgpO24uX19sZXhpY2FsRXZlbnRIYW5kbGVzPVtdfWwhPW51bGwmJm4uY2xhc3NMaXN0LnJlbW92ZSguLi5sKX10IT09bnVsbD8ocj0ocj10Lm93bmVyRG9jdW1lbnQpJiZyLmRlZmF1bHRWaWV3fHxudWxsLG89dC5zdHlsZSxvLnVzZXJTZWxlY3Q9InRleHQiLG8ud2hpdGVTcGFjZT0icHJlLXdyYXAiLG8ud29yZEJyZWFrPSJicmVhay13b3JkIix0LnNldEF0dHJpYnV0ZSgiZGF0YS1sZXhpY2FsLWVkaXRvciIsInRydWUiKSx0aGlzLl93aW5kb3c9cix0aGlzLl9kaXJ0eVR5cGU9Mixydyh0aGlzKSx0aGlzLl91cGRhdGVUYWdzLmFkZCgiaGlzdG9yeS1tZXJnZSIpLGxpKHRoaXMpLHRoaXMuX2NvbmZpZy5kaXNhYmxlRXZlbnRzfHxOYih0LHRoaXMpLGwhPW51bGwmJnQuY2xhc3NMaXN0LmFkZCguLi5sKSk6KHRoaXMuX2VkaXRvclN0YXRlPXIsdGhpcy5fd2luZG93PXRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT1udWxsKSxqcygicm9vdCIsdGhpcywhMSx0LG4pfX1nZXRFbGVtZW50QnlLZXkodCl7cmV0dXJuIHRoaXMuX2tleVRvRE9NTWFwLmdldCh0KXx8bnVsbH1nZXRFZGl0b3JTdGF0ZSgpe3JldHVybiB0aGlzLl9lZGl0b3JTdGF0ZX1zZXRFZGl0b3JTdGF0ZSh0LG4pe3QuaXNFbXB0eSgpJiZVKDM4KSxudyh0aGlzKTtsZXQgcj10aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGUsbz10aGlzLl91cGRhdGVUYWdzO249biE9PXZvaWQgMD9uLnRhZzpudWxsLHI9PT1udWxsfHxyLmlzRW1wdHkoKXx8KG4hPW51bGwmJm8uYWRkKG4pLGxpKHRoaXMpKSx0aGlzLl9wZW5kaW5nRWRpdG9yU3RhdGU9dCx0aGlzLl9kaXJ0eVR5cGU9Mix0aGlzLl9kaXJ0eUVsZW1lbnRzLnNldCgicm9vdCIsITEpLHRoaXMuX2NvbXBvc2l0aW9uS2V5PW51bGwsbiE9bnVsbCYmby5hZGQobiksbGkodGhpcyl9cGFyc2VFZGl0b3JTdGF0ZSh0LG4pe3Q9dHlwZW9mIHQ9PSJzdHJpbmciP0pTT04ucGFyc2UodCk6dDtsZXQgcj1KZygpLG89a3QsaT1wbixsPVR0LHM9dGhpcy5fZGlydHlFbGVtZW50cyxhPXRoaXMuX2RpcnR5TGVhdmVzLHU9dGhpcy5fY2xvbmVOb3ROZWVkZWQsYz10aGlzLl9kaXJ0eVR5cGU7dGhpcy5fZGlydHlFbGVtZW50cz1uZXcgTWFwLHRoaXMuX2RpcnR5TGVhdmVzPW5ldyBTZXQsdGhpcy5fY2xvbmVOb3ROZWVkZWQ9bmV3IFNldCx0aGlzLl9kaXJ0eVR5cGU9MCxrdD1yLHBuPSExLFR0PXRoaXM7dHJ5e1FnKHQucm9vdCx0aGlzLl9ub2RlcyksbiYmbigpLHIuX3JlYWRPbmx5PSEwfWNhdGNoKGQpe2QgaW5zdGFuY2VvZiBFcnJvciYmdGhpcy5fb25FcnJvcihkKX1maW5hbGx5e3RoaXMuX2RpcnR5RWxlbWVudHM9cyx0aGlzLl9kaXJ0eUxlYXZlcz1hLHRoaXMuX2Nsb25lTm90TmVlZGVkPXUsdGhpcy5fZGlydHlUeXBlPWMsa3Q9byxwbj1pLFR0PWx9cmV0dXJuIHJ9dXBkYXRlKHQsbil7a24odGhpcyx0LG4pfWZvY3VzKHQsbj17fSl7bGV0IHI9dGhpcy5fcm9vdEVsZW1lbnQ7ciE9PW51bGwmJihyLnNldEF0dHJpYnV0ZSgiYXV0b2NhcGl0YWxpemUiLCJvZmYiKSxrbih0aGlzLCgpPT57bGV0IG89S2UoKSxpPVNyKCk7byE9PW51bGw/by5kaXJ0eT0hMDppLmdldENoaWxkcmVuU2l6ZSgpIT09MCYmKG4uZGVmYXVsdFNlbGVjdGlvbj09PSJyb290U3RhcnQiP2kuc2VsZWN0U3RhcnQoKTppLnNlbGVjdEVuZCgpKX0se29uVXBkYXRlOigpPT57ci5yZW1vdmVBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiksdCYmdCgpfSx0YWc6ImZvY3VzIn0pLHRoaXMuX3BlbmRpbmdFZGl0b3JTdGF0ZT09PW51bGwmJnIucmVtb3ZlQXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIpKX1ibHVyKCl7dmFyIHQ9dGhpcy5fcm9vdEVsZW1lbnQ7dCE9PW51bGwmJnQuYmx1cigpLHQ9RXIodGhpcy5fd2luZG93KSx0IT09bnVsbCYmdC5yZW1vdmVBbGxSYW5nZXMoKX1pc0VkaXRhYmxlKCl7cmV0dXJuIHRoaXMuX2VkaXRhYmxlfXNldEVkaXRhYmxlKHQpe3RoaXMuX2VkaXRhYmxlIT09dCYmKHRoaXMuX2VkaXRhYmxlPXQsanMoImVkaXRhYmxlIix0aGlzLCEwLHQpKX10b0pTT04oKXtyZXR1cm57ZWRpdG9yU3RhdGU6dGhpcy5fZWRpdG9yU3RhdGUudG9KU09OKCl9fX1jbGFzcyBaZyBleHRlbmRzIFRpe2NvbnN0cnVjdG9yKHQsbil7c3VwZXIobiksdGhpcy5fX2NvbFNwYW49dCx0aGlzLl9fcm93U3Bhbj0xfWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLGNvbFNwYW46dGhpcy5fX2NvbFNwYW4scm93U3Bhbjp0aGlzLl9fcm93U3Bhbn19Z2V0Q29sU3Bhbigpe3JldHVybiB0aGlzLl9fY29sU3Bhbn1zZXRDb2xTcGFuKHQpe3JldHVybiB0aGlzLmdldFdyaXRhYmxlKCkuX19jb2xTcGFuPXQsdGhpc31nZXRSb3dTcGFuKCl7cmV0dXJuIHRoaXMuX19yb3dTcGFufXNldFJvd1NwYW4odCl7cmV0dXJuIHRoaXMuZ2V0V3JpdGFibGUoKS5fX3Jvd1NwYW49dCx0aGlzfX1mdW5jdGlvbiBBbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFpnfWNsYXNzIHp3IGV4dGVuZHMgVGl7fWZ1bmN0aW9uIHFnKGUpe3JldHVybiBlIGluc3RhbmNlb2Ygend9Y2xhc3MgRncgZXh0ZW5kcyBUaXt9ZnVuY3Rpb24geWEoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBGd31ELiRhZGRVcGRhdGVUYWc9ZnVuY3Rpb24oZSl7WnQoKSxldCgpLl91cGRhdGVUYWdzLmFkZChlKX07RC4kYXBwbHlOb2RlUmVwbGFjZW1lbnQ9RGE7RC4kY29weU5vZGU9cHc7RC4kY3JlYXRlTGluZUJyZWFrTm9kZT0kbDtELiRjcmVhdGVOb2RlU2VsZWN0aW9uPW5wO0QuJGNyZWF0ZVBhcmFncmFwaE5vZGU9aGk7RC4kY3JlYXRlUmFuZ2VTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgZT1uZXcgeXIoInJvb3QiLDAsImVsZW1lbnQiKSx0PW5ldyB5cigicm9vdCIsMCwiZWxlbWVudCIpO3JldHVybiBuZXcga2koZSx0LDAsIiIpfTtELiRjcmVhdGVUYWJOb2RlPWhkO0QuJGNyZWF0ZVRleHROb2RlPUV0O0QuJGdldEFkamFjZW50Tm9kZT1CaDtELiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlPU1hO0QuJGdldE5lYXJlc3RSb290T3JTaGFkb3dSb290PWh3O0QuJGdldE5vZGVCeUtleT0kdDtELiRnZXRQcmV2aW91c1NlbGVjdGlvbj1GbDtELiRnZXRSb290PVNyO0QuJGdldFNlbGVjdGlvbj1LZTtELiRnZXRUZXh0Q29udGVudD1mdW5jdGlvbigpe2xldCBlPUtlKCk7cmV0dXJuIGU9PT1udWxsPyIiOmUuZ2V0VGV4dENvbnRlbnQoKX07RC4kaGFzQW5jZXN0b3I9X2M7RC4kaGFzVXBkYXRlVGFnPWZ1bmN0aW9uKGUpe3JldHVybiBldCgpLl91cGRhdGVUYWdzLmhhcyhlKX07RC4kaW5zZXJ0Tm9kZXM9ZnVuY3Rpb24oZSx0KXtsZXQgbj1LZSgpfHxGbCgpO3JldHVybiBuPT09bnVsbCYmKG49U3IoKS5zZWxlY3RFbmQoKSksbi5pbnNlcnROb2RlcyhlLHQpfTtELiRpc0Jsb2NrRWxlbWVudE5vZGU9dHA7RC4kaXNEZWNvcmF0b3JOb2RlPVZlO0QuJGlzRWxlbWVudE5vZGU9QjtELiRpc0lubGluZUVsZW1lbnRPckRlY29yYXRvck5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIEIoZSkmJmUuaXNJbmxpbmUoKXx8VmUoZSkmJmUuaXNJbmxpbmUoKX07RC4kaXNMZWFmTm9kZT1sdztELiRpc0xpbmVCcmVha05vZGU9bWE7RC4kaXNOb2RlU2VsZWN0aW9uPXpsO0QuJGlzUGFyYWdyYXBoTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIFVsfTtELiRpc1JhbmdlU2VsZWN0aW9uPWRlO0QuJGlzUm9vdE5vZGU9ZW47RC4kaXNSb290T3JTaGFkb3dSb290PUpuO0QuJGlzVGFiTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIGpsfTtELiRpc1RleHROb2RlPVE7RC4kbm9kZXNPZlR5cGU9ZnVuY3Rpb24oZSl7dmFyIHQ9Q3IoKTtsZXQgbj10Ll9yZWFkT25seSxyPWUuZ2V0VHlwZSgpO3Q9dC5fbm9kZU1hcDtsZXQgbz1bXTtmb3IobGV0WyxpXW9mIHQpaSBpbnN0YW5jZW9mIGUmJmkuX190eXBlPT09ciYmKG58fGkuaXNBdHRhY2hlZCgpKSYmby5wdXNoKGkpO3JldHVybiBvfTtELiRub3JtYWxpemVTZWxlY3Rpb25fX0VYUEVSSU1FTlRBTD1GZztELiRwYXJzZVNlcmlhbGl6ZWROb2RlPWZ1bmN0aW9uKGUpe3JldHVybiBRZyhlLGV0KCkuX25vZGVzKX07RC4kc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dmFyIGU9U3IoKTtlPWUuc2VsZWN0KDAsZS5nZXRDaGlsZHJlblNpemUoKSksdnIoRmcoZSkpfTtELiRzZXRDb21wb3NpdGlvbktleT1NdDtELiRzZXRTZWxlY3Rpb249dnI7RC4kc3BsaXROb2RlPWd3O0QuQkxVUl9DT01NQU5EPXFfO0QuQ0FOX1JFRE9fQ09NTUFORD17fTtELkNBTl9VTkRPX0NPTU1BTkQ9e307RC5DTEVBUl9FRElUT1JfQ09NTUFORD17fTtELkNMRUFSX0hJU1RPUllfQ09NTUFORD17fTtELkNMSUNLX0NPTU1BTkQ9RF87RC5DT01NQU5EX1BSSU9SSVRZX0NSSVRJQ0FMPTQ7RC5DT01NQU5EX1BSSU9SSVRZX0VESVRPUj0wO0QuQ09NTUFORF9QUklPUklUWV9ISUdIPTM7RC5DT01NQU5EX1BSSU9SSVRZX0xPVz0xO0QuQ09NTUFORF9QUklPUklUWV9OT1JNQUw9MjtELkNPTlRST0xMRURfVEVYVF9JTlNFUlRJT05fQ09NTUFORD1jbDtELkNPUFlfQ09NTUFORD1EZztELkNVVF9DT01NQU5EPUxnO0QuREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5EPWNhO0QuREVMRVRFX0xJTkVfQ09NTUFORD1mYTtELkRFTEVURV9XT1JEX0NPTU1BTkQ9ZGE7RC5ERVBSRUNBVEVEXyRjb21wdXRlR3JpZE1hcD1BdztELkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb249ZnVuY3Rpb24oKXtsZXQgZT1uZXcgeXIoInJvb3QiLDAsImVsZW1lbnQiKSx0PW5ldyB5cigicm9vdCIsMCwiZWxlbWVudCIpO3JldHVybiBuZXcgZ2QoInJvb3QiLGUsdCl9O0QuREVQUkVDQVRFRF8kZ2V0R3JpZENlbGxOb2RlUmVjdD1lcDtELkRFUFJFQ0FURURfJGdldE5vZGVUcmlwbGV0PU13O0QuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGU9QW47RC5ERVBSRUNBVEVEXyRpc0dyaWROb2RlPXFnO0QuREVQUkVDQVRFRF8kaXNHcmlkUm93Tm9kZT15YTtELkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbj1ZZztELkRFUFJFQ0FURURfR3JpZENlbGxOb2RlPVpnO0QuREVQUkVDQVRFRF9HcmlkTm9kZT16dztELkRFUFJFQ0FURURfR3JpZFJvd05vZGU9Rnc7RC5EUkFHRU5EX0NPTU1BTkQ9Sl87RC5EUkFHT1ZFUl9DT01NQU5EPVFfO0QuRFJBR1NUQVJUX0NPTU1BTkQ9WF87RC5EUk9QX0NPTU1BTkQ9WV87RC5EZWNvcmF0b3JOb2RlPUx3O0QuRWxlbWVudE5vZGU9VGk7RC5GT0NVU19DT01NQU5EPVpfO0QuRk9STUFUX0VMRU1FTlRfQ09NTUFORD17fTtELkZPUk1BVF9URVhUX0NPTU1BTkQ9Z287RC5JTkRFTlRfQ09OVEVOVF9DT01NQU5EPXt9O0QuSU5TRVJUX0xJTkVfQlJFQUtfQ09NTUFORD1NcztELklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORD1MaDtELklOU0VSVF9UQUJfQ09NTUFORD17fTtELktFWV9BUlJPV19ET1dOX0NPTU1BTkQ9V187RC5LRVlfQVJST1dfTEVGVF9DT01NQU5EPXpfO0QuS0VZX0FSUk9XX1JJR0hUX0NPTU1BTkQ9SV87RC5LRVlfQVJST1dfVVBfQ09NTUFORD1CXztELktFWV9CQUNLU1BBQ0VfQ09NTUFORD1WXztELktFWV9ERUxFVEVfQ09NTUFORD1LXztELktFWV9ET1dOX0NPTU1BTkQ9TF87RC5LRVlfRU5URVJfQ09NTUFORD1wYztELktFWV9FU0NBUEVfQ09NTUFORD1IXztELktFWV9NT0RJRklFUl9DT01NQU5EPWV3O0QuS0VZX1NQQUNFX0NPTU1BTkQ9VV87RC5LRVlfVEFCX0NPTU1BTkQ9R187RC5MaW5lQnJlYWtOb2RlPUlsO0QuTU9WRV9UT19FTkQ9al87RC5NT1ZFX1RPX1NUQVJUPUZfO0QuT1VUREVOVF9DT05URU5UX0NPTU1BTkQ9e307RC5QQVNURV9DT01NQU5EPU9nO0QuUGFyYWdyYXBoTm9kZT1VbDtELlJFRE9fQ09NTUFORD1NZztELlJFTU9WRV9URVhUX0NPTU1BTkQ9SWg7RC5Sb290Tm9kZT1XbDtELlNFTEVDVElPTl9DSEFOR0VfQ09NTUFORD1sZDtELlNFTEVDVF9BTExfQ09NTUFORD1qaDtELlRhYk5vZGU9amw7RC5UZXh0Tm9kZT0kaTtELlVORE9fQ09NTUFORD1BZztELmNyZWF0ZUNvbW1hbmQ9ZnVuY3Rpb24oKXtyZXR1cm57fX07RC5jcmVhdGVFZGl0b3I9ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8e30sbj1UdCxyPXQudGhlbWV8fHt9O2xldCBvPWU9PT12b2lkIDA/bjp0LnBhcmVudEVkaXRvcnx8bnVsbCxpPXQuZGlzYWJsZUV2ZW50c3x8ITEsbD1KZygpLHM9dC5uYW1lc3BhY2V8fChvIT09bnVsbD9vLl9jb25maWcubmFtZXNwYWNlOmR3KCkpLGE9dC5lZGl0b3JTdGF0ZSx1PVtXbCwkaSxJbCxqbCxVbCwuLi50Lm5vZGVzfHxbXV0sYz10Lm9uRXJyb3I7aWYodD10LmVkaXRhYmxlIT09dm9pZCAwP3QuZWRpdGFibGU6ITAsZT09PXZvaWQgMCYmbiE9PW51bGwpZT1uLl9ub2RlcztlbHNlIGZvcihlPW5ldyBNYXAsbj0wO248dS5sZW5ndGg7bisrKXtsZXQgZj11W25dLGg9bnVsbDt2YXIgZD1udWxsO3R5cGVvZiBmIT0iZnVuY3Rpb24iJiYoZD1mLGY9ZC5yZXBsYWNlLGg9ZC53aXRoLGQ9ZC53aXRoS2xhc3M/ZC53aXRoS2xhc3M6bnVsbCk7bGV0IGc9Zi5nZXRUeXBlKCksbT1mLnRyYW5zZm9ybSgpLFM9bmV3IFNldDttIT09bnVsbCYmUy5hZGQobSksZS5zZXQoZyx7a2xhc3M6ZixyZXBsYWNlOmgscmVwbGFjZVdpdGhLbGFzczpkLHRyYW5zZm9ybXM6U30pfXJldHVybiByPW5ldyBXYihsLG8sZSx7ZGlzYWJsZUV2ZW50czppLG5hbWVzcGFjZTpzLHRoZW1lOnJ9LGN8fGNvbnNvbGUuZXJyb3IsQmIoZSksdCksYSE9PXZvaWQgMCYmKHIuX3BlbmRpbmdFZGl0b3JTdGF0ZT1hLHIuX2RpcnR5VHlwZT0yKSxyfTtELmdldE5lYXJlc3RFZGl0b3JGcm9tRE9NTm9kZT1XZztELmlzSFRNTEFuY2hvckVsZW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGRkKGUpJiZlLnRhZ05hbWU9PT0iQSJ9O0QuaXNIVE1MRWxlbWVudD1kZDtELmlzU2VsZWN0aW9uQ2FwdHVyZWRJbkRlY29yYXRvcklucHV0PUJnO0QuaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3I9QWE7Y29uc3QgVWI9RDt2YXIgZ2U9VWIsZHQ9e30sUnQ9e30sbmU9Z2U7bGV0ICRjPW5ldyBNYXA7ZnVuY3Rpb24gTnkoZSl7Zm9yKDtlIT1udWxsOyl7aWYoZS5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXJldHVybiBlO2U9ZS5maXJzdENoaWxkfXJldHVybiBudWxsfWZ1bmN0aW9uIGJ5KGUpe2xldCB0PWUucGFyZW50Tm9kZTtpZih0PT1udWxsKXRocm93IEVycm9yKCJTaG91bGQgbmV2ZXIgaGFwcGVuIik7cmV0dXJuW3QsQXJyYXkuZnJvbSh0LmNoaWxkTm9kZXMpLmluZGV4T2YoZSldfWZ1bmN0aW9uIEJ3KGUpe2xldCB0PXt9O2U9ZS5zcGxpdCgiOyIpO2ZvcihsZXQgbiBvZiBlKWlmKG4hPT0iIil7bGV0W3Isb109bi5zcGxpdCgvOihbXl0rKS8pO3Rbci50cmltKCldPW8udHJpbSgpfXJldHVybiB0fWZ1bmN0aW9uIGtjKGUpe2xldCB0PSRjLmdldChlKTtyZXR1cm4gdD09PXZvaWQgMCYmKHQ9QncoZSksJGMuc2V0KGUsdCkpLHR9ZnVuY3Rpb24gVmIoZSl7bGV0IHQ9IiI7Zm9yKGxldCBuIGluIGUpbiYmKHQrPWAke259OiAke2Vbbl19O2ApO3JldHVybiB0fWZ1bmN0aW9uIE9pKGUsdCl7dmFyIG49a2MoImdldFN0eWxlImluIGU/ZS5nZXRTdHlsZSgpOmUuc3R5bGUpO3Q9T2JqZWN0LmVudHJpZXModCkucmVkdWNlKChyLFtvLGldKT0+KGk9PT1udWxsP2RlbGV0ZSByW29dOnJbb109aSxyKSx7Li4ubn0pLG49VmIodCksZS5zZXRTdHlsZShuKSwkYy5zZXQobix0KX1mdW5jdGlvbiBXdyhlLHQpe3ZhciBuPWUuZ2V0Tm9kZXMoKSxyPW4ubGVuZ3RoO2lmKG5lLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihlKSl7Zm9yKHZhciBvPW5lLiRjcmVhdGVSYW5nZVNlbGVjdGlvbigpLGk9by5hbmNob3IsbD1vLmZvY3VzLHM9MDtzPHI7cysrKXt2YXIgYT1uW3NdO25lLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGEpJiYoaS5zZXQoYS5nZXRLZXkoKSwwLCJlbGVtZW50IiksbC5zZXQoYS5nZXRLZXkoKSxhLmdldENoaWxkcmVuU2l6ZSgpLCJlbGVtZW50IiksV3cobmUuJG5vcm1hbGl6ZVNlbGVjdGlvbl9fRVhQRVJJTUVOVEFMKG8pLHQpKX1uZS4kc2V0U2VsZWN0aW9uKGUpfWVsc2UgaWYoLS1yLG89blswXSxpPW5bcl0sZS5pc0NvbGxhcHNlZCgpKU9pKGUsdCk7ZWxzZXt2YXIgdT1lLmFuY2hvcixjPWUuZm9jdXM7cz1vLmdldFRleHRDb250ZW50KCkubGVuZ3RoLGE9Yy5vZmZzZXQ7dmFyIGQ9dS5vZmZzZXQsZj11LmlzQmVmb3JlKGMpO2w9Zj9kOmEsZT1mP2E6ZDt2YXIgaD1mP3UudHlwZTpjLnR5cGUsZz1mP2MudHlwZTp1LnR5cGU7aWYodT1mP2Mua2V5OnUua2V5LG5lLiRpc1RleHROb2RlKG8pJiZsPT09cyYmKGM9by5nZXROZXh0U2libGluZygpLG5lLiRpc1RleHROb2RlKGMpJiYobD1kPTAsbz1jKSksbi5sZW5ndGg9PT0xKW5lLiRpc1RleHROb2RlKG8pJiYobD1oPT09ImVsZW1lbnQiPzA6ZD5hP2E6ZCxlPWc9PT0iZWxlbWVudCI/czpkPmE/ZDphLGwhPT1lJiYobD09PTAmJmU9PT1zPyhPaShvLHQpLG8uc2VsZWN0KGwsZSkpOihuPW8uc3BsaXRUZXh0KGwsZSksbj1sPT09MD9uWzBdOm5bMV0sT2kobix0KSxuLnNlbGVjdCgwLGUtbCkpKSk7ZWxzZSBmb3IobmUuJGlzVGV4dE5vZGUobykmJmw8by5nZXRUZXh0Q29udGVudFNpemUoKSYmKGwhPT0wJiYobz1vLnNwbGl0VGV4dChsKVsxXSksT2kobyx0KSksbmUuJGlzVGV4dE5vZGUoaSkmJihsPWkuZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGgsaS5fX2tleSE9PXUmJmUhPT0wJiYoZT1sKSxlIT09bCYmKFtpXT1pLnNwbGl0VGV4dChlKSksZSE9PTAmJk9pKGksdCkpLGU9MTtlPHI7ZSsrKWw9bltlXSxzPWwuZ2V0S2V5KCksbmUuJGlzVGV4dE5vZGUobCkmJnMhPT1vLmdldEtleSgpJiZzIT09aS5nZXRLZXkoKSYmIWwuaXNUb2tlbigpJiZPaShsLHQpfX1mdW5jdGlvbiBIYihlKXtmb3IoO2UhPT1udWxsJiYhbmUuJGlzUm9vdE9yU2hhZG93Um9vdChlKTspe2xldCB0PWUuZ2V0TGF0ZXN0KCksbj1lLmdldFBhcmVudCgpO3QuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZlLnJlbW92ZSghMCksZT1ufX1mdW5jdGlvbiBTZihlLHQsbixyLG89bnVsbCl7aWYodC5sZW5ndGghPT0wKXt2YXIgaT10WzBdLGw9bmV3IE1hcCxzPVtdO2k9bmUuJGlzRWxlbWVudE5vZGUoaSk/aTppLmdldFBhcmVudE9yVGhyb3coKSxpLmlzSW5saW5lKCkmJihpPWkuZ2V0UGFyZW50T3JUaHJvdygpKTtmb3IodmFyIGE9ITE7aSE9PW51bGw7KXt2YXIgdT1pLmdldFByZXZpb3VzU2libGluZygpO2lmKHUhPT1udWxsKXtpPXUsYT0hMDticmVha31pZihpPWkuZ2V0UGFyZW50T3JUaHJvdygpLG5lLiRpc1Jvb3RPclNoYWRvd1Jvb3QoaSkpYnJlYWt9dT1uZXcgU2V0O2Zvcih2YXIgYz0wO2M8bjtjKyspe3ZhciBkPXRbY107bmUuJGlzRWxlbWVudE5vZGUoZCkmJmQuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZ1LmFkZChkLmdldEtleSgpKX12YXIgZj1uZXcgU2V0O2ZvcihjPTA7YzxuO2MrKyl7ZD10W2NdO3ZhciBoPWQuZ2V0UGFyZW50KCk7aWYoaCE9PW51bGwmJmguaXNJbmxpbmUoKSYmKGg9aC5nZXRQYXJlbnQoKSksaCE9PW51bGwmJm5lLiRpc0xlYWZOb2RlKGQpJiYhZi5oYXMoZC5nZXRLZXkoKSkpe2lmKGQ9aC5nZXRLZXkoKSxsLmdldChkKT09PXZvaWQgMCl7bGV0IGc9cigpO2cuc2V0Rm9ybWF0KGguZ2V0Rm9ybWF0VHlwZSgpKSxnLnNldEluZGVudChoLmdldEluZGVudCgpKSxzLnB1c2goZyksbC5zZXQoZCxnKSxoLmdldENoaWxkcmVuKCkuZm9yRWFjaChtPT57Zy5hcHBlbmQobSksZi5hZGQobS5nZXRLZXkoKSksbmUuJGlzRWxlbWVudE5vZGUobSkmJm0uZ2V0Q2hpbGRyZW5LZXlzKCkuZm9yRWFjaChTPT5mLmFkZChTKSl9KSxIYihoKX19ZWxzZSB1LmhhcyhkLmdldEtleSgpKSYmKGg9cigpLGguc2V0Rm9ybWF0KGQuZ2V0Rm9ybWF0VHlwZSgpKSxoLnNldEluZGVudChkLmdldEluZGVudCgpKSxzLnB1c2goaCksZC5yZW1vdmUoITApKX1pZihvIT09bnVsbClmb3IodD0wO3Q8cy5sZW5ndGg7dCsrKW8uYXBwZW5kKHNbdF0pO2lmKHQ9bnVsbCxuZS4kaXNSb290T3JTaGFkb3dSb290KGkpKWlmKGEpaWYobyE9PW51bGwpaS5pbnNlcnRBZnRlcihvKTtlbHNlIGZvcihvPXMubGVuZ3RoLTE7MDw9bztvLS0paS5pbnNlcnRBZnRlcihzW29dKTtlbHNlIGlmKGE9aS5nZXRGaXJzdENoaWxkKCksbmUuJGlzRWxlbWVudE5vZGUoYSkmJihpPWEpLGE9PT1udWxsKWlmKG8paS5hcHBlbmQobyk7ZWxzZSBmb3Iobz0wO288cy5sZW5ndGg7bysrKWE9c1tvXSxpLmFwcGVuZChhKSx0PWE7ZWxzZSBpZihvIT09bnVsbClhLmluc2VydEJlZm9yZShvKTtlbHNlIGZvcihpPTA7aTxzLmxlbmd0aDtpKyspbz1zW2ldLGEuaW5zZXJ0QmVmb3JlKG8pLHQ9bztlbHNlIGlmKG8paS5pbnNlcnRBZnRlcihvKTtlbHNlIGZvcihvPXMubGVuZ3RoLTE7MDw9bztvLS0pYT1zW29dLGkuaW5zZXJ0QWZ0ZXIoYSksdD1hO3M9bmUuJGdldFByZXZpb3VzU2VsZWN0aW9uKCksbmUuJGlzUmFuZ2VTZWxlY3Rpb24ocykmJnMuYW5jaG9yLmdldE5vZGUoKS5pc0F0dGFjaGVkKCkmJnMuZm9jdXMuZ2V0Tm9kZSgpLmlzQXR0YWNoZWQoKT9uZS4kc2V0U2VsZWN0aW9uKHMuY2xvbmUoKSk6dCE9PW51bGw/dC5zZWxlY3RFbmQoKTplLmRpcnR5PSEwfX1mdW5jdGlvbiBVdyhlLHQsbixyKXtlLm1vZGlmeSh0PyJleHRlbmQiOiJtb3ZlIixuLHIpfWZ1bmN0aW9uIFZ3KGUpe3JldHVybiBlPWUuYW5jaG9yLmdldE5vZGUoKSwobmUuJGlzUm9vdE5vZGUoZSk/ZTplLmdldFBhcmVudE9yVGhyb3coKSkuZ2V0RGlyZWN0aW9uKCk9PT0icnRsIn1SdC4kYWRkTm9kZVN0eWxlPWZ1bmN0aW9uKGUpe2U9ZS5nZXRTdHlsZSgpO2xldCB0PUJ3KGUpOyRjLnNldChlLHQpfTtSdC4kY2xvbmVXaXRoUHJvcGVydGllcz1mdW5jdGlvbihlKXtsZXQgdD1lLmNvbnN0cnVjdG9yLmNsb25lKGUpO3JldHVybiB0Ll9fcGFyZW50PWUuX19wYXJlbnQsdC5fX25leHQ9ZS5fX25leHQsdC5fX3ByZXY9ZS5fX3ByZXYsbmUuJGlzRWxlbWVudE5vZGUoZSkmJm5lLiRpc0VsZW1lbnROb2RlKHQpPyh0Ll9fZmlyc3Q9ZS5fX2ZpcnN0LHQuX19sYXN0PWUuX19sYXN0LHQuX19zaXplPWUuX19zaXplLHQuX19mb3JtYXQ9ZS5fX2Zvcm1hdCx0Ll9faW5kZW50PWUuX19pbmRlbnQsdC5fX2Rpcj1lLl9fZGlyLHQpOihuZS4kaXNUZXh0Tm9kZShlKSYmbmUuJGlzVGV4dE5vZGUodCkmJih0Ll9fZm9ybWF0PWUuX19mb3JtYXQsdC5fX3N0eWxlPWUuX19zdHlsZSx0Ll9fbW9kZT1lLl9fbW9kZSx0Ll9fZGV0YWlsPWUuX19kZXRhaWwpLHQpfTtSdC4kZ2V0U2VsZWN0aW9uU3R5bGVWYWx1ZUZvclByb3BlcnR5PWZ1bmN0aW9uKGUsdCxuPSIiKXtsZXQgcj1udWxsLG89ZS5nZXROb2RlcygpO3ZhciBpPWUuYW5jaG9yLGw9ZS5mb2N1cyxzPWUuaXNCYWNrd2FyZCgpO2xldCBhPXM/bC5vZmZzZXQ6aS5vZmZzZXQ7aWYoaT1zP2wuZ2V0Tm9kZSgpOmkuZ2V0Tm9kZSgpLGUuc3R5bGUhPT0iIiYmKGU9a2MoZS5zdHlsZSksZSE9PW51bGwmJnQgaW4gZSkpcmV0dXJuIGVbdF07Zm9yKGU9MDtlPG8ubGVuZ3RoO2UrKyl7dmFyIHU9b1tlXTtpZigoZT09PTB8fGEhPT0wfHwhdS5pcyhpKSkmJm5lLiRpc1RleHROb2RlKHUpKXtpZihsPXQscz1uLHU9dS5nZXRTdHlsZSgpLHU9a2ModSksbD11IT09bnVsbCYmdVtsXXx8cyxyPT09bnVsbClyPWw7ZWxzZSBpZihyIT09bCl7cj0iIjticmVha319fXJldHVybiByPT09bnVsbD9uOnJ9O1J0LiRpc0F0Tm9kZUVuZD1mdW5jdGlvbihlKXtyZXR1cm4gZS50eXBlPT09InRleHQiP2Uub2Zmc2V0PT09ZS5nZXROb2RlKCkuZ2V0VGV4dENvbnRlbnRTaXplKCk6ZS5vZmZzZXQ9PT1lLmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKX07UnQuJGlzUGFyZW50RWxlbWVudFJUTD1WdztSdC4kbW92ZUNhcmV0U2VsZWN0aW9uPVV3O1J0LiRtb3ZlQ2hhcmFjdGVyPWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj1WdyhlKTtVdyhlLHQsbj8hcjpyLCJjaGFyYWN0ZXIiKX07UnQuJHBhdGNoU3R5bGVUZXh0PVd3O1J0LiRzZWxlY3RBbGw9ZnVuY3Rpb24oZSl7bGV0IHQ9ZS5hbmNob3I7ZT1lLmZvY3VzO3ZhciBuPXQuZ2V0Tm9kZSgpLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5nZXRQYXJlbnRPclRocm93KCk7bGV0IHI9bi5nZXRGaXJzdERlc2NlbmRhbnQoKTtuPW4uZ2V0TGFzdERlc2NlbmRhbnQoKTtsZXQgbz0iZWxlbWVudCIsaT0iZWxlbWVudCIsbD0wO25lLiRpc1RleHROb2RlKHIpP289InRleHQiOm5lLiRpc0VsZW1lbnROb2RlKHIpfHxyPT09bnVsbHx8KHI9ci5nZXRQYXJlbnRPclRocm93KCkpLG5lLiRpc1RleHROb2RlKG4pPyhpPSJ0ZXh0IixsPW4uZ2V0VGV4dENvbnRlbnRTaXplKCkpOm5lLiRpc0VsZW1lbnROb2RlKG4pfHxuPT09bnVsbHx8KG49bi5nZXRQYXJlbnRPclRocm93KCkpLHImJm4mJih0LnNldChyLmdldEtleSgpLDAsbyksZS5zZXQobi5nZXRLZXkoKSxsLGkpKX07UnQuJHNldEJsb2Nrc1R5cGU9ZnVuY3Rpb24oZSx0KXtpZihlLmFuY2hvci5rZXk9PT0icm9vdCIpe3Q9dCgpO3ZhciBuPW5lLiRnZXRSb290KCk7KGU9bi5nZXRGaXJzdENoaWxkKCkpP2UucmVwbGFjZSh0LCEwKTpuLmFwcGVuZCh0KX1lbHNlIGZvcihuPWUuZ2V0Tm9kZXMoKSxlPWUuYW5jaG9yLmdldE5vZGUoKS5nZXRQYXJlbnRPclRocm93KCksbi5pbmRleE9mKGUpPT09LTEmJm4ucHVzaChlKSxlLmlzSW5saW5lKCkmJihlPWUuZ2V0UGFyZW50T3JUaHJvdygpLG4uaW5kZXhPZihlKT09PS0xJiZuLnB1c2goZSkpLGU9MDtlPG4ubGVuZ3RoO2UrKyl7bGV0IGk9bltlXTt2YXIgcj1pO2lmKCFuZS4kaXNFbGVtZW50Tm9kZShyKXx8bmUuJGlzUm9vdE9yU2hhZG93Um9vdChyKSlyPSExO2Vsc2V7dmFyIG89ci5nZXRGaXJzdENoaWxkKCk7bz1vPT09bnVsbHx8bmUuJGlzTGluZUJyZWFrTm9kZShvKXx8bmUuJGlzVGV4dE5vZGUobyl8fG8uaXNJbmxpbmUoKSxyPSFyLmlzSW5saW5lKCkmJnIuY2FuQmVFbXB0eSgpIT09ITEmJm99ciYmKHI9dCgpLHIuc2V0Rm9ybWF0KGkuZ2V0Rm9ybWF0VHlwZSgpKSxyLnNldEluZGVudChpLmdldEluZGVudCgpKSxpLnJlcGxhY2UociwhMCkpfX07UnQuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbj1mdW5jdGlvbihlLHQpe3JldHVybiBlPW5lLiRnZXRBZGphY2VudE5vZGUoZS5mb2N1cyx0KSxuZS4kaXNEZWNvcmF0b3JOb2RlKGUpJiYhZS5pc0lzb2xhdGVkKCl8fG5lLiRpc0VsZW1lbnROb2RlKGUpJiYhZS5pc0lubGluZSgpJiYhZS5jYW5CZUVtcHR5KCl9O1J0LiRzbGljZVNlbGVjdGVkVGV4dE5vZGVDb250ZW50PWZ1bmN0aW9uKGUsdCl7aWYodC5pc1NlbGVjdGVkKCkmJiF0LmlzU2VnbWVudGVkKCkmJiF0LmlzVG9rZW4oKSYmKG5lLiRpc1JhbmdlU2VsZWN0aW9uKGUpfHxuZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24oZSkpKXt2YXIgbj1lLmFuY2hvci5nZXROb2RlKCkscj1lLmZvY3VzLmdldE5vZGUoKSxvPXQuaXMobiksaT10LmlzKHIpO2lmKG98fGkpe289ZS5pc0JhY2t3YXJkKCk7bGV0W2wsc109ZS5nZXRDaGFyYWN0ZXJPZmZzZXRzKCk7ZT1uLmlzKHIpLGk9dC5pcyhvP3I6bikscj10LmlzKG8/bjpyKSxuPTA7bGV0IGE7ZT8obj1sPnM/czpsLGE9bD5zP2w6cyk6aT8obj1vP3M6bCxhPXZvaWQgMCk6ciYmKG89bz9sOnMsbj0wLGE9byksdC5fX3RleHQ9dC5fX3RleHQuc2xpY2UobixhKX19cmV0dXJuIHR9O1J0LiR3cmFwTm9kZXM9ZnVuY3Rpb24oZSx0LG49bnVsbCl7dmFyIHI9ZS5nZXROb2RlcygpO2xldCBvPXIubGVuZ3RoO3ZhciBpPWUuYW5jaG9yO2lmKG89PT0wfHxvPT09MSYmaS50eXBlPT09ImVsZW1lbnQiJiZpLmdldE5vZGUoKS5nZXRDaGlsZHJlblNpemUoKT09PTApe2U9aS50eXBlPT09InRleHQiP2kuZ2V0Tm9kZSgpLmdldFBhcmVudE9yVGhyb3coKTppLmdldE5vZGUoKSxyPWUuZ2V0Q2hpbGRyZW4oKTtsZXQgcz10KCk7cy5zZXRGb3JtYXQoZS5nZXRGb3JtYXRUeXBlKCkpLHMuc2V0SW5kZW50KGUuZ2V0SW5kZW50KCkpLHIuZm9yRWFjaChhPT5zLmFwcGVuZChhKSksbiYmKHM9bi5hcHBlbmQocykpLGUucmVwbGFjZShzKX1lbHNle2k9bnVsbDt2YXIgbD1bXTtmb3IobGV0IHM9MDtzPG87cysrKXtsZXQgYT1yW3NdO25lLiRpc1Jvb3RPclNoYWRvd1Jvb3QoYSk/KFNmKGUsbCxsLmxlbmd0aCx0LG4pLGw9W10saT1hKTppPT09bnVsbHx8aSE9PW51bGwmJm5lLiRoYXNBbmNlc3RvcihhLGkpP2wucHVzaChhKTooU2YoZSxsLGwubGVuZ3RoLHQsbiksbD1bYV0pfVNmKGUsbCxsLmxlbmd0aCx0LG4pfX07UnQuY3JlYXRlRE9NUmFuZ2U9ZnVuY3Rpb24oZSx0LG4scixvKXtsZXQgaT10LmdldEtleSgpLGw9ci5nZXRLZXkoKSxzPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCksYT1lLmdldEVsZW1lbnRCeUtleShpKTtpZihlPWUuZ2V0RWxlbWVudEJ5S2V5KGwpLG5lLiRpc1RleHROb2RlKHQpJiYoYT1OeShhKSksbmUuJGlzVGV4dE5vZGUocikmJihlPU55KGUpKSx0PT09dm9pZCAwfHxyPT09dm9pZCAwfHxhPT09bnVsbHx8ZT09PW51bGwpcmV0dXJuIG51bGw7YS5ub2RlTmFtZT09PSJCUiImJihbYSxuXT1ieShhKSksZS5ub2RlTmFtZT09PSJCUiImJihbZSxvXT1ieShlKSksdD1hLmZpcnN0Q2hpbGQsYT09PWUmJnQhPW51bGwmJnQubm9kZU5hbWU9PT0iQlIiJiZuPT09MCYmbz09PTAmJihvPTEpO3RyeXtzLnNldFN0YXJ0KGEsbikscy5zZXRFbmQoZSxvKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4hcy5jb2xsYXBzZWR8fG49PT1vJiZpPT09bHx8KHMuc2V0U3RhcnQoZSxvKSxzLnNldEVuZChhLG4pKSxzfTtSdC5jcmVhdGVSZWN0c0Zyb21ET01SYW5nZT1mdW5jdGlvbihlLHQpe3ZhciBuPWUuZ2V0Um9vdEVsZW1lbnQoKTtpZihuPT09bnVsbClyZXR1cm5bXTtlPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj1nZXRDb21wdXRlZFN0eWxlKG4pLG49cGFyc2VGbG9hdChuLnBhZGRpbmdMZWZ0KStwYXJzZUZsb2F0KG4ucGFkZGluZ1JpZ2h0KSx0PUFycmF5LmZyb20odC5nZXRDbGllbnRSZWN0cygpKTtsZXQgcj10Lmxlbmd0aDt0LnNvcnQoKGksbCk9PntsZXQgcz1pLnRvcC1sLnRvcDtyZXR1cm4gMz49TWF0aC5hYnMocyk/aS5sZWZ0LWwubGVmdDpzfSk7bGV0IG87Zm9yKGxldCBpPTA7aTxyO2krKyl7bGV0IGw9dFtpXSxzPWwud2lkdGgrbj09PWUud2lkdGg7byYmby50b3A8PWwudG9wJiZvLnRvcCtvLmhlaWdodD5sLnRvcCYmby5sZWZ0K28ud2lkdGg+bC5sZWZ0fHxzPyh0LnNwbGljZShpLS0sMSksci0tKTpvPWx9cmV0dXJuIHR9O1J0LmdldFN0eWxlT2JqZWN0RnJvbUNTUz1rYztSdC50cmltVGV4dENvbnRlbnRGcm9tQW5jaG9yPWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj10LmdldE5vZGUoKTtpZihuZS4kaXNFbGVtZW50Tm9kZShyKSl7dmFyIG89ci5nZXREZXNjZW5kYW50QnlJbmRleCh0Lm9mZnNldCk7byE9PW51bGwmJihyPW8pfWZvcig7MDxuJiZyIT09bnVsbDspe3ZhciBpPXIuZ2V0UHJldmlvdXNTaWJsaW5nKCksbD0wO2lmKGk9PT1udWxsKXtvPXIuZ2V0UGFyZW50T3JUaHJvdygpO2Zvcih2YXIgcz1vLmdldFByZXZpb3VzU2libGluZygpO3M9PT1udWxsOyl7aWYobz1vLmdldFBhcmVudCgpLG89PT1udWxsKXtpPW51bGw7YnJlYWt9cz1vLmdldFByZXZpb3VzU2libGluZygpfW8hPT1udWxsJiYobD1vLmlzSW5saW5lKCk/MDoyLGk9bmUuJGlzRWxlbWVudE5vZGUocyk/cy5nZXRMYXN0RGVzY2VuZGFudCgpOnMpfWlmKHM9ci5nZXRUZXh0Q29udGVudCgpLHM9PT0iIiYmbmUuJGlzRWxlbWVudE5vZGUocikmJiFyLmlzSW5saW5lKCkmJihzPWAKCmApLG89cy5sZW5ndGgsIW5lLiRpc1RleHROb2RlKHIpfHxuPj1vKXM9ci5nZXRQYXJlbnQoKSxyLnJlbW92ZSgpLHM9PW51bGx8fHMuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wfHxuZS4kaXNSb290Tm9kZShzKXx8cy5yZW1vdmUoKSxuLT1vK2wscj1pO2Vsc2V7bGV0IGE9ci5nZXRLZXkoKTtsPWUuZ2V0RWRpdG9yU3RhdGUoKS5yZWFkKCgpPT57Y29uc3QgYz1uZS4kZ2V0Tm9kZUJ5S2V5KGEpO3JldHVybiBuZS4kaXNUZXh0Tm9kZShjKSYmYy5pc1NpbXBsZVRleHQoKT9jLmdldFRleHRDb250ZW50KCk6bnVsbH0pLGk9by1uO2xldCB1PXMuc2xpY2UoMCxpKTtsIT09bnVsbCYmbCE9PXM/KG49bmUuJGdldFByZXZpb3VzU2VsZWN0aW9uKCksbz1yLHIuaXNTaW1wbGVUZXh0KCk/ci5zZXRUZXh0Q29udGVudChsKToobz1uZS4kY3JlYXRlVGV4dE5vZGUobCksci5yZXBsYWNlKG8pKSxuZS4kaXNSYW5nZVNlbGVjdGlvbihuKSYmbi5pc0NvbGxhcHNlZCgpJiYobj1uLmFuY2hvci5vZmZzZXQsby5zZWxlY3QobixuKSkpOnIuaXNTaW1wbGVUZXh0KCk/KGw9dC5rZXk9PT1hLHM9dC5vZmZzZXQsczxuJiYocz1vKSxuPWw/cy1uOjAsbz1sP3M6aSxsJiZuPT09MD8oW25dPXIuc3BsaXRUZXh0KG4sbyksbi5yZW1vdmUoKSk6KFssbl09ci5zcGxpdFRleHQobixvKSxuLnJlbW92ZSgpKSk6KG49bmUuJGNyZWF0ZVRleHROb2RlKHUpLHIucmVwbGFjZShuKSksbj0wfX19O2NvbnN0IEtiPVJ0O3ZhciBPbz1LYixHYj1PbyxhdD1nZTtmdW5jdGlvbiBZYihlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3QuYXBwZW5kKCJjb2RlIixlKTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9ZnVuY3Rpb24gSHcoZSx0KXtmb3IobGV0IG4gb2YgdClpZihlLnR5cGUuc3RhcnRzV2l0aChuKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBLdyhlLHQpe2Zvcig7ZSE9PWF0LiRnZXRSb290KCkmJmUhPW51bGw7KXtpZih0KGUpKXJldHVybiBlO2U9ZS5nZXRQYXJlbnQoKX1yZXR1cm4gbnVsbH1kdC4kc3BsaXROb2RlPWF0LiRzcGxpdE5vZGU7ZHQuaXNIVE1MQW5jaG9yRWxlbWVudD1hdC5pc0hUTUxBbmNob3JFbGVtZW50O2R0LmlzSFRNTEVsZW1lbnQ9YXQuaXNIVE1MRWxlbWVudDtkdC4kZGZzPWZ1bmN0aW9uKGUsdCl7bGV0IG49W107ZT0oZXx8YXQuJGdldFJvb3QoKSkuZ2V0TGF0ZXN0KCksdD10fHwoYXQuJGlzRWxlbWVudE5vZGUoZSk/ZS5nZXRMYXN0RGVzY2VuZGFudCgpOmUpO2Zvcih2YXIgcj1lLG89MDsocj1yLmdldFBhcmVudCgpKSE9PW51bGw7KW8rKztmb3Iocj1vO2UhPT1udWxsJiYhZS5pcyh0KTspaWYobi5wdXNoKHtkZXB0aDpyLG5vZGU6ZX0pLGF0LiRpc0VsZW1lbnROb2RlKGUpJiYwPGUuZ2V0Q2hpbGRyZW5TaXplKCkpZT1lLmdldEZpcnN0Q2hpbGQoKSxyKys7ZWxzZSBmb3Iobz1udWxsO289PT1udWxsJiZlIT09bnVsbDspbz1lLmdldE5leHRTaWJsaW5nKCksbz09PW51bGw/KGU9ZS5nZXRQYXJlbnQoKSxyLS0pOmU9bztyZXR1cm4gZSE9PW51bGwmJmUuaXModCkmJm4ucHVzaCh7ZGVwdGg6cixub2RlOmV9KSxufTtkdC4kZmlsdGVyPWZ1bmN0aW9uKGUsdCl7bGV0IG49W107Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKyspe2xldCBvPXQoZVtyXSk7byE9PW51bGwmJm4ucHVzaChvKX1yZXR1cm4gbn07ZHQuJGZpbmRNYXRjaGluZ1BhcmVudD1LdztkdC4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdz1mdW5jdGlvbihlKXtsZXQgdD1LdyhlLG49PmF0LiRpc0VsZW1lbnROb2RlKG4pJiYhbi5pc0lubGluZSgpKTtyZXR1cm4gYXQuJGlzRWxlbWVudE5vZGUodCl8fFliKDQsZS5fX2tleSksdH07ZHQuJGdldE5lYXJlc3ROb2RlT2ZUeXBlPWZ1bmN0aW9uKGUsdCl7Zm9yKDtlIT1udWxsOyl7aWYoZSBpbnN0YW5jZW9mIHQpcmV0dXJuIGU7ZT1lLmdldFBhcmVudCgpfXJldHVybiBudWxsfTtkdC4kaW5zZXJ0Rmlyc3Q9ZnVuY3Rpb24oZSx0KXtsZXQgbj1lLmdldEZpcnN0Q2hpbGQoKTtuIT09bnVsbD9uLmluc2VydEJlZm9yZSh0KTplLmFwcGVuZCh0KX07ZHQuJGluc2VydE5vZGVUb05lYXJlc3RSb290PWZ1bmN0aW9uKGUpe3ZhciB0PWF0LiRnZXRTZWxlY3Rpb24oKXx8YXQuJGdldFByZXZpb3VzU2VsZWN0aW9uKCk7aWYoYXQuJGlzUmFuZ2VTZWxlY3Rpb24odCkpe3Zhcntmb2N1czpufT10O2lmKHQ9bi5nZXROb2RlKCksbj1uLm9mZnNldCxhdC4kaXNSb290T3JTaGFkb3dSb290KHQpKW49dC5nZXRDaGlsZEF0SW5kZXgobiksbj09bnVsbD90LmFwcGVuZChlKTpuLmluc2VydEJlZm9yZShlKSxlLnNlbGVjdE5leHQoKTtlbHNle2xldCByLG87YXQuJGlzVGV4dE5vZGUodCk/KHI9dC5nZXRQYXJlbnRPclRocm93KCksbz10LmdldEluZGV4V2l0aGluUGFyZW50KCksMDxuJiYobys9MSx0LnNwbGl0VGV4dChuKSkpOihyPXQsbz1uKSxbLHRdPWF0LiRzcGxpdE5vZGUocixvKSx0Lmluc2VydEJlZm9yZShlKSx0LnNlbGVjdFN0YXJ0KCl9fWVsc2UgYXQuJGlzTm9kZVNlbGVjdGlvbih0KXx8YXQuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKHQpPyh0PXQuZ2V0Tm9kZXMoKSx0W3QubGVuZ3RoLTFdLmdldFRvcExldmVsRWxlbWVudE9yVGhyb3coKS5pbnNlcnRBZnRlcihlKSk6YXQuJGdldFJvb3QoKS5hcHBlbmQoZSksdD1hdC4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLGUuaW5zZXJ0QWZ0ZXIodCksdC5zZWxlY3QoKTtyZXR1cm4gZS5nZXRMYXRlc3QoKX07ZHQuJHJlc3RvcmVFZGl0b3JTdGF0ZT1mdW5jdGlvbihlLHQpe2xldCBuPW5ldyBNYXAscj1lLl9wZW5kaW5nRWRpdG9yU3RhdGU7Zm9yKGxldFtvLGldb2YgdC5fbm9kZU1hcCl7bGV0IGw9R2IuJGNsb25lV2l0aFByb3BlcnRpZXMoaSk7YXQuJGlzVGV4dE5vZGUobCkmJihsLl9fdGV4dD1pLl9fdGV4dCksbi5zZXQobyxsKX1yJiYoci5fbm9kZU1hcD1uKSxlLl9kaXJ0eVR5cGU9MixlPXQuX3NlbGVjdGlvbixhdC4kc2V0U2VsZWN0aW9uKGU9PT1udWxsP251bGw6ZS5jbG9uZSgpKX07ZHQuJHdyYXBOb2RlSW5FbGVtZW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ9dCgpLGUucmVwbGFjZSh0KSx0LmFwcGVuZChlKSx0fTtkdC5hZGRDbGFzc05hbWVzVG9FbGVtZW50PWZ1bmN0aW9uKGUsLi4udCl7dC5mb3JFYWNoKG49Pnt0eXBlb2Ygbj09InN0cmluZyImJihuPW4uc3BsaXQoIiAiKS5maWx0ZXIocj0+ciE9PSIiKSxlLmNsYXNzTGlzdC5hZGQoLi4ubikpfSl9O2R0LmlzTWltZVR5cGU9SHc7ZHQubWVkaWFGaWxlUmVhZGVyPWZ1bmN0aW9uKGUsdCl7bGV0IG49ZVtTeW1ib2wuaXRlcmF0b3JdKCk7cmV0dXJuIG5ldyBQcm9taXNlKChyLG8pPT57bGV0IGk9W10sbD0oKT0+e2NvbnN0e2RvbmU6cyx2YWx1ZTphfT1uLm5leHQoKTtpZihzKXJldHVybiByKGkpO2NvbnN0IHU9bmV3IEZpbGVSZWFkZXI7dS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsbyksdS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoKT0+e2NvbnN0IGM9dS5yZXN1bHQ7dHlwZW9mIGM9PSJzdHJpbmciJiZpLnB1c2goe2ZpbGU6YSxyZXN1bHQ6Y30pLGwoKX0pLEh3KGEsdCk/dS5yZWFkQXNEYXRhVVJMKGEpOmwoKX07bCgpfSl9O2R0Lm1lcmdlUmVnaXN0ZXI9ZnVuY3Rpb24oLi4uZSl7cmV0dXJuKCk9PntlLmZvckVhY2godD0+dCgpKX19O2R0Lm9iamVjdEtsYXNzRXF1YWxzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUhPT1udWxsP09iamVjdC5nZXRQcm90b3R5cGVPZihlKS5jb25zdHJ1Y3Rvci5uYW1lPT09dC5uYW1lOiExfTtkdC5yZWdpc3Rlck5lc3RlZEVsZW1lbnRSZXNvbHZlcj1mdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0odCxvPT57ZTp7Zm9yKHZhciBpPW8uZ2V0Q2hpbGRyZW4oKSxsPTA7bDxpLmxlbmd0aDtsKyspaWYoaVtsXWluc3RhbmNlb2YgdCl7aT1udWxsO2JyZWFrIGV9Zm9yKGk9bztpIT09bnVsbDspaWYobD1pLGk9aS5nZXRQYXJlbnQoKSxpIGluc3RhbmNlb2YgdCl7aT17Y2hpbGQ6bCxwYXJlbnQ6aX07YnJlYWsgZX1pPW51bGx9aWYoaSE9PW51bGwpe2NvbnN0e2NoaWxkOnMscGFyZW50OmF9PWk7aWYocy5pcyhvKSl7aWYocihhLG8pLG89cy5nZXROZXh0U2libGluZ3MoKSxpPW8ubGVuZ3RoLGEuaW5zZXJ0QWZ0ZXIocyksaSE9PTApe2w9bihhKSxzLmluc2VydEFmdGVyKGwpO2ZvcihsZXQgdT0wO3U8aTt1KyspbC5hcHBlbmQob1t1XSl9YS5jYW5CZUVtcHR5KCl8fGEuZ2V0Q2hpbGRyZW5TaXplKCkhPT0wfHxhLnJlbW92ZSgpfX19KX07ZHQucmVtb3ZlQ2xhc3NOYW1lc0Zyb21FbGVtZW50PWZ1bmN0aW9uKGUsLi4udCl7dC5mb3JFYWNoKG49Pnt0eXBlb2Ygbj09InN0cmluZyImJmUuY2xhc3NMaXN0LnJlbW92ZSguLi5uLnNwbGl0KCIgIikpfSl9O2NvbnN0IFhiPWR0O3ZhciBOdD1YYixOZT1nZSxBbz1OdDtmdW5jdGlvbiBrbChlKXtsZXQgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3QuYXBwZW5kKCJjb2RlIixlKTtmb3IobGV0IG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQuYXBwZW5kKCJ2Iixhcmd1bWVudHNbbl0pO3Rocm93IEVycm9yKGBNaW5pZmllZCBMZXhpY2FsIGVycm9yICMke2V9OyB2aXNpdCBodHRwczovL2xleGljYWwuZGV2L2RvY3MvZXJyb3I/JHt0fSBmb3IgdGhlIGZ1bGwgbWVzc2FnZSBvciB1c2UgdGhlIG5vbi1taW5pZmllZCBkZXYgZW52aXJvbm1lbnQgZm9yIGZ1bGwgZXJyb3JzIGFuZCBhZGRpdGlvbmFsIGhlbHBmdWwgd2FybmluZ3MuYCl9ZnVuY3Rpb24gR3coZSl7bGV0IHQ9MTtmb3IoZT1lLmdldFBhcmVudCgpO2UhPW51bGw7KXtpZihaZShlKSl7aWYoZT1lLmdldFBhcmVudCgpLHhlKGUpKXt0KyssZT1lLmdldFBhcmVudCgpO2NvbnRpbnVlfWtsKDQwKX1icmVha31yZXR1cm4gdH1mdW5jdGlvbiBycChlKXtlPWUuZ2V0UGFyZW50KCkseGUoZSl8fGtsKDQwKTtsZXQgdD1lO2Zvcig7dCE9PW51bGw7KXQ9dC5nZXRQYXJlbnQoKSx4ZSh0KSYmKGU9dCk7cmV0dXJuIGV9ZnVuY3Rpb24gWXcoZSl7bGV0IHQ9W107ZT1lLmdldENoaWxkcmVuKCkuZmlsdGVyKFplKTtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IHI9ZVtuXSxvPXIuZ2V0Rmlyc3RDaGlsZCgpO3hlKG8pP3Q9dC5jb25jYXQoWXcobykpOnQucHVzaChyKX1yZXR1cm4gdH1mdW5jdGlvbiBhcihlKXtyZXR1cm4gWmUoZSkmJnhlKGUuZ2V0Rmlyc3RDaGlsZCgpKX1mdW5jdGlvbiBRYihlKXtmb3IoO2UuZ2V0TmV4dFNpYmxpbmcoKT09bnVsbCYmZS5nZXRQcmV2aW91c1NpYmxpbmcoKT09bnVsbDspe2xldCB0PWUuZ2V0UGFyZW50KCk7aWYodD09bnVsbHx8IVplKGUpJiYheGUoZSkpYnJlYWs7ZT10fWUucmVtb3ZlKCl9ZnVuY3Rpb24gUnkoZSl7cmV0dXJuIFNuKCkuYXBwZW5kKGUpfWZ1bmN0aW9uIFh3KGUsdCl7cmV0dXJuIFplKGUpJiYodC5sZW5ndGg9PT0wfHx0Lmxlbmd0aD09PTEmJmUuaXModFswXSkmJmUuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wKX1mdW5jdGlvbiBwaShlLHQpe2Uuc3BsaWNlKGUuZ2V0Q2hpbGRyZW5TaXplKCksMCx0KX1mdW5jdGlvbiBQeShlLHQpe2lmKHhlKGUpKXJldHVybiBlO2xldCBuPWUuZ2V0UHJldmlvdXNTaWJsaW5nKCkscj1lLmdldE5leHRTaWJsaW5nKCksbz1TbigpO3JldHVybiBvLnNldEZvcm1hdChlLmdldEZvcm1hdFR5cGUoKSksby5zZXRJbmRlbnQoZS5nZXRJbmRlbnQoKSkscGkobyxlLmdldENoaWxkcmVuKCkpLHhlKG4pJiZ0PT09bi5nZXRMaXN0VHlwZSgpPyhuLmFwcGVuZChvKSxlLnJlbW92ZSgpLHhlKHIpJiZ0PT09ci5nZXRMaXN0VHlwZSgpJiYocGkobixyLmdldENoaWxkcmVuKCkpLHIucmVtb3ZlKCkpLG4pOnhlKHIpJiZ0PT09ci5nZXRMaXN0VHlwZSgpPyhyLmdldEZpcnN0Q2hpbGRPclRocm93KCkuaW5zZXJ0QmVmb3JlKG8pLGUucmVtb3ZlKCkscik6KHQ9dG4odCksdC5hcHBlbmQobyksZS5yZXBsYWNlKHQpLFh0KHQpLHQpfWZ1bmN0aW9uIFF3KGUsdCl7dmFyIG49ZS5nZXRMYXN0Q2hpbGQoKTtsZXQgcj10LmdldEZpcnN0Q2hpbGQoKTtuJiZyJiZhcihuKSYmYXIocikmJihRdyhuLmdldEZpcnN0Q2hpbGQoKSxyLmdldEZpcnN0Q2hpbGQoKSksci5yZW1vdmUoKSksbj10LmdldENoaWxkcmVuKCksMDxuLmxlbmd0aCYmKGUuYXBwZW5kKC4uLm4pLFh0KGUpKSx0LnJlbW92ZSgpfWZ1bmN0aW9uIFh0KGUsdCl7aWYoZT10fHxlLmdldENoaWxkcmVuKCksZSE9PXZvaWQgMClmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKXtsZXQgaT1lW3RdO2lmKFplKGkpKXtsZXQgbD1pLmdldFZhbHVlKCk7dmFyIG49aSxyPW4uZ2V0UGFyZW50KCksbz0xO2ZvcihyIT1udWxsJiYoeGUocik/bz1yLmdldFN0YXJ0KCk6a2woNDQpKSxuPW4uZ2V0UHJldmlvdXNTaWJsaW5ncygpLHI9MDtyPG4ubGVuZ3RoO3IrKyl7bGV0IHM9bltyXTtaZShzKSYmIXhlKHMuZ2V0Rmlyc3RDaGlsZCgpKSYmbysrfWwhPT1vJiZpLnNldFZhbHVlKG8pfX19ZnVuY3Rpb24gSmIoZSl7aWYoIWFyKGUpKXt2YXIgdD1lLmdldFBhcmVudCgpLG49dD90LmdldFBhcmVudCgpOnZvaWQgMCxyPW4/bi5nZXRQYXJlbnQoKTp2b2lkIDA7aWYoeGUocikmJlplKG4pJiZ4ZSh0KSl7dmFyIG89dD90LmdldEZpcnN0Q2hpbGQoKTp2b2lkIDAsaT10P3QuZ2V0TGFzdENoaWxkKCk6dm9pZCAwO2lmKGUuaXMobykpbi5pbnNlcnRCZWZvcmUoZSksdC5pc0VtcHR5KCkmJm4ucmVtb3ZlKCk7ZWxzZSBpZihlLmlzKGkpKW4uaW5zZXJ0QWZ0ZXIoZSksdC5pc0VtcHR5KCkmJm4ucmVtb3ZlKCk7ZWxzZXt2YXIgbD10LmdldExpc3RUeXBlKCk7bz1TbigpO2xldCBzPXRuKGwpO28uYXBwZW5kKHMpLGUuZ2V0UHJldmlvdXNTaWJsaW5ncygpLmZvckVhY2goYT0+cy5hcHBlbmQoYSkpLGk9U24oKSxsPXRuKGwpLGkuYXBwZW5kKGwpLHBpKGwsZS5nZXROZXh0U2libGluZ3MoKSksbi5pbnNlcnRCZWZvcmUobyksbi5pbnNlcnRBZnRlcihpKSxuLnJlcGxhY2UoZSl9WHQodCksWHQocil9fX1sZXQgdmQ9Y2xhc3MgSncgZXh0ZW5kcyBOZS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaXN0aXRlbSJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgSncodC5fX3ZhbHVlLHQuX19jaGVja2VkLHQuX19rZXkpfWNvbnN0cnVjdG9yKHQsbixyKXtzdXBlcihyKSx0aGlzLl9fdmFsdWU9dD09PXZvaWQgMD8xOnQsdGhpcy5fX2NoZWNrZWQ9bn1jcmVhdGVET00odCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxyPXRoaXMuZ2V0UGFyZW50KCk7cmV0dXJuIHhlKHIpJiZyLmdldExpc3RUeXBlKCk9PT0iY2hlY2siJiZBeShuLHRoaXMsbnVsbCksbi52YWx1ZT10aGlzLl9fdmFsdWUsT3kobix0LnRoZW1lLHRoaXMpLG59dXBkYXRlRE9NKHQsbixyKXtsZXQgbz10aGlzLmdldFBhcmVudCgpO3JldHVybiB4ZShvKSYmby5nZXRMaXN0VHlwZSgpPT09ImNoZWNrIiYmQXkobix0aGlzLHQpLG4udmFsdWU9dGhpcy5fX3ZhbHVlLE95KG4sci50aGVtZSx0aGlzKSwhMX1zdGF0aWMgdHJhbnNmb3JtKCl7cmV0dXJuIHQ9PntsZXQgbj10LmdldFBhcmVudCgpO3hlKG4pJiYoWHQobiksbi5nZXRMaXN0VHlwZSgpIT09ImNoZWNrIiYmdC5nZXRDaGVja2VkKCkhPW51bGwmJnQuc2V0Q2hlY2tlZCh2b2lkIDApKX19c3RhdGljIGltcG9ydERPTSgpe3JldHVybntsaTooKT0+KHtjb252ZXJzaW9uOlpiLHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49U24oKTtyZXR1cm4gbi5zZXRDaGVja2VkKHQuY2hlY2tlZCksbi5zZXRWYWx1ZSh0LnZhbHVlKSxuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksY2hlY2tlZDp0aGlzLmdldENoZWNrZWQoKSx0eXBlOiJsaXN0aXRlbSIsdmFsdWU6dGhpcy5nZXRWYWx1ZSgpLHZlcnNpb246MX19YXBwZW5kKC4uLnQpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtsZXQgcj10W25dO2lmKE5lLiRpc0VsZW1lbnROb2RlKHIpJiZ0aGlzLmNhbk1lcmdlV2l0aChyKSl7bGV0IG89ci5nZXRDaGlsZHJlbigpO3RoaXMuYXBwZW5kKC4uLm8pLHIucmVtb3ZlKCl9ZWxzZSBzdXBlci5hcHBlbmQocil9cmV0dXJuIHRoaXN9cmVwbGFjZSh0LG4pe2lmKFplKHQpKXJldHVybiBzdXBlci5yZXBsYWNlKHQpO3RoaXMuc2V0SW5kZW50KDApO2xldCByPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpO2lmKCF4ZShyKSlyZXR1cm4gdDtpZihyLl9fZmlyc3Q9PT10aGlzLmdldEtleSgpKXIuaW5zZXJ0QmVmb3JlKHQpO2Vsc2UgaWYoci5fX2xhc3Q9PT10aGlzLmdldEtleSgpKXIuaW5zZXJ0QWZ0ZXIodCk7ZWxzZXtsZXQgbz10bihyLmdldExpc3RUeXBlKCkpLGk9dGhpcy5nZXROZXh0U2libGluZygpO2Zvcig7aTspe2xldCBsPWk7aT1pLmdldE5leHRTaWJsaW5nKCksby5hcHBlbmQobCl9ci5pbnNlcnRBZnRlcih0KSx0Lmluc2VydEFmdGVyKG8pfXJldHVybiBuJiZ0aGlzLmdldENoaWxkcmVuKCkuZm9yRWFjaChvPT57dC5hcHBlbmQobyl9KSx0aGlzLnJlbW92ZSgpLHIuZ2V0Q2hpbGRyZW5TaXplKCk9PT0wJiZyLnJlbW92ZSgpLHR9aW5zZXJ0QWZ0ZXIodCxuPSEwKXt2YXIgcj10aGlzLmdldFBhcmVudE9yVGhyb3coKTt4ZShyKXx8a2woMzkpO3ZhciBvPXRoaXMuZ2V0TmV4dFNpYmxpbmdzKCk7aWYoWmUodCkpcmV0dXJuIG49c3VwZXIuaW5zZXJ0QWZ0ZXIodCxuKSx0PXQuZ2V0UGFyZW50T3JUaHJvdygpLHhlKHQpJiZYdCh0KSxuO2lmKHhlKHQpKXtmb3Iocj10LHQ9dC5nZXRDaGlsZHJlbigpLG89dC5sZW5ndGgtMTswPD1vO28tLSlyPXRbb10sdGhpcy5pbnNlcnRBZnRlcihyLG4pO3JldHVybiByfWlmKHIuaW5zZXJ0QWZ0ZXIodCxuKSxvLmxlbmd0aCE9PTApe2xldCBpPXRuKHIuZ2V0TGlzdFR5cGUoKSk7by5mb3JFYWNoKGw9PmkuYXBwZW5kKGwpKSx0Lmluc2VydEFmdGVyKGksbil9cmV0dXJuIHR9cmVtb3ZlKHQpe2xldCBuPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCkscj10aGlzLmdldE5leHRTaWJsaW5nKCk7c3VwZXIucmVtb3ZlKHQpLG4mJnImJmFyKG4pJiZhcihyKT8oUXcobi5nZXRGaXJzdENoaWxkKCksci5nZXRGaXJzdENoaWxkKCkpLHIucmVtb3ZlKCkpOnImJih0PXIuZ2V0UGFyZW50KCkseGUodCkmJlh0KHQpKX1pbnNlcnROZXdBZnRlcih0LG49ITApe3JldHVybiB0PVNuKHRoaXMuX19jaGVja2VkPT1udWxsP3ZvaWQgMDohMSksdGhpcy5pbnNlcnRBZnRlcih0LG4pLHR9Y29sbGFwc2VBdFN0YXJ0KHQpe2xldCBuPU5lLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7dGhpcy5nZXRDaGlsZHJlbigpLmZvckVhY2gobD0+bi5hcHBlbmQobCkpO3ZhciByPXRoaXMuZ2V0UGFyZW50T3JUaHJvdygpLG89ci5nZXRQYXJlbnRPclRocm93KCk7bGV0IGk9WmUobyk7cmV0dXJuIHIuZ2V0Q2hpbGRyZW5TaXplKCk9PT0xP2k/KHIucmVtb3ZlKCksby5zZWxlY3QoKSk6KHIuaW5zZXJ0QmVmb3JlKG4pLHIucmVtb3ZlKCkscj10LmFuY2hvcix0PXQuZm9jdXMsbz1uLmdldEtleSgpLHIudHlwZT09PSJlbGVtZW50IiYmci5nZXROb2RlKCkuaXModGhpcykmJnIuc2V0KG8sci5vZmZzZXQsImVsZW1lbnQiKSx0LnR5cGU9PT0iZWxlbWVudCImJnQuZ2V0Tm9kZSgpLmlzKHRoaXMpJiZ0LnNldChvLHQub2Zmc2V0LCJlbGVtZW50IikpOihyLmluc2VydEJlZm9yZShuKSx0aGlzLnJlbW92ZSgpKSwhMH1nZXRWYWx1ZSgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdmFsdWV9c2V0VmFsdWUodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fdmFsdWU9dH1nZXRDaGVja2VkKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX19jaGVja2VkfXNldENoZWNrZWQodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fY2hlY2tlZD10fXRvZ2dsZUNoZWNrZWQoKXt0aGlzLnNldENoZWNrZWQoIXRoaXMuX19jaGVja2VkKX1nZXRJbmRlbnQoKXt2YXIgdD10aGlzLmdldFBhcmVudCgpO2lmKHQ9PT1udWxsKXJldHVybiB0aGlzLmdldExhdGVzdCgpLl9faW5kZW50O3Q9dC5nZXRQYXJlbnRPclRocm93KCk7bGV0IG49MDtmb3IoO1plKHQpOyl0PXQuZ2V0UGFyZW50T3JUaHJvdygpLmdldFBhcmVudE9yVGhyb3coKSxuKys7cmV0dXJuIG59c2V0SW5kZW50KHQpe3R5cGVvZiB0PT0ibnVtYmVyIiYmLTE8dHx8a2woMTE3KTtsZXQgbj10aGlzLmdldEluZGVudCgpO2Zvcig7biE9PXQ7KWlmKG48dCl7ZTp7dmFyIHI9bmV3IFNldDtpZihhcih0aGlzKXx8ci5oYXModGhpcy5nZXRLZXkoKSkpYnJlYWsgZTtsZXQgcz10aGlzLmdldFBhcmVudCgpO3ZhciBvPXRoaXMuZ2V0TmV4dFNpYmxpbmcoKSxpPXRoaXMuZ2V0UHJldmlvdXNTaWJsaW5nKCk7aWYoYXIobykmJmFyKGkpKXtpZihpPWkuZ2V0Rmlyc3RDaGlsZCgpLHhlKGkpKXtpLmFwcGVuZCh0aGlzKTt2YXIgbD1vLmdldEZpcnN0Q2hpbGQoKTt4ZShsKSYmKGw9bC5nZXRDaGlsZHJlbigpLHBpKGksbCksby5yZW1vdmUoKSxyLmFkZChvLmdldEtleSgpKSksWHQoaSl9fWVsc2UgYXIobyk/KG89by5nZXRGaXJzdENoaWxkKCkseGUobykmJihyPW8uZ2V0Rmlyc3RDaGlsZCgpLHIhPT1udWxsJiZyLmluc2VydEJlZm9yZSh0aGlzKSxYdChvKSkpOmFyKGkpPyhvPWkuZ2V0Rmlyc3RDaGlsZCgpLHhlKG8pJiYoby5hcHBlbmQodGhpcyksWHQobykpKTp4ZShzKSYmKHI9U24oKSxsPXRuKHMuZ2V0TGlzdFR5cGUoKSksci5hcHBlbmQobCksbC5hcHBlbmQodGhpcyksaT9pLmluc2VydEFmdGVyKHIpOm8/by5pbnNlcnRCZWZvcmUocik6cy5hcHBlbmQociksWHQobCkpO3hlKHMpJiZYdChzKX1uKyt9ZWxzZSBKYih0aGlzKSxuLS07cmV0dXJuIHRoaXN9aW5zZXJ0QmVmb3JlKHQpe2lmKFplKHQpKXtsZXQgbj10aGlzLmdldFBhcmVudE9yVGhyb3coKTtpZih4ZShuKSl7bGV0IHI9dGhpcy5nZXROZXh0U2libGluZ3MoKTtYdChuLHIpfX1yZXR1cm4gc3VwZXIuaW5zZXJ0QmVmb3JlKHQpfWNhbkluc2VydEFmdGVyKHQpe3JldHVybiBaZSh0KX1jYW5SZXBsYWNlV2l0aCh0KXtyZXR1cm4gWmUodCl9Y2FuTWVyZ2VXaXRoKHQpe3JldHVybiBOZS4kaXNQYXJhZ3JhcGhOb2RlKHQpfHxaZSh0KX1leHRyYWN0V2l0aENoaWxkKHQsbil7aWYoIU5lLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXJldHVybiExO3Q9bi5hbmNob3IuZ2V0Tm9kZSgpO2xldCByPW4uZm9jdXMuZ2V0Tm9kZSgpO3JldHVybiB0aGlzLmlzUGFyZW50T2YodCkmJnRoaXMuaXNQYXJlbnRPZihyKSYmdGhpcy5nZXRUZXh0Q29udGVudCgpLmxlbmd0aD09PW4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9aXNQYXJlbnRSZXF1aXJlZCgpe3JldHVybiEwfWNyZWF0ZVBhcmVudEVsZW1lbnROb2RlKCl7cmV0dXJuIHRuKCJidWxsZXQiKX19O2Z1bmN0aW9uIE95KGUsdCxuKXtsZXQgcj1bXSxvPVtdO3ZhciBpPSh0PXQubGlzdCk/dC5saXN0aXRlbTp2b2lkIDA7aWYodCYmdC5uZXN0ZWQpdmFyIGw9dC5uZXN0ZWQubGlzdGl0ZW07aWYoaSE9PXZvaWQgMCYmKGk9aS5zcGxpdCgiICIpLHIucHVzaCguLi5pKSksdCl7aT1uLmdldFBhcmVudCgpLGk9eGUoaSkmJmkuZ2V0TGlzdFR5cGUoKT09PSJjaGVjayI7bGV0IHM9bi5nZXRDaGVja2VkKCk7aSYmIXN8fG8ucHVzaCh0Lmxpc3RpdGVtVW5jaGVja2VkKSxpJiZzfHxvLnB1c2godC5saXN0aXRlbUNoZWNrZWQpLGkmJnIucHVzaChzP3QubGlzdGl0ZW1DaGVja2VkOnQubGlzdGl0ZW1VbmNoZWNrZWQpfWwhPT12b2lkIDAmJihsPWwuc3BsaXQoIiAiKSxuLmdldENoaWxkcmVuKCkuc29tZShzPT54ZShzKSk/ci5wdXNoKC4uLmwpOm8ucHVzaCguLi5sKSksMDxvLmxlbmd0aCYmQW8ucmVtb3ZlQ2xhc3NOYW1lc0Zyb21FbGVtZW50KGUsLi4ubyksMDxyLmxlbmd0aCYmQW8uYWRkQ2xhc3NOYW1lc1RvRWxlbWVudChlLC4uLnIpfWZ1bmN0aW9uIEF5KGUsdCxuKXt4ZSh0LmdldEZpcnN0Q2hpbGQoKSk/KGUucmVtb3ZlQXR0cmlidXRlKCJyb2xlIiksZS5yZW1vdmVBdHRyaWJ1dGUoInRhYkluZGV4IiksZS5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIpKTooZS5zZXRBdHRyaWJ1dGUoInJvbGUiLCJjaGVja2JveCIpLGUuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsIi0xIiksbiYmdC5fX2NoZWNrZWQ9PT1uLl9fY2hlY2tlZHx8ZS5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsdC5nZXRDaGVja2VkKCk/InRydWUiOiJmYWxzZSIpKX1mdW5jdGlvbiBaYihlKXtyZXR1cm4gZT1Bby5pc0hUTUxFbGVtZW50KGUpJiZlLmdldEF0dHJpYnV0ZSgiYXJpYS1jaGVja2VkIik9PT0idHJ1ZSIse25vZGU6U24oZSl9fWZ1bmN0aW9uIFNuKGUpe3JldHVybiBOZS4kYXBwbHlOb2RlUmVwbGFjZW1lbnQobmV3IHZkKHZvaWQgMCxlKSl9ZnVuY3Rpb24gWmUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiB2ZH1sZXQgZW09Y2xhc3MgWncgZXh0ZW5kcyBOZS5FbGVtZW50Tm9kZXtzdGF0aWMgZ2V0VHlwZSgpe3JldHVybiJsaXN0In1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBadyh0Ll9fbGlzdFR5cGV8fEx5W3QuX190YWddLHQuX19zdGFydCx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIociksdGhpcy5fX2xpc3RUeXBlPXQ9THlbdF18fHQsdGhpcy5fX3RhZz10PT09Im51bWJlciI/Im9sIjoidWwiLHRoaXMuX19zdGFydD1ufWdldFRhZygpe3JldHVybiB0aGlzLl9fdGFnfXNldExpc3RUeXBlKHQpe2xldCBuPXRoaXMuZ2V0V3JpdGFibGUoKTtuLl9fbGlzdFR5cGU9dCxuLl9fdGFnPXQ9PT0ibnVtYmVyIj8ib2wiOiJ1bCJ9Z2V0TGlzdFR5cGUoKXtyZXR1cm4gdGhpcy5fX2xpc3RUeXBlfWdldFN0YXJ0KCl7cmV0dXJuIHRoaXMuX19zdGFydH1jcmVhdGVET00odCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0aGlzLl9fdGFnKTtyZXR1cm4gdGhpcy5fX3N0YXJ0IT09MSYmbi5zZXRBdHRyaWJ1dGUoInN0YXJ0IixTdHJpbmcodGhpcy5fX3N0YXJ0KSksbi5fX2xleGljYWxMaXN0VHlwZT10aGlzLl9fbGlzdFR5cGUsTXkobix0LnRoZW1lLHRoaXMpLG59dXBkYXRlRE9NKHQsbixyKXtyZXR1cm4gdC5fX3RhZyE9PXRoaXMuX190YWc/ITA6KE15KG4sci50aGVtZSx0aGlzKSwhMSl9c3RhdGljIGltcG9ydERPTSgpe3JldHVybntvbDooKT0+KHtjb252ZXJzaW9uOkR5LHByaW9yaXR5OjB9KSx1bDooKT0+KHtjb252ZXJzaW9uOkR5LHByaW9yaXR5OjB9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49dG4odC5saXN0VHlwZSx0LnN0YXJ0KTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1leHBvcnRET00odCl7cmV0dXJue2VsZW1lbnQ6dH09c3VwZXIuZXhwb3J0RE9NKHQpLHQmJkFvLmlzSFRNTEVsZW1lbnQodCkmJih0aGlzLl9fc3RhcnQhPT0xJiZ0LnNldEF0dHJpYnV0ZSgic3RhcnQiLFN0cmluZyh0aGlzLl9fc3RhcnQpKSx0aGlzLl9fbGlzdFR5cGU9PT0iY2hlY2siJiZ0LnNldEF0dHJpYnV0ZSgiX19sZXhpY2FsTGlzdFR5cGUiLCJjaGVjayIpKSx7ZWxlbWVudDp0fX1leHBvcnRKU09OKCl7cmV0dXJuey4uLnN1cGVyLmV4cG9ydEpTT04oKSxsaXN0VHlwZTp0aGlzLmdldExpc3RUeXBlKCksc3RhcnQ6dGhpcy5nZXRTdGFydCgpLHRhZzp0aGlzLmdldFRhZygpLHR5cGU6Imxpc3QiLHZlcnNpb246MX19Y2FuQmVFbXB0eSgpe3JldHVybiExfWNhbkluZGVudCgpe3JldHVybiExfWFwcGVuZCguLi50KXtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG49dFtyXTtpZihaZShuKSlzdXBlci5hcHBlbmQobik7ZWxzZXtsZXQgbz1TbigpO3hlKG4pfHxOZS4kaXNFbGVtZW50Tm9kZShuKSYmKG49TmUuJGNyZWF0ZVRleHROb2RlKG4uZ2V0VGV4dENvbnRlbnQoKSkpLG8uYXBwZW5kKG4pLHN1cGVyLmFwcGVuZChvKX19cmV0dXJuIFh0KHRoaXMpLHRoaXN9ZXh0cmFjdFdpdGhDaGlsZCh0KXtyZXR1cm4gWmUodCl9fTtmdW5jdGlvbiBNeShlLHQsbil7bGV0IHI9W10sbz1bXTt2YXIgaT10Lmxpc3Q7aWYoaSE9PXZvaWQgMCl7bGV0IHM9aVtgJHtuLl9fdGFnfURlcHRoYF18fFtdO3Q9R3cobiktMTtsZXQgYT10JXMubGVuZ3RoO3ZhciBsPXNbYV07bGV0IHU9aVtuLl9fdGFnXSxjO2lmKGk9aS5uZXN0ZWQsaSE9PXZvaWQgMCYmaS5saXN0JiYoYz1pLmxpc3QpLHUhPT12b2lkIDAmJnIucHVzaCh1KSxsIT09dm9pZCAwKWZvcihsPWwuc3BsaXQoIiAiKSxyLnB1c2goLi4ubCksbD0wO2w8cy5sZW5ndGg7bCsrKWwhPT1hJiZvLnB1c2gobi5fX3RhZytsKTtjIT09dm9pZCAwJiYobj1jLnNwbGl0KCIgIiksMTx0P3IucHVzaCguLi5uKTpvLnB1c2goLi4ubikpfTA8by5sZW5ndGgmJkFvLnJlbW92ZUNsYXNzTmFtZXNGcm9tRWxlbWVudChlLC4uLm8pLDA8ci5sZW5ndGgmJkFvLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQoZSwuLi5yKX1mdW5jdGlvbiBxYihlKXtsZXQgdD1bXTtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG49ZVtyXTtaZShuKT8odC5wdXNoKG4pLG49bi5nZXRDaGlsZHJlbigpLDE8bi5sZW5ndGgmJm4uZm9yRWFjaChvPT57eGUobykmJnQucHVzaChSeShvKSl9KSk6dC5wdXNoKFJ5KG4pKX1yZXR1cm4gdH1mdW5jdGlvbiBEeShlKXtsZXQgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksbj1udWxsO3JldHVybiB0PT09Im9sIj9uPXRuKCJudW1iZXIiLGUuc3RhcnQpOnQ9PT0idWwiJiYobj1Bby5pc0hUTUxFbGVtZW50KGUpJiZlLmdldEF0dHJpYnV0ZSgiX19sZXhpY2FsbGlzdHR5cGUiKT09PSJjaGVjayI/dG4oImNoZWNrIik6dG4oImJ1bGxldCIpKSx7YWZ0ZXI6cWIsbm9kZTpufX1sZXQgTHk9e29sOiJudW1iZXIiLHVsOiJidWxsZXQifTtmdW5jdGlvbiB0bihlLHQ9MSl7cmV0dXJuIE5lLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgZW0oZSx0KSl9ZnVuY3Rpb24geGUoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBlbX1sZXQgZTI9TmUuY3JlYXRlQ29tbWFuZCgiSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQiKSx0Mj1OZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQiKSxuMj1OZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfQ0hFQ0tfTElTVF9DT01NQU5EIikscjI9TmUuY3JlYXRlQ29tbWFuZCgiUkVNT1ZFX0xJU1RfQ09NTUFORCIpO2xuLiRjcmVhdGVMaXN0SXRlbU5vZGU9U247bG4uJGNyZWF0ZUxpc3ROb2RlPXRuO2xuLiRnZXRMaXN0RGVwdGg9R3c7bG4uJGhhbmRsZUxpc3RJbnNlcnRQYXJhZ3JhcGg9ZnVuY3Rpb24oKXt2YXIgZT1OZS4kZ2V0U2VsZWN0aW9uKCk7aWYoIU5lLiRpc1JhbmdlU2VsZWN0aW9uKGUpfHwhZS5pc0NvbGxhcHNlZCgpfHwoZT1lLmFuY2hvci5nZXROb2RlKCksIVplKGUpfHxlLmdldENoaWxkcmVuU2l6ZSgpIT09MCkpcmV0dXJuITE7dmFyIHQ9cnAoZSksbj1lLmdldFBhcmVudCgpO3hlKG4pfHxrbCg0MCk7bGV0IHI9bi5nZXRQYXJlbnQoKSxvO2lmKE5lLiRpc1Jvb3RPclNoYWRvd1Jvb3Qocikpbz1OZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLHQuaW5zZXJ0QWZ0ZXIobyk7ZWxzZSBpZihaZShyKSlvPVNuKCksci5pbnNlcnRBZnRlcihvKTtlbHNlIHJldHVybiExO2lmKG8uc2VsZWN0KCksdD1lLmdldE5leHRTaWJsaW5ncygpLDA8dC5sZW5ndGgpe2xldCBpPXRuKG4uZ2V0TGlzdFR5cGUoKSk7TmUuJGlzUGFyYWdyYXBoTm9kZShvKT9vLmluc2VydEFmdGVyKGkpOihuPVNuKCksbi5hcHBlbmQoaSksby5pbnNlcnRBZnRlcihuKSksdC5mb3JFYWNoKGw9PntsLnJlbW92ZSgpLGkuYXBwZW5kKGwpfSl9cmV0dXJuIFFiKGUpLCEwfTtsbi4kaXNMaXN0SXRlbU5vZGU9WmU7bG4uJGlzTGlzdE5vZGU9eGU7bG4uSU5TRVJUX0NIRUNLX0xJU1RfQ09NTUFORD1uMjtsbi5JTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQ9dDI7bG4uSU5TRVJUX1VOT1JERVJFRF9MSVNUX0NPTU1BTkQ9ZTI7bG4uTGlzdEl0ZW1Ob2RlPXZkO2xuLkxpc3ROb2RlPWVtO2xuLlJFTU9WRV9MSVNUX0NPTU1BTkQ9cjI7bG4uaW5zZXJ0TGlzdD1mdW5jdGlvbihlLHQpe2UudXBkYXRlKCgpPT57dmFyIG49TmUuJGdldFNlbGVjdGlvbigpO2lmKE5lLiRpc1JhbmdlU2VsZWN0aW9uKG4pfHxOZS5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24obikpe3ZhciByPW4uZ2V0Tm9kZXMoKTtuPW4uYW5jaG9yLmdldE5vZGUoKTt2YXIgbz1uLmdldFBhcmVudCgpO2lmKFh3KG4scikpcj10bih0KSxOZS4kaXNSb290T3JTaGFkb3dSb290KG8pPyhuLnJlcGxhY2Uociksbz1TbigpLE5lLiRpc0VsZW1lbnROb2RlKG4pJiYoby5zZXRGb3JtYXQobi5nZXRGb3JtYXRUeXBlKCkpLG8uc2V0SW5kZW50KG4uZ2V0SW5kZW50KCkpKSxyLmFwcGVuZChvKSk6WmUobikmJihuPW4uZ2V0UGFyZW50T3JUaHJvdygpLHBpKHIsbi5nZXRDaGlsZHJlbigpKSxuLnJlcGxhY2UocikpO2Vsc2UgZm9yKG49bmV3IFNldCxvPTA7bzxyLmxlbmd0aDtvKyspe3ZhciBpPXJbb107aWYoTmUuJGlzRWxlbWVudE5vZGUoaSkmJmkuaXNFbXB0eSgpJiYhbi5oYXMoaS5nZXRLZXkoKSkpUHkoaSx0KTtlbHNlIGlmKE5lLiRpc0xlYWZOb2RlKGkpKWZvcihpPWkuZ2V0UGFyZW50KCk7aSE9bnVsbDspe2xldCBzPWkuZ2V0S2V5KCk7aWYoeGUoaSkpe2lmKCFuLmhhcyhzKSl7dmFyIGw9dG4odCk7cGkobCxpLmdldENoaWxkcmVuKCkpLGkucmVwbGFjZShsKSxYdChsKSxuLmFkZChzKX1icmVha31lbHNle2lmKGw9aS5nZXRQYXJlbnQoKSxOZS4kaXNSb290T3JTaGFkb3dSb290KGwpJiYhbi5oYXMocykpe24uYWRkKHMpLFB5KGksdCk7YnJlYWt9aT1sfX19fX0pfTtsbi5yZW1vdmVMaXN0PWZ1bmN0aW9uKGUpe2UudXBkYXRlKCgpPT57bGV0IHQ9TmUuJGdldFNlbGVjdGlvbigpO2lmKE5lLiRpc1JhbmdlU2VsZWN0aW9uKHQpKXt2YXIgbj1uZXcgU2V0LHI9dC5nZXROb2RlcygpLG89dC5hbmNob3IuZ2V0Tm9kZSgpO2lmKFh3KG8scikpbi5hZGQocnAobykpO2Vsc2UgZm9yKG89MDtvPHIubGVuZ3RoO28rKyl7dmFyIGk9cltvXTtOZS4kaXNMZWFmTm9kZShpKSYmKGk9QW8uJGdldE5lYXJlc3ROb2RlT2ZUeXBlKGksdmQpLGkhPW51bGwmJm4uYWRkKHJwKGkpKSl9Zm9yKGxldCBsIG9mIG4pe249bCxyPVl3KGwpO2ZvcihsZXQgcyBvZiByKXI9TmUuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSxwaShyLHMuZ2V0Q2hpbGRyZW4oKSksbi5pbnNlcnRBZnRlcihyKSxuPXIscy5fX2tleT09PXQuYW5jaG9yLmtleSYmdC5hbmNob3Iuc2V0KHIuZ2V0S2V5KCksMCwiZWxlbWVudCIpLHMuX19rZXk9PT10LmZvY3VzLmtleSYmdC5mb2N1cy5zZXQoci5nZXRLZXkoKSwwLCJlbGVtZW50Iikscy5yZW1vdmUoKTtsLnJlbW92ZSgpfX19KX07Y29uc3QgbzI9bG47dmFyIGZvPW8yLHF3PXt9LHlkPXt9LGVTPXA7ZnVuY3Rpb24gaTIoZSl7bGV0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LmFwcGVuZCgiY29kZSIsZSk7Zm9yKGxldCBuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyl0LmFwcGVuZCgidiIsYXJndW1lbnRzW25dKTt0aHJvdyBFcnJvcihgTWluaWZpZWQgTGV4aWNhbCBlcnJvciAjJHtlfTsgdmlzaXQgaHR0cHM6Ly9sZXhpY2FsLmRldi9kb2NzL2Vycm9yPyR7dH0gZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLmApfWxldCB0Uz1lUy5jcmVhdGVDb250ZXh0KG51bGwpO3lkLkxleGljYWxDb21wb3NlckNvbnRleHQ9dFM7eWQuY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbihlLHQpe2xldCBuPW51bGw7cmV0dXJuIGUhPW51bGwmJihuPWVbMV0pLHtnZXRUaGVtZTpmdW5jdGlvbigpe3JldHVybiB0Pz8obiE9bnVsbD9uLmdldFRoZW1lKCk6bnVsbCl9fX07eWQudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dD1mdW5jdGlvbigpe2xldCBlPWVTLnVzZUNvbnRleHQodFMpO3JldHVybiBlPT1udWxsJiZpMig4KSxlfTtjb25zdCBsMj15ZDt2YXIgbnI9bDIsSXk9bnIsX3M9Z2UsVGM9cDtsZXQgblM9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiO3ZhciBzMj1uUz9UYy51c2VMYXlvdXRFZmZlY3Q6VGMudXNlRWZmZWN0O2xldCBmdT17dGFnOiJoaXN0b3J5LW1lcmdlIn07ZnVuY3Rpb24gYTIoZSx0KXtpZih0IT09bnVsbCl7aWYodD09PXZvaWQgMCllLnVwZGF0ZSgoKT0+e3ZhciBuPV9zLiRnZXRSb290KCk7aWYobi5pc0VtcHR5KCkpe2xldCByPV9zLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7bi5hcHBlbmQociksbj1uUz9kb2N1bWVudC5hY3RpdmVFbGVtZW50Om51bGwsKF9zLiRnZXRTZWxlY3Rpb24oKSE9PW51bGx8fG4hPT1udWxsJiZuPT09ZS5nZXRSb290RWxlbWVudCgpKSYmci5zZWxlY3QoKX19LGZ1KTtlbHNlIGlmKHQhPT1udWxsKXN3aXRjaCh0eXBlb2YgdCl7Y2FzZSJzdHJpbmciOmxldCBuPWUucGFyc2VFZGl0b3JTdGF0ZSh0KTtlLnNldEVkaXRvclN0YXRlKG4sZnUpO2JyZWFrO2Nhc2Uib2JqZWN0IjplLnNldEVkaXRvclN0YXRlKHQsZnUpO2JyZWFrO2Nhc2UiZnVuY3Rpb24iOmUudXBkYXRlKCgpPT57X3MuJGdldFJvb3QoKS5pc0VtcHR5KCkmJnQoZSl9LGZ1KX19fXF3LkxleGljYWxDb21wb3Nlcj1mdW5jdGlvbih7aW5pdGlhbENvbmZpZzplLGNoaWxkcmVuOnR9KXtsZXQgbj1UYy51c2VNZW1vKCgpPT57Y29uc3R7dGhlbWU6cixuYW1lc3BhY2U6byxlZGl0b3JfX0RFUFJFQ0FURUQ6aSxub2RlczpsLG9uRXJyb3I6cyxlZGl0b3JTdGF0ZTphfT1lLHU9SXkuY3JlYXRlTGV4aWNhbENvbXBvc2VyQ29udGV4dChudWxsLHIpO2xldCBjPWl8fG51bGw7aWYoYz09PW51bGwpe2NvbnN0IGQ9X3MuY3JlYXRlRWRpdG9yKHtlZGl0YWJsZTplLmVkaXRhYmxlLG5hbWVzcGFjZTpvLG5vZGVzOmwsb25FcnJvcjpmPT5zKGYsZCksdGhlbWU6cn0pO2EyKGQsYSksYz1kfXJldHVybltjLHVdfSxbXSk7cmV0dXJuIHMyKCgpPT57bGV0IHI9ZS5lZGl0YWJsZSxbb109bjtvLnNldEVkaXRhYmxlKHIhPT12b2lkIDA/cjohMCl9LFtdKSxUYy5jcmVhdGVFbGVtZW50KEl5LkxleGljYWxDb21wb3NlckNvbnRleHQuUHJvdmlkZXIse3ZhbHVlOm59LHQpfTtjb25zdCB1Mj1xdzt2YXIgYzI9dTIsenM9cDtmdW5jdGlvbiBvcChlLHQpe3JldHVybiBvcD1PYmplY3Quc2V0UHJvdG90eXBlT2Y/T2JqZWN0LnNldFByb3RvdHlwZU9mLmJpbmQoKTpmdW5jdGlvbihuLHIpe3JldHVybiBuLl9fcHJvdG9fXz1yLG59LG9wKGUsdCl9ZnVuY3Rpb24gZDIoZSx0KXtlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKSxlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lLG9wKGUsdCl9ZnVuY3Rpb24gZjIoZSx0KXtyZXR1cm4gZT09PXZvaWQgMCYmKGU9W10pLHQ9PT12b2lkIDAmJih0PVtdKSxlLmxlbmd0aCE9PXQubGVuZ3RofHxlLnNvbWUoZnVuY3Rpb24obixyKXtyZXR1cm4hT2JqZWN0LmlzKG4sdFtyXSl9KX12YXIgank9e2Vycm9yOm51bGx9LGgyPWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoKXtmb3IodmFyIHIsbz1hcmd1bWVudHMubGVuZ3RoLGk9QXJyYXkobyksbD0wO2w8bztsKyspaVtsXT1hcmd1bWVudHNbbF07cmV0dXJuIHI9ZS5jYWxsLmFwcGx5KGUsW3RoaXNdLmNvbmNhdChpKSl8fHRoaXMsci5zdGF0ZT1qeSxyLnJlc2V0RXJyb3JCb3VuZGFyeT1mdW5jdGlvbigpe2Zvcih2YXIgcyxhPWFyZ3VtZW50cy5sZW5ndGgsdT1BcnJheShhKSxjPTA7YzxhO2MrKyl1W2NdPWFyZ3VtZW50c1tjXTtyLnByb3BzLm9uUmVzZXQ9PW51bGx8fChzPXIucHJvcHMpLm9uUmVzZXQuYXBwbHkocyx1KSxyLnJlc2V0KCl9LHJ9ZDIodCxlKSx0LmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj1mdW5jdGlvbihyKXtyZXR1cm57ZXJyb3I6cn19O3ZhciBuPXQucHJvdG90eXBlO3JldHVybiBuLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zZXRTdGF0ZShqeSl9LG4uY29tcG9uZW50RGlkQ2F0Y2g9ZnVuY3Rpb24ocixvKXt2YXIgaSxsOyhpPShsPXRoaXMucHJvcHMpLm9uRXJyb3IpPT1udWxsfHxpLmNhbGwobCxyLG8pfSxuLmNvbXBvbmVudERpZFVwZGF0ZT1mdW5jdGlvbihyLG8pe3ZhciBpPXRoaXMucHJvcHMucmVzZXRLZXlzO2lmKHRoaXMuc3RhdGUuZXJyb3IhPT1udWxsJiZvLmVycm9yIT09bnVsbCYmZjIoci5yZXNldEtleXMsaSkpe3ZhciBsLHM7KGw9KHM9dGhpcy5wcm9wcykub25SZXNldEtleXNDaGFuZ2UpPT1udWxsfHxsLmNhbGwocyxyLnJlc2V0S2V5cyxpKSx0aGlzLnJlc2V0KCl9fSxuLnJlbmRlcj1mdW5jdGlvbigpe3ZhciByPXRoaXMuc3RhdGUuZXJyb3Isbz10aGlzLnByb3BzLGk9by5mYWxsYmFja1JlbmRlcixsPW8uRmFsbGJhY2tDb21wb25lbnQ7aWYobz1vLmZhbGxiYWNrLHIhPT1udWxsKXtpZihyPXtlcnJvcjpyLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX0senMuaXNWYWxpZEVsZW1lbnQobykpcmV0dXJuIG87aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpcmV0dXJuIGkocik7aWYobClyZXR1cm4genMuY3JlYXRlRWxlbWVudChsLHIpO3Rocm93IEVycm9yKCJyZWFjdC1lcnJvci1ib3VuZGFyeSByZXF1aXJlcyBlaXRoZXIgYSBmYWxsYmFjaywgZmFsbGJhY2tSZW5kZXIsIG9yIEZhbGxiYWNrQ29tcG9uZW50IHByb3AiKX1yZXR1cm4gdGhpcy5wcm9wcy5jaGlsZHJlbn0sdH0oenMuQ29tcG9uZW50KSxwMj1mdW5jdGlvbih7Y2hpbGRyZW46ZSxvbkVycm9yOnR9KXtyZXR1cm4genMuY3JlYXRlRWxlbWVudChoMix7ZmFsbGJhY2s6enMuY3JlYXRlRWxlbWVudCgiZGl2Iix7c3R5bGU6e2JvcmRlcjoiMXB4IHNvbGlkICNmMDAiLGNvbG9yOiIjZjAwIixwYWRkaW5nOiI4cHgifX0sIkFuIGVycm9yIHdhcyB0aHJvd24uIiksb25FcnJvcjp0fSxlKX07Y29uc3QgZzI9cDI7dmFyIG0yPWcyO2NvbnN0IHYyPSRhKG0yKTt2YXIgdG09e30sbm09e30seTI9TnQsemU9Z2U7ZnVuY3Rpb24geDIoZSx0LG4scixvKXtpZihlPT09bnVsbHx8bi5zaXplPT09MCYmci5zaXplPT09MCYmIW8pcmV0dXJuIDA7dmFyIGk9dC5fc2VsZWN0aW9uLGw9ZS5fc2VsZWN0aW9uO2lmKG8pcmV0dXJuIDE7aWYoISh6ZS4kaXNSYW5nZVNlbGVjdGlvbihpKSYmemUuJGlzUmFuZ2VTZWxlY3Rpb24obCkmJmwuaXNDb2xsYXBzZWQoKSYmaS5pc0NvbGxhcHNlZCgpKSlyZXR1cm4gMDtvPXQuX25vZGVNYXA7bGV0IHM9W107Zm9yKGxldCBhIG9mIG4pbj1vLmdldChhKSxuIT09dm9pZCAwJiZzLnB1c2gobik7Zm9yKGxldFthLHVdb2Ygcil1JiYocj1vLmdldChhKSxyPT09dm9pZCAwfHx6ZS4kaXNSb290Tm9kZShyKXx8cy5wdXNoKHIpKTtyZXR1cm4gcy5sZW5ndGg9PT0wPzA6MTxzLmxlbmd0aD8ocj10Ll9ub2RlTWFwLHQ9ci5nZXQoaS5hbmNob3Iua2V5KSxsPXIuZ2V0KGwuYW5jaG9yLmtleSksdCYmbCYmIWUuX25vZGVNYXAuaGFzKHQuX19rZXkpJiZ6ZS4kaXNUZXh0Tm9kZSh0KSYmdC5fX3RleHQubGVuZ3RoPT09MSYmaS5hbmNob3Iub2Zmc2V0PT09MT8yOjApOih0PXNbMF0sZT1lLl9ub2RlTWFwLmdldCh0Ll9fa2V5KSwhemUuJGlzVGV4dE5vZGUoZSl8fCF6ZS4kaXNUZXh0Tm9kZSh0KXx8ZS5fX21vZGUhPT10Ll9fbW9kZXx8KGU9ZS5fX3RleHQsdD10Ll9fdGV4dCxlPT09dCl8fChpPWkuYW5jaG9yLGw9bC5hbmNob3IsaS5rZXkhPT1sLmtleXx8aS50eXBlIT09InRleHQiKT8wOihpPWkub2Zmc2V0LGw9bC5vZmZzZXQsZT10Lmxlbmd0aC1lLmxlbmd0aCxlPT09MSYmbD09PWktMT8yOmU9PT0tMSYmbD09PWkrMT8zOmU9PT0tMSYmbD09PWk/NDowKSl9ZnVuY3Rpb24gXzIoZSx0KXtsZXQgbj1EYXRlLm5vdygpLHI9MDtyZXR1cm4obyxpLGwscyxhLHUpPT57bGV0IGM9RGF0ZS5ub3coKTtpZih1LmhhcygiaGlzdG9yaWMiKSlyZXR1cm4gcj0wLG49YywyO2xldCBkPXgyKG8saSxzLGEsZS5pc0NvbXBvc2luZygpKSxmPSgoKT0+e3ZhciBoPWw9PT1udWxsfHxsLmVkaXRvcj09PWUsZz11LmhhcygiaGlzdG9yeS1wdXNoIik7aWYoIWcmJmgmJnUuaGFzKCJoaXN0b3J5LW1lcmdlIikpcmV0dXJuIDA7aWYobz09PW51bGwpcmV0dXJuIDE7dmFyIG09aS5fc2VsZWN0aW9uO2lmKCEoMDxzLnNpemV8fDA8YS5zaXplKSlyZXR1cm4gbSE9PW51bGw/MDoyO2lmKGc9PT0hMSYmZCE9PTAmJmQ9PT1yJiZjPG4rdCYmaClyZXR1cm4gMDtpZihzLnNpemU9PT0xKXt7Zz1BcnJheS5mcm9tKHMpWzBdLGg9by5fbm9kZU1hcC5nZXQoZyksZz1pLl9ub2RlTWFwLmdldChnKSxtPW8uX3NlbGVjdGlvbjtsZXQgUz1pLl9zZWxlY3Rpb24sdj0hMTt6ZS4kaXNSYW5nZVNlbGVjdGlvbihtKSYmemUuJGlzUmFuZ2VTZWxlY3Rpb24oUykmJih2PW0uYW5jaG9yLnR5cGU9PT0iZWxlbWVudCImJm0uZm9jdXMudHlwZT09PSJlbGVtZW50IiYmUy5hbmNob3IudHlwZT09PSJ0ZXh0IiYmUy5mb2N1cy50eXBlPT09InRleHQiKSxoPSF2JiZ6ZS4kaXNUZXh0Tm9kZShoKSYmemUuJGlzVGV4dE5vZGUoZyk/aC5fX3R5cGU9PT1nLl9fdHlwZSYmaC5fX3RleHQ9PT1nLl9fdGV4dCYmaC5fX21vZGU9PT1nLl9fbW9kZSYmaC5fX2RldGFpbD09PWcuX19kZXRhaWwmJmguX19zdHlsZT09PWcuX19zdHlsZSYmaC5fX2Zvcm1hdD09PWcuX19mb3JtYXQmJmguX19wYXJlbnQ9PT1nLl9fcGFyZW50OiExfWlmKGgpcmV0dXJuIDB9cmV0dXJuIDF9KSgpO3JldHVybiBuPWMscj1kLGZ9fW5tLmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbCxyZWRvU3RhY2s6W10sdW5kb1N0YWNrOltdfX07bm0ucmVnaXN0ZXJIaXN0b3J5PWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj1fMihlLG4pO249KHtlZGl0b3JTdGF0ZTpsLHByZXZFZGl0b3JTdGF0ZTpzLGRpcnR5TGVhdmVzOmEsZGlydHlFbGVtZW50czp1LHRhZ3M6Y30pPT57Y29uc3QgZD10LmN1cnJlbnQsZj10LnJlZG9TdGFjayxoPXQudW5kb1N0YWNrLGc9ZD09PW51bGw/bnVsbDpkLmVkaXRvclN0YXRlO2lmKGQ9PT1udWxsfHxsIT09Zyl7aWYocz1yKHMsbCxkLGEsdSxjKSxzPT09MSlmLmxlbmd0aCE9PTAmJih0LnJlZG9TdGFjaz1bXSxlLmRpc3BhdGNoQ29tbWFuZCh6ZS5DQU5fUkVET19DT01NQU5ELCExKSksZCE9PW51bGwmJihoLnB1c2goey4uLmR9KSxlLmRpc3BhdGNoQ29tbWFuZCh6ZS5DQU5fVU5ET19DT01NQU5ELCEwKSk7ZWxzZSBpZihzPT09MilyZXR1cm47dC5jdXJyZW50PXtlZGl0b3I6ZSxlZGl0b3JTdGF0ZTpsfX19O2xldCBvPXkyLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoemUuVU5ET19DT01NQU5ELCgpPT57bGV0IGw9dC5yZWRvU3RhY2sscz10LnVuZG9TdGFjaztpZihzLmxlbmd0aCE9PTApe2xldCBhPXQuY3VycmVudCx1PXMucG9wKCk7YSE9PW51bGwmJihsLnB1c2goYSksZS5kaXNwYXRjaENvbW1hbmQoemUuQ0FOX1JFRE9fQ09NTUFORCwhMCkpLHMubGVuZ3RoPT09MCYmZS5kaXNwYXRjaENvbW1hbmQoemUuQ0FOX1VORE9fQ09NTUFORCwhMSksdC5jdXJyZW50PXV8fG51bGwsdSYmdS5lZGl0b3Iuc2V0RWRpdG9yU3RhdGUodS5lZGl0b3JTdGF0ZSx7dGFnOiJoaXN0b3JpYyJ9KX1yZXR1cm4hMH0semUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKHplLlJFRE9fQ09NTUFORCwoKT0+e2xldCBsPXQucmVkb1N0YWNrO3ZhciBzPXQudW5kb1N0YWNrO2lmKGwubGVuZ3RoIT09MCl7bGV0IGE9dC5jdXJyZW50O2EhPT1udWxsJiYocy5wdXNoKGEpLGUuZGlzcGF0Y2hDb21tYW5kKHplLkNBTl9VTkRPX0NPTU1BTkQsITApKSxzPWwucG9wKCksbC5sZW5ndGg9PT0wJiZlLmRpc3BhdGNoQ29tbWFuZCh6ZS5DQU5fUkVET19DT01NQU5ELCExKSx0LmN1cnJlbnQ9c3x8bnVsbCxzJiZzLmVkaXRvci5zZXRFZGl0b3JTdGF0ZShzLmVkaXRvclN0YXRlLHt0YWc6Imhpc3RvcmljIn0pfXJldHVybiEwfSx6ZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoemUuQ0xFQVJfRURJVE9SX0NPTU1BTkQsKCk9Pih0LnVuZG9TdGFjaz1bXSx0LnJlZG9TdGFjaz1bXSx0LmN1cnJlbnQ9bnVsbCwhMSksemUuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKHplLkNMRUFSX0hJU1RPUllfQ09NTUFORCwoKT0+KHQudW5kb1N0YWNrPVtdLHQucmVkb1N0YWNrPVtdLHQuY3VycmVudD1udWxsLGUuZGlzcGF0Y2hDb21tYW5kKHplLkNBTl9SRURPX0NPTU1BTkQsITEpLGUuZGlzcGF0Y2hDb21tYW5kKHplLkNBTl9VTkRPX0NPTU1BTkQsITEpLCEwKSx6ZS5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKG4pKSxpPWUucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcihuKTtyZXR1cm4oKT0+e28oKSxpKCl9fTtjb25zdCB3Mj1ubTt2YXIgUzI9dzIsRTI9bnIsaXA9UzIsenk9cDtmdW5jdGlvbiBDMihlLHQsbj0xZTMpe2xldCByPXp5LnVzZU1lbW8oKCk9PnR8fGlwLmNyZWF0ZUVtcHR5SGlzdG9yeVN0YXRlKCksW3RdKTt6eS51c2VFZmZlY3QoKCk9PmlwLnJlZ2lzdGVySGlzdG9yeShlLHIsbiksW24sZSxyXSl9dG0uY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU9aXAuY3JlYXRlRW1wdHlIaXN0b3J5U3RhdGU7dG0uSGlzdG9yeVBsdWdpbj1mdW5jdGlvbih7ZXh0ZXJuYWxIaXN0b3J5U3RhdGU6ZX0pe2xldFt0XT1FMi51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIEMyKHQsZSksbnVsbH07Y29uc3QgJDI9dG07dmFyIGsyPSQyLHJTPXt9LFQyPW5yLEZzPXAsTjI9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiP0ZzLnVzZUxheW91dEVmZmVjdDpGcy51c2VFZmZlY3Q7ZnVuY3Rpb24gYjIoZSl7bGV0W3RdPVQyLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxuPUZzLnVzZU1lbW8oKCk9PmUodCksW3QsZV0pLHI9RnMudXNlUmVmKG4uaW5pdGlhbFZhbHVlRm4oKSksW28saV09RnMudXNlU3RhdGUoci5jdXJyZW50KTtyZXR1cm4gTjIoKCk9PntsZXR7aW5pdGlhbFZhbHVlRm46bCxzdWJzY3JpYmU6c309bixhPWwoKTtyZXR1cm4gci5jdXJyZW50IT09YSYmKHIuY3VycmVudD1hLGkoYSkpLHModT0+e3IuY3VycmVudD11LGkodSl9KX0sW24sZV0pLG99ZnVuY3Rpb24gUjIoZSl7cmV0dXJue2luaXRpYWxWYWx1ZUZuOigpPT5lLmlzRWRpdGFibGUoKSxzdWJzY3JpYmU6dD0+ZS5yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIodCl9fXZhciBQMj1mdW5jdGlvbigpe3JldHVybiBiMihSMil9O2NvbnN0IE8yPVAyO3ZhciBBMj1PMixGbz17fSxRdD1nZTtmdW5jdGlvbiBybShlLHQ9ITApe3JldHVybiBlPyExOihlPW9TKCksdCYmKGU9ZS50cmltKCkpLGU9PT0iIil9ZnVuY3Rpb24gb1MoKXtyZXR1cm4gUXQuJGdldFJvb3QoKS5nZXRUZXh0Q29udGVudCgpfWZ1bmN0aW9uIGlTKGUpe2lmKCFybShlLCExKSlyZXR1cm4hMTtlPVF0LiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtsZXQgdD1lLmxlbmd0aDtpZigxPHQpcmV0dXJuITE7Zm9yKGxldCByPTA7cjx0O3IrKyl7dmFyIG49ZVtyXTtpZihRdC4kaXNEZWNvcmF0b3JOb2RlKG4pKXJldHVybiExO2lmKFF0LiRpc0VsZW1lbnROb2RlKG4pKXtpZighUXQuJGlzUGFyYWdyYXBoTm9kZShuKXx8bi5fX2luZGVudCE9PTApcmV0dXJuITE7bj1uLmdldENoaWxkcmVuKCk7bGV0IG89bi5sZW5ndGg7Zm9yKGxldCBpPTA7aTxvO2krKylpZighUXQuJGlzVGV4dE5vZGUobltyXSkpcmV0dXJuITF9fXJldHVybiEwfUZvLiRjYW5TaG93UGxhY2Vob2xkZXI9aVM7Rm8uJGNhblNob3dQbGFjZWhvbGRlckN1cnJ5PWZ1bmN0aW9uKGUpe3JldHVybigpPT5pUyhlKX07Rm8uJGZpbmRUZXh0SW50ZXJzZWN0aW9uRnJvbUNoYXJhY3RlcnM9ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmdldEZpcnN0Q2hpbGQoKTtlPTA7ZTpmb3IoO24hPT1udWxsOyl7aWYoUXQuJGlzRWxlbWVudE5vZGUobikpe3ZhciByPW4uZ2V0Rmlyc3RDaGlsZCgpO2lmKHIhPT1udWxsKXtuPXI7Y29udGludWV9fWVsc2UgaWYoUXQuJGlzVGV4dE5vZGUobikpe2lmKHI9bi5nZXRUZXh0Q29udGVudFNpemUoKSxlK3I+dClyZXR1cm57bm9kZTpuLG9mZnNldDp0LWV9O2UrPXJ9aWYocj1uLmdldE5leHRTaWJsaW5nKCksciE9PW51bGwpbj1yO2Vsc2V7Zm9yKG49bi5nZXRQYXJlbnQoKTtuIT09bnVsbDspe2lmKHI9bi5nZXROZXh0U2libGluZygpLHIhPT1udWxsKXtuPXI7Y29udGludWUgZX1uPW4uZ2V0UGFyZW50KCl9YnJlYWt9fXJldHVybiBudWxsfTtGby4kaXNSb290VGV4dENvbnRlbnRFbXB0eT1ybTtGby4kaXNSb290VGV4dENvbnRlbnRFbXB0eUN1cnJ5PWZ1bmN0aW9uKGUsdCl7cmV0dXJuKCk9PnJtKGUsdCl9O0ZvLiRyb290VGV4dENvbnRlbnQ9b1M7Rm8ucmVnaXN0ZXJMZXhpY2FsVGV4dEVudGl0eT1mdW5jdGlvbihlLHQsbixyKXtsZXQgbz1sPT57Y29uc3Qgcz1RdC4kY3JlYXRlVGV4dE5vZGUobC5nZXRUZXh0Q29udGVudCgpKTtzLnNldEZvcm1hdChsLmdldEZvcm1hdCgpKSxsLnJlcGxhY2Uocyl9LGk9ZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0oUXQuVGV4dE5vZGUsbD0+e2lmKGwuaXNTaW1wbGVUZXh0KCkpe3ZhciBzPWwuZ2V0UHJldmlvdXNTaWJsaW5nKCksYT1sLmdldFRleHRDb250ZW50KCksdT1sO2lmKFF0LiRpc1RleHROb2RlKHMpKXt2YXIgYz1zLmdldFRleHRDb250ZW50KCksZD10KGMrYSk7aWYocyBpbnN0YW5jZW9mIG4pe2lmKGQ9PT1udWxsfHxzLmdldExhdGVzdCgpLl9fbW9kZSE9PTApe28ocyk7cmV0dXJufWlmKGQ9ZC5lbmQtYy5sZW5ndGgsMDxkKXt1PWEuc2xpY2UoMCxkKSx1PWMrdSxzLnNlbGVjdCgpLHMuc2V0VGV4dENvbnRlbnQodSksZD09PWEubGVuZ3RoP2wucmVtb3ZlKCk6KHM9YS5zbGljZShkKSxsLnNldFRleHRDb250ZW50KHMpKTtyZXR1cm59fWVsc2UgaWYoZD09PW51bGx8fGQuc3RhcnQ8Yy5sZW5ndGgpcmV0dXJufWZvcig7Oyl7aWYobD10KGEpLGE9ZD1sPT09bnVsbD8iIjphLnNsaWNlKGwuZW5kKSxkPT09IiIpe2lmKGM9dS5nZXROZXh0U2libGluZygpLFF0LiRpc1RleHROb2RlKGMpKXtpZihkPXUuZ2V0VGV4dENvbnRlbnQoKStjLmdldFRleHRDb250ZW50KCksZD10KGQpLGQ9PT1udWxsKXtjIGluc3RhbmNlb2Ygbj9vKGMpOmMubWFya0RpcnR5KCk7YnJlYWt9ZWxzZSBpZihkLnN0YXJ0IT09MClicmVha319ZWxzZSBpZihjPXQoZCksYyE9PW51bGwmJmMuc3RhcnQ9PT0wKWJyZWFrO2lmKGw9PT1udWxsKWJyZWFrO2lmKGwuc3RhcnQ9PT0wJiZRdC4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSljb250aW51ZTtsZXQgZjtpZihsLnN0YXJ0PT09MD9bZix1XT11LnNwbGl0VGV4dChsLmVuZCk6WyxmLHVdPXUuc3BsaXRUZXh0KGwuc3RhcnQsbC5lbmQpLGw9cihmKSxsLnNldEZvcm1hdChmLmdldEZvcm1hdCgpKSxmLnJlcGxhY2UobCksdT09bnVsbClicmVha319fSk7cmV0dXJuIGU9ZS5yZWdpc3Rlck5vZGVUcmFuc2Zvcm0obixsPT57dmFyIHM9bC5nZXRUZXh0Q29udGVudCgpO2NvbnN0IGE9dChzKTthPT09bnVsbHx8YS5zdGFydCE9PTA/byhsKTpzLmxlbmd0aD5hLmVuZD9sLnNwbGl0VGV4dChhLmVuZCk6KHM9bC5nZXRQcmV2aW91c1NpYmxpbmcoKSxRdC4kaXNUZXh0Tm9kZShzKSYmcy5pc1RleHRFbnRpdHkoKSYmKG8ocyksbyhsKSkscz1sLmdldE5leHRTaWJsaW5nKCksUXQuJGlzVGV4dE5vZGUocykmJnMuaXNUZXh0RW50aXR5KCkmJihvKHMpLGwgaW5zdGFuY2VvZiBuJiZvKGwpKSl9KSxbaSxlXX07Y29uc3QgTTI9Rm87dmFyIEQyPU0yLGxTPXt9LGh1PWdlO2xTLnJlZ2lzdGVyRHJhZ29uU3VwcG9ydD1mdW5jdGlvbihlKXtsZXQgdD13aW5kb3cubG9jYXRpb24ub3JpZ2luLG49cj0+e2lmKHIub3JpZ2luPT09dCl7dmFyIG89ZS5nZXRSb290RWxlbWVudCgpO2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1vJiYobz1yLmRhdGEsdHlwZW9mIG89PSJzdHJpbmciKSl7dHJ5e3ZhciBpPUpTT04ucGFyc2Uobyl9Y2F0Y2h7cmV0dXJufWlmKGkmJmkucHJvdG9jb2w9PT0ibnVhbnJpYV9tZXNzYWdpbmciJiZpLnR5cGU9PT0icmVxdWVzdCImJihpPWkucGF5bG9hZCkmJmkuZnVuY3Rpb25JZD09PSJtYWtlQ2hhbmdlcyImJihpPWkuYXJncykpe2NvbnN0W2wscyxhLHUsY109aTtlLnVwZGF0ZSgoKT0+e2NvbnN0IGQ9aHUuJGdldFNlbGVjdGlvbigpO2lmKGh1LiRpc1JhbmdlU2VsZWN0aW9uKGQpKXt2YXIgZj1kLmFuY2hvcjtsZXQgaD1mLmdldE5vZGUoKSxnPTAsbT0wO2h1LiRpc1RleHROb2RlKGgpJiYwPD1sJiYwPD1zJiYoZz1sLG09bCtzLGQuc2V0VGV4dE5vZGVSYW5nZShoLGcsaCxtKSksKGchPT1tfHxhIT09IiIpJiYoZC5pbnNlcnRSYXdUZXh0KGEpLGg9Zi5nZXROb2RlKCkpLGh1LiRpc1RleHROb2RlKGgpJiYoZz11LG09dStjLGY9aC5nZXRUZXh0Q29udGVudFNpemUoKSxnPWc+Zj9mOmcsbT1tPmY/ZjptLGQuc2V0VGV4dE5vZGVSYW5nZShoLGcsaCxtKSksci5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX19KX19fX07cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuLCEwKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuLCEwKX19O2NvbnN0IEwyPWxTO3ZhciBJMj1MMiwkcj17fSxZcj17fSxvbT17fSxGeT1PbyxqMj1OdCx0bD1nZTtmdW5jdGlvbiBzUyhlLHQsbixyPW51bGwpe2xldCBvPXIhPW51bGw/dC5pc1NlbGVjdGVkKHIpOiEwLGk9dGwuJGlzRWxlbWVudE5vZGUodCkmJnQuZXhjbHVkZUZyb21Db3B5KCJodG1sIik7dmFyIGw9dDtyIT09bnVsbCYmKGw9RnkuJGNsb25lV2l0aFByb3BlcnRpZXModCksbD10bC4kaXNUZXh0Tm9kZShsKSYmciE9bnVsbD9GeS4kc2xpY2VTZWxlY3RlZFRleHROb2RlQ29udGVudChyLGwpOmwpO2xldCBzPXRsLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXSx7ZWxlbWVudDphLGFmdGVyOnV9PWwuZXhwb3J0RE9NKGUpO2lmKCFhKXJldHVybiExO2xldCBjPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IobGV0IGQ9MDtkPHMubGVuZ3RoO2QrKyl7bGV0IGY9c1tkXSxoPXNTKGUsZixjLHIpOyFvJiZ0bC4kaXNFbGVtZW50Tm9kZSh0KSYmaCYmdC5leHRyYWN0V2l0aENoaWxkKGYsciwiaHRtbCIpJiYobz0hMCl9cmV0dXJuIG8mJiFpPyhqMi5pc0hUTUxFbGVtZW50KGEpJiZhLmFwcGVuZChjKSxuLmFwcGVuZChhKSx1JiYoZT11LmNhbGwobCxhKSkmJmEucmVwbGFjZVdpdGgoZSkpOm4uYXBwZW5kKGMpLG99bGV0IGFTPW5ldyBTZXQoWyJTVFlMRSIsIlNDUklQVCJdKTtmdW5jdGlvbiB1UyhlLHQsbj1uZXcgTWFwLHIpe2xldCBvPVtdO2lmKGFTLmhhcyhlLm5vZGVOYW1lKSlyZXR1cm4gbztsZXQgaT1udWxsO3ZhciBsLHtub2RlTmFtZTpzfT1lLGE9dC5faHRtbENvbnZlcnNpb25zLmdldChzLnRvTG93ZXJDYXNlKCkpO2lmKHM9bnVsbCxhIT09dm9pZCAwKWZvcihsIG9mIGEpYT1sKGUpLGEhPT1udWxsJiYocz09PW51bGx8fHMucHJpb3JpdHk8YS5wcmlvcml0eSkmJihzPWEpO2lmKHM9KGw9cyE9PW51bGw/cy5jb252ZXJzaW9uOm51bGwpP2woZSk6bnVsbCxsPW51bGwscyE9PW51bGwpe2lmKGw9cy5hZnRlcixhPXMubm9kZSxpPUFycmF5LmlzQXJyYXkoYSk/YVthLmxlbmd0aC0xXTphLGkhPT1udWxsKXtmb3IodmFyWyx1XW9mIG4paWYoaT11KGksciksIWkpYnJlYWs7aSYmby5wdXNoKC4uLkFycmF5LmlzQXJyYXkoYSk/YTpbaV0pfXMuZm9yQ2hpbGQhPW51bGwmJm4uc2V0KGUubm9kZU5hbWUscy5mb3JDaGlsZCl9Zm9yKGU9ZS5jaGlsZE5vZGVzLHI9W10sdT0wO3U8ZS5sZW5ndGg7dSsrKXIucHVzaCguLi51UyhlW3VdLHQsbmV3IE1hcChuKSxpKSk7cmV0dXJuIGwhPW51bGwmJihyPWwocikpLGk9PW51bGw/bz1vLmNvbmNhdChyKTp0bC4kaXNFbGVtZW50Tm9kZShpKSYmaS5hcHBlbmQoLi4uciksb31vbS4kZ2VuZXJhdGVIdG1sRnJvbU5vZGVzPWZ1bmN0aW9uKGUsdCl7aWYodHlwZW9mIGRvY3VtZW50PiJ1Inx8dHlwZW9mIHdpbmRvdz4idSIpdGhyb3cgRXJyb3IoIlRvIHVzZSAkZ2VuZXJhdGVIdG1sRnJvbU5vZGVzIGluIGhlYWRsZXNzIG1vZGUgcGxlYXNlIGluaXRpYWxpemUgYSBoZWFkbGVzcyBicm93c2VyIGltcGxlbWVudGF0aW9uIHN1Y2ggYXMgSlNEb20gYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4iKTtsZXQgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxyPXRsLiRnZXRSb290KCkuZ2V0Q2hpbGRyZW4oKTtmb3IobGV0IG89MDtvPHIubGVuZ3RoO28rKylzUyhlLHJbb10sbix0KTtyZXR1cm4gbi5pbm5lckhUTUx9O29tLiRnZW5lcmF0ZU5vZGVzRnJvbURPTT1mdW5jdGlvbihlLHQpe3Q9dC5ib2R5P3QuYm9keS5jaGlsZE5vZGVzOltdO2xldCBuPVtdO2ZvcihsZXQgbz0wO288dC5sZW5ndGg7bysrKXt2YXIgcj10W29dO2FTLmhhcyhyLm5vZGVOYW1lKXx8KHI9dVMocixlKSxyIT09bnVsbCYmKG49bi5jb25jYXQocikpKX1yZXR1cm4gbn07Y29uc3QgejI9b207dmFyIEYyPXoyLGNTPUYyLGxwPU9vLGZsPU50LHVlPWdlO2Z1bmN0aW9uIEFyKGUpe2xldCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7dC5hcHBlbmQoImNvZGUiLGUpO2ZvcihsZXQgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdC5hcHBlbmQoInYiLGFyZ3VtZW50c1tuXSk7dGhyb3cgRXJyb3IoYE1pbmlmaWVkIExleGljYWwgZXJyb3IgIyR7ZX07IHZpc2l0IGh0dHBzOi8vbGV4aWNhbC5kZXYvZG9jcy9lcnJvcj8ke3R9IGZvciB0aGUgZnVsbCBtZXNzYWdlIG9yIHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgZnVsbCBlcnJvcnMgYW5kIGFkZGl0aW9uYWwgaGVscGZ1bCB3YXJuaW5ncy5gKX1sZXQgZFM9dHlwZW9mIHdpbmRvdzwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQ8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQ8InUiO2Z1bmN0aW9uIGZTKGUpe2xldCB0PXVlLiRnZXRTZWxlY3Rpb24oKTtpZih0PT1udWxsKXRocm93IEVycm9yKCJFeHBlY3RlZCB2YWxpZCBMZXhpY2FsU2VsZWN0aW9uIik7cmV0dXJuIHVlLiRpc1JhbmdlU2VsZWN0aW9uKHQpJiZ0LmlzQ29sbGFwc2VkKCl8fHQuZ2V0Tm9kZXMoKS5sZW5ndGg9PT0wPyIiOmNTLiRnZW5lcmF0ZUh0bWxGcm9tTm9kZXMoZSx0KX1mdW5jdGlvbiBoUyhlKXtsZXQgdD11ZS4kZ2V0U2VsZWN0aW9uKCk7aWYodD09bnVsbCl0aHJvdyBFcnJvcigiRXhwZWN0ZWQgdmFsaWQgTGV4aWNhbFNlbGVjdGlvbiIpO3JldHVybiB1ZS4kaXNSYW5nZVNlbGVjdGlvbih0KSYmdC5pc0NvbGxhcHNlZCgpfHx0LmdldE5vZGVzKCkubGVuZ3RoPT09MD9udWxsOkpTT04uc3RyaW5naWZ5KGdTKGUsdCkpfWZ1bmN0aW9uIHNwKGUsdCxuKXsodWUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pfHxmbC4kZmluZE1hdGNoaW5nUGFyZW50KG4uYW5jaG9yLmdldE5vZGUoKSxyPT51ZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZShyKSkhPT1udWxsJiZmbC4kZmluZE1hdGNoaW5nUGFyZW50KG4uZm9jdXMuZ2V0Tm9kZSgpLHI9PnVlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKHIpKSE9PW51bGwpJiZ0Lmxlbmd0aD09PTEmJnVlLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUodFswXSk/VzIodCxuLCExLGUpOkIyKHQsbil9ZnVuY3Rpb24gQjIoZSx0KXtsZXQgbj1bXSxyPW51bGw7Zm9yKGxldCBvPTA7bzxlLmxlbmd0aDtvKyspe2xldCBpPWVbb10sbD11ZS4kaXNMaW5lQnJlYWtOb2RlKGkpO2lmKGx8fHVlLiRpc0RlY29yYXRvck5vZGUoaSkmJmkuaXNJbmxpbmUoKXx8dWUuJGlzRWxlbWVudE5vZGUoaSkmJmkuaXNJbmxpbmUoKXx8dWUuJGlzVGV4dE5vZGUoaSl8fGkuaXNQYXJlbnRSZXF1aXJlZCgpKXtpZihyPT09bnVsbCYmKHI9aS5jcmVhdGVQYXJlbnRFbGVtZW50Tm9kZSgpLG4ucHVzaChyKSxsKSljb250aW51ZTtyIT09bnVsbCYmci5hcHBlbmQoaSl9ZWxzZSBuLnB1c2goaSkscj1udWxsfXVlLiRpc1JhbmdlU2VsZWN0aW9uKHQpP3QuaW5zZXJ0Tm9kZXMobik6dWUuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKHQpJiYoZT10LmFuY2hvci5nZXROb2RlKCksdWUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUoZSl8fEFyKDQxKSxlLmFwcGVuZCguLi5uKSl9ZnVuY3Rpb24gVzIoZSx0LG4scil7ZS5sZW5ndGg9PT0xJiZ1ZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKGVbMF0pfHxBcig0Mik7dmFyIG89ZVswXTtlPW8uZ2V0Q2hpbGRyZW4oKSxuPW8uZ2V0Rmlyc3RDaGlsZE9yVGhyb3coKS5nZXRDaGlsZHJlblNpemUoKTt2YXIgaT1vLmdldENoaWxkcmVuU2l6ZSgpLGw9ZmwuJGZpbmRNYXRjaGluZ1BhcmVudCh0LmFuY2hvci5nZXROb2RlKCksaD0+dWUuREVQUkVDQVRFRF8kaXNHcmlkQ2VsbE5vZGUoaCkpO3Q9KG89bCYmZmwuJGZpbmRNYXRjaGluZ1BhcmVudChsLGg9PnVlLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoaCkpKSYmZmwuJGZpbmRNYXRjaGluZ1BhcmVudChvLGg9PnVlLkRFUFJFQ0FURURfJGlzR3JpZE5vZGUoaCkpLHVlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKGwpJiZ1ZS5ERVBSRUNBVEVEXyRpc0dyaWRSb3dOb2RlKG8pJiZ1ZS5ERVBSRUNBVEVEXyRpc0dyaWROb2RlKHQpfHxBcig0Myk7dmFyIHM9by5nZXRJbmRleFdpdGhpblBhcmVudCgpLGE9TWF0aC5taW4odC5nZXRDaGlsZHJlblNpemUoKS0xLHMraS0xKTtpPWwuZ2V0SW5kZXhXaXRoaW5QYXJlbnQoKSxsPU1hdGgubWluKG8uZ2V0Q2hpbGRyZW5TaXplKCktMSxpK24tMSksbj1NYXRoLm1pbihpLGwpLG89TWF0aC5taW4ocyxhKSxpPU1hdGgubWF4KGksbCkscz1NYXRoLm1heChzLGEpLGE9dC5nZXRDaGlsZHJlbigpLGw9MDtsZXQgdSxjO2ZvcihsZXQgaD1vO2g8PXM7aCsrKXt2YXIgZD1hW2hdO3VlLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoZCl8fEFyKDI0KTt2YXIgZj1lW2xdO3VlLkRFUFJFQ0FURURfJGlzR3JpZFJvd05vZGUoZil8fEFyKDI0KSxkPWQuZ2V0Q2hpbGRyZW4oKSxmPWYuZ2V0Q2hpbGRyZW4oKTtsZXQgZz0wO2ZvcihsZXQgbT1uO208PWk7bSsrKXtsZXQgUz1kW21dO3VlLkRFUFJFQ0FURURfJGlzR3JpZENlbGxOb2RlKFMpfHxBcigyNSk7bGV0IHY9ZltnXTt1ZS5ERVBSRUNBVEVEXyRpc0dyaWRDZWxsTm9kZSh2KXx8QXIoMjUpLGg9PT1vJiZtPT09bj91PVMuZ2V0S2V5KCk6aD09PXMmJm09PT1pJiYoYz1TLmdldEtleSgpKTtsZXQgeT1TLmdldENoaWxkcmVuKCk7di5nZXRDaGlsZHJlbigpLmZvckVhY2goeD0+e3VlLiRpc1RleHROb2RlKHgpJiZ1ZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLmFwcGVuZCh4KSxTLmFwcGVuZCh4KX0pLHkuZm9yRWFjaCh4PT54LnJlbW92ZSgpKSxnKyt9bCsrfXUmJmMmJihlPXVlLkRFUFJFQ0FURURfJGNyZWF0ZUdyaWRTZWxlY3Rpb24oKSxlLnNldCh0LmdldEtleSgpLHUsYyksdWUuJHNldFNlbGVjdGlvbihlKSxyLmRpc3BhdGNoQ29tbWFuZCh1ZS5TRUxFQ1RJT05fQ0hBTkdFX0NPTU1BTkQsdm9pZCAwKSl9ZnVuY3Rpb24gcFMoZSx0LG4scj1bXSl7bGV0IG89dCE9bnVsbD9uLmlzU2VsZWN0ZWQodCk6ITAsaT11ZS4kaXNFbGVtZW50Tm9kZShuKSYmbi5leGNsdWRlRnJvbUNvcHkoImh0bWwiKTt2YXIgbD1uO2lmKHQhPT1udWxsKXt2YXIgcz1scC4kY2xvbmVXaXRoUHJvcGVydGllcyhuKTtsPXM9dWUuJGlzVGV4dE5vZGUocykmJnQhPW51bGw/bHAuJHNsaWNlU2VsZWN0ZWRUZXh0Tm9kZUNvbnRlbnQodCxzKTpzfWxldCBhPXVlLiRpc0VsZW1lbnROb2RlKGwpP2wuZ2V0Q2hpbGRyZW4oKTpbXTt2YXIgdT1sO3M9dS5leHBvcnRKU09OKCk7dmFyIGM9dS5jb25zdHJ1Y3RvcjtzLnR5cGUhPT1jLmdldFR5cGUoKSYmQXIoNTgsYy5uYW1lKTtsZXQgZD1zLmNoaWxkcmVuO2Zvcih1ZS4kaXNFbGVtZW50Tm9kZSh1KSYmKEFycmF5LmlzQXJyYXkoZCl8fEFyKDU5LGMubmFtZSkpLHVlLiRpc1RleHROb2RlKGwpJiYobD1sLl9fdGV4dCwwPGwubGVuZ3RoP3MudGV4dD1sOm89ITEpLGw9MDtsPGEubGVuZ3RoO2wrKyl1PWFbbF0sYz1wUyhlLHQsdSxzLmNoaWxkcmVuKSwhbyYmdWUuJGlzRWxlbWVudE5vZGUobikmJmMmJm4uZXh0cmFjdFdpdGhDaGlsZCh1LHQsImNsb25lIikmJihvPSEwKTtpZihvJiYhaSlyLnB1c2gocyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHMuY2hpbGRyZW4pKWZvcihlPTA7ZTxzLmNoaWxkcmVuLmxlbmd0aDtlKyspci5wdXNoKHMuY2hpbGRyZW5bZV0pO3JldHVybiBvfWZ1bmN0aW9uIGdTKGUsdCl7bGV0IG49W10scj11ZS4kZ2V0Um9vdCgpLmdldENoaWxkcmVuKCk7Zm9yKGxldCBvPTA7bzxyLmxlbmd0aDtvKyspcFMoZSx0LHJbb10sbik7cmV0dXJue25hbWVzcGFjZTplLl9jb25maWcubmFtZXNwYWNlLG5vZGVzOm59fWZ1bmN0aW9uIG1TKGUpe2xldCB0PVtdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgcj11ZS4kcGFyc2VTZXJpYWxpemVkTm9kZShlW25dKTt1ZS4kaXNUZXh0Tm9kZShyKSYmbHAuJGFkZE5vZGVTdHlsZShyKSx0LnB1c2gocil9cmV0dXJuIHR9bGV0IEFpPW51bGw7ZnVuY3Rpb24gQnkoZSx0KXt2YXIgbj1kUz8oZS5fd2luZG93fHx3aW5kb3cpLmdldFNlbGVjdGlvbigpOm51bGw7aWYoIW4pcmV0dXJuITE7dmFyIHI9bi5hbmNob3JOb2RlO2lmKG49bi5mb2N1c05vZGUsciE9PW51bGwmJm4hPT1udWxsJiYhdWUuaXNTZWxlY3Rpb25XaXRoaW5FZGl0b3IoZSxyLG4pfHwodC5wcmV2ZW50RGVmYXVsdCgpLHQ9dC5jbGlwYm9hcmREYXRhLHI9dWUuJGdldFNlbGVjdGlvbigpLHQ9PT1udWxsfHxyPT09bnVsbCkpcmV0dXJuITE7bj1mUyhlKSxlPWhTKGUpO2xldCBvPSIiO3JldHVybiByIT09bnVsbCYmKG89ci5nZXRUZXh0Q29udGVudCgpKSxuIT09bnVsbCYmdC5zZXREYXRhKCJ0ZXh0L2h0bWwiLG4pLGUhPT1udWxsJiZ0LnNldERhdGEoImFwcGxpY2F0aW9uL3gtbGV4aWNhbC1lZGl0b3IiLGUpLHQuc2V0RGF0YSgidGV4dC9wbGFpbiIsbyksITB9WXIuJGdlbmVyYXRlSlNPTkZyb21TZWxlY3RlZE5vZGVzPWdTO1lyLiRnZW5lcmF0ZU5vZGVzRnJvbVNlcmlhbGl6ZWROb2Rlcz1tUztZci4kZ2V0SHRtbENvbnRlbnQ9ZlM7WXIuJGdldExleGljYWxDb250ZW50PWhTO1lyLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JQbGFpblRleHQ9ZnVuY3Rpb24oZSx0KXtlPWUuZ2V0RGF0YSgidGV4dC9wbGFpbiIpfHxlLmdldERhdGEoInRleHQvdXJpLWxpc3QiKSxlIT1udWxsJiZ0Lmluc2VydFJhd1RleHQoZSl9O1lyLiRpbnNlcnREYXRhVHJhbnNmZXJGb3JSaWNoVGV4dD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5nZXREYXRhKCJhcHBsaWNhdGlvbi94LWxleGljYWwtZWRpdG9yIik7aWYocil0cnl7bGV0IGw9SlNPTi5wYXJzZShyKTtpZihsLm5hbWVzcGFjZT09PW4uX2NvbmZpZy5uYW1lc3BhY2UmJkFycmF5LmlzQXJyYXkobC5ub2Rlcykpe2xldCBzPW1TKGwubm9kZXMpO3JldHVybiBzcChuLHMsdCl9fWNhdGNoe31pZihyPWUuZ2V0RGF0YSgidGV4dC9odG1sIikpdHJ5e3ZhciBvPW5ldyBET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcociwidGV4dC9odG1sIiksaT1jUy4kZ2VuZXJhdGVOb2Rlc0Zyb21ET00obixvKTtyZXR1cm4gc3AobixpLHQpfWNhdGNoe31pZihlPWUuZ2V0RGF0YSgidGV4dC9wbGFpbiIpfHxlLmdldERhdGEoInRleHQvdXJpLWxpc3QiKSxlIT1udWxsKWlmKHVlLiRpc1JhbmdlU2VsZWN0aW9uKHQpKWZvcihlPWUuc3BsaXQoLyhccj9cbnxcdCkvKSxuPWUubGVuZ3RoLG89MDtvPG47bysrKWk9ZVtvXSxpPT09YApgfHxpPT09YFxyCmA/dC5pbnNlcnRQYXJhZ3JhcGgoKTppPT09IgkiP3QuaW5zZXJ0Tm9kZXMoW3VlLiRjcmVhdGVUYWJOb2RlKCldKTp0Lmluc2VydFRleHQoaSk7ZWxzZSB0Lmluc2VydFJhd1RleHQoZSl9O1lyLiRpbnNlcnRHZW5lcmF0ZWROb2Rlcz1zcDtZci5jb3B5VG9DbGlwYm9hcmQ9YXN5bmMgZnVuY3Rpb24oZSx0KXtpZihBaSE9PW51bGwpcmV0dXJuITE7aWYodCE9PW51bGwpcmV0dXJuIG5ldyBQcm9taXNlKGw9PntlLnVwZGF0ZSgoKT0+e2woQnkoZSx0KSl9KX0pO3ZhciBuPWUuZ2V0Um9vdEVsZW1lbnQoKTtsZXQgcj1lLl93aW5kb3c9PW51bGw/d2luZG93LmRvY3VtZW50OmUuX3dpbmRvdy5kb2N1bWVudCxvPWRTPyhlLl93aW5kb3d8fHdpbmRvdykuZ2V0U2VsZWN0aW9uKCk6bnVsbDtpZihuPT09bnVsbHx8bz09PW51bGwpcmV0dXJuITE7bGV0IGk9ci5jcmVhdGVFbGVtZW50KCJzcGFuIik7cmV0dXJuIGkuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246IGZpeGVkOyB0b3A6IC0xMDAwcHg7IixpLmFwcGVuZChyLmNyZWF0ZVRleHROb2RlKCIjIikpLG4uYXBwZW5kKGkpLG49bmV3IFJhbmdlLG4uc2V0U3RhcnQoaSwwKSxuLnNldEVuZChpLDEpLG8ucmVtb3ZlQWxsUmFuZ2VzKCksby5hZGRSYW5nZShuKSxuZXcgUHJvbWlzZShsPT57bGV0IHM9ZS5yZWdpc3RlckNvbW1hbmQodWUuQ09QWV9DT01NQU5ELGE9PihmbC5vYmplY3RLbGFzc0VxdWFscyhhLENsaXBib2FyZEV2ZW50KSYmKHMoKSxBaSE9PW51bGwmJih3aW5kb3cuY2xlYXJUaW1lb3V0KEFpKSxBaT1udWxsKSxsKEJ5KGUsYSkpKSwhMCksdWUuQ09NTUFORF9QUklPUklUWV9DUklUSUNBTCk7QWk9d2luZG93LnNldFRpbWVvdXQoKCk9PntzKCksQWk9bnVsbCxsKCExKX0sNTApLHIuZXhlY0NvbW1hbmQoImNvcHkiKSxpLnJlbW92ZSgpfSl9O2NvbnN0IFUyPVlyO3ZhciBWMj1VMixOYz1WMixwdT1Pbyxkcj1OdCxiPWdlO2Z1bmN0aW9uIFd5KGUsdCl7cmV0dXJuIHR5cGVvZiBkb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50PCJ1Ij8oZT1kb2N1bWVudC5jYXJldFJhbmdlRnJvbVBvaW50KGUsdCksZT09PW51bGw/bnVsbDp7bm9kZTplLnN0YXJ0Q29udGFpbmVyLG9mZnNldDplLnN0YXJ0T2Zmc2V0fSk6ZG9jdW1lbnQuY2FyZXRQb3NpdGlvbkZyb21Qb2ludCE9PSJ1bmRlZmluZWQiPyhlPWRvY3VtZW50LmNhcmV0UG9zaXRpb25Gcm9tUG9pbnQoZSx0KSxlPT09bnVsbD9udWxsOntub2RlOmUub2Zmc2V0Tm9kZSxvZmZzZXQ6ZS5vZmZzZXR9KTpudWxsfWxldCBWbD10eXBlb2Ygd2luZG93PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudDwidSImJnR5cGVvZiB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIsSDI9VmwmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQ/ZG9jdW1lbnQuZG9jdW1lbnRNb2RlOm51bGwsSzI9VmwmJiJJbnB1dEV2ZW50ImluIHdpbmRvdyYmIUgyPyJnZXRUYXJnZXRSYW5nZXMiaW4gbmV3IHdpbmRvdy5JbnB1dEV2ZW50KCJpbnB1dCIpOiExLEcyPVZsJiYvVmVyc2lvblwvW1xkLl0rLipTYWZhcmkvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksWTI9VmwmJi9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiYhd2luZG93Lk1TU3RyZWFtLFgyPVZsJiYvXig/PS4qQ2hyb21lKS4qL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSxRMj1WbCYmL0FwcGxlV2ViS2l0XC9bXGQuXSsvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiFYMixhcD1iLmNyZWF0ZUNvbW1hbmQoIkRSQUdfRFJPUF9QQVNURV9GSUxFIiksaW09Y2xhc3MgdlMgZXh0ZW5kcyBiLkVsZW1lbnROb2Rle3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuInF1b3RlIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyB2Uyh0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0KXtzdXBlcih0KX1jcmVhdGVET00odCl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYmxvY2txdW90ZSIpO3JldHVybiBkci5hZGRDbGFzc05hbWVzVG9FbGVtZW50KG4sdC50aGVtZS5xdW90ZSksbn11cGRhdGVET00oKXtyZXR1cm4hMX1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJue2Jsb2NrcXVvdGU6KCk9Pih7Y29udmVyc2lvbjpKMixwcmlvcml0eTowfSl9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmZHIuaXNIVE1MRWxlbWVudCh0KSl7dGhpcy5pc0VtcHR5KCkmJnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciBuPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO3Quc3R5bGUudGV4dEFsaWduPW4sKG49dGhpcy5nZXREaXJlY3Rpb24oKSkmJih0LmRpcj1uKX1yZXR1cm57ZWxlbWVudDp0fX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1sbSgpO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufWV4cG9ydEpTT04oKXtyZXR1cm57Li4uc3VwZXIuZXhwb3J0SlNPTigpLHR5cGU6InF1b3RlIn19aW5zZXJ0TmV3QWZ0ZXIodCxuKXt0PWIuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgcj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiB0LnNldERpcmVjdGlvbihyKSx0aGlzLmluc2VydEFmdGVyKHQsbiksdH1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgdD1iLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG49PnQuYXBwZW5kKG4pKSx0aGlzLnJlcGxhY2UodCksITB9fTtmdW5jdGlvbiBsbSgpe3JldHVybiBiLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgaW0pfWxldCBzbT1jbGFzcyB5UyBleHRlbmRzIGIuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4iaGVhZGluZyJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgeVModC5fX3RhZyx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKG4pLHRoaXMuX190YWc9dH1nZXRUYWcoKXtyZXR1cm4gdGhpcy5fX3RhZ31jcmVhdGVET00odCl7bGV0IG49dGhpcy5fX3RhZyxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobik7cmV0dXJuIHQ9dC50aGVtZS5oZWFkaW5nLHQhPT12b2lkIDAmJmRyLmFkZENsYXNzTmFtZXNUb0VsZW1lbnQocix0W25dKSxyfXVwZGF0ZURPTSgpe3JldHVybiExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57aDE6KCk9Pih7Y29udmVyc2lvbjpNaSxwcmlvcml0eTowfSksaDI6KCk9Pih7Y29udmVyc2lvbjpNaSxwcmlvcml0eTowfSksaDM6KCk9Pih7Y29udmVyc2lvbjpNaSxwcmlvcml0eTowfSksaDQ6KCk9Pih7Y29udmVyc2lvbjpNaSxwcmlvcml0eTowfSksaDU6KCk9Pih7Y29udmVyc2lvbjpNaSxwcmlvcml0eTowfSksaDY6KCk9Pih7Y29udmVyc2lvbjpNaSxwcmlvcml0eTowfSkscDp0PT4odD10LmZpcnN0Q2hpbGQsdCE9PW51bGwmJlV5KHQpP3tjb252ZXJzaW9uOigpPT4oe25vZGU6bnVsbH0pLHByaW9yaXR5OjN9Om51bGwpLHNwYW46dD0+VXkodCk/e2NvbnZlcnNpb246KCk9Pih7bm9kZTpubCgiaDEiKX0pLHByaW9yaXR5OjN9Om51bGx9fWV4cG9ydERPTSh0KXtpZih7ZWxlbWVudDp0fT1zdXBlci5leHBvcnRET00odCksdCYmZHIuaXNIVE1MRWxlbWVudCh0KSl7dGhpcy5pc0VtcHR5KCkmJnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpO3ZhciBuPXRoaXMuZ2V0Rm9ybWF0VHlwZSgpO3Quc3R5bGUudGV4dEFsaWduPW4sKG49dGhpcy5nZXREaXJlY3Rpb24oKSkmJih0LmRpcj1uKX1yZXR1cm57ZWxlbWVudDp0fX1zdGF0aWMgaW1wb3J0SlNPTih0KXtsZXQgbj1ubCh0LnRhZyk7cmV0dXJuIG4uc2V0Rm9ybWF0KHQuZm9ybWF0KSxuLnNldEluZGVudCh0LmluZGVudCksbi5zZXREaXJlY3Rpb24odC5kaXJlY3Rpb24pLG59ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdGFnOnRoaXMuZ2V0VGFnKCksdHlwZToiaGVhZGluZyIsdmVyc2lvbjoxfX1pbnNlcnROZXdBZnRlcih0LG49ITApe3Q9dD90LmFuY2hvci5vZmZzZXQ6MCx0PTA8dCYmdDx0aGlzLmdldFRleHRDb250ZW50U2l6ZSgpP25sKHRoaXMuZ2V0VGFnKCkpOmIuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKTtsZXQgcj10aGlzLmdldERpcmVjdGlvbigpO3JldHVybiB0LnNldERpcmVjdGlvbihyKSx0aGlzLmluc2VydEFmdGVyKHQsbiksdH1jb2xsYXBzZUF0U3RhcnQoKXtsZXQgdD10aGlzLmlzRW1wdHkoKT9iLiRjcmVhdGVQYXJhZ3JhcGhOb2RlKCk6bmwodGhpcy5nZXRUYWcoKSk7cmV0dXJuIHRoaXMuZ2V0Q2hpbGRyZW4oKS5mb3JFYWNoKG49PnQuYXBwZW5kKG4pKSx0aGlzLnJlcGxhY2UodCksITB9ZXh0cmFjdFdpdGhDaGlsZCgpe3JldHVybiEwfX07ZnVuY3Rpb24gVXkoZSl7cmV0dXJuIGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKT09PSJzcGFuIj9lLnN0eWxlLmZvbnRTaXplPT09IjI2cHQiOiExfWZ1bmN0aW9uIE1pKGUpe2xldCB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxuPW51bGw7cmV0dXJuKHQ9PT0iaDEifHx0PT09ImgyInx8dD09PSJoMyJ8fHQ9PT0iaDQifHx0PT09Img1Inx8dD09PSJoNiIpJiYobj1ubCh0KSxlLnN0eWxlIT09bnVsbCYmbi5zZXRGb3JtYXQoZS5zdHlsZS50ZXh0QWxpZ24pKSx7bm9kZTpufX1mdW5jdGlvbiBKMihlKXtsZXQgdD1sbSgpO3JldHVybiBlLnN0eWxlIT09bnVsbCYmdC5zZXRGb3JtYXQoZS5zdHlsZS50ZXh0QWxpZ24pLHtub2RlOnR9fWZ1bmN0aW9uIG5sKGUpe3JldHVybiBiLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgc20oZSkpfWZ1bmN0aW9uIFoyKGUsdCl7ZS5wcmV2ZW50RGVmYXVsdCgpLHQudXBkYXRlKCgpPT57bGV0IG49Yi4kZ2V0U2VsZWN0aW9uKCkscj1lIGluc3RhbmNlb2YgSW5wdXRFdmVudHx8ZSBpbnN0YW5jZW9mIEtleWJvYXJkRXZlbnQ/bnVsbDplLmNsaXBib2FyZERhdGE7ciE9bnVsbCYmKGIuJGlzUmFuZ2VTZWxlY3Rpb24obil8fGIuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pKSYmTmMuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KHIsbix0KX0se3RhZzoicGFzdGUifSl9YXN5bmMgZnVuY3Rpb24gcTIoZSx0KXthd2FpdCBOYy5jb3B5VG9DbGlwYm9hcmQodCxkci5vYmplY3RLbGFzc0VxdWFscyhlLENsaXBib2FyZEV2ZW50KT9lOm51bGwpLHQudXBkYXRlKCgpPT57bGV0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7Yi4kaXNSYW5nZVNlbGVjdGlvbihuKT9uLnJlbW92ZVRleHQoKTpiLiRpc05vZGVTZWxlY3Rpb24obikmJm4uZ2V0Tm9kZXMoKS5mb3JFYWNoKHI9PnIucmVtb3ZlKCkpfSl9ZnVuY3Rpb24gd3MoZSl7bGV0IHQ9bnVsbDtpZihlIGluc3RhbmNlb2YgRHJhZ0V2ZW50P3Q9ZS5kYXRhVHJhbnNmZXI6ZSBpbnN0YW5jZW9mIENsaXBib2FyZEV2ZW50JiYodD1lLmNsaXBib2FyZERhdGEpLHQ9PT1udWxsKXJldHVyblshMSxbXSwhMV07dmFyIG49dC50eXBlcztyZXR1cm4gZT1uLmluY2x1ZGVzKCJGaWxlcyIpLG49bi5pbmNsdWRlcygidGV4dC9odG1sIil8fG4uaW5jbHVkZXMoInRleHQvcGxhaW4iKSxbZSxBcnJheS5mcm9tKHQuZmlsZXMpLG5dfWZ1bmN0aW9uIFZ5KGUpe3ZhciB0PWIuJGdldFNlbGVjdGlvbigpO2lmKCFiLiRpc1JhbmdlU2VsZWN0aW9uKHQpKXJldHVybiExO2xldCBuPW5ldyBTZXQ7dD10LmdldE5vZGVzKCk7Zm9yKGxldCBpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciByPXRbaV0sbz1yLmdldEtleSgpO24uaGFzKG8pfHwocj1kci4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdyhyKSxvPXIuZ2V0S2V5KCksci5jYW5JbmRlbnQoKSYmIW4uaGFzKG8pJiYobi5hZGQobyksZShyKSkpfXJldHVybiAwPG4uc2l6ZX1mdW5jdGlvbiBndShlKXtyZXR1cm4gZT1iLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKGUpLGIuJGlzRGVjb3JhdG9yTm9kZShlKX0kci4kY3JlYXRlSGVhZGluZ05vZGU9bmw7JHIuJGNyZWF0ZVF1b3RlTm9kZT1sbTskci4kaXNIZWFkaW5nTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIHNtfTskci4kaXNRdW90ZU5vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBpbX07JHIuRFJBR19EUk9QX1BBU1RFPWFwOyRyLkhlYWRpbmdOb2RlPXNtOyRyLlF1b3RlTm9kZT1pbTskci5ldmVudEZpbGVzPXdzOyRyLnJlZ2lzdGVyUmljaFRleHQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGRyLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoYi5DTElDS19DT01NQU5ELCgpPT57Y29uc3QgdD1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gYi4kaXNOb2RlU2VsZWN0aW9uKHQpPyh0LmNsZWFyKCksITApOiExfSwwKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkRFTEVURV9DSEFSQUNURVJfQ09NTUFORCx0PT57Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gYi4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5kZWxldGVDaGFyYWN0ZXIodCksITApOiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkRFTEVURV9XT1JEX0NPTU1BTkQsdD0+e2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIGIuJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uZGVsZXRlV29yZCh0KSwhMCk6ITF9LGIuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKGIuREVMRVRFX0xJTkVfQ09NTUFORCx0PT57Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gYi4kaXNSYW5nZVNlbGVjdGlvbihuKT8obi5kZWxldGVMaW5lKHQpLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5DT05UUk9MTEVEX1RFWFRfSU5TRVJUSU9OX0NPTU1BTkQsdD0+e2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7aWYodHlwZW9mIHQ9PSJzdHJpbmciKWIuJGlzUmFuZ2VTZWxlY3Rpb24obik/bi5pbnNlcnRUZXh0KHQpOmIuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKG4pO2Vsc2V7aWYoIWIuJGlzUmFuZ2VTZWxlY3Rpb24obikmJiFiLkRFUFJFQ0FURURfJGlzR3JpZFNlbGVjdGlvbihuKSlyZXR1cm4hMTtjb25zdCByPXQuZGF0YVRyYW5zZmVyO3IhPW51bGw/TmMuJGluc2VydERhdGFUcmFuc2ZlckZvclJpY2hUZXh0KHIsbixlKTpiLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYodD10LmRhdGEpJiZuLmluc2VydFRleHQodCl9cmV0dXJuITB9LGIuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKGIuUkVNT1ZFX1RFWFRfQ09NTUFORCwoKT0+e2NvbnN0IHQ9Yi4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIGIuJGlzUmFuZ2VTZWxlY3Rpb24odCk/KHQucmVtb3ZlVGV4dCgpLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5GT1JNQVRfVEVYVF9DT01NQU5ELHQ9Pntjb25zdCBuPWIuJGdldFNlbGVjdGlvbigpO3JldHVybiBiLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyhuLmZvcm1hdFRleHQodCksITApOiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkZPUk1BVF9FTEVNRU5UX0NPTU1BTkQsdD0+e3ZhciBuPWIuJGdldFNlbGVjdGlvbigpO2lmKCFiLiRpc1JhbmdlU2VsZWN0aW9uKG4pJiYhYi4kaXNOb2RlU2VsZWN0aW9uKG4pKXJldHVybiExO249bi5nZXROb2RlcygpO2Zvcihjb25zdCByIG9mIG4pbj1kci4kZmluZE1hdGNoaW5nUGFyZW50KHIsbz0+Yi4kaXNFbGVtZW50Tm9kZShvKSYmIW8uaXNJbmxpbmUoKSksbiE9PW51bGwmJm4uc2V0Rm9ybWF0KHQpO3JldHVybiEwfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLklOU0VSVF9MSU5FX0JSRUFLX0NPTU1BTkQsdD0+e2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7cmV0dXJuIGIuJGlzUmFuZ2VTZWxlY3Rpb24obik/KG4uaW5zZXJ0TGluZUJyZWFrKHQpLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsKCk9Pntjb25zdCB0PWIuJGdldFNlbGVjdGlvbigpO3JldHVybiBiLiRpc1JhbmdlU2VsZWN0aW9uKHQpPyh0Lmluc2VydFBhcmFncmFwaCgpLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5JTlNFUlRfVEFCX0NPTU1BTkQsKCk9PihiLiRpbnNlcnROb2RlcyhbYi4kY3JlYXRlVGFiTm9kZSgpXSksITApLGIuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKGIuSU5ERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+VnkodD0+e2NvbnN0IG49dC5nZXRJbmRlbnQoKTt0LnNldEluZGVudChuKzEpfSksYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCwoKT0+VnkodD0+e2NvbnN0IG49dC5nZXRJbmRlbnQoKTswPG4mJnQuc2V0SW5kZW50KG4tMSl9KSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLktFWV9BUlJPV19VUF9DT01NQU5ELHQ9Pnt2YXIgbj1iLiRnZXRTZWxlY3Rpb24oKTtpZihiLiRpc05vZGVTZWxlY3Rpb24obikmJiFndSh0LnRhcmdldCkpe2lmKHQ9bi5nZXROb2RlcygpLDA8dC5sZW5ndGgpcmV0dXJuIHRbMF0uc2VsZWN0UHJldmlvdXMoKSwhMH1lbHNlIGlmKGIuJGlzUmFuZ2VTZWxlY3Rpb24obikmJihuPWIuJGdldEFkamFjZW50Tm9kZShuLmZvY3VzLCEwKSwhdC5zaGlmdEtleSYmYi4kaXNEZWNvcmF0b3JOb2RlKG4pJiYhbi5pc0lzb2xhdGVkKCkmJiFuLmlzSW5saW5lKCkpKXJldHVybiBuLnNlbGVjdFByZXZpb3VzKCksdC5wcmV2ZW50RGVmYXVsdCgpLCEwO3JldHVybiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLktFWV9BUlJPV19ET1dOX0NPTU1BTkQsdD0+e3ZhciBuPWIuJGdldFNlbGVjdGlvbigpO2lmKGIuJGlzTm9kZVNlbGVjdGlvbihuKSl7aWYodD1uLmdldE5vZGVzKCksMDx0Lmxlbmd0aClyZXR1cm4gdFswXS5zZWxlY3ROZXh0KDAsMCksITB9ZWxzZSBpZihiLiRpc1JhbmdlU2VsZWN0aW9uKG4pKXtsZXQgcj1uLmZvY3VzO2lmKHIua2V5PT09InJvb3QiJiZyLm9mZnNldD09PWIuJGdldFJvb3QoKS5nZXRDaGlsZHJlblNpemUoKSlyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLCEwO2lmKG49Yi4kZ2V0QWRqYWNlbnROb2RlKG4uZm9jdXMsITEpLCF0LnNoaWZ0S2V5JiZiLiRpc0RlY29yYXRvck5vZGUobikmJiFuLmlzSXNvbGF0ZWQoKSYmIW4uaXNJbmxpbmUoKSlyZXR1cm4gbi5zZWxlY3ROZXh0KCksdC5wcmV2ZW50RGVmYXVsdCgpLCEwfXJldHVybiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLktFWV9BUlJPV19MRUZUX0NPTU1BTkQsdD0+e2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7aWYoYi4kaXNOb2RlU2VsZWN0aW9uKG4pKXt2YXIgcj1uLmdldE5vZGVzKCk7aWYoMDxyLmxlbmd0aClyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLHJbMF0uc2VsZWN0UHJldmlvdXMoKSwhMH1yZXR1cm4gYi4kaXNSYW5nZVNlbGVjdGlvbihuKSYmcHUuJHNob3VsZE92ZXJyaWRlRGVmYXVsdENoYXJhY3RlclNlbGVjdGlvbihuLCEwKT8ocj10LnNoaWZ0S2V5LHQucHJldmVudERlZmF1bHQoKSxwdS4kbW92ZUNoYXJhY3RlcihuLHIsITApLCEwKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5LRVlfQVJST1dfUklHSFRfQ09NTUFORCx0PT57Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtpZihiLiRpc05vZGVTZWxlY3Rpb24obikmJiFndSh0LnRhcmdldCkpe3ZhciByPW4uZ2V0Tm9kZXMoKTtpZigwPHIubGVuZ3RoKXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksclswXS5zZWxlY3ROZXh0KDAsMCksITB9cmV0dXJuIGIuJGlzUmFuZ2VTZWxlY3Rpb24obik/KHI9dC5zaGlmdEtleSxwdS4kc2hvdWxkT3ZlcnJpZGVEZWZhdWx0Q2hhcmFjdGVyU2VsZWN0aW9uKG4sITEpPyh0LnByZXZlbnREZWZhdWx0KCkscHUuJG1vdmVDaGFyYWN0ZXIobixyLCExKSwhMCk6ITEpOiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLktFWV9CQUNLU1BBQ0VfQ09NTUFORCx0PT57aWYoZ3UodC50YXJnZXQpKXJldHVybiExO2NvbnN0IG49Yi4kZ2V0U2VsZWN0aW9uKCk7aWYoIWIuJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7dC5wcmV2ZW50RGVmYXVsdCgpLHthbmNob3I6dH09bjtjb25zdCByPXQuZ2V0Tm9kZSgpO3JldHVybiBuLmlzQ29sbGFwc2VkKCkmJnQub2Zmc2V0PT09MCYmIWIuJGlzUm9vdE5vZGUocikmJjA8ZHIuJGdldE5lYXJlc3RCbG9ja0VsZW1lbnRBbmNlc3Rvck9yVGhyb3cocikuZ2V0SW5kZW50KCk/ZS5kaXNwYXRjaENvbW1hbmQoYi5PVVRERU5UX0NPTlRFTlRfQ09NTUFORCx2b2lkIDApOmUuZGlzcGF0Y2hDb21tYW5kKGIuREVMRVRFX0NIQVJBQ1RFUl9DT01NQU5ELCEwKX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5LRVlfREVMRVRFX0NPTU1BTkQsdD0+e2lmKGd1KHQudGFyZ2V0KSlyZXR1cm4hMTtjb25zdCBuPWIuJGdldFNlbGVjdGlvbigpO3JldHVybiBiLiRpc1JhbmdlU2VsZWN0aW9uKG4pPyh0LnByZXZlbnREZWZhdWx0KCksZS5kaXNwYXRjaENvbW1hbmQoYi5ERUxFVEVfQ0hBUkFDVEVSX0NPTU1BTkQsITEpKTohMX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5LRVlfRU5URVJfQ09NTUFORCx0PT57Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtpZighYi4kaXNSYW5nZVNlbGVjdGlvbihuKSlyZXR1cm4hMTtpZih0IT09bnVsbCl7aWYoKFkyfHxHMnx8UTIpJiZLMilyZXR1cm4hMTtpZih0LnByZXZlbnREZWZhdWx0KCksdC5zaGlmdEtleSlyZXR1cm4gZS5kaXNwYXRjaENvbW1hbmQoYi5JTlNFUlRfTElORV9CUkVBS19DT01NQU5ELCExKX1yZXR1cm4gZS5kaXNwYXRjaENvbW1hbmQoYi5JTlNFUlRfUEFSQUdSQVBIX0NPTU1BTkQsdm9pZCAwKX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5LRVlfRVNDQVBFX0NPTU1BTkQsKCk9Pntjb25zdCB0PWIuJGdldFNlbGVjdGlvbigpO3JldHVybiBiLiRpc1JhbmdlU2VsZWN0aW9uKHQpPyhlLmJsdXIoKSwhMCk6ITF9LGIuQ09NTUFORF9QUklPUklUWV9FRElUT1IpLGUucmVnaXN0ZXJDb21tYW5kKGIuRFJPUF9DT01NQU5ELHQ9Pntjb25zdFssbl09d3ModCk7aWYoMDxuLmxlbmd0aCl7dmFyIHI9V3kodC5jbGllbnRYLHQuY2xpZW50WSk7aWYociE9PW51bGwpe2NvbnN0e29mZnNldDppLG5vZGU6bH09cjt2YXIgbz1iLiRnZXROZWFyZXN0Tm9kZUZyb21ET01Ob2RlKGwpO2lmKG8hPT1udWxsKXtpZihyPWIuJGNyZWF0ZVJhbmdlU2VsZWN0aW9uKCksYi4kaXNUZXh0Tm9kZShvKSlyLmFuY2hvci5zZXQoby5nZXRLZXkoKSxpLCJ0ZXh0Iiksci5mb2N1cy5zZXQoby5nZXRLZXkoKSxpLCJ0ZXh0Iik7ZWxzZXtjb25zdCBzPW8uZ2V0UGFyZW50T3JUaHJvdygpLmdldEtleSgpO289by5nZXRJbmRleFdpdGhpblBhcmVudCgpKzEsci5hbmNob3Iuc2V0KHMsbywiZWxlbWVudCIpLHIuZm9jdXMuc2V0KHMsbywiZWxlbWVudCIpfXI9Yi4kbm9ybWFsaXplU2VsZWN0aW9uX19FWFBFUklNRU5UQUwociksYi4kc2V0U2VsZWN0aW9uKHIpfWUuZGlzcGF0Y2hDb21tYW5kKGFwLG4pfXJldHVybiB0LnByZXZlbnREZWZhdWx0KCksITB9cmV0dXJuIHQ9Yi4kZ2V0U2VsZWN0aW9uKCksISFiLiRpc1JhbmdlU2VsZWN0aW9uKHQpfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkRSQUdTVEFSVF9DT01NQU5ELHQ9PntbdF09d3ModCk7Y29uc3Qgbj1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4hKHQmJiFiLiRpc1JhbmdlU2VsZWN0aW9uKG4pKX0sYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5EUkFHT1ZFUl9DT01NQU5ELHQ9Pnt2YXJbbl09d3ModCk7Y29uc3Qgcj1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gbiYmIWIuJGlzUmFuZ2VTZWxlY3Rpb24ocik/ITE6KG49V3kodC5jbGllbnRYLHQuY2xpZW50WSksbiE9PW51bGwmJihuPWIuJGdldE5lYXJlc3ROb2RlRnJvbURPTU5vZGUobi5ub2RlKSxiLiRpc0RlY29yYXRvck5vZGUobikmJnQucHJldmVudERlZmF1bHQoKSksITApfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLlNFTEVDVF9BTExfQ09NTUFORCwoKT0+KGIuJHNlbGVjdEFsbCgpLCEwKSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSxlLnJlZ2lzdGVyQ29tbWFuZChiLkNPUFlfQ09NTUFORCx0PT4oTmMuY29weVRvQ2xpcGJvYXJkKGUsZHIub2JqZWN0S2xhc3NFcXVhbHModCxDbGlwYm9hcmRFdmVudCk/dDpudWxsKSwhMCksYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5DVVRfQ09NTUFORCx0PT4ocTIodCxlKSwhMCksYi5DT01NQU5EX1BSSU9SSVRZX0VESVRPUiksZS5yZWdpc3RlckNvbW1hbmQoYi5QQVNURV9DT01NQU5ELHQ9Pntjb25zdFssbixyXT13cyh0KTtpZigwPG4ubGVuZ3RoJiYhcilyZXR1cm4gZS5kaXNwYXRjaENvbW1hbmQoYXAsbiksITA7aWYoYi5pc1NlbGVjdGlvbkNhcHR1cmVkSW5EZWNvcmF0b3JJbnB1dCh0LnRhcmdldCkpcmV0dXJuITE7Y29uc3Qgbz1iLiRnZXRTZWxlY3Rpb24oKTtyZXR1cm4gYi4kaXNSYW5nZVNlbGVjdGlvbihvKXx8Yi5ERVBSRUNBVEVEXyRpc0dyaWRTZWxlY3Rpb24obyk/KFoyKHQsZSksITApOiExfSxiLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9O2NvbnN0IGVSPSRyO3ZhciBCcz1lUix4Uz1ucix0Uj1BMixNbj1wLG5SPUQyLF9TPU50LEh5PUhyLHJSPUkyLG9SPUJzLGFtPXR5cGVvZiB3aW5kb3c8InUiJiZ0eXBlb2Ygd2luZG93LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50PCJ1Ij9Nbi51c2VMYXlvdXRFZmZlY3Q6TW4udXNlRWZmZWN0O2Z1bmN0aW9uIEt5KGUpe3JldHVybiBlLmdldEVkaXRvclN0YXRlKCkucmVhZChuUi4kY2FuU2hvd1BsYWNlaG9sZGVyQ3VycnkoZS5pc0NvbXBvc2luZygpKSl9ZnVuY3Rpb24gaVIoZSl7bGV0W3Qsbl09TW4udXNlU3RhdGUoKCk9Pkt5KGUpKTtyZXR1cm4gYW0oKCk9PntmdW5jdGlvbiByKCl7bGV0IG89S3koZSk7bihvKX1yZXR1cm4gcigpLF9TLm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlclVwZGF0ZUxpc3RlbmVyKCgpPT57cigpfSksZS5yZWdpc3RlckVkaXRhYmxlTGlzdGVuZXIoKCk9PntyKCl9KSl9LFtlXSksdH1mdW5jdGlvbiBsUihlLHQpe2xldFtuLHJdPU1uLnVzZVN0YXRlKCgpPT5lLmdldERlY29yYXRvcnMoKSk7cmV0dXJuIGFtKCgpPT5lLnJlZ2lzdGVyRGVjb3JhdG9yTGlzdGVuZXIobz0+e0h5LmZsdXNoU3luYygoKT0+e3Iobyl9KX0pLFtlXSksTW4udXNlRWZmZWN0KCgpPT57cihlLmdldERlY29yYXRvcnMoKSl9LFtlXSksTW4udXNlTWVtbygoKT0+e2xldCBvPVtdLGk9T2JqZWN0LmtleXMobik7Zm9yKGxldCBsPTA7bDxpLmxlbmd0aDtsKyspe2xldCBzPWlbbF0sYT1Nbi5jcmVhdGVFbGVtZW50KHQse29uRXJyb3I6Yz0+ZS5fb25FcnJvcihjKX0sTW4uY3JlYXRlRWxlbWVudChNbi5TdXNwZW5zZSx7ZmFsbGJhY2s6bnVsbH0sbltzXSkpLHU9ZS5nZXRFbGVtZW50QnlLZXkocyk7dSE9PW51bGwmJm8ucHVzaChIeS5jcmVhdGVQb3J0YWwoYSx1LHMpKX1yZXR1cm4gb30sW3QsbixlXSl9ZnVuY3Rpb24gc1IoZSl7YW0oKCk9Pl9TLm1lcmdlUmVnaXN0ZXIob1IucmVnaXN0ZXJSaWNoVGV4dChlKSxyUi5yZWdpc3RlckRyYWdvblN1cHBvcnQoZSkpLFtlXSl9ZnVuY3Rpb24gYVIoe2NvbnRlbnQ6ZX0pe3Zhclt0XT14Uy51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7dD1pUih0KTtsZXQgbj10UigpO3JldHVybiB0P3R5cGVvZiBlPT0iZnVuY3Rpb24iP2Uobik6ZTpudWxsfXJTLlJpY2hUZXh0UGx1Z2luPWZ1bmN0aW9uKHtjb250ZW50RWRpdGFibGU6ZSxwbGFjZWhvbGRlcjp0LEVycm9yQm91bmRhcnk6bn0pe2xldFtyXT14Uy51c2VMZXhpY2FsQ29tcG9zZXJDb250ZXh0KCk7cmV0dXJuIG49bFIocixuKSxzUihyKSxNbi5jcmVhdGVFbGVtZW50KE1uLkZyYWdtZW50LG51bGwsZSxNbi5jcmVhdGVFbGVtZW50KGFSLHtjb250ZW50OnR9KSxuKX07Y29uc3QgdVI9clM7dmFyIGNSPXVSLHdTPXt9LGJyPWZvLGRSPW5yLFNTPXAsZlI9TnQsdXM9Z2U7ZnVuY3Rpb24gaFIoZSl7U1MudXNlRWZmZWN0KCgpPT5mUi5tZXJnZVJlZ2lzdGVyKGUucmVnaXN0ZXJDb21tYW5kKGJyLklOU0VSVF9PUkRFUkVEX0xJU1RfQ09NTUFORCwoKT0+KGJyLmluc2VydExpc3QoZSwibnVtYmVyIiksITApLHVzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlLnJlZ2lzdGVyQ29tbWFuZChici5JTlNFUlRfVU5PUkRFUkVEX0xJU1RfQ09NTUFORCwoKT0+KGJyLmluc2VydExpc3QoZSwiYnVsbGV0IiksITApLHVzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlLnJlZ2lzdGVyQ29tbWFuZChici5SRU1PVkVfTElTVF9DT01NQU5ELCgpPT4oYnIucmVtb3ZlTGlzdChlKSwhMCksdXMuQ09NTUFORF9QUklPUklUWV9MT1cpLGUucmVnaXN0ZXJDb21tYW5kKHVzLklOU0VSVF9QQVJBR1JBUEhfQ09NTUFORCwoKT0+ISFici4kaGFuZGxlTGlzdEluc2VydFBhcmFncmFwaCgpLHVzLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSksW2VdKX13Uy5MaXN0UGx1Z2luPWZ1bmN0aW9uKCl7bGV0W2VdPWRSLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gU1MudXNlRWZmZWN0KCgpPT57aWYoIWUuaGFzTm9kZXMoW2JyLkxpc3ROb2RlLGJyLkxpc3RJdGVtTm9kZV0pKXRocm93IEVycm9yKCJMaXN0UGx1Z2luOiBMaXN0Tm9kZSBhbmQvb3IgTGlzdEl0ZW1Ob2RlIG5vdCByZWdpc3RlcmVkIG9uIGVkaXRvciIpfSxbZV0pLGhSKGUpLG51bGx9O2NvbnN0IHBSPXdTO3ZhciBnUj1wUixFUz17fSxYcj17fSxDUz1OdCxtcj1nZTtsZXQgbVI9bmV3IFNldChbImh0dHA6IiwiaHR0cHM6IiwibWFpbHRvOiIsInNtczoiLCJ0ZWw6Il0pO2NsYXNzIEhsIGV4dGVuZHMgbXIuRWxlbWVudE5vZGV7c3RhdGljIGdldFR5cGUoKXtyZXR1cm4ibGluayJ9c3RhdGljIGNsb25lKHQpe3JldHVybiBuZXcgSGwodC5fX3VybCx7cmVsOnQuX19yZWwsdGFyZ2V0OnQuX190YXJnZXQsdGl0bGU6dC5fX3RpdGxlfSx0Ll9fa2V5KX1jb25zdHJ1Y3Rvcih0LG49e30scil7c3VwZXIocik7bGV0e3RhcmdldDpvPW51bGwscmVsOmk9bnVsbCx0aXRsZTpsPW51bGx9PW47dGhpcy5fX3VybD10LHRoaXMuX190YXJnZXQ9byx0aGlzLl9fcmVsPWksdGhpcy5fX3RpdGxlPWx9Y3JlYXRlRE9NKHQpe2xldCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKTtyZXR1cm4gbi5ocmVmPXRoaXMuc2FuaXRpemVVcmwodGhpcy5fX3VybCksdGhpcy5fX3RhcmdldCE9PW51bGwmJihuLnRhcmdldD10aGlzLl9fdGFyZ2V0KSx0aGlzLl9fcmVsIT09bnVsbCYmKG4ucmVsPXRoaXMuX19yZWwpLHRoaXMuX190aXRsZSE9PW51bGwmJihuLnRpdGxlPXRoaXMuX190aXRsZSksQ1MuYWRkQ2xhc3NOYW1lc1RvRWxlbWVudChuLHQudGhlbWUubGluayksbn11cGRhdGVET00odCxuKXtsZXQgcj10aGlzLl9fdXJsLG89dGhpcy5fX3RhcmdldCxpPXRoaXMuX19yZWwsbD10aGlzLl9fdGl0bGU7cmV0dXJuIHIhPT10Ll9fdXJsJiYobi5ocmVmPXIpLG8hPT10Ll9fdGFyZ2V0JiYobz9uLnRhcmdldD1vOm4ucmVtb3ZlQXR0cmlidXRlKCJ0YXJnZXQiKSksaSE9PXQuX19yZWwmJihpP24ucmVsPWk6bi5yZW1vdmVBdHRyaWJ1dGUoInJlbCIpKSxsIT09dC5fX3RpdGxlJiYobD9uLnRpdGxlPWw6bi5yZW1vdmVBdHRyaWJ1dGUoInRpdGxlIikpLCExfXN0YXRpYyBpbXBvcnRET00oKXtyZXR1cm57YTooKT0+KHtjb252ZXJzaW9uOnZSLHByaW9yaXR5OjF9KX19c3RhdGljIGltcG9ydEpTT04odCl7bGV0IG49eGEodC51cmwse3JlbDp0LnJlbCx0YXJnZXQ6dC50YXJnZXQsdGl0bGU6dC50aXRsZX0pO3JldHVybiBuLnNldEZvcm1hdCh0LmZvcm1hdCksbi5zZXRJbmRlbnQodC5pbmRlbnQpLG4uc2V0RGlyZWN0aW9uKHQuZGlyZWN0aW9uKSxufXNhbml0aXplVXJsKHQpe3RyeXtsZXQgbj1uZXcgVVJMKHQpO2lmKCFtUi5oYXMobi5wcm90b2NvbCkpcmV0dXJuImFib3V0OmJsYW5rIn1jYXRjaHt9cmV0dXJuIHR9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCkscmVsOnRoaXMuZ2V0UmVsKCksdGFyZ2V0OnRoaXMuZ2V0VGFyZ2V0KCksdGl0bGU6dGhpcy5nZXRUaXRsZSgpLHR5cGU6ImxpbmsiLHVybDp0aGlzLmdldFVSTCgpLHZlcnNpb246MX19Z2V0VVJMKCl7cmV0dXJuIHRoaXMuZ2V0TGF0ZXN0KCkuX191cmx9c2V0VVJMKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3VybD10fWdldFRhcmdldCgpe3JldHVybiB0aGlzLmdldExhdGVzdCgpLl9fdGFyZ2V0fXNldFRhcmdldCh0KXt0aGlzLmdldFdyaXRhYmxlKCkuX190YXJnZXQ9dH1nZXRSZWwoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3JlbH1zZXRSZWwodCl7dGhpcy5nZXRXcml0YWJsZSgpLl9fcmVsPXR9Z2V0VGl0bGUoKXtyZXR1cm4gdGhpcy5nZXRMYXRlc3QoKS5fX3RpdGxlfXNldFRpdGxlKHQpe3RoaXMuZ2V0V3JpdGFibGUoKS5fX3RpdGxlPXR9aW5zZXJ0TmV3QWZ0ZXIodCxuPSEwKXtyZXR1cm4gdD10aGlzLmdldFBhcmVudE9yVGhyb3coKS5pbnNlcnROZXdBZnRlcih0LG4pLG1yLiRpc0VsZW1lbnROb2RlKHQpPyhuPXhhKHRoaXMuX191cmwse3JlbDp0aGlzLl9fcmVsLHRhcmdldDp0aGlzLl9fdGFyZ2V0LHRpdGxlOnRoaXMuX190aXRsZX0pLHQuYXBwZW5kKG4pLG4pOm51bGx9Y2FuSW5zZXJ0VGV4dEJlZm9yZSgpe3JldHVybiExfWNhbkluc2VydFRleHRBZnRlcigpe3JldHVybiExfWNhbkJlRW1wdHkoKXtyZXR1cm4hMX1pc0lubGluZSgpe3JldHVybiEwfWV4dHJhY3RXaXRoQ2hpbGQodCxuKXtpZighbXIuJGlzUmFuZ2VTZWxlY3Rpb24obikpcmV0dXJuITE7dD1uLmFuY2hvci5nZXROb2RlKCk7bGV0IHI9bi5mb2N1cy5nZXROb2RlKCk7cmV0dXJuIHRoaXMuaXNQYXJlbnRPZih0KSYmdGhpcy5pc1BhcmVudE9mKHIpJiYwPG4uZ2V0VGV4dENvbnRlbnQoKS5sZW5ndGh9fWZ1bmN0aW9uIHZSKGUpe2xldCB0PW51bGw7aWYoQ1MuaXNIVE1MQW5jaG9yRWxlbWVudChlKSl7bGV0IG49ZS50ZXh0Q29udGVudDtuIT09bnVsbCYmbiE9PSIiJiYodD14YShlLmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiIix7cmVsOmUuZ2V0QXR0cmlidXRlKCJyZWwiKSx0YXJnZXQ6ZS5nZXRBdHRyaWJ1dGUoInRhcmdldCIpLHRpdGxlOmUuZ2V0QXR0cmlidXRlKCJ0aXRsZSIpfSkpfXJldHVybntub2RlOnR9fWZ1bmN0aW9uIHhhKGUsdCl7cmV0dXJuIG1yLiRhcHBseU5vZGVSZXBsYWNlbWVudChuZXcgSGwoZSx0KSl9ZnVuY3Rpb24gWW8oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBIbH1jbGFzcyBJYSBleHRlbmRzIEhse3N0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImF1dG9saW5rIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBJYSh0Ll9fdXJsLHtyZWw6dC5fX3JlbCx0YXJnZXQ6dC5fX3RhcmdldCx0aXRsZTp0Ll9fdGl0bGV9LHQuX19rZXkpfXN0YXRpYyBpbXBvcnRKU09OKHQpe2xldCBuPXVwKHQudXJsLHtyZWw6dC5yZWwsdGFyZ2V0OnQudGFyZ2V0LHRpdGxlOnQudGl0bGV9KTtyZXR1cm4gbi5zZXRGb3JtYXQodC5mb3JtYXQpLG4uc2V0SW5kZW50KHQuaW5kZW50KSxuLnNldERpcmVjdGlvbih0LmRpcmVjdGlvbiksbn1zdGF0aWMgaW1wb3J0RE9NKCl7cmV0dXJuIG51bGx9ZXhwb3J0SlNPTigpe3JldHVybnsuLi5zdXBlci5leHBvcnRKU09OKCksdHlwZToiYXV0b2xpbmsiLHZlcnNpb246MX19aW5zZXJ0TmV3QWZ0ZXIodCxuPSEwKXtyZXR1cm4gdD10aGlzLmdldFBhcmVudE9yVGhyb3coKS5pbnNlcnROZXdBZnRlcih0LG4pLG1yLiRpc0VsZW1lbnROb2RlKHQpPyhuPXVwKHRoaXMuX191cmwse3JlbDp0aGlzLl9yZWwsdGFyZ2V0OnRoaXMuX190YXJnZXQsdGl0bGU6dGhpcy5fX3RpdGxlfSksdC5hcHBlbmQobiksbik6bnVsbH19ZnVuY3Rpb24gdXAoZSx0KXtyZXR1cm4gbXIuJGFwcGx5Tm9kZVJlcGxhY2VtZW50KG5ldyBJYShlLHQpKX1sZXQgeVI9bXIuY3JlYXRlQ29tbWFuZCgiVE9HR0xFX0xJTktfQ09NTUFORCIpO2Z1bmN0aW9uIHhSKGUsdCl7Zm9yKDtlIT09bnVsbCYmKGU9ZS5nZXRQYXJlbnQoKSkhPT1udWxsJiYhdChlKTspO3JldHVybiBlfVhyLiRjcmVhdGVBdXRvTGlua05vZGU9dXA7WHIuJGNyZWF0ZUxpbmtOb2RlPXhhO1hyLiRpc0F1dG9MaW5rTm9kZT1mdW5jdGlvbihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIElhfTtYci4kaXNMaW5rTm9kZT1ZbztYci5BdXRvTGlua05vZGU9SWE7WHIuTGlua05vZGU9SGw7WHIuVE9HR0xFX0xJTktfQ09NTUFORD15UjtYci50b2dnbGVMaW5rPWZ1bmN0aW9uKGUsdD17fSl7bGV0e3RhcmdldDpuLHRpdGxlOnJ9PXQsbz10LnJlbD09PXZvaWQgMD8ibm9yZWZlcnJlciI6dC5yZWw7aWYodD1tci4kZ2V0U2VsZWN0aW9uKCksbXIuJGlzUmFuZ2VTZWxlY3Rpb24odCkpaWYodD10LmV4dHJhY3QoKSxlPT09bnVsbCl0LmZvckVhY2gobD0+e2lmKGw9bC5nZXRQYXJlbnQoKSxZbyhsKSl7bGV0IHM9bC5nZXRDaGlsZHJlbigpO2ZvcihsZXQgYT0wO2E8cy5sZW5ndGg7YSsrKWwuaW5zZXJ0QmVmb3JlKHNbYV0pO2wucmVtb3ZlKCl9fSk7ZWxzZXtpZih0Lmxlbmd0aD09PTEpe3ZhciBpPXRbMF07aWYoaT1ZbyhpKT9pOnhSKGksWW8pLGkhPT1udWxsKXtpLnNldFVSTChlKSxuIT09dm9pZCAwJiZpLnNldFRhcmdldChuKSxvIT09bnVsbCYmaS5zZXRSZWwobyksciE9PXZvaWQgMCYmaS5zZXRUaXRsZShyKTtyZXR1cm59fWxldCBsPW51bGwscz1udWxsO3QuZm9yRWFjaChhPT57dmFyIHU9YS5nZXRQYXJlbnQoKTtpZih1IT09cyYmdSE9PW51bGwmJighbXIuJGlzRWxlbWVudE5vZGUoYSl8fGEuaXNJbmxpbmUoKSkpaWYoWW8odSkpcz11LHUuc2V0VVJMKGUpLG4hPT12b2lkIDAmJnUuc2V0VGFyZ2V0KG4pLG8hPT1udWxsJiZzLnNldFJlbChvKSxyIT09dm9pZCAwJiZzLnNldFRpdGxlKHIpO2Vsc2UgaWYodS5pcyhsKXx8KGw9dSxzPXhhKGUse3JlbDpvLHRhcmdldDpufSksWW8odSk/YS5nZXRQcmV2aW91c1NpYmxpbmcoKT09PW51bGw/dS5pbnNlcnRCZWZvcmUocyk6dS5pbnNlcnRBZnRlcihzKTphLmluc2VydEJlZm9yZShzKSksWW8oYSkpe2lmKCFhLmlzKHMpKXtpZihzIT09bnVsbCl7dT1hLmdldENoaWxkcmVuKCk7Zm9yKGxldCBjPTA7Yzx1Lmxlbmd0aDtjKyspcy5hcHBlbmQodVtjXSl9YS5yZW1vdmUoKX19ZWxzZSBzIT09bnVsbCYmcy5hcHBlbmQoYSl9KX19O2NvbnN0IF9SPVhyO3ZhciBUbD1fUixEaT1UbCx3Uj1ucixTUj1OdCxMaT1nZSxFUj1wO0VTLkxpbmtQbHVnaW49ZnVuY3Rpb24oe3ZhbGlkYXRlVXJsOmV9KXtsZXRbdF09d1IudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBFUi51c2VFZmZlY3QoKCk9PntpZighdC5oYXNOb2RlcyhbRGkuTGlua05vZGVdKSl0aHJvdyBFcnJvcigiTGlua1BsdWdpbjogTGlua05vZGUgbm90IHJlZ2lzdGVyZWQgb24gZWRpdG9yIik7cmV0dXJuIFNSLm1lcmdlUmVnaXN0ZXIodC5yZWdpc3RlckNvbW1hbmQoRGkuVE9HR0xFX0xJTktfQ09NTUFORCxuPT57aWYobj09PW51bGwpcmV0dXJuIERpLnRvZ2dsZUxpbmsobiksITA7aWYodHlwZW9mIG49PSJzdHJpbmciKXJldHVybiBlPT09dm9pZCAwfHxlKG4pPyhEaS50b2dnbGVMaW5rKG4pLCEwKTohMTtsZXR7dXJsOnIsdGFyZ2V0Om8scmVsOmksdGl0bGU6bH09bjtyZXR1cm4gRGkudG9nZ2xlTGluayhyLHtyZWw6aSx0YXJnZXQ6byx0aXRsZTpsfSksITB9LExpLkNPTU1BTkRfUFJJT1JJVFlfTE9XKSxlIT09dm9pZCAwP3QucmVnaXN0ZXJDb21tYW5kKExpLlBBU1RFX0NPTU1BTkQsbj0+e2xldCByPUxpLiRnZXRTZWxlY3Rpb24oKTtpZighTGkuJGlzUmFuZ2VTZWxlY3Rpb24ocil8fHIuaXNDb2xsYXBzZWQoKXx8IShuIGluc3RhbmNlb2YgQ2xpcGJvYXJkRXZlbnQpfHxuLmNsaXBib2FyZERhdGE9PW51bGwpcmV0dXJuITE7bGV0IG89bi5jbGlwYm9hcmREYXRhLmdldERhdGEoInRleHQiKTtyZXR1cm4gZShvKT9yLmdldE5vZGVzKCkuc29tZShpPT5MaS4kaXNFbGVtZW50Tm9kZShpKSk/ITE6KHQuZGlzcGF0Y2hDb21tYW5kKERpLlRPR0dMRV9MSU5LX0NPTU1BTkQsbyksbi5wcmV2ZW50RGVmYXVsdCgpLCEwKTohMX0sTGkuQ09NTUFORF9QUklPUklUWV9MT1cpOigpPT57fSl9LFt0LGVdKSxudWxsfTtjb25zdCBDUj1FUzt2YXIgJFI9Q1I7ZnVuY3Rpb24ga1Ioe2FyaWFBY3RpdmVEZXNjZW5kYW50OmUsYXJpYUF1dG9Db21wbGV0ZTp0LGFyaWFDb250cm9sczpuLGFyaWFEZXNjcmliZWRCeTpyLGFyaWFFeHBhbmRlZDpvLGFyaWFMYWJlbDppLGFyaWFMYWJlbGxlZEJ5OmwsYXJpYU11bHRpbGluZTpzLGFyaWFPd25zOmEsYXJpYVJlcXVpcmVkOnUsYXV0b0NhcGl0YWxpemU6YyxjbGFzc05hbWU6ZCxpZDpmLHJvbGU6aD0idGV4dGJveCIsc3BlbGxDaGVjazpnPSEwLHN0eWxlOm0sdGFiSW5kZXg6UywiZGF0YS10ZXN0aWQiOnYsLi4ueX0pe2NvbnN0W3hdPW5yLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKSxbXyxFXT1wLnVzZVN0YXRlKCExKSwkPXAudXNlQ2FsbGJhY2soQz0+e3ZhciBNO3guc2V0Um9vdEVsZW1lbnQoQyk7Y29uc3QgVD0oTT1kb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidmFsLXVpIikpPT1udWxsP3ZvaWQgMDpNLnNoYWRvd1Jvb3Q7aWYoVCYmImdldFNlbGVjdGlvbiJpbiBUKXt4Ll93aW5kb3c9VDtyZXR1cm59fSxbeF0pO3JldHVybiBwLnVzZUxheW91dEVmZmVjdCgoKT0+KEUoeC5pc0VkaXRhYmxlKCkpLHgucmVnaXN0ZXJFZGl0YWJsZUxpc3RlbmVyKEM9PntFKEMpfSkpLFt4XSksdy5qc3goImRpdiIsey4uLnksImFyaWEtYWN0aXZlZGVzY2VuZGFudCI6Xz9lOnZvaWQgMCwiYXJpYS1hdXRvY29tcGxldGUiOl8/dDoibm9uZSIsImFyaWEtY29udHJvbHMiOl8/bjp2b2lkIDAsImFyaWEtZGVzY3JpYmVkYnkiOnIsImFyaWEtZXhwYW5kZWQiOl8mJmg9PT0iY29tYm9ib3giPyEhbzp2b2lkIDAsImFyaWEtbGFiZWwiOmksImFyaWEtbGFiZWxsZWRieSI6bCwiYXJpYS1tdWx0aWxpbmUiOnMsImFyaWEtb3ducyI6Xz9hOnZvaWQgMCwiYXJpYS1yZWFkb25seSI6Xz92b2lkIDA6ITAsImFyaWEtcmVxdWlyZWQiOnUsYXV0b0NhcGl0YWxpemU6YyxjbGFzc05hbWU6ZCxjb250ZW50RWRpdGFibGU6XywiZGF0YS10ZXN0aWQiOnYsaWQ6ZixyZWY6JCxyb2xlOmgsc3BlbGxDaGVjazpnLHN0eWxlOm0sdGFiSW5kZXg6U30pfWZ1bmN0aW9uIFRSKHtjbGFzc05hbWU6ZX0pe3JldHVybiB3LmpzeChrUix7Y2xhc3NOYW1lOmV9KX1jbGFzcyBqYSBleHRlbmRzIGdlLkRlY29yYXRvck5vZGV7Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKSx0aGlzLl9fc3JjPXQuc3JjLHRoaXMuX19hbHRUZXh0PXQuYWx0VGV4dCx0aGlzLl9fd2lkdGg9dC53aWR0aCx0aGlzLl9faGVpZ2h0PXQuaGVpZ2h0fXN0YXRpYyBnZXRUeXBlKCl7cmV0dXJuImltYWdlIn1zdGF0aWMgY2xvbmUodCl7cmV0dXJuIG5ldyBqYSh7c3JjOnQuX19zcmMsYWx0VGV4dDp0Ll9fYWx0VGV4dCx3aWR0aDp0Ll9fd2lkdGgsaGVpZ2h0OnQuX19oZWlnaHR9KX1leHBvcnRKU09OKCl7cmV0dXJue2FsdFRleHQ6dGhpcy5fX2FsdFRleHQsaGVpZ2h0OnRoaXMuX193aWR0aCxzcmM6dGhpcy5fX3NyYyx0eXBlOiJpbWFnZSIsdmVyc2lvbjoxLHdpZHRoOnRoaXMuX193aWR0aH19c3RhdGljIGltcG9ydEpTT04odCl7cmV0dXJuICRTKHQpfWNyZWF0ZURPTSgpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX11cGRhdGVET00oKXtyZXR1cm4hMX1kZWNvcmF0ZSgpe3JldHVybiB3LmpzeChOUix7c3JjOnRoaXMuX19zcmMsYWx0VGV4dDp0aGlzLl9fYWx0VGV4dCxlbXB0eTp0aGlzLl9fZW1wdHksaGVpZ2h0OnRoaXMuX19oZWlnaHQsbm9kZUtleTp0aGlzLmdldEtleSgpfSl9fWZ1bmN0aW9uIE5SKGUpe3JldHVybiB3LmpzeCgiaW1nIix7c3JjOmUuc3JjfSl9ZnVuY3Rpb24gJFMoZSl7cmV0dXJuIG5ldyBqYShlKX1mdW5jdGlvbiBiUigpe2NvbnN0W2VdPW5yLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntlLmZvY3VzKCl9LFtlXSksbnVsbH1jb25zdCBrUz1nZS5jcmVhdGVDb21tYW5kKCJJTlNFUlRfSU1BR0VfQ09NTUFORCIpO2Z1bmN0aW9uIFJSKCl7Y29uc3RbZV09bnIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2lmKCFlLmhhc05vZGVzKFtqYV0pKXRocm93IG5ldyBFcnJvcigiSW1hZ2VzUGx1Z2luOiBJbWFnZU5vZGUgbm90IHJlZ2lzdGVyZWQgb24gZWRpdG9yIik7cmV0dXJuIE50Lm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoa1MsdD0+e2NvbnN0IG49JFModCk7cmV0dXJuIGdlLiRpbnNlcnROb2Rlcyhbbl0pLGdlLiRpc1Jvb3RPclNoYWRvd1Jvb3Qobi5nZXRQYXJlbnRPclRocm93KCkpJiZOdC4kd3JhcE5vZGVJbkVsZW1lbnQobixnZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSkuc2VsZWN0RW5kKCksITB9LGdlLkNPTU1BTkRfUFJJT1JJVFlfRURJVE9SKSl9LFtlXSksbnVsbH1jb25zdCBQUj0oe2NsYXNzTmFtZTplfSk9PncuanN4cygic3ZnIix7aGVpZ2h0OjEyLHdpZHRoOjEyLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6IjIiLHN0cm9rZUxpbmVjYXA6InJvdW5kIixzdHJva2VMaW5lam9pbjoicm91bmQiLGNsYXNzTmFtZTplLGNoaWxkcmVuOlt3LmpzeCgicGF0aCIse2Q6Ik02IDRoOGE0IDQgMCAwIDEgNCA0IDQgNCAwIDAgMS00IDRINnoifSksdy5qc3goInBhdGgiLHtkOiJNNiAxMmg5YTQgNCAwIDAgMSA0IDQgNCA0IDAgMCAxLTQgNEg2eiJ9KV19KSxPUj1QUixBUj0oe2NsYXNzTmFtZTplfSk9PncuanN4cygic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQiLGZpbGw6Im5vbmUiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCIsY2xhc3NOYW1lOmUsd2lkdGg6MTIsaGVpZ2h0OjEyLGNoaWxkcmVuOlt3LmpzeCgibGluZSIse3gxOiIxOSIseTE6IjQiLHgyOiIxMCIseTI6IjQifSksdy5qc3goImxpbmUiLHt4MToiMTQiLHkxOiIyMCIseDI6IjUiLHkyOiIyMCJ9KSx3LmpzeCgibGluZSIse3gxOiIxNSIseTE6IjQiLHgyOiI5Iix5MjoiMjAifSldfSksTVI9QVIsRFI9KHtjbGFzc05hbWU6ZX0pPT53LmpzeCgic3ZnIix7eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix2aWV3Qm94OiIwIDAgMjQgMjQiLHN0cm9rZToiY3VycmVudENvbG9yIixzdHJva2VXaWR0aDoiMSIsY2xhc3NOYW1lOmUsd2lkdGg6MTIsaGVpZ2h0OjEyLGNoaWxkcmVuOncuanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGQ6Ik0xMywxNSBMMTMsMjEgQzEzLDIxLjU1MjI4NDcgMTIuNTUyMjg0NywyMiAxMiwyMiBDMTEuNDQ3NzE1MywyMiAxMSwyMS41NTIyODQ3IDExLDIxIEwxMSwxNSBMMTMsMTUgWiBNMywxMyBDMi40NDc3MTUyNSwxMyAyLDEyLjU1MjI4NDcgMiwxMiBDMiwxMS40NDc3MTUzIDIuNDQ3NzE1MjUsMTEgMywxMSBMMjEsMTEgQzIxLjU1MjI4NDcsMTEgMjIsMTEuNDQ3NzE1MyAyMiwxMiBDMjIsMTIuNTUyMjg0NyAyMS41NTIyODQ3LDEzIDIxLDEzIEwzLDEzIFogTTE5LDIgQzE5LjU1MjI4NDcsMiAyMCwyLjQ0NzcxNTI1IDIwLDMgQzIwLDMuNTUyMjg0NzUgMTkuNTUyMjg0Nyw0IDE5LDQgTDEzLDQgTDEzLDkgTDExLDkgTDExLDQgTDUsNCBDNC40NDc3MTUyNSw0IDQsMy41NTIyODQ3NSA0LDMgQzQsMi40NDc3MTUyNSA0LjQ0NzcxNTI1LDIgNSwyIEwxOSwyIFoifSl9KSxMUj1EUixJUj0oe3ZhcmlhbnQ6ZT0icHJpbWFyeSIsb25DbGljazp0LGNoaWxkcmVuOm4saWNvbjpyLGRpc2FibGVkOm89ITF9KT0+dy5qc3goImJ1dHRvbiIse2Rpc2FibGVkOm8sY2xhc3NOYW1lOnJkKCJmb250LXNhbnMgZm9udC1bMTJweF0gdHJhY2tpbmctWzAuMDRlbV0gcHktMSBweC0yIHJvdW5kZWQgd2hpdGVzcGFjZS1ub3dyYXAgZ3JvdXAgcmVsYXRpdmUgdGV4dC1wcmltYXJ5Iix7ImZvbnQtYm9sZCI6ZT09PSJwcmltYXJ5IiwiYmctYmFja2dyb3VuZCBob3ZlcjpiZy1iYWNrZ3JvdW5kIHRleHQtZmlsbCBkaXNhYmxlZDpiZy1maWxsIGRpc2FibGVkOnRleHQtYmFja2dyb3VuZCI6ZT09PSJwcmltYXJ5IiwiYmctdHJhbnNwYXJlbnQgYm9yZGVyIGJvcmRlci1wcmltYXJ5IHRleHQtcHJpbWFyeSBob3Zlcjpib3JkZXItaGlnaGxpZ2h0IGhvdmVyOnRleHQtaGlnaGxpZ2h0IGRpc2FibGVkOmJnLWZpbGwgZGlzYWJsZWQ6dGV4dC1iYWNrZ3JvdW5kIjplIT09InByaW1hcnkifSksb25DbGljazp0LGNoaWxkcmVuOncuanN4cygic3BhbiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIiLGNoaWxkcmVuOltyJiZyLG5dfSl9KSxYbz1JUixqUj0oe2NsYXNzTmFtZTplfSk9PncuanN4cygic3ZnIix7d2lkdGg6IjEwIixoZWlnaHQ6IjEwIix2aWV3Qm94OiIwIDAgMTIgMTIiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsY2xhc3NOYW1lOmUsY2hpbGRyZW46W3cuanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNMy43MDczMyAxLjAwMDE1TDguNzc4NCA2LjA3MTIxTDguMDcxMjkgNi43NzgzMkwzLjAwMDIyIDEuNzA3MjVMMy43MDczMyAxLjAwMDE1WiIsZmlsbDoiY3VycmVudENvbG9yIn0pLHcuanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNMy4wMDAxNSAxMC40NzA5TDguMDcxMjEgNS4zOTk4M0w4Ljc3ODMyIDYuMTA2OTNMMy43MDcyNSAxMS4xNzhMMy4wMDAxNSAxMC40NzA5WiIsZmlsbDoiY3VycmVudENvbG9yIn0pXX0pLHpSPWpSLFRTPXEuY3JlYXRlQ29udGV4dCh7Z2V0IGFwaSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNlc3Npb24oKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCB0aGVtZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldFRoZW1lKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfSxnZXQgZWRpdE1vZGUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCBzZXRFZGl0TW9kZSgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IGhpZ2hsaWdodCgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldEhpZ2hsaWdodCgpe3Rocm93IEVycm9yKCJWYWxPdmVybGF5Q29udGV4dCBub3QgZm91bmQuIEVuc3VyZSBjb21wb25lbnRzIGFyZSB3cmFwcGVkIGJ5IFZhbE92ZXJsYXlQcm92aWRlciEiKX0sZ2V0IHNldFdpbmRvd1NpemUoKXt0aHJvdyBFcnJvcigiVmFsT3ZlcmxheUNvbnRleHQgbm90IGZvdW5kLiBFbnN1cmUgY29tcG9uZW50cyBhcmUgd3JhcHBlZCBieSBWYWxPdmVybGF5UHJvdmlkZXIhIil9LGdldCB3aW5kb3dTaXplKCl7dGhyb3cgRXJyb3IoIlZhbE92ZXJsYXlDb250ZXh0IG5vdCBmb3VuZC4gRW5zdXJlIGNvbXBvbmVudHMgYXJlIHdyYXBwZWQgYnkgVmFsT3ZlcmxheVByb3ZpZGVyISIpfX0pO2Z1bmN0aW9uIHVtKCl7cmV0dXJuIHEudXNlQ29udGV4dChUUyl9Y29uc3QgRlI9KHtvcHRpb25zOmUsb25DaGFuZ2U6dCxsYWJlbDpuLGljb246cn0pPT57Y29uc3RbbyxpXT1wLnVzZVN0YXRlKCExKSxsPXAudXNlUmVmKG51bGwpLFtzLGFdPXAudXNlU3RhdGUoMCkse3dpbmRvd1NpemU6dX09dW0oKSxjPSgpPT57aSghbyl9LGQ9KGYsaCk9PnthKGgpLHQoZiksaSghMSl9O3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IGY9aD0+e28mJmwuY3VycmVudCYmIWwuY3VycmVudC5jb250YWlucyhoLnRhcmdldCkmJmkoITEpfTtyZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGYpLCgpPT57ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2xpY2siLGYpfX0sW10pLHcuanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtWzEycHhdIixyZWY6bCxjaGlsZHJlbjp3LmpzeChYbyx7b25DbGljazpmPT57Zi5wcmV2ZW50RGVmYXVsdCgpLGMoKX0saWNvbjp3LmpzeCh6Uix7Y2xhc3NOYW1lOmByb3RhdGUtWy05MGRlZ10gdHJhbnNpdGlvbi10cmFuc2Zvcm0gZHVyYXRpb24tMTUwIGVhc2UtaW4tb3V0ICR7bz8iIjoicm90YXRlLVs5MGRlZ10ifWB9KSxjaGlsZHJlbjp3LmpzeHMoImRpdiIse2NsYXNzTmFtZToicmVsYXRpdmUiLGNoaWxkcmVuOlt3LmpzeHMoInNwYW4iLHtjbGFzc05hbWU6ImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0xIixjaGlsZHJlbjpbbixyJiZyXX0pLG8mJncuanN4KCJkaXYiLHtjbGFzc05hbWU6ImFic29sdXRlIC10b3AtWzRweF0gb3ZlcmZsb3ctc2Nyb2xsIHNoYWRvdy1sZyAtbGVmdC0yIHRleHQtcHJpbWFyeSBiZy1ib3JkZXIgdy1maXQgei1vdmVybGF5IixzdHlsZTp7bWF4SGVpZ2h0OnU9PW51bGw/dm9pZCAwOnUuaW5uZXJIZWlnaHR9LGNoaWxkcmVuOncuanN4KCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgIixjaGlsZHJlbjplPT1udWxsP3ZvaWQgMDplLm1hcCgoZixoKT0+dy5qc3goImJ1dHRvbiIse29uQ2xpY2s6Zz0+e2cucHJldmVudERlZmF1bHQoKSxkKGYsaCl9LGNsYXNzTmFtZTpgdGV4dC1sZWZ0IHB4LTIgcHktMSBob3ZlcjpiZy1iYWNrZ3JvdW5kIGhvdmVyOnRleHQtaGlnaGxpZ2h0ICAke2g9PT1zJiYiZm9udC1ib2xkIGJnLWJhY2tncm91bmQgaG92ZXI6YmctYmFja2dyb3VuZCB0cnVuY2F0ZSJ9YCxjaGlsZHJlbjpmfSxmKSl9KX0pXX0pfSl9KX0sQlI9RlIsV1I9bmV3IFRleHRFbmNvZGVyO2Z1bmN0aW9uIE5TKGUpe3JldHVybiBuZXcgUHJvbWlzZSgodCxuKT0+e3ZhciBpO2NvbnN0IHI9KGk9ZS5jdXJyZW50VGFyZ2V0LmZpbGVzKT09bnVsbD92b2lkIDA6aVswXSxvPW5ldyBGaWxlUmVhZGVyO28uYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsKCk9Pntjb25zdCBsPW8ucmVzdWx0O2lmKHR5cGVvZiBsPT0ic3RyaW5nIil7Y29uc3Qgcz1uZXcgSW1hZ2U7cy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixhc3luYygpPT57Y29uc3QgYT1hd2FpdCB3bi5nZXRTSEEyNTZIYXNoKFdSLmVuY29kZShsKSk7aWYocy5uYXR1cmFsV2lkdGgmJnMubmF0dXJhbEhlaWdodCl7Y29uc3QgdT1SZyhsKTt0KHtzcmM6bCx3aWR0aDpzLm5hdHVyYWxXaWR0aCxoZWlnaHQ6cy5uYXR1cmFsSGVpZ2h0LGZpbGVuYW1lOnI9PW51bGw/dm9pZCAwOnIubmFtZSxzaGEyNTY6YSxtaW1lVHlwZTp1LGZpbGVFeHQ6dSYmUGcodSl9KX1lbHNlIHQoe3NyYzpsLGZpbGVuYW1lOnI9PW51bGw/dm9pZCAwOnIubmFtZSxzaGEyNTY6YX0pfSkscy5zcmM9bH1lbHNlIG4obD97bWVzc2FnZToiVW5leHBlY3RlZCBpbWFnZSByZXN1bHQgdHlwZSIscmVzdWx0Omx9OnttZXNzYWdlOiJFbXB0eSByZXN1bHQifSl9KSxyJiZvLnJlYWRBc0RhdGFVUkwocil9KX1mdW5jdGlvbiBiUyhlKXtjb25zdCB0PWUuYW5jaG9yLG49ZS5mb2N1cyxyPWUuYW5jaG9yLmdldE5vZGUoKSxvPWUuZm9jdXMuZ2V0Tm9kZSgpO3JldHVybiByPT09bz9yOmUuaXNCYWNrd2FyZCgpP09vLiRpc0F0Tm9kZUVuZChuKT9yOm86T28uJGlzQXROb2RlRW5kKHQpP3I6b31mdW5jdGlvbiBVUigpe2NvbnN0W2VdPW5yLnVzZUxleGljYWxDb21wb3NlckNvbnRleHQoKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pk50Lm1lcmdlUmVnaXN0ZXIoZS5yZWdpc3RlckNvbW1hbmQoZ2UuQ0xJQ0tfQ09NTUFORCx0PT57Y29uc3Qgbj1nZS4kZ2V0U2VsZWN0aW9uKCk7aWYoZ2UuJGlzUmFuZ2VTZWxlY3Rpb24obikpe2NvbnN0IHI9YlMobiksbz1OdC4kZmluZE1hdGNoaW5nUGFyZW50KHIsVGwuJGlzTGlua05vZGUpO2lmKFRsLiRpc0xpbmtOb2RlKG8pJiYodC5tZXRhS2V5fHx0LmN0cmxLZXkpKXJldHVybiB3aW5kb3cub3BlbihvLmdldFVSTCgpLCJfYmxhbmsiKSwhMH1yZXR1cm4hMX0sZ2UuQ09NTUFORF9QUklPUklUWV9MT1cpKSxbXSksbnVsbH12YXIgUlM9e2V4cG9ydHM6e319LFZSPSJTRUNSRVRfRE9fTk9UX1BBU1NfVEhJU19PUl9ZT1VfV0lMTF9CRV9GSVJFRCIsSFI9VlIsS1I9SFI7ZnVuY3Rpb24gUFMoKXt9ZnVuY3Rpb24gT1MoKXt9T1MucmVzZXRXYXJuaW5nQ2FjaGU9UFM7dmFyIEdSPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZShyLG8saSxsLHMsYSl7aWYoYSE9PUtSKXt2YXIgdT1uZXcgRXJyb3IoIkNhbGxpbmcgUHJvcFR5cGVzIHZhbGlkYXRvcnMgZGlyZWN0bHkgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgYHByb3AtdHlwZXNgIHBhY2thZ2UuIFVzZSBQcm9wVHlwZXMuY2hlY2tQcm9wVHlwZXMoKSB0byBjYWxsIHRoZW0uIFJlYWQgbW9yZSBhdCBodHRwOi8vZmIubWUvdXNlLWNoZWNrLXByb3AtdHlwZXMiKTt0aHJvdyB1Lm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24iLHV9fWUuaXNSZXF1aXJlZD1lO2Z1bmN0aW9uIHQoKXtyZXR1cm4gZX12YXIgbj17YXJyYXk6ZSxiaWdpbnQ6ZSxib29sOmUsZnVuYzplLG51bWJlcjplLG9iamVjdDplLHN0cmluZzplLHN5bWJvbDplLGFueTplLGFycmF5T2Y6dCxlbGVtZW50OmUsZWxlbWVudFR5cGU6ZSxpbnN0YW5jZU9mOnQsbm9kZTplLG9iamVjdE9mOnQsb25lT2Y6dCxvbmVPZlR5cGU6dCxzaGFwZTp0LGV4YWN0OnQsY2hlY2tQcm9wVHlwZXM6T1MscmVzZXRXYXJuaW5nQ2FjaGU6UFN9O3JldHVybiBuLlByb3BUeXBlcz1uLG59O1JTLmV4cG9ydHM9R1IoKTt2YXIgWVI9UlMuZXhwb3J0cztjb25zdCBMbj0kYShZUik7ZnVuY3Rpb24gY3AoKXtyZXR1cm4gY3A9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sY3AuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIFhSKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj1RUihlLHQpLHIsbztpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2ZvcihvPTA7bzxpLmxlbmd0aDtvKyspcj1pW29dLCEodC5pbmRleE9mKHIpPj0wKSYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscikmJihuW3JdPWVbcl0pfXJldHVybiBufWZ1bmN0aW9uIFFSKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj17fSxyPU9iamVjdC5rZXlzKGUpLG8saTtmb3IoaT0wO2k8ci5sZW5ndGg7aSsrKW89cltpXSwhKHQuaW5kZXhPZihvKT49MCkmJihuW29dPWVbb10pO3JldHVybiBufXZhciBjbT1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbG9yLHI9bj09PXZvaWQgMD8iY3VycmVudENvbG9yIjpuLG89ZS5zaXplLGk9bz09PXZvaWQgMD8yNDpvLGw9WFIoZSxbImNvbG9yIiwic2l6ZSJdKTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KCJzdmciLGNwKHtyZWY6dCx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOmksaGVpZ2h0Omksdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6cixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9LGwpLHEuY3JlYXRlRWxlbWVudCgicG9seWxpbmUiLHtwb2ludHM6IjIwIDYgOSAxNyA0IDEyIn0pKX0pO2NtLnByb3BUeXBlcz17Y29sb3I6TG4uc3RyaW5nLHNpemU6TG4ub25lT2ZUeXBlKFtMbi5zdHJpbmcsTG4ubnVtYmVyXSl9O2NtLmRpc3BsYXlOYW1lPSJDaGVjayI7Y29uc3QgSlI9Y207ZnVuY3Rpb24gZHAoKXtyZXR1cm4gZHA9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sZHAuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIFpSKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj1xUihlLHQpLHIsbztpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2ZvcihvPTA7bzxpLmxlbmd0aDtvKyspcj1pW29dLCEodC5pbmRleE9mKHIpPj0wKSYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscikmJihuW3JdPWVbcl0pfXJldHVybiBufWZ1bmN0aW9uIHFSKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj17fSxyPU9iamVjdC5rZXlzKGUpLG8saTtmb3IoaT0wO2k8ci5sZW5ndGg7aSsrKW89cltpXSwhKHQuaW5kZXhPZihvKT49MCkmJihuW29dPWVbb10pO3JldHVybiBufXZhciBkbT1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbG9yLHI9bj09PXZvaWQgMD8iY3VycmVudENvbG9yIjpuLG89ZS5zaXplLGk9bz09PXZvaWQgMD8yNDpvLGw9WlIoZSxbImNvbG9yIiwic2l6ZSJdKTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KCJzdmciLGRwKHtyZWY6dCx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOmksaGVpZ2h0Omksdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6cixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9LGwpLHEuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xMCAxM2E1IDUgMCAwIDAgNy41NC41NGwzLTNhNSA1IDAgMCAwLTcuMDctNy4wN2wtMS43MiAxLjcxIn0pLHEuY3JlYXRlRWxlbWVudCgicGF0aCIse2Q6Ik0xNCAxMWE1IDUgMCAwIDAtNy41NC0uNTRsLTMgM2E1IDUgMCAwIDAgNy4wNyA3LjA3bDEuNzEtMS43MSJ9KSl9KTtkbS5wcm9wVHlwZXM9e2NvbG9yOkxuLnN0cmluZyxzaXplOkxuLm9uZU9mVHlwZShbTG4uc3RyaW5nLExuLm51bWJlcl0pfTtkbS5kaXNwbGF5TmFtZT0iTGluayI7Y29uc3QgZVA9ZG07ZnVuY3Rpb24gZnAoKXtyZXR1cm4gZnA9T2JqZWN0LmFzc2lnbnx8ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49YXJndW1lbnRzW3RdO2Zvcih2YXIgciBpbiBuKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChuLHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sZnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIHRQKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj1uUChlLHQpLHIsbztpZihPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgaT1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGUpO2ZvcihvPTA7bzxpLmxlbmd0aDtvKyspcj1pW29dLCEodC5pbmRleE9mKHIpPj0wKSYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscikmJihuW3JdPWVbcl0pfXJldHVybiBufWZ1bmN0aW9uIG5QKGUsdCl7aWYoZT09bnVsbClyZXR1cm57fTt2YXIgbj17fSxyPU9iamVjdC5rZXlzKGUpLG8saTtmb3IoaT0wO2k8ci5sZW5ndGg7aSsrKW89cltpXSwhKHQuaW5kZXhPZihvKT49MCkmJihuW29dPWVbb10pO3JldHVybiBufXZhciBmbT1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmNvbG9yLHI9bj09PXZvaWQgMD8iY3VycmVudENvbG9yIjpuLG89ZS5zaXplLGk9bz09PXZvaWQgMD8yNDpvLGw9dFAoZSxbImNvbG9yIiwic2l6ZSJdKTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KCJzdmciLGZwKHtyZWY6dCx4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHdpZHRoOmksaGVpZ2h0Omksdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6cixzdHJva2VXaWR0aDoiMiIsc3Ryb2tlTGluZWNhcDoicm91bmQiLHN0cm9rZUxpbmVqb2luOiJyb3VuZCJ9LGwpLHEuY3JlYXRlRWxlbWVudCgibGluZSIse3gxOiIxOCIseTE6IjYiLHgyOiI2Iix5MjoiMTgifSkscS5jcmVhdGVFbGVtZW50KCJsaW5lIix7eDE6IjYiLHkxOiI2Iix4MjoiMTgiLHkyOiIxOCJ9KSl9KTtmbS5wcm9wVHlwZXM9e2NvbG9yOkxuLnN0cmluZyxzaXplOkxuLm9uZU9mVHlwZShbTG4uc3RyaW5nLExuLm51bWJlcl0pfTtmbS5kaXNwbGF5TmFtZT0iWCI7Y29uc3QgclA9Zm0sb1A9KHtmb250U2l6ZXM6ZSxmb250c0ZhbWlsaWVzOnQsb25FZGl0b3I6bixjb2xvcnM6cn0pPT57Y29uc3Rbb109bnIudXNlTGV4aWNhbENvbXBvc2VyQ29udGV4dCgpO3AudXNlRWZmZWN0KCgpPT57biYmbihvKX0sW29dKTtjb25zdFtpLGxdPXAudXNlU3RhdGUobyksW3MsYV09cC51c2VTdGF0ZShudWxsKSxbdSxjXT1wLnVzZVN0YXRlKCExKSxbZCxmXT1wLnVzZVN0YXRlKCExKSxbaCxnXT1wLnVzZVN0YXRlKCExKSxbbSxTXT1wLnVzZVN0YXRlKCExKTtwLnVzZVN0YXRlKCIxNXB4IikscC51c2VTdGF0ZSgiIzAwMCIpLHAudXNlU3RhdGUoIlNhbnMiKTtjb25zdFt2LHldPXAudXNlU3RhdGUoInBhcmFncmFwaCIpO3AudXNlU3RhdGUoITEpLHAudXNlU3RhdGUoITEpLHAudXNlU3RhdGUoInVybCIpLHAudXNlU3RhdGUobnVsbCk7Y29uc3RbeCxfXT1wLnVzZVN0YXRlKG51bGwpLEU9Uj0+e28uZGlzcGF0Y2hDb21tYW5kKFRsLlRPR0dMRV9MSU5LX0NPTU1BTkQsUil9LCQ9e3BhcmFncmFwaDoiTm9ybWFsIixoMToiSGVhZGluZyAxIixoMjoiSGVhZGluZyAyIixoMzoiSGVhZGluZyAzIixoNDoiSGVhZGluZyA0IixoNToiSGVhZGluZyA1IixoNjoiSGVhZGluZyA2IixudW1iZXI6Ik51bWJlcmVkIExpc3QiLGJ1bGxldDoiQnVsbGV0ZWQgTGlzdCJ9LEM9e307Zm9yKGNvbnN0IFIgaW4gJClDWyRbUl1dPVI7Y29uc3QgVD1wLnVzZUNhbGxiYWNrKCgpPT57Y29uc3QgUj1nZS4kZ2V0U2VsZWN0aW9uKCk7aWYoZ2UuJGlzUmFuZ2VTZWxlY3Rpb24oUikpe2NvbnN0IGo9Ui5hbmNob3IuZ2V0Tm9kZSgpO2xldCBGPWouZ2V0S2V5KCk9PT0icm9vdCI/ajpOdC4kZmluZE1hdGNoaW5nUGFyZW50KGosTz0+e2NvbnN0IGs9Ty5nZXRQYXJlbnQoKTtyZXR1cm4gayE9PW51bGwmJmdlLiRpc1Jvb3RPclNoYWRvd1Jvb3Qoayl9KTtGPT09bnVsbCYmKEY9ai5nZXRUb3BMZXZlbEVsZW1lbnRPclRocm93KCkpO2NvbnN0IGFlPWJTKFIpLEg9TnQuJGZpbmRNYXRjaGluZ1BhcmVudChhZSxUbC4kaXNMaW5rTm9kZSk7aWYoSCE9PW51bGwpe2NvbnN0IE89SC5nZXRVUkwoKTtfKE8pfWVsc2UgXyhudWxsKTtjb25zdCBYPUYuZ2V0S2V5KCksUD1pLmdldEVsZW1lbnRCeUtleShYKTtpZihjKFIuaGFzRm9ybWF0KCJib2xkIikpLGYoUi5oYXNGb3JtYXQoIml0YWxpYyIpKSxnKFIuaGFzRm9ybWF0KCJzdHJpa2V0aHJvdWdoIikpLFMoUi5oYXNGb3JtYXQoInVuZGVybGluZSIpKSxQIT09bnVsbClpZihhKFgpLGZvLiRpc0xpc3ROb2RlKEYpKXtjb25zdCBPPU50LiRnZXROZWFyZXN0Tm9kZU9mVHlwZShqLGZvLkxpc3ROb2RlKSxrPU8/Ty5nZXRMaXN0VHlwZSgpOkYuZ2V0TGlzdFR5cGUoKTt5KGspfWVsc2V7Y29uc3QgTz1Ccy4kaXNIZWFkaW5nTm9kZShGKT9GLmdldFRhZygpOkYuZ2V0VHlwZSgpO08gaW4gJCYmeShPKX19fSxbaV0pO3AudXNlRWZmZWN0KCgpPT5OdC5tZXJnZVJlZ2lzdGVyKG8ucmVnaXN0ZXJVcGRhdGVMaXN0ZW5lcigoe2VkaXRvclN0YXRlOlJ9KT0+e1IucmVhZCgoKT0+e1QoKX0pfSkpLFtULGksb10pLHAudXNlRWZmZWN0KCgpPT5vLnJlZ2lzdGVyQ29tbWFuZChnZS5TRUxFQ1RJT05fQ0hBTkdFX0NPTU1BTkQsKFIsaik9PihUKCksbChqKSwhMSksZ2UuQ09NTUFORF9QUklPUklUWV9DUklUSUNBTCksW28sVF0pO2NvbnN0IE09Uj0+e1siaDEiLCJoMiIsImgzIiwiaDQiLCJoNSIsImg2Il0uaW5jbHVkZXMoUik/diE9PVImJm8udXBkYXRlKCgpPT57Y29uc3Qgaj1nZS4kZ2V0U2VsZWN0aW9uKCk7Z2UuJGlzUmFuZ2VTZWxlY3Rpb24oaikmJk9vLiRzZXRCbG9ja3NUeXBlKGosKCk9PkJzLiRjcmVhdGVIZWFkaW5nTm9kZShSKSl9KTpSPT09InBhcmFncmFwaCImJnYhPT0icGFyYWdyYXBoIj9vLnVwZGF0ZSgoKT0+e2NvbnN0IGo9Z2UuJGdldFNlbGVjdGlvbigpOyhnZS4kaXNSYW5nZVNlbGVjdGlvbihqKXx8Z2UuREVQUkVDQVRFRF8kaXNHcmlkU2VsZWN0aW9uKGopKSYmT28uJHNldEJsb2Nrc1R5cGUoaiwoKT0+Z2UuJGNyZWF0ZVBhcmFncmFwaE5vZGUoKSl9KTpSPT09Im51bWJlciImJnYhPT0ibnVtYmVyIj9vLmRpc3BhdGNoQ29tbWFuZChmby5JTlNFUlRfT1JERVJFRF9MSVNUX0NPTU1BTkQsdm9pZCAwKTpSPT09ImJ1bGxldCImJnYhPT0iYnVsbGV0Ij9vLmRpc3BhdGNoQ29tbWFuZChmby5JTlNFUlRfVU5PUkRFUkVEX0xJU1RfQ09NTUFORCx2b2lkIDApOm8uZGlzcGF0Y2hDb21tYW5kKGZvLlJFTU9WRV9MSVNUX0NPTU1BTkQsdm9pZCAwKX07cmV0dXJuIHAudXNlQ2FsbGJhY2soKCk9PntvLnVwZGF0ZSgoKT0+e2NvbnN0IFI9Z2UuJGdldFNlbGVjdGlvbigpO2lmKGdlLiRpc1JhbmdlU2VsZWN0aW9uKFIpKXtjb25zdCBqPVIuYW5jaG9yLEY9Ui5mb2N1cyxhZT1SLmdldE5vZGVzKCk7aWYoai5rZXk9PT1GLmtleSYmai5vZmZzZXQ9PT1GLm9mZnNldClyZXR1cm47YWUuZm9yRWFjaCgoSCxYKT0+e2dlLiRpc1RleHROb2RlKEgpPyhYPT09MCYmai5vZmZzZXQhPT0wJiYoSD1ILnNwbGl0VGV4dChqLm9mZnNldClbMV18fEgpLFg9PT1hZS5sZW5ndGgtMSYmKEg9SC5zcGxpdFRleHQoRi5vZmZzZXQpWzBdfHxIKSxILl9fc3R5bGUhPT0iIiYmSC5zZXRTdHlsZSgiIiksSC5fX2Zvcm1hdCE9PTAmJihILnNldEZvcm1hdCgwKSxOdC4kZ2V0TmVhcmVzdEJsb2NrRWxlbWVudEFuY2VzdG9yT3JUaHJvdyhIKS5zZXRGb3JtYXQoIiIpKSk6QnMuJGlzSGVhZGluZ05vZGUoSCkmJkgucmVwbGFjZShnZS4kY3JlYXRlUGFyYWdyYXBoTm9kZSgpLCEwKX0pfX0pfSxbaV0pLHcuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJzdGlja3kgdG9wLTAgYm9yZGVyLWIgYmctYmFja2dyb3VuZCBib3JkZXItaGlnaGxpZ2h0IGZsZXggZmxleC1jb2wiLGNoaWxkcmVuOlt3LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBnYXAtMSIsY2hpbGRyZW46W3cuanN4KEJSLHtvcHRpb25zOk9iamVjdC52YWx1ZXMoJCksbGFiZWw6JFt2XT8/disiIChub3Qgc3VwcG9ydGVkKSIsb25DaGFuZ2U6Uj0+e00oQ1tSXSl9fSksdy5qc3goWG8se3ZhcmlhbnQ6InByaW1hcnkiLG9uQ2xpY2s6Uj0+e1IucHJldmVudERlZmF1bHQoKSxvLmRpc3BhdGNoQ29tbWFuZChnZS5GT1JNQVRfVEVYVF9DT01NQU5ELCJib2xkIil9LGFjdGl2ZTp1LGljb246dy5qc3goT1Ise2NsYXNzTmFtZTpgJHt1JiYic3Ryb2tlLVszcHhdIn1gfSl9KSx3LmpzeChYbyx7YWN0aXZlOmgsb25DbGljazpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLG8uZGlzcGF0Y2hDb21tYW5kKGdlLkZPUk1BVF9URVhUX0NPTU1BTkQsInN0cmlrZXRocm91Z2giKX0saWNvbjp3LmpzeChMUix7Y2xhc3NOYW1lOmAke2gmJiJzdHJva2UtWzJweF0ifWB9KX0pLHcuanN4KFhvLHthY3RpdmU6ZCxvbkNsaWNrOlI9PntSLnByZXZlbnREZWZhdWx0KCksby5kaXNwYXRjaENvbW1hbmQoZ2UuRk9STUFUX1RFWFRfQ09NTUFORCwiaXRhbGljIil9LGljb246dy5qc3goTVIse2NsYXNzTmFtZTpgJHtkJiYic3Ryb2tlLVszcHhdIn1gfSl9KSx3LmpzeChYbyx7YWN0aXZlOnghPT1udWxsLG9uQ2xpY2s6Uj0+e1IucHJldmVudERlZmF1bHQoKSxfKCIiKSxFKCIiKX0saWNvbjp3LmpzeChlUCx7d2lkdGg6MTIsaGVpZ2h0OjEyLGNsYXNzTmFtZTpgJHt4IT09bnVsbCYmInN0cm9rZS1bM3B4XSJ9YH0pfSksdy5qc3hzKCJsYWJlbCIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgY3Vyc29yLXBvaW50ZXIiLGNoaWxkcmVuOlt3LmpzeChBXyx7fSksdy5qc3goImlucHV0Iix7dHlwZToiZmlsZSIsaGlkZGVuOiEwLG9uQ2hhbmdlOlI9PntSLnByZXZlbnREZWZhdWx0KCksTlMoUikudGhlbihqPT57by5kaXNwYXRjaENvbW1hbmQoa1Msey4uLmp9KX0pLmNhdGNoKGo9Pntjb25zb2xlLmVycm9yKCJFcnJvciByZWFkaW5nIGltYWdlIixqKX0pfX0pXX0pXX0pLHghPT1udWxsJiZ3LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LXJvdyBwLTIiLGNoaWxkcmVuOlt3LmpzeCgiaW5wdXQiLHt0eXBlOiJ0ZXh0IixwbGFjZWhvbGRlcjoiRW50ZXIgVVJMIixjbGFzc05hbWU6InctMS8zIHRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIHB4LTIiLHZhbHVlOngsb25DaGFuZ2U6Uj0+e1IucHJldmVudERlZmF1bHQoKSxfKFIudGFyZ2V0LnZhbHVlKX19KSx3LmpzeChYbyx7dmFyaWFudDoicHJpbWFyeSIsb25DbGljazpSPT57Ui5wcmV2ZW50RGVmYXVsdCgpLEUoeHx8bnVsbCl9LGljb246dy5qc3goSlIse3NpemU6MTR9KX0pLHcuanN4KFhvLHt2YXJpYW50OiJwcmltYXJ5IixvbkNsaWNrOlI9PntSLnByZXZlbnREZWZhdWx0KCksRShudWxsKX0saWNvbjp3LmpzeChyUCx7c2l6ZToxNH0pfSldfSldfSl9LGlQPW9QLHRyPXt2ZXJzaW9uOjEsZm9ybWF0OiIiLGluZGVudDowLGRpcmVjdGlvbjpudWxsfTtmdW5jdGlvbiBLbChlLHQ9ITEpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm57Li4udHIsdHlwZToidGV4dCIsZm9ybWF0OiIiLHRleHQ6ZX07aWYoInRhZyJpbiBlKXN3aXRjaChlLnRhZyl7Y2FzZSJoMSI6cmV0dXJuIElpKGUpO2Nhc2UiaDIiOnJldHVybiBJaShlKTtjYXNlImgzIjpyZXR1cm4gSWkoZSk7Y2FzZSJoNCI6cmV0dXJuIElpKGUpO2Nhc2UiaDUiOnJldHVybiBJaShlKTtjYXNlImg2IjpyZXR1cm4gSWkoZSk7Y2FzZSJsaSI6cmV0dXJuIGRQKGUpO2Nhc2UicCI6cmV0dXJuIHVQKGUpO2Nhc2UidWwiOnJldHVybiBHeShlKTtjYXNlIm9sIjpyZXR1cm4gR3koZSk7Y2FzZSJzcGFuIjpyZXR1cm4gQVMoZSk7Y2FzZSJhIjpyZXR1cm4gc1AoZSk7Y2FzZSJpbWciOnJldHVybiBsUChlKTtjYXNlImJyIjpyZXR1cm4gdD97Li4udHIsdHlwZToibGluZWJyZWFrIn06Y1AoKTtkZWZhdWx0OnRocm93IEVycm9yKCJVbmV4cGVjdGVkIG5vZGUgdGFnOiAiK0pTT04uc3RyaW5naWZ5KGUsbnVsbCwyKSl9ZWxzZSB0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBub2RlOiAiK0pTT04uc3RyaW5naWZ5KGUsbnVsbCwyKSl9ZnVuY3Rpb24gbFAoZSl7Y29uc3QgdD1lLnNyYztyZXR1cm57Li4udHIsdHlwZToiaW1hZ2UiLHNyYzp0LHdpZHRoOmUud2lkdGgsaGVpZ2h0OmUuaGVpZ2h0fX1mdW5jdGlvbiBzUChlKXtyZXR1cm57Li4udHIsdHlwZToibGluayIsdXJsOmUuaHJlZixjaGlsZHJlbjplLmNoaWxkcmVuLm1hcCh0PT5LbCh0KSl9fWZ1bmN0aW9uIGFQKGUpe3JldHVybnsuLi50cixmb3JtYXQ6IiIsdHlwZToicm9vdCIsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAodD0+S2wodCkpfX1mdW5jdGlvbiBJaShlKXtyZXR1cm57Li4udHIsdHlwZToiaGVhZGluZyIsdGFnOmUudGFnLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKHQ9PktsKHQpKX19ZnVuY3Rpb24gdVAoZSl7cmV0dXJuey4uLnRyLHR5cGU6InBhcmFncmFwaCIsY2hpbGRyZW46ZS5jaGlsZHJlbi5tYXAodD0+S2wodCwhMCkpfX1mdW5jdGlvbiBjUCgpe3JldHVybnsuLi50cix0eXBlOiJwYXJhZ3JhcGgiLGNoaWxkcmVuOltdfX1mdW5jdGlvbiBkUChlKXtyZXR1cm57Li4udHIsdHlwZToibGlzdGl0ZW0iLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKHQ9PktsKHQsITApKX19ZnVuY3Rpb24gR3koZSl7cmV0dXJuey4uLnRyLHR5cGU6Imxpc3QiLGxpc3RUeXBlOmUudGFnPT09Im9sIj8ibnVtYmVyIjoiYnVsbGV0IixjaGlsZHJlbjplLmNoaWxkcmVuLm1hcCh0PT5LbCh0KSksLi4uZS5kaXI/e2RpcmVjdGlvbjplLmRpcn06e2RpcmVjdGlvbjpudWxsfX19Y29uc3QgZlA9e2JvbGQ6MSxpdGFsaWM6MiwibGluZS10aHJvdWdoIjo0fTtmdW5jdGlvbiBoUChlKXtyZXR1cm4gZS5yZWR1Y2UoKHQsbik9PnR8ZlBbbl0sMCl9ZnVuY3Rpb24gQVMoZSl7Y29uc3QgdD1lLmNoaWxkcmVuWzBdO3JldHVybiB0eXBlb2YgdD09InN0cmluZyI/ey4uLnRyLHR5cGU6InRleHQiLHRleHQ6dCxmb3JtYXQ6aFAoZS5jbGFzc2VzKX06QVMoey4uLnQsY2xhc3NlczplLmNsYXNzZXMuY29uY2F0KHQuY2xhc3Nlcyl9KX1mdW5jdGlvbiBwUChlKXtjb25zb2xlLmVycm9yKGUpfWNvbnN0IGdQPTI4LG1QPSh7cmljaHRleHQ6ZSxvbkVkaXRvcjp0fSk9Pntjb25zdHt3aW5kb3dTaXplOm59PXVtKCksbz17bmFtZXNwYWNlOiJ2YWwiLGVkaXRvclN0YXRlOmk9PntpLnNldEVkaXRvclN0YXRlKGkucGFyc2VFZGl0b3JTdGF0ZSh7cm9vdDphUChCUyhlKSl9KSl9LG5vZGVzOltCcy5IZWFkaW5nTm9kZSxqYSxmby5MaXN0Tm9kZSxmby5MaXN0SXRlbU5vZGUsVGwuTGlua05vZGVdLHRoZW1lOnt0ZXh0Ontib2xkOiJmb250LXNlbWlib2xkIix1bmRlcmxpbmU6InVuZGVybGluZSIsaXRhbGljOiJpdGFsaWMiLHN0cmlrZXRocm91Z2g6ImxpbmUtdGhyb3VnaCIsdW5kZXJsaW5lU3RyaWtldGhyb3VnaDoidW5kZXJsaW5lIGxpbmUtdGhyb3VnaCJ9LGxpc3Q6e2xpc3RpdGVtOiJtbC1bMjBweF0iLG9sOiJsaXN0LWRlY2ltYWwiLHVsOiJsaXN0LWRpc2MifSxoZWFkaW5nOntoMToidGV4dC00eGwgZm9udC1ib2xkIixoMjoidGV4dC0zeGwgZm9udC1ib2xkIixoMzoidGV4dC0yeGwgZm9udC1ib2xkIixoNDoidGV4dC14bCBmb250LWJvbGQiLGg1OiJ0ZXh0LWxnIGZvbnQtYm9sZCIsaDY6InRleHQtbWQgZm9udC1ib2xkIn0sbGluazoidGV4dC1oaWdobGlnaHQgdW5kZXJsaW5lIn0sb25FcnJvcjpwUH07cmV0dXJuIHcuanN4cyhjMi5MZXhpY2FsQ29tcG9zZXIse2luaXRpYWxDb25maWc6byxjaGlsZHJlbjpbdy5qc3goYlIse30pLHcuanN4KGlQLHtvbkVkaXRvcjp0fSksdy5qc3goY1IuUmljaFRleHRQbHVnaW4se2NvbnRlbnRFZGl0YWJsZTp3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmb250LXNhbnMgYm9yZGVyLWIgdGV4dC1wcmltYXJ5IGJvcmRlci1oaWdobGlnaHQiLHN0eWxlOnttaW5IZWlnaHQ6biE9bnVsbCYmbi5pbm5lckhlaWdodD8obj09bnVsbD92b2lkIDA6bi5pbm5lckhlaWdodCktZ1A6dm9pZCAwfSxjaGlsZHJlbjp3LmpzeChUUix7Y2xhc3NOYW1lOiJwLTQgb3V0bGluZS1ub25lIGJnLWZpbGwifSl9KSxwbGFjZWhvbGRlcjp3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiIiLGNoaWxkcmVuOiJFbnRlciBzb21lIHRleHQuLi4ifSksRXJyb3JCb3VuZGFyeTp2Mn0pLHcuanN4KCRSLkxpbmtQbHVnaW4se30pLHcuanN4KFVSLHt9KSx3LmpzeChnUi5MaXN0UGx1Z2luLHt9KSx3LmpzeChSUix7fSksdy5qc3goazIuSGlzdG9yeVBsdWdpbix7fSldfSl9O3ZhciB2UD17eG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix3aWR0aDoyNCxoZWlnaHQ6MjQsdmlld0JveDoiMCAwIDI0IDI0IixmaWxsOiJub25lIixzdHJva2U6ImN1cnJlbnRDb2xvciIsc3Ryb2tlV2lkdGg6MixzdHJva2VMaW5lY2FwOiJyb3VuZCIsc3Ryb2tlTGluZWpvaW46InJvdW5kIn07Y29uc3QgeVA9ZT0+ZS5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCIkMS0kMiIpLnRvTG93ZXJDYXNlKCkscnI9KGUsdCk9Pntjb25zdCBuPXAuZm9yd2FyZFJlZigoe2NvbG9yOnI9ImN1cnJlbnRDb2xvciIsc2l6ZTpvPTI0LHN0cm9rZVdpZHRoOmk9MixhYnNvbHV0ZVN0cm9rZVdpZHRoOmwsY2hpbGRyZW46cywuLi5hfSx1KT0+cC5jcmVhdGVFbGVtZW50KCJzdmciLHtyZWY6dSwuLi52UCx3aWR0aDpvLGhlaWdodDpvLHN0cm9rZTpyLHN0cm9rZVdpZHRoOmw/TnVtYmVyKGkpKjI0L051bWJlcihvKTppLGNsYXNzTmFtZTpgbHVjaWRlIGx1Y2lkZS0ke3lQKGUpfWAsLi4uYX0sWy4uLnQubWFwKChbYyxkXSk9PnAuY3JlYXRlRWxlbWVudChjLGQpKSwuLi4oQXJyYXkuaXNBcnJheShzKT9zOltzXSl8fFtdXSkpO3JldHVybiBuLmRpc3BsYXlOYW1lPWAke2V9YCxufSx4UD1ycigiQ2hlY2siLFtbInBvbHlsaW5lIix7cG9pbnRzOiIyMCA2IDkgMTcgNCAxMiIsa2V5OiIxMGpqZmoifV1dKSxNUz1ycigiQ2hldnJvbkRvd24iLFtbInBhdGgiLHtkOiJtNiA5IDYgNiA2LTYiLGtleToicXJ1bnNsIn1dXSksX1A9cnIoIkNoZXZyb25MZWZ0IixbWyJwYXRoIix7ZDoibTE1IDE4LTYtNiA2LTYiLGtleToiMXduZmczIn1dXSksd1A9cnIoIk1heGltaXplIixbWyJwYXRoIix7ZDoiTTggM0g1YTIgMiAwIDAgMC0yIDJ2MyIsa2V5OiIxZGNtaXQifV0sWyJwYXRoIix7ZDoiTTIxIDhWNWEyIDIgMCAwIDAtMi0yaC0zIixrZXk6IjFlNGd0MyJ9XSxbInBhdGgiLHtkOiJNMyAxNnYzYTIgMiAwIDAgMCAyIDJoMyIsa2V5OiJ3c2w1c2MifV0sWyJwYXRoIix7ZDoiTTE2IDIxaDNhMiAyIDAgMCAwIDItMnYtMyIsa2V5OiIxOHRyZWsifV1dKSxTUD1ycigiTWluaW1pemUiLFtbInBhdGgiLHtkOiJNOCAzdjNhMiAyIDAgMCAxLTIgMkgzIixrZXk6ImhvaGJ0ciJ9XSxbInBhdGgiLHtkOiJNMjEgOGgtM2EyIDIgMCAwIDEtMi0yVjMiLGtleToiNWp3MWYzIn1dLFsicGF0aCIse2Q6Ik0zIDE2aDNhMiAyIDAgMCAxIDIgMnYzIixrZXk6IjE5OHR2ciJ9XSxbInBhdGgiLHtkOiJNMTYgMjF2LTNhMiAyIDAgMCAxIDItMmgzIixrZXk6InBoOG14cCJ9XV0pLEVQPXJyKCJNb29uIixbWyJwYXRoIix7ZDoiTTEyIDNhNiA2IDAgMCAwIDkgOSA5IDkgMCAxIDEtOS05WiIsa2V5OiJhN3RuMTgifV1dKSxDUD1ycigiUGF1c2UiLFtbInJlY3QiLHt3aWR0aDoiNCIsaGVpZ2h0OiIxNiIseDoiNiIseToiNCIsa2V5OiJpZmZoZTQifV0sWyJyZWN0Iix7d2lkdGg6IjQiLGhlaWdodDoiMTYiLHg6IjE0Iix5OiI0IixrZXk6InNqaW43aiJ9XV0pLCRQPXJyKCJQbGF5IixbWyJwb2x5Z29uIix7cG9pbnRzOiI1IDMgMTkgMTIgNSAyMSA1IDMiLGtleToiMTkxNjM3In1dXSksa1A9cnIoIlBvd2VyIixbWyJwYXRoIix7ZDoiTTEyIDJ2MTAiLGtleToibW5mYmwifV0sWyJwYXRoIix7ZDoiTTE4LjQgNi42YTkgOSAwIDEgMS0xMi43Ny4wNCIsa2V5OiJvYm9mdTkifV1dKSxUUD1ycigiU3VuIixbWyJjaXJjbGUiLHtjeDoiMTIiLGN5OiIxMiIscjoiNCIsa2V5OiI0ZXhpcDIifV0sWyJwYXRoIix7ZDoiTTEyIDJ2MiIsa2V5OiJ0dXMwM20ifV0sWyJwYXRoIix7ZDoiTTEyIDIwdjIiLGtleToiMWxoMWtnIn1dLFsicGF0aCIse2Q6Im00LjkzIDQuOTMgMS40MSAxLjQxIixrZXk6IjE0OXQ2aiJ9XSxbInBhdGgiLHtkOiJtMTcuNjYgMTcuNjYgMS40MSAxLjQxIixrZXk6InB0Ymd1diJ9XSxbInBhdGgiLHtkOiJNMiAxMmgyIixrZXk6IjF0OGY4biJ9XSxbInBhdGgiLHtkOiJNMjAgMTJoMiIsa2V5OiIxcThtancifV0sWyJwYXRoIix7ZDoibTYuMzQgMTcuNjYtMS40MSAxLjQxIixrZXk6IjFtOHp6NSJ9XSxbInBhdGgiLHtkOiJtMTkuMDcgNC45My0xLjQxIDEuNDEiLGtleToiMXNobGNzIn1dXSksTlA9cnIoIlgiLFtbInBhdGgiLHtkOiJNMTggNiA2IDE4IixrZXk6IjFibDVmOCJ9XSxbInBhdGgiLHtkOiJtNiA2IDEyIDEyIixrZXk6ImQ4Yms2diJ9XV0pLERTPSJwLTEgYm9yZGVyIHJvdW5kZWQtZnVsbCBzaGFkb3cgYm9yZGVyLWFjY2VudCIsWXk9InZhbGJ1aWxkOnVybEJlZm9yZU5hdmlnYXRpb24iO2Z1bmN0aW9uIGJQKHthcGk6ZX0pe2NvbnN0e3RoZW1lOnQsc2V0VGhlbWU6bixlZGl0TW9kZTpyLHNldEVkaXRNb2RlOm99PXVtKCk7cmV0dXJuIHcuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB3LWZ1bGwgaC1mdWxsIHB4LTEgcHktMiBib3JkZXItMiByb3VuZGVkLWZ1bGwgZ2FwLXgtMyB0ZXh0LXByaW1hcnkgYmctYmFja2dyb3VuZCBib3JkZXItZmlsbCIsY2hpbGRyZW46W3cuanN4KEVmLHthY3RpdmU6cj09PSJob3ZlciIsb25DbGljazooKT0+e28oaT0+aT09PSJob3ZlciI/Im9mZiI6ImhvdmVyIil9LGNoaWxkcmVuOncuanN4KCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpyPT09ImhvdmVyIj93LmpzeChDUCx7c2l6ZToxOH0pOncuanN4KCRQLHtzaXplOjE4fSl9KX0pLHcuanN4KEVmLHtvbkNsaWNrOigpPT57bih0PT09ImRhcmsiPyJsaWdodCI6ImRhcmsiKX0sY2hpbGRyZW46dy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImgtWzI0cHhdIHctWzI0cHhdIGZsZXgganVzdGlmeS1jZW50ZXIgaXRlbXMtY2VudGVyIixjaGlsZHJlbjpbdD09PSJkYXJrIiYmdy5qc3goVFAse3NpemU6MTV9KSx0PT09ImxpZ2h0IiYmdy5qc3goRVAse3NpemU6MTV9KV19KX0pLHcuanN4KEVmLHthY3RpdmU6cj09PSJmdWxsIixvbkNsaWNrOigpPT57aWYociE9PSJmdWxsIilsb2NhbFN0b3JhZ2Uuc2V0SXRlbShZeSx3aW5kb3cubG9jYXRpb24uaHJlZiksd2luZG93LmxvY2F0aW9uLmhyZWY9ZS5nZXRFZGl0VXJsKCk7ZWxzZSBpZihyPT09ImZ1bGwiKXtjb25zdCBpPWxvY2FsU3RvcmFnZS5nZXRJdGVtKFl5KTt3aW5kb3cubG9jYXRpb24uaHJlZj1pfHwiLyJ9fSxjaGlsZHJlbjp3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJoLVsyNHB4XSB3LVsyNHB4XSBmbGV4IGp1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlciIsY2hpbGRyZW46cj09PSJmdWxsIj93LmpzeChTUCx7c2l6ZToxNX0pOncuanN4KHdQLHtzaXplOjE1fSl9KX0pLHcuanN4KCJhIix7Y2xhc3NOYW1lOkRTLGhyZWY6ZS5nZXREaXNhYmxlVXJsKCksY2hpbGRyZW46dy5qc3goImRpdiIse2NsYXNzTmFtZToiaC1bMjRweF0gdy1bMjRweF0gZmxleCBqdXN0aWZ5LWNlbnRlciBpdGVtcy1jZW50ZXIiLGNoaWxkcmVuOncuanN4KGtQLHtzaXplOjE4fSl9KX0pXX0pfWZ1bmN0aW9uIEVmKHthY3RpdmU6ZSxvbkNsaWNrOnQsY2hpbGRyZW46bn0pe3JldHVybiB3LmpzeCgiYnV0dG9uIix7Y2xhc3NOYW1lOnJkKERTLHsiYmctYWNjZW50IGRyb3Atc2hhZG93LVswcHhfMHB4XzEycHhfcmdiYSg1NiwyMDUsMTUyLDAuNjApXSI6ZX0pLG9uQ2xpY2s6dCxjaGlsZHJlbjpufSl9ZnVuY3Rpb24gTFMoZSl7dmFyIHQsbixyPSIiO2lmKHR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJudW1iZXIiKXIrPWU7ZWxzZSBpZih0eXBlb2YgZT09Im9iamVjdCIpaWYoQXJyYXkuaXNBcnJheShlKSlmb3IodD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0mJihuPUxTKGVbdF0pKSYmKHImJihyKz0iICIpLHIrPW4pO2Vsc2UgZm9yKHQgaW4gZSllW3RdJiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9ZnVuY3Rpb24gUlAoKXtmb3IodmFyIGUsdCxuPTAscj0iIjtuPGFyZ3VtZW50cy5sZW5ndGg7KShlPWFyZ3VtZW50c1tuKytdKSYmKHQ9TFMoZSkpJiYociYmKHIrPSIgIikscis9dCk7cmV0dXJuIHJ9Y29uc3QgWHk9ZT0+dHlwZW9mIGU9PSJib29sZWFuIj8iIi5jb25jYXQoZSk6ZT09PTA/IjAiOmUsUXk9UlAsUFA9KGUsdCk9Pm49Pnt2YXIgcjtpZigodD09bnVsbD92b2lkIDA6dC52YXJpYW50cyk9PW51bGwpcmV0dXJuIFF5KGUsbj09bnVsbD92b2lkIDA6bi5jbGFzcyxuPT1udWxsP3ZvaWQgMDpuLmNsYXNzTmFtZSk7Y29uc3R7dmFyaWFudHM6byxkZWZhdWx0VmFyaWFudHM6aX09dCxsPU9iamVjdC5rZXlzKG8pLm1hcCh1PT57Y29uc3QgYz1uPT1udWxsP3ZvaWQgMDpuW3VdLGQ9aT09bnVsbD92b2lkIDA6aVt1XTtpZihjPT09bnVsbClyZXR1cm4gbnVsbDtjb25zdCBmPVh5KGMpfHxYeShkKTtyZXR1cm4gb1t1XVtmXX0pLHM9biYmT2JqZWN0LmVudHJpZXMobikucmVkdWNlKCh1LGMpPT57bGV0W2QsZl09YztyZXR1cm4gZj09PXZvaWQgMHx8KHVbZF09ZiksdX0se30pLGE9dD09bnVsbHx8KHI9dC5jb21wb3VuZFZhcmlhbnRzKT09PW51bGx8fHI9PT12b2lkIDA/dm9pZCAwOnIucmVkdWNlKCh1LGMpPT57bGV0e2NsYXNzOmQsY2xhc3NOYW1lOmYsLi4uaH09YztyZXR1cm4gT2JqZWN0LmVudHJpZXMoaCkuZXZlcnkoZz0+e2xldFttLFNdPWc7cmV0dXJuIEFycmF5LmlzQXJyYXkoUyk/Uy5pbmNsdWRlcyh7Li4uaSwuLi5zfVttXSk6ey4uLmksLi4uc31bbV09PT1TfSk/Wy4uLnUsZCxmXTp1fSxbXSk7cmV0dXJuIFF5KGUsbCxhLG49PW51bGw/dm9pZCAwOm4uY2xhc3Msbj09bnVsbD92b2lkIDA6bi5jbGFzc05hbWUpfSxPUD1QUCgiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHdoaXRlc3BhY2Utbm93cmFwIHJvdW5kZWQtbWQgdGV4dC1zbSBmb250LW1lZGl1bSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIHRyYW5zaXRpb24tY29sb3JzIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAiLHt2YXJpYW50czp7dmFyaWFudDp7ZGVmYXVsdDoiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1wcmltYXJ5LzkwIixkZXN0cnVjdGl2ZToiYmctZGVzdHJ1Y3RpdmUgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGhvdmVyOmJnLWRlc3RydWN0aXZlLzkwIixvdXRsaW5lOiJib3JkZXIgYm9yZGVyLWlucHV0IGJnLWJhY2tncm91bmQgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQiLHNlY29uZGFyeToiYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgaG92ZXI6Ymctc2Vjb25kYXJ5LzgwIixnaG9zdDoiaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQiLGxpbms6InRleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lIn0sc2l6ZTp7ZGVmYXVsdDoiaC0xMCBweC00IHB5LTIiLHNtOiJoLTkgcm91bmRlZC1tZCBweC0zIixsZzoiaC0xMSByb3VuZGVkLW1kIHB4LTgiLGljb246ImgtMTAgdy0xMCJ9fSxkZWZhdWx0VmFyaWFudHM6e3ZhcmlhbnQ6ImRlZmF1bHQiLHNpemU6ImRlZmF1bHQifX0pLEdsPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLHZhcmlhbnQ6dCxzaXplOm4sYXNDaGlsZDpyPSExLC4uLm99LGkpPT57Y29uc3QgbD1yP0VsOiJidXR0b24iO3JldHVybiB3LmpzeChsLHtjbGFzc05hbWU6b3QoT1Aoe3ZhcmlhbnQ6dCxzaXplOm4sY2xhc3NOYW1lOmV9KSkscmVmOmksLi4ub30pfSk7R2wuZGlzcGxheU5hbWU9IkJ1dHRvbiI7ZnVuY3Rpb24gQVAoZT0iZGFyayIpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZShlKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidmFsLXRoZW1lIik9PT0ibGlnaHQiP24oImxpZ2h0Iik6bG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhbC10aGVtZSIpPT09ImRhcmsifHx3aW5kb3cubWF0Y2hNZWRpYSYmd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogZGFyaykiKS5tYXRjaGVzP24oImRhcmsiKTp3aW5kb3cubWF0Y2hNZWRpYSYmd2luZG93Lm1hdGNoTWVkaWEoIihwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIikubWF0Y2hlcyYmbigibGlnaHQiKTtjb25zdCByPW89Pntsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgidmFsLXRoZW1lIil8fG4oby5tYXRjaGVzPyJkYXJrIjoibGlnaHQiKX07cmV0dXJuIHdpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixyKSwoKT0+e3dpbmRvdy5tYXRjaE1lZGlhKCIocHJlZmVycy1jb2xvci1zY2hlbWU6IGRhcmspIikucmVtb3ZlRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixyKX19LFtdKSxbdCxyPT57bG9jYWxTdG9yYWdlLnNldEl0ZW0oInZhbC10aGVtZSIsciksbihyKX1dfWZ1bmN0aW9uIGhtKCl7cmV0dXJue2FzeW5jOiExLGJyZWFrczohMSxleHRlbnNpb25zOm51bGwsZ2ZtOiEwLGhvb2tzOm51bGwscGVkYW50aWM6ITEscmVuZGVyZXI6bnVsbCxzaWxlbnQ6ITEsdG9rZW5pemVyOm51bGwsd2Fsa1Rva2VuczpudWxsfX1sZXQgTmk9aG0oKTtmdW5jdGlvbiBJUyhlKXtOaT1lfWNvbnN0IGpTPS9bJjw+IiddLyxNUD1uZXcgUmVnRXhwKGpTLnNvdXJjZSwiZyIpLHpTPS9bPD4iJ118Jig/ISgjXGR7MSw3fXwjW1h4XVthLWZBLUYwLTldezEsNn18XHcrKTspLyxEUD1uZXcgUmVnRXhwKHpTLnNvdXJjZSwiZyIpLExQPXsiJiI6IiZhbXA7IiwiPCI6IiZsdDsiLCI+IjoiJmd0OyIsJyInOiImcXVvdDsiLCInIjoiJiMzOTsifSxKeT1lPT5MUFtlXTtmdW5jdGlvbiB2bihlLHQpe2lmKHQpe2lmKGpTLnRlc3QoZSkpcmV0dXJuIGUucmVwbGFjZShNUCxKeSl9ZWxzZSBpZih6Uy50ZXN0KGUpKXJldHVybiBlLnJlcGxhY2UoRFAsSnkpO3JldHVybiBlfWNvbnN0IElQPS8mKCMoPzpcZCspfCg/OiN4WzAtOUEtRmEtZl0rKXwoPzpcdyspKTs/L2lnO2Z1bmN0aW9uIGpQKGUpe3JldHVybiBlLnJlcGxhY2UoSVAsKHQsbik9PihuPW4udG9Mb3dlckNhc2UoKSxuPT09ImNvbG9uIj8iOiI6bi5jaGFyQXQoMCk9PT0iIyI/bi5jaGFyQXQoMSk9PT0ieCI/U3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChuLnN1YnN0cmluZygyKSwxNikpOlN0cmluZy5mcm9tQ2hhckNvZGUoK24uc3Vic3RyaW5nKDEpKToiIikpfWNvbnN0IHpQPS8oXnxbXlxbXSlcXi9nO2Z1bmN0aW9uIFJlKGUsdCl7ZT10eXBlb2YgZT09InN0cmluZyI/ZTplLnNvdXJjZSx0PXR8fCIiO2NvbnN0IG49e3JlcGxhY2U6KHIsbyk9PihvPXR5cGVvZiBvPT0ib2JqZWN0IiYmInNvdXJjZSJpbiBvP28uc291cmNlOm8sbz1vLnJlcGxhY2UoelAsIiQxIiksZT1lLnJlcGxhY2UocixvKSxuKSxnZXRSZWdleDooKT0+bmV3IFJlZ0V4cChlLHQpfTtyZXR1cm4gbn1mdW5jdGlvbiBaeShlKXt0cnl7ZT1lbmNvZGVVUkkoZSkucmVwbGFjZSgvJTI1L2csIiUiKX1jYXRjaHtyZXR1cm4gbnVsbH1yZXR1cm4gZX1jb25zdCBiYz17ZXhlYzooKT0+bnVsbH07ZnVuY3Rpb24gcXkoZSx0KXtjb25zdCBuPWUucmVwbGFjZSgvXHwvZywoaSxsLHMpPT57bGV0IGE9ITEsdT1sO2Zvcig7LS11Pj0wJiZzW3VdPT09IlxcIjspYT0hYTtyZXR1cm4gYT8ifCI6IiB8In0pLHI9bi5zcGxpdCgvIFx8Lyk7bGV0IG89MDtpZihyWzBdLnRyaW0oKXx8ci5zaGlmdCgpLHIubGVuZ3RoPjAmJiFyW3IubGVuZ3RoLTFdLnRyaW0oKSYmci5wb3AoKSx0KWlmKHIubGVuZ3RoPnQpci5zcGxpY2UodCk7ZWxzZSBmb3IoO3IubGVuZ3RoPHQ7KXIucHVzaCgiIik7Zm9yKDtvPHIubGVuZ3RoO28rKylyW29dPXJbb10udHJpbSgpLnJlcGxhY2UoL1xcXHwvZywifCIpO3JldHVybiByfWZ1bmN0aW9uIENmKGUsdCxuKXtjb25zdCByPWUubGVuZ3RoO2lmKHI9PT0wKXJldHVybiIiO2xldCBvPTA7Zm9yKDtvPHI7KXtjb25zdCBpPWUuY2hhckF0KHItby0xKTtpZihpPT09dCYmIW4pbysrO2Vsc2UgaWYoaSE9PXQmJm4pbysrO2Vsc2UgYnJlYWt9cmV0dXJuIGUuc2xpY2UoMCxyLW8pfWZ1bmN0aW9uIEZQKGUsdCl7aWYoZS5pbmRleE9mKHRbMV0pPT09LTEpcmV0dXJuLTE7bGV0IG49MDtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKylpZihlW3JdPT09IlxcIilyKys7ZWxzZSBpZihlW3JdPT09dFswXSluKys7ZWxzZSBpZihlW3JdPT09dFsxXSYmKG4tLSxuPDApKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIGUwKGUsdCxuLHIpe2NvbnN0IG89dC5ocmVmLGk9dC50aXRsZT92bih0LnRpdGxlKTpudWxsLGw9ZVsxXS5yZXBsYWNlKC9cXChbXFtcXV0pL2csIiQxIik7aWYoZVswXS5jaGFyQXQoMCkhPT0iISIpe3Iuc3RhdGUuaW5MaW5rPSEwO2NvbnN0IHM9e3R5cGU6ImxpbmsiLHJhdzpuLGhyZWY6byx0aXRsZTppLHRleHQ6bCx0b2tlbnM6ci5pbmxpbmVUb2tlbnMobCl9O3JldHVybiByLnN0YXRlLmluTGluaz0hMSxzfXJldHVybnt0eXBlOiJpbWFnZSIscmF3Om4saHJlZjpvLHRpdGxlOmksdGV4dDp2bihsKX19ZnVuY3Rpb24gQlAoZSx0KXtjb25zdCBuPWUubWF0Y2goL14oXHMrKSg/OmBgYCkvKTtpZihuPT09bnVsbClyZXR1cm4gdDtjb25zdCByPW5bMV07cmV0dXJuIHQuc3BsaXQoYApgKS5tYXAobz0+e2NvbnN0IGk9by5tYXRjaCgvXlxzKy8pO2lmKGk9PT1udWxsKXJldHVybiBvO2NvbnN0W2xdPWk7cmV0dXJuIGwubGVuZ3RoPj1yLmxlbmd0aD9vLnNsaWNlKHIubGVuZ3RoKTpvfSkuam9pbihgCmApfWNsYXNzIFJje2NvbnN0cnVjdG9yKHQpe2plKHRoaXMsIm9wdGlvbnMiKTtqZSh0aGlzLCJydWxlcyIpO2plKHRoaXMsImxleGVyIik7dGhpcy5vcHRpb25zPXR8fE5pfXNwYWNlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5uZXdsaW5lLmV4ZWModCk7aWYobiYmblswXS5sZW5ndGg+MClyZXR1cm57dHlwZToic3BhY2UiLHJhdzpuWzBdfX1jb2RlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5jb2RlLmV4ZWModCk7aWYobil7Y29uc3Qgcj1uWzBdLnJlcGxhY2UoL14gezEsNH0vZ20sIiIpO3JldHVybnt0eXBlOiJjb2RlIixyYXc6blswXSxjb2RlQmxvY2tTdHlsZToiaW5kZW50ZWQiLHRleHQ6dGhpcy5vcHRpb25zLnBlZGFudGljP3I6Q2YocixgCmApfX19ZmVuY2VzKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5mZW5jZXMuZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMF0sbz1CUChyLG5bM118fCIiKTtyZXR1cm57dHlwZToiY29kZSIscmF3OnIsbGFuZzpuWzJdP25bMl0udHJpbSgpLnJlcGxhY2UodGhpcy5ydWxlcy5pbmxpbmUuX2VzY2FwZXMsIiQxIik6blsyXSx0ZXh0Om99fX1oZWFkaW5nKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5oZWFkaW5nLmV4ZWModCk7aWYobil7bGV0IHI9blsyXS50cmltKCk7aWYoLyMkLy50ZXN0KHIpKXtjb25zdCBvPUNmKHIsIiMiKTsodGhpcy5vcHRpb25zLnBlZGFudGljfHwhb3x8LyAkLy50ZXN0KG8pKSYmKHI9by50cmltKCkpfXJldHVybnt0eXBlOiJoZWFkaW5nIixyYXc6blswXSxkZXB0aDpuWzFdLmxlbmd0aCx0ZXh0OnIsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKHIpfX19aHIodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmhyLmV4ZWModCk7aWYobilyZXR1cm57dHlwZToiaHIiLHJhdzpuWzBdfX1ibG9ja3F1b3RlKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5ibG9ja3F1b3RlLmV4ZWModCk7aWYobil7Y29uc3Qgcj1uWzBdLnJlcGxhY2UoL14gKj5bIFx0XT8vZ20sIiIpLG89dGhpcy5sZXhlci5zdGF0ZS50b3A7dGhpcy5sZXhlci5zdGF0ZS50b3A9ITA7Y29uc3QgaT10aGlzLmxleGVyLmJsb2NrVG9rZW5zKHIpO3JldHVybiB0aGlzLmxleGVyLnN0YXRlLnRvcD1vLHt0eXBlOiJibG9ja3F1b3RlIixyYXc6blswXSx0b2tlbnM6aSx0ZXh0OnJ9fX1saXN0KHQpe2xldCBuPXRoaXMucnVsZXMuYmxvY2subGlzdC5leGVjKHQpO2lmKG4pe2xldCByPW5bMV0udHJpbSgpO2NvbnN0IG89ci5sZW5ndGg+MSxpPXt0eXBlOiJsaXN0IixyYXc6IiIsb3JkZXJlZDpvLHN0YXJ0Om8/K3Iuc2xpY2UoMCwtMSk6IiIsbG9vc2U6ITEsaXRlbXM6W119O3I9bz9gXFxkezEsOX1cXCR7ci5zbGljZSgtMSl9YDpgXFwke3J9YCx0aGlzLm9wdGlvbnMucGVkYW50aWMmJihyPW8/cjoiWyorLV0iKTtjb25zdCBsPW5ldyBSZWdFeHAoYF4oIHswLDN9JHtyfSkoKD86WwkgXVteXFxuXSopPyg/OlxcbnwkKSlgKTtsZXQgcz0iIixhPSIiLHU9ITE7Zm9yKDt0Oyl7bGV0IGM9ITE7aWYoIShuPWwuZXhlYyh0KSl8fHRoaXMucnVsZXMuYmxvY2suaHIudGVzdCh0KSlicmVhaztzPW5bMF0sdD10LnN1YnN0cmluZyhzLmxlbmd0aCk7bGV0IGQ9blsyXS5zcGxpdChgCmAsMSlbMF0ucmVwbGFjZSgvXlx0Ky8sdj0+IiAiLnJlcGVhdCgzKnYubGVuZ3RoKSksZj10LnNwbGl0KGAKYCwxKVswXSxoPTA7dGhpcy5vcHRpb25zLnBlZGFudGljPyhoPTIsYT1kLnRyaW1TdGFydCgpKTooaD1uWzJdLnNlYXJjaCgvW14gXS8pLGg9aD40PzE6aCxhPWQuc2xpY2UoaCksaCs9blsxXS5sZW5ndGgpO2xldCBnPSExO2lmKCFkJiYvXiAqJC8udGVzdChmKSYmKHMrPWYrYApgLHQ9dC5zdWJzdHJpbmcoZi5sZW5ndGgrMSksYz0hMCksIWMpe2NvbnN0IHY9bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsaC0xKX19KD86WyorLV18XFxkezEsOX1bLildKSgoPzpbIAldW15cXG5dKik/KD86XFxufCQpKWApLHk9bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsaC0xKX19KCg/Oi0gKil7Myx9fCg/Ol8gKil7Myx9fCg/OlxcKiAqKXszLH0pKD86XFxuK3wkKWApLHg9bmV3IFJlZ0V4cChgXiB7MCwke01hdGgubWluKDMsaC0xKX19KD86XGBcYFxgfH5+filgKSxfPW5ldyBSZWdFeHAoYF4gezAsJHtNYXRoLm1pbigzLGgtMSl9fSNgKTtmb3IoO3Q7KXtjb25zdCBFPXQuc3BsaXQoYApgLDEpWzBdO2lmKGY9RSx0aGlzLm9wdGlvbnMucGVkYW50aWMmJihmPWYucmVwbGFjZSgvXiB7MSw0fSg/PSggezR9KSpbXiBdKS9nLCIgICIpKSx4LnRlc3QoZil8fF8udGVzdChmKXx8di50ZXN0KGYpfHx5LnRlc3QodCkpYnJlYWs7aWYoZi5zZWFyY2goL1teIF0vKT49aHx8IWYudHJpbSgpKWErPWAKYCtmLnNsaWNlKGgpO2Vsc2V7aWYoZ3x8ZC5zZWFyY2goL1teIF0vKT49NHx8eC50ZXN0KGQpfHxfLnRlc3QoZCl8fHkudGVzdChkKSlicmVhazthKz1gCmArZn0hZyYmIWYudHJpbSgpJiYoZz0hMCkscys9RStgCmAsdD10LnN1YnN0cmluZyhFLmxlbmd0aCsxKSxkPWYuc2xpY2UoaCl9fWkubG9vc2V8fCh1P2kubG9vc2U9ITA6L1xuICpcbiAqJC8udGVzdChzKSYmKHU9ITApKTtsZXQgbT1udWxsLFM7dGhpcy5vcHRpb25zLmdmbSYmKG09L15cW1sgeFhdXF0gLy5leGVjKGEpLG0mJihTPW1bMF0hPT0iWyBdICIsYT1hLnJlcGxhY2UoL15cW1sgeFhdXF0gKy8sIiIpKSksaS5pdGVtcy5wdXNoKHt0eXBlOiJsaXN0X2l0ZW0iLHJhdzpzLHRhc2s6ISFtLGNoZWNrZWQ6Uyxsb29zZTohMSx0ZXh0OmEsdG9rZW5zOltdfSksaS5yYXcrPXN9aS5pdGVtc1tpLml0ZW1zLmxlbmd0aC0xXS5yYXc9cy50cmltRW5kKCksaS5pdGVtc1tpLml0ZW1zLmxlbmd0aC0xXS50ZXh0PWEudHJpbUVuZCgpLGkucmF3PWkucmF3LnRyaW1FbmQoKTtmb3IobGV0IGM9MDtjPGkuaXRlbXMubGVuZ3RoO2MrKylpZih0aGlzLmxleGVyLnN0YXRlLnRvcD0hMSxpLml0ZW1zW2NdLnRva2Vucz10aGlzLmxleGVyLmJsb2NrVG9rZW5zKGkuaXRlbXNbY10udGV4dCxbXSksIWkubG9vc2Upe2NvbnN0IGQ9aS5pdGVtc1tjXS50b2tlbnMuZmlsdGVyKGg9PmgudHlwZT09PSJzcGFjZSIpLGY9ZC5sZW5ndGg+MCYmZC5zb21lKGg9Pi9cbi4qXG4vLnRlc3QoaC5yYXcpKTtpLmxvb3NlPWZ9aWYoaS5sb29zZSlmb3IobGV0IGM9MDtjPGkuaXRlbXMubGVuZ3RoO2MrKylpLml0ZW1zW2NdLmxvb3NlPSEwO3JldHVybiBpfX1odG1sKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5ibG9jay5odG1sLmV4ZWModCk7aWYobilyZXR1cm57dHlwZToiaHRtbCIsYmxvY2s6ITAscmF3Om5bMF0scHJlOm5bMV09PT0icHJlInx8blsxXT09PSJzY3JpcHQifHxuWzFdPT09InN0eWxlIix0ZXh0Om5bMF19fWRlZih0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2suZGVmLmV4ZWModCk7aWYobil7Y29uc3Qgcj1uWzFdLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXHMrL2csIiAiKSxvPW5bMl0/blsyXS5yZXBsYWNlKC9ePCguKik+JC8sIiQxIikucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5fZXNjYXBlcywiJDEiKToiIixpPW5bM10/blszXS5zdWJzdHJpbmcoMSxuWzNdLmxlbmd0aC0xKS5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLl9lc2NhcGVzLCIkMSIpOm5bM107cmV0dXJue3R5cGU6ImRlZiIsdGFnOnIscmF3Om5bMF0saHJlZjpvLHRpdGxlOml9fX10YWJsZSh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2sudGFibGUuZXhlYyh0KTtpZihuKXtpZighL1s6fF0vLnRlc3QoblsyXSkpcmV0dXJuO2NvbnN0IHI9e3R5cGU6InRhYmxlIixyYXc6blswXSxoZWFkZXI6cXkoblsxXSkubWFwKG89Pih7dGV4dDpvLHRva2VuczpbXX0pKSxhbGlnbjpuWzJdLnJlcGxhY2UoL15cfHxcfCAqJC9nLCIiKS5zcGxpdCgifCIpLHJvd3M6blszXSYmblszXS50cmltKCk/blszXS5yZXBsYWNlKC9cblsgXHRdKiQvLCIiKS5zcGxpdChgCmApOltdfTtpZihyLmhlYWRlci5sZW5ndGg9PT1yLmFsaWduLmxlbmd0aCl7bGV0IG89ci5hbGlnbi5sZW5ndGgsaSxsLHMsYTtmb3IoaT0wO2k8bztpKyspe2NvbnN0IHU9ci5hbGlnbltpXTt1JiYoL14gKi0rOiAqJC8udGVzdCh1KT9yLmFsaWduW2ldPSJyaWdodCI6L14gKjotKzogKiQvLnRlc3QodSk/ci5hbGlnbltpXT0iY2VudGVyIjovXiAqOi0rICokLy50ZXN0KHUpP3IuYWxpZ25baV09ImxlZnQiOnIuYWxpZ25baV09bnVsbCl9Zm9yKG89ci5yb3dzLmxlbmd0aCxpPTA7aTxvO2krKylyLnJvd3NbaV09cXkoci5yb3dzW2ldLHIuaGVhZGVyLmxlbmd0aCkubWFwKHU9Pih7dGV4dDp1LHRva2VuczpbXX0pKTtmb3Iobz1yLmhlYWRlci5sZW5ndGgsbD0wO2w8bztsKyspci5oZWFkZXJbbF0udG9rZW5zPXRoaXMubGV4ZXIuaW5saW5lKHIuaGVhZGVyW2xdLnRleHQpO2ZvcihvPXIucm93cy5sZW5ndGgsbD0wO2w8bztsKyspZm9yKGE9ci5yb3dzW2xdLHM9MDtzPGEubGVuZ3RoO3MrKylhW3NdLnRva2Vucz10aGlzLmxleGVyLmlubGluZShhW3NdLnRleHQpO3JldHVybiByfX19bGhlYWRpbmcodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLmxoZWFkaW5nLmV4ZWModCk7aWYobilyZXR1cm57dHlwZToiaGVhZGluZyIscmF3Om5bMF0sZGVwdGg6blsyXS5jaGFyQXQoMCk9PT0iPSI/MToyLHRleHQ6blsxXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmUoblsxXSl9fXBhcmFncmFwaCh0KXtjb25zdCBuPXRoaXMucnVsZXMuYmxvY2sucGFyYWdyYXBoLmV4ZWModCk7aWYobil7Y29uc3Qgcj1uWzFdLmNoYXJBdChuWzFdLmxlbmd0aC0xKT09PWAKYD9uWzFdLnNsaWNlKDAsLTEpOm5bMV07cmV0dXJue3R5cGU6InBhcmFncmFwaCIscmF3Om5bMF0sdGV4dDpyLHRva2Vuczp0aGlzLmxleGVyLmlubGluZShyKX19fXRleHQodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmJsb2NrLnRleHQuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJ0ZXh0IixyYXc6blswXSx0ZXh0Om5bMF0sdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lKG5bMF0pfX1lc2NhcGUodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5lc2NhcGUuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJlc2NhcGUiLHJhdzpuWzBdLHRleHQ6dm4oblsxXSl9fXRhZyh0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLnRhZy5leGVjKHQpO2lmKG4pcmV0dXJuIXRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rJiYvXjxhIC9pLnRlc3QoblswXSk/dGhpcy5sZXhlci5zdGF0ZS5pbkxpbms9ITA6dGhpcy5sZXhlci5zdGF0ZS5pbkxpbmsmJi9ePFwvYT4vaS50ZXN0KG5bMF0pJiYodGhpcy5sZXhlci5zdGF0ZS5pbkxpbms9ITEpLCF0aGlzLmxleGVyLnN0YXRlLmluUmF3QmxvY2smJi9ePChwcmV8Y29kZXxrYmR8c2NyaXB0KShcc3w+KS9pLnRlc3QoblswXSk/dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrPSEwOnRoaXMubGV4ZXIuc3RhdGUuaW5SYXdCbG9jayYmL148XC8ocHJlfGNvZGV8a2JkfHNjcmlwdCkoXHN8PikvaS50ZXN0KG5bMF0pJiYodGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrPSExKSx7dHlwZToiaHRtbCIscmF3Om5bMF0saW5MaW5rOnRoaXMubGV4ZXIuc3RhdGUuaW5MaW5rLGluUmF3QmxvY2s6dGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrLGJsb2NrOiExLHRleHQ6blswXX19bGluayh0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmxpbmsuZXhlYyh0KTtpZihuKXtjb25zdCByPW5bMl0udHJpbSgpO2lmKCF0aGlzLm9wdGlvbnMucGVkYW50aWMmJi9ePC8udGVzdChyKSl7aWYoIS8+JC8udGVzdChyKSlyZXR1cm47Y29uc3QgbD1DZihyLnNsaWNlKDAsLTEpLCJcXCIpO2lmKChyLmxlbmd0aC1sLmxlbmd0aCklMj09PTApcmV0dXJufWVsc2V7Y29uc3QgbD1GUChuWzJdLCIoKSIpO2lmKGw+LTEpe2NvbnN0IGE9KG5bMF0uaW5kZXhPZigiISIpPT09MD81OjQpK25bMV0ubGVuZ3RoK2w7blsyXT1uWzJdLnN1YnN0cmluZygwLGwpLG5bMF09blswXS5zdWJzdHJpbmcoMCxhKS50cmltKCksblszXT0iIn19bGV0IG89blsyXSxpPSIiO2lmKHRoaXMub3B0aW9ucy5wZWRhbnRpYyl7Y29uc3QgbD0vXihbXiciXSpbXlxzXSlccysoWyciXSkoLiopXDIvLmV4ZWMobyk7bCYmKG89bFsxXSxpPWxbM10pfWVsc2UgaT1uWzNdP25bM10uc2xpY2UoMSwtMSk6IiI7cmV0dXJuIG89by50cmltKCksL148Ly50ZXN0KG8pJiYodGhpcy5vcHRpb25zLnBlZGFudGljJiYhLz4kLy50ZXN0KHIpP289by5zbGljZSgxKTpvPW8uc2xpY2UoMSwtMSkpLGUwKG4se2hyZWY6byYmby5yZXBsYWNlKHRoaXMucnVsZXMuaW5saW5lLl9lc2NhcGVzLCIkMSIpLHRpdGxlOmkmJmkucmVwbGFjZSh0aGlzLnJ1bGVzLmlubGluZS5fZXNjYXBlcywiJDEiKX0sblswXSx0aGlzLmxleGVyKX19cmVmbGluayh0LG4pe2xldCByO2lmKChyPXRoaXMucnVsZXMuaW5saW5lLnJlZmxpbmsuZXhlYyh0KSl8fChyPXRoaXMucnVsZXMuaW5saW5lLm5vbGluay5leGVjKHQpKSl7bGV0IG89KHJbMl18fHJbMV0pLnJlcGxhY2UoL1xzKy9nLCIgIik7aWYobz1uW28udG9Mb3dlckNhc2UoKV0sIW8pe2NvbnN0IGk9clswXS5jaGFyQXQoMCk7cmV0dXJue3R5cGU6InRleHQiLHJhdzppLHRleHQ6aX19cmV0dXJuIGUwKHIsbyxyWzBdLHRoaXMubGV4ZXIpfX1lbVN0cm9uZyh0LG4scj0iIil7bGV0IG89dGhpcy5ydWxlcy5pbmxpbmUuZW1TdHJvbmcubERlbGltLmV4ZWModCk7aWYoIW98fG9bM10mJnIubWF0Y2goL1tccHtMfVxwe059XS91KSlyZXR1cm47aWYoIShvWzFdfHxvWzJdfHwiIil8fCFyfHx0aGlzLnJ1bGVzLmlubGluZS5wdW5jdHVhdGlvbi5leGVjKHIpKXtjb25zdCBsPVsuLi5vWzBdXS5sZW5ndGgtMTtsZXQgcyxhLHU9bCxjPTA7Y29uc3QgZD1vWzBdWzBdPT09IioiP3RoaXMucnVsZXMuaW5saW5lLmVtU3Ryb25nLnJEZWxpbUFzdDp0aGlzLnJ1bGVzLmlubGluZS5lbVN0cm9uZy5yRGVsaW1VbmQ7Zm9yKGQubGFzdEluZGV4PTAsbj1uLnNsaWNlKC0xKnQubGVuZ3RoK29bMF0ubGVuZ3RoLTEpOyhvPWQuZXhlYyhuKSkhPW51bGw7KXtpZihzPW9bMV18fG9bMl18fG9bM118fG9bNF18fG9bNV18fG9bNl0sIXMpY29udGludWU7aWYoYT1bLi4uc10ubGVuZ3RoLG9bM118fG9bNF0pe3UrPWE7Y29udGludWV9ZWxzZSBpZigob1s1XXx8b1s2XSkmJmwlMyYmISgobCthKSUzKSl7Yys9YTtjb250aW51ZX1pZih1LT1hLHU+MCljb250aW51ZTthPU1hdGgubWluKGEsYSt1K2MpO2NvbnN0IGY9Wy4uLnRdLnNsaWNlKDAsbCtvLmluZGV4K2ErMSkuam9pbigiIik7aWYoTWF0aC5taW4obCxhKSUyKXtjb25zdCBnPWYuc2xpY2UoMSwtMSk7cmV0dXJue3R5cGU6ImVtIixyYXc6Zix0ZXh0OmcsdG9rZW5zOnRoaXMubGV4ZXIuaW5saW5lVG9rZW5zKGcpfX1jb25zdCBoPWYuc2xpY2UoMiwtMik7cmV0dXJue3R5cGU6InN0cm9uZyIscmF3OmYsdGV4dDpoLHRva2Vuczp0aGlzLmxleGVyLmlubGluZVRva2VucyhoKX19fX1jb2Rlc3Bhbih0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmNvZGUuZXhlYyh0KTtpZihuKXtsZXQgcj1uWzJdLnJlcGxhY2UoL1xuL2csIiAiKTtjb25zdCBvPS9bXiBdLy50ZXN0KHIpLGk9L14gLy50ZXN0KHIpJiYvICQvLnRlc3Qocik7cmV0dXJuIG8mJmkmJihyPXIuc3Vic3RyaW5nKDEsci5sZW5ndGgtMSkpLHI9dm4ociwhMCkse3R5cGU6ImNvZGVzcGFuIixyYXc6blswXSx0ZXh0OnJ9fX1icih0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLmJyLmV4ZWModCk7aWYobilyZXR1cm57dHlwZToiYnIiLHJhdzpuWzBdfX1kZWwodCl7Y29uc3Qgbj10aGlzLnJ1bGVzLmlubGluZS5kZWwuZXhlYyh0KTtpZihuKXJldHVybnt0eXBlOiJkZWwiLHJhdzpuWzBdLHRleHQ6blsyXSx0b2tlbnM6dGhpcy5sZXhlci5pbmxpbmVUb2tlbnMoblsyXSl9fWF1dG9saW5rKHQpe2NvbnN0IG49dGhpcy5ydWxlcy5pbmxpbmUuYXV0b2xpbmsuZXhlYyh0KTtpZihuKXtsZXQgcixvO3JldHVybiBuWzJdPT09IkAiPyhyPXZuKG5bMV0pLG89Im1haWx0bzoiK3IpOihyPXZuKG5bMV0pLG89cikse3R5cGU6ImxpbmsiLHJhdzpuWzBdLHRleHQ6cixocmVmOm8sdG9rZW5zOlt7dHlwZToidGV4dCIscmF3OnIsdGV4dDpyfV19fX11cmwodCl7bGV0IG47aWYobj10aGlzLnJ1bGVzLmlubGluZS51cmwuZXhlYyh0KSl7bGV0IHIsbztpZihuWzJdPT09IkAiKXI9dm4oblswXSksbz0ibWFpbHRvOiIrcjtlbHNle2xldCBpO2RvIGk9blswXSxuWzBdPXRoaXMucnVsZXMuaW5saW5lLl9iYWNrcGVkYWwuZXhlYyhuWzBdKVswXTt3aGlsZShpIT09blswXSk7cj12bihuWzBdKSxuWzFdPT09Ind3dy4iP289Imh0dHA6Ly8iK25bMF06bz1uWzBdfXJldHVybnt0eXBlOiJsaW5rIixyYXc6blswXSx0ZXh0OnIsaHJlZjpvLHRva2Vuczpbe3R5cGU6InRleHQiLHJhdzpyLHRleHQ6cn1dfX19aW5saW5lVGV4dCh0KXtjb25zdCBuPXRoaXMucnVsZXMuaW5saW5lLnRleHQuZXhlYyh0KTtpZihuKXtsZXQgcjtyZXR1cm4gdGhpcy5sZXhlci5zdGF0ZS5pblJhd0Jsb2NrP3I9blswXTpyPXZuKG5bMF0pLHt0eXBlOiJ0ZXh0IixyYXc6blswXSx0ZXh0OnJ9fX19Y29uc3QgcmU9e25ld2xpbmU6L14oPzogKig/OlxufCQpKSsvLGNvZGU6L14oIHs0fVteXG5dKyg/OlxuKD86ICooPzpcbnwkKSkqKT8pKy8sZmVuY2VzOi9eIHswLDN9KGB7Myx9KD89W15gXG5dKig/OlxufCQpKXx+ezMsfSkoW15cbl0qKSg/OlxufCQpKD86fChbXHNcU10qPykoPzpcbnwkKSkoPzogezAsM31cMVt+YF0qICooPz1cbnwkKXwkKS8saHI6L14gezAsM30oKD86LVtcdCBdKil7Myx9fCg/Ol9bIFx0XSopezMsfXwoPzpcKlsgXHRdKil7Myx9KSg/OlxuK3wkKS8saGVhZGluZzovXiB7MCwzfSgjezEsNn0pKD89XHN8JCkoLiopKD86XG4rfCQpLyxibG9ja3F1b3RlOi9eKCB7MCwzfT4gPyhwYXJhZ3JhcGh8W15cbl0qKSg/OlxufCQpKSsvLGxpc3Q6L14oIHswLDN9YnVsbCkoWyBcdF1bXlxuXSs/KT8oPzpcbnwkKS8saHRtbDoiXiB7MCwzfSg/Ojwoc2NyaXB0fHByZXxzdHlsZXx0ZXh0YXJlYSlbXFxzPl1bXFxzXFxTXSo/KD86PC9cXDE+W15cXG5dKlxcbit8JCl8Y29tbWVudFteXFxuXSooXFxuK3wkKXw8XFw/W1xcc1xcU10qPyg/OlxcPz5cXG4qfCQpfDwhW0EtWl1bXFxzXFxTXSo/KD86Plxcbip8JCl8PCFcXFtDREFUQVxcW1tcXHNcXFNdKj8oPzpcXF1cXF0+XFxuKnwkKXw8Lz8odGFnKSg/OiArfFxcbnwvPz4pW1xcc1xcU10qPyg/Oig/OlxcbiAqKStcXG58JCl8PCg/IXNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWEpKFthLXpdW1xcdy1dKikoPzphdHRyaWJ1dGUpKj8gKi8/Pig/PVsgXFx0XSooPzpcXG58JCkpW1xcc1xcU10qPyg/Oig/OlxcbiAqKStcXG58JCl8PC8oPyFzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhKVthLXpdW1xcdy1dKlxccyo+KD89WyBcXHRdKig/OlxcbnwkKSlbXFxzXFxTXSo/KD86KD86XFxuICopK1xcbnwkKSkiLGRlZjovXiB7MCwzfVxbKGxhYmVsKVxdOiAqKD86XG4gKik/KFtePFxzXVteXHNdKnw8Lio/PikoPzooPzogKyg/OlxuICopP3wgKlxuICopKHRpdGxlKSk/ICooPzpcbit8JCkvLHRhYmxlOmJjLGxoZWFkaW5nOi9eKD8hYnVsbCApKCg/Oi58XG4oPyFccyo/XG58YnVsbCApKSs/KVxuIHswLDN9KD0rfC0rKSAqKD86XG4rfCQpLyxfcGFyYWdyYXBoOi9eKFteXG5dKyg/OlxuKD8haHJ8aGVhZGluZ3xsaGVhZGluZ3xibG9ja3F1b3RlfGZlbmNlc3xsaXN0fGh0bWx8dGFibGV8ICtcbilbXlxuXSspKikvLHRleHQ6L15bXlxuXSsvfTtyZS5fbGFiZWw9Lyg/IVxzKlxdKSg/OlxcLnxbXlxbXF1cXF0pKy87cmUuX3RpdGxlPS8oPzoiKD86XFwiP3xbXiJcXF0pKiJ8J1teJ1xuXSooPzpcblteJ1xuXSspKlxuPyd8XChbXigpXSpcKSkvO3JlLmRlZj1SZShyZS5kZWYpLnJlcGxhY2UoImxhYmVsIixyZS5fbGFiZWwpLnJlcGxhY2UoInRpdGxlIixyZS5fdGl0bGUpLmdldFJlZ2V4KCk7cmUuYnVsbGV0PS8oPzpbKistXXxcZHsxLDl9Wy4pXSkvO3JlLmxpc3RJdGVtU3RhcnQ9UmUoL14oICopKGJ1bGwpICovKS5yZXBsYWNlKCJidWxsIixyZS5idWxsZXQpLmdldFJlZ2V4KCk7cmUubGlzdD1SZShyZS5saXN0KS5yZXBsYWNlKC9idWxsL2cscmUuYnVsbGV0KS5yZXBsYWNlKCJociIsIlxcbisoPz1cXDE/KD86KD86LSAqKXszLH18KD86XyAqKXszLH18KD86XFwqICopezMsfSkoPzpcXG4rfCQpKSIpLnJlcGxhY2UoImRlZiIsIlxcbisoPz0iK3JlLmRlZi5zb3VyY2UrIikiKS5nZXRSZWdleCgpO3JlLl90YWc9ImFkZHJlc3N8YXJ0aWNsZXxhc2lkZXxiYXNlfGJhc2Vmb250fGJsb2NrcXVvdGV8Ym9keXxjYXB0aW9ufGNlbnRlcnxjb2x8Y29sZ3JvdXB8ZGR8ZGV0YWlsc3xkaWFsb2d8ZGlyfGRpdnxkbHxkdHxmaWVsZHNldHxmaWdjYXB0aW9ufGZpZ3VyZXxmb290ZXJ8Zm9ybXxmcmFtZXxmcmFtZXNldHxoWzEtNl18aGVhZHxoZWFkZXJ8aHJ8aHRtbHxpZnJhbWV8bGVnZW5kfGxpfGxpbmt8bWFpbnxtZW51fG1lbnVpdGVtfG1ldGF8bmF2fG5vZnJhbWVzfG9sfG9wdGdyb3VwfG9wdGlvbnxwfHBhcmFtfHNlY3Rpb258c291cmNlfHN1bW1hcnl8dGFibGV8dGJvZHl8dGR8dGZvb3R8dGh8dGhlYWR8dGl0bGV8dHJ8dHJhY2t8dWwiO3JlLl9jb21tZW50PS88IS0tKD8hLT8+KVtcc1xTXSo/KD86LS0+fCQpLztyZS5odG1sPVJlKHJlLmh0bWwsImkiKS5yZXBsYWNlKCJjb21tZW50IixyZS5fY29tbWVudCkucmVwbGFjZSgidGFnIixyZS5fdGFnKS5yZXBsYWNlKCJhdHRyaWJ1dGUiLC8gK1thLXpBLVo6X11bXHcuOi1dKig/OiAqPSAqIlteIlxuXSoifCAqPSAqJ1teJ1xuXSonfCAqPSAqW15ccyInPTw+YF0rKT8vKS5nZXRSZWdleCgpO3JlLmxoZWFkaW5nPVJlKHJlLmxoZWFkaW5nKS5yZXBsYWNlKC9idWxsL2cscmUuYnVsbGV0KS5nZXRSZWdleCgpO3JlLnBhcmFncmFwaD1SZShyZS5fcGFyYWdyYXBoKS5yZXBsYWNlKCJociIscmUuaHIpLnJlcGxhY2UoImhlYWRpbmciLCIgezAsM30jezEsNn0gIikucmVwbGFjZSgifGxoZWFkaW5nIiwiIikucmVwbGFjZSgifHRhYmxlIiwiIikucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJmZW5jZXMiLCIgezAsM30oPzpgezMsfSg/PVteYFxcbl0qXFxuKXx+ezMsfSlbXlxcbl0qXFxuIikucmVwbGFjZSgibGlzdCIsIiB7MCwzfSg/OlsqKy1dfDFbLildKSAiKS5yZXBsYWNlKCJodG1sIiwiPC8/KD86dGFnKSg/OiArfFxcbnwvPz4pfDwoPzpzY3JpcHR8cHJlfHN0eWxlfHRleHRhcmVhfCEtLSkiKS5yZXBsYWNlKCJ0YWciLHJlLl90YWcpLmdldFJlZ2V4KCk7cmUuYmxvY2txdW90ZT1SZShyZS5ibG9ja3F1b3RlKS5yZXBsYWNlKCJwYXJhZ3JhcGgiLHJlLnBhcmFncmFwaCkuZ2V0UmVnZXgoKTtyZS5ub3JtYWw9ey4uLnJlfTtyZS5nZm09ey4uLnJlLm5vcm1hbCx0YWJsZToiXiAqKFteXFxuIF0uKilcXG4gezAsM30oKD86XFx8ICopPzo/LSs6PyAqKD86XFx8ICo6Py0rOj8gKikqKD86XFx8ICopPykoPzpcXG4oKD86KD8hICpcXG58aHJ8aGVhZGluZ3xibG9ja3F1b3RlfGNvZGV8ZmVuY2VzfGxpc3R8aHRtbCkuKig/OlxcbnwkKSkqKVxcbip8JCkifTtyZS5nZm0udGFibGU9UmUocmUuZ2ZtLnRhYmxlKS5yZXBsYWNlKCJociIscmUuaHIpLnJlcGxhY2UoImhlYWRpbmciLCIgezAsM30jezEsNn0gIikucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJjb2RlIiwiIHs0fVteXFxuXSIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIscmUuX3RhZykuZ2V0UmVnZXgoKTtyZS5nZm0ucGFyYWdyYXBoPVJlKHJlLl9wYXJhZ3JhcGgpLnJlcGxhY2UoImhyIixyZS5ocikucmVwbGFjZSgiaGVhZGluZyIsIiB7MCwzfSN7MSw2fSAiKS5yZXBsYWNlKCJ8bGhlYWRpbmciLCIiKS5yZXBsYWNlKCJ0YWJsZSIscmUuZ2ZtLnRhYmxlKS5yZXBsYWNlKCJibG9ja3F1b3RlIiwiIHswLDN9PiIpLnJlcGxhY2UoImZlbmNlcyIsIiB7MCwzfSg/OmB7Myx9KD89W15gXFxuXSpcXG4pfH57Myx9KVteXFxuXSpcXG4iKS5yZXBsYWNlKCJsaXN0IiwiIHswLDN9KD86WyorLV18MVsuKV0pICIpLnJlcGxhY2UoImh0bWwiLCI8Lz8oPzp0YWcpKD86ICt8XFxufC8/Pil8PCg/OnNjcmlwdHxwcmV8c3R5bGV8dGV4dGFyZWF8IS0tKSIpLnJlcGxhY2UoInRhZyIscmUuX3RhZykuZ2V0UmVnZXgoKTtyZS5wZWRhbnRpYz17Li4ucmUubm9ybWFsLGh0bWw6UmUoYF4gKig/OmNvbW1lbnQgKig/OlxcbnxcXHMqJCl8PCh0YWcpW1xcc1xcU10rPzwvXFwxPiAqKD86XFxuezIsfXxcXHMqJCl8PHRhZyg/OiJbXiJdKiJ8J1teJ10qJ3xcXHNbXiciLz5cXHNdKikqPy8/PiAqKD86XFxuezIsfXxcXHMqJCkpYCkucmVwbGFjZSgiY29tbWVudCIscmUuX2NvbW1lbnQpLnJlcGxhY2UoL3RhZy9nLCIoPyEoPzphfGVtfHN0cm9uZ3xzbWFsbHxzfGNpdGV8cXxkZm58YWJicnxkYXRhfHRpbWV8Y29kZXx2YXJ8c2FtcHxrYmR8c3VifHN1cHxpfGJ8dXxtYXJrfHJ1Ynl8cnR8cnB8YmRpfGJkb3xzcGFufGJyfHdicnxpbnN8ZGVsfGltZylcXGIpXFx3Kyg/ITp8W15cXHdcXHNAXSpAKVxcYiIpLmdldFJlZ2V4KCksZGVmOi9eICpcWyhbXlxdXSspXF06ICo8PyhbXlxzPl0rKT4/KD86ICsoWyIoXVteXG5dK1siKV0pKT8gKig/OlxuK3wkKS8saGVhZGluZzovXigjezEsNn0pKC4qKSg/OlxuK3wkKS8sZmVuY2VzOmJjLGxoZWFkaW5nOi9eKC4rPylcbiB7MCwzfSg9K3wtKykgKig/OlxuK3wkKS8scGFyYWdyYXBoOlJlKHJlLm5vcm1hbC5fcGFyYWdyYXBoKS5yZXBsYWNlKCJociIscmUuaHIpLnJlcGxhY2UoImhlYWRpbmciLGAgKiN7MSw2fSAqW14KXWApLnJlcGxhY2UoImxoZWFkaW5nIixyZS5saGVhZGluZykucmVwbGFjZSgiYmxvY2txdW90ZSIsIiB7MCwzfT4iKS5yZXBsYWNlKCJ8ZmVuY2VzIiwiIikucmVwbGFjZSgifGxpc3QiLCIiKS5yZXBsYWNlKCJ8aHRtbCIsIiIpLmdldFJlZ2V4KCl9O2NvbnN0IEs9e2VzY2FwZTovXlxcKFshIiMkJSYnKCkqKyxcLS4vOjs8PT4/QFxbXF1cXF5fYHt8fX5dKS8sYXV0b2xpbms6L148KHNjaGVtZTpbXlxzXHgwMC1ceDFmPD5dKnxlbWFpbCk+Lyx1cmw6YmMsdGFnOiJeY29tbWVudHxePC9bYS16QS1aXVtcXHc6LV0qXFxzKj58XjxbYS16QS1aXVtcXHctXSooPzphdHRyaWJ1dGUpKj9cXHMqLz8+fF48XFw/W1xcc1xcU10qP1xcPz58XjwhW2EtekEtWl0rXFxzW1xcc1xcU10qPz58XjwhXFxbQ0RBVEFcXFtbXFxzXFxTXSo/XFxdXFxdPiIsbGluazovXiE/XFsobGFiZWwpXF1cKFxzKihocmVmKSg/OlxzKyh0aXRsZSkpP1xzKlwpLyxyZWZsaW5rOi9eIT9cWyhsYWJlbClcXVxbKHJlZilcXS8sbm9saW5rOi9eIT9cWyhyZWYpXF0oPzpcW1xdKT8vLHJlZmxpbmtTZWFyY2g6InJlZmxpbmt8bm9saW5rKD8hXFwoKSIsZW1TdHJvbmc6e2xEZWxpbTovXig/OlwqKyg/OigoPyFcKilbcHVuY3RdKXxbXlxzKl0pKXxeXysoPzooKD8hXylbcHVuY3RdKXwoW15cc19dKSkvLHJEZWxpbUFzdDovXlteXypdKj9fX1teXypdKj9cKlteXypdKj8oPz1fXyl8W14qXSsoPz1bXipdKXwoPyFcKilbcHVuY3RdKFwqKykoPz1bXHNdfCQpfFtecHVuY3Rcc10oXCorKSg/IVwqKSg/PVtwdW5jdFxzXXwkKXwoPyFcKilbcHVuY3Rcc10oXCorKSg/PVtecHVuY3Rcc10pfFtcc10oXCorKSg/IVwqKSg/PVtwdW5jdF0pfCg/IVwqKVtwdW5jdF0oXCorKSg/IVwqKSg/PVtwdW5jdF0pfFtecHVuY3Rcc10oXCorKSg/PVtecHVuY3Rcc10pLyxyRGVsaW1VbmQ6L15bXl8qXSo/XCpcKlteXypdKj9fW15fKl0qPyg/PVwqXCopfFteX10rKD89W15fXSl8KD8hXylbcHVuY3RdKF8rKSg/PVtcc118JCl8W15wdW5jdFxzXShfKykoPyFfKSg/PVtwdW5jdFxzXXwkKXwoPyFfKVtwdW5jdFxzXShfKykoPz1bXnB1bmN0XHNdKXxbXHNdKF8rKSg/IV8pKD89W3B1bmN0XSl8KD8hXylbcHVuY3RdKF8rKSg/IV8pKD89W3B1bmN0XSkvfSxjb2RlOi9eKGArKShbXmBdfFteYF1bXHNcU10qP1teYF0pXDEoPyFgKS8sYnI6L14oIHsyLH18XFwpXG4oPyFccyokKS8sZGVsOmJjLHRleHQ6L14oYCt8W15gXSkoPzooPz0gezIsfVxuKXxbXHNcU10qPyg/Oig/PVtcXDwhXFtgKl9dfFxiX3wkKXxbXiBdKD89IHsyLH1cbikpKS8scHVuY3R1YXRpb246L14oKD8hWypfXSlbXHNwdW5jdHVhdGlvbl0pL307Sy5fcHVuY3R1YXRpb249IlxccHtQfSQrPD0+YF58fiI7Sy5wdW5jdHVhdGlvbj1SZShLLnB1bmN0dWF0aW9uLCJ1IikucmVwbGFjZSgvcHVuY3R1YXRpb24vZyxLLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtLLmJsb2NrU2tpcD0vXFtbXltcXV0qP1xdXChbXlwoXCldKj9cKXxgW15gXSo/YHw8W148Pl0qPz4vZztLLmFueVB1bmN0dWF0aW9uPS9cXFtwdW5jdF0vZztLLl9lc2NhcGVzPS9cXChbcHVuY3RdKS9nO0suX2NvbW1lbnQ9UmUocmUuX2NvbW1lbnQpLnJlcGxhY2UoIig/Oi0tPnwkKSIsIi0tPiIpLmdldFJlZ2V4KCk7Sy5lbVN0cm9uZy5sRGVsaW09UmUoSy5lbVN0cm9uZy5sRGVsaW0sInUiKS5yZXBsYWNlKC9wdW5jdC9nLEsuX3B1bmN0dWF0aW9uKS5nZXRSZWdleCgpO0suZW1TdHJvbmcuckRlbGltQXN0PVJlKEsuZW1TdHJvbmcuckRlbGltQXN0LCJndSIpLnJlcGxhY2UoL3B1bmN0L2csSy5fcHVuY3R1YXRpb24pLmdldFJlZ2V4KCk7Sy5lbVN0cm9uZy5yRGVsaW1VbmQ9UmUoSy5lbVN0cm9uZy5yRGVsaW1VbmQsImd1IikucmVwbGFjZSgvcHVuY3QvZyxLLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtLLmFueVB1bmN0dWF0aW9uPVJlKEsuYW55UHVuY3R1YXRpb24sImd1IikucmVwbGFjZSgvcHVuY3QvZyxLLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtLLl9lc2NhcGVzPVJlKEsuX2VzY2FwZXMsImd1IikucmVwbGFjZSgvcHVuY3QvZyxLLl9wdW5jdHVhdGlvbikuZ2V0UmVnZXgoKTtLLl9zY2hlbWU9L1thLXpBLVpdW2EtekEtWjAtOSsuLV17MSwzMX0vO0suX2VtYWlsPS9bYS16QS1aMC05LiEjJCUmJyorLz0/Xl9ge3x9fi1dKyhAKVthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPyg/OlwuW2EtekEtWjAtOV0oPzpbYS16QS1aMC05LV17MCw2MX1bYS16QS1aMC05XSk/KSsoPyFbLV9dKS87Sy5hdXRvbGluaz1SZShLLmF1dG9saW5rKS5yZXBsYWNlKCJzY2hlbWUiLEsuX3NjaGVtZSkucmVwbGFjZSgiZW1haWwiLEsuX2VtYWlsKS5nZXRSZWdleCgpO0suX2F0dHJpYnV0ZT0vXHMrW2EtekEtWjpfXVtcdy46LV0qKD86XHMqPVxzKiJbXiJdKiJ8XHMqPVxzKidbXiddKid8XHMqPVxzKlteXHMiJz08PmBdKyk/LztLLnRhZz1SZShLLnRhZykucmVwbGFjZSgiY29tbWVudCIsSy5fY29tbWVudCkucmVwbGFjZSgiYXR0cmlidXRlIixLLl9hdHRyaWJ1dGUpLmdldFJlZ2V4KCk7Sy5fbGFiZWw9Lyg/OlxbKD86XFwufFteXFtcXVxcXSkqXF18XFwufGBbXmBdKmB8W15cW1xdXFxgXSkqPy87Sy5faHJlZj0vPCg/OlxcLnxbXlxuPD5cXF0pKz58W15cc1x4MDAtXHgxZl0qLztLLl90aXRsZT0vIig/OlxcIj98W14iXFxdKSoifCcoPzpcXCc/fFteJ1xcXSkqJ3xcKCg/OlxcXCk/fFteKVxcXSkqXCkvO0subGluaz1SZShLLmxpbmspLnJlcGxhY2UoImxhYmVsIixLLl9sYWJlbCkucmVwbGFjZSgiaHJlZiIsSy5faHJlZikucmVwbGFjZSgidGl0bGUiLEsuX3RpdGxlKS5nZXRSZWdleCgpO0sucmVmbGluaz1SZShLLnJlZmxpbmspLnJlcGxhY2UoImxhYmVsIixLLl9sYWJlbCkucmVwbGFjZSgicmVmIixyZS5fbGFiZWwpLmdldFJlZ2V4KCk7Sy5ub2xpbms9UmUoSy5ub2xpbmspLnJlcGxhY2UoInJlZiIscmUuX2xhYmVsKS5nZXRSZWdleCgpO0sucmVmbGlua1NlYXJjaD1SZShLLnJlZmxpbmtTZWFyY2gsImciKS5yZXBsYWNlKCJyZWZsaW5rIixLLnJlZmxpbmspLnJlcGxhY2UoIm5vbGluayIsSy5ub2xpbmspLmdldFJlZ2V4KCk7Sy5ub3JtYWw9ey4uLkt9O0sucGVkYW50aWM9ey4uLksubm9ybWFsLHN0cm9uZzp7c3RhcnQ6L15fX3xcKlwqLyxtaWRkbGU6L15fXyg/PVxTKShbXHNcU10qP1xTKV9fKD8hXyl8XlwqXCooPz1cUykoW1xzXFNdKj9cUylcKlwqKD8hXCopLyxlbmRBc3Q6L1wqXCooPyFcKikvZyxlbmRVbmQ6L19fKD8hXykvZ30sZW06e3N0YXJ0Oi9eX3xcKi8sbWlkZGxlOi9eKClcKig/PVxTKShbXHNcU10qP1xTKVwqKD8hXCopfF5fKD89XFMpKFtcc1xTXSo/XFMpXyg/IV8pLyxlbmRBc3Q6L1wqKD8hXCopL2csZW5kVW5kOi9fKD8hXykvZ30sbGluazpSZSgvXiE/XFsobGFiZWwpXF1cKCguKj8pXCkvKS5yZXBsYWNlKCJsYWJlbCIsSy5fbGFiZWwpLmdldFJlZ2V4KCkscmVmbGluazpSZSgvXiE/XFsobGFiZWwpXF1ccypcWyhbXlxdXSopXF0vKS5yZXBsYWNlKCJsYWJlbCIsSy5fbGFiZWwpLmdldFJlZ2V4KCl9O0suZ2ZtPXsuLi5LLm5vcm1hbCxlc2NhcGU6UmUoSy5lc2NhcGUpLnJlcGxhY2UoIl0pIiwifnxdKSIpLmdldFJlZ2V4KCksX2V4dGVuZGVkX2VtYWlsOi9bQS1aYS16MC05Ll8rLV0rKEApW2EtekEtWjAtOS1fXSsoPzpcLlthLXpBLVowLTktX10qW2EtekEtWjAtOV0pKyg/IVstX10pLyx1cmw6L14oKD86ZnRwfGh0dHBzPyk6XC9cL3x3d3dcLikoPzpbYS16QS1aMC05XC1dK1wuPykrW15cczxdKnxeZW1haWwvLF9iYWNrcGVkYWw6Lyg/OltePyEuLDo7Kl8nIn4oKSZdK3xcKFteKV0qXCl8Jig/IVthLXpBLVowLTldKzskKXxbPyEuLDo7Kl8nIn4pXSsoPyEkKSkrLyxkZWw6L14ofn4/KSg/PVteXHN+XSkoW1xzXFNdKj9bXlxzfl0pXDEoPz1bXn5dfCQpLyx0ZXh0Oi9eKFtgfl0rfFteYH5dKSg/Oig/PSB7Mix9XG4pfCg/PVthLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dK0ApfFtcc1xTXSo/KD86KD89W1xcPCFcW2Aqfl9dfFxiX3xodHRwcz86XC9cL3xmdHA6XC9cL3x3d3dcLnwkKXxbXiBdKD89IHsyLH1cbil8W15hLXpBLVowLTkuISMkJSYnKitcLz0/X2B7XHx9fi1dKD89W2EtekEtWjAtOS4hIyQlJicqK1wvPT9fYHtcfH1+LV0rQCkpKS99O0suZ2ZtLnVybD1SZShLLmdmbS51cmwsImkiKS5yZXBsYWNlKCJlbWFpbCIsSy5nZm0uX2V4dGVuZGVkX2VtYWlsKS5nZXRSZWdleCgpO0suYnJlYWtzPXsuLi5LLmdmbSxicjpSZShLLmJyKS5yZXBsYWNlKCJ7Mix9IiwiKiIpLmdldFJlZ2V4KCksdGV4dDpSZShLLmdmbS50ZXh0KS5yZXBsYWNlKCJcXGJfIiwiXFxiX3wgezIsfVxcbiIpLnJlcGxhY2UoL1x7MixcfS9nLCIqIikuZ2V0UmVnZXgoKX07Y2xhc3MgZnJ7Y29uc3RydWN0b3IodCl7amUodGhpcywidG9rZW5zIik7amUodGhpcywib3B0aW9ucyIpO2plKHRoaXMsInN0YXRlIik7amUodGhpcywidG9rZW5pemVyIik7amUodGhpcywiaW5saW5lUXVldWUiKTt0aGlzLnRva2Vucz1bXSx0aGlzLnRva2Vucy5saW5rcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMub3B0aW9ucz10fHxOaSx0aGlzLm9wdGlvbnMudG9rZW5pemVyPXRoaXMub3B0aW9ucy50b2tlbml6ZXJ8fG5ldyBSYyx0aGlzLnRva2VuaXplcj10aGlzLm9wdGlvbnMudG9rZW5pemVyLHRoaXMudG9rZW5pemVyLm9wdGlvbnM9dGhpcy5vcHRpb25zLHRoaXMudG9rZW5pemVyLmxleGVyPXRoaXMsdGhpcy5pbmxpbmVRdWV1ZT1bXSx0aGlzLnN0YXRlPXtpbkxpbms6ITEsaW5SYXdCbG9jazohMSx0b3A6ITB9O2NvbnN0IG49e2Jsb2NrOnJlLm5vcm1hbCxpbmxpbmU6Sy5ub3JtYWx9O3RoaXMub3B0aW9ucy5wZWRhbnRpYz8obi5ibG9jaz1yZS5wZWRhbnRpYyxuLmlubGluZT1LLnBlZGFudGljKTp0aGlzLm9wdGlvbnMuZ2ZtJiYobi5ibG9jaz1yZS5nZm0sdGhpcy5vcHRpb25zLmJyZWFrcz9uLmlubGluZT1LLmJyZWFrczpuLmlubGluZT1LLmdmbSksdGhpcy50b2tlbml6ZXIucnVsZXM9bn1zdGF0aWMgZ2V0IHJ1bGVzKCl7cmV0dXJue2Jsb2NrOnJlLGlubGluZTpLfX1zdGF0aWMgbGV4KHQsbil7cmV0dXJuIG5ldyBmcihuKS5sZXgodCl9c3RhdGljIGxleElubGluZSh0LG4pe3JldHVybiBuZXcgZnIobikuaW5saW5lVG9rZW5zKHQpfWxleCh0KXt0PXQucmVwbGFjZSgvXHJcbnxcci9nLGAKYCksdGhpcy5ibG9ja1Rva2Vucyh0LHRoaXMudG9rZW5zKTtsZXQgbjtmb3IoO249dGhpcy5pbmxpbmVRdWV1ZS5zaGlmdCgpOyl0aGlzLmlubGluZVRva2VucyhuLnNyYyxuLnRva2Vucyk7cmV0dXJuIHRoaXMudG9rZW5zfWJsb2NrVG9rZW5zKHQsbj1bXSl7dGhpcy5vcHRpb25zLnBlZGFudGljP3Q9dC5yZXBsYWNlKC9cdC9nLCIgICAgIikucmVwbGFjZSgvXiArJC9nbSwiIik6dD10LnJlcGxhY2UoL14oICopKFx0KykvZ20sKHMsYSx1KT0+YSsiICAgICIucmVwZWF0KHUubGVuZ3RoKSk7bGV0IHIsbyxpLGw7Zm9yKDt0OylpZighKHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5ibG9jayYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuYmxvY2suc29tZShzPT4ocj1zLmNhbGwoe2xleGVyOnRoaXN9LHQsbikpPyh0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpLCEwKTohMSkpKXtpZihyPXRoaXMudG9rZW5pemVyLnNwYWNlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksci5yYXcubGVuZ3RoPT09MSYmbi5sZW5ndGg+MD9uW24ubGVuZ3RoLTFdLnJhdys9YApgOm4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmNvZGUodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxvPW5bbi5sZW5ndGgtMV0sbyYmKG8udHlwZT09PSJwYXJhZ3JhcGgifHxvLnR5cGU9PT0idGV4dCIpPyhvLnJhdys9YApgK3IucmF3LG8udGV4dCs9YApgK3IudGV4dCx0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoLTFdLnNyYz1vLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmZlbmNlcyh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmhlYWRpbmcodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5ocih0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmJsb2NrcXVvdGUodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5saXN0KHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuaHRtbCh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmRlZih0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG89bltuLmxlbmd0aC0xXSxvJiYoby50eXBlPT09InBhcmFncmFwaCJ8fG8udHlwZT09PSJ0ZXh0Iik/KG8ucmF3Kz1gCmArci5yYXcsby50ZXh0Kz1gCmArci5yYXcsdGhpcy5pbmxpbmVRdWV1ZVt0aGlzLmlubGluZVF1ZXVlLmxlbmd0aC0xXS5zcmM9by50ZXh0KTp0aGlzLnRva2Vucy5saW5rc1tyLnRhZ118fCh0aGlzLnRva2Vucy5saW5rc1tyLnRhZ109e2hyZWY6ci5ocmVmLHRpdGxlOnIudGl0bGV9KTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnRhYmxlKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIubGhlYWRpbmcodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYoaT10LHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5zdGFydEJsb2NrKXtsZXQgcz0xLzA7Y29uc3QgYT10LnNsaWNlKDEpO2xldCB1O3RoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0QmxvY2suZm9yRWFjaChjPT57dT1jLmNhbGwoe2xleGVyOnRoaXN9LGEpLHR5cGVvZiB1PT0ibnVtYmVyIiYmdT49MCYmKHM9TWF0aC5taW4ocyx1KSl9KSxzPDEvMCYmcz49MCYmKGk9dC5zdWJzdHJpbmcoMCxzKzEpKX1pZih0aGlzLnN0YXRlLnRvcCYmKHI9dGhpcy50b2tlbml6ZXIucGFyYWdyYXBoKGkpKSl7bz1uW24ubGVuZ3RoLTFdLGwmJm8udHlwZT09PSJwYXJhZ3JhcGgiPyhvLnJhdys9YApgK3IucmF3LG8udGV4dCs9YApgK3IudGV4dCx0aGlzLmlubGluZVF1ZXVlLnBvcCgpLHRoaXMuaW5saW5lUXVldWVbdGhpcy5pbmxpbmVRdWV1ZS5sZW5ndGgtMV0uc3JjPW8udGV4dCk6bi5wdXNoKHIpLGw9aS5sZW5ndGghPT10Lmxlbmd0aCx0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCk7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci50ZXh0KHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbz1uW24ubGVuZ3RoLTFdLG8mJm8udHlwZT09PSJ0ZXh0Ij8oby5yYXcrPWAKYCtyLnJhdyxvLnRleHQrPWAKYCtyLnRleHQsdGhpcy5pbmxpbmVRdWV1ZS5wb3AoKSx0aGlzLmlubGluZVF1ZXVlW3RoaXMuaW5saW5lUXVldWUubGVuZ3RoLTFdLnNyYz1vLnRleHQpOm4ucHVzaChyKTtjb250aW51ZX1pZih0KXtjb25zdCBzPSJJbmZpbml0ZSBsb29wIG9uIGJ5dGU6ICIrdC5jaGFyQ29kZUF0KDApO2lmKHRoaXMub3B0aW9ucy5zaWxlbnQpe2NvbnNvbGUuZXJyb3Iocyk7YnJlYWt9ZWxzZSB0aHJvdyBuZXcgRXJyb3Iocyl9fXJldHVybiB0aGlzLnN0YXRlLnRvcD0hMCxufWlubGluZSh0LG49W10pe3JldHVybiB0aGlzLmlubGluZVF1ZXVlLnB1c2goe3NyYzp0LHRva2VuczpufSksbn1pbmxpbmVUb2tlbnModCxuPVtdKXtsZXQgcixvLGksbD10LHMsYSx1O2lmKHRoaXMudG9rZW5zLmxpbmtzKXtjb25zdCBjPU9iamVjdC5rZXlzKHRoaXMudG9rZW5zLmxpbmtzKTtpZihjLmxlbmd0aD4wKWZvcig7KHM9dGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2guZXhlYyhsKSkhPW51bGw7KWMuaW5jbHVkZXMoc1swXS5zbGljZShzWzBdLmxhc3RJbmRleE9mKCJbIikrMSwtMSkpJiYobD1sLnNsaWNlKDAscy5pbmRleCkrIlsiKyJhIi5yZXBlYXQoc1swXS5sZW5ndGgtMikrIl0iK2wuc2xpY2UodGhpcy50b2tlbml6ZXIucnVsZXMuaW5saW5lLnJlZmxpbmtTZWFyY2gubGFzdEluZGV4KSl9Zm9yKDsocz10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYmxvY2tTa2lwLmV4ZWMobCkpIT1udWxsOylsPWwuc2xpY2UoMCxzLmluZGV4KSsiWyIrImEiLnJlcGVhdChzWzBdLmxlbmd0aC0yKSsiXSIrbC5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYmxvY2tTa2lwLmxhc3RJbmRleCk7Zm9yKDsocz10aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24uZXhlYyhsKSkhPW51bGw7KWw9bC5zbGljZSgwLHMuaW5kZXgpKyIrKyIrbC5zbGljZSh0aGlzLnRva2VuaXplci5ydWxlcy5pbmxpbmUuYW55UHVuY3R1YXRpb24ubGFzdEluZGV4KTtmb3IoO3Q7KWlmKGF8fCh1PSIiKSxhPSExLCEodGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLmlubGluZSYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMuaW5saW5lLnNvbWUoYz0+KHI9Yy5jYWxsKHtsZXhlcjp0aGlzfSx0LG4pKT8odD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKSwhMCk6ITEpKSl7aWYocj10aGlzLnRva2VuaXplci5lc2NhcGUodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci50YWcodCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxvPW5bbi5sZW5ndGgtMV0sbyYmci50eXBlPT09InRleHQiJiZvLnR5cGU9PT0idGV4dCI/KG8ucmF3Kz1yLnJhdyxvLnRleHQrPXIudGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIubGluayh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLnJlZmxpbmsodCx0aGlzLnRva2Vucy5saW5rcykpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxvPW5bbi5sZW5ndGgtMV0sbyYmci50eXBlPT09InRleHQiJiZvLnR5cGU9PT0idGV4dCI/KG8ucmF3Kz1yLnJhdyxvLnRleHQrPXIudGV4dCk6bi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuZW1TdHJvbmcodCxsLHUpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKHI9dGhpcy50b2tlbml6ZXIuY29kZXNwYW4odCkpe3Q9dC5zdWJzdHJpbmcoci5yYXcubGVuZ3RoKSxuLnB1c2gocik7Y29udGludWV9aWYocj10aGlzLnRva2VuaXplci5icih0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmRlbCh0KSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihyPXRoaXMudG9rZW5pemVyLmF1dG9saW5rKHQpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksbi5wdXNoKHIpO2NvbnRpbnVlfWlmKCF0aGlzLnN0YXRlLmluTGluayYmKHI9dGhpcy50b2tlbml6ZXIudXJsKHQpKSl7dD10LnN1YnN0cmluZyhyLnJhdy5sZW5ndGgpLG4ucHVzaChyKTtjb250aW51ZX1pZihpPXQsdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0SW5saW5lKXtsZXQgYz0xLzA7Y29uc3QgZD10LnNsaWNlKDEpO2xldCBmO3RoaXMub3B0aW9ucy5leHRlbnNpb25zLnN0YXJ0SW5saW5lLmZvckVhY2goaD0+e2Y9aC5jYWxsKHtsZXhlcjp0aGlzfSxkKSx0eXBlb2YgZj09Im51bWJlciImJmY+PTAmJihjPU1hdGgubWluKGMsZikpfSksYzwxLzAmJmM+PTAmJihpPXQuc3Vic3RyaW5nKDAsYysxKSl9aWYocj10aGlzLnRva2VuaXplci5pbmxpbmVUZXh0KGkpKXt0PXQuc3Vic3RyaW5nKHIucmF3Lmxlbmd0aCksci5yYXcuc2xpY2UoLTEpIT09Il8iJiYodT1yLnJhdy5zbGljZSgtMSkpLGE9ITAsbz1uW24ubGVuZ3RoLTFdLG8mJm8udHlwZT09PSJ0ZXh0Ij8oby5yYXcrPXIucmF3LG8udGV4dCs9ci50ZXh0KTpuLnB1c2gocik7Y29udGludWV9aWYodCl7Y29uc3QgYz0iSW5maW5pdGUgbG9vcCBvbiBieXRlOiAiK3QuY2hhckNvZGVBdCgwKTtpZih0aGlzLm9wdGlvbnMuc2lsZW50KXtjb25zb2xlLmVycm9yKGMpO2JyZWFrfWVsc2UgdGhyb3cgbmV3IEVycm9yKGMpfX1yZXR1cm4gbn19Y2xhc3MgUGN7Y29uc3RydWN0b3IodCl7amUodGhpcywib3B0aW9ucyIpO3RoaXMub3B0aW9ucz10fHxOaX1jb2RlKHQsbixyKXt2YXIgaTtjb25zdCBvPShpPShufHwiIikubWF0Y2goL15cUyovKSk9PW51bGw/dm9pZCAwOmlbMF07cmV0dXJuIHQ9dC5yZXBsYWNlKC9cbiQvLCIiKStgCmAsbz8nPHByZT48Y29kZSBjbGFzcz0ibGFuZ3VhZ2UtJyt2bihvKSsnIj4nKyhyP3Q6dm4odCwhMCkpK2A8L2NvZGU+PC9wcmU+CmA6IjxwcmU+PGNvZGU+Iisocj90OnZuKHQsITApKStgPC9jb2RlPjwvcHJlPgpgfWJsb2NrcXVvdGUodCl7cmV0dXJuYDxibG9ja3F1b3RlPgoke3R9PC9ibG9ja3F1b3RlPgpgfWh0bWwodCxuKXtyZXR1cm4gdH1oZWFkaW5nKHQsbixyKXtyZXR1cm5gPGgke259PiR7dH08L2gke259PgpgfWhyKCl7cmV0dXJuYDxocj4KYH1saXN0KHQsbixyKXtjb25zdCBvPW4/Im9sIjoidWwiLGk9biYmciE9PTE/JyBzdGFydD0iJytyKyciJzoiIjtyZXR1cm4iPCIrbytpK2A+CmArdCsiPC8iK28rYD4KYH1saXN0aXRlbSh0LG4scil7cmV0dXJuYDxsaT4ke3R9PC9saT4KYH1jaGVja2JveCh0KXtyZXR1cm4iPGlucHV0ICIrKHQ/J2NoZWNrZWQ9IiIgJzoiIikrJ2Rpc2FibGVkPSIiIHR5cGU9ImNoZWNrYm94Ij4nfXBhcmFncmFwaCh0KXtyZXR1cm5gPHA+JHt0fTwvcD4KYH10YWJsZSh0LG4pe3JldHVybiBuJiYobj1gPHRib2R5PiR7bn08L3Rib2R5PmApLGA8dGFibGU+Cjx0aGVhZD4KYCt0K2A8L3RoZWFkPgpgK24rYDwvdGFibGU+CmB9dGFibGVyb3codCl7cmV0dXJuYDx0cj4KJHt0fTwvdHI+CmB9dGFibGVjZWxsKHQsbil7Y29uc3Qgcj1uLmhlYWRlcj8idGgiOiJ0ZCI7cmV0dXJuKG4uYWxpZ24/YDwke3J9IGFsaWduPSIke24uYWxpZ259Ij5gOmA8JHtyfT5gKSt0K2A8LyR7cn0+CmB9c3Ryb25nKHQpe3JldHVybmA8c3Ryb25nPiR7dH08L3N0cm9uZz5gfWVtKHQpe3JldHVybmA8ZW0+JHt0fTwvZW0+YH1jb2Rlc3Bhbih0KXtyZXR1cm5gPGNvZGU+JHt0fTwvY29kZT5gfWJyKCl7cmV0dXJuIjxicj4ifWRlbCh0KXtyZXR1cm5gPGRlbD4ke3R9PC9kZWw+YH1saW5rKHQsbixyKXtjb25zdCBvPVp5KHQpO2lmKG89PT1udWxsKXJldHVybiByO3Q9bztsZXQgaT0nPGEgaHJlZj0iJyt0KyciJztyZXR1cm4gbiYmKGkrPScgdGl0bGU9IicrbisnIicpLGkrPSI+IityKyI8L2E+IixpfWltYWdlKHQsbixyKXtjb25zdCBvPVp5KHQpO2lmKG89PT1udWxsKXJldHVybiByO3Q9bztsZXQgaT1gPGltZyBzcmM9IiR7dH0iIGFsdD0iJHtyfSJgO3JldHVybiBuJiYoaSs9YCB0aXRsZT0iJHtufSJgKSxpKz0iPiIsaX10ZXh0KHQpe3JldHVybiB0fX1jbGFzcyBwbXtzdHJvbmcodCl7cmV0dXJuIHR9ZW0odCl7cmV0dXJuIHR9Y29kZXNwYW4odCl7cmV0dXJuIHR9ZGVsKHQpe3JldHVybiB0fWh0bWwodCl7cmV0dXJuIHR9dGV4dCh0KXtyZXR1cm4gdH1saW5rKHQsbixyKXtyZXR1cm4iIityfWltYWdlKHQsbixyKXtyZXR1cm4iIityfWJyKCl7cmV0dXJuIiJ9fWNsYXNzIGhye2NvbnN0cnVjdG9yKHQpe2plKHRoaXMsIm9wdGlvbnMiKTtqZSh0aGlzLCJyZW5kZXJlciIpO2plKHRoaXMsInRleHRSZW5kZXJlciIpO3RoaXMub3B0aW9ucz10fHxOaSx0aGlzLm9wdGlvbnMucmVuZGVyZXI9dGhpcy5vcHRpb25zLnJlbmRlcmVyfHxuZXcgUGMsdGhpcy5yZW5kZXJlcj10aGlzLm9wdGlvbnMucmVuZGVyZXIsdGhpcy5yZW5kZXJlci5vcHRpb25zPXRoaXMub3B0aW9ucyx0aGlzLnRleHRSZW5kZXJlcj1uZXcgcG19c3RhdGljIHBhcnNlKHQsbil7cmV0dXJuIG5ldyBocihuKS5wYXJzZSh0KX1zdGF0aWMgcGFyc2VJbmxpbmUodCxuKXtyZXR1cm4gbmV3IGhyKG4pLnBhcnNlSW5saW5lKHQpfXBhcnNlKHQsbj0hMCl7bGV0IHI9IiI7Zm9yKGxldCBvPTA7bzx0Lmxlbmd0aDtvKyspe2NvbnN0IGk9dFtvXTtpZih0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucyYmdGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnNbaS50eXBlXSl7Y29uc3QgbD1pLHM9dGhpcy5vcHRpb25zLmV4dGVuc2lvbnMucmVuZGVyZXJzW2wudHlwZV0uY2FsbCh7cGFyc2VyOnRoaXN9LGwpO2lmKHMhPT0hMXx8IVsic3BhY2UiLCJociIsImhlYWRpbmciLCJjb2RlIiwidGFibGUiLCJibG9ja3F1b3RlIiwibGlzdCIsImh0bWwiLCJwYXJhZ3JhcGgiLCJ0ZXh0Il0uaW5jbHVkZXMobC50eXBlKSl7cis9c3x8IiI7Y29udGludWV9fXN3aXRjaChpLnR5cGUpe2Nhc2Uic3BhY2UiOmNvbnRpbnVlO2Nhc2UiaHIiOntyKz10aGlzLnJlbmRlcmVyLmhyKCk7Y29udGludWV9Y2FzZSJoZWFkaW5nIjp7Y29uc3QgbD1pO3IrPXRoaXMucmVuZGVyZXIuaGVhZGluZyh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zKSxsLmRlcHRoLGpQKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsdGhpcy50ZXh0UmVuZGVyZXIpKSk7Y29udGludWV9Y2FzZSJjb2RlIjp7Y29uc3QgbD1pO3IrPXRoaXMucmVuZGVyZXIuY29kZShsLnRleHQsbC5sYW5nLCEhbC5lc2NhcGVkKTtjb250aW51ZX1jYXNlInRhYmxlIjp7Y29uc3QgbD1pO2xldCBzPSIiLGE9IiI7Zm9yKGxldCBjPTA7YzxsLmhlYWRlci5sZW5ndGg7YysrKWErPXRoaXMucmVuZGVyZXIudGFibGVjZWxsKHRoaXMucGFyc2VJbmxpbmUobC5oZWFkZXJbY10udG9rZW5zKSx7aGVhZGVyOiEwLGFsaWduOmwuYWxpZ25bY119KTtzKz10aGlzLnJlbmRlcmVyLnRhYmxlcm93KGEpO2xldCB1PSIiO2ZvcihsZXQgYz0wO2M8bC5yb3dzLmxlbmd0aDtjKyspe2NvbnN0IGQ9bC5yb3dzW2NdO2E9IiI7Zm9yKGxldCBmPTA7ZjxkLmxlbmd0aDtmKyspYSs9dGhpcy5yZW5kZXJlci50YWJsZWNlbGwodGhpcy5wYXJzZUlubGluZShkW2ZdLnRva2Vucykse2hlYWRlcjohMSxhbGlnbjpsLmFsaWduW2ZdfSk7dSs9dGhpcy5yZW5kZXJlci50YWJsZXJvdyhhKX1yKz10aGlzLnJlbmRlcmVyLnRhYmxlKHMsdSk7Y29udGludWV9Y2FzZSJibG9ja3F1b3RlIjp7Y29uc3QgbD1pLHM9dGhpcy5wYXJzZShsLnRva2Vucyk7cis9dGhpcy5yZW5kZXJlci5ibG9ja3F1b3RlKHMpO2NvbnRpbnVlfWNhc2UibGlzdCI6e2NvbnN0IGw9aSxzPWwub3JkZXJlZCxhPWwuc3RhcnQsdT1sLmxvb3NlO2xldCBjPSIiO2ZvcihsZXQgZD0wO2Q8bC5pdGVtcy5sZW5ndGg7ZCsrKXtjb25zdCBmPWwuaXRlbXNbZF0saD1mLmNoZWNrZWQsZz1mLnRhc2s7bGV0IG09IiI7aWYoZi50YXNrKXtjb25zdCBTPXRoaXMucmVuZGVyZXIuY2hlY2tib3goISFoKTt1P2YudG9rZW5zLmxlbmd0aD4wJiZmLnRva2Vuc1swXS50eXBlPT09InBhcmFncmFwaCI/KGYudG9rZW5zWzBdLnRleHQ9UysiICIrZi50b2tlbnNbMF0udGV4dCxmLnRva2Vuc1swXS50b2tlbnMmJmYudG9rZW5zWzBdLnRva2Vucy5sZW5ndGg+MCYmZi50b2tlbnNbMF0udG9rZW5zWzBdLnR5cGU9PT0idGV4dCImJihmLnRva2Vuc1swXS50b2tlbnNbMF0udGV4dD1TKyIgIitmLnRva2Vuc1swXS50b2tlbnNbMF0udGV4dCkpOmYudG9rZW5zLnVuc2hpZnQoe3R5cGU6InRleHQiLHRleHQ6UysiICJ9KTptKz1TKyIgIn1tKz10aGlzLnBhcnNlKGYudG9rZW5zLHUpLGMrPXRoaXMucmVuZGVyZXIubGlzdGl0ZW0obSxnLCEhaCl9cis9dGhpcy5yZW5kZXJlci5saXN0KGMscyxhKTtjb250aW51ZX1jYXNlImh0bWwiOntjb25zdCBsPWk7cis9dGhpcy5yZW5kZXJlci5odG1sKGwudGV4dCxsLmJsb2NrKTtjb250aW51ZX1jYXNlInBhcmFncmFwaCI6e2NvbnN0IGw9aTtyKz10aGlzLnJlbmRlcmVyLnBhcmFncmFwaCh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zKSk7Y29udGludWV9Y2FzZSJ0ZXh0Ijp7bGV0IGw9aSxzPWwudG9rZW5zP3RoaXMucGFyc2VJbmxpbmUobC50b2tlbnMpOmwudGV4dDtmb3IoO28rMTx0Lmxlbmd0aCYmdFtvKzFdLnR5cGU9PT0idGV4dCI7KWw9dFsrK29dLHMrPWAKYCsobC50b2tlbnM/dGhpcy5wYXJzZUlubGluZShsLnRva2Vucyk6bC50ZXh0KTtyKz1uP3RoaXMucmVuZGVyZXIucGFyYWdyYXBoKHMpOnM7Y29udGludWV9ZGVmYXVsdDp7Y29uc3QgbD0nVG9rZW4gd2l0aCAiJytpLnR5cGUrJyIgdHlwZSB3YXMgbm90IGZvdW5kLic7aWYodGhpcy5vcHRpb25zLnNpbGVudClyZXR1cm4gY29uc29sZS5lcnJvcihsKSwiIjt0aHJvdyBuZXcgRXJyb3IobCl9fX1yZXR1cm4gcn1wYXJzZUlubGluZSh0LG4pe249bnx8dGhpcy5yZW5kZXJlcjtsZXQgcj0iIjtmb3IobGV0IG89MDtvPHQubGVuZ3RoO28rKyl7Y29uc3QgaT10W29dO2lmKHRoaXMub3B0aW9ucy5leHRlbnNpb25zJiZ0aGlzLm9wdGlvbnMuZXh0ZW5zaW9ucy5yZW5kZXJlcnMmJnRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tpLnR5cGVdKXtjb25zdCBsPXRoaXMub3B0aW9ucy5leHRlbnNpb25zLnJlbmRlcmVyc1tpLnR5cGVdLmNhbGwoe3BhcnNlcjp0aGlzfSxpKTtpZihsIT09ITF8fCFbImVzY2FwZSIsImh0bWwiLCJsaW5rIiwiaW1hZ2UiLCJzdHJvbmciLCJlbSIsImNvZGVzcGFuIiwiYnIiLCJkZWwiLCJ0ZXh0Il0uaW5jbHVkZXMoaS50eXBlKSl7cis9bHx8IiI7Y29udGludWV9fXN3aXRjaChpLnR5cGUpe2Nhc2UiZXNjYXBlIjp7Y29uc3QgbD1pO3IrPW4udGV4dChsLnRleHQpO2JyZWFrfWNhc2UiaHRtbCI6e2NvbnN0IGw9aTtyKz1uLmh0bWwobC50ZXh0KTticmVha31jYXNlImxpbmsiOntjb25zdCBsPWk7cis9bi5saW5rKGwuaHJlZixsLnRpdGxlLHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsbikpO2JyZWFrfWNhc2UiaW1hZ2UiOntjb25zdCBsPWk7cis9bi5pbWFnZShsLmhyZWYsbC50aXRsZSxsLnRleHQpO2JyZWFrfWNhc2Uic3Ryb25nIjp7Y29uc3QgbD1pO3IrPW4uc3Ryb25nKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsbikpO2JyZWFrfWNhc2UiZW0iOntjb25zdCBsPWk7cis9bi5lbSh0aGlzLnBhcnNlSW5saW5lKGwudG9rZW5zLG4pKTticmVha31jYXNlImNvZGVzcGFuIjp7Y29uc3QgbD1pO3IrPW4uY29kZXNwYW4obC50ZXh0KTticmVha31jYXNlImJyIjp7cis9bi5icigpO2JyZWFrfWNhc2UiZGVsIjp7Y29uc3QgbD1pO3IrPW4uZGVsKHRoaXMucGFyc2VJbmxpbmUobC50b2tlbnMsbikpO2JyZWFrfWNhc2UidGV4dCI6e2NvbnN0IGw9aTtyKz1uLnRleHQobC50ZXh0KTticmVha31kZWZhdWx0Ontjb25zdCBsPSdUb2tlbiB3aXRoICInK2kudHlwZSsnIiB0eXBlIHdhcyBub3QgZm91bmQuJztpZih0aGlzLm9wdGlvbnMuc2lsZW50KXJldHVybiBjb25zb2xlLmVycm9yKGwpLCIiO3Rocm93IG5ldyBFcnJvcihsKX19fXJldHVybiByfX1jbGFzcyBXc3tjb25zdHJ1Y3Rvcih0KXtqZSh0aGlzLCJvcHRpb25zIik7dGhpcy5vcHRpb25zPXR8fE5pfXByZXByb2Nlc3ModCl7cmV0dXJuIHR9cG9zdHByb2Nlc3ModCl7cmV0dXJuIHR9fWplKFdzLCJwYXNzVGhyb3VnaEhvb2tzIixuZXcgU2V0KFsicHJlcHJvY2VzcyIsInBvc3Rwcm9jZXNzIl0pKTt2YXIgQ2EsaHAsRmMsRlM7Y2xhc3MgV1B7Y29uc3RydWN0b3IoLi4udCl7SWQodGhpcyxDYSk7SWQodGhpcyxGYyk7amUodGhpcywiZGVmYXVsdHMiLGhtKCkpO2plKHRoaXMsIm9wdGlvbnMiLHRoaXMuc2V0T3B0aW9ucyk7amUodGhpcywicGFyc2UiLEhhKHRoaXMsQ2EsaHApLmNhbGwodGhpcyxmci5sZXgsaHIucGFyc2UpKTtqZSh0aGlzLCJwYXJzZUlubGluZSIsSGEodGhpcyxDYSxocCkuY2FsbCh0aGlzLGZyLmxleElubGluZSxoci5wYXJzZUlubGluZSkpO2plKHRoaXMsIlBhcnNlciIsaHIpO2plKHRoaXMsInBhcnNlciIsaHIucGFyc2UpO2plKHRoaXMsIlJlbmRlcmVyIixQYyk7amUodGhpcywiVGV4dFJlbmRlcmVyIixwbSk7amUodGhpcywiTGV4ZXIiLGZyKTtqZSh0aGlzLCJsZXhlciIsZnIubGV4KTtqZSh0aGlzLCJUb2tlbml6ZXIiLFJjKTtqZSh0aGlzLCJIb29rcyIsV3MpO3RoaXMudXNlKC4uLnQpfXdhbGtUb2tlbnModCxuKXt2YXIgbyxpO2xldCByPVtdO2Zvcihjb25zdCBsIG9mIHQpc3dpdGNoKHI9ci5jb25jYXQobi5jYWxsKHRoaXMsbCkpLGwudHlwZSl7Y2FzZSJ0YWJsZSI6e2NvbnN0IHM9bDtmb3IoY29uc3QgYSBvZiBzLmhlYWRlcilyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhhLnRva2VucyxuKSk7Zm9yKGNvbnN0IGEgb2Ygcy5yb3dzKWZvcihjb25zdCB1IG9mIGEpcj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnModS50b2tlbnMsbikpO2JyZWFrfWNhc2UibGlzdCI6e2NvbnN0IHM9bDtyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhzLml0ZW1zLG4pKTticmVha31kZWZhdWx0Ontjb25zdCBzPWw7KGk9KG89dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zKT09bnVsbD92b2lkIDA6by5jaGlsZFRva2VucykhPW51bGwmJmlbcy50eXBlXT90aGlzLmRlZmF1bHRzLmV4dGVuc2lvbnMuY2hpbGRUb2tlbnNbcy50eXBlXS5mb3JFYWNoKGE9PntyPXIuY29uY2F0KHRoaXMud2Fsa1Rva2VucyhzW2FdLG4pKX0pOnMudG9rZW5zJiYocj1yLmNvbmNhdCh0aGlzLndhbGtUb2tlbnMocy50b2tlbnMsbikpKX19cmV0dXJuIHJ9dXNlKC4uLnQpe2NvbnN0IG49dGhpcy5kZWZhdWx0cy5leHRlbnNpb25zfHx7cmVuZGVyZXJzOnt9LGNoaWxkVG9rZW5zOnt9fTtyZXR1cm4gdC5mb3JFYWNoKHI9Pntjb25zdCBvPXsuLi5yfTtpZihvLmFzeW5jPXRoaXMuZGVmYXVsdHMuYXN5bmN8fG8uYXN5bmN8fCExLHIuZXh0ZW5zaW9ucyYmKHIuZXh0ZW5zaW9ucy5mb3JFYWNoKGk9PntpZighaS5uYW1lKXRocm93IG5ldyBFcnJvcigiZXh0ZW5zaW9uIG5hbWUgcmVxdWlyZWQiKTtpZigicmVuZGVyZXIiaW4gaSl7Y29uc3QgbD1uLnJlbmRlcmVyc1tpLm5hbWVdO2w/bi5yZW5kZXJlcnNbaS5uYW1lXT1mdW5jdGlvbiguLi5zKXtsZXQgYT1pLnJlbmRlcmVyLmFwcGx5KHRoaXMscyk7cmV0dXJuIGE9PT0hMSYmKGE9bC5hcHBseSh0aGlzLHMpKSxhfTpuLnJlbmRlcmVyc1tpLm5hbWVdPWkucmVuZGVyZXJ9aWYoInRva2VuaXplciJpbiBpKXtpZighaS5sZXZlbHx8aS5sZXZlbCE9PSJibG9jayImJmkubGV2ZWwhPT0iaW5saW5lIil0aHJvdyBuZXcgRXJyb3IoImV4dGVuc2lvbiBsZXZlbCBtdXN0IGJlICdibG9jaycgb3IgJ2lubGluZSciKTtjb25zdCBsPW5baS5sZXZlbF07bD9sLnVuc2hpZnQoaS50b2tlbml6ZXIpOm5baS5sZXZlbF09W2kudG9rZW5pemVyXSxpLnN0YXJ0JiYoaS5sZXZlbD09PSJibG9jayI/bi5zdGFydEJsb2NrP24uc3RhcnRCbG9jay5wdXNoKGkuc3RhcnQpOm4uc3RhcnRCbG9jaz1baS5zdGFydF06aS5sZXZlbD09PSJpbmxpbmUiJiYobi5zdGFydElubGluZT9uLnN0YXJ0SW5saW5lLnB1c2goaS5zdGFydCk6bi5zdGFydElubGluZT1baS5zdGFydF0pKX0iY2hpbGRUb2tlbnMiaW4gaSYmaS5jaGlsZFRva2VucyYmKG4uY2hpbGRUb2tlbnNbaS5uYW1lXT1pLmNoaWxkVG9rZW5zKX0pLG8uZXh0ZW5zaW9ucz1uKSxyLnJlbmRlcmVyKXtjb25zdCBpPXRoaXMuZGVmYXVsdHMucmVuZGVyZXJ8fG5ldyBQYyh0aGlzLmRlZmF1bHRzKTtmb3IoY29uc3QgbCBpbiByLnJlbmRlcmVyKXtjb25zdCBzPXIucmVuZGVyZXJbbF0sYT1sLHU9aVthXTtpW2FdPSguLi5jKT0+e2xldCBkPXMuYXBwbHkoaSxjKTtyZXR1cm4gZD09PSExJiYoZD11LmFwcGx5KGksYykpLGR8fCIifX1vLnJlbmRlcmVyPWl9aWYoci50b2tlbml6ZXIpe2NvbnN0IGk9dGhpcy5kZWZhdWx0cy50b2tlbml6ZXJ8fG5ldyBSYyh0aGlzLmRlZmF1bHRzKTtmb3IoY29uc3QgbCBpbiByLnRva2VuaXplcil7Y29uc3Qgcz1yLnRva2VuaXplcltsXSxhPWwsdT1pW2FdO2lbYV09KC4uLmMpPT57bGV0IGQ9cy5hcHBseShpLGMpO3JldHVybiBkPT09ITEmJihkPXUuYXBwbHkoaSxjKSksZH19by50b2tlbml6ZXI9aX1pZihyLmhvb2tzKXtjb25zdCBpPXRoaXMuZGVmYXVsdHMuaG9va3N8fG5ldyBXcztmb3IoY29uc3QgbCBpbiByLmhvb2tzKXtjb25zdCBzPXIuaG9va3NbbF0sYT1sLHU9aVthXTtXcy5wYXNzVGhyb3VnaEhvb2tzLmhhcyhsKT9pW2FdPWM9PntpZih0aGlzLmRlZmF1bHRzLmFzeW5jKXJldHVybiBQcm9taXNlLnJlc29sdmUocy5jYWxsKGksYykpLnRoZW4oZj0+dS5jYWxsKGksZikpO2NvbnN0IGQ9cy5jYWxsKGksYyk7cmV0dXJuIHUuY2FsbChpLGQpfTppW2FdPSguLi5jKT0+e2xldCBkPXMuYXBwbHkoaSxjKTtyZXR1cm4gZD09PSExJiYoZD11LmFwcGx5KGksYykpLGR9fW8uaG9va3M9aX1pZihyLndhbGtUb2tlbnMpe2NvbnN0IGk9dGhpcy5kZWZhdWx0cy53YWxrVG9rZW5zLGw9ci53YWxrVG9rZW5zO28ud2Fsa1Rva2Vucz1mdW5jdGlvbihzKXtsZXQgYT1bXTtyZXR1cm4gYS5wdXNoKGwuY2FsbCh0aGlzLHMpKSxpJiYoYT1hLmNvbmNhdChpLmNhbGwodGhpcyxzKSkpLGF9fXRoaXMuZGVmYXVsdHM9ey4uLnRoaXMuZGVmYXVsdHMsLi4ub319KSx0aGlzfXNldE9wdGlvbnModCl7cmV0dXJuIHRoaXMuZGVmYXVsdHM9ey4uLnRoaXMuZGVmYXVsdHMsLi4udH0sdGhpc319Q2E9bmV3IFdlYWtTZXQsaHA9ZnVuY3Rpb24odCxuKXtyZXR1cm4ocixvKT0+e2NvbnN0IGk9ey4uLm99LGw9ey4uLnRoaXMuZGVmYXVsdHMsLi4uaX07dGhpcy5kZWZhdWx0cy5hc3luYz09PSEwJiZpLmFzeW5jPT09ITEmJihsLnNpbGVudHx8Y29uc29sZS53YXJuKCJtYXJrZWQoKTogVGhlIGFzeW5jIG9wdGlvbiB3YXMgc2V0IHRvIHRydWUgYnkgYW4gZXh0ZW5zaW9uLiBUaGUgYXN5bmM6IGZhbHNlIG9wdGlvbiBzZW50IHRvIHBhcnNlIHdpbGwgYmUgaWdub3JlZC4iKSxsLmFzeW5jPSEwKTtjb25zdCBzPUhhKHRoaXMsRmMsRlMpLmNhbGwodGhpcywhIWwuc2lsZW50LCEhbC5hc3luYyk7aWYodHlwZW9mIHI+InUifHxyPT09bnVsbClyZXR1cm4gcyhuZXcgRXJyb3IoIm1hcmtlZCgpOiBpbnB1dCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9yIG51bGwiKSk7aWYodHlwZW9mIHIhPSJzdHJpbmciKXJldHVybiBzKG5ldyBFcnJvcigibWFya2VkKCk6IGlucHV0IHBhcmFtZXRlciBpcyBvZiB0eXBlICIrT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHIpKyIsIHN0cmluZyBleHBlY3RlZCIpKTtpZihsLmhvb2tzJiYobC5ob29rcy5vcHRpb25zPWwpLGwuYXN5bmMpcmV0dXJuIFByb21pc2UucmVzb2x2ZShsLmhvb2tzP2wuaG9va3MucHJlcHJvY2VzcyhyKTpyKS50aGVuKGE9PnQoYSxsKSkudGhlbihhPT5sLndhbGtUb2tlbnM/UHJvbWlzZS5hbGwodGhpcy53YWxrVG9rZW5zKGEsbC53YWxrVG9rZW5zKSkudGhlbigoKT0+YSk6YSkudGhlbihhPT5uKGEsbCkpLnRoZW4oYT0+bC5ob29rcz9sLmhvb2tzLnBvc3Rwcm9jZXNzKGEpOmEpLmNhdGNoKHMpO3RyeXtsLmhvb2tzJiYocj1sLmhvb2tzLnByZXByb2Nlc3MocikpO2NvbnN0IGE9dChyLGwpO2wud2Fsa1Rva2VucyYmdGhpcy53YWxrVG9rZW5zKGEsbC53YWxrVG9rZW5zKTtsZXQgdT1uKGEsbCk7cmV0dXJuIGwuaG9va3MmJih1PWwuaG9va3MucG9zdHByb2Nlc3ModSkpLHV9Y2F0Y2goYSl7cmV0dXJuIHMoYSl9fX0sRmM9bmV3IFdlYWtTZXQsRlM9ZnVuY3Rpb24odCxuKXtyZXR1cm4gcj0+e2lmKHIubWVzc2FnZSs9YApQbGVhc2UgcmVwb3J0IHRoaXMgdG8gaHR0cHM6Ly9naXRodWIuY29tL21hcmtlZGpzL21hcmtlZC5gLHQpe2NvbnN0IG89IjxwPkFuIGVycm9yIG9jY3VycmVkOjwvcD48cHJlPiIrdm4oci5tZXNzYWdlKyIiLCEwKSsiPC9wcmU+IjtyZXR1cm4gbj9Qcm9taXNlLnJlc29sdmUobyk6b31pZihuKXJldHVybiBQcm9taXNlLnJlamVjdChyKTt0aHJvdyByfX07Y29uc3QgZ2k9bmV3IFdQO2Z1bmN0aW9uIE1lKGUsdCl7cmV0dXJuIGdpLnBhcnNlKGUsdCl9TWUub3B0aW9ucz1NZS5zZXRPcHRpb25zPWZ1bmN0aW9uKGUpe3JldHVybiBnaS5zZXRPcHRpb25zKGUpLE1lLmRlZmF1bHRzPWdpLmRlZmF1bHRzLElTKE1lLmRlZmF1bHRzKSxNZX07TWUuZ2V0RGVmYXVsdHM9aG07TWUuZGVmYXVsdHM9Tmk7TWUudXNlPWZ1bmN0aW9uKC4uLmUpe3JldHVybiBnaS51c2UoLi4uZSksTWUuZGVmYXVsdHM9Z2kuZGVmYXVsdHMsSVMoTWUuZGVmYXVsdHMpLE1lfTtNZS53YWxrVG9rZW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGdpLndhbGtUb2tlbnMoZSx0KX07TWUucGFyc2VJbmxpbmU9Z2kucGFyc2VJbmxpbmU7TWUuUGFyc2VyPWhyO01lLnBhcnNlcj1oci5wYXJzZTtNZS5SZW5kZXJlcj1QYztNZS5UZXh0UmVuZGVyZXI9cG07TWUuTGV4ZXI9ZnI7TWUubGV4ZXI9ZnIubGV4O01lLlRva2VuaXplcj1SYztNZS5Ib29rcz1XcztNZS5wYXJzZT1NZTtNZS5vcHRpb25zO01lLnNldE9wdGlvbnM7TWUudXNlO01lLndhbGtUb2tlbnM7TWUucGFyc2VJbmxpbmU7aHIucGFyc2U7Y29uc3QgVVA9ZnIubGV4LE9jPSc8dmFsIHZhbHVlPSInLHBwPSciPicsZ3A9IjwvdmFsPiI7ZnVuY3Rpb24gSG4oZSx0LG4scj0hMSl7dmFyIGksbDtjb25zdCBvPVtdO2Zvcig7bjxlLmxlbmd0aDspe2NvbnN0IHM9ZVtuXTtpZihzLnR5cGU9PT0iaGVhZGluZyIpby5wdXNoKHt0YWc6YGgke3MuZGVwdGh9YCxjaGlsZHJlbjpIbihzLnRva2Vucz9zLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk7ZWxzZSBpZihzLnR5cGU9PT0icGFyYWdyYXBoIilvLnB1c2goe3RhZzoicCIsY2hpbGRyZW46SG4ocy50b2tlbnM/cy50b2tlbnM6W10sdCwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYocy50eXBlPT09InN0cm9uZyIpby5wdXNoKHt0YWc6InNwYW4iLGNsYXNzZXM6WyJib2xkIl0sY2hpbGRyZW46SG4ocy50b2tlbnM/cy50b2tlbnM6W10sdCwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYocy50eXBlPT09ImVtIilvLnB1c2goe3RhZzoic3BhbiIsY2xhc3NlczpbIml0YWxpYyJdLGNoaWxkcmVuOkhuKHMudG9rZW5zP3MudG9rZW5zOltdLHQsMCkuY2hpbGRyZW59KTtlbHNlIGlmKHMudHlwZT09PSJkZWwiKW8ucHVzaCh7dGFnOiJzcGFuIixjbGFzc2VzOlsibGluZS10aHJvdWdoIl0sY2hpbGRyZW46SG4ocy50b2tlbnM/cy50b2tlbnM6W10sdCwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYocy50eXBlPT09InRleHQiKWlmKCJ0b2tlbnMiaW4gcyYmQXJyYXkuaXNBcnJheShzLnRva2Vucykpby5wdXNoKC4uLkhuKHMudG9rZW5zLHQsbixyKS5jaGlsZHJlbik7ZWxzZSBpZihyJiZ0eXBlb2Ygcy5yYXc9PSJzdHJpbmciKXtjb25zdCBhPXMucmF3LnNwbGl0KGAKYCksdT1hLmZsYXRNYXAoKGMsZCk9PmQ9PT1hLmxlbmd0aC0xP1tjXTpbYyx7dGFnOiJiciIsY2hpbGRyZW46W119XSk7by5wdXNoKC4uLnUpfWVsc2Ugby5wdXNoKHMucmF3KTtlbHNlIGlmKHMudHlwZT09PSJsaXN0IilvLnB1c2goe3RhZzpzLm9yZGVyZWQ/Im9sIjoidWwiLGNoaWxkcmVuOkhuKHMuaXRlbXMsdCwwKS5jaGlsZHJlbn0pO2Vsc2UgaWYocy50eXBlPT09Imxpc3RfaXRlbSIpby5wdXNoKHt0YWc6ImxpIixjaGlsZHJlbjpIbihzLnRva2Vucz9zLnRva2VuczpbXSx0LDAsITApLmNoaWxkcmVufSk7ZWxzZSBpZihzLnR5cGUhPT0ic3BhY2UiKWlmKHMudHlwZT09PSJodG1sIil7aWYocy50ZXh0PT09Z3ApcmV0dXJue2NoaWxkcmVuOm8sY3Vyc29yOm59O2NvbnN0IGE9cy50ZXh0LmluZGV4T2YocHApO2lmKHMudGV4dC5zdGFydHNXaXRoKE9jKSYmYT4tMSl7Y29uc3QgYz1OdW1iZXIocy50ZXh0LnNsaWNlKE9jLmxlbmd0aCxhKSk7aWYoTnVtYmVyLmlzTmFOKGMpKXRocm93IEVycm9yKGBJbGxlZ2FsIHZhbCBpbnRlcm1lZGlhdGUgbm9kZTogJHtKU09OLnN0cmluZ2lmeShzKX1gKTtjb25zdHtjaGlsZHJlbjpkLGN1cnNvcjpmfT1IbihlLm1hcChnPT5nLnR5cGU9PT0ibGluayJ8fGcudHlwZT09PSJsaXN0Ij97dHlwZToidGV4dCIscmF3OmcucmF3LHRleHQ6Zy5yYXd9OmcpLHQsbisxKSxoPXRbY107aC5fdHlwZT09PSJsaW5rIj9vLnB1c2goe3RhZzoiYSIsaHJlZjpoLmhyZWYsY2hpbGRyZW46ZH0pOmguX3R5cGU9PT0iZmlsZSImJm8ucHVzaCh7dGFnOiJpbWciLHNyYzp3bi5jb252ZXJ0RmlsZVNvdXJjZShoKS51cmwsd2lkdGg6KGk9aC5tZXRhZGF0YSk9PW51bGw/dm9pZCAwOmkud2lkdGgsaGVpZ2h0OihsPWgubWV0YWRhdGEpPT1udWxsP3ZvaWQgMDpsLmhlaWdodCxjaGlsZHJlbjpbXX0pLG49Zn1jb25zdCB1PS88YnJccypcLz8+L2dpO3MudGV4dC50cmltKCkubWF0Y2godSkmJm8ucHVzaCh7dGFnOiJiciIsY2hpbGRyZW46W119KX1lbHNlIHMudHlwZT09PSJsaW5rIj9zLnJhdz09PXMuaHJlZj9vLnB1c2gocy5yYXcpOm8ucHVzaCh7dGFnOiJhIixocmVmOnMuaHJlZixjaGlsZHJlbjpIbihzLnRva2Vucz9zLnRva2VuczpbXSx0LDApLmNoaWxkcmVufSk6cy50eXBlPT09ImJyIj9vLnB1c2goe3RhZzoiYnIiLGNoaWxkcmVuOltdfSk6Y29uc29sZS5lcnJvcihgQ291bGQgbm90IHBhcnNlIG1hcmtkb3duOiB1bnN1cHBvcnRlZCB0b2tlbiB0eXBlOiAke3MudHlwZX0uIEZvdW5kOiAke3MucmF3fWApO24rK31yZXR1cm57Y2hpbGRyZW46byxjdXJzb3I6bn19ZnVuY3Rpb24gQlMoe3RlbXBsYXRlU3RyaW5nczplLGV4cHJzOnR9KXtjb25zdCBuPWUuZmxhdE1hcCgobCxzKT0+e2NvbnN0IGE9dFtzXTtyZXR1cm4gYT9hW0t0XT09PSJsaW5rIj9sLmNvbmNhdChgJHtPY30ke3N9JHtwcH0ke2EuY2hpbGRyZW5bMF19JHtncH1gKTpsLmNvbmNhdChgJHtPY30ke3N9JHtwcH0ke2dwfWApOmx9KS5qb2luKCIiKSxyPVVQKG4se2dmbTohMH0pLHtjaGlsZHJlbjpvLGN1cnNvcjppfT1IbihyLHQsMCk7aWYoaSE9PXIubGVuZ3RoKXRocm93IEVycm9yKCJVbmV4cGVjdGVkbHkgdGVybWluYXRlZCBtYXJrZG93biBwYXJzaW5nLiBQb3NzaWJsZSByZWFzb246IHVuY2xvc2VkIGh0bWwgdGFnPyIpO3JldHVybntbS3RdOiJyaWNodGV4dCIsY2hpbGRyZW46b319Y29uc3QgVlA9L15oKFtcZCtdKSQvO2Z1bmN0aW9uIEhQKGUpe2NvbnN0IHQ9ZS5jaGlsZHJlbi5tYXAoS1ApO3JldHVybiBHUCh0KX1mdW5jdGlvbiBLUChlKXt2YXIgdDtpZihlLnR5cGU9PT0iaGVhZGluZyIpe2xldCBuPSIiO2NvbnN0IHI9TnVtYmVyKCh0PWUudGFnLm1hdGNoKFZQKSk9PW51bGw/dm9pZCAwOnRbMV0pO2lmKE51bWJlci5pc05hTihyKSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgaGVhZGVyIGRlcHRoIik7Zm9yKGxldCBpPTA7aTxOdW1iZXIocik7aSsrKW4rPSIjIjtyZXR1cm57dHlwZToiYmxvY2siLGNoaWxkcmVuOltgJHtufSBgXS5jb25jYXQoLi4uZS5jaGlsZHJlbi5tYXAobXApKX19ZWxzZXtpZihlLnR5cGU9PT0icGFyYWdyYXBoIilyZXR1cm4gZS5jaGlsZHJlbi5sZW5ndGg9PT0wP3t0eXBlOiJibG9jayIsY2hpbGRyZW46WyI8YnIgLz4iXX06e3R5cGU6ImJsb2NrIixjaGlsZHJlbjplLmNoaWxkcmVuLm1hcChuPT5tcChuKSl9O2lmKGUudHlwZT09PSJsaXN0IilyZXR1cm57dHlwZToiYmxvY2siLGNoaWxkcmVuOmUuY2hpbGRyZW4uZmxhdE1hcCgobixyKT0+VVMoVlMoZSksbiwwLHI9PT0wKSl9O3tjb25zdCBuPWU7dGhyb3cgbmV3IEVycm9yKGBVbmhhbmRsZWQgbm9kZSB0eXBlOiAkeyJ0eXBlImluIG4/ImV4aGF1c3RpdmVDaGVjay50eXBlIjoidW5rbm93biJ9YCl9fX1hc3luYyBmdW5jdGlvbiBHUChlKXtjb25zdCB0PVtgCmBdLG49W10scj17fTtmb3IobGV0IG89MDtvPGUubGVuZ3RoO28rKyl7Y29uc3QgaT1lW29dO2Zvcihjb25zdCBsIG9mIGkuY2hpbGRyZW4paWYodHlwZW9mIGw9PSJzdHJpbmciKXRbdC5sZW5ndGgtMV0rPWw7ZWxzZXtpZihsLnR5cGU9PT0iaW1hZ2UiKW4ucHVzaChhd2FpdCBKUChsLHIpKTtlbHNlIGlmKGwudHlwZT09PSJsaW5rIiluLnB1c2gocVAobCkpO2Vsc2V7Y29uc3Qgcz1sO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBub2RlIHR5cGU6ICR7SlNPTi5zdHJpbmdpZnkocyxudWxsLDIpfWApfXQucHVzaCgiIil9bz09PWUubGVuZ3RoLTE/dFt0Lmxlbmd0aC0xXSs9YApgOnRbdC5sZW5ndGgtMV0rPWAKCmB9cmV0dXJue1tLdF06InJpY2h0ZXh0Iix0ZW1wbGF0ZVN0cmluZ3M6dCxleHByczpuLGZpbGVzOnJ9fWZ1bmN0aW9uIFdTKGUpe2NvbnN0IHQ9dHlwZW9mIGUuZm9ybWF0PT0ibnVtYmVyIj9YUChlLmZvcm1hdCk6W107bGV0IG49ZS50ZXh0LnRyaW1TdGFydCgpO2NvbnN0IHI9ZS50ZXh0Lmxlbmd0aC1uLmxlbmd0aDtuPW4udHJpbUVuZCgpO2NvbnN0IG89ZS50ZXh0Lmxlbmd0aC1uLmxlbmd0aC1yO3JldHVybiB0LmluY2x1ZGVzKCJib2xkIikmJnQuaW5jbHVkZXMoIml0YWxpYyIpP249YCoqKiR7bn0qKipgOnQuaW5jbHVkZXMoImJvbGQiKT9uPWAqKiR7bn0qKmA6dC5pbmNsdWRlcygiaXRhbGljIikmJihuPWBfJHtufV9gKSx0LmluY2x1ZGVzKCJsaW5lLXRocm91Z2giKSYmKG49YH5+JHtufX5+YCksYCR7IiAiLnJlcGVhdChyKX0ke259JHsiICIucmVwZWF0KG8pfWB9ZnVuY3Rpb24gbXAoZSl7cmV0dXJuIGUudHlwZT09PSJ0ZXh0Ij9XUyhlKTplLnR5cGU9PT0ibGluZWJyZWFrIj9gCmA6ZX1mdW5jdGlvbiBVUyhlLHQsbixyPSExKXt2YXIgbCxzO2NvbnN0IGk9W2Ake3I/IiI6YApgfSR7IiAiLnJlcGVhdChuKX0ke2V9YF07cmV0dXJuKChzPShsPXQuY2hpbGRyZW4pPT1udWxsP3ZvaWQgMDpsWzBdKT09bnVsbD92b2lkIDA6cy50eXBlKSE9PSJsaXN0IiYmaS5wdXNoKCIgIiksaS5jb25jYXQodC5jaGlsZHJlbi5mbGF0TWFwKGE9PmEudHlwZT09PSJsaXN0Ij9hLmNoaWxkcmVuLmZsYXRNYXAodT0+VVMoVlMoYSksdSxuKzQpKTpbbXAoYSldKSl9ZnVuY3Rpb24gVlMoZSl7aWYoZS5saXN0VHlwZT09PSJidWxsZXQiKXJldHVybiItIjtpZihlLmxpc3RUeXBlPT09Im51bWJlciIpcmV0dXJuIjEuIjt0aHJvdyBuZXcgRXJyb3IoYFVuaGFuZGxlZCBsaXN0IHR5cGU6ICR7ZS5saXN0VHlwZX1gKX1jb25zdCBZUD17Ym9sZDoxLGl0YWxpYzoyLCJsaW5lLXRocm91Z2giOjR9O2Z1bmN0aW9uIFhQKGUpe3JldHVybiBPYmplY3QuZW50cmllcyhZUCkuZmxhdE1hcCgoW3Qsbl0pPT4obiZlKT09PW4/W3RdOltdKX1jb25zdCBRUD1uZXcgVGV4dEVuY29kZXI7YXN5bmMgZnVuY3Rpb24gSlAoZSx0KXtpZihlLnNyYy5zdGFydHNXaXRoKCJkYXRhOiIpKXtjb25zdCBuPWF3YWl0IHduLmdldFNIQTI1Nkhhc2goUVAuZW5jb2RlKGUuc3JjKSkscj1SZyhlLnNyYyk7aWYocj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBkZXRlY3QgTWltZSBUeXBlIGZvciBpbWFnZTogJHtlLnNyY31gKTtjb25zdCBvPVBnKHIpLGk9YC9wdWJsaWMvJHtufS4ke299YDtyZXR1cm4gdFtpXT1lLnNyYyx7W0t0XToiZmlsZSIsW2huXTppLG1ldGFkYXRhOnt3aWR0aDplLndpZHRofHwwLGhlaWdodDplLmhlaWdodHx8MCxzaGEyNTY6bnx8IiJ9fX1lbHNle2NvbnN0IG49WlAoInNoYTI1NiIsZS5zcmMpO3JldHVybntbS3RdOiJmaWxlIixbaG5dOmAvcHVibGljJHtlLnNyYy5zcGxpdCgiPyIpWzBdfWAsbWV0YWRhdGE6e3dpZHRoOmUud2lkdGh8fDAsaGVpZ2h0OmUuaGVpZ2h0fHwwLHNoYTI1NjpufHwiIn19fX1mdW5jdGlvbiBaUChlLHQpe2NvbnN0IG49dC5zcGxpdCgiPyIpO2lmKG4ubGVuZ3RoPDIpcmV0dXJuO2NvbnN0IHI9blsxXSxvPW5ldyBVUkxTZWFyY2hQYXJhbXMocik7aWYoby5oYXMoZSkpcmV0dXJuIG8uZ2V0KGUpfWZ1bmN0aW9uIHFQKGUpe3JldHVybntbS3RdOiJsaW5rIixocmVmOmUudXJsLGNoaWxkcmVuOmUuY2hpbGRyZW4ubWFwKFdTKX19Y29uc3QgZ209cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsdHlwZTp0LC4uLm59LHIpPT53LmpzeCgiaW5wdXQiLHt0eXBlOnQsY2xhc3NOYW1lOm90KCJmbGV4IGgtMTAgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1pbnB1dCBiZy1iYWNrZ3JvdW5kIHB4LTMgcHktMiB0ZXh0LXNtIHJpbmctb2Zmc2V0LWJhY2tncm91bmQgZmlsZTpib3JkZXItMCBmaWxlOmJnLXRyYW5zcGFyZW50IGZpbGU6dGV4dC1zbSBmaWxlOmZvbnQtbWVkaXVtIHBsYWNlaG9sZGVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOm91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctMiBmb2N1cy12aXNpYmxlOnJpbmctcmluZyBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LTIgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAiLGUpLHJlZjpyLC4uLm59KSk7Z20uZGlzcGxheU5hbWU9IklucHV0IjtmdW5jdGlvbiBIUyhlKXtjb25zdCB0PWUrIkNvbGxlY3Rpb25Qcm92aWRlciIsW24scl09Q2kodCksW28saV09bih0LHtjb2xsZWN0aW9uUmVmOntjdXJyZW50Om51bGx9LGl0ZW1NYXA6bmV3IE1hcH0pLGw9aD0+e2NvbnN0e3Njb3BlOmcsY2hpbGRyZW46bX09aCxTPXEudXNlUmVmKG51bGwpLHY9cS51c2VSZWYobmV3IE1hcCkuY3VycmVudDtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KG8se3Njb3BlOmcsaXRlbU1hcDp2LGNvbGxlY3Rpb25SZWY6U30sbSl9LHM9ZSsiQ29sbGVjdGlvblNsb3QiLGE9cS5mb3J3YXJkUmVmKChoLGcpPT57Y29uc3R7c2NvcGU6bSxjaGlsZHJlbjpTfT1oLHY9aShzLG0pLHk9WGUoZyx2LmNvbGxlY3Rpb25SZWYpO3JldHVybiBxLmNyZWF0ZUVsZW1lbnQoRWwse3JlZjp5fSxTKX0pLHU9ZSsiQ29sbGVjdGlvbkl0ZW1TbG90IixjPSJkYXRhLXJhZGl4LWNvbGxlY3Rpb24taXRlbSIsZD1xLmZvcndhcmRSZWYoKGgsZyk9Pntjb25zdHtzY29wZTptLGNoaWxkcmVuOlMsLi4udn09aCx5PXEudXNlUmVmKG51bGwpLHg9WGUoZyx5KSxfPWkodSxtKTtyZXR1cm4gcS51c2VFZmZlY3QoKCk9PihfLml0ZW1NYXAuc2V0KHkse3JlZjp5LC4uLnZ9KSwoKT0+dm9pZCBfLml0ZW1NYXAuZGVsZXRlKHkpKSkscS5jcmVhdGVFbGVtZW50KEVsLHtbY106IiIscmVmOnh9LFMpfSk7ZnVuY3Rpb24gZihoKXtjb25zdCBnPWkoZSsiQ29sbGVjdGlvbkNvbnN1bWVyIixoKTtyZXR1cm4gcS51c2VDYWxsYmFjaygoKT0+e2NvbnN0IFM9Zy5jb2xsZWN0aW9uUmVmLmN1cnJlbnQ7aWYoIVMpcmV0dXJuW107Y29uc3Qgdj1BcnJheS5mcm9tKFMucXVlcnlTZWxlY3RvckFsbChgWyR7Y31dYCkpO3JldHVybiBBcnJheS5mcm9tKGcuaXRlbU1hcC52YWx1ZXMoKSkuc29ydCgoXyxFKT0+di5pbmRleE9mKF8ucmVmLmN1cnJlbnQpLXYuaW5kZXhPZihFLnJlZi5jdXJyZW50KSl9LFtnLmNvbGxlY3Rpb25SZWYsZy5pdGVtTWFwXSl9cmV0dXJuW3tQcm92aWRlcjpsLFNsb3Q6YSxJdGVtU2xvdDpkfSxmLHJdfWZ1bmN0aW9uIGVPKGUsdD1nbG9iYWxUaGlzPT1udWxsP3ZvaWQgMDpnbG9iYWxUaGlzLmRvY3VtZW50KXtjb25zdCBuPVZ0KGUpO3AudXNlRWZmZWN0KCgpPT57Y29uc3Qgcj1vPT57by5rZXk9PT0iRXNjYXBlIiYmbihvKX07cmV0dXJuIHQuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsciksKCk9PnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigia2V5ZG93biIscil9LFtuLHRdKX1jb25zdCB2cD0iZGlzbWlzc2FibGVMYXllci51cGRhdGUiLHRPPSJkaXNtaXNzYWJsZUxheWVyLnBvaW50ZXJEb3duT3V0c2lkZSIsbk89ImRpc21pc3NhYmxlTGF5ZXIuZm9jdXNPdXRzaWRlIjtsZXQgdDA7Y29uc3Qgck89cC5jcmVhdGVDb250ZXh0KHtsYXllcnM6bmV3IFNldCxsYXllcnNXaXRoT3V0c2lkZVBvaW50ZXJFdmVudHNEaXNhYmxlZDpuZXcgU2V0LGJyYW5jaGVzOm5ldyBTZXR9KSxvTz1wLmZvcndhcmRSZWYoKGUsdCk9Pnt2YXIgbjtjb25zdHtkaXNhYmxlT3V0c2lkZVBvaW50ZXJFdmVudHM6cj0hMSxvbkVzY2FwZUtleURvd246byxvblBvaW50ZXJEb3duT3V0c2lkZTppLG9uRm9jdXNPdXRzaWRlOmwsb25JbnRlcmFjdE91dHNpZGU6cyxvbkRpc21pc3M6YSwuLi51fT1lLGM9cC51c2VDb250ZXh0KHJPKSxbZCxmXT1wLnVzZVN0YXRlKG51bGwpLGg9KG49ZD09bnVsbD92b2lkIDA6ZC5vd25lckRvY3VtZW50KSE9PW51bGwmJm4hPT12b2lkIDA/bjpnbG9iYWxUaGlzPT1udWxsP3ZvaWQgMDpnbG9iYWxUaGlzLmRvY3VtZW50LFssZ109cC51c2VTdGF0ZSh7fSksbT1YZSh0LFQ9PmYoVCkpLFM9QXJyYXkuZnJvbShjLmxheWVycyksW3ZdPVsuLi5jLmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkXS5zbGljZSgtMSkseT1TLmluZGV4T2YodikseD1kP1MuaW5kZXhPZihkKTotMSxfPWMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuc2l6ZT4wLEU9eD49eSwkPWlPKFQ9Pntjb25zdCBNPVQudGFyZ2V0LFI9Wy4uLmMuYnJhbmNoZXNdLnNvbWUoaj0+ai5jb250YWlucyhNKSk7IUV8fFJ8fChpPT1udWxsfHxpKFQpLHM9PW51bGx8fHMoVCksVC5kZWZhdWx0UHJldmVudGVkfHxhPT1udWxsfHxhKCkpfSxoKSxDPWxPKFQ9Pntjb25zdCBNPVQudGFyZ2V0O1suLi5jLmJyYW5jaGVzXS5zb21lKGo9PmouY29udGFpbnMoTSkpfHwobD09bnVsbHx8bChUKSxzPT1udWxsfHxzKFQpLFQuZGVmYXVsdFByZXZlbnRlZHx8YT09bnVsbHx8YSgpKX0saCk7cmV0dXJuIGVPKFQ9Pnt4PT09Yy5sYXllcnMuc2l6ZS0xJiYobz09bnVsbHx8byhUKSwhVC5kZWZhdWx0UHJldmVudGVkJiZhJiYoVC5wcmV2ZW50RGVmYXVsdCgpLGEoKSkpfSxoKSxwLnVzZUVmZmVjdCgoKT0+e2lmKGQpcmV0dXJuIHImJihjLmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0wJiYodDA9aC5ib2R5LnN0eWxlLnBvaW50ZXJFdmVudHMsaC5ib2R5LnN0eWxlLnBvaW50ZXJFdmVudHM9Im5vbmUiKSxjLmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLmFkZChkKSksYy5sYXllcnMuYWRkKGQpLG4wKCksKCk9PntyJiZjLmxheWVyc1dpdGhPdXRzaWRlUG9pbnRlckV2ZW50c0Rpc2FibGVkLnNpemU9PT0xJiYoaC5ib2R5LnN0eWxlLnBvaW50ZXJFdmVudHM9dDApfX0sW2QsaCxyLGNdKSxwLnVzZUVmZmVjdCgoKT0+KCk9PntkJiYoYy5sYXllcnMuZGVsZXRlKGQpLGMubGF5ZXJzV2l0aE91dHNpZGVQb2ludGVyRXZlbnRzRGlzYWJsZWQuZGVsZXRlKGQpLG4wKCkpfSxbZCxjXSkscC51c2VFZmZlY3QoKCk9Pntjb25zdCBUPSgpPT5nKHt9KTtyZXR1cm4gZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih2cCxUKSwoKT0+ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcih2cCxUKX0sW10pLHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoe30sdSx7cmVmOm0sc3R5bGU6e3BvaW50ZXJFdmVudHM6Xz9FPyJhdXRvIjoibm9uZSI6dm9pZCAwLC4uLmUuc3R5bGV9LG9uRm9jdXNDYXB0dXJlOkhlKGUub25Gb2N1c0NhcHR1cmUsQy5vbkZvY3VzQ2FwdHVyZSksb25CbHVyQ2FwdHVyZTpIZShlLm9uQmx1ckNhcHR1cmUsQy5vbkJsdXJDYXB0dXJlKSxvblBvaW50ZXJEb3duQ2FwdHVyZTpIZShlLm9uUG9pbnRlckRvd25DYXB0dXJlLCQub25Qb2ludGVyRG93bkNhcHR1cmUpfSkpfSk7ZnVuY3Rpb24gaU8oZSx0PWdsb2JhbFRoaXM9PW51bGw/dm9pZCAwOmdsb2JhbFRoaXMuZG9jdW1lbnQpe2NvbnN0IG49VnQoZSkscj1wLnVzZVJlZighMSksbz1wLnVzZVJlZigoKT0+e30pO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IGk9cz0+e2lmKHMudGFyZ2V0JiYhci5jdXJyZW50KXtsZXQgYz1mdW5jdGlvbigpe0tTKHRPLG4sdSx7ZGlzY3JldGU6ITB9KX07dmFyIGE9Yztjb25zdCB1PXtvcmlnaW5hbEV2ZW50OnN9O3MucG9pbnRlclR5cGU9PT0idG91Y2giPyh0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixvLmN1cnJlbnQpLG8uY3VycmVudD1jLHQuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLG8uY3VycmVudCx7b25jZTohMH0pKTpjKCl9ZWxzZSB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIixvLmN1cnJlbnQpO3IuY3VycmVudD0hMX0sbD13aW5kb3cuc2V0VGltZW91dCgoKT0+e3QuYWRkRXZlbnRMaXN0ZW5lcigicG9pbnRlcmRvd24iLGkpfSwwKTtyZXR1cm4oKT0+e3dpbmRvdy5jbGVhclRpbWVvdXQobCksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJwb2ludGVyZG93biIsaSksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJjbGljayIsby5jdXJyZW50KX19LFt0LG5dKSx7b25Qb2ludGVyRG93bkNhcHR1cmU6KCk9PnIuY3VycmVudD0hMH19ZnVuY3Rpb24gbE8oZSx0PWdsb2JhbFRoaXM9PW51bGw/dm9pZCAwOmdsb2JhbFRoaXMuZG9jdW1lbnQpe2NvbnN0IG49VnQoZSkscj1wLnVzZVJlZighMSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3Qgbz1pPT57aS50YXJnZXQmJiFyLmN1cnJlbnQmJktTKG5PLG4se29yaWdpbmFsRXZlbnQ6aX0se2Rpc2NyZXRlOiExfSl9O3JldHVybiB0LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLG8pLCgpPT50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLG8pfSxbdCxuXSkse29uRm9jdXNDYXB0dXJlOigpPT5yLmN1cnJlbnQ9ITAsb25CbHVyQ2FwdHVyZTooKT0+ci5jdXJyZW50PSExfX1mdW5jdGlvbiBuMCgpe2NvbnN0IGU9bmV3IEN1c3RvbUV2ZW50KHZwKTtkb2N1bWVudC5kaXNwYXRjaEV2ZW50KGUpfWZ1bmN0aW9uIEtTKGUsdCxuLHtkaXNjcmV0ZTpyfSl7Y29uc3Qgbz1uLm9yaWdpbmFsRXZlbnQudGFyZ2V0LGk9bmV3IEN1c3RvbUV2ZW50KGUse2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMCxkZXRhaWw6bn0pO3QmJm8uYWRkRXZlbnRMaXN0ZW5lcihlLHQse29uY2U6ITB9KSxyP1FUKG8saSk6by5kaXNwYXRjaEV2ZW50KGkpfWxldCAkZj0wO2Z1bmN0aW9uIHNPKCl7cC51c2VFZmZlY3QoKCk9Pnt2YXIgZSx0O2NvbnN0IG49ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiW2RhdGEtcmFkaXgtZm9jdXMtZ3VhcmRdIik7cmV0dXJuIGRvY3VtZW50LmJvZHkuaW5zZXJ0QWRqYWNlbnRFbGVtZW50KCJhZnRlcmJlZ2luIiwoZT1uWzBdKSE9PW51bGwmJmUhPT12b2lkIDA/ZTpyMCgpKSxkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudCgiYmVmb3JlZW5kIiwodD1uWzFdKSE9PW51bGwmJnQhPT12b2lkIDA/dDpyMCgpKSwkZisrLCgpPT57JGY9PT0xJiZkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbZGF0YS1yYWRpeC1mb2N1cy1ndWFyZF0iKS5mb3JFYWNoKHI9PnIucmVtb3ZlKCkpLCRmLS19fSxbXSl9ZnVuY3Rpb24gcjAoKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoImRhdGEtcmFkaXgtZm9jdXMtZ3VhcmQiLCIiKSxlLnRhYkluZGV4PTAsZS5zdHlsZS5jc3NUZXh0PSJvdXRsaW5lOiBub25lOyBvcGFjaXR5OiAwOyBwb3NpdGlvbjogZml4ZWQ7IHBvaW50ZXItZXZlbnRzOiBub25lIixlfWNvbnN0IGtmPSJmb2N1c1Njb3BlLmF1dG9Gb2N1c09uTW91bnQiLFRmPSJmb2N1c1Njb3BlLmF1dG9Gb2N1c09uVW5tb3VudCIsbzA9e2J1YmJsZXM6ITEsY2FuY2VsYWJsZTohMH0sYU89cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7bG9vcDpuPSExLHRyYXBwZWQ6cj0hMSxvbk1vdW50QXV0b0ZvY3VzOm8sb25Vbm1vdW50QXV0b0ZvY3VzOmksLi4ubH09ZSxbcyxhXT1wLnVzZVN0YXRlKG51bGwpLHU9VnQobyksYz1WdChpKSxkPXAudXNlUmVmKG51bGwpLGY9WGUodCxtPT5hKG0pKSxoPXAudXNlUmVmKHtwYXVzZWQ6ITEscGF1c2UoKXt0aGlzLnBhdXNlZD0hMH0scmVzdW1lKCl7dGhpcy5wYXVzZWQ9ITF9fSkuY3VycmVudDtwLnVzZUVmZmVjdCgoKT0+e2lmKHIpe2xldCB5PWZ1bmN0aW9uKCQpe2lmKGgucGF1c2VkfHwhcylyZXR1cm47Y29uc3QgQz0kLnRhcmdldDtzLmNvbnRhaW5zKEMpP2QuY3VycmVudD1DOm9vKGQuY3VycmVudCx7c2VsZWN0OiEwfSl9LHg9ZnVuY3Rpb24oJCl7aWYoaC5wYXVzZWR8fCFzKXJldHVybjtjb25zdCBDPSQucmVsYXRlZFRhcmdldDtDIT09bnVsbCYmKHMuY29udGFpbnMoQyl8fG9vKGQuY3VycmVudCx7c2VsZWN0OiEwfSkpfSxfPWZ1bmN0aW9uKCQpe2lmKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT1kb2N1bWVudC5ib2R5KWZvcihjb25zdCBUIG9mICQpVC5yZW1vdmVkTm9kZXMubGVuZ3RoPjAmJm9vKHMpfTt2YXIgbT15LFM9eCx2PV87ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIseSksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNvdXQiLHgpO2NvbnN0IEU9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoXyk7cmV0dXJuIHMmJkUub2JzZXJ2ZShzLHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pLCgpPT57ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIseSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXNvdXQiLHgpLEUuZGlzY29ubmVjdCgpfX19LFtyLHMsaC5wYXVzZWRdKSxwLnVzZUVmZmVjdCgoKT0+e2lmKHMpe2wwLmFkZChoKTtjb25zdCBtPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7aWYoIXMuY29udGFpbnMobSkpe2NvbnN0IHY9bmV3IEN1c3RvbUV2ZW50KGtmLG8wKTtzLmFkZEV2ZW50TGlzdGVuZXIoa2YsdSkscy5kaXNwYXRjaEV2ZW50KHYpLHYuZGVmYXVsdFByZXZlbnRlZHx8KHVPKHBPKEdTKHMpKSx7c2VsZWN0OiEwfSksZG9jdW1lbnQuYWN0aXZlRWxlbWVudD09PW0mJm9vKHMpKX1yZXR1cm4oKT0+e3MucmVtb3ZlRXZlbnRMaXN0ZW5lcihrZix1KSxzZXRUaW1lb3V0KCgpPT57Y29uc3Qgdj1uZXcgQ3VzdG9tRXZlbnQoVGYsbzApO3MuYWRkRXZlbnRMaXN0ZW5lcihUZixjKSxzLmRpc3BhdGNoRXZlbnQodiksdi5kZWZhdWx0UHJldmVudGVkfHxvbyhtPz9kb2N1bWVudC5ib2R5LHtzZWxlY3Q6ITB9KSxzLnJlbW92ZUV2ZW50TGlzdGVuZXIoVGYsYyksbDAucmVtb3ZlKGgpfSwwKX19fSxbcyx1LGMsaF0pO2NvbnN0IGc9cC51c2VDYWxsYmFjayhtPT57aWYoIW4mJiFyfHxoLnBhdXNlZClyZXR1cm47Y29uc3QgUz1tLmtleT09PSJUYWIiJiYhbS5hbHRLZXkmJiFtLmN0cmxLZXkmJiFtLm1ldGFLZXksdj1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2lmKFMmJnYpe2NvbnN0IHk9bS5jdXJyZW50VGFyZ2V0LFt4LF9dPWNPKHkpO3gmJl8/IW0uc2hpZnRLZXkmJnY9PT1fPyhtLnByZXZlbnREZWZhdWx0KCksbiYmb28oeCx7c2VsZWN0OiEwfSkpOm0uc2hpZnRLZXkmJnY9PT14JiYobS5wcmV2ZW50RGVmYXVsdCgpLG4mJm9vKF8se3NlbGVjdDohMH0pKTp2PT09eSYmbS5wcmV2ZW50RGVmYXVsdCgpfX0sW24scixoLnBhdXNlZF0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHt0YWJJbmRleDotMX0sbCx7cmVmOmYsb25LZXlEb3duOmd9KSl9KTtmdW5jdGlvbiB1TyhlLHtzZWxlY3Q6dD0hMX09e30pe2NvbnN0IG49ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtmb3IoY29uc3QgciBvZiBlKWlmKG9vKHIse3NlbGVjdDp0fSksZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PW4pcmV0dXJufWZ1bmN0aW9uIGNPKGUpe2NvbnN0IHQ9R1MoZSksbj1pMCh0LGUpLHI9aTAodC5yZXZlcnNlKCksZSk7cmV0dXJuW24scl19ZnVuY3Rpb24gR1MoZSl7Y29uc3QgdD1bXSxuPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIoZSxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCx7YWNjZXB0Tm9kZTpyPT57Y29uc3Qgbz1yLnRhZ05hbWU9PT0iSU5QVVQiJiZyLnR5cGU9PT0iaGlkZGVuIjtyZXR1cm4gci5kaXNhYmxlZHx8ci5oaWRkZW58fG8/Tm9kZUZpbHRlci5GSUxURVJfU0tJUDpyLnRhYkluZGV4Pj0wP05vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVDpOb2RlRmlsdGVyLkZJTFRFUl9TS0lQfX0pO2Zvcig7bi5uZXh0Tm9kZSgpOyl0LnB1c2gobi5jdXJyZW50Tm9kZSk7cmV0dXJuIHR9ZnVuY3Rpb24gaTAoZSx0KXtmb3IoY29uc3QgbiBvZiBlKWlmKCFkTyhuLHt1cFRvOnR9KSlyZXR1cm4gbn1mdW5jdGlvbiBkTyhlLHt1cFRvOnR9KXtpZihnZXRDb21wdXRlZFN0eWxlKGUpLnZpc2liaWxpdHk9PT0iaGlkZGVuIilyZXR1cm4hMDtmb3IoO2U7KXtpZih0IT09dm9pZCAwJiZlPT09dClyZXR1cm4hMTtpZihnZXRDb21wdXRlZFN0eWxlKGUpLmRpc3BsYXk9PT0ibm9uZSIpcmV0dXJuITA7ZT1lLnBhcmVudEVsZW1lbnR9cmV0dXJuITF9ZnVuY3Rpb24gZk8oZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50JiYic2VsZWN0ImluIGV9ZnVuY3Rpb24gb28oZSx7c2VsZWN0OnQ9ITF9PXt9KXtpZihlJiZlLmZvY3VzKXtjb25zdCBuPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7ZS5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pLGUhPT1uJiZmTyhlKSYmdCYmZS5zZWxlY3QoKX19Y29uc3QgbDA9aE8oKTtmdW5jdGlvbiBoTygpe2xldCBlPVtdO3JldHVybnthZGQodCl7Y29uc3Qgbj1lWzBdO3QhPT1uJiYobj09bnVsbHx8bi5wYXVzZSgpKSxlPXMwKGUsdCksZS51bnNoaWZ0KHQpfSxyZW1vdmUodCl7dmFyIG47ZT1zMChlLHQpLChuPWVbMF0pPT09bnVsbHx8bj09PXZvaWQgMHx8bi5yZXN1bWUoKX19fWZ1bmN0aW9uIHMwKGUsdCl7Y29uc3Qgbj1bLi4uZV0scj1uLmluZGV4T2YodCk7cmV0dXJuIHIhPT0tMSYmbi5zcGxpY2UociwxKSxufWZ1bmN0aW9uIHBPKGUpe3JldHVybiBlLmZpbHRlcih0PT50LnRhZ05hbWUhPT0iQSIpfWNvbnN0IGdPPXEwWyJ1c2VJZCIudG9TdHJpbmcoKV18fCgoKT0+e30pO2xldCBtTz0wO2Z1bmN0aW9uIHhkKGUpe2NvbnN0W3Qsbl09cC51c2VTdGF0ZShnTygpKTtyZXR1cm4gJG4oKCk9PntlfHxuKHI9PnI/P1N0cmluZyhtTysrKSl9LFtlXSksZXx8KHQ/YHJhZGl4LSR7dH1gOiIiKX1jb25zdCB2Tz1bInRvcCIsInJpZ2h0IiwiYm90dG9tIiwibGVmdCJdLE1vPU1hdGgubWluLHluPU1hdGgubWF4LEFjPU1hdGgucm91bmQsbXU9TWF0aC5mbG9vcixEbz1lPT4oe3g6ZSx5OmV9KSx5Tz17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iixib3R0b206InRvcCIsdG9wOiJib3R0b20ifSx4Tz17c3RhcnQ6ImVuZCIsZW5kOiJzdGFydCJ9O2Z1bmN0aW9uIHlwKGUsdCxuKXtyZXR1cm4geW4oZSxNbyh0LG4pKX1mdW5jdGlvbiBCcihlLHQpe3JldHVybiB0eXBlb2YgZT09ImZ1bmN0aW9uIj9lKHQpOmV9ZnVuY3Rpb24gV3IoZSl7cmV0dXJuIGUuc3BsaXQoIi0iKVswXX1mdW5jdGlvbiBZbChlKXtyZXR1cm4gZS5zcGxpdCgiLSIpWzFdfWZ1bmN0aW9uIG1tKGUpe3JldHVybiBlPT09IngiPyJ5IjoieCJ9ZnVuY3Rpb24gdm0oZSl7cmV0dXJuIGU9PT0ieSI/ImhlaWdodCI6IndpZHRoIn1mdW5jdGlvbiBYbChlKXtyZXR1cm5bInRvcCIsImJvdHRvbSJdLmluY2x1ZGVzKFdyKGUpKT8ieSI6IngifWZ1bmN0aW9uIHltKGUpe3JldHVybiBtbShYbChlKSl9ZnVuY3Rpb24gX08oZSx0LG4pe249PT12b2lkIDAmJihuPSExKTtjb25zdCByPVlsKGUpLG89eW0oZSksaT12bShvKTtsZXQgbD1vPT09IngiP3I9PT0obj8iZW5kIjoic3RhcnQiKT8icmlnaHQiOiJsZWZ0IjpyPT09InN0YXJ0Ij8iYm90dG9tIjoidG9wIjtyZXR1cm4gdC5yZWZlcmVuY2VbaV0+dC5mbG9hdGluZ1tpXSYmKGw9TWMobCkpLFtsLE1jKGwpXX1mdW5jdGlvbiB3TyhlKXtjb25zdCB0PU1jKGUpO3JldHVyblt4cChlKSx0LHhwKHQpXX1mdW5jdGlvbiB4cChlKXtyZXR1cm4gZS5yZXBsYWNlKC9zdGFydHxlbmQvZyx0PT54T1t0XSl9ZnVuY3Rpb24gU08oZSx0LG4pe2NvbnN0IHI9WyJsZWZ0IiwicmlnaHQiXSxvPVsicmlnaHQiLCJsZWZ0Il0saT1bInRvcCIsImJvdHRvbSJdLGw9WyJib3R0b20iLCJ0b3AiXTtzd2l0Y2goZSl7Y2FzZSJ0b3AiOmNhc2UiYm90dG9tIjpyZXR1cm4gbj90P286cjp0P3I6bztjYXNlImxlZnQiOmNhc2UicmlnaHQiOnJldHVybiB0P2k6bDtkZWZhdWx0OnJldHVybltdfX1mdW5jdGlvbiBFTyhlLHQsbixyKXtjb25zdCBvPVlsKGUpO2xldCBpPVNPKFdyKGUpLG49PT0ic3RhcnQiLHIpO3JldHVybiBvJiYoaT1pLm1hcChsPT5sKyItIitvKSx0JiYoaT1pLmNvbmNhdChpLm1hcCh4cCkpKSksaX1mdW5jdGlvbiBNYyhlKXtyZXR1cm4gZS5yZXBsYWNlKC9sZWZ0fHJpZ2h0fGJvdHRvbXx0b3AvZyx0PT55T1t0XSl9ZnVuY3Rpb24gQ08oZSl7cmV0dXJue3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowLC4uLmV9fWZ1bmN0aW9uIFlTKGUpe3JldHVybiB0eXBlb2YgZSE9Im51bWJlciI/Q08oZSk6e3RvcDplLHJpZ2h0OmUsYm90dG9tOmUsbGVmdDplfX1mdW5jdGlvbiBEYyhlKXtyZXR1cm57Li4uZSx0b3A6ZS55LGxlZnQ6ZS54LHJpZ2h0OmUueCtlLndpZHRoLGJvdHRvbTplLnkrZS5oZWlnaHR9fWZ1bmN0aW9uIGEwKGUsdCxuKXtsZXR7cmVmZXJlbmNlOnIsZmxvYXRpbmc6b309ZTtjb25zdCBpPVhsKHQpLGw9eW0odCkscz12bShsKSxhPVdyKHQpLHU9aT09PSJ5IixjPXIueCtyLndpZHRoLzItby53aWR0aC8yLGQ9ci55K3IuaGVpZ2h0LzItby5oZWlnaHQvMixmPXJbc10vMi1vW3NdLzI7bGV0IGg7c3dpdGNoKGEpe2Nhc2UidG9wIjpoPXt4OmMseTpyLnktby5oZWlnaHR9O2JyZWFrO2Nhc2UiYm90dG9tIjpoPXt4OmMseTpyLnkrci5oZWlnaHR9O2JyZWFrO2Nhc2UicmlnaHQiOmg9e3g6ci54K3Iud2lkdGgseTpkfTticmVhaztjYXNlImxlZnQiOmg9e3g6ci54LW8ud2lkdGgseTpkfTticmVhaztkZWZhdWx0Omg9e3g6ci54LHk6ci55fX1zd2l0Y2goWWwodCkpe2Nhc2Uic3RhcnQiOmhbbF0tPWYqKG4mJnU/LTE6MSk7YnJlYWs7Y2FzZSJlbmQiOmhbbF0rPWYqKG4mJnU/LTE6MSk7YnJlYWt9cmV0dXJuIGh9Y29uc3QgJE89YXN5bmMoZSx0LG4pPT57Y29uc3R7cGxhY2VtZW50OnI9ImJvdHRvbSIsc3RyYXRlZ3k6bz0iYWJzb2x1dGUiLG1pZGRsZXdhcmU6aT1bXSxwbGF0Zm9ybTpsfT1uLHM9aS5maWx0ZXIoQm9vbGVhbiksYT1hd2FpdChsLmlzUlRMPT1udWxsP3ZvaWQgMDpsLmlzUlRMKHQpKTtsZXQgdT1hd2FpdCBsLmdldEVsZW1lbnRSZWN0cyh7cmVmZXJlbmNlOmUsZmxvYXRpbmc6dCxzdHJhdGVneTpvfSkse3g6Yyx5OmR9PWEwKHUscixhKSxmPXIsaD17fSxnPTA7Zm9yKGxldCBtPTA7bTxzLmxlbmd0aDttKyspe2NvbnN0e25hbWU6Uyxmbjp2fT1zW21dLHt4OnkseTp4LGRhdGE6XyxyZXNldDpFfT1hd2FpdCB2KHt4OmMseTpkLGluaXRpYWxQbGFjZW1lbnQ6cixwbGFjZW1lbnQ6ZixzdHJhdGVneTpvLG1pZGRsZXdhcmVEYXRhOmgscmVjdHM6dSxwbGF0Zm9ybTpsLGVsZW1lbnRzOntyZWZlcmVuY2U6ZSxmbG9hdGluZzp0fX0pO2lmKGM9eT8/YyxkPXg/P2QsaD17Li4uaCxbU106ey4uLmhbU10sLi4uX319LEUmJmc8PTUwKXtnKyssdHlwZW9mIEU9PSJvYmplY3QiJiYoRS5wbGFjZW1lbnQmJihmPUUucGxhY2VtZW50KSxFLnJlY3RzJiYodT1FLnJlY3RzPT09ITA/YXdhaXQgbC5nZXRFbGVtZW50UmVjdHMoe3JlZmVyZW5jZTplLGZsb2F0aW5nOnQsc3RyYXRlZ3k6b30pOkUucmVjdHMpLHt4OmMseTpkfT1hMCh1LGYsYSkpLG09LTE7Y29udGludWV9fXJldHVybnt4OmMseTpkLHBsYWNlbWVudDpmLHN0cmF0ZWd5Om8sbWlkZGxld2FyZURhdGE6aH19O2FzeW5jIGZ1bmN0aW9uIF9hKGUsdCl7dmFyIG47dD09PXZvaWQgMCYmKHQ9e30pO2NvbnN0e3g6cix5Om8scGxhdGZvcm06aSxyZWN0czpsLGVsZW1lbnRzOnMsc3RyYXRlZ3k6YX09ZSx7Ym91bmRhcnk6dT0iY2xpcHBpbmdBbmNlc3RvcnMiLHJvb3RCb3VuZGFyeTpjPSJ2aWV3cG9ydCIsZWxlbWVudENvbnRleHQ6ZD0iZmxvYXRpbmciLGFsdEJvdW5kYXJ5OmY9ITEscGFkZGluZzpoPTB9PUJyKHQsZSksZz1ZUyhoKSxTPXNbZj9kPT09ImZsb2F0aW5nIj8icmVmZXJlbmNlIjoiZmxvYXRpbmciOmRdLHY9RGMoYXdhaXQgaS5nZXRDbGlwcGluZ1JlY3Qoe2VsZW1lbnQ6KG49YXdhaXQoaS5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOmkuaXNFbGVtZW50KFMpKSk9PW51bGx8fG4/UzpTLmNvbnRleHRFbGVtZW50fHxhd2FpdChpLmdldERvY3VtZW50RWxlbWVudD09bnVsbD92b2lkIDA6aS5nZXREb2N1bWVudEVsZW1lbnQocy5mbG9hdGluZykpLGJvdW5kYXJ5OnUscm9vdEJvdW5kYXJ5OmMsc3RyYXRlZ3k6YX0pKSx5PWQ9PT0iZmxvYXRpbmciP3suLi5sLmZsb2F0aW5nLHg6cix5Om99OmwucmVmZXJlbmNlLHg9YXdhaXQoaS5nZXRPZmZzZXRQYXJlbnQ9PW51bGw/dm9pZCAwOmkuZ2V0T2Zmc2V0UGFyZW50KHMuZmxvYXRpbmcpKSxfPWF3YWl0KGkuaXNFbGVtZW50PT1udWxsP3ZvaWQgMDppLmlzRWxlbWVudCh4KSk/YXdhaXQoaS5nZXRTY2FsZT09bnVsbD92b2lkIDA6aS5nZXRTY2FsZSh4KSl8fHt4OjEseToxfTp7eDoxLHk6MX0sRT1EYyhpLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0P2F3YWl0IGkuY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Qoe3JlY3Q6eSxvZmZzZXRQYXJlbnQ6eCxzdHJhdGVneTphfSk6eSk7cmV0dXJue3RvcDoodi50b3AtRS50b3ArZy50b3ApL18ueSxib3R0b206KEUuYm90dG9tLXYuYm90dG9tK2cuYm90dG9tKS9fLnksbGVmdDoodi5sZWZ0LUUubGVmdCtnLmxlZnQpL18ueCxyaWdodDooRS5yaWdodC12LnJpZ2h0K2cucmlnaHQpL18ueH19Y29uc3QgdTA9ZT0+KHtuYW1lOiJhcnJvdyIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3g6bix5OnIscGxhY2VtZW50Om8scmVjdHM6aSxwbGF0Zm9ybTpsLGVsZW1lbnRzOnMsbWlkZGxld2FyZURhdGE6YX09dCx7ZWxlbWVudDp1LHBhZGRpbmc6Yz0wfT1CcihlLHQpfHx7fTtpZih1PT1udWxsKXJldHVybnt9O2NvbnN0IGQ9WVMoYyksZj17eDpuLHk6cn0saD15bShvKSxnPXZtKGgpLG09YXdhaXQgbC5nZXREaW1lbnNpb25zKHUpLFM9aD09PSJ5Iix2PVM/InRvcCI6ImxlZnQiLHk9Uz8iYm90dG9tIjoicmlnaHQiLHg9Uz8iY2xpZW50SGVpZ2h0IjoiY2xpZW50V2lkdGgiLF89aS5yZWZlcmVuY2VbZ10raS5yZWZlcmVuY2VbaF0tZltoXS1pLmZsb2F0aW5nW2ddLEU9ZltoXS1pLnJlZmVyZW5jZVtoXSwkPWF3YWl0KGwuZ2V0T2Zmc2V0UGFyZW50PT1udWxsP3ZvaWQgMDpsLmdldE9mZnNldFBhcmVudCh1KSk7bGV0IEM9JD8kW3hdOjA7KCFDfHwhYXdhaXQobC5pc0VsZW1lbnQ9PW51bGw/dm9pZCAwOmwuaXNFbGVtZW50KCQpKSkmJihDPXMuZmxvYXRpbmdbeF18fGkuZmxvYXRpbmdbZ10pO2NvbnN0IFQ9Xy8yLUUvMixNPUMvMi1tW2ddLzItMSxSPU1vKGRbdl0sTSksaj1NbyhkW3ldLE0pLEY9UixhZT1DLW1bZ10taixIPUMvMi1tW2ddLzIrVCxYPXlwKEYsSCxhZSksUD0hYS5hcnJvdyYmWWwobykhPW51bGwmJkghPVgmJmkucmVmZXJlbmNlW2ddLzItKEg8Rj9SOmopLW1bZ10vMjwwLE89UD9IPEY/SC1GOkgtYWU6MDtyZXR1cm57W2hdOmZbaF0rTyxkYXRhOntbaF06WCxjZW50ZXJPZmZzZXQ6SC1YLU8sLi4uUCYme2FsaWdubWVudE9mZnNldDpPfX0scmVzZXQ6UH19fSksa089ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7bmFtZToiZmxpcCIsb3B0aW9uczplLGFzeW5jIGZuKHQpe3ZhciBuLHI7Y29uc3R7cGxhY2VtZW50Om8sbWlkZGxld2FyZURhdGE6aSxyZWN0czpsLGluaXRpYWxQbGFjZW1lbnQ6cyxwbGF0Zm9ybTphLGVsZW1lbnRzOnV9PXQse21haW5BeGlzOmM9ITAsY3Jvc3NBeGlzOmQ9ITAsZmFsbGJhY2tQbGFjZW1lbnRzOmYsZmFsbGJhY2tTdHJhdGVneTpoPSJiZXN0Rml0IixmYWxsYmFja0F4aXNTaWRlRGlyZWN0aW9uOmc9Im5vbmUiLGZsaXBBbGlnbm1lbnQ6bT0hMCwuLi5TfT1CcihlLHQpO2lmKChuPWkuYXJyb3cpIT1udWxsJiZuLmFsaWdubWVudE9mZnNldClyZXR1cm57fTtjb25zdCB2PVdyKG8pLHk9V3Iocyk9PT1zLHg9YXdhaXQoYS5pc1JUTD09bnVsbD92b2lkIDA6YS5pc1JUTCh1LmZsb2F0aW5nKSksXz1mfHwoeXx8IW0/W01jKHMpXTp3TyhzKSk7IWYmJmchPT0ibm9uZSImJl8ucHVzaCguLi5FTyhzLG0sZyx4KSk7Y29uc3QgRT1bcywuLi5fXSwkPWF3YWl0IF9hKHQsUyksQz1bXTtsZXQgVD0oKHI9aS5mbGlwKT09bnVsbD92b2lkIDA6ci5vdmVyZmxvd3MpfHxbXTtpZihjJiZDLnB1c2goJFt2XSksZCl7Y29uc3QgRj1fTyhvLGwseCk7Qy5wdXNoKCRbRlswXV0sJFtGWzFdXSl9aWYoVD1bLi4uVCx7cGxhY2VtZW50Om8sb3ZlcmZsb3dzOkN9XSwhQy5ldmVyeShGPT5GPD0wKSl7dmFyIE0sUjtjb25zdCBGPSgoKE09aS5mbGlwKT09bnVsbD92b2lkIDA6TS5pbmRleCl8fDApKzEsYWU9RVtGXTtpZihhZSlyZXR1cm57ZGF0YTp7aW5kZXg6RixvdmVyZmxvd3M6VH0scmVzZXQ6e3BsYWNlbWVudDphZX19O2xldCBIPShSPVQuZmlsdGVyKFg9Plgub3ZlcmZsb3dzWzBdPD0wKS5zb3J0KChYLFApPT5YLm92ZXJmbG93c1sxXS1QLm92ZXJmbG93c1sxXSlbMF0pPT1udWxsP3ZvaWQgMDpSLnBsYWNlbWVudDtpZighSClzd2l0Y2goaCl7Y2FzZSJiZXN0Rml0Ijp7dmFyIGo7Y29uc3QgWD0oaj1ULm1hcChQPT5bUC5wbGFjZW1lbnQsUC5vdmVyZmxvd3MuZmlsdGVyKE89Pk8+MCkucmVkdWNlKChPLGspPT5PK2ssMCldKS5zb3J0KChQLE8pPT5QWzFdLU9bMV0pWzBdKT09bnVsbD92b2lkIDA6alswXTtYJiYoSD1YKTticmVha31jYXNlImluaXRpYWxQbGFjZW1lbnQiOkg9czticmVha31pZihvIT09SClyZXR1cm57cmVzZXQ6e3BsYWNlbWVudDpIfX19cmV0dXJue319fX07ZnVuY3Rpb24gYzAoZSx0KXtyZXR1cm57dG9wOmUudG9wLXQuaGVpZ2h0LHJpZ2h0OmUucmlnaHQtdC53aWR0aCxib3R0b206ZS5ib3R0b20tdC5oZWlnaHQsbGVmdDplLmxlZnQtdC53aWR0aH19ZnVuY3Rpb24gZDAoZSl7cmV0dXJuIHZPLnNvbWUodD0+ZVt0XT49MCl9Y29uc3QgVE89ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7bmFtZToiaGlkZSIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3JlY3RzOm59PXQse3N0cmF0ZWd5OnI9InJlZmVyZW5jZUhpZGRlbiIsLi4ub309QnIoZSx0KTtzd2l0Y2gocil7Y2FzZSJyZWZlcmVuY2VIaWRkZW4iOntjb25zdCBpPWF3YWl0IF9hKHQsey4uLm8sZWxlbWVudENvbnRleHQ6InJlZmVyZW5jZSJ9KSxsPWMwKGksbi5yZWZlcmVuY2UpO3JldHVybntkYXRhOntyZWZlcmVuY2VIaWRkZW5PZmZzZXRzOmwscmVmZXJlbmNlSGlkZGVuOmQwKGwpfX19Y2FzZSJlc2NhcGVkIjp7Y29uc3QgaT1hd2FpdCBfYSh0LHsuLi5vLGFsdEJvdW5kYXJ5OiEwfSksbD1jMChpLG4uZmxvYXRpbmcpO3JldHVybntkYXRhOntlc2NhcGVkT2Zmc2V0czpsLGVzY2FwZWQ6ZDAobCl9fX1kZWZhdWx0OnJldHVybnt9fX19fTthc3luYyBmdW5jdGlvbiBOTyhlLHQpe2NvbnN0e3BsYWNlbWVudDpuLHBsYXRmb3JtOnIsZWxlbWVudHM6b309ZSxpPWF3YWl0KHIuaXNSVEw9PW51bGw/dm9pZCAwOnIuaXNSVEwoby5mbG9hdGluZykpLGw9V3Iobikscz1ZbChuKSxhPVhsKG4pPT09InkiLHU9WyJsZWZ0IiwidG9wIl0uaW5jbHVkZXMobCk/LTE6MSxjPWkmJmE/LTE6MSxkPUJyKHQsZSk7bGV0e21haW5BeGlzOmYsY3Jvc3NBeGlzOmgsYWxpZ25tZW50QXhpczpnfT10eXBlb2YgZD09Im51bWJlciI/e21haW5BeGlzOmQsY3Jvc3NBeGlzOjAsYWxpZ25tZW50QXhpczpudWxsfTp7bWFpbkF4aXM6MCxjcm9zc0F4aXM6MCxhbGlnbm1lbnRBeGlzOm51bGwsLi4uZH07cmV0dXJuIHMmJnR5cGVvZiBnPT0ibnVtYmVyIiYmKGg9cz09PSJlbmQiP2cqLTE6ZyksYT97eDpoKmMseTpmKnV9Ont4OmYqdSx5OmgqY319Y29uc3QgYk89ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPTApLHtuYW1lOiJvZmZzZXQiLG9wdGlvbnM6ZSxhc3luYyBmbih0KXtjb25zdHt4Om4seTpyfT10LG89YXdhaXQgTk8odCxlKTtyZXR1cm57eDpuK28ueCx5OnIrby55LGRhdGE6b319fX0sUk89ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7bmFtZToic2hpZnQiLG9wdGlvbnM6ZSxhc3luYyBmbih0KXtjb25zdHt4Om4seTpyLHBsYWNlbWVudDpvfT10LHttYWluQXhpczppPSEwLGNyb3NzQXhpczpsPSExLGxpbWl0ZXI6cz17Zm46Uz0+e2xldHt4OnYseX09UztyZXR1cm57eDp2LHl9fX0sLi4uYX09QnIoZSx0KSx1PXt4Om4seTpyfSxjPWF3YWl0IF9hKHQsYSksZD1YbChXcihvKSksZj1tbShkKTtsZXQgaD11W2ZdLGc9dVtkXTtpZihpKXtjb25zdCBTPWY9PT0ieSI/InRvcCI6ImxlZnQiLHY9Zj09PSJ5Ij8iYm90dG9tIjoicmlnaHQiLHk9aCtjW1NdLHg9aC1jW3ZdO2g9eXAoeSxoLHgpfWlmKGwpe2NvbnN0IFM9ZD09PSJ5Ij8idG9wIjoibGVmdCIsdj1kPT09InkiPyJib3R0b20iOiJyaWdodCIseT1nK2NbU10seD1nLWNbdl07Zz15cCh5LGcseCl9Y29uc3QgbT1zLmZuKHsuLi50LFtmXTpoLFtkXTpnfSk7cmV0dXJuey4uLm0sZGF0YTp7eDptLngtbix5Om0ueS1yfX19fX0sUE89ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7b3B0aW9uczplLGZuKHQpe2NvbnN0e3g6bix5OnIscGxhY2VtZW50Om8scmVjdHM6aSxtaWRkbGV3YXJlRGF0YTpsfT10LHtvZmZzZXQ6cz0wLG1haW5BeGlzOmE9ITAsY3Jvc3NBeGlzOnU9ITB9PUJyKGUsdCksYz17eDpuLHk6cn0sZD1YbChvKSxmPW1tKGQpO2xldCBoPWNbZl0sZz1jW2RdO2NvbnN0IG09QnIocyx0KSxTPXR5cGVvZiBtPT0ibnVtYmVyIj97bWFpbkF4aXM6bSxjcm9zc0F4aXM6MH06e21haW5BeGlzOjAsY3Jvc3NBeGlzOjAsLi4ubX07aWYoYSl7Y29uc3QgeD1mPT09InkiPyJoZWlnaHQiOiJ3aWR0aCIsXz1pLnJlZmVyZW5jZVtmXS1pLmZsb2F0aW5nW3hdK1MubWFpbkF4aXMsRT1pLnJlZmVyZW5jZVtmXStpLnJlZmVyZW5jZVt4XS1TLm1haW5BeGlzO2g8Xz9oPV86aD5FJiYoaD1FKX1pZih1KXt2YXIgdix5O2NvbnN0IHg9Zj09PSJ5Ij8id2lkdGgiOiJoZWlnaHQiLF89WyJ0b3AiLCJsZWZ0Il0uaW5jbHVkZXMoV3IobykpLEU9aS5yZWZlcmVuY2VbZF0taS5mbG9hdGluZ1t4XSsoXyYmKCh2PWwub2Zmc2V0KT09bnVsbD92b2lkIDA6dltkXSl8fDApKyhfPzA6Uy5jcm9zc0F4aXMpLCQ9aS5yZWZlcmVuY2VbZF0raS5yZWZlcmVuY2VbeF0rKF8/MDooKHk9bC5vZmZzZXQpPT1udWxsP3ZvaWQgMDp5W2RdKXx8MCktKF8/Uy5jcm9zc0F4aXM6MCk7ZzxFP2c9RTpnPiQmJihnPSQpfXJldHVybntbZl06aCxbZF06Z319fX0sT089ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT12b2lkIDAmJihlPXt9KSx7bmFtZToic2l6ZSIsb3B0aW9uczplLGFzeW5jIGZuKHQpe2NvbnN0e3BsYWNlbWVudDpuLHJlY3RzOnIscGxhdGZvcm06byxlbGVtZW50czppfT10LHthcHBseTpsPSgpPT57fSwuLi5zfT1CcihlLHQpLGE9YXdhaXQgX2EodCxzKSx1PVdyKG4pLGM9WWwobiksZD1YbChuKT09PSJ5Iix7d2lkdGg6ZixoZWlnaHQ6aH09ci5mbG9hdGluZztsZXQgZyxtO3U9PT0idG9wInx8dT09PSJib3R0b20iPyhnPXUsbT1jPT09KGF3YWl0KG8uaXNSVEw9PW51bGw/dm9pZCAwOm8uaXNSVEwoaS5mbG9hdGluZykpPyJzdGFydCI6ImVuZCIpPyJsZWZ0IjoicmlnaHQiKToobT11LGc9Yz09PSJlbmQiPyJ0b3AiOiJib3R0b20iKTtjb25zdCBTPWgtYVtnXSx2PWYtYVttXSx5PSF0Lm1pZGRsZXdhcmVEYXRhLnNoaWZ0O2xldCB4PVMsXz12O2lmKGQpe2NvbnN0ICQ9Zi1hLmxlZnQtYS5yaWdodDtfPWN8fHk/TW8odiwkKTokfWVsc2V7Y29uc3QgJD1oLWEudG9wLWEuYm90dG9tO3g9Y3x8eT9NbyhTLCQpOiR9aWYoeSYmIWMpe2NvbnN0ICQ9eW4oYS5sZWZ0LDApLEM9eW4oYS5yaWdodCwwKSxUPXluKGEudG9wLDApLE09eW4oYS5ib3R0b20sMCk7ZD9fPWYtMiooJCE9PTB8fEMhPT0wPyQrQzp5bihhLmxlZnQsYS5yaWdodCkpOng9aC0yKihUIT09MHx8TSE9PTA/VCtNOnluKGEudG9wLGEuYm90dG9tKSl9YXdhaXQgbCh7Li4udCxhdmFpbGFibGVXaWR0aDpfLGF2YWlsYWJsZUhlaWdodDp4fSk7Y29uc3QgRT1hd2FpdCBvLmdldERpbWVuc2lvbnMoaS5mbG9hdGluZyk7cmV0dXJuIGYhPT1FLndpZHRofHxoIT09RS5oZWlnaHQ/e3Jlc2V0OntyZWN0czohMH19Ont9fX19O2Z1bmN0aW9uIExvKGUpe3JldHVybiBYUyhlKT8oZS5ub2RlTmFtZXx8IiIpLnRvTG93ZXJDYXNlKCk6IiNkb2N1bWVudCJ9ZnVuY3Rpb24gRW4oZSl7dmFyIHQ7cmV0dXJuKGU9PW51bGx8fCh0PWUub3duZXJEb2N1bWVudCk9PW51bGw/dm9pZCAwOnQuZGVmYXVsdFZpZXcpfHx3aW5kb3d9ZnVuY3Rpb24gUXIoZSl7dmFyIHQ7cmV0dXJuKHQ9KFhTKGUpP2Uub3duZXJEb2N1bWVudDplLmRvY3VtZW50KXx8d2luZG93LmRvY3VtZW50KT09bnVsbD92b2lkIDA6dC5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gWFMoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBOb2RlfHxlIGluc3RhbmNlb2YgRW4oZSkuTm9kZX1mdW5jdGlvbiBVcihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEVsZW1lbnR8fGUgaW5zdGFuY2VvZiBFbihlKS5FbGVtZW50fWZ1bmN0aW9uIHhyKGUpe3JldHVybiBlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnR8fGUgaW5zdGFuY2VvZiBFbihlKS5IVE1MRWxlbWVudH1mdW5jdGlvbiBmMChlKXtyZXR1cm4gdHlwZW9mIFNoYWRvd1Jvb3Q+InUiPyExOmUgaW5zdGFuY2VvZiBTaGFkb3dSb290fHxlIGluc3RhbmNlb2YgRW4oZSkuU2hhZG93Um9vdH1mdW5jdGlvbiB6YShlKXtjb25zdHtvdmVyZmxvdzp0LG92ZXJmbG93WDpuLG92ZXJmbG93WTpyLGRpc3BsYXk6b309Rm4oZSk7cmV0dXJuL2F1dG98c2Nyb2xsfG92ZXJsYXl8aGlkZGVufGNsaXAvLnRlc3QodCtyK24pJiYhWyJpbmxpbmUiLCJjb250ZW50cyJdLmluY2x1ZGVzKG8pfWZ1bmN0aW9uIEFPKGUpe3JldHVyblsidGFibGUiLCJ0ZCIsInRoIl0uaW5jbHVkZXMoTG8oZSkpfWZ1bmN0aW9uIHhtKGUpe2NvbnN0IHQ9X20oKSxuPUZuKGUpO3JldHVybiBuLnRyYW5zZm9ybSE9PSJub25lInx8bi5wZXJzcGVjdGl2ZSE9PSJub25lInx8KG4uY29udGFpbmVyVHlwZT9uLmNvbnRhaW5lclR5cGUhPT0ibm9ybWFsIjohMSl8fCF0JiYobi5iYWNrZHJvcEZpbHRlcj9uLmJhY2tkcm9wRmlsdGVyIT09Im5vbmUiOiExKXx8IXQmJihuLmZpbHRlcj9uLmZpbHRlciE9PSJub25lIjohMSl8fFsidHJhbnNmb3JtIiwicGVyc3BlY3RpdmUiLCJmaWx0ZXIiXS5zb21lKHI9PihuLndpbGxDaGFuZ2V8fCIiKS5pbmNsdWRlcyhyKSl8fFsicGFpbnQiLCJsYXlvdXQiLCJzdHJpY3QiLCJjb250ZW50Il0uc29tZShyPT4obi5jb250YWlufHwiIikuaW5jbHVkZXMocikpfWZ1bmN0aW9uIE1PKGUpe2xldCB0PU5sKGUpO2Zvcig7eHIodCkmJiFfZCh0KTspe2lmKHhtKHQpKXJldHVybiB0O3Q9TmwodCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24gX20oKXtyZXR1cm4gdHlwZW9mIENTUz4idSJ8fCFDU1Muc3VwcG9ydHM/ITE6Q1NTLnN1cHBvcnRzKCItd2Via2l0LWJhY2tkcm9wLWZpbHRlciIsIm5vbmUiKX1mdW5jdGlvbiBfZChlKXtyZXR1cm5bImh0bWwiLCJib2R5IiwiI2RvY3VtZW50Il0uaW5jbHVkZXMoTG8oZSkpfWZ1bmN0aW9uIEZuKGUpe3JldHVybiBFbihlKS5nZXRDb21wdXRlZFN0eWxlKGUpfWZ1bmN0aW9uIHdkKGUpe3JldHVybiBVcihlKT97c2Nyb2xsTGVmdDplLnNjcm9sbExlZnQsc2Nyb2xsVG9wOmUuc2Nyb2xsVG9wfTp7c2Nyb2xsTGVmdDplLnBhZ2VYT2Zmc2V0LHNjcm9sbFRvcDplLnBhZ2VZT2Zmc2V0fX1mdW5jdGlvbiBObChlKXtpZihMbyhlKT09PSJodG1sIilyZXR1cm4gZTtjb25zdCB0PWUuYXNzaWduZWRTbG90fHxlLnBhcmVudE5vZGV8fGYwKGUpJiZlLmhvc3R8fFFyKGUpO3JldHVybiBmMCh0KT90Lmhvc3Q6dH1mdW5jdGlvbiBRUyhlKXtjb25zdCB0PU5sKGUpO3JldHVybiBfZCh0KT9lLm93bmVyRG9jdW1lbnQ/ZS5vd25lckRvY3VtZW50LmJvZHk6ZS5ib2R5OnhyKHQpJiZ6YSh0KT90OlFTKHQpfWZ1bmN0aW9uIHdhKGUsdCxuKXt2YXIgcjt0PT09dm9pZCAwJiYodD1bXSksbj09PXZvaWQgMCYmKG49ITApO2NvbnN0IG89UVMoZSksaT1vPT09KChyPWUub3duZXJEb2N1bWVudCk9PW51bGw/dm9pZCAwOnIuYm9keSksbD1FbihvKTtyZXR1cm4gaT90LmNvbmNhdChsLGwudmlzdWFsVmlld3BvcnR8fFtdLHphKG8pP286W10sbC5mcmFtZUVsZW1lbnQmJm4/d2EobC5mcmFtZUVsZW1lbnQpOltdKTp0LmNvbmNhdChvLHdhKG8sW10sbikpfWZ1bmN0aW9uIEpTKGUpe2NvbnN0IHQ9Rm4oZSk7bGV0IG49cGFyc2VGbG9hdCh0LndpZHRoKXx8MCxyPXBhcnNlRmxvYXQodC5oZWlnaHQpfHwwO2NvbnN0IG89eHIoZSksaT1vP2Uub2Zmc2V0V2lkdGg6bixsPW8/ZS5vZmZzZXRIZWlnaHQ6cixzPUFjKG4pIT09aXx8QWMocikhPT1sO3JldHVybiBzJiYobj1pLHI9bCkse3dpZHRoOm4saGVpZ2h0OnIsJDpzfX1mdW5jdGlvbiB3bShlKXtyZXR1cm4gVXIoZSk/ZTplLmNvbnRleHRFbGVtZW50fWZ1bmN0aW9uIGhsKGUpe2NvbnN0IHQ9d20oZSk7aWYoIXhyKHQpKXJldHVybiBEbygxKTtjb25zdCBuPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse3dpZHRoOnIsaGVpZ2h0Om8sJDppfT1KUyh0KTtsZXQgbD0oaT9BYyhuLndpZHRoKTpuLndpZHRoKS9yLHM9KGk/QWMobi5oZWlnaHQpOm4uaGVpZ2h0KS9vO3JldHVybighbHx8IU51bWJlci5pc0Zpbml0ZShsKSkmJihsPTEpLCghc3x8IU51bWJlci5pc0Zpbml0ZShzKSkmJihzPTEpLHt4OmwseTpzfX1jb25zdCBETz1EbygwKTtmdW5jdGlvbiBaUyhlKXtjb25zdCB0PUVuKGUpO3JldHVybiFfbSgpfHwhdC52aXN1YWxWaWV3cG9ydD9ETzp7eDp0LnZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQseTp0LnZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcH19ZnVuY3Rpb24gTE8oZSx0LG4pe3JldHVybiB0PT09dm9pZCAwJiYodD0hMSksIW58fHQmJm4hPT1FbihlKT8hMTp0fWZ1bmN0aW9uIG1pKGUsdCxuLHIpe3Q9PT12b2lkIDAmJih0PSExKSxuPT09dm9pZCAwJiYobj0hMSk7Y29uc3Qgbz1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9d20oZSk7bGV0IGw9RG8oMSk7dCYmKHI/VXIocikmJihsPWhsKHIpKTpsPWhsKGUpKTtjb25zdCBzPUxPKGksbixyKT9aUyhpKTpEbygwKTtsZXQgYT0oby5sZWZ0K3MueCkvbC54LHU9KG8udG9wK3MueSkvbC55LGM9by53aWR0aC9sLngsZD1vLmhlaWdodC9sLnk7aWYoaSl7Y29uc3QgZj1FbihpKSxoPXImJlVyKHIpP0VuKHIpOnI7bGV0IGc9Zi5mcmFtZUVsZW1lbnQ7Zm9yKDtnJiZyJiZoIT09Zjspe2NvbnN0IG09aGwoZyksUz1nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHY9Rm4oZykseT1TLmxlZnQrKGcuY2xpZW50TGVmdCtwYXJzZUZsb2F0KHYucGFkZGluZ0xlZnQpKSptLngseD1TLnRvcCsoZy5jbGllbnRUb3ArcGFyc2VGbG9hdCh2LnBhZGRpbmdUb3ApKSptLnk7YSo9bS54LHUqPW0ueSxjKj1tLngsZCo9bS55LGErPXksdSs9eCxnPUVuKGcpLmZyYW1lRWxlbWVudH19cmV0dXJuIERjKHt3aWR0aDpjLGhlaWdodDpkLHg6YSx5OnV9KX1mdW5jdGlvbiBJTyhlKXtsZXR7cmVjdDp0LG9mZnNldFBhcmVudDpuLHN0cmF0ZWd5OnJ9PWU7Y29uc3Qgbz14cihuKSxpPVFyKG4pO2lmKG49PT1pKXJldHVybiB0O2xldCBsPXtzY3JvbGxMZWZ0OjAsc2Nyb2xsVG9wOjB9LHM9RG8oMSk7Y29uc3QgYT1EbygwKTtpZigob3x8IW8mJnIhPT0iZml4ZWQiKSYmKChMbyhuKSE9PSJib2R5Inx8emEoaSkpJiYobD13ZChuKSkseHIobikpKXtjb25zdCB1PW1pKG4pO3M9aGwobiksYS54PXUueCtuLmNsaWVudExlZnQsYS55PXUueStuLmNsaWVudFRvcH1yZXR1cm57d2lkdGg6dC53aWR0aCpzLngsaGVpZ2h0OnQuaGVpZ2h0KnMueSx4OnQueCpzLngtbC5zY3JvbGxMZWZ0KnMueCthLngseTp0Lnkqcy55LWwuc2Nyb2xsVG9wKnMueSthLnl9fWZ1bmN0aW9uIGpPKGUpe3JldHVybiBBcnJheS5mcm9tKGUuZ2V0Q2xpZW50UmVjdHMoKSl9ZnVuY3Rpb24gcVMoZSl7cmV0dXJuIG1pKFFyKGUpKS5sZWZ0K3dkKGUpLnNjcm9sbExlZnR9ZnVuY3Rpb24gek8oZSl7Y29uc3QgdD1RcihlKSxuPXdkKGUpLHI9ZS5vd25lckRvY3VtZW50LmJvZHksbz15bih0LnNjcm9sbFdpZHRoLHQuY2xpZW50V2lkdGgsci5zY3JvbGxXaWR0aCxyLmNsaWVudFdpZHRoKSxpPXluKHQuc2Nyb2xsSGVpZ2h0LHQuY2xpZW50SGVpZ2h0LHIuc2Nyb2xsSGVpZ2h0LHIuY2xpZW50SGVpZ2h0KTtsZXQgbD0tbi5zY3JvbGxMZWZ0K3FTKGUpO2NvbnN0IHM9LW4uc2Nyb2xsVG9wO3JldHVybiBGbihyKS5kaXJlY3Rpb249PT0icnRsIiYmKGwrPXluKHQuY2xpZW50V2lkdGgsci5jbGllbnRXaWR0aCktbykse3dpZHRoOm8saGVpZ2h0OmkseDpsLHk6c319ZnVuY3Rpb24gRk8oZSx0KXtjb25zdCBuPUVuKGUpLHI9UXIoZSksbz1uLnZpc3VhbFZpZXdwb3J0O2xldCBpPXIuY2xpZW50V2lkdGgsbD1yLmNsaWVudEhlaWdodCxzPTAsYT0wO2lmKG8pe2k9by53aWR0aCxsPW8uaGVpZ2h0O2NvbnN0IHU9X20oKTsoIXV8fHUmJnQ9PT0iZml4ZWQiKSYmKHM9by5vZmZzZXRMZWZ0LGE9by5vZmZzZXRUb3ApfXJldHVybnt3aWR0aDppLGhlaWdodDpsLHg6cyx5OmF9fWZ1bmN0aW9uIEJPKGUsdCl7Y29uc3Qgbj1taShlLCEwLHQ9PT0iZml4ZWQiKSxyPW4udG9wK2UuY2xpZW50VG9wLG89bi5sZWZ0K2UuY2xpZW50TGVmdCxpPXhyKGUpP2hsKGUpOkRvKDEpLGw9ZS5jbGllbnRXaWR0aCppLngscz1lLmNsaWVudEhlaWdodCppLnksYT1vKmkueCx1PXIqaS55O3JldHVybnt3aWR0aDpsLGhlaWdodDpzLHg6YSx5OnV9fWZ1bmN0aW9uIGgwKGUsdCxuKXtsZXQgcjtpZih0PT09InZpZXdwb3J0IilyPUZPKGUsbik7ZWxzZSBpZih0PT09ImRvY3VtZW50IilyPXpPKFFyKGUpKTtlbHNlIGlmKFVyKHQpKXI9Qk8odCxuKTtlbHNle2NvbnN0IG89WlMoZSk7cj17Li4udCx4OnQueC1vLngseTp0Lnktby55fX1yZXR1cm4gRGMocil9ZnVuY3Rpb24gZUUoZSx0KXtjb25zdCBuPU5sKGUpO3JldHVybiBuPT09dHx8IVVyKG4pfHxfZChuKT8hMTpGbihuKS5wb3NpdGlvbj09PSJmaXhlZCJ8fGVFKG4sdCl9ZnVuY3Rpb24gV08oZSx0KXtjb25zdCBuPXQuZ2V0KGUpO2lmKG4pcmV0dXJuIG47bGV0IHI9d2EoZSxbXSwhMSkuZmlsdGVyKHM9PlVyKHMpJiZMbyhzKSE9PSJib2R5Iiksbz1udWxsO2NvbnN0IGk9Rm4oZSkucG9zaXRpb249PT0iZml4ZWQiO2xldCBsPWk/TmwoZSk6ZTtmb3IoO1VyKGwpJiYhX2QobCk7KXtjb25zdCBzPUZuKGwpLGE9eG0obCk7IWEmJnMucG9zaXRpb249PT0iZml4ZWQiJiYobz1udWxsKSwoaT8hYSYmIW86IWEmJnMucG9zaXRpb249PT0ic3RhdGljIiYmISFvJiZbImFic29sdXRlIiwiZml4ZWQiXS5pbmNsdWRlcyhvLnBvc2l0aW9uKXx8emEobCkmJiFhJiZlRShlLGwpKT9yPXIuZmlsdGVyKGM9PmMhPT1sKTpvPXMsbD1ObChsKX1yZXR1cm4gdC5zZXQoZSxyKSxyfWZ1bmN0aW9uIFVPKGUpe2xldHtlbGVtZW50OnQsYm91bmRhcnk6bixyb290Qm91bmRhcnk6cixzdHJhdGVneTpvfT1lO2NvbnN0IGw9Wy4uLm49PT0iY2xpcHBpbmdBbmNlc3RvcnMiP1dPKHQsdGhpcy5fYyk6W10uY29uY2F0KG4pLHJdLHM9bFswXSxhPWwucmVkdWNlKCh1LGMpPT57Y29uc3QgZD1oMCh0LGMsbyk7cmV0dXJuIHUudG9wPXluKGQudG9wLHUudG9wKSx1LnJpZ2h0PU1vKGQucmlnaHQsdS5yaWdodCksdS5ib3R0b209TW8oZC5ib3R0b20sdS5ib3R0b20pLHUubGVmdD15bihkLmxlZnQsdS5sZWZ0KSx1fSxoMCh0LHMsbykpO3JldHVybnt3aWR0aDphLnJpZ2h0LWEubGVmdCxoZWlnaHQ6YS5ib3R0b20tYS50b3AseDphLmxlZnQseTphLnRvcH19ZnVuY3Rpb24gVk8oZSl7cmV0dXJuIEpTKGUpfWZ1bmN0aW9uIEhPKGUsdCxuKXtjb25zdCByPXhyKHQpLG89UXIodCksaT1uPT09ImZpeGVkIixsPW1pKGUsITAsaSx0KTtsZXQgcz17c2Nyb2xsTGVmdDowLHNjcm9sbFRvcDowfTtjb25zdCBhPURvKDApO2lmKHJ8fCFyJiYhaSlpZigoTG8odCkhPT0iYm9keSJ8fHphKG8pKSYmKHM9d2QodCkpLHIpe2NvbnN0IHU9bWkodCwhMCxpLHQpO2EueD11LngrdC5jbGllbnRMZWZ0LGEueT11LnkrdC5jbGllbnRUb3B9ZWxzZSBvJiYoYS54PXFTKG8pKTtyZXR1cm57eDpsLmxlZnQrcy5zY3JvbGxMZWZ0LWEueCx5OmwudG9wK3Muc2Nyb2xsVG9wLWEueSx3aWR0aDpsLndpZHRoLGhlaWdodDpsLmhlaWdodH19ZnVuY3Rpb24gcDAoZSx0KXtyZXR1cm4heHIoZSl8fEZuKGUpLnBvc2l0aW9uPT09ImZpeGVkIj9udWxsOnQ/dChlKTplLm9mZnNldFBhcmVudH1mdW5jdGlvbiB0RShlLHQpe2NvbnN0IG49RW4oZSk7aWYoIXhyKGUpKXJldHVybiBuO2xldCByPXAwKGUsdCk7Zm9yKDtyJiZBTyhyKSYmRm4ocikucG9zaXRpb249PT0ic3RhdGljIjspcj1wMChyLHQpO3JldHVybiByJiYoTG8ocik9PT0iaHRtbCJ8fExvKHIpPT09ImJvZHkiJiZGbihyKS5wb3NpdGlvbj09PSJzdGF0aWMiJiYheG0ocikpP246cnx8TU8oZSl8fG59Y29uc3QgS089YXN5bmMgZnVuY3Rpb24oZSl7bGV0e3JlZmVyZW5jZTp0LGZsb2F0aW5nOm4sc3RyYXRlZ3k6cn09ZTtjb25zdCBvPXRoaXMuZ2V0T2Zmc2V0UGFyZW50fHx0RSxpPXRoaXMuZ2V0RGltZW5zaW9ucztyZXR1cm57cmVmZXJlbmNlOkhPKHQsYXdhaXQgbyhuKSxyKSxmbG9hdGluZzp7eDowLHk6MCwuLi5hd2FpdCBpKG4pfX19O2Z1bmN0aW9uIEdPKGUpe3JldHVybiBGbihlKS5kaXJlY3Rpb249PT0icnRsIn1jb25zdCBZTz17Y29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Q6SU8sZ2V0RG9jdW1lbnRFbGVtZW50OlFyLGdldENsaXBwaW5nUmVjdDpVTyxnZXRPZmZzZXRQYXJlbnQ6dEUsZ2V0RWxlbWVudFJlY3RzOktPLGdldENsaWVudFJlY3RzOmpPLGdldERpbWVuc2lvbnM6Vk8sZ2V0U2NhbGU6aGwsaXNFbGVtZW50OlVyLGlzUlRMOkdPfTtmdW5jdGlvbiBYTyhlLHQpe2xldCBuPW51bGwscjtjb25zdCBvPVFyKGUpO2Z1bmN0aW9uIGkoKXtjbGVhclRpbWVvdXQociksbiYmbi5kaXNjb25uZWN0KCksbj1udWxsfWZ1bmN0aW9uIGwocyxhKXtzPT09dm9pZCAwJiYocz0hMSksYT09PXZvaWQgMCYmKGE9MSksaSgpO2NvbnN0e2xlZnQ6dSx0b3A6Yyx3aWR0aDpkLGhlaWdodDpmfT1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2lmKHN8fHQoKSwhZHx8IWYpcmV0dXJuO2NvbnN0IGg9bXUoYyksZz1tdShvLmNsaWVudFdpZHRoLSh1K2QpKSxtPW11KG8uY2xpZW50SGVpZ2h0LShjK2YpKSxTPW11KHUpLHk9e3Jvb3RNYXJnaW46LWgrInB4ICIrLWcrInB4ICIrLW0rInB4ICIrLVMrInB4Iix0aHJlc2hvbGQ6eW4oMCxNbygxLGEpKXx8MX07bGV0IHg9ITA7ZnVuY3Rpb24gXyhFKXtjb25zdCAkPUVbMF0uaW50ZXJzZWN0aW9uUmF0aW87aWYoJCE9PWEpe2lmKCF4KXJldHVybiBsKCk7JD9sKCExLCQpOnI9c2V0VGltZW91dCgoKT0+e2woITEsMWUtNyl9LDEwMCl9eD0hMX10cnl7bj1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoXyx7Li4ueSxyb290Om8ub3duZXJEb2N1bWVudH0pfWNhdGNoe249bmV3IEludGVyc2VjdGlvbk9ic2VydmVyKF8seSl9bi5vYnNlcnZlKGUpfXJldHVybiBsKCEwKSxpfWZ1bmN0aW9uIFFPKGUsdCxuLHIpe3I9PT12b2lkIDAmJihyPXt9KTtjb25zdHthbmNlc3RvclNjcm9sbDpvPSEwLGFuY2VzdG9yUmVzaXplOmk9ITAsZWxlbWVudFJlc2l6ZTpsPXR5cGVvZiBSZXNpemVPYnNlcnZlcj09ImZ1bmN0aW9uIixsYXlvdXRTaGlmdDpzPXR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlcj09ImZ1bmN0aW9uIixhbmltYXRpb25GcmFtZTphPSExfT1yLHU9d20oZSksYz1vfHxpP1suLi51P3dhKHUpOltdLC4uLndhKHQpXTpbXTtjLmZvckVhY2godj0+e28mJnYuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixuLHtwYXNzaXZlOiEwfSksaSYmdi5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLG4pfSk7Y29uc3QgZD11JiZzP1hPKHUsbik6bnVsbDtsZXQgZj0tMSxoPW51bGw7bCYmKGg9bmV3IFJlc2l6ZU9ic2VydmVyKHY9PntsZXRbeV09djt5JiZ5LnRhcmdldD09PXUmJmgmJihoLnVub2JzZXJ2ZSh0KSxjYW5jZWxBbmltYXRpb25GcmFtZShmKSxmPXJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2gmJmgub2JzZXJ2ZSh0KX0pKSxuKCl9KSx1JiYhYSYmaC5vYnNlcnZlKHUpLGgub2JzZXJ2ZSh0KSk7bGV0IGcsbT1hP21pKGUpOm51bGw7YSYmUygpO2Z1bmN0aW9uIFMoKXtjb25zdCB2PW1pKGUpO20mJih2LnghPT1tLnh8fHYueSE9PW0ueXx8di53aWR0aCE9PW0ud2lkdGh8fHYuaGVpZ2h0IT09bS5oZWlnaHQpJiZuKCksbT12LGc9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKFMpfXJldHVybiBuKCksKCk9PntjLmZvckVhY2godj0+e28mJnYucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIixuKSxpJiZ2LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsbil9KSxkJiZkKCksaCYmaC5kaXNjb25uZWN0KCksaD1udWxsLGEmJmNhbmNlbEFuaW1hdGlvbkZyYW1lKGcpfX1jb25zdCBKTz0oZSx0LG4pPT57Y29uc3Qgcj1uZXcgTWFwLG89e3BsYXRmb3JtOllPLC4uLm59LGk9ey4uLm8ucGxhdGZvcm0sX2M6cn07cmV0dXJuICRPKGUsdCx7Li4ubyxwbGF0Zm9ybTppfSl9LFpPPWU9PntmdW5jdGlvbiB0KG4pe3JldHVybnt9Lmhhc093blByb3BlcnR5LmNhbGwobiwiY3VycmVudCIpfXJldHVybntuYW1lOiJhcnJvdyIsb3B0aW9uczplLGZuKG4pe2NvbnN0e2VsZW1lbnQ6cixwYWRkaW5nOm99PXR5cGVvZiBlPT0iZnVuY3Rpb24iP2Uobik6ZTtyZXR1cm4gciYmdChyKT9yLmN1cnJlbnQhPW51bGw/dTAoe2VsZW1lbnQ6ci5jdXJyZW50LHBhZGRpbmc6b30pLmZuKG4pOnt9OnI/dTAoe2VsZW1lbnQ6cixwYWRkaW5nOm99KS5mbihuKTp7fX19fTt2YXIgenU9dHlwZW9mIGRvY3VtZW50PCJ1Ij9wLnVzZUxheW91dEVmZmVjdDpwLnVzZUVmZmVjdDtmdW5jdGlvbiBMYyhlLHQpe2lmKGU9PT10KXJldHVybiEwO2lmKHR5cGVvZiBlIT10eXBlb2YgdClyZXR1cm4hMTtpZih0eXBlb2YgZT09ImZ1bmN0aW9uIiYmZS50b1N0cmluZygpPT09dC50b1N0cmluZygpKXJldHVybiEwO2xldCBuLHIsbztpZihlJiZ0JiZ0eXBlb2YgZT09Im9iamVjdCIpe2lmKEFycmF5LmlzQXJyYXkoZSkpe2lmKG49ZS5sZW5ndGgsbiE9dC5sZW5ndGgpcmV0dXJuITE7Zm9yKHI9bjtyLS0hPT0wOylpZighTGMoZVtyXSx0W3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1pZihvPU9iamVjdC5rZXlzKGUpLG49by5sZW5ndGgsbiE9PU9iamVjdC5rZXlzKHQpLmxlbmd0aClyZXR1cm4hMTtmb3Iocj1uO3ItLSE9PTA7KWlmKCF7fS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsb1tyXSkpcmV0dXJuITE7Zm9yKHI9bjtyLS0hPT0wOyl7Y29uc3QgaT1vW3JdO2lmKCEoaT09PSJfb3duZXIiJiZlLiQkdHlwZW9mKSYmIUxjKGVbaV0sdFtpXSkpcmV0dXJuITF9cmV0dXJuITB9cmV0dXJuIGUhPT1lJiZ0IT09dH1mdW5jdGlvbiBuRShlKXtyZXR1cm4gdHlwZW9mIHdpbmRvdz4idSI/MTooZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx3aW5kb3cpLmRldmljZVBpeGVsUmF0aW98fDF9ZnVuY3Rpb24gZzAoZSx0KXtjb25zdCBuPW5FKGUpO3JldHVybiBNYXRoLnJvdW5kKHQqbikvbn1mdW5jdGlvbiBtMChlKXtjb25zdCB0PXAudXNlUmVmKGUpO3JldHVybiB6dSgoKT0+e3QuY3VycmVudD1lfSksdH1mdW5jdGlvbiBxTyhlKXtlPT09dm9pZCAwJiYoZT17fSk7Y29uc3R7cGxhY2VtZW50OnQ9ImJvdHRvbSIsc3RyYXRlZ3k6bj0iYWJzb2x1dGUiLG1pZGRsZXdhcmU6cj1bXSxwbGF0Zm9ybTpvLGVsZW1lbnRzOntyZWZlcmVuY2U6aSxmbG9hdGluZzpsfT17fSx0cmFuc2Zvcm06cz0hMCx3aGlsZUVsZW1lbnRzTW91bnRlZDphLG9wZW46dX09ZSxbYyxkXT1wLnVzZVN0YXRlKHt4OjAseTowLHN0cmF0ZWd5Om4scGxhY2VtZW50OnQsbWlkZGxld2FyZURhdGE6e30saXNQb3NpdGlvbmVkOiExfSksW2YsaF09cC51c2VTdGF0ZShyKTtMYyhmLHIpfHxoKHIpO2NvbnN0W2csbV09cC51c2VTdGF0ZShudWxsKSxbUyx2XT1wLnVzZVN0YXRlKG51bGwpLHk9cC51c2VDYWxsYmFjayhQPT57UCE9JC5jdXJyZW50JiYoJC5jdXJyZW50PVAsbShQKSl9LFttXSkseD1wLnVzZUNhbGxiYWNrKFA9PntQIT09Qy5jdXJyZW50JiYoQy5jdXJyZW50PVAsdihQKSl9LFt2XSksXz1pfHxnLEU9bHx8UywkPXAudXNlUmVmKG51bGwpLEM9cC51c2VSZWYobnVsbCksVD1wLnVzZVJlZihjKSxNPW0wKGEpLFI9bTAobyksaj1wLnVzZUNhbGxiYWNrKCgpPT57aWYoISQuY3VycmVudHx8IUMuY3VycmVudClyZXR1cm47Y29uc3QgUD17cGxhY2VtZW50OnQsc3RyYXRlZ3k6bixtaWRkbGV3YXJlOmZ9O1IuY3VycmVudCYmKFAucGxhdGZvcm09Ui5jdXJyZW50KSxKTygkLmN1cnJlbnQsQy5jdXJyZW50LFApLnRoZW4oTz0+e2NvbnN0IGs9ey4uLk8saXNQb3NpdGlvbmVkOiEwfTtGLmN1cnJlbnQmJiFMYyhULmN1cnJlbnQsaykmJihULmN1cnJlbnQ9ayxIci5mbHVzaFN5bmMoKCk9PntkKGspfSkpfSl9LFtmLHQsbixSXSk7enUoKCk9Pnt1PT09ITEmJlQuY3VycmVudC5pc1Bvc2l0aW9uZWQmJihULmN1cnJlbnQuaXNQb3NpdGlvbmVkPSExLGQoUD0+KHsuLi5QLGlzUG9zaXRpb25lZDohMX0pKSl9LFt1XSk7Y29uc3QgRj1wLnVzZVJlZighMSk7enUoKCk9PihGLmN1cnJlbnQ9ITAsKCk9PntGLmN1cnJlbnQ9ITF9KSxbXSksenUoKCk9PntpZihfJiYoJC5jdXJyZW50PV8pLEUmJihDLmN1cnJlbnQ9RSksXyYmRSl7aWYoTS5jdXJyZW50KXJldHVybiBNLmN1cnJlbnQoXyxFLGopO2ooKX19LFtfLEUsaixNXSk7Y29uc3QgYWU9cC51c2VNZW1vKCgpPT4oe3JlZmVyZW5jZTokLGZsb2F0aW5nOkMsc2V0UmVmZXJlbmNlOnksc2V0RmxvYXRpbmc6eH0pLFt5LHhdKSxIPXAudXNlTWVtbygoKT0+KHtyZWZlcmVuY2U6XyxmbG9hdGluZzpFfSksW18sRV0pLFg9cC51c2VNZW1vKCgpPT57Y29uc3QgUD17cG9zaXRpb246bixsZWZ0OjAsdG9wOjB9O2lmKCFILmZsb2F0aW5nKXJldHVybiBQO2NvbnN0IE89ZzAoSC5mbG9hdGluZyxjLngpLGs9ZzAoSC5mbG9hdGluZyxjLnkpO3JldHVybiBzP3suLi5QLHRyYW5zZm9ybToidHJhbnNsYXRlKCIrTysicHgsICIraysicHgpIiwuLi5uRShILmZsb2F0aW5nKT49MS41JiZ7d2lsbENoYW5nZToidHJhbnNmb3JtIn19Ontwb3NpdGlvbjpuLGxlZnQ6Tyx0b3A6a319LFtuLHMsSC5mbG9hdGluZyxjLngsYy55XSk7cmV0dXJuIHAudXNlTWVtbygoKT0+KHsuLi5jLHVwZGF0ZTpqLHJlZnM6YWUsZWxlbWVudHM6SCxmbG9hdGluZ1N0eWxlczpYfSksW2MsaixhZSxILFhdKX1mdW5jdGlvbiByRShlKXtjb25zdFt0LG5dPXAudXNlU3RhdGUodm9pZCAwKTtyZXR1cm4gJG4oKCk9PntpZihlKXtuKHt3aWR0aDplLm9mZnNldFdpZHRoLGhlaWdodDplLm9mZnNldEhlaWdodH0pO2NvbnN0IHI9bmV3IFJlc2l6ZU9ic2VydmVyKG89PntpZighQXJyYXkuaXNBcnJheShvKXx8IW8ubGVuZ3RoKXJldHVybjtjb25zdCBpPW9bMF07bGV0IGwscztpZigiYm9yZGVyQm94U2l6ZSJpbiBpKXtjb25zdCBhPWkuYm9yZGVyQm94U2l6ZSx1PUFycmF5LmlzQXJyYXkoYSk/YVswXTphO2w9dS5pbmxpbmVTaXplLHM9dS5ibG9ja1NpemV9ZWxzZSBsPWUub2Zmc2V0V2lkdGgscz1lLm9mZnNldEhlaWdodDtuKHt3aWR0aDpsLGhlaWdodDpzfSl9KTtyZXR1cm4gci5vYnNlcnZlKGUse2JveDoiYm9yZGVyLWJveCJ9KSwoKT0+ci51bm9ic2VydmUoZSl9ZWxzZSBuKHZvaWQgMCl9LFtlXSksdH1jb25zdCBvRT0iUG9wcGVyIixbaUUsbEVdPUNpKG9FKSxbZTUsc0VdPWlFKG9FKSx0NT1lPT57Y29uc3R7X19zY29wZVBvcHBlcjp0LGNoaWxkcmVuOm59PWUsW3Isb109cC51c2VTdGF0ZShudWxsKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KGU1LHtzY29wZTp0LGFuY2hvcjpyLG9uQW5jaG9yQ2hhbmdlOm99LG4pfSxuNT0iUG9wcGVyQW5jaG9yIixyNT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlUG9wcGVyOm4sdmlydHVhbFJlZjpyLC4uLm99PWUsaT1zRShuNSxuKSxsPXAudXNlUmVmKG51bGwpLHM9WGUodCxsKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9PntpLm9uQW5jaG9yQ2hhbmdlKChyPT1udWxsP3ZvaWQgMDpyLmN1cnJlbnQpfHxsLmN1cnJlbnQpfSkscj9udWxsOnAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoe30sbyx7cmVmOnN9KSl9KSxhRT0iUG9wcGVyQ29udGVudCIsW281LGc0XT1pRShhRSksaTU9cC5mb3J3YXJkUmVmKChlLHQpPT57dmFyIG4scixvLGksbCxzLGEsdTtjb25zdHtfX3Njb3BlUG9wcGVyOmMsc2lkZTpkPSJib3R0b20iLHNpZGVPZmZzZXQ6Zj0wLGFsaWduOmg9ImNlbnRlciIsYWxpZ25PZmZzZXQ6Zz0wLGFycm93UGFkZGluZzptPTAsYXZvaWRDb2xsaXNpb25zOlM9ITAsY29sbGlzaW9uQm91bmRhcnk6dj1bXSxjb2xsaXNpb25QYWRkaW5nOnk9MCxzdGlja3k6eD0icGFydGlhbCIsaGlkZVdoZW5EZXRhY2hlZDpfPSExLHVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3k6RT0ib3B0aW1pemVkIixvblBsYWNlZDokLC4uLkN9PWUsVD1zRShhRSxjKSxbTSxSXT1wLnVzZVN0YXRlKG51bGwpLGo9WGUodCxzbj0+UihzbikpLFtGLGFlXT1wLnVzZVN0YXRlKG51bGwpLEg9ckUoRiksWD0obj1IPT1udWxsP3ZvaWQgMDpILndpZHRoKSE9PW51bGwmJm4hPT12b2lkIDA/bjowLFA9KHI9SD09bnVsbD92b2lkIDA6SC5oZWlnaHQpIT09bnVsbCYmciE9PXZvaWQgMD9yOjAsTz1kKyhoIT09ImNlbnRlciI/Ii0iK2g6IiIpLGs9dHlwZW9mIHk9PSJudW1iZXIiP3k6e3RvcDowLHJpZ2h0OjAsYm90dG9tOjAsbGVmdDowLC4uLnl9LEk9QXJyYXkuaXNBcnJheSh2KT92Olt2XSxMPUkubGVuZ3RoPjAsVj17cGFkZGluZzprLGJvdW5kYXJ5OkkuZmlsdGVyKGw1KSxhbHRCb3VuZGFyeTpMfSx7cmVmczp0ZSxmbG9hdGluZ1N0eWxlczp5ZSxwbGFjZW1lbnQ6ZmUsaXNQb3NpdGlvbmVkOk9lLG1pZGRsZXdhcmVEYXRhOmJlfT1xTyh7c3RyYXRlZ3k6ImZpeGVkIixwbGFjZW1lbnQ6Tyx3aGlsZUVsZW1lbnRzTW91bnRlZDooLi4uc24pPT5RTyguLi5zbix7YW5pbWF0aW9uRnJhbWU6RT09PSJhbHdheXMifSksZWxlbWVudHM6e3JlZmVyZW5jZTpULmFuY2hvcn0sbWlkZGxld2FyZTpbYk8oe21haW5BeGlzOmYrUCxhbGlnbm1lbnRBeGlzOmd9KSxTJiZSTyh7bWFpbkF4aXM6ITAsY3Jvc3NBeGlzOiExLGxpbWl0ZXI6eD09PSJwYXJ0aWFsIj9QTygpOnZvaWQgMCwuLi5WfSksUyYma08oey4uLlZ9KSxPTyh7Li4uVixhcHBseTooe2VsZW1lbnRzOnNuLHJlY3RzOmJuLGF2YWlsYWJsZVdpZHRoOlRlLGF2YWlsYWJsZUhlaWdodDpmdH0pPT57Y29uc3R7d2lkdGg6aHQsaGVpZ2h0Ol90fT1ibi5yZWZlcmVuY2UsZ249c24uZmxvYXRpbmcuc3R5bGU7Z24uc2V0UHJvcGVydHkoIi0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS13aWR0aCIsYCR7VGV9cHhgKSxnbi5zZXRQcm9wZXJ0eSgiLS1yYWRpeC1wb3BwZXItYXZhaWxhYmxlLWhlaWdodCIsYCR7ZnR9cHhgKSxnbi5zZXRQcm9wZXJ0eSgiLS1yYWRpeC1wb3BwZXItYW5jaG9yLXdpZHRoIixgJHtodH1weGApLGduLnNldFByb3BlcnR5KCItLXJhZGl4LXBvcHBlci1hbmNob3ItaGVpZ2h0IixgJHtfdH1weGApfX0pLEYmJlpPKHtlbGVtZW50OkYscGFkZGluZzptfSksczUoe2Fycm93V2lkdGg6WCxhcnJvd0hlaWdodDpQfSksXyYmVE8oe3N0cmF0ZWd5OiJyZWZlcmVuY2VIaWRkZW4iLC4uLlZ9KV19KSxbWixrZV09dUUoZmUpLGNlPVZ0KCQpOyRuKCgpPT57T2UmJihjZT09bnVsbHx8Y2UoKSl9LFtPZSxjZV0pO2NvbnN0IF9lPShvPWJlLmFycm93KT09PW51bGx8fG89PT12b2lkIDA/dm9pZCAwOm8ueCxtZT0oaT1iZS5hcnJvdyk9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLnksJGU9KChsPWJlLmFycm93KT09PW51bGx8fGw9PT12b2lkIDA/dm9pZCAwOmwuY2VudGVyT2Zmc2V0KSE9PTAsW0JlLFB0XT1wLnVzZVN0YXRlKCk7cmV0dXJuICRuKCgpPT57TSYmUHQod2luZG93LmdldENvbXB1dGVkU3R5bGUoTSkuekluZGV4KX0sW01dKSxwLmNyZWF0ZUVsZW1lbnQoImRpdiIse3JlZjp0ZS5zZXRGbG9hdGluZywiZGF0YS1yYWRpeC1wb3BwZXItY29udGVudC13cmFwcGVyIjoiIixzdHlsZTp7Li4ueWUsdHJhbnNmb3JtOk9lP3llLnRyYW5zZm9ybToidHJhbnNsYXRlKDAsIC0yMDAlKSIsbWluV2lkdGg6Im1heC1jb250ZW50Iix6SW5kZXg6QmUsIi0tcmFkaXgtcG9wcGVyLXRyYW5zZm9ybS1vcmlnaW4iOlsocz1iZS50cmFuc2Zvcm1PcmlnaW4pPT09bnVsbHx8cz09PXZvaWQgMD92b2lkIDA6cy54LChhPWJlLnRyYW5zZm9ybU9yaWdpbik9PT1udWxsfHxhPT09dm9pZCAwP3ZvaWQgMDphLnldLmpvaW4oIiAiKX0sZGlyOmUuZGlyfSxwLmNyZWF0ZUVsZW1lbnQobzUse3Njb3BlOmMscGxhY2VkU2lkZTpaLG9uQXJyb3dDaGFuZ2U6YWUsYXJyb3dYOl9lLGFycm93WTptZSxzaG91bGRIaWRlQXJyb3c6JGV9LHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoeyJkYXRhLXNpZGUiOlosImRhdGEtYWxpZ24iOmtlfSxDLHtyZWY6aixzdHlsZTp7Li4uQy5zdHlsZSxhbmltYXRpb246T2U/dm9pZCAwOiJub25lIixvcGFjaXR5Oih1PWJlLmhpZGUpIT09bnVsbCYmdSE9PXZvaWQgMCYmdS5yZWZlcmVuY2VIaWRkZW4/MDp2b2lkIDB9fSkpKSl9KTtmdW5jdGlvbiBsNShlKXtyZXR1cm4gZSE9PW51bGx9Y29uc3QgczU9ZT0+KHtuYW1lOiJ0cmFuc2Zvcm1PcmlnaW4iLG9wdGlvbnM6ZSxmbih0KXt2YXIgbixyLG8saSxsO2NvbnN0e3BsYWNlbWVudDpzLHJlY3RzOmEsbWlkZGxld2FyZURhdGE6dX09dCxkPSgobj11LmFycm93KT09PW51bGx8fG49PT12b2lkIDA/dm9pZCAwOm4uY2VudGVyT2Zmc2V0KSE9PTAsZj1kPzA6ZS5hcnJvd1dpZHRoLGg9ZD8wOmUuYXJyb3dIZWlnaHQsW2csbV09dUUocyksUz17c3RhcnQ6IjAlIixjZW50ZXI6IjUwJSIsZW5kOiIxMDAlIn1bbV0sdj0oKHI9KG89dS5hcnJvdyk9PT1udWxsfHxvPT09dm9pZCAwP3ZvaWQgMDpvLngpIT09bnVsbCYmciE9PXZvaWQgMD9yOjApK2YvMix5PSgoaT0obD11LmFycm93KT09PW51bGx8fGw9PT12b2lkIDA/dm9pZCAwOmwueSkhPT1udWxsJiZpIT09dm9pZCAwP2k6MCkraC8yO2xldCB4PSIiLF89IiI7cmV0dXJuIGc9PT0iYm90dG9tIj8oeD1kP1M6YCR7dn1weGAsXz1gJHstaH1weGApOmc9PT0idG9wIj8oeD1kP1M6YCR7dn1weGAsXz1gJHthLmZsb2F0aW5nLmhlaWdodCtofXB4YCk6Zz09PSJyaWdodCI/KHg9YCR7LWh9cHhgLF89ZD9TOmAke3l9cHhgKTpnPT09ImxlZnQiJiYoeD1gJHthLmZsb2F0aW5nLndpZHRoK2h9cHhgLF89ZD9TOmAke3l9cHhgKSx7ZGF0YTp7eCx5Ol99fX19KTtmdW5jdGlvbiB1RShlKXtjb25zdFt0LG49ImNlbnRlciJdPWUuc3BsaXQoIi0iKTtyZXR1cm5bdCxuXX1jb25zdCBhNT10NSx1NT1yNSxjNT1pNSxkNT1wLmZvcndhcmRSZWYoKGUsdCk9Pnt2YXIgbjtjb25zdHtjb250YWluZXI6cj1nbG9iYWxUaGlzPT1udWxsfHwobj1nbG9iYWxUaGlzLmRvY3VtZW50KT09PW51bGx8fG49PT12b2lkIDA/dm9pZCAwOm4uYm9keSwuLi5vfT1lO3JldHVybiByP0trLmNyZWF0ZVBvcnRhbChwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHt9LG8se3JlZjp0fSkpLHIpOm51bGx9KTtmdW5jdGlvbiBibCh7cHJvcDplLGRlZmF1bHRQcm9wOnQsb25DaGFuZ2U6bj0oKT0+e319KXtjb25zdFtyLG9dPWY1KHtkZWZhdWx0UHJvcDp0LG9uQ2hhbmdlOm59KSxpPWUhPT12b2lkIDAsbD1pP2U6cixzPVZ0KG4pLGE9cC51c2VDYWxsYmFjayh1PT57aWYoaSl7Y29uc3QgZD10eXBlb2YgdT09ImZ1bmN0aW9uIj91KGUpOnU7ZCE9PWUmJnMoZCl9ZWxzZSBvKHUpfSxbaSxlLG8sc10pO3JldHVybltsLGFdfWZ1bmN0aW9uIGY1KHtkZWZhdWx0UHJvcDplLG9uQ2hhbmdlOnR9KXtjb25zdCBuPXAudXNlU3RhdGUoZSksW3JdPW4sbz1wLnVzZVJlZihyKSxpPVZ0KHQpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e28uY3VycmVudCE9PXImJihpKHIpLG8uY3VycmVudD1yKX0sW3IsbyxpXSksbn1mdW5jdGlvbiBjRShlKXtjb25zdCB0PXAudXNlUmVmKHt2YWx1ZTplLHByZXZpb3VzOmV9KTtyZXR1cm4gcC51c2VNZW1vKCgpPT4odC5jdXJyZW50LnZhbHVlIT09ZSYmKHQuY3VycmVudC5wcmV2aW91cz10LmN1cnJlbnQudmFsdWUsdC5jdXJyZW50LnZhbHVlPWUpLHQuY3VycmVudC5wcmV2aW91cyksW2VdKX1jb25zdCBoNT1wLmZvcndhcmRSZWYoKGUsdCk9PnAuY3JlYXRlRWxlbWVudChEZS5zcGFuLGVlKHt9LGUse3JlZjp0LHN0eWxlOntwb3NpdGlvbjoiYWJzb2x1dGUiLGJvcmRlcjowLHdpZHRoOjEsaGVpZ2h0OjEscGFkZGluZzowLG1hcmdpbjotMSxvdmVyZmxvdzoiaGlkZGVuIixjbGlwOiJyZWN0KDAsIDAsIDAsIDApIix3aGl0ZVNwYWNlOiJub3dyYXAiLHdvcmRXcmFwOiJub3JtYWwiLC4uLmUuc3R5bGV9fSkpKTt2YXIgcDU9ZnVuY3Rpb24oZSl7aWYodHlwZW9mIGRvY3VtZW50PiJ1IilyZXR1cm4gbnVsbDt2YXIgdD1BcnJheS5pc0FycmF5KGUpP2VbMF06ZTtyZXR1cm4gdC5vd25lckRvY3VtZW50LmJvZHl9LGppPW5ldyBXZWFrTWFwLHZ1PW5ldyBXZWFrTWFwLHl1PXt9LE5mPTAsZEU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUmJihlLmhvc3R8fGRFKGUucGFyZW50Tm9kZSkpfSxnNT1mdW5jdGlvbihlLHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbihuKXtpZihlLmNvbnRhaW5zKG4pKXJldHVybiBuO3ZhciByPWRFKG4pO3JldHVybiByJiZlLmNvbnRhaW5zKHIpP3I6KGNvbnNvbGUuZXJyb3IoImFyaWEtaGlkZGVuIixuLCJpbiBub3QgY29udGFpbmVkIGluc2lkZSIsZSwiLiBEb2luZyBub3RoaW5nIiksbnVsbCl9KS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuISFufSl9LG01PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWc1KHQsQXJyYXkuaXNBcnJheShlKT9lOltlXSk7eXVbbl18fCh5dVtuXT1uZXcgV2Vha01hcCk7dmFyIGk9eXVbbl0sbD1bXSxzPW5ldyBTZXQsYT1uZXcgU2V0KG8pLHU9ZnVuY3Rpb24oZCl7IWR8fHMuaGFzKGQpfHwocy5hZGQoZCksdShkLnBhcmVudE5vZGUpKX07by5mb3JFYWNoKHUpO3ZhciBjPWZ1bmN0aW9uKGQpeyFkfHxhLmhhcyhkKXx8QXJyYXkucHJvdG90eXBlLmZvckVhY2guY2FsbChkLmNoaWxkcmVuLGZ1bmN0aW9uKGYpe2lmKHMuaGFzKGYpKWMoZik7ZWxzZXt2YXIgaD1mLmdldEF0dHJpYnV0ZShyKSxnPWghPT1udWxsJiZoIT09ImZhbHNlIixtPShqaS5nZXQoZil8fDApKzEsUz0oaS5nZXQoZil8fDApKzE7amkuc2V0KGYsbSksaS5zZXQoZixTKSxsLnB1c2goZiksbT09PTEmJmcmJnZ1LnNldChmLCEwKSxTPT09MSYmZi5zZXRBdHRyaWJ1dGUobiwidHJ1ZSIpLGd8fGYuc2V0QXR0cmlidXRlKHIsInRydWUiKX19KX07cmV0dXJuIGModCkscy5jbGVhcigpLE5mKyssZnVuY3Rpb24oKXtsLmZvckVhY2goZnVuY3Rpb24oZCl7dmFyIGY9amkuZ2V0KGQpLTEsaD1pLmdldChkKS0xO2ppLnNldChkLGYpLGkuc2V0KGQsaCksZnx8KHZ1LmhhcyhkKXx8ZC5yZW1vdmVBdHRyaWJ1dGUociksdnUuZGVsZXRlKGQpKSxofHxkLnJlbW92ZUF0dHJpYnV0ZShuKX0pLE5mLS0sTmZ8fChqaT1uZXcgV2Vha01hcCxqaT1uZXcgV2Vha01hcCx2dT1uZXcgV2Vha01hcCx5dT17fSl9fSx2NT1mdW5jdGlvbihlLHQsbil7bj09PXZvaWQgMCYmKG49ImRhdGEtYXJpYS1oaWRkZW4iKTt2YXIgcj1BcnJheS5mcm9tKEFycmF5LmlzQXJyYXkoZSk/ZTpbZV0pLG89dHx8cDUoZSk7cmV0dXJuIG8/KHIucHVzaC5hcHBseShyLEFycmF5LmZyb20oby5xdWVyeVNlbGVjdG9yQWxsKCJbYXJpYS1saXZlXSIpKSksbTUocixvLG4sImFyaWEtaGlkZGVuIikpOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9fSxjcj1mdW5jdGlvbigpe3JldHVybiBjcj1PYmplY3QuYXNzaWdufHxmdW5jdGlvbih0KXtmb3IodmFyIG4scj0xLG89YXJndW1lbnRzLmxlbmd0aDtyPG87cisrKXtuPWFyZ3VtZW50c1tyXTtmb3IodmFyIGkgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixpKSYmKHRbaV09bltpXSl9cmV0dXJuIHR9LGNyLmFwcGx5KHRoaXMsYXJndW1lbnRzKX07ZnVuY3Rpb24gZkUoZSx0KXt2YXIgbj17fTtmb3IodmFyIHIgaW4gZSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxyKSYmdC5pbmRleE9mKHIpPDAmJihuW3JdPWVbcl0pO2lmKGUhPW51bGwmJnR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzPT0iZnVuY3Rpb24iKWZvcih2YXIgbz0wLHI9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhlKTtvPHIubGVuZ3RoO28rKyl0LmluZGV4T2YocltvXSk8MCYmT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKGUscltvXSkmJihuW3Jbb11dPWVbcltvXV0pO3JldHVybiBufWZ1bmN0aW9uIHk1KGUsdCxuKXtpZihufHxhcmd1bWVudHMubGVuZ3RoPT09Milmb3IodmFyIHI9MCxvPXQubGVuZ3RoLGk7cjxvO3IrKykoaXx8IShyIGluIHQpKSYmKGl8fChpPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQsMCxyKSksaVtyXT10W3JdKTtyZXR1cm4gZS5jb25jYXQoaXx8QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodCkpfXZhciBGdT0icmlnaHQtc2Nyb2xsLWJhci1wb3NpdGlvbiIsQnU9IndpZHRoLWJlZm9yZS1zY3JvbGwtYmFyIix4NT0id2l0aC1zY3JvbGwtYmFycy1oaWRkZW4iLF81PSItLXJlbW92ZWQtYm9keS1zY3JvbGwtYmFyLXNpemUiO2Z1bmN0aW9uIHc1KGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iP2UodCk6ZSYmKGUuY3VycmVudD10KSxlfWZ1bmN0aW9uIFM1KGUsdCl7dmFyIG49cC51c2VTdGF0ZShmdW5jdGlvbigpe3JldHVybnt2YWx1ZTplLGNhbGxiYWNrOnQsZmFjYWRlOntnZXQgY3VycmVudCgpe3JldHVybiBuLnZhbHVlfSxzZXQgY3VycmVudChyKXt2YXIgbz1uLnZhbHVlO28hPT1yJiYobi52YWx1ZT1yLG4uY2FsbGJhY2socixvKSl9fX19KVswXTtyZXR1cm4gbi5jYWxsYmFjaz10LG4uZmFjYWRlfWZ1bmN0aW9uIEU1KGUsdCl7cmV0dXJuIFM1KHR8fG51bGwsZnVuY3Rpb24obil7cmV0dXJuIGUuZm9yRWFjaChmdW5jdGlvbihyKXtyZXR1cm4gdzUocixuKX0pfSl9ZnVuY3Rpb24gQzUoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gJDUoZSx0KXt0PT09dm9pZCAwJiYodD1DNSk7dmFyIG49W10scj0hMSxvPXtyZWFkOmZ1bmN0aW9uKCl7aWYocil0aHJvdyBuZXcgRXJyb3IoIlNpZGVjYXI6IGNvdWxkIG5vdCBgcmVhZGAgZnJvbSBhbiBgYXNzaWduZWRgIG1lZGl1bS4gYHJlYWRgIGNvdWxkIGJlIHVzZWQgb25seSB3aXRoIGB1c2VNZWRpdW1gLiIpO3JldHVybiBuLmxlbmd0aD9uW24ubGVuZ3RoLTFdOmV9LHVzZU1lZGl1bTpmdW5jdGlvbihpKXt2YXIgbD10KGkscik7cmV0dXJuIG4ucHVzaChsKSxmdW5jdGlvbigpe249bi5maWx0ZXIoZnVuY3Rpb24ocyl7cmV0dXJuIHMhPT1sfSl9fSxhc3NpZ25TeW5jTWVkaXVtOmZ1bmN0aW9uKGkpe2ZvcihyPSEwO24ubGVuZ3RoOyl7dmFyIGw9bjtuPVtdLGwuZm9yRWFjaChpKX1uPXtwdXNoOmZ1bmN0aW9uKHMpe3JldHVybiBpKHMpfSxmaWx0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbn19fSxhc3NpZ25NZWRpdW06ZnVuY3Rpb24oaSl7cj0hMDt2YXIgbD1bXTtpZihuLmxlbmd0aCl7dmFyIHM9bjtuPVtdLHMuZm9yRWFjaChpKSxsPW59dmFyIGE9ZnVuY3Rpb24oKXt2YXIgYz1sO2w9W10sYy5mb3JFYWNoKGkpfSx1PWZ1bmN0aW9uKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oYSl9O3UoKSxuPXtwdXNoOmZ1bmN0aW9uKGMpe2wucHVzaChjKSx1KCl9LGZpbHRlcjpmdW5jdGlvbihjKXtyZXR1cm4gbD1sLmZpbHRlcihjKSxufX19fTtyZXR1cm4gb31mdW5jdGlvbiBrNShlKXtlPT09dm9pZCAwJiYoZT17fSk7dmFyIHQ9JDUobnVsbCk7cmV0dXJuIHQub3B0aW9ucz1jcih7YXN5bmM6ITAsc3NyOiExfSxlKSx0fXZhciBoRT1mdW5jdGlvbihlKXt2YXIgdD1lLnNpZGVDYXIsbj1mRShlLFsic2lkZUNhciJdKTtpZighdCl0aHJvdyBuZXcgRXJyb3IoIlNpZGVjYXI6IHBsZWFzZSBwcm92aWRlIGBzaWRlQ2FyYCBwcm9wZXJ0eSB0byBpbXBvcnQgdGhlIHJpZ2h0IGNhciIpO3ZhciByPXQucmVhZCgpO2lmKCFyKXRocm93IG5ldyBFcnJvcigiU2lkZWNhciBtZWRpdW0gbm90IGZvdW5kIik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChyLGNyKHt9LG4pKX07aEUuaXNTaWRlQ2FyRXhwb3J0PSEwO2Z1bmN0aW9uIFQ1KGUsdCl7cmV0dXJuIGUudXNlTWVkaXVtKHQpLGhFfXZhciBwRT1rNSgpLGJmPWZ1bmN0aW9uKCl7fSxTZD1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXt2YXIgbj1wLnVzZVJlZihudWxsKSxyPXAudXNlU3RhdGUoe29uU2Nyb2xsQ2FwdHVyZTpiZixvbldoZWVsQ2FwdHVyZTpiZixvblRvdWNoTW92ZUNhcHR1cmU6YmZ9KSxvPXJbMF0saT1yWzFdLGw9ZS5mb3J3YXJkUHJvcHMscz1lLmNoaWxkcmVuLGE9ZS5jbGFzc05hbWUsdT1lLnJlbW92ZVNjcm9sbEJhcixjPWUuZW5hYmxlZCxkPWUuc2hhcmRzLGY9ZS5zaWRlQ2FyLGg9ZS5ub0lzb2xhdGlvbixnPWUuaW5lcnQsbT1lLmFsbG93UGluY2hab29tLFM9ZS5hcyx2PVM9PT12b2lkIDA/ImRpdiI6Uyx5PWZFKGUsWyJmb3J3YXJkUHJvcHMiLCJjaGlsZHJlbiIsImNsYXNzTmFtZSIsInJlbW92ZVNjcm9sbEJhciIsImVuYWJsZWQiLCJzaGFyZHMiLCJzaWRlQ2FyIiwibm9Jc29sYXRpb24iLCJpbmVydCIsImFsbG93UGluY2hab29tIiwiYXMiXSkseD1mLF89RTUoW24sdF0pLEU9Y3IoY3Ioe30seSksbyk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwsYyYmcC5jcmVhdGVFbGVtZW50KHgse3NpZGVDYXI6cEUscmVtb3ZlU2Nyb2xsQmFyOnUsc2hhcmRzOmQsbm9Jc29sYXRpb246aCxpbmVydDpnLHNldENhbGxiYWNrczppLGFsbG93UGluY2hab29tOiEhbSxsb2NrUmVmOm59KSxsP3AuY2xvbmVFbGVtZW50KHAuQ2hpbGRyZW4ub25seShzKSxjcihjcih7fSxFKSx7cmVmOl99KSk6cC5jcmVhdGVFbGVtZW50KHYsY3Ioe30sRSx7Y2xhc3NOYW1lOmEscmVmOl99KSxzKSl9KTtTZC5kZWZhdWx0UHJvcHM9e2VuYWJsZWQ6ITAscmVtb3ZlU2Nyb2xsQmFyOiEwLGluZXJ0OiExfTtTZC5jbGFzc05hbWVzPXtmdWxsV2lkdGg6QnUsemVyb1JpZ2h0OkZ1fTt2YXIgdjAsTjU9ZnVuY3Rpb24oKXtpZih2MClyZXR1cm4gdjA7aWYodHlwZW9mIF9fd2VicGFja19ub25jZV9fPCJ1IilyZXR1cm4gX193ZWJwYWNrX25vbmNlX199O2Z1bmN0aW9uIGI1KCl7aWYoIWRvY3VtZW50KXJldHVybiBudWxsO3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7ZS50eXBlPSJ0ZXh0L2NzcyI7dmFyIHQ9TjUoKTtyZXR1cm4gdCYmZS5zZXRBdHRyaWJ1dGUoIm5vbmNlIix0KSxlfWZ1bmN0aW9uIFI1KGUsdCl7ZS5zdHlsZVNoZWV0P2Uuc3R5bGVTaGVldC5jc3NUZXh0PXQ6ZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0KSl9ZnVuY3Rpb24gUDUoZSl7dmFyIHQ9ZG9jdW1lbnQuaGVhZHx8ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTt0LmFwcGVuZENoaWxkKGUpfXZhciBPNT1mdW5jdGlvbigpe3ZhciBlPTAsdD1udWxsO3JldHVybnthZGQ6ZnVuY3Rpb24obil7ZT09MCYmKHQ9YjUoKSkmJihSNSh0LG4pLFA1KHQpKSxlKyt9LHJlbW92ZTpmdW5jdGlvbigpe2UtLSwhZSYmdCYmKHQucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbCl9fX0sQTU9ZnVuY3Rpb24oKXt2YXIgZT1PNSgpO3JldHVybiBmdW5jdGlvbih0LG4pe3AudXNlRWZmZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIGUuYWRkKHQpLGZ1bmN0aW9uKCl7ZS5yZW1vdmUoKX19LFt0JiZuXSl9fSxnRT1mdW5jdGlvbigpe3ZhciBlPUE1KCksdD1mdW5jdGlvbihuKXt2YXIgcj1uLnN0eWxlcyxvPW4uZHluYW1pYztyZXR1cm4gZShyLG8pLG51bGx9O3JldHVybiB0fSxNNT17bGVmdDowLHRvcDowLHJpZ2h0OjAsZ2FwOjB9LFJmPWZ1bmN0aW9uKGUpe3JldHVybiBwYXJzZUludChlfHwiIiwxMCl8fDB9LEQ1PWZ1bmN0aW9uKGUpe3ZhciB0PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGRvY3VtZW50LmJvZHkpLG49dFtlPT09InBhZGRpbmciPyJwYWRkaW5nTGVmdCI6Im1hcmdpbkxlZnQiXSxyPXRbZT09PSJwYWRkaW5nIj8icGFkZGluZ1RvcCI6Im1hcmdpblRvcCJdLG89dFtlPT09InBhZGRpbmciPyJwYWRkaW5nUmlnaHQiOiJtYXJnaW5SaWdodCJdO3JldHVybltSZihuKSxSZihyKSxSZihvKV19LEw1PWZ1bmN0aW9uKGUpe2lmKGU9PT12b2lkIDAmJihlPSJtYXJnaW4iKSx0eXBlb2Ygd2luZG93PiJ1IilyZXR1cm4gTTU7dmFyIHQ9RDUoZSksbj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgscj13aW5kb3cuaW5uZXJXaWR0aDtyZXR1cm57bGVmdDp0WzBdLHRvcDp0WzFdLHJpZ2h0OnRbMl0sZ2FwOk1hdGgubWF4KDAsci1uK3RbMl0tdFswXSl9fSxJNT1nRSgpLGo1PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWUubGVmdCxpPWUudG9wLGw9ZS5yaWdodCxzPWUuZ2FwO3JldHVybiBuPT09dm9pZCAwJiYobj0ibWFyZ2luIiksYAogIC5gLmNvbmNhdCh4NSxgIHsKICAgb3ZlcmZsb3c6IGhpZGRlbiBgKS5jb25jYXQocixgOwogICBwYWRkaW5nLXJpZ2h0OiBgKS5jb25jYXQocywicHggIikuY29uY2F0KHIsYDsKICB9CiAgYm9keSB7CiAgICBvdmVyZmxvdzogaGlkZGVuIGApLmNvbmNhdChyLGA7CiAgICBvdmVyc2Nyb2xsLWJlaGF2aW9yOiBjb250YWluOwogICAgYCkuY29uY2F0KFt0JiYicG9zaXRpb246IHJlbGF0aXZlICIuY29uY2F0KHIsIjsiKSxuPT09Im1hcmdpbiImJmAKICAgIHBhZGRpbmctbGVmdDogYC5jb25jYXQobyxgcHg7CiAgICBwYWRkaW5nLXRvcDogYCkuY29uY2F0KGksYHB4OwogICAgcGFkZGluZy1yaWdodDogYCkuY29uY2F0KGwsYHB4OwogICAgbWFyZ2luLWxlZnQ6MDsKICAgIG1hcmdpbi10b3A6MDsKICAgIG1hcmdpbi1yaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgICBgKSxuPT09InBhZGRpbmciJiYicGFkZGluZy1yaWdodDogIi5jb25jYXQocywicHggIikuY29uY2F0KHIsIjsiKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oIiIpLGAKICB9CiAgCiAgLmApLmNvbmNhdChGdSxgIHsKICAgIHJpZ2h0OiBgKS5jb25jYXQocywicHggIikuY29uY2F0KHIsYDsKICB9CiAgCiAgLmApLmNvbmNhdChCdSxgIHsKICAgIG1hcmdpbi1yaWdodDogYCkuY29uY2F0KHMsInB4ICIpLmNvbmNhdChyLGA7CiAgfQogIAogIC5gKS5jb25jYXQoRnUsIiAuIikuY29uY2F0KEZ1LGAgewogICAgcmlnaHQ6IDAgYCkuY29uY2F0KHIsYDsKICB9CiAgCiAgLmApLmNvbmNhdChCdSwiIC4iKS5jb25jYXQoQnUsYCB7CiAgICBtYXJnaW4tcmlnaHQ6IDAgYCkuY29uY2F0KHIsYDsKICB9CiAgCiAgYm9keSB7CiAgICBgKS5jb25jYXQoXzUsIjogIikuY29uY2F0KHMsYHB4OwogIH0KYCl9LHo1PWZ1bmN0aW9uKGUpe3ZhciB0PWUubm9SZWxhdGl2ZSxuPWUubm9JbXBvcnRhbnQscj1lLmdhcE1vZGUsbz1yPT09dm9pZCAwPyJtYXJnaW4iOnIsaT1wLnVzZU1lbW8oZnVuY3Rpb24oKXtyZXR1cm4gTDUobyl9LFtvXSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChJNSx7c3R5bGVzOmo1KGksIXQsbyxuPyIiOiIhaW1wb3J0YW50Iil9KX0sX3A9ITE7aWYodHlwZW9mIHdpbmRvdzwidSIpdHJ5e3ZhciB4dT1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gX3A9ITAsITB9fSk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLHh1LHh1KSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIseHUseHUpfWNhdGNoe19wPSExfXZhciB6aT1fcD97cGFzc2l2ZTohMX06ITEsRjU9ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnTmFtZT09PSJURVhUQVJFQSJ9LG1FPWZ1bmN0aW9uKGUsdCl7dmFyIG49d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSk7cmV0dXJuIG5bdF0hPT0iaGlkZGVuIiYmIShuLm92ZXJmbG93WT09PW4ub3ZlcmZsb3dYJiYhRjUoZSkmJm5bdF09PT0idmlzaWJsZSIpfSxCNT1mdW5jdGlvbihlKXtyZXR1cm4gbUUoZSwib3ZlcmZsb3dZIil9LFc1PWZ1bmN0aW9uKGUpe3JldHVybiBtRShlLCJvdmVyZmxvd1giKX0seTA9ZnVuY3Rpb24oZSx0KXt2YXIgbj10O2Rve3R5cGVvZiBTaGFkb3dSb290PCJ1IiYmbiBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QmJihuPW4uaG9zdCk7dmFyIHI9dkUoZSxuKTtpZihyKXt2YXIgbz15RShlLG4pLGk9b1sxXSxsPW9bMl07aWYoaT5sKXJldHVybiEwfW49bi5wYXJlbnROb2RlfXdoaWxlKG4mJm4hPT1kb2N1bWVudC5ib2R5KTtyZXR1cm4hMX0sVTU9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zY3JvbGxUb3Asbj1lLnNjcm9sbEhlaWdodCxyPWUuY2xpZW50SGVpZ2h0O3JldHVyblt0LG4scl19LFY1PWZ1bmN0aW9uKGUpe3ZhciB0PWUuc2Nyb2xsTGVmdCxuPWUuc2Nyb2xsV2lkdGgscj1lLmNsaWVudFdpZHRoO3JldHVyblt0LG4scl19LHZFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT0idiI/QjUodCk6VzUodCl9LHlFPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT0idiI/VTUodCk6VjUodCl9LEg1PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT0iaCImJnQ9PT0icnRsIj8tMToxfSxLNT1mdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpPUg1KGUsd2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuZGlyZWN0aW9uKSxsPWkqcixzPW4udGFyZ2V0LGE9dC5jb250YWlucyhzKSx1PSExLGM9bD4wLGQ9MCxmPTA7ZG97dmFyIGg9eUUoZSxzKSxnPWhbMF0sbT1oWzFdLFM9aFsyXSx2PW0tUy1pKmc7KGd8fHYpJiZ2RShlLHMpJiYoZCs9dixmKz1nKSxzPXMucGFyZW50Tm9kZX13aGlsZSghYSYmcyE9PWRvY3VtZW50LmJvZHl8fGEmJih0LmNvbnRhaW5zKHMpfHx0PT09cykpO3JldHVybihjJiYobyYmZD09PTB8fCFvJiZsPmQpfHwhYyYmKG8mJmY9PT0wfHwhbyYmLWw+ZikpJiYodT0hMCksdX0sX3U9ZnVuY3Rpb24oZSl7cmV0dXJuImNoYW5nZWRUb3VjaGVzImluIGU/W2UuY2hhbmdlZFRvdWNoZXNbMF0uY2xpZW50WCxlLmNoYW5nZWRUb3VjaGVzWzBdLmNsaWVudFldOlswLDBdfSx4MD1mdW5jdGlvbihlKXtyZXR1cm5bZS5kZWx0YVgsZS5kZWx0YVldfSxfMD1mdW5jdGlvbihlKXtyZXR1cm4gZSYmImN1cnJlbnQiaW4gZT9lLmN1cnJlbnQ6ZX0sRzU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZVswXT09PXRbMF0mJmVbMV09PT10WzFdfSxZNT1mdW5jdGlvbihlKXtyZXR1cm5gCiAgLmJsb2NrLWludGVyYWN0aXZpdHktYC5jb25jYXQoZSxgIHtwb2ludGVyLWV2ZW50czogbm9uZTt9CiAgLmFsbG93LWludGVyYWN0aXZpdHktYCkuY29uY2F0KGUsYCB7cG9pbnRlci1ldmVudHM6IGFsbDt9CmApfSxYNT0wLEZpPVtdO2Z1bmN0aW9uIFE1KGUpe3ZhciB0PXAudXNlUmVmKFtdKSxuPXAudXNlUmVmKFswLDBdKSxyPXAudXNlUmVmKCksbz1wLnVzZVN0YXRlKFg1KyspWzBdLGk9cC51c2VTdGF0ZShmdW5jdGlvbigpe3JldHVybiBnRSgpfSlbMF0sbD1wLnVzZVJlZihlKTtwLnVzZUVmZmVjdChmdW5jdGlvbigpe2wuY3VycmVudD1lfSxbZV0pLHAudXNlRWZmZWN0KGZ1bmN0aW9uKCl7aWYoZS5pbmVydCl7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCJibG9jay1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KG8pKTt2YXIgbT15NShbZS5sb2NrUmVmLmN1cnJlbnRdLChlLnNoYXJkc3x8W10pLm1hcChfMCksITApLmZpbHRlcihCb29sZWFuKTtyZXR1cm4gbS5mb3JFYWNoKGZ1bmN0aW9uKFMpe3JldHVybiBTLmNsYXNzTGlzdC5hZGQoImFsbG93LWludGVyYWN0aXZpdHktIi5jb25jYXQobykpfSksZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoImJsb2NrLWludGVyYWN0aXZpdHktIi5jb25jYXQobykpLG0uZm9yRWFjaChmdW5jdGlvbihTKXtyZXR1cm4gUy5jbGFzc0xpc3QucmVtb3ZlKCJhbGxvdy1pbnRlcmFjdGl2aXR5LSIuY29uY2F0KG8pKX0pfX19LFtlLmluZXJ0LGUubG9ja1JlZi5jdXJyZW50LGUuc2hhcmRzXSk7dmFyIHM9cC51c2VDYWxsYmFjayhmdW5jdGlvbihtLFMpe2lmKCJ0b3VjaGVzImluIG0mJm0udG91Y2hlcy5sZW5ndGg9PT0yKXJldHVybiFsLmN1cnJlbnQuYWxsb3dQaW5jaFpvb207dmFyIHY9X3UobSkseT1uLmN1cnJlbnQseD0iZGVsdGFYImluIG0/bS5kZWx0YVg6eVswXS12WzBdLF89ImRlbHRhWSJpbiBtP20uZGVsdGFZOnlbMV0tdlsxXSxFLCQ9bS50YXJnZXQsQz1NYXRoLmFicyh4KT5NYXRoLmFicyhfKT8iaCI6InYiO2lmKCJ0b3VjaGVzImluIG0mJkM9PT0iaCImJiQudHlwZT09PSJyYW5nZSIpcmV0dXJuITE7dmFyIFQ9eTAoQywkKTtpZighVClyZXR1cm4hMDtpZihUP0U9QzooRT1DPT09InYiPyJoIjoidiIsVD15MChDLCQpKSwhVClyZXR1cm4hMTtpZighci5jdXJyZW50JiYiY2hhbmdlZFRvdWNoZXMiaW4gbSYmKHh8fF8pJiYoci5jdXJyZW50PUUpLCFFKXJldHVybiEwO3ZhciBNPXIuY3VycmVudHx8RTtyZXR1cm4gSzUoTSxTLG0sTT09PSJoIj94Ol8sITApfSxbXSksYT1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKG0pe3ZhciBTPW07aWYoISghRmkubGVuZ3RofHxGaVtGaS5sZW5ndGgtMV0hPT1pKSl7dmFyIHY9ImRlbHRhWSJpbiBTP3gwKFMpOl91KFMpLHk9dC5jdXJyZW50LmZpbHRlcihmdW5jdGlvbihFKXtyZXR1cm4gRS5uYW1lPT09Uy50eXBlJiZFLnRhcmdldD09PVMudGFyZ2V0JiZHNShFLmRlbHRhLHYpfSlbMF07aWYoeSYmeS5zaG91bGQpe1MuY2FuY2VsYWJsZSYmUy5wcmV2ZW50RGVmYXVsdCgpO3JldHVybn1pZigheSl7dmFyIHg9KGwuY3VycmVudC5zaGFyZHN8fFtdKS5tYXAoXzApLmZpbHRlcihCb29sZWFuKS5maWx0ZXIoZnVuY3Rpb24oRSl7cmV0dXJuIEUuY29udGFpbnMoUy50YXJnZXQpfSksXz14Lmxlbmd0aD4wP3MoUyx4WzBdKTohbC5jdXJyZW50Lm5vSXNvbGF0aW9uO18mJlMuY2FuY2VsYWJsZSYmUy5wcmV2ZW50RGVmYXVsdCgpfX19LFtdKSx1PXAudXNlQ2FsbGJhY2soZnVuY3Rpb24obSxTLHYseSl7dmFyIHg9e25hbWU6bSxkZWx0YTpTLHRhcmdldDp2LHNob3VsZDp5fTt0LmN1cnJlbnQucHVzaCh4KSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5jdXJyZW50PXQuY3VycmVudC5maWx0ZXIoZnVuY3Rpb24oXyl7cmV0dXJuIF8hPT14fSl9LDEpfSxbXSksYz1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKG0pe24uY3VycmVudD1fdShtKSxyLmN1cnJlbnQ9dm9pZCAwfSxbXSksZD1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKG0pe3UobS50eXBlLHgwKG0pLG0udGFyZ2V0LHMobSxlLmxvY2tSZWYuY3VycmVudCkpfSxbXSksZj1wLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKG0pe3UobS50eXBlLF91KG0pLG0udGFyZ2V0LHMobSxlLmxvY2tSZWYuY3VycmVudCkpfSxbXSk7cC51c2VFZmZlY3QoZnVuY3Rpb24oKXtyZXR1cm4gRmkucHVzaChpKSxlLnNldENhbGxiYWNrcyh7b25TY3JvbGxDYXB0dXJlOmQsb25XaGVlbENhcHR1cmU6ZCxvblRvdWNoTW92ZUNhcHR1cmU6Zn0pLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIndoZWVsIixhLHppKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGEsemkpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGMsemkpLGZ1bmN0aW9uKCl7Rmk9RmkuZmlsdGVyKGZ1bmN0aW9uKG0pe3JldHVybiBtIT09aX0pLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIndoZWVsIixhLHppKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGEsemkpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLGMsemkpfX0sW10pO3ZhciBoPWUucmVtb3ZlU2Nyb2xsQmFyLGc9ZS5pbmVydDtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxnP3AuY3JlYXRlRWxlbWVudChpLHtzdHlsZXM6WTUobyl9KTpudWxsLGg/cC5jcmVhdGVFbGVtZW50KHo1LHtnYXBNb2RlOiJtYXJnaW4ifSk6bnVsbCl9Y29uc3QgSjU9VDUocEUsUTUpO3ZhciB4RT1wLmZvcndhcmRSZWYoZnVuY3Rpb24oZSx0KXtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KFNkLGNyKHt9LGUse3JlZjp0LHNpZGVDYXI6SjV9KSl9KTt4RS5jbGFzc05hbWVzPVNkLmNsYXNzTmFtZXM7Y29uc3QgWjU9eEUscTU9WyIgIiwiRW50ZXIiLCJBcnJvd1VwIiwiQXJyb3dEb3duIl0sZUE9WyIgIiwiRW50ZXIiXSxFZD0iU2VsZWN0IixbQ2QsU20sdEFdPUhTKEVkKSxbUWwsbTRdPUNpKEVkLFt0QSxsRV0pLEVtPWxFKCksW25BLGJpXT1RbChFZCksW3JBLG9BXT1RbChFZCksaUE9ZT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6dCxjaGlsZHJlbjpuLG9wZW46cixkZWZhdWx0T3BlbjpvLG9uT3BlbkNoYW5nZTppLHZhbHVlOmwsZGVmYXVsdFZhbHVlOnMsb25WYWx1ZUNoYW5nZTphLGRpcjp1LG5hbWU6YyxhdXRvQ29tcGxldGU6ZCxkaXNhYmxlZDpmLHJlcXVpcmVkOmh9PWUsZz1FbSh0KSxbbSxTXT1wLnVzZVN0YXRlKG51bGwpLFt2LHldPXAudXNlU3RhdGUobnVsbCksW3gsX109cC51c2VTdGF0ZSghMSksRT1UZyh1KSxbJD0hMSxDXT1ibCh7cHJvcDpyLGRlZmF1bHRQcm9wOm8sb25DaGFuZ2U6aX0pLFtULE1dPWJsKHtwcm9wOmwsZGVmYXVsdFByb3A6cyxvbkNoYW5nZTphfSksUj1wLnVzZVJlZihudWxsKSxqPW0/ISFtLmNsb3Nlc3QoImZvcm0iKTohMCxbRixhZV09cC51c2VTdGF0ZShuZXcgU2V0KSxIPUFycmF5LmZyb20oRikubWFwKFg9PlgucHJvcHMudmFsdWUpLmpvaW4oIjsiKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KGE1LGcscC5jcmVhdGVFbGVtZW50KG5BLHtyZXF1aXJlZDpoLHNjb3BlOnQsdHJpZ2dlcjptLG9uVHJpZ2dlckNoYW5nZTpTLHZhbHVlTm9kZTp2LG9uVmFsdWVOb2RlQ2hhbmdlOnksdmFsdWVOb2RlSGFzQ2hpbGRyZW46eCxvblZhbHVlTm9kZUhhc0NoaWxkcmVuQ2hhbmdlOl8sY29udGVudElkOnhkKCksdmFsdWU6VCxvblZhbHVlQ2hhbmdlOk0sb3BlbjokLG9uT3BlbkNoYW5nZTpDLGRpcjpFLHRyaWdnZXJQb2ludGVyRG93blBvc1JlZjpSLGRpc2FibGVkOmZ9LHAuY3JlYXRlRWxlbWVudChDZC5Qcm92aWRlcix7c2NvcGU6dH0scC5jcmVhdGVFbGVtZW50KHJBLHtzY29wZTplLl9fc2NvcGVTZWxlY3Qsb25OYXRpdmVPcHRpb25BZGQ6cC51c2VDYWxsYmFjayhYPT57YWUoUD0+bmV3IFNldChQKS5hZGQoWCkpfSxbXSksb25OYXRpdmVPcHRpb25SZW1vdmU6cC51c2VDYWxsYmFjayhYPT57YWUoUD0+e2NvbnN0IE89bmV3IFNldChQKTtyZXR1cm4gTy5kZWxldGUoWCksT30pfSxbXSl9LG4pKSxqP3AuY3JlYXRlRWxlbWVudChFRSx7a2V5OkgsImFyaWEtaGlkZGVuIjohMCxyZXF1aXJlZDpoLHRhYkluZGV4Oi0xLG5hbWU6YyxhdXRvQ29tcGxldGU6ZCx2YWx1ZTpULG9uQ2hhbmdlOlg9Pk0oWC50YXJnZXQudmFsdWUpLGRpc2FibGVkOmZ9LFQ9PT12b2lkIDA/cC5jcmVhdGVFbGVtZW50KCJvcHRpb24iLHt2YWx1ZToiIn0pOm51bGwsQXJyYXkuZnJvbShGKSk6bnVsbCkpfSxsQT0iU2VsZWN0VHJpZ2dlciIsc0E9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLGRpc2FibGVkOnI9ITEsLi4ub309ZSxpPUVtKG4pLGw9YmkobEEsbikscz1sLmRpc2FibGVkfHxyLGE9WGUodCxsLm9uVHJpZ2dlckNoYW5nZSksdT1TbShuKSxbYyxkLGZdPUNFKGc9Pntjb25zdCBtPXUoKS5maWx0ZXIoeT0+IXkuZGlzYWJsZWQpLFM9bS5maW5kKHk9PnkudmFsdWU9PT1sLnZhbHVlKSx2PSRFKG0sZyxTKTt2IT09dm9pZCAwJiZsLm9uVmFsdWVDaGFuZ2Uodi52YWx1ZSl9KSxoPSgpPT57c3x8KGwub25PcGVuQ2hhbmdlKCEwKSxmKCkpfTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHU1LGVlKHthc0NoaWxkOiEwfSxpKSxwLmNyZWF0ZUVsZW1lbnQoRGUuYnV0dG9uLGVlKHt0eXBlOiJidXR0b24iLHJvbGU6ImNvbWJvYm94IiwiYXJpYS1jb250cm9scyI6bC5jb250ZW50SWQsImFyaWEtZXhwYW5kZWQiOmwub3BlbiwiYXJpYS1yZXF1aXJlZCI6bC5yZXF1aXJlZCwiYXJpYS1hdXRvY29tcGxldGUiOiJub25lIixkaXI6bC5kaXIsImRhdGEtc3RhdGUiOmwub3Blbj8ib3BlbiI6ImNsb3NlZCIsZGlzYWJsZWQ6cywiZGF0YS1kaXNhYmxlZCI6cz8iIjp2b2lkIDAsImRhdGEtcGxhY2Vob2xkZXIiOlNFKGwudmFsdWUpPyIiOnZvaWQgMH0sbyx7cmVmOmEsb25DbGljazpIZShvLm9uQ2xpY2ssZz0+e2cuY3VycmVudFRhcmdldC5mb2N1cygpfSksb25Qb2ludGVyRG93bjpIZShvLm9uUG9pbnRlckRvd24sZz0+e2NvbnN0IG09Zy50YXJnZXQ7bS5oYXNQb2ludGVyQ2FwdHVyZShnLnBvaW50ZXJJZCkmJm0ucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGcucG9pbnRlcklkKSxnLmJ1dHRvbj09PTAmJmcuY3RybEtleT09PSExJiYoaCgpLGwudHJpZ2dlclBvaW50ZXJEb3duUG9zUmVmLmN1cnJlbnQ9e3g6TWF0aC5yb3VuZChnLnBhZ2VYKSx5Ok1hdGgucm91bmQoZy5wYWdlWSl9LGcucHJldmVudERlZmF1bHQoKSl9KSxvbktleURvd246SGUoby5vbktleURvd24sZz0+e2NvbnN0IG09Yy5jdXJyZW50IT09IiI7IShnLmN0cmxLZXl8fGcuYWx0S2V5fHxnLm1ldGFLZXkpJiZnLmtleS5sZW5ndGg9PT0xJiZkKGcua2V5KSwhKG0mJmcua2V5PT09IiAiKSYmcTUuaW5jbHVkZXMoZy5rZXkpJiYoaCgpLGcucHJldmVudERlZmF1bHQoKSl9KX0pKSl9KSxhQT0iU2VsZWN0VmFsdWUiLHVBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixjbGFzc05hbWU6cixzdHlsZTpvLGNoaWxkcmVuOmkscGxhY2Vob2xkZXI6bD0iIiwuLi5zfT1lLGE9YmkoYUEsbikse29uVmFsdWVOb2RlSGFzQ2hpbGRyZW5DaGFuZ2U6dX09YSxjPWkhPT12b2lkIDAsZD1YZSh0LGEub25WYWx1ZU5vZGVDaGFuZ2UpO3JldHVybiAkbigoKT0+e3UoYyl9LFt1LGNdKSxwLmNyZWF0ZUVsZW1lbnQoRGUuc3BhbixlZSh7fSxzLHtyZWY6ZCxzdHlsZTp7cG9pbnRlckV2ZW50czoibm9uZSJ9fSksU0UoYS52YWx1ZSk/cC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxsKTppKX0pLGNBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixjaGlsZHJlbjpyLC4uLm99PWU7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChEZS5zcGFuLGVlKHsiYXJpYS1oaWRkZW4iOiEwfSxvLHtyZWY6dH0pLHJ8fCLilrwiKX0pLGRBPWU9PnAuY3JlYXRlRWxlbWVudChkNSxlZSh7YXNDaGlsZDohMH0sZSkpLFJsPSJTZWxlY3RDb250ZW50IixmQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdCBuPWJpKFJsLGUuX19zY29wZVNlbGVjdCksW3Isb109cC51c2VTdGF0ZSgpO2lmKCRuKCgpPT57byhuZXcgRG9jdW1lbnRGcmFnbWVudCl9LFtdKSwhbi5vcGVuKXtjb25zdCBpPXI7cmV0dXJuIGk/SHIuY3JlYXRlUG9ydGFsKHAuY3JlYXRlRWxlbWVudChfRSx7c2NvcGU6ZS5fX3Njb3BlU2VsZWN0fSxwLmNyZWF0ZUVsZW1lbnQoQ2QuU2xvdCx7c2NvcGU6ZS5fX3Njb3BlU2VsZWN0fSxwLmNyZWF0ZUVsZW1lbnQoImRpdiIsbnVsbCxlLmNoaWxkcmVuKSkpLGkpOm51bGx9cmV0dXJuIHAuY3JlYXRlRWxlbWVudChoQSxlZSh7fSxlLHtyZWY6dH0pKX0pLFJyPTEwLFtfRSwkZF09UWwoUmwpLGhBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixwb3NpdGlvbjpyPSJpdGVtLWFsaWduZWQiLG9uQ2xvc2VBdXRvRm9jdXM6byxvbkVzY2FwZUtleURvd246aSxvblBvaW50ZXJEb3duT3V0c2lkZTpsLHNpZGU6cyxzaWRlT2Zmc2V0OmEsYWxpZ246dSxhbGlnbk9mZnNldDpjLGFycm93UGFkZGluZzpkLGNvbGxpc2lvbkJvdW5kYXJ5OmYsY29sbGlzaW9uUGFkZGluZzpoLHN0aWNreTpnLGhpZGVXaGVuRGV0YWNoZWQ6bSxhdm9pZENvbGxpc2lvbnM6UywuLi52fT1lLHk9YmkoUmwsbiksW3gsX109cC51c2VTdGF0ZShudWxsKSxbRSwkXT1wLnVzZVN0YXRlKG51bGwpLEM9WGUodCxaPT5fKFopKSxbVCxNXT1wLnVzZVN0YXRlKG51bGwpLFtSLGpdPXAudXNlU3RhdGUobnVsbCksRj1TbShuKSxbYWUsSF09cC51c2VTdGF0ZSghMSksWD1wLnVzZVJlZighMSk7cC51c2VFZmZlY3QoKCk9PntpZih4KXJldHVybiB2NSh4KX0sW3hdKSxzTygpO2NvbnN0IFA9cC51c2VDYWxsYmFjayhaPT57Y29uc3Rba2UsLi4uY2VdPUYoKS5tYXAoJGU9PiRlLnJlZi5jdXJyZW50KSxbX2VdPWNlLnNsaWNlKC0xKSxtZT1kb2N1bWVudC5hY3RpdmVFbGVtZW50O2Zvcihjb25zdCAkZSBvZiBaKWlmKCRlPT09bWV8fCgkZT09bnVsbHx8JGUuc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJuZWFyZXN0In0pLCRlPT09a2UmJkUmJihFLnNjcm9sbFRvcD0wKSwkZT09PV9lJiZFJiYoRS5zY3JvbGxUb3A9RS5zY3JvbGxIZWlnaHQpLCRlPT1udWxsfHwkZS5mb2N1cygpLGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQhPT1tZSkpcmV0dXJufSxbRixFXSksTz1wLnVzZUNhbGxiYWNrKCgpPT5QKFtULHhdKSxbUCxULHhdKTtwLnVzZUVmZmVjdCgoKT0+e2FlJiZPKCl9LFthZSxPXSk7Y29uc3R7b25PcGVuQ2hhbmdlOmssdHJpZ2dlclBvaW50ZXJEb3duUG9zUmVmOkl9PXk7cC51c2VFZmZlY3QoKCk9PntpZih4KXtsZXQgWj17eDowLHk6MH07Y29uc3Qga2U9X2U9Pnt2YXIgbWUsJGUsQmUsUHQ7Wj17eDpNYXRoLmFicyhNYXRoLnJvdW5kKF9lLnBhZ2VYKS0oKG1lPSgkZT1JLmN1cnJlbnQpPT09bnVsbHx8JGU9PT12b2lkIDA/dm9pZCAwOiRlLngpIT09bnVsbCYmbWUhPT12b2lkIDA/bWU6MCkpLHk6TWF0aC5hYnMoTWF0aC5yb3VuZChfZS5wYWdlWSktKChCZT0oUHQ9SS5jdXJyZW50KT09PW51bGx8fFB0PT09dm9pZCAwP3ZvaWQgMDpQdC55KSE9PW51bGwmJkJlIT09dm9pZCAwP0JlOjApKX19LGNlPV9lPT57Wi54PD0xMCYmWi55PD0xMD9fZS5wcmV2ZW50RGVmYXVsdCgpOnguY29udGFpbnMoX2UudGFyZ2V0KXx8ayghMSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcm1vdmUiLGtlKSxJLmN1cnJlbnQ9bnVsbH07cmV0dXJuIEkuY3VycmVudCE9PW51bGwmJihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJwb2ludGVybW92ZSIsa2UpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInBvaW50ZXJ1cCIsY2Use2NhcHR1cmU6ITAsb25jZTohMH0pKSwoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvaW50ZXJtb3ZlIixrZSksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigicG9pbnRlcnVwIixjZSx7Y2FwdHVyZTohMH0pfX19LFt4LGssSV0pLHAudXNlRWZmZWN0KCgpPT57Y29uc3QgWj0oKT0+ayghMSk7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJibHVyIixaKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIixaKSwoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJibHVyIixaKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIixaKX19LFtrXSk7Y29uc3RbTCxWXT1DRShaPT57Y29uc3Qga2U9RigpLmZpbHRlcihtZT0+IW1lLmRpc2FibGVkKSxjZT1rZS5maW5kKG1lPT5tZS5yZWYuY3VycmVudD09PWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLF9lPSRFKGtlLFosY2UpO19lJiZzZXRUaW1lb3V0KCgpPT5fZS5yZWYuY3VycmVudC5mb2N1cygpKX0pLHRlPXAudXNlQ2FsbGJhY2soKFosa2UsY2UpPT57Y29uc3QgX2U9IVguY3VycmVudCYmIWNlOyh5LnZhbHVlIT09dm9pZCAwJiZ5LnZhbHVlPT09a2V8fF9lKSYmKE0oWiksX2UmJihYLmN1cnJlbnQ9ITApKX0sW3kudmFsdWVdKSx5ZT1wLnVzZUNhbGxiYWNrKCgpPT54PT1udWxsP3ZvaWQgMDp4LmZvY3VzKCksW3hdKSxmZT1wLnVzZUNhbGxiYWNrKChaLGtlLGNlKT0+e2NvbnN0IF9lPSFYLmN1cnJlbnQmJiFjZTsoeS52YWx1ZSE9PXZvaWQgMCYmeS52YWx1ZT09PWtlfHxfZSkmJmooWil9LFt5LnZhbHVlXSksT2U9cj09PSJwb3BwZXIiP3cwOnBBLGJlPU9lPT09dzA/e3NpZGU6cyxzaWRlT2Zmc2V0OmEsYWxpZ246dSxhbGlnbk9mZnNldDpjLGFycm93UGFkZGluZzpkLGNvbGxpc2lvbkJvdW5kYXJ5OmYsY29sbGlzaW9uUGFkZGluZzpoLHN0aWNreTpnLGhpZGVXaGVuRGV0YWNoZWQ6bSxhdm9pZENvbGxpc2lvbnM6U306e307cmV0dXJuIHAuY3JlYXRlRWxlbWVudChfRSx7c2NvcGU6bixjb250ZW50Ongsdmlld3BvcnQ6RSxvblZpZXdwb3J0Q2hhbmdlOiQsaXRlbVJlZkNhbGxiYWNrOnRlLHNlbGVjdGVkSXRlbTpULG9uSXRlbUxlYXZlOnllLGl0ZW1UZXh0UmVmQ2FsbGJhY2s6ZmUsZm9jdXNTZWxlY3RlZEl0ZW06TyxzZWxlY3RlZEl0ZW1UZXh0OlIscG9zaXRpb246cixpc1Bvc2l0aW9uZWQ6YWUsc2VhcmNoUmVmOkx9LHAuY3JlYXRlRWxlbWVudChaNSx7YXM6RWwsYWxsb3dQaW5jaFpvb206ITB9LHAuY3JlYXRlRWxlbWVudChhTyx7YXNDaGlsZDohMCx0cmFwcGVkOnkub3Blbixvbk1vdW50QXV0b0ZvY3VzOlo9PntaLnByZXZlbnREZWZhdWx0KCl9LG9uVW5tb3VudEF1dG9Gb2N1czpIZShvLFo9Pnt2YXIga2U7KGtlPXkudHJpZ2dlcik9PT1udWxsfHxrZT09PXZvaWQgMHx8a2UuZm9jdXMoe3ByZXZlbnRTY3JvbGw6ITB9KSxaLnByZXZlbnREZWZhdWx0KCl9KX0scC5jcmVhdGVFbGVtZW50KG9PLHthc0NoaWxkOiEwLGRpc2FibGVPdXRzaWRlUG9pbnRlckV2ZW50czohMCxvbkVzY2FwZUtleURvd246aSxvblBvaW50ZXJEb3duT3V0c2lkZTpsLG9uRm9jdXNPdXRzaWRlOlo9PloucHJldmVudERlZmF1bHQoKSxvbkRpc21pc3M6KCk9Pnkub25PcGVuQ2hhbmdlKCExKX0scC5jcmVhdGVFbGVtZW50KE9lLGVlKHtyb2xlOiJsaXN0Ym94IixpZDp5LmNvbnRlbnRJZCwiZGF0YS1zdGF0ZSI6eS5vcGVuPyJvcGVuIjoiY2xvc2VkIixkaXI6eS5kaXIsb25Db250ZXh0TWVudTpaPT5aLnByZXZlbnREZWZhdWx0KCl9LHYsYmUse29uUGxhY2VkOigpPT5IKCEwKSxyZWY6QyxzdHlsZTp7ZGlzcGxheToiZmxleCIsZmxleERpcmVjdGlvbjoiY29sdW1uIixvdXRsaW5lOiJub25lIiwuLi52LnN0eWxlfSxvbktleURvd246SGUodi5vbktleURvd24sWj0+e2NvbnN0IGtlPVouY3RybEtleXx8Wi5hbHRLZXl8fFoubWV0YUtleTtpZihaLmtleT09PSJUYWIiJiZaLnByZXZlbnREZWZhdWx0KCksIWtlJiZaLmtleS5sZW5ndGg9PT0xJiZWKFoua2V5KSxbIkFycm93VXAiLCJBcnJvd0Rvd24iLCJIb21lIiwiRW5kIl0uaW5jbHVkZXMoWi5rZXkpKXtsZXQgX2U9RigpLmZpbHRlcihtZT0+IW1lLmRpc2FibGVkKS5tYXAobWU9Pm1lLnJlZi5jdXJyZW50KTtpZihbIkFycm93VXAiLCJFbmQiXS5pbmNsdWRlcyhaLmtleSkmJihfZT1fZS5zbGljZSgpLnJldmVyc2UoKSksWyJBcnJvd1VwIiwiQXJyb3dEb3duIl0uaW5jbHVkZXMoWi5rZXkpKXtjb25zdCBtZT1aLnRhcmdldCwkZT1fZS5pbmRleE9mKG1lKTtfZT1fZS5zbGljZSgkZSsxKX1zZXRUaW1lb3V0KCgpPT5QKF9lKSksWi5wcmV2ZW50RGVmYXVsdCgpfX0pfSkpKSkpKX0pLHBBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6bixvblBsYWNlZDpyLC4uLm99PWUsaT1iaShSbCxuKSxsPSRkKFJsLG4pLFtzLGFdPXAudXNlU3RhdGUobnVsbCksW3UsY109cC51c2VTdGF0ZShudWxsKSxkPVhlKHQsQz0+YyhDKSksZj1TbShuKSxoPXAudXNlUmVmKCExKSxnPXAudXNlUmVmKCEwKSx7dmlld3BvcnQ6bSxzZWxlY3RlZEl0ZW06UyxzZWxlY3RlZEl0ZW1UZXh0OnYsZm9jdXNTZWxlY3RlZEl0ZW06eX09bCx4PXAudXNlQ2FsbGJhY2soKCk9PntpZihpLnRyaWdnZXImJmkudmFsdWVOb2RlJiZzJiZ1JiZtJiZTJiZ2KXtjb25zdCBDPWkudHJpZ2dlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxUPXUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksTT1pLnZhbHVlTm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxSPXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7aWYoaS5kaXIhPT0icnRsIil7Y29uc3QgbWU9Ui5sZWZ0LVQubGVmdCwkZT1NLmxlZnQtbWUsQmU9Qy5sZWZ0LSRlLFB0PUMud2lkdGgrQmUsc249TWF0aC5tYXgoUHQsVC53aWR0aCksYm49d2luZG93LmlubmVyV2lkdGgtUnIsVGU9QWgoJGUsW1JyLGJuLXNuXSk7cy5zdHlsZS5taW5XaWR0aD1QdCsicHgiLHMuc3R5bGUubGVmdD1UZSsicHgifWVsc2V7Y29uc3QgbWU9VC5yaWdodC1SLnJpZ2h0LCRlPXdpbmRvdy5pbm5lcldpZHRoLU0ucmlnaHQtbWUsQmU9d2luZG93LmlubmVyV2lkdGgtQy5yaWdodC0kZSxQdD1DLndpZHRoK0JlLHNuPU1hdGgubWF4KFB0LFQud2lkdGgpLGJuPXdpbmRvdy5pbm5lcldpZHRoLVJyLFRlPUFoKCRlLFtScixibi1zbl0pO3Muc3R5bGUubWluV2lkdGg9UHQrInB4IixzLnN0eWxlLnJpZ2h0PVRlKyJweCJ9Y29uc3Qgaj1mKCksRj13aW5kb3cuaW5uZXJIZWlnaHQtUnIqMixhZT1tLnNjcm9sbEhlaWdodCxIPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHUpLFg9cGFyc2VJbnQoSC5ib3JkZXJUb3BXaWR0aCwxMCksUD1wYXJzZUludChILnBhZGRpbmdUb3AsMTApLE89cGFyc2VJbnQoSC5ib3JkZXJCb3R0b21XaWR0aCwxMCksaz1wYXJzZUludChILnBhZGRpbmdCb3R0b20sMTApLEk9WCtQK2FlK2srTyxMPU1hdGgubWluKFMub2Zmc2V0SGVpZ2h0KjUsSSksVj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShtKSx0ZT1wYXJzZUludChWLnBhZGRpbmdUb3AsMTApLHllPXBhcnNlSW50KFYucGFkZGluZ0JvdHRvbSwxMCksZmU9Qy50b3ArQy5oZWlnaHQvMi1ScixPZT1GLWZlLGJlPVMub2Zmc2V0SGVpZ2h0LzIsWj1TLm9mZnNldFRvcCtiZSxrZT1YK1ArWixjZT1JLWtlO2lmKGtlPD1mZSl7Y29uc3QgbWU9Uz09PWpbai5sZW5ndGgtMV0ucmVmLmN1cnJlbnQ7cy5zdHlsZS5ib3R0b209IjBweCI7Y29uc3QgJGU9dS5jbGllbnRIZWlnaHQtbS5vZmZzZXRUb3AtbS5vZmZzZXRIZWlnaHQsQmU9TWF0aC5tYXgoT2UsYmUrKG1lP3llOjApKyRlK08pLFB0PWtlK0JlO3Muc3R5bGUuaGVpZ2h0PVB0KyJweCJ9ZWxzZXtjb25zdCBtZT1TPT09alswXS5yZWYuY3VycmVudDtzLnN0eWxlLnRvcD0iMHB4Ijtjb25zdCBCZT1NYXRoLm1heChmZSxYK20ub2Zmc2V0VG9wKyhtZT90ZTowKStiZSkrY2U7cy5zdHlsZS5oZWlnaHQ9QmUrInB4IixtLnNjcm9sbFRvcD1rZS1mZSttLm9mZnNldFRvcH1zLnN0eWxlLm1hcmdpbj1gJHtScn1weCAwYCxzLnN0eWxlLm1pbkhlaWdodD1MKyJweCIscy5zdHlsZS5tYXhIZWlnaHQ9RisicHgiLHI9PW51bGx8fHIoKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9PmguY3VycmVudD0hMCl9fSxbZixpLnRyaWdnZXIsaS52YWx1ZU5vZGUscyx1LG0sUyx2LGkuZGlyLHJdKTskbigoKT0+eCgpLFt4XSk7Y29uc3RbXyxFXT1wLnVzZVN0YXRlKCk7JG4oKCk9Pnt1JiZFKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHUpLnpJbmRleCl9LFt1XSk7Y29uc3QgJD1wLnVzZUNhbGxiYWNrKEM9PntDJiZnLmN1cnJlbnQ9PT0hMCYmKHgoKSx5PT1udWxsfHx5KCksZy5jdXJyZW50PSExKX0sW3gseV0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoZ0Ese3Njb3BlOm4sY29udGVudFdyYXBwZXI6cyxzaG91bGRFeHBhbmRPblNjcm9sbFJlZjpoLG9uU2Nyb2xsQnV0dG9uQ2hhbmdlOiR9LHAuY3JlYXRlRWxlbWVudCgiZGl2Iix7cmVmOmEsc3R5bGU6e2Rpc3BsYXk6ImZsZXgiLGZsZXhEaXJlY3Rpb246ImNvbHVtbiIscG9zaXRpb246ImZpeGVkIix6SW5kZXg6X319LHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoe30sbyx7cmVmOmQsc3R5bGU6e2JveFNpemluZzoiYm9yZGVyLWJveCIsbWF4SGVpZ2h0OiIxMDAlIiwuLi5vLnN0eWxlfX0pKSkpfSksdzA9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLGFsaWduOnI9InN0YXJ0Iixjb2xsaXNpb25QYWRkaW5nOm89UnIsLi4uaX09ZSxsPUVtKG4pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoYzUsZWUoe30sbCxpLHtyZWY6dCxhbGlnbjpyLGNvbGxpc2lvblBhZGRpbmc6byxzdHlsZTp7Ym94U2l6aW5nOiJib3JkZXItYm94IiwuLi5pLnN0eWxlLCItLXJhZGl4LXNlbGVjdC1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4iOiJ2YXIoLS1yYWRpeC1wb3BwZXItdHJhbnNmb3JtLW9yaWdpbikiLCItLXJhZGl4LXNlbGVjdC1jb250ZW50LWF2YWlsYWJsZS13aWR0aCI6InZhcigtLXJhZGl4LXBvcHBlci1hdmFpbGFibGUtd2lkdGgpIiwiLS1yYWRpeC1zZWxlY3QtY29udGVudC1hdmFpbGFibGUtaGVpZ2h0IjoidmFyKC0tcmFkaXgtcG9wcGVyLWF2YWlsYWJsZS1oZWlnaHQpIiwiLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aCI6InZhcigtLXJhZGl4LXBvcHBlci1hbmNob3Itd2lkdGgpIiwiLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci1oZWlnaHQiOiJ2YXIoLS1yYWRpeC1wb3BwZXItYW5jaG9yLWhlaWdodCkifX0pKX0pLFtnQSxtQV09UWwoUmwse30pLFMwPSJTZWxlY3RWaWV3cG9ydCIsdkE9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLC4uLnJ9PWUsbz0kZChTMCxuKSxpPW1BKFMwLG4pLGw9WGUodCxvLm9uVmlld3BvcnRDaGFuZ2UpLHM9cC51c2VSZWYoMCk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChwLkZyYWdtZW50LG51bGwscC5jcmVhdGVFbGVtZW50KCJzdHlsZSIse2Rhbmdlcm91c2x5U2V0SW5uZXJIVE1MOntfX2h0bWw6IltkYXRhLXJhZGl4LXNlbGVjdC12aWV3cG9ydF17c2Nyb2xsYmFyLXdpZHRoOm5vbmU7LW1zLW92ZXJmbG93LXN0eWxlOm5vbmU7LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7fVtkYXRhLXJhZGl4LXNlbGVjdC12aWV3cG9ydF06Oi13ZWJraXQtc2Nyb2xsYmFye2Rpc3BsYXk6bm9uZX0ifX0pLHAuY3JlYXRlRWxlbWVudChDZC5TbG90LHtzY29wZTpufSxwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHsiZGF0YS1yYWRpeC1zZWxlY3Qtdmlld3BvcnQiOiIiLHJvbGU6InByZXNlbnRhdGlvbiJ9LHIse3JlZjpsLHN0eWxlOntwb3NpdGlvbjoicmVsYXRpdmUiLGZsZXg6MSxvdmVyZmxvdzoiYXV0byIsLi4uci5zdHlsZX0sb25TY3JvbGw6SGUoci5vblNjcm9sbCxhPT57Y29uc3QgdT1hLmN1cnJlbnRUYXJnZXQse2NvbnRlbnRXcmFwcGVyOmMsc2hvdWxkRXhwYW5kT25TY3JvbGxSZWY6ZH09aTtpZihkIT1udWxsJiZkLmN1cnJlbnQmJmMpe2NvbnN0IGY9TWF0aC5hYnMocy5jdXJyZW50LXUuc2Nyb2xsVG9wKTtpZihmPjApe2NvbnN0IGg9d2luZG93LmlubmVySGVpZ2h0LVJyKjIsZz1wYXJzZUZsb2F0KGMuc3R5bGUubWluSGVpZ2h0KSxtPXBhcnNlRmxvYXQoYy5zdHlsZS5oZWlnaHQpLFM9TWF0aC5tYXgoZyxtKTtpZihTPGgpe2NvbnN0IHY9UytmLHk9TWF0aC5taW4oaCx2KSx4PXYteTtjLnN0eWxlLmhlaWdodD15KyJweCIsYy5zdHlsZS5ib3R0b209PT0iMHB4IiYmKHUuc2Nyb2xsVG9wPXg+MD94OjAsYy5zdHlsZS5qdXN0aWZ5Q29udGVudD0iZmxleC1lbmQiKX19fXMuY3VycmVudD11LnNjcm9sbFRvcH0pfSkpKSl9KSx5QT0iU2VsZWN0R3JvdXAiLFt2NCx4QV09UWwoeUEpLF9BPSJTZWxlY3RMYWJlbCIsd0E9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLC4uLnJ9PWUsbz14QShfQSxuKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7aWQ6by5pZH0scix7cmVmOnR9KSl9KSx3cD0iU2VsZWN0SXRlbSIsW1NBLHdFXT1RbCh3cCksRUE9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLHZhbHVlOnIsZGlzYWJsZWQ6bz0hMSx0ZXh0VmFsdWU6aSwuLi5sfT1lLHM9Ymkod3AsbiksYT0kZCh3cCxuKSx1PXMudmFsdWU9PT1yLFtjLGRdPXAudXNlU3RhdGUoaT8/IiIpLFtmLGhdPXAudXNlU3RhdGUoITEpLGc9WGUodCx2PT57dmFyIHk7cmV0dXJuKHk9YS5pdGVtUmVmQ2FsbGJhY2spPT09bnVsbHx8eT09PXZvaWQgMD92b2lkIDA6eS5jYWxsKGEsdixyLG8pfSksbT14ZCgpLFM9KCk9PntvfHwocy5vblZhbHVlQ2hhbmdlKHIpLHMub25PcGVuQ2hhbmdlKCExKSl9O2lmKHI9PT0iIil0aHJvdyBuZXcgRXJyb3IoIkEgPFNlbGVjdC5JdGVtIC8+IG11c3QgaGF2ZSBhIHZhbHVlIHByb3AgdGhhdCBpcyBub3QgYW4gZW1wdHkgc3RyaW5nLiBUaGlzIGlzIGJlY2F1c2UgdGhlIFNlbGVjdCB2YWx1ZSBjYW4gYmUgc2V0IHRvIGFuIGVtcHR5IHN0cmluZyB0byBjbGVhciB0aGUgc2VsZWN0aW9uIGFuZCBzaG93IHRoZSBwbGFjZWhvbGRlci4iKTtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KFNBLHtzY29wZTpuLHZhbHVlOnIsZGlzYWJsZWQ6byx0ZXh0SWQ6bSxpc1NlbGVjdGVkOnUsb25JdGVtVGV4dENoYW5nZTpwLnVzZUNhbGxiYWNrKHY9PntkKHk9Pnt2YXIgeDtyZXR1cm4geXx8KCh4PXY9PW51bGw/dm9pZCAwOnYudGV4dENvbnRlbnQpIT09bnVsbCYmeCE9PXZvaWQgMD94OiIiKS50cmltKCl9KX0sW10pfSxwLmNyZWF0ZUVsZW1lbnQoQ2QuSXRlbVNsb3Qse3Njb3BlOm4sdmFsdWU6cixkaXNhYmxlZDpvLHRleHRWYWx1ZTpjfSxwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHtyb2xlOiJvcHRpb24iLCJhcmlhLWxhYmVsbGVkYnkiOm0sImRhdGEtaGlnaGxpZ2h0ZWQiOmY/IiI6dm9pZCAwLCJhcmlhLXNlbGVjdGVkIjp1JiZmLCJkYXRhLXN0YXRlIjp1PyJjaGVja2VkIjoidW5jaGVja2VkIiwiYXJpYS1kaXNhYmxlZCI6b3x8dm9pZCAwLCJkYXRhLWRpc2FibGVkIjpvPyIiOnZvaWQgMCx0YWJJbmRleDpvP3ZvaWQgMDotMX0sbCx7cmVmOmcsb25Gb2N1czpIZShsLm9uRm9jdXMsKCk9PmgoITApKSxvbkJsdXI6SGUobC5vbkJsdXIsKCk9PmgoITEpKSxvblBvaW50ZXJVcDpIZShsLm9uUG9pbnRlclVwLFMpLG9uUG9pbnRlck1vdmU6SGUobC5vblBvaW50ZXJNb3ZlLHY9PntpZihvKXt2YXIgeTsoeT1hLm9uSXRlbUxlYXZlKT09PW51bGx8fHk9PT12b2lkIDB8fHkuY2FsbChhKX1lbHNlIHYuY3VycmVudFRhcmdldC5mb2N1cyh7cHJldmVudFNjcm9sbDohMH0pfSksb25Qb2ludGVyTGVhdmU6SGUobC5vblBvaW50ZXJMZWF2ZSx2PT57aWYodi5jdXJyZW50VGFyZ2V0PT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl7dmFyIHk7KHk9YS5vbkl0ZW1MZWF2ZSk9PT1udWxsfHx5PT09dm9pZCAwfHx5LmNhbGwoYSl9fSksb25LZXlEb3duOkhlKGwub25LZXlEb3duLHY9Pnt2YXIgeTsoKHk9YS5zZWFyY2hSZWYpPT09bnVsbHx8eT09PXZvaWQgMD92b2lkIDA6eS5jdXJyZW50KSE9PSIiJiZ2LmtleT09PSIgInx8KGVBLmluY2x1ZGVzKHYua2V5KSYmUygpLHYua2V5PT09IiAiJiZ2LnByZXZlbnREZWZhdWx0KCkpfSl9KSkpKX0pLHd1PSJTZWxlY3RJdGVtVGV4dCIsQ0E9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLGNsYXNzTmFtZTpyLHN0eWxlOm8sLi4uaX09ZSxsPWJpKHd1LG4pLHM9JGQod3UsbiksYT13RSh3dSxuKSx1PW9BKHd1LG4pLFtjLGRdPXAudXNlU3RhdGUobnVsbCksZj1YZSh0LHY9PmQodiksYS5vbkl0ZW1UZXh0Q2hhbmdlLHY9Pnt2YXIgeTtyZXR1cm4oeT1zLml0ZW1UZXh0UmVmQ2FsbGJhY2spPT09bnVsbHx8eT09PXZvaWQgMD92b2lkIDA6eS5jYWxsKHMsdixhLnZhbHVlLGEuZGlzYWJsZWQpfSksaD1jPT1udWxsP3ZvaWQgMDpjLnRleHRDb250ZW50LGc9cC51c2VNZW1vKCgpPT5wLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIse2tleTphLnZhbHVlLHZhbHVlOmEudmFsdWUsZGlzYWJsZWQ6YS5kaXNhYmxlZH0saCksW2EuZGlzYWJsZWQsYS52YWx1ZSxoXSkse29uTmF0aXZlT3B0aW9uQWRkOm0sb25OYXRpdmVPcHRpb25SZW1vdmU6U309dTtyZXR1cm4gJG4oKCk9PihtKGcpLCgpPT5TKGcpKSxbbSxTLGddKSxwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLHAuY3JlYXRlRWxlbWVudChEZS5zcGFuLGVlKHtpZDphLnRleHRJZH0saSx7cmVmOmZ9KSksYS5pc1NlbGVjdGVkJiZsLnZhbHVlTm9kZSYmIWwudmFsdWVOb2RlSGFzQ2hpbGRyZW4/SHIuY3JlYXRlUG9ydGFsKGkuY2hpbGRyZW4sbC52YWx1ZU5vZGUpOm51bGwpfSksJEE9IlNlbGVjdEl0ZW1JbmRpY2F0b3IiLGtBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTZWxlY3Q6biwuLi5yfT1lO3JldHVybiB3RSgkQSxuKS5pc1NlbGVjdGVkP3AuY3JlYXRlRWxlbWVudChEZS5zcGFuLGVlKHsiYXJpYS1oaWRkZW4iOiEwfSxyLHtyZWY6dH0pKTpudWxsfSksVEE9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZVNlbGVjdDpuLC4uLnJ9PWU7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoeyJhcmlhLWhpZGRlbiI6ITB9LHIse3JlZjp0fSkpfSk7ZnVuY3Rpb24gU0UoZSl7cmV0dXJuIGU9PT0iInx8ZT09PXZvaWQgMH1jb25zdCBFRT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHt2YWx1ZTpuLC4uLnJ9PWUsbz1wLnVzZVJlZihudWxsKSxpPVhlKHQsbyksbD1jRShuKTtyZXR1cm4gcC51c2VFZmZlY3QoKCk9Pntjb25zdCBzPW8uY3VycmVudCxhPXdpbmRvdy5IVE1MU2VsZWN0RWxlbWVudC5wcm90b3R5cGUsYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGEsInZhbHVlIikuc2V0O2lmKGwhPT1uJiZjKXtjb25zdCBkPW5ldyBFdmVudCgiY2hhbmdlIix7YnViYmxlczohMH0pO2MuY2FsbChzLG4pLHMuZGlzcGF0Y2hFdmVudChkKX19LFtsLG5dKSxwLmNyZWF0ZUVsZW1lbnQoaDUse2FzQ2hpbGQ6ITB9LHAuY3JlYXRlRWxlbWVudCgic2VsZWN0IixlZSh7fSxyLHtyZWY6aSxkZWZhdWx0VmFsdWU6bn0pKSl9KTtFRS5kaXNwbGF5TmFtZT0iQnViYmxlU2VsZWN0IjtmdW5jdGlvbiBDRShlKXtjb25zdCB0PVZ0KGUpLG49cC51c2VSZWYoIiIpLHI9cC51c2VSZWYoMCksbz1wLnVzZUNhbGxiYWNrKGw9Pntjb25zdCBzPW4uY3VycmVudCtsO3QocyksZnVuY3Rpb24gYSh1KXtuLmN1cnJlbnQ9dSx3aW5kb3cuY2xlYXJUaW1lb3V0KHIuY3VycmVudCksdSE9PSIiJiYoci5jdXJyZW50PXdpbmRvdy5zZXRUaW1lb3V0KCgpPT5hKCIiKSwxZTMpKX0ocyl9LFt0XSksaT1wLnVzZUNhbGxiYWNrKCgpPT57bi5jdXJyZW50PSIiLHdpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KX0sW10pO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+KCk9PndpbmRvdy5jbGVhclRpbWVvdXQoci5jdXJyZW50KSxbXSksW24sbyxpXX1mdW5jdGlvbiAkRShlLHQsbil7Y29uc3Qgbz10Lmxlbmd0aD4xJiZBcnJheS5mcm9tKHQpLmV2ZXJ5KHU9PnU9PT10WzBdKT90WzBdOnQsaT1uP2UuaW5kZXhPZihuKTotMTtsZXQgbD1OQShlLE1hdGgubWF4KGksMCkpO28ubGVuZ3RoPT09MSYmKGw9bC5maWx0ZXIodT0+dSE9PW4pKTtjb25zdCBhPWwuZmluZCh1PT51LnRleHRWYWx1ZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoby50b0xvd2VyQ2FzZSgpKSk7cmV0dXJuIGEhPT1uP2E6dm9pZCAwfWZ1bmN0aW9uIE5BKGUsdCl7cmV0dXJuIGUubWFwKChuLHIpPT5lWyh0K3IpJWUubGVuZ3RoXSl9Y29uc3QgYkE9aUEsa0U9c0EsUkE9dUEsUEE9Y0EsT0E9ZEEsVEU9ZkEsQUE9dkEsTkU9d0EsYkU9RUEsTUE9Q0EsREE9a0EsUkU9VEEsTEE9YkEsSUE9UkEsUEU9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsY2hpbGRyZW46dCwuLi5ufSxyKT0+dy5qc3hzKGtFLHtyZWY6cixjbGFzc05hbWU6b3QoImZsZXggaC0xMCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItaW5wdXQgYmctYmFja2dyb3VuZCBweC0zIHB5LTIgdGV4dC1zbSByaW5nLW9mZnNldC1iYWNrZ3JvdW5kIHBsYWNlaG9sZGVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctcmluZyBmb2N1czpyaW5nLW9mZnNldC0yIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwIixlKSwuLi5uLGNoaWxkcmVuOlt0LHcuanN4KFBBLHthc0NoaWxkOiEwLGNoaWxkcmVuOncuanN4KE1TLHtjbGFzc05hbWU6InctNCBoLTQgb3BhY2l0eS01MCJ9KX0pXX0pKTtQRS5kaXNwbGF5TmFtZT1rRS5kaXNwbGF5TmFtZTtjb25zdCBPRT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSxjaGlsZHJlbjp0LHBvc2l0aW9uOm49InBvcHBlciIsLi4ucn0sbyk9PncuanN4KE9BLHtjaGlsZHJlbjp3LmpzeChURSx7cmVmOm8sY2xhc3NOYW1lOm90KCJyZWxhdGl2ZSB6LTUwIG1pbi13LVs4cmVtXSBvdmVyZmxvdy1oaWRkZW4gcm91bmRlZC1tZCBib3JkZXIgYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBzaGFkb3ctbWQgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzdGF0ZT1vcGVuXTp6b29tLWluLTk1IGRhdGEtW3NpZGU9Ym90dG9tXTpzbGlkZS1pbi1mcm9tLXRvcC0yIGRhdGEtW3NpZGU9bGVmdF06c2xpZGUtaW4tZnJvbS1yaWdodC0yIGRhdGEtW3NpZGU9cmlnaHRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGRhdGEtW3NpZGU9dG9wXTpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yIixuPT09InBvcHBlciImJiJkYXRhLVtzaWRlPWJvdHRvbV06dHJhbnNsYXRlLXktMSBkYXRhLVtzaWRlPWxlZnRdOi10cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9cmlnaHRdOnRyYW5zbGF0ZS14LTEgZGF0YS1bc2lkZT10b3BdOi10cmFuc2xhdGUteS0xIixlKSxwb3NpdGlvbjpuLC4uLnIsY2hpbGRyZW46dy5qc3goQUEse2NsYXNzTmFtZTpvdCgicC0xIixuPT09InBvcHBlciImJiJoLVt2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci1oZWlnaHQpXSB3LWZ1bGwgbWluLXctW3ZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLXdpZHRoKV0iKSxjaGlsZHJlbjp0fSl9KX0pKTtPRS5kaXNwbGF5TmFtZT1URS5kaXNwbGF5TmFtZTtjb25zdCBqQT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+dy5qc3goTkUse3JlZjpuLGNsYXNzTmFtZTpvdCgicHktMS41IHBsLTggcHItMiB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQiLGUpLC4uLnR9KSk7akEuZGlzcGxheU5hbWU9TkUuZGlzcGxheU5hbWU7Y29uc3QgQUU9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsY2hpbGRyZW46dCwuLi5ufSxyKT0+dy5qc3hzKGJFLHtyZWY6cixjbGFzc05hbWU6b3QoInJlbGF0aXZlIGZsZXggdy1mdWxsIGN1cnNvci1kZWZhdWx0IHNlbGVjdC1ub25lIGl0ZW1zLWNlbnRlciByb3VuZGVkLXNtIHB5LTEuNSBwbC04IHByLTIgdGV4dC1zbSBvdXRsaW5lLW5vbmUgZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgZGF0YS1bZGlzYWJsZWRdOnBvaW50ZXItZXZlbnRzLW5vbmUgZGF0YS1bZGlzYWJsZWRdOm9wYWNpdHktNTAiLGUpLC4uLm4sY2hpbGRyZW46W3cuanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBsZWZ0LTIgZmxleCBoLTMuNSB3LTMuNSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIiLGNoaWxkcmVuOncuanN4KERBLHtjaGlsZHJlbjp3LmpzeCh4UCx7Y2xhc3NOYW1lOiJ3LTQgaC00In0pfSl9KSx3LmpzeChNQSx7Y2hpbGRyZW46dH0pXX0pKTtBRS5kaXNwbGF5TmFtZT1iRS5kaXNwbGF5TmFtZTtjb25zdCB6QT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+dy5qc3goUkUse3JlZjpuLGNsYXNzTmFtZTpvdCgiLW14LTEgbXktMSBoLXB4IGJnLW11dGVkIixlKSwuLi50fSkpO3pBLmRpc3BsYXlOYW1lPVJFLmRpc3BsYXlOYW1lO2Z1bmN0aW9uIE1FKHtwYXRoOmUsZGlzYWJsZWQ6dCxzb3VyY2U6bixzY2hlbWE6cixyZWdpc3RlclBhdGNoQ2FsbGJhY2s6byxvblN1Ym1pdDppfSl7cmV0dXJuKHR5cGVvZiBuPT0ic3RyaW5nInx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJzdHJpbmciP3cuanN4KFZBLHtkZWZhdWx0VmFsdWU6bixkaXNhYmxlZDp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpvLG9uU3VibWl0Oml9KToodHlwZW9mIG49PSJudW1iZXIifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09Im51bWJlciI/dy5qc3goVUEse2RlZmF1bHRWYWx1ZTpuLGRpc2FibGVkOnQscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm8sb25TdWJtaXQ6aX0pOih0eXBlb2Ygbj09Im51bWJlciJ8fHR5cGVvZiBuPT0ic3RyaW5nInx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJrZXlPZiI/dy5qc3goV0Ese2RlZmF1bHRWYWx1ZTpuLGRpc2FibGVkOnQscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm8sb25TdWJtaXQ6aSxzZWxlY3RvcjpyLnNlbGVjdG9yfSk6KHR5cGVvZiBuPT0ib2JqZWN0Inx8bj09PW51bGwpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJyaWNodGV4dCI/dy5qc3goQkEse3JlZ2lzdGVyUGF0Y2hDYWxsYmFjazpvLG9uU3VibWl0OmksZGVmYXVsdFZhbHVlOm59KToodHlwZW9mIG49PSJvYmplY3QifHxuPT09bnVsbCkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09ImltYWdlIj93LmpzeChGQSx7cGF0aDplLHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpvLG9uU3VibWl0OmksZGVmYXVsdFZhbHVlOm59KTp3LmpzeHMoImRpdiIse2NoaWxkcmVuOlsiVW5zdXBwb3J0ZWQgc2NoZW1hOiAiLHIudHlwZV19KX1mdW5jdGlvbiBFMChlLHQsbixyKXtpZighdHx8IXIpcmV0dXJuW107Y29uc3Qgbz1yLnNoYTI1Ni5zbGljZSgwLDUpLGk9ZnVuY3Rpb24oKXtjb25zdCBsPVJnKHQpPz8idW5rbm93biIscz1QZyhsKTtyZXR1cm4gbj9gL3B1YmxpYy8ke24uc3BsaXQoIi4iKS5zbGljZSgwLC0xKS5qb2luKCIuIil8fG59XyR7b30uJHtzfWA6YC9wdWJsaWMvJHtyLnNoYTI1Nn0uJHtzfWB9KCk7cmV0dXJuW3t2YWx1ZTp7W2huXTppLFtLdF06ImZpbGUiLG1ldGFkYXRhOnJ9LG9wOiJyZXBsYWNlIixwYXRoOmV9LHt2YWx1ZTp0LG9wOiJmaWxlIixwYXRoOmUsZmlsZVBhdGg6aX1dfWZ1bmN0aW9uIEZBKHtwYXRoOmUsZGVmYXVsdFZhbHVlOnQsb25TdWJtaXQ6bixyZWdpc3RlclBhdGNoQ2FsbGJhY2s6cn0pe2NvbnN0W28saV09cC51c2VTdGF0ZShudWxsKSxbbCxzXT1wLnVzZVN0YXRlKCExKSxbYSx1XT1wLnVzZVN0YXRlKCksW2MsZF09cC51c2VTdGF0ZSgpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2QodCYmd24uY29udmVydEZpbGVTb3VyY2UodCkudXJsKX0sW3RdKSxwLnVzZUVmZmVjdCgoKT0+e3ImJnIoYXN5bmMgZj0+RTAoZiwobz09bnVsbD92b2lkIDA6by5zcmMpPz9udWxsLChvPT1udWxsP3ZvaWQgMDpvLmZpbGVuYW1lKT8/bnVsbCxhKSl9LFtvLHRdKSx3LmpzeHMoImRpdiIse2NsYXNzTmFtZToibWF4LXctNHhsIHAtNCIsY2hpbGRyZW46W3cuanN4cygibGFiZWwiLHtodG1sRm9yOmBpbWdfaW5wdXQ6JHtlfWAsY2xhc3NOYW1lOiIiLGNoaWxkcmVuOltvfHxjP3cuanN4KCJpbWciLHtzcmM6KG89PW51bGw/dm9pZCAwOm8uc3JjKXx8Y30pOncuanN4KCJkaXYiLHtjaGlsZHJlbjoiRW1wdHkifSksdy5qc3goImlucHV0Iix7aWQ6YGltZ19pbnB1dDoke2V9YCx0eXBlOiJmaWxlIixoaWRkZW46ITAsb25DaGFuZ2U6Zj0+e05TKGYpLnRoZW4oaD0+e2koe3NyYzpoLnNyYyxmaWxlbmFtZTpoLmZpbGVuYW1lfSksaC53aWR0aCYmaC5oZWlnaHQ/dSh7c2hhMjU2Omguc2hhMjU2LHdpZHRoOmgud2lkdGgsaGVpZ2h0OmguaGVpZ2h0fSk6dSh2b2lkIDApfSkuY2F0Y2goaD0+e2NvbnNvbGUuZXJyb3IoaC5tZXNzYWdlKSxpKG51bGwpLHUodm9pZCAwKX0pfX0pXX0pLG4mJncuanN4KCJkaXYiLHtjaGlsZHJlbjpvJiZ3LmpzeChHbCx7ZGlzYWJsZWQ6bCxvbkNsaWNrOigpPT57cyghMCksbihmPT5Qcm9taXNlLnJlc29sdmUoRTAoZixvLnNyYyxvLmZpbGVuYW1lPz9udWxsLGEpKSkuZmluYWxseSgoKT0+e3MoITEpLGkobnVsbCksdSh2b2lkIDApfSl9LGNoaWxkcmVuOmw/IlNhdmluZy4uLiI6IlN1Ym1pdCJ9KX0pXX0sZSl9YXN5bmMgZnVuY3Rpb24gQzAoZSx0KXtjb25zdHt0ZW1wbGF0ZVN0cmluZ3M6bixleHByczpyLGZpbGVzOm99PXQ/YXdhaXQgSFAodC5nZXRFZGl0b3JTdGF0ZSgpLnRvSlNPTigpLnJvb3QpOntbS3RdOiJyaWNodGV4dCIsdGVtcGxhdGVTdHJpbmdzOlsiIl0sZXhwcnM6W10sZmlsZXM6e319O3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6ZSx2YWx1ZTp7dGVtcGxhdGVTdHJpbmdzOm4sZXhwcnM6cixbS3RdOiJyaWNodGV4dCJ9fSwuLi5PYmplY3QuZW50cmllcyhvKS5tYXAoKFtpLGxdKT0+KHtvcDoiZmlsZSIscGF0aDplLGZpbGVQYXRoOmksdmFsdWU6bH0pKV19ZnVuY3Rpb24gQkEoe2RlZmF1bHRWYWx1ZTplLG9uU3VibWl0OnQscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm59KXtjb25zdFtyLG9dPXAudXNlU3RhdGUobnVsbCksW2ksbF09cC51c2VTdGF0ZSghMSksW3MsYV09cC51c2VTdGF0ZSghMSk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57ciYmKGwoITEpLHIucmVnaXN0ZXJUZXh0Q29udGVudExpc3RlbmVyKCgpPT57bCghMCl9KSxyLnJlZ2lzdGVyRGVjb3JhdG9yTGlzdGVuZXIoKCk9PntsKCEwKX0pKX0sW3JdKSxwLnVzZUVmZmVjdCgoKT0+e3ImJm4mJm4odT0+QzAodSxyKSl9LFtyXSksdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InAtNCBib3JkZXIgcm91bmRlZCBib3JkZXItY2FyZCIsY2hpbGRyZW46W3cuanN4KG1QLHtvbkVkaXRvcjp1PT57byh1KX0scmljaHRleHQ6ZXx8e2NoaWxkcmVuOltdLFtLdF06InJvb3QifX0pLHQmJncuanN4KCJkaXYiLHtjaGlsZHJlbjppJiZ3LmpzeChHbCx7ZGlzYWJsZWQ6c3x8IXIsb25DbGljazooKT0+e3ImJihhKCEwKSx0KHU9PkMwKHUscikpLmZpbmFsbHkoKCk9PnthKCExKSxsKCExKX0pKX0sY2hpbGRyZW46cz8iU2F2aW5nLi4uIjoiU3VibWl0In0pfSldfSl9ZnVuY3Rpb24gV0Eoe2Rpc2FibGVkOmUsZGVmYXVsdFZhbHVlOnQscmVnaXN0ZXJQYXRjaENhbGxiYWNrOm4sb25TdWJtaXQ6cixzZWxlY3RvcjpvfSl7Y29uc3QgaT1kMyhvKSxzPShoPT5BcnJheS5pc0FycmF5KGgubW9kdWxlU291cmNlKT97dHlwZToibnVtYmVyIix2YWx1ZXM6T2JqZWN0LmtleXMoaC5tb2R1bGVTb3VyY2UpLm1hcChnPT5wYXJzZUludChnKSl9Ont0eXBlOiJzdHJpbmciLHZhbHVlczpPYmplY3Qua2V5cyhoLm1vZHVsZVNvdXJjZT8/WyJFUlJPUiBmZXRjaGluZyBzb3VyY2UiXSl9KShpKSxbYSx1XT1wLnVzZVN0YXRlKHQ/P3MudmFsdWVzWzBdKSxbYyxkXT1wLnVzZVN0YXRlKCExKTtwLnVzZUVmZmVjdCgoKT0+e2QoZSl9LFtlXSk7Y29uc3QgZj1oPT57aWYocy50eXBlPT09Im51bWJlciIpe2lmKGg9PT0iIil0aHJvdyBuZXcgRXJyb3IoIlZhbHVlIGNhbm5vdCBiZSBlbXB0eSIpO2lmKE51bWJlci5pc05hTihOdW1iZXIoaCkpKXRocm93IG5ldyBFcnJvcigiVmFsdWUgd2FzIG5vdCBhIG51bWJlcjogIitKU09OLnN0cmluZ2lmeShoKSk7cmV0dXJuIE51bWJlcihoKX1yZXR1cm4gaH07cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57biYmbihhc3luYyBoPT5be29wOiJyZXBsYWNlIixwYXRoOmgsdmFsdWU6YX1dKX0sW2FdKSx3LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gaC1mdWxsIGdhcC15LTQiLGNoaWxkcmVuOlt3LmpzeHMoTEEse2RlZmF1bHRWYWx1ZTphLnRvU3RyaW5nKCksZGlzYWJsZWQ6YyxvblZhbHVlQ2hhbmdlOmg9Pnt1KGYoaCkpfSxjaGlsZHJlbjpbdy5qc3goUEUse2NoaWxkcmVuOncuanN4KElBLHtwbGFjZWhvbGRlcjoiU2VsZWN0IGEgdmFsdWUifSl9KSx3LmpzeChPRSx7Y2hpbGRyZW46cy52YWx1ZXMubWFwKGg9PncuanN4KEFFLHt2YWx1ZTpoLnRvU3RyaW5nKCksY2hpbGRyZW46aC50b1N0cmluZygpfSxoKSl9KV19KSxyJiZ3LmpzeCgiZGl2Iix7Y2hpbGRyZW46dCE9PWEmJncuanN4KEdsLHtkaXNhYmxlZDpjLG9uQ2xpY2s6KCk9PntkKCEwKSxyKGFzeW5jIGg9Plt7b3A6InJlcGxhY2UiLHBhdGg6aCx2YWx1ZTphfV0pLmZpbmFsbHkoKCk9PntkKCExKX0pfSxjaGlsZHJlbjpjPyJTYXZpbmcuLi4iOiJTdWJtaXQifSl9KV19KX1mdW5jdGlvbiBVQSh7ZGlzYWJsZWQ6ZSxkZWZhdWx0VmFsdWU6dCxyZWdpc3RlclBhdGNoQ2FsbGJhY2s6bixvblN1Ym1pdDpyfSl7Y29uc3RbbyxpXT1wLnVzZVN0YXRlKHR8fDApLFtsLHNdPXAudXNlU3RhdGUoITEpO3AudXNlRWZmZWN0KCgpPT57cyhlKX0sW2VdKTtjb25zdCBhPXAudXNlUmVmKG51bGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e24mJm4oYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTpOdW1iZXIoKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fDB9XX0pfSxbXSksdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuIGgtZnVsbCBnYXAteS00IixjaGlsZHJlbjpbdy5qc3goZ20se3JlZjphLGRpc2FibGVkOmwsZGVmYXVsdFZhbHVlOm8/PzAsb25DaGFuZ2U6dT0+aShOdW1iZXIodS50YXJnZXQudmFsdWUpKSx0eXBlOiJudW1iZXIifSksciYmdy5qc3goImRpdiIse2NoaWxkcmVuOnQhPT1vJiZ3LmpzeChHbCx7ZGlzYWJsZWQ6bCxvbkNsaWNrOigpPT57cyghMCkscihhc3luYyB1PT57dmFyIGM7cmV0dXJuW3tvcDoicmVwbGFjZSIscGF0aDp1LHZhbHVlOk51bWJlcigoYz1hLmN1cnJlbnQpPT1udWxsP3ZvaWQgMDpjLnZhbHVlKXx8MH1dfSkuZmluYWxseSgoKT0+e3MoITEpfSl9LGNoaWxkcmVuOmw/IlNhdmluZy4uLiI6IlN1Ym1pdCJ9KX0pXX0pfWZ1bmN0aW9uIFZBKHtkaXNhYmxlZDplLGRlZmF1bHRWYWx1ZTp0LHJlZ2lzdGVyUGF0Y2hDYWxsYmFjazpuLG9uU3VibWl0OnJ9KXtjb25zdFtvLGldPXAudXNlU3RhdGUodHx8IiIpLFtsLHNdPXAudXNlU3RhdGUoITEpO3AudXNlRWZmZWN0KCgpPT57cyhlKX0sW2VdKTtjb25zdCBhPXAudXNlUmVmKG51bGwpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e24mJm4oYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTooKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fCIifV19KX0sW10pLHcuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiBoLWZ1bGwgZ2FwLXktNCIsY2hpbGRyZW46W3cuanN4KGdtLHtyZWY6YSxkaXNhYmxlZDpsLGRlZmF1bHRWYWx1ZTpvPz8iIixvbkNoYW5nZTp1PT5pKHUudGFyZ2V0LnZhbHVlKX0pLHImJncuanN4KCJkaXYiLHtjaGlsZHJlbjp0IT09byYmdy5qc3goR2wse2Rpc2FibGVkOmwsb25DbGljazooKT0+e3MoITApLHIoYXN5bmMgdT0+e3ZhciBjO3JldHVyblt7b3A6InJlcGxhY2UiLHBhdGg6dSx2YWx1ZTooKGM9YS5jdXJyZW50KT09bnVsbD92b2lkIDA6Yy52YWx1ZSl8fCIifV19KS5maW5hbGx5KCgpPT57cyghMSl9KX0sY2hpbGRyZW46bD8iU2F2aW5nLi4uIjoiU3VibWl0In0pfSldfSl9Y29uc3QgSEE9KHtjbGFzc05hbWU6ZX0pPT53LmpzeHMoInN2ZyIse3dpZHRoOiI1OCIsaGVpZ2h0OiIzNCIsdmlld0JveDoiMCAwIDU4IDM0IixmaWxsOiJub25lIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLGNsYXNzTmFtZTplLGNoaWxkcmVuOlt3LmpzeCgiZyIse2ZpbHRlcjoidXJsKCNmaWx0ZXIwX2RfMjFfMTY3NykiLGNoaWxkcmVuOncuanN4KCJwYXRoIix7ZDoiTTUgNS4zNjQyNkM1IDUuMTYzMDkgNS4xNjMwOSA1IDUuMzY0MjYgNUgxNy42NTgxQzE3Ljg1OTMgNSAxOC4wMjIzIDUuMTYzMDkgMTguMDIyMyA1LjM2NDI2VjI4LjQ5NDlDMTguMDIyMyAyOC42OTYgMTcuODU5MyAyOC44NTkxIDE3LjY1ODEgMjguODU5MUg1LjM2NDI2QzUuMTYzMDkgMjguODU5MSA1IDI4LjY5NiA1IDI4LjQ5NDlWNS4zNjQyNloiLGZpbGw6IiMzOENEOTgifSl9KSx3LmpzeCgiZyIse2ZpbHRlcjoidXJsKCNmaWx0ZXIxX2lfMjFfMTY3NykiLGNoaWxkcmVuOncuanN4KCJjaXJjbGUiLHtjeDoiMTEuNDY1NiIsY3k6IjIzLjc1OTUiLHI6IjIuMTg1NTciLGZpbGw6ImN1cnJlbnRDb2xvciJ9KX0pLHcuanN4KCJwYXRoIix7ZmlsbFJ1bGU6ImV2ZW5vZGQiLGNsaXBSdWxlOiJldmVub2RkIixkOiJNNTIuODU4OCAyMy44MzlINDguNzI1N0g0OC41MzdINDguMTEyOEM0Ny42NzE1IDIzLjgzOSA0Ny40NTA4IDIzLjU5NDIgNDcuNDUwOCAyMy4xMDQ0VjEzLjcyOTNDNDcuNDUwOCAxMy41Nzg0IDQ3LjMyODUgMTMuNDU2MSA0Ny4xNzc3IDEzLjQ1NjFINDUuODExOEM0NS42NjA5IDEzLjQ1NjEgNDUuNTM4NiAxMy41Nzg0IDQ1LjUzODYgMTMuNzI5M1YxNS4xODM2QzQ1LjUzODYgMTUuMjg0NCA0NS40NTY5IDE1LjM2NjEgNDUuMzU2MSAxNS4zNjYxQzQ1LjI4NzYgMTUuMzY2MSA0NS4yMjUgMTUuMzI3NSA0NS4xOTI0IDE1LjI2NzJDNDQuODA1IDE0LjU1MDMgNDQuMjgzIDE0LjAyIDQzLjYyNjQgMTMuNjc2NUM0Mi45NTYzIDEzLjMwMSA0Mi4yMDQ1IDEzLjExMzIgNDEuMzcwOSAxMy4xMTMyQzQwLjYwMjggMTMuMTEzMiAzOS44NzU1IDEzLjI1MiAzOS4xODkgMTMuNTI5NUMzOC41MDI2IDEzLjgwNzEgMzcuODk3OSAxNC4yMTUyIDM3LjM3NDggMTQuNzUzOUMzNi44NjgyIDE1LjI3NjQgMzYuNDY3OCAxNS45MjEyIDM2LjE3MzYgMTYuNjg4NUMzNS44Nzk0IDE3LjQ1NTggMzUuNzMyMyAxOC4zMzc0IDM1LjczMjMgMTkuMzMzMlYxOS43MjVDMzUuNzMyMyAyMC43MzcyIDM1Ljg3OTQgMjEuNjI3IDM2LjE3MzYgMjIuMzk0MkMzNi40Njc4IDIzLjE2MTUgMzYuODY4MiAyMy44MTQ2IDM3LjM3NDggMjQuMzUzM0MzNy44OTc5IDI0Ljg3NTcgMzguNTAyNiAyNS4yNzU3IDM5LjE4OSAyNS41NTMyQzM5Ljg3NTUgMjUuODE0NCA0MC42MTkxIDI1Ljk0NSA0MS40MiAyNS45NDVDNDIuMTg4MSAyNS45NDUgNDIuOTE1NCAyNS43NDkxIDQzLjYwMTkgMjUuMzU3M0M0NC4yNzUxIDI0Ljk4MiA0NC44MDU4IDI0LjQxMTkgNDUuMTk0MSAyMy42NDcxQzQ1LjIyNTUgMjMuNTg1MiA0NS4yODg2IDIzLjU0NTIgNDUuMzU4IDIzLjU0NTJINDUuMzkxN0M0NS40NzI4IDIzLjU0NTIgNDUuNTM4NiAyMy42MTEgNDUuNTM4NiAyMy42OTIxQzQ1LjUzODYgMjMuNzkwNCA0NS41NDQgMjMuODg1NiA0NS41NTQ3IDIzLjk3NzdWMjUuMTM5MkM0NS41NTQ3IDI1LjM5MDQgNDUuNzU4NCAyNS41OTQxIDQ2LjAwOTYgMjUuNTk0MUg0Ny4yMjYxQzQ3LjI5MTQgMjUuNTk5NSA0Ny4zNTgxIDI1LjYwMjIgNDcuNDI2MyAyNS42MDIySDQ4LjUzN0g0OC43MjU3SDU3LjcyNjhDNTcuODc3NyAyNS42MDIyIDU4IDI1LjQ3OTkgNTggMjUuMzI5VjI0LjExMjJDNTggMjMuOTYxNCA1Ny44Nzc3IDIzLjgzOSA1Ny43MjY4IDIzLjgzOUg1NS4zMTc0QzU1LjE2NjUgMjMuODM5IDU1LjA0NDIgMjMuNzE2NyA1NS4wNDQyIDIzLjU2NTlWOC43MzM2OEM1NS4wNDQyIDguNTgyNzkgNTQuOTIxOSA4LjQ2MDQ4IDU0Ljc3MSA4LjQ2MDQ4SDUwLjUwNTRDNTAuMzU0NSA4LjQ2MDQ4IDUwLjIzMjIgOC41ODI3OSA1MC4yMzIyIDguNzMzNjhWOS45NTA0M0M1MC4yMzIyIDEwLjEwMTMgNTAuMzU0NSAxMC4yMjM2IDUwLjUwNTQgMTAuMjIzNkg1Mi44NTg4QzUzLjAwOTcgMTAuMjIzNiA1My4xMzIgMTAuMzQ1OSA1My4xMzIgMTAuNDk2OFYyMy41NjU5QzUzLjEzMiAyMy43MTY3IDUzLjAwOTcgMjMuODM5IDUyLjg1ODggMjMuODM5Wk00MS42MTYxIDI0LjEzMjlDNDIuMTg4MSAyNC4xMzI5IDQyLjcxMTEgMjQuMDI2OCA0My4xODUxIDIzLjgxNDZDNDMuNjc1NCAyMy42MDIzIDQ0LjA5MjIgMjMuMzAwMyA0NC40MzU0IDIyLjkwODVDNDQuNzc4NiAyMi41MTY3IDQ1LjA0ODMgMjIuMDUxNCA0NS4yNDQ0IDIxLjUxMjdDNDUuNDQwNiAyMC45NTc2IDQ1LjUzODYgMjAuMzQ1NCA0NS41Mzg2IDE5LjY3NjFWMTkuMzgyMkM0NS41Mzg2IDE4LjcyOTIgNDUuNDQwNiAxOC4xMzMzIDQ1LjI0NDQgMTcuNTk0NkM0NS4wNDgzIDE3LjAzOTUgNDQuNzcwNSAxNi41NjYxIDQ0LjQxMDkgMTYuMTc0M0M0NC4wNjc3IDE1Ljc4MjQgNDMuNjUwOSAxNS40ODA0IDQzLjE2MDYgMTUuMjY4MkM0Mi42ODY2IDE1LjAzOTYgNDIuMTcxOCAxNC45MjU0IDQxLjYxNjEgMTQuOTI1NEM0MS4wNDQgMTQuOTI1NCA0MC41MjEgMTUuMDMxNSA0MC4wNDcxIDE1LjI0MzdDMzkuNTczMSAxNS40NTU5IDM5LjE1NjMgMTUuNzU4IDM4Ljc5NjggMTYuMTQ5OEMzOC40NTM1IDE2LjUyNTIgMzguMTgzOSAxNi45OTA1IDM3Ljk4NzcgMTcuNTQ1NkMzNy43OTE2IDE4LjA4NDMgMzcuNjkzNiAxOC42ODAyIDM3LjY5MzYgMTkuMzMzMlYxOS43MjVDMzcuNjkzNiAyMS4xMTI3IDM4LjA1MzEgMjIuMTk4MyAzOC43NzIyIDIyLjk4MkMzOS41MDc3IDIzLjc0OTMgNDAuNDU1NyAyNC4xMzI5IDQxLjYxNjEgMjQuMTMyOVpNMzEuMTExNSAyNS40MTkxQzMxLjA3MzIgMjUuNTI4NyAzMC45Njk4IDI1LjYwMjIgMzAuODUzNiAyNS42MDIySDI3LjQ2NjFDMjcuMzUgMjUuNjAyMiAyNy4yNDY1IDI1LjUyODcgMjcuMjA4MiAyNS40MTkxTDIzLjE1NzggMTMuODE5M0MyMy4wOTU4IDEzLjY0MTcgMjMuMjI3NiAxMy40NTYxIDIzLjQxNTcgMTMuNDU2MUgyNS4wODlDMjUuMjA2OCAxMy40NTYxIDI1LjMxMTQgMTMuNTMxNiAyNS4zNDg0IDEzLjY0MzVMMjguOTY2NiAyNC41ODFDMjguOTk0MiAyNC42NjQzIDI5LjA3MjEgMjQuNzIwNiAyOS4xNTk5IDI0LjcyMDZDMjkuMjQ3NyAyNC43MjA2IDI5LjMyNTYgMjQuNjY0MyAyOS4zNTMyIDI0LjU4MUwzMi45NzE0IDEzLjY0MzVDMzMuMDA4NCAxMy41MzE2IDMzLjExMjkgMTMuNDU2MSAzMy4yMzA4IDEzLjQ1NjFIMzQuOTA0MUMzNS4wOTIyIDEzLjQ1NjEgMzUuMjI0IDEzLjY0MTcgMzUuMTYyIDEzLjgxOTNMMzEuMTExNSAyNS40MTkxWiIsZmlsbDoiY3VycmVudENvbG9yIn0pLHcuanN4cygiZGVmcyIse2NoaWxkcmVuOlt3LmpzeHMoImZpbHRlciIse2lkOiJmaWx0ZXIwX2RfMjFfMTY3NyIseDoiMC4xMjQ3MjIiLHk6IjAuMTI0NzIyIix3aWR0aDoiMjIuNzcyOSIsaGVpZ2h0OiIzMy42MDk3IixmaWx0ZXJVbml0czoidXNlclNwYWNlT25Vc2UiLGNvbG9ySW50ZXJwb2xhdGlvbkZpbHRlcnM6InNSR0IiLGNoaWxkcmVuOlt3LmpzeCgiZmVGbG9vZCIse2Zsb29kT3BhY2l0eToiMCIscmVzdWx0OiJCYWNrZ3JvdW5kSW1hZ2VGaXgifSksdy5qc3goImZlQ29sb3JNYXRyaXgiLHtpbjoiU291cmNlQWxwaGEiLHR5cGU6Im1hdHJpeCIsdmFsdWVzOiIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIscmVzdWx0OiJoYXJkQWxwaGEifSksdy5qc3goImZlT2Zmc2V0Iix7fSksdy5qc3goImZlR2F1c3NpYW5CbHVyIix7c3RkRGV2aWF0aW9uOiIyLjQzNzY0In0pLHcuanN4KCJmZUNvbXBvc2l0ZSIse2luMjoiaGFyZEFscGhhIixvcGVyYXRvcjoib3V0In0pLHcuanN4KCJmZUNvbG9yTWF0cml4Iix7dHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMC4yMTk2MDggMCAwIDAgMCAwLjgwMzkyMiAwIDAgMCAwIDAuNTAxOTYxIDAgMCAwIDAuMyAwIn0pLHcuanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjI6IkJhY2tncm91bmRJbWFnZUZpeCIscmVzdWx0OiJlZmZlY3QxX2Ryb3BTaGFkb3dfMjFfMTY3NyJ9KSx3LmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiZWZmZWN0MV9kcm9wU2hhZG93XzIxXzE2NzciLHJlc3VsdDoic2hhcGUifSldfSksdy5qc3hzKCJmaWx0ZXIiLHtpZDoiZmlsdGVyMV9pXzIxXzE2NzciLHg6IjkuMjgwMDMiLHk6IjIxLjU3MzkiLHdpZHRoOiI0LjM3MTEyIixoZWlnaHQ6IjQuMzcxMTIiLGZpbHRlclVuaXRzOiJ1c2VyU3BhY2VPblVzZSIsY29sb3JJbnRlcnBvbGF0aW9uRmlsdGVyczoic1JHQiIsY2hpbGRyZW46W3cuanN4KCJmZUZsb29kIix7Zmxvb2RPcGFjaXR5OiIwIixyZXN1bHQ6IkJhY2tncm91bmRJbWFnZUZpeCJ9KSx3LmpzeCgiZmVCbGVuZCIse21vZGU6Im5vcm1hbCIsaW46IlNvdXJjZUdyYXBoaWMiLGluMjoiQmFja2dyb3VuZEltYWdlRml4IixyZXN1bHQ6InNoYXBlIn0pLHcuanN4KCJmZUNvbG9yTWF0cml4Iix7aW46IlNvdXJjZUFscGhhIix0eXBlOiJtYXRyaXgiLHZhbHVlczoiMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiLHJlc3VsdDoiaGFyZEFscGhhIn0pLHcuanN4KCJmZU9mZnNldCIse30pLHcuanN4KCJmZUdhdXNzaWFuQmx1ciIse3N0ZERldmlhdGlvbjoiMC41NDYzOTIifSksdy5qc3goImZlQ29tcG9zaXRlIix7aW4yOiJoYXJkQWxwaGEiLG9wZXJhdG9yOiJhcml0aG1ldGljIixrMjoiLTEiLGszOiIxIn0pLHcuanN4KCJmZUNvbG9yTWF0cml4Iix7dHlwZToibWF0cml4Iix2YWx1ZXM6IjAgMCAwIDAgMC4yMTk2MDggMCAwIDAgMCAwLjgwMzkyMiAwIDAgMCAwIDAuNTAxOTYxIDAgMCAwIDAuMyAwIn0pLHcuanN4KCJmZUJsZW5kIix7bW9kZToibm9ybWFsIixpbjI6InNoYXBlIixyZXN1bHQ6ImVmZmVjdDFfaW5uZXJTaGFkb3dfMjFfMTY3NyJ9KV19KV19KV19KSxERT1IQSxMRT0iU3dpdGNoIixbS0EseTRdPUNpKExFKSxbR0EsWUFdPUtBKExFKSxYQT1wLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlU3dpdGNoOm4sbmFtZTpyLGNoZWNrZWQ6byxkZWZhdWx0Q2hlY2tlZDppLHJlcXVpcmVkOmwsZGlzYWJsZWQ6cyx2YWx1ZTphPSJvbiIsb25DaGVja2VkQ2hhbmdlOnUsLi4uY309ZSxbZCxmXT1wLnVzZVN0YXRlKG51bGwpLGg9WGUodCx5PT5mKHkpKSxnPXAudXNlUmVmKCExKSxtPWQ/ISFkLmNsb3Nlc3QoImZvcm0iKTohMCxbUz0hMSx2XT1ibCh7cHJvcDpvLGRlZmF1bHRQcm9wOmksb25DaGFuZ2U6dX0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoR0Ese3Njb3BlOm4sY2hlY2tlZDpTLGRpc2FibGVkOnN9LHAuY3JlYXRlRWxlbWVudChEZS5idXR0b24sZWUoe3R5cGU6ImJ1dHRvbiIscm9sZToic3dpdGNoIiwiYXJpYS1jaGVja2VkIjpTLCJhcmlhLXJlcXVpcmVkIjpsLCJkYXRhLXN0YXRlIjpJRShTKSwiZGF0YS1kaXNhYmxlZCI6cz8iIjp2b2lkIDAsZGlzYWJsZWQ6cyx2YWx1ZTphfSxjLHtyZWY6aCxvbkNsaWNrOkhlKGUub25DbGljayx5PT57dih4PT4heCksbSYmKGcuY3VycmVudD15LmlzUHJvcGFnYXRpb25TdG9wcGVkKCksZy5jdXJyZW50fHx5LnN0b3BQcm9wYWdhdGlvbigpKX0pfSkpLG0mJnAuY3JlYXRlRWxlbWVudChaQSx7Y29udHJvbDpkLGJ1YmJsZXM6IWcuY3VycmVudCxuYW1lOnIsdmFsdWU6YSxjaGVja2VkOlMscmVxdWlyZWQ6bCxkaXNhYmxlZDpzLHN0eWxlOnt0cmFuc2Zvcm06InRyYW5zbGF0ZVgoLTEwMCUpIn19KSl9KSxRQT0iU3dpdGNoVGh1bWIiLEpBPXAuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVTd2l0Y2g6biwuLi5yfT1lLG89WUEoUUEsbik7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChEZS5zcGFuLGVlKHsiZGF0YS1zdGF0ZSI6SUUoby5jaGVja2VkKSwiZGF0YS1kaXNhYmxlZCI6by5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjp0fSkpfSksWkE9ZT0+e2NvbnN0e2NvbnRyb2w6dCxjaGVja2VkOm4sYnViYmxlczpyPSEwLC4uLm99PWUsaT1wLnVzZVJlZihudWxsKSxsPWNFKG4pLHM9ckUodCk7cmV0dXJuIHAudXNlRWZmZWN0KCgpPT57Y29uc3QgYT1pLmN1cnJlbnQsdT13aW5kb3cuSFRNTElucHV0RWxlbWVudC5wcm90b3R5cGUsZD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHUsImNoZWNrZWQiKS5zZXQ7aWYobCE9PW4mJmQpe2NvbnN0IGY9bmV3IEV2ZW50KCJjbGljayIse2J1YmJsZXM6cn0pO2QuY2FsbChhLG4pLGEuZGlzcGF0Y2hFdmVudChmKX19LFtsLG4scl0pLHAuY3JlYXRlRWxlbWVudCgiaW5wdXQiLGVlKHt0eXBlOiJjaGVja2JveCIsImFyaWEtaGlkZGVuIjohMCxkZWZhdWx0Q2hlY2tlZDpufSxvLHt0YWJJbmRleDotMSxyZWY6aSxzdHlsZTp7Li4uZS5zdHlsZSwuLi5zLHBvc2l0aW9uOiJhYnNvbHV0ZSIscG9pbnRlckV2ZW50czoibm9uZSIsb3BhY2l0eTowLG1hcmdpbjowfX0pKX07ZnVuY3Rpb24gSUUoZSl7cmV0dXJuIGU/ImNoZWNrZWQiOiJ1bmNoZWNrZWQifWNvbnN0IGpFPVhBLHFBPUpBLFNwPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT53LmpzeChqRSx7Y2xhc3NOYW1lOm90KCJwZWVyIGlubGluZS1mbGV4IGgtWzIycHhdIHctWzQ0cHhdIHNocmluay0wIGN1cnNvci1wb2ludGVyIGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYm9yZGVyLTIgYm9yZGVyLXRyYW5zcGFyZW50IHRyYW5zaXRpb24tY29sb3JzIGZvY3VzLXZpc2libGU6b3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy0yIGZvY3VzLXZpc2libGU6cmluZy1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1vZmZzZXQtMiBmb2N1cy12aXNpYmxlOnJpbmctb2Zmc2V0LWJhY2tncm91bmQgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgZGF0YS1bc3RhdGU9Y2hlY2tlZF06YmctYWNjZW50IGRhdGEtW3N0YXRlPXVuY2hlY2tlZF06YmctcHJpbWFyeSIsZSksLi4udCxyZWY6bixjaGlsZHJlbjp3LmpzeChxQSx7Y2xhc3NOYW1lOm90KCJwb2ludGVyLWV2ZW50cy1ub25lIGJsb2NrIGgtWzE4cHhdIHctNSByb3VuZGVkLWZ1bGwgYmctYmFja2dyb3VuZCBzaGFkb3ctbGcgcmluZy0wIHRyYW5zaXRpb24tdHJhbnNmb3JtIGRhdGEtW3N0YXRlPWNoZWNrZWRdOnRyYW5zbGF0ZS14LTUgZGF0YS1bc3RhdGU9dW5jaGVja2VkXTp0cmFuc2xhdGUteC0wIil9KX0pKTtTcC5kaXNwbGF5TmFtZT1qRS5kaXNwbGF5TmFtZTtjb25zdCBDbT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+dy5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTpvdCgicm91bmRlZC1sZyBib3JkZXIgYmctY2FyZCB0ZXh0LWNhcmQtZm9yZWdyb3VuZCBzaGFkb3ctc20iLGUpLC4uLnR9KSk7Q20uZGlzcGxheU5hbWU9IkNhcmQiO2NvbnN0IGVNPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT53LmpzeCgiZGl2Iix7cmVmOm4sY2xhc3NOYW1lOm90KCJmbGV4IGZsZXgtY29sIHNwYWNlLXktMS41IHAtNiIsZSksLi4udH0pKTtlTS5kaXNwbGF5TmFtZT0iQ2FyZEhlYWRlciI7Y29uc3QgdE09cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PncuanN4KCJoMyIse3JlZjpuLGNsYXNzTmFtZTpvdCgidGV4dC0yeGwgZm9udC1zZW1pYm9sZCBsZWFkaW5nLW5vbmUgdHJhY2tpbmctdGlnaHQiLGUpLC4uLnR9KSk7dE0uZGlzcGxheU5hbWU9IkNhcmRUaXRsZSI7Y29uc3Qgbk09cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsLi4udH0sbik9PncuanN4KCJwIix7cmVmOm4sY2xhc3NOYW1lOm90KCJ0ZXh0LXNtIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCIsZSksLi4udH0pKTtuTS5kaXNwbGF5TmFtZT0iQ2FyZERlc2NyaXB0aW9uIjtjb25zdCByTT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+dy5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTpvdCgicC02IHB0LTAiLGUpLC4uLnR9KSk7ck0uZGlzcGxheU5hbWU9IkNhcmRDb250ZW50Ijtjb25zdCBvTT1wLmZvcndhcmRSZWYoKHtjbGFzc05hbWU6ZSwuLi50fSxuKT0+dy5qc3goImRpdiIse3JlZjpuLGNsYXNzTmFtZTpvdCgiZmxleCBpdGVtcy1jZW50ZXIgcC02IHB0LTAiLGUpLC4uLnR9KSk7b00uZGlzcGxheU5hbWU9IkNhcmRGb290ZXIiOy8qKgogKiBAcmVtaXgtcnVuL3JvdXRlciB2MS4xMS4wCiAqCiAqIENvcHlyaWdodCAoYykgUmVtaXggU29mdHdhcmUgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRS5tZCBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKgogKiBAbGljZW5zZSBNSVQKICovZnVuY3Rpb24gcnQoKXtyZXR1cm4gcnQ9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSxydC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIGx0OyhmdW5jdGlvbihlKXtlLlBvcD0iUE9QIixlLlB1c2g9IlBVU0giLGUuUmVwbGFjZT0iUkVQTEFDRSJ9KShsdHx8KGx0PXt9KSk7Y29uc3QgJDA9InBvcHN0YXRlIjtmdW5jdGlvbiBpTShlKXtlPT09dm9pZCAwJiYoZT17fSk7ZnVuY3Rpb24gdChyLG8pe2xldHtwYXRobmFtZTppLHNlYXJjaDpsLGhhc2g6c309ci5sb2NhdGlvbjtyZXR1cm4gU2EoIiIse3BhdGhuYW1lOmksc2VhcmNoOmwsaGFzaDpzfSxvLnN0YXRlJiZvLnN0YXRlLnVzcnx8bnVsbCxvLnN0YXRlJiZvLnN0YXRlLmtleXx8ImRlZmF1bHQiKX1mdW5jdGlvbiBuKHIsbyl7cmV0dXJuIHR5cGVvZiBvPT0ic3RyaW5nIj9vOkZhKG8pfXJldHVybiBzTSh0LG4sbnVsbCxlKX1mdW5jdGlvbiB3ZShlLHQpe2lmKGU9PT0hMXx8ZT09PW51bGx8fHR5cGVvZiBlPiJ1Iil0aHJvdyBuZXcgRXJyb3IodCl9ZnVuY3Rpb24gdmkoZSx0KXtpZighZSl7dHlwZW9mIGNvbnNvbGU8InUiJiZjb25zb2xlLndhcm4odCk7dHJ5e3Rocm93IG5ldyBFcnJvcih0KX1jYXRjaHt9fX1mdW5jdGlvbiBsTSgpe3JldHVybiBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiw4KX1mdW5jdGlvbiBrMChlLHQpe3JldHVybnt1c3I6ZS5zdGF0ZSxrZXk6ZS5rZXksaWR4OnR9fWZ1bmN0aW9uIFNhKGUsdCxuLHIpe3JldHVybiBuPT09dm9pZCAwJiYobj1udWxsKSxydCh7cGF0aG5hbWU6dHlwZW9mIGU9PSJzdHJpbmciP2U6ZS5wYXRobmFtZSxzZWFyY2g6IiIsaGFzaDoiIn0sdHlwZW9mIHQ9PSJzdHJpbmciP0pyKHQpOnQse3N0YXRlOm4sa2V5OnQmJnQua2V5fHxyfHxsTSgpfSl9ZnVuY3Rpb24gRmEoZSl7bGV0e3BhdGhuYW1lOnQ9Ii8iLHNlYXJjaDpuPSIiLGhhc2g6cj0iIn09ZTtyZXR1cm4gbiYmbiE9PSI/IiYmKHQrPW4uY2hhckF0KDApPT09Ij8iP246Ij8iK24pLHImJnIhPT0iIyImJih0Kz1yLmNoYXJBdCgwKT09PSIjIj9yOiIjIityKSx0fWZ1bmN0aW9uIEpyKGUpe2xldCB0PXt9O2lmKGUpe2xldCBuPWUuaW5kZXhPZigiIyIpO24+PTAmJih0Lmhhc2g9ZS5zdWJzdHIobiksZT1lLnN1YnN0cigwLG4pKTtsZXQgcj1lLmluZGV4T2YoIj8iKTtyPj0wJiYodC5zZWFyY2g9ZS5zdWJzdHIociksZT1lLnN1YnN0cigwLHIpKSxlJiYodC5wYXRobmFtZT1lKX1yZXR1cm4gdH1mdW5jdGlvbiBzTShlLHQsbixyKXtyPT09dm9pZCAwJiYocj17fSk7bGV0e3dpbmRvdzpvPWRvY3VtZW50LmRlZmF1bHRWaWV3LHY1Q29tcGF0Omk9ITF9PXIsbD1vLmhpc3Rvcnkscz1sdC5Qb3AsYT1udWxsLHU9YygpO3U9PW51bGwmJih1PTAsbC5yZXBsYWNlU3RhdGUocnQoe30sbC5zdGF0ZSx7aWR4OnV9KSwiIikpO2Z1bmN0aW9uIGMoKXtyZXR1cm4obC5zdGF0ZXx8e2lkeDpudWxsfSkuaWR4fWZ1bmN0aW9uIGQoKXtzPWx0LlBvcDtsZXQgUz1jKCksdj1TPT1udWxsP251bGw6Uy11O3U9UyxhJiZhKHthY3Rpb246cyxsb2NhdGlvbjptLmxvY2F0aW9uLGRlbHRhOnZ9KX1mdW5jdGlvbiBmKFMsdil7cz1sdC5QdXNoO2xldCB5PVNhKG0ubG9jYXRpb24sUyx2KTtuJiZuKHksUyksdT1jKCkrMTtsZXQgeD1rMCh5LHUpLF89bS5jcmVhdGVIcmVmKHkpO3RyeXtsLnB1c2hTdGF0ZSh4LCIiLF8pfWNhdGNoKEUpe2lmKEUgaW5zdGFuY2VvZiBET01FeGNlcHRpb24mJkUubmFtZT09PSJEYXRhQ2xvbmVFcnJvciIpdGhyb3cgRTtvLmxvY2F0aW9uLmFzc2lnbihfKX1pJiZhJiZhKHthY3Rpb246cyxsb2NhdGlvbjptLmxvY2F0aW9uLGRlbHRhOjF9KX1mdW5jdGlvbiBoKFMsdil7cz1sdC5SZXBsYWNlO2xldCB5PVNhKG0ubG9jYXRpb24sUyx2KTtuJiZuKHksUyksdT1jKCk7bGV0IHg9azAoeSx1KSxfPW0uY3JlYXRlSHJlZih5KTtsLnJlcGxhY2VTdGF0ZSh4LCIiLF8pLGkmJmEmJmEoe2FjdGlvbjpzLGxvY2F0aW9uOm0ubG9jYXRpb24sZGVsdGE6MH0pfWZ1bmN0aW9uIGcoUyl7bGV0IHY9by5sb2NhdGlvbi5vcmlnaW4hPT0ibnVsbCI/by5sb2NhdGlvbi5vcmlnaW46by5sb2NhdGlvbi5ocmVmLHk9dHlwZW9mIFM9PSJzdHJpbmciP1M6RmEoUyk7cmV0dXJuIHdlKHYsIk5vIHdpbmRvdy5sb2NhdGlvbi4ob3JpZ2lufGhyZWYpIGF2YWlsYWJsZSB0byBjcmVhdGUgVVJMIGZvciBocmVmOiAiK3kpLG5ldyBVUkwoeSx2KX1sZXQgbT17Z2V0IGFjdGlvbigpe3JldHVybiBzfSxnZXQgbG9jYXRpb24oKXtyZXR1cm4gZShvLGwpfSxsaXN0ZW4oUyl7aWYoYSl0aHJvdyBuZXcgRXJyb3IoIkEgaGlzdG9yeSBvbmx5IGFjY2VwdHMgb25lIGFjdGl2ZSBsaXN0ZW5lciIpO3JldHVybiBvLmFkZEV2ZW50TGlzdGVuZXIoJDAsZCksYT1TLCgpPT57by5yZW1vdmVFdmVudExpc3RlbmVyKCQwLGQpLGE9bnVsbH19LGNyZWF0ZUhyZWYoUyl7cmV0dXJuIHQobyxTKX0sY3JlYXRlVVJMOmcsZW5jb2RlTG9jYXRpb24oUyl7bGV0IHY9ZyhTKTtyZXR1cm57cGF0aG5hbWU6di5wYXRobmFtZSxzZWFyY2g6di5zZWFyY2gsaGFzaDp2Lmhhc2h9fSxwdXNoOmYscmVwbGFjZTpoLGdvKFMpe3JldHVybiBsLmdvKFMpfX07cmV0dXJuIG19dmFyIHN0OyhmdW5jdGlvbihlKXtlLmRhdGE9ImRhdGEiLGUuZGVmZXJyZWQ9ImRlZmVycmVkIixlLnJlZGlyZWN0PSJyZWRpcmVjdCIsZS5lcnJvcj0iZXJyb3IifSkoc3R8fChzdD17fSkpO2NvbnN0IGFNPW5ldyBTZXQoWyJsYXp5IiwiY2FzZVNlbnNpdGl2ZSIsInBhdGgiLCJpZCIsImluZGV4IiwiY2hpbGRyZW4iXSk7ZnVuY3Rpb24gdU0oZSl7cmV0dXJuIGUuaW5kZXg9PT0hMH1mdW5jdGlvbiBFcChlLHQsbixyKXtyZXR1cm4gbj09PXZvaWQgMCYmKG49W10pLHI9PT12b2lkIDAmJihyPXt9KSxlLm1hcCgobyxpKT0+e2xldCBsPVsuLi5uLGldLHM9dHlwZW9mIG8uaWQ9PSJzdHJpbmciP28uaWQ6bC5qb2luKCItIik7aWYod2Uoby5pbmRleCE9PSEwfHwhby5jaGlsZHJlbiwiQ2Fubm90IHNwZWNpZnkgY2hpbGRyZW4gb24gYW4gaW5kZXggcm91dGUiKSx3ZSghcltzXSwnRm91bmQgYSByb3V0ZSBpZCBjb2xsaXNpb24gb24gaWQgIicrcytgIi4gIFJvdXRlIGlkJ3MgbXVzdCBiZSBnbG9iYWxseSB1bmlxdWUgd2l0aGluIERhdGEgUm91dGVyIHVzYWdlc2ApLHVNKG8pKXtsZXQgYT1ydCh7fSxvLHQobykse2lkOnN9KTtyZXR1cm4gcltzXT1hLGF9ZWxzZXtsZXQgYT1ydCh7fSxvLHQobykse2lkOnMsY2hpbGRyZW46dm9pZCAwfSk7cmV0dXJuIHJbc109YSxvLmNoaWxkcmVuJiYoYS5jaGlsZHJlbj1FcChvLmNoaWxkcmVuLHQsbCxyKSksYX19KX1mdW5jdGlvbiBybChlLHQsbil7bj09PXZvaWQgMCYmKG49Ii8iKTtsZXQgcj10eXBlb2YgdD09InN0cmluZyI/SnIodCk6dCxvPUJhKHIucGF0aG5hbWV8fCIvIixuKTtpZihvPT1udWxsKXJldHVybiBudWxsO2xldCBpPXpFKGUpO2RNKGkpO2xldCBsPW51bGw7Zm9yKGxldCBzPTA7bD09bnVsbCYmczxpLmxlbmd0aDsrK3MpbD1fTShpW3NdLEVNKG8pKTtyZXR1cm4gbH1mdW5jdGlvbiBjTShlLHQpe2xldHtyb3V0ZTpuLHBhdGhuYW1lOnIscGFyYW1zOm99PWU7cmV0dXJue2lkOm4uaWQscGF0aG5hbWU6cixwYXJhbXM6byxkYXRhOnRbbi5pZF0saGFuZGxlOm4uaGFuZGxlfX1mdW5jdGlvbiB6RShlLHQsbixyKXt0PT09dm9pZCAwJiYodD1bXSksbj09PXZvaWQgMCYmKG49W10pLHI9PT12b2lkIDAmJihyPSIiKTtsZXQgbz0oaSxsLHMpPT57bGV0IGE9e3JlbGF0aXZlUGF0aDpzPT09dm9pZCAwP2kucGF0aHx8IiI6cyxjYXNlU2Vuc2l0aXZlOmkuY2FzZVNlbnNpdGl2ZT09PSEwLGNoaWxkcmVuSW5kZXg6bCxyb3V0ZTppfTthLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKCIvIikmJih3ZShhLnJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKHIpLCdBYnNvbHV0ZSByb3V0ZSBwYXRoICInK2EucmVsYXRpdmVQYXRoKyciIG5lc3RlZCB1bmRlciBwYXRoICcrKCciJytyKyciIGlzIG5vdCB2YWxpZC4gQW4gYWJzb2x1dGUgY2hpbGQgcm91dGUgcGF0aCAnKSsibXVzdCBzdGFydCB3aXRoIHRoZSBjb21iaW5lZCBwYXRoIG9mIGFsbCBpdHMgcGFyZW50IHJvdXRlcy4iKSxhLnJlbGF0aXZlUGF0aD1hLnJlbGF0aXZlUGF0aC5zbGljZShyLmxlbmd0aCkpO2xldCB1PWtvKFtyLGEucmVsYXRpdmVQYXRoXSksYz1uLmNvbmNhdChhKTtpLmNoaWxkcmVuJiZpLmNoaWxkcmVuLmxlbmd0aD4wJiYod2UoaS5pbmRleCE9PSEwLCJJbmRleCByb3V0ZXMgbXVzdCBub3QgaGF2ZSBjaGlsZCByb3V0ZXMuIFBsZWFzZSByZW1vdmUgIisoJ2FsbCBjaGlsZCByb3V0ZXMgZnJvbSByb3V0ZSBwYXRoICInK3UrJyIuJykpLHpFKGkuY2hpbGRyZW4sdCxjLHUpKSwhKGkucGF0aD09bnVsbCYmIWkuaW5kZXgpJiZ0LnB1c2goe3BhdGg6dSxzY29yZTp5TSh1LGkuaW5kZXgpLHJvdXRlc01ldGE6Y30pfTtyZXR1cm4gZS5mb3JFYWNoKChpLGwpPT57dmFyIHM7aWYoaS5wYXRoPT09IiJ8fCEoKHM9aS5wYXRoKSE9bnVsbCYmcy5pbmNsdWRlcygiPyIpKSlvKGksbCk7ZWxzZSBmb3IobGV0IGEgb2YgRkUoaS5wYXRoKSlvKGksbCxhKX0pLHR9ZnVuY3Rpb24gRkUoZSl7bGV0IHQ9ZS5zcGxpdCgiLyIpO2lmKHQubGVuZ3RoPT09MClyZXR1cm5bXTtsZXRbbiwuLi5yXT10LG89bi5lbmRzV2l0aCgiPyIpLGk9bi5yZXBsYWNlKC9cPyQvLCIiKTtpZihyLmxlbmd0aD09PTApcmV0dXJuIG8/W2ksIiJdOltpXTtsZXQgbD1GRShyLmpvaW4oIi8iKSkscz1bXTtyZXR1cm4gcy5wdXNoKC4uLmwubWFwKGE9PmE9PT0iIj9pOltpLGFdLmpvaW4oIi8iKSkpLG8mJnMucHVzaCguLi5sKSxzLm1hcChhPT5lLnN0YXJ0c1dpdGgoIi8iKSYmYT09PSIiPyIvIjphKX1mdW5jdGlvbiBkTShlKXtlLnNvcnQoKHQsbik9PnQuc2NvcmUhPT1uLnNjb3JlP24uc2NvcmUtdC5zY29yZTp4TSh0LnJvdXRlc01ldGEubWFwKHI9PnIuY2hpbGRyZW5JbmRleCksbi5yb3V0ZXNNZXRhLm1hcChyPT5yLmNoaWxkcmVuSW5kZXgpKSl9Y29uc3QgZk09L146XHcrJC8saE09MyxwTT0yLGdNPTEsbU09MTAsdk09LTIsVDA9ZT0+ZT09PSIqIjtmdW5jdGlvbiB5TShlLHQpe2xldCBuPWUuc3BsaXQoIi8iKSxyPW4ubGVuZ3RoO3JldHVybiBuLnNvbWUoVDApJiYocis9dk0pLHQmJihyKz1wTSksbi5maWx0ZXIobz0+IVQwKG8pKS5yZWR1Y2UoKG8saSk9Pm8rKGZNLnRlc3QoaSk/aE06aT09PSIiP2dNOm1NKSxyKX1mdW5jdGlvbiB4TShlLHQpe3JldHVybiBlLmxlbmd0aD09PXQubGVuZ3RoJiZlLnNsaWNlKDAsLTEpLmV2ZXJ5KChyLG8pPT5yPT09dFtvXSk/ZVtlLmxlbmd0aC0xXS10W3QubGVuZ3RoLTFdOjB9ZnVuY3Rpb24gX00oZSx0KXtsZXR7cm91dGVzTWV0YTpufT1lLHI9e30sbz0iLyIsaT1bXTtmb3IobGV0IGw9MDtsPG4ubGVuZ3RoOysrbCl7bGV0IHM9bltsXSxhPWw9PT1uLmxlbmd0aC0xLHU9bz09PSIvIj90OnQuc2xpY2Uoby5sZW5ndGgpfHwiLyIsYz13TSh7cGF0aDpzLnJlbGF0aXZlUGF0aCxjYXNlU2Vuc2l0aXZlOnMuY2FzZVNlbnNpdGl2ZSxlbmQ6YX0sdSk7aWYoIWMpcmV0dXJuIG51bGw7T2JqZWN0LmFzc2lnbihyLGMucGFyYW1zKTtsZXQgZD1zLnJvdXRlO2kucHVzaCh7cGFyYW1zOnIscGF0aG5hbWU6a28oW28sYy5wYXRobmFtZV0pLHBhdGhuYW1lQmFzZTpUTShrbyhbbyxjLnBhdGhuYW1lQmFzZV0pKSxyb3V0ZTpkfSksYy5wYXRobmFtZUJhc2UhPT0iLyImJihvPWtvKFtvLGMucGF0aG5hbWVCYXNlXSkpfXJldHVybiBpfWZ1bmN0aW9uIHdNKGUsdCl7dHlwZW9mIGU9PSJzdHJpbmciJiYoZT17cGF0aDplLGNhc2VTZW5zaXRpdmU6ITEsZW5kOiEwfSk7bGV0W24scl09U00oZS5wYXRoLGUuY2FzZVNlbnNpdGl2ZSxlLmVuZCksbz10Lm1hdGNoKG4pO2lmKCFvKXJldHVybiBudWxsO2xldCBpPW9bMF0sbD1pLnJlcGxhY2UoLyguKVwvKyQvLCIkMSIpLHM9by5zbGljZSgxKTtyZXR1cm57cGFyYW1zOnIucmVkdWNlKCh1LGMsZCk9PntsZXR7cGFyYW1OYW1lOmYsaXNPcHRpb25hbDpofT1jO2lmKGY9PT0iKiIpe2xldCBtPXNbZF18fCIiO2w9aS5zbGljZSgwLGkubGVuZ3RoLW0ubGVuZ3RoKS5yZXBsYWNlKC8oLilcLyskLywiJDEiKX1jb25zdCBnPXNbZF07cmV0dXJuIGgmJiFnP3VbZl09dm9pZCAwOnVbZl09Q00oZ3x8IiIsZiksdX0se30pLHBhdGhuYW1lOmkscGF0aG5hbWVCYXNlOmwscGF0dGVybjplfX1mdW5jdGlvbiBTTShlLHQsbil7dD09PXZvaWQgMCYmKHQ9ITEpLG49PT12b2lkIDAmJihuPSEwKSx2aShlPT09IioifHwhZS5lbmRzV2l0aCgiKiIpfHxlLmVuZHNXaXRoKCIvKiIpLCdSb3V0ZSBwYXRoICInK2UrJyIgd2lsbCBiZSB0cmVhdGVkIGFzIGlmIGl0IHdlcmUgJysoJyInK2UucmVwbGFjZSgvXCokLywiLyoiKSsnIiBiZWNhdXNlIHRoZSBgKmAgY2hhcmFjdGVyIG11c3QgJykrImFsd2F5cyBmb2xsb3cgYSBgL2AgaW4gdGhlIHBhdHRlcm4uIFRvIGdldCByaWQgb2YgdGhpcyB3YXJuaW5nLCAiKygncGxlYXNlIGNoYW5nZSB0aGUgcm91dGUgcGF0aCB0byAiJytlLnJlcGxhY2UoL1wqJC8sIi8qIikrJyIuJykpO2xldCByPVtdLG89Il4iK2UucmVwbGFjZSgvXC8qXCo/JC8sIiIpLnJlcGxhY2UoL15cLyovLCIvIikucmVwbGFjZSgvW1xcLiorXiR7fXwoKVtcXV0vZywiXFwkJiIpLnJlcGxhY2UoL1wvOihcdyspKFw/KT8vZywobCxzLGEpPT4oci5wdXNoKHtwYXJhbU5hbWU6cyxpc09wdGlvbmFsOmEhPW51bGx9KSxhPyIvPyhbXlxcL10rKT8iOiIvKFteXFwvXSspIikpO3JldHVybiBlLmVuZHNXaXRoKCIqIik/KHIucHVzaCh7cGFyYW1OYW1lOiIqIn0pLG8rPWU9PT0iKiJ8fGU9PT0iLyoiPyIoLiopJCI6Iig/OlxcLyguKyl8XFwvKikkIik6bj9vKz0iXFwvKiQiOmUhPT0iIiYmZSE9PSIvIiYmKG8rPSIoPzooPz1cXC98JCkpIiksW25ldyBSZWdFeHAobyx0P3ZvaWQgMDoiaSIpLHJdfWZ1bmN0aW9uIEVNKGUpe3RyeXtyZXR1cm4gZGVjb2RlVVJJKGUpfWNhdGNoKHQpe3JldHVybiB2aSghMSwnVGhlIFVSTCBwYXRoICInK2UrJyIgY291bGQgbm90IGJlIGRlY29kZWQgYmVjYXVzZSBpdCBpcyBpcyBhIG1hbGZvcm1lZCBVUkwgc2VnbWVudC4gVGhpcyBpcyBwcm9iYWJseSBkdWUgdG8gYSBiYWQgcGVyY2VudCAnKygiZW5jb2RpbmcgKCIrdCsiKS4iKSksZX19ZnVuY3Rpb24gQ00oZSx0KXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaChuKXtyZXR1cm4gdmkoITEsJ1RoZSB2YWx1ZSBmb3IgdGhlIFVSTCBwYXJhbSAiJyt0KyciIHdpbGwgbm90IGJlIGRlY29kZWQgYmVjYXVzZScrKCcgdGhlIHN0cmluZyAiJytlKyciIGlzIGEgbWFsZm9ybWVkIFVSTCBzZWdtZW50LiBUaGlzIGlzIHByb2JhYmx5JykrKCIgZHVlIHRvIGEgYmFkIHBlcmNlbnQgZW5jb2RpbmcgKCIrbisiKS4iKSksZX19ZnVuY3Rpb24gQmEoZSx0KXtpZih0PT09Ii8iKXJldHVybiBlO2lmKCFlLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCh0LnRvTG93ZXJDYXNlKCkpKXJldHVybiBudWxsO2xldCBuPXQuZW5kc1dpdGgoIi8iKT90Lmxlbmd0aC0xOnQubGVuZ3RoLHI9ZS5jaGFyQXQobik7cmV0dXJuIHImJnIhPT0iLyI/bnVsbDplLnNsaWNlKG4pfHwiLyJ9ZnVuY3Rpb24gJE0oZSx0KXt0PT09dm9pZCAwJiYodD0iLyIpO2xldHtwYXRobmFtZTpuLHNlYXJjaDpyPSIiLGhhc2g6bz0iIn09dHlwZW9mIGU9PSJzdHJpbmciP0pyKGUpOmU7cmV0dXJue3BhdGhuYW1lOm4/bi5zdGFydHNXaXRoKCIvIik/bjprTShuLHQpOnQsc2VhcmNoOk5NKHIpLGhhc2g6Yk0obyl9fWZ1bmN0aW9uIGtNKGUsdCl7bGV0IG49dC5yZXBsYWNlKC9cLyskLywiIikuc3BsaXQoIi8iKTtyZXR1cm4gZS5zcGxpdCgiLyIpLmZvckVhY2gobz0+e289PT0iLi4iP24ubGVuZ3RoPjEmJm4ucG9wKCk6byE9PSIuIiYmbi5wdXNoKG8pfSksbi5sZW5ndGg+MT9uLmpvaW4oIi8iKToiLyJ9ZnVuY3Rpb24gUGYoZSx0LG4scil7cmV0dXJuIkNhbm5vdCBpbmNsdWRlIGEgJyIrZSsiJyBjaGFyYWN0ZXIgaW4gYSBtYW51YWxseSBzcGVjaWZpZWQgIisoImB0by4iK3QrImAgZmllbGQgWyIrSlNPTi5zdHJpbmdpZnkocikrIl0uICBQbGVhc2Ugc2VwYXJhdGUgaXQgb3V0IHRvIHRoZSAiKSsoImB0by4iK24rImAgZmllbGQuIEFsdGVybmF0aXZlbHkgeW91IG1heSBwcm92aWRlIHRoZSBmdWxsIHBhdGggYXMgIikrJ2Egc3RyaW5nIGluIDxMaW5rIHRvPSIuLi4iPiBhbmQgdGhlIHJvdXRlciB3aWxsIHBhcnNlIGl0IGZvciB5b3UuJ31mdW5jdGlvbiAkbShlKXtyZXR1cm4gZS5maWx0ZXIoKHQsbik9Pm49PT0wfHx0LnJvdXRlLnBhdGgmJnQucm91dGUucGF0aC5sZW5ndGg+MCl9ZnVuY3Rpb24gQkUoZSx0LG4scil7cj09PXZvaWQgMCYmKHI9ITEpO2xldCBvO3R5cGVvZiBlPT0ic3RyaW5nIj9vPUpyKGUpOihvPXJ0KHt9LGUpLHdlKCFvLnBhdGhuYW1lfHwhby5wYXRobmFtZS5pbmNsdWRlcygiPyIpLFBmKCI/IiwicGF0aG5hbWUiLCJzZWFyY2giLG8pKSx3ZSghby5wYXRobmFtZXx8IW8ucGF0aG5hbWUuaW5jbHVkZXMoIiMiKSxQZigiIyIsInBhdGhuYW1lIiwiaGFzaCIsbykpLHdlKCFvLnNlYXJjaHx8IW8uc2VhcmNoLmluY2x1ZGVzKCIjIiksUGYoIiMiLCJzZWFyY2giLCJoYXNoIixvKSkpO2xldCBpPWU9PT0iInx8by5wYXRobmFtZT09PSIiLGw9aT8iLyI6by5wYXRobmFtZSxzO2lmKHJ8fGw9PW51bGwpcz1uO2Vsc2V7bGV0IGQ9dC5sZW5ndGgtMTtpZihsLnN0YXJ0c1dpdGgoIi4uIikpe2xldCBmPWwuc3BsaXQoIi8iKTtmb3IoO2ZbMF09PT0iLi4iOylmLnNoaWZ0KCksZC09MTtvLnBhdGhuYW1lPWYuam9pbigiLyIpfXM9ZD49MD90W2RdOiIvIn1sZXQgYT0kTShvLHMpLHU9bCYmbCE9PSIvIiYmbC5lbmRzV2l0aCgiLyIpLGM9KGl8fGw9PT0iLiIpJiZuLmVuZHNXaXRoKCIvIik7cmV0dXJuIWEucGF0aG5hbWUuZW5kc1dpdGgoIi8iKSYmKHV8fGMpJiYoYS5wYXRobmFtZSs9Ii8iKSxhfWNvbnN0IGtvPWU9PmUuam9pbigiLyIpLnJlcGxhY2UoL1wvXC8rL2csIi8iKSxUTT1lPT5lLnJlcGxhY2UoL1wvKyQvLCIiKS5yZXBsYWNlKC9eXC8qLywiLyIpLE5NPWU9PiFlfHxlPT09Ij8iPyIiOmUuc3RhcnRzV2l0aCgiPyIpP2U6Ij8iK2UsYk09ZT0+IWV8fGU9PT0iIyI/IiI6ZS5zdGFydHNXaXRoKCIjIik/ZToiIyIrZTtjbGFzcyBrbXtjb25zdHJ1Y3Rvcih0LG4scixvKXtvPT09dm9pZCAwJiYobz0hMSksdGhpcy5zdGF0dXM9dCx0aGlzLnN0YXR1c1RleHQ9bnx8IiIsdGhpcy5pbnRlcm5hbD1vLHIgaW5zdGFuY2VvZiBFcnJvcj8odGhpcy5kYXRhPXIudG9TdHJpbmcoKSx0aGlzLmVycm9yPXIpOnRoaXMuZGF0YT1yfX1mdW5jdGlvbiBXRShlKXtyZXR1cm4gZSE9bnVsbCYmdHlwZW9mIGUuc3RhdHVzPT0ibnVtYmVyIiYmdHlwZW9mIGUuc3RhdHVzVGV4dD09InN0cmluZyImJnR5cGVvZiBlLmludGVybmFsPT0iYm9vbGVhbiImJiJkYXRhImluIGV9Y29uc3QgVUU9WyJwb3N0IiwicHV0IiwicGF0Y2giLCJkZWxldGUiXSxSTT1uZXcgU2V0KFVFKSxQTT1bImdldCIsLi4uVUVdLE9NPW5ldyBTZXQoUE0pLEFNPW5ldyBTZXQoWzMwMSwzMDIsMzAzLDMwNywzMDhdKSxNTT1uZXcgU2V0KFszMDcsMzA4XSksT2Y9e3N0YXRlOiJpZGxlIixsb2NhdGlvbjp2b2lkIDAsZm9ybU1ldGhvZDp2b2lkIDAsZm9ybUFjdGlvbjp2b2lkIDAsZm9ybUVuY1R5cGU6dm9pZCAwLGZvcm1EYXRhOnZvaWQgMCxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMH0sRE09e3N0YXRlOiJpZGxlIixkYXRhOnZvaWQgMCxmb3JtTWV0aG9kOnZvaWQgMCxmb3JtQWN0aW9uOnZvaWQgMCxmb3JtRW5jVHlwZTp2b2lkIDAsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfSxjcz17c3RhdGU6InVuYmxvY2tlZCIscHJvY2VlZDp2b2lkIDAscmVzZXQ6dm9pZCAwLGxvY2F0aW9uOnZvaWQgMH0sVkU9L14oPzpbYS16XVthLXowLTkrLi1dKjp8XC9cLykvaSxMTT1lPT4oe2hhc0Vycm9yQm91bmRhcnk6ISFlLmhhc0Vycm9yQm91bmRhcnl9KSxIRT0icmVtaXgtcm91dGVyLXRyYW5zaXRpb25zIjtmdW5jdGlvbiBJTShlKXtjb25zdCB0PWUud2luZG93P2Uud2luZG93OnR5cGVvZiB3aW5kb3c8InUiP3dpbmRvdzp2b2lkIDAsbj10eXBlb2YgdDwidSImJnR5cGVvZiB0LmRvY3VtZW50PCJ1IiYmdHlwZW9mIHQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudDwidSIscj0hbjt3ZShlLnJvdXRlcy5sZW5ndGg+MCwiWW91IG11c3QgcHJvdmlkZSBhIG5vbi1lbXB0eSByb3V0ZXMgYXJyYXkgdG8gY3JlYXRlUm91dGVyIik7bGV0IG87aWYoZS5tYXBSb3V0ZVByb3BlcnRpZXMpbz1lLm1hcFJvdXRlUHJvcGVydGllcztlbHNlIGlmKGUuZGV0ZWN0RXJyb3JCb3VuZGFyeSl7bGV0IE49ZS5kZXRlY3RFcnJvckJvdW5kYXJ5O289QT0+KHtoYXNFcnJvckJvdW5kYXJ5Ok4oQSl9KX1lbHNlIG89TE07bGV0IGk9e30sbD1FcChlLnJvdXRlcyxvLHZvaWQgMCxpKSxzLGE9ZS5iYXNlbmFtZXx8Ii8iLHU9cnQoe3Y3X2ZldGNoZXJQZXJzaXN0OiExLHY3X25vcm1hbGl6ZUZvcm1NZXRob2Q6ITEsdjdfcHJlcGVuZEJhc2VuYW1lOiExfSxlLmZ1dHVyZSksYz1udWxsLGQ9bmV3IFNldCxmPW51bGwsaD1udWxsLGc9bnVsbCxtPWUuaHlkcmF0aW9uRGF0YSE9bnVsbCxTPXJsKGwsZS5oaXN0b3J5LmxvY2F0aW9uLGEpLHY9bnVsbDtpZihTPT1udWxsKXtsZXQgTj1Sbig0MDQse3BhdGhuYW1lOmUuaGlzdG9yeS5sb2NhdGlvbi5wYXRobmFtZX0pLHttYXRjaGVzOkEscm91dGU6en09RDAobCk7Uz1BLHY9e1t6LmlkXTpOfX1sZXQgeT0hUy5zb21lKE49Pk4ucm91dGUubGF6eSkmJighUy5zb21lKE49Pk4ucm91dGUubG9hZGVyKXx8ZS5oeWRyYXRpb25EYXRhIT1udWxsKSx4LF89e2hpc3RvcnlBY3Rpb246ZS5oaXN0b3J5LmFjdGlvbixsb2NhdGlvbjplLmhpc3RvcnkubG9jYXRpb24sbWF0Y2hlczpTLGluaXRpYWxpemVkOnksbmF2aWdhdGlvbjpPZixyZXN0b3JlU2Nyb2xsUG9zaXRpb246ZS5oeWRyYXRpb25EYXRhIT1udWxsPyExOm51bGwscHJldmVudFNjcm9sbFJlc2V0OiExLHJldmFsaWRhdGlvbjoiaWRsZSIsbG9hZGVyRGF0YTplLmh5ZHJhdGlvbkRhdGEmJmUuaHlkcmF0aW9uRGF0YS5sb2FkZXJEYXRhfHx7fSxhY3Rpb25EYXRhOmUuaHlkcmF0aW9uRGF0YSYmZS5oeWRyYXRpb25EYXRhLmFjdGlvbkRhdGF8fG51bGwsZXJyb3JzOmUuaHlkcmF0aW9uRGF0YSYmZS5oeWRyYXRpb25EYXRhLmVycm9yc3x8dixmZXRjaGVyczpuZXcgTWFwLGJsb2NrZXJzOm5ldyBNYXB9LEU9bHQuUG9wLCQ9ITEsQyxUPSExLE09bmV3IE1hcCxSPW51bGwsaj0hMSxGPSExLGFlPVtdLEg9W10sWD1uZXcgTWFwLFA9MCxPPS0xLGs9bmV3IE1hcCxJPW5ldyBTZXQsTD1uZXcgTWFwLFY9bmV3IE1hcCx0ZT1uZXcgU2V0LHllPW5ldyBNYXAsZmU9bmV3IE1hcCxPZT0hMTtmdW5jdGlvbiBiZSgpe2lmKGM9ZS5oaXN0b3J5Lmxpc3RlbihOPT57bGV0e2FjdGlvbjpBLGxvY2F0aW9uOnosZGVsdGE6R309TjtpZihPZSl7T2U9ITE7cmV0dXJufXZpKGZlLnNpemU9PT0wfHxHIT1udWxsLCJZb3UgYXJlIHRyeWluZyB0byB1c2UgYSBibG9ja2VyIG9uIGEgUE9QIG5hdmlnYXRpb24gdG8gYSBsb2NhdGlvbiB0aGF0IHdhcyBub3QgY3JlYXRlZCBieSBAcmVtaXgtcnVuL3JvdXRlci4gVGhpcyB3aWxsIGZhaWwgc2lsZW50bHkgaW4gcHJvZHVjdGlvbi4gVGhpcyBjYW4gaGFwcGVuIGlmIHlvdSBhcmUgbmF2aWdhdGluZyBvdXRzaWRlIHRoZSByb3V0ZXIgdmlhIGB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGVgL2B3aW5kb3cubG9jYXRpb24uaGFzaGAgaW5zdGVhZCBvZiB1c2luZyByb3V0ZXIgbmF2aWdhdGlvbiBBUElzLiAgVGhpcyBjYW4gYWxzbyBoYXBwZW4gaWYgeW91IGFyZSB1c2luZyBjcmVhdGVIYXNoUm91dGVyIGFuZCB0aGUgdXNlciBtYW51YWxseSBjaGFuZ2VzIHRoZSBVUkwuIik7bGV0IGllPUxtKHtjdXJyZW50TG9jYXRpb246Xy5sb2NhdGlvbixuZXh0TG9jYXRpb246eixoaXN0b3J5QWN0aW9uOkF9KTtpZihpZSYmRyE9bnVsbCl7T2U9ITAsZS5oaXN0b3J5LmdvKEcqLTEpLFVhKGllLHtzdGF0ZToiYmxvY2tlZCIsbG9jYXRpb246eixwcm9jZWVkKCl7VWEoaWUse3N0YXRlOiJwcm9jZWVkaW5nIixwcm9jZWVkOnZvaWQgMCxyZXNldDp2b2lkIDAsbG9jYXRpb246en0pLGUuaGlzdG9yeS5nbyhHKX0scmVzZXQoKXtsZXQgbGU9bmV3IE1hcChfLmJsb2NrZXJzKTtsZS5zZXQoaWUsY3MpLGNlKHtibG9ja2VyczpsZX0pfX0pO3JldHVybn1yZXR1cm4gQmUoQSx6KX0pLG4pe1lNKHQsTSk7bGV0IE49KCk9PlhNKHQsTSk7dC5hZGRFdmVudExpc3RlbmVyKCJwYWdlaGlkZSIsTiksUj0oKT0+dC5yZW1vdmVFdmVudExpc3RlbmVyKCJwYWdlaGlkZSIsTil9cmV0dXJuIF8uaW5pdGlhbGl6ZWR8fEJlKGx0LlBvcCxfLmxvY2F0aW9uKSx4fWZ1bmN0aW9uIFooKXtjJiZjKCksUiYmUigpLGQuY2xlYXIoKSxDJiZDLmFib3J0KCksXy5mZXRjaGVycy5mb3JFYWNoKChOLEEpPT5PdChBKSksXy5ibG9ja2Vycy5mb3JFYWNoKChOLEEpPT5EbShBKSl9ZnVuY3Rpb24ga2UoTil7cmV0dXJuIGQuYWRkKE4pLCgpPT5kLmRlbGV0ZShOKX1mdW5jdGlvbiBjZShOLEEpe189cnQoe30sXyxOKTtsZXQgej1bXSxHPVtdO3UudjdfZmV0Y2hlclBlcnNpc3QmJl8uZmV0Y2hlcnMuZm9yRWFjaCgoaWUsbGUpPT57aWUuc3RhdGU9PT0iaWRsZSImJih0ZS5oYXMobGUpP0cucHVzaChsZSk6ei5wdXNoKGxlKSl9KSxkLmZvckVhY2goaWU9PmllKF8se2RlbGV0ZWRGZXRjaGVyczpHLHVuc3RhYmxlX3ZpZXdUcmFuc2l0aW9uT3B0czpBfSkpLHUudjdfZmV0Y2hlclBlcnNpc3QmJih6LmZvckVhY2goaWU9Pl8uZmV0Y2hlcnMuZGVsZXRlKGllKSksRy5mb3JFYWNoKGllPT5PdChpZSkpKX1mdW5jdGlvbiBfZShOLEEpe3ZhciB6LEc7bGV0IGllPV8uYWN0aW9uRGF0YSE9bnVsbCYmXy5uYXZpZ2F0aW9uLmZvcm1NZXRob2QhPW51bGwmJlluKF8ubmF2aWdhdGlvbi5mb3JtTWV0aG9kKSYmXy5uYXZpZ2F0aW9uLnN0YXRlPT09ImxvYWRpbmciJiYoKHo9Ti5zdGF0ZSk9PW51bGw/dm9pZCAwOnouX2lzUmVkaXJlY3QpIT09ITAsbGU7QS5hY3Rpb25EYXRhP09iamVjdC5rZXlzKEEuYWN0aW9uRGF0YSkubGVuZ3RoPjA/bGU9QS5hY3Rpb25EYXRhOmxlPW51bGw6aWU/bGU9Xy5hY3Rpb25EYXRhOmxlPW51bGw7bGV0IGhlPUEubG9hZGVyRGF0YT9NMChfLmxvYWRlckRhdGEsQS5sb2FkZXJEYXRhLEEubWF0Y2hlc3x8W10sQS5lcnJvcnMpOl8ubG9hZGVyRGF0YSxzZT1fLmJsb2NrZXJzO3NlLnNpemU+MCYmKHNlPW5ldyBNYXAoc2UpLHNlLmZvckVhY2goKFFlLEVlKT0+c2Uuc2V0KEVlLGNzKSkpO2xldCBvZT0kPT09ITB8fF8ubmF2aWdhdGlvbi5mb3JtTWV0aG9kIT1udWxsJiZZbihfLm5hdmlnYXRpb24uZm9ybU1ldGhvZCkmJigoRz1OLnN0YXRlKT09bnVsbD92b2lkIDA6Ry5faXNSZWRpcmVjdCkhPT0hMDtzJiYobD1zLHM9dm9pZCAwKSxqfHxFPT09bHQuUG9wfHwoRT09PWx0LlB1c2g/ZS5oaXN0b3J5LnB1c2goTixOLnN0YXRlKTpFPT09bHQuUmVwbGFjZSYmZS5oaXN0b3J5LnJlcGxhY2UoTixOLnN0YXRlKSk7bGV0IExlO2lmKEU9PT1sdC5Qb3Ape2xldCBRZT1NLmdldChfLmxvY2F0aW9uLnBhdGhuYW1lKTtRZSYmUWUuaGFzKE4ucGF0aG5hbWUpP0xlPXtjdXJyZW50TG9jYXRpb246Xy5sb2NhdGlvbixuZXh0TG9jYXRpb246Tn06TS5oYXMoTi5wYXRobmFtZSkmJihMZT17Y3VycmVudExvY2F0aW9uOk4sbmV4dExvY2F0aW9uOl8ubG9jYXRpb259KX1lbHNlIGlmKFQpe2xldCBRZT1NLmdldChfLmxvY2F0aW9uLnBhdGhuYW1lKTtRZT9RZS5hZGQoTi5wYXRobmFtZSk6KFFlPW5ldyBTZXQoW04ucGF0aG5hbWVdKSxNLnNldChfLmxvY2F0aW9uLnBhdGhuYW1lLFFlKSksTGU9e2N1cnJlbnRMb2NhdGlvbjpfLmxvY2F0aW9uLG5leHRMb2NhdGlvbjpOfX1jZShydCh7fSxBLHthY3Rpb25EYXRhOmxlLGxvYWRlckRhdGE6aGUsaGlzdG9yeUFjdGlvbjpFLGxvY2F0aW9uOk4saW5pdGlhbGl6ZWQ6ITAsbmF2aWdhdGlvbjpPZixyZXZhbGlkYXRpb246ImlkbGUiLHJlc3RvcmVTY3JvbGxQb3NpdGlvbjpqbShOLEEubWF0Y2hlc3x8Xy5tYXRjaGVzKSxwcmV2ZW50U2Nyb2xsUmVzZXQ6b2UsYmxvY2tlcnM6c2V9KSxMZSksRT1sdC5Qb3AsJD0hMSxUPSExLGo9ITEsRj0hMSxhZT1bXSxIPVtdfWFzeW5jIGZ1bmN0aW9uIG1lKE4sQSl7aWYodHlwZW9mIE49PSJudW1iZXIiKXtlLmhpc3RvcnkuZ28oTik7cmV0dXJufWxldCB6PUNwKF8ubG9jYXRpb24sXy5tYXRjaGVzLGEsdS52N19wcmVwZW5kQmFzZW5hbWUsTixBPT1udWxsP3ZvaWQgMDpBLmZyb21Sb3V0ZUlkLEE9PW51bGw/dm9pZCAwOkEucmVsYXRpdmUpLHtwYXRoOkcsc3VibWlzc2lvbjppZSxlcnJvcjpsZX09TjAodS52N19ub3JtYWxpemVGb3JtTWV0aG9kLCExLHosQSksaGU9Xy5sb2NhdGlvbixzZT1TYShfLmxvY2F0aW9uLEcsQSYmQS5zdGF0ZSk7c2U9cnQoe30sc2UsZS5oaXN0b3J5LmVuY29kZUxvY2F0aW9uKHNlKSk7bGV0IG9lPUEmJkEucmVwbGFjZSE9bnVsbD9BLnJlcGxhY2U6dm9pZCAwLExlPWx0LlB1c2g7b2U9PT0hMD9MZT1sdC5SZXBsYWNlOm9lPT09ITF8fGllIT1udWxsJiZZbihpZS5mb3JtTWV0aG9kKSYmaWUuZm9ybUFjdGlvbj09PV8ubG9jYXRpb24ucGF0aG5hbWUrXy5sb2NhdGlvbi5zZWFyY2gmJihMZT1sdC5SZXBsYWNlKTtsZXQgUWU9QSYmInByZXZlbnRTY3JvbGxSZXNldCJpbiBBP0EucHJldmVudFNjcm9sbFJlc2V0PT09ITA6dm9pZCAwLEVlPUxtKHtjdXJyZW50TG9jYXRpb246aGUsbmV4dExvY2F0aW9uOnNlLGhpc3RvcnlBY3Rpb246TGV9KTtpZihFZSl7VWEoRWUse3N0YXRlOiJibG9ja2VkIixsb2NhdGlvbjpzZSxwcm9jZWVkKCl7VWEoRWUse3N0YXRlOiJwcm9jZWVkaW5nIixwcm9jZWVkOnZvaWQgMCxyZXNldDp2b2lkIDAsbG9jYXRpb246c2V9KSxtZShOLEEpfSxyZXNldCgpe2xldCBJZT1uZXcgTWFwKF8uYmxvY2tlcnMpO0llLnNldChFZSxjcyksY2Uoe2Jsb2NrZXJzOkllfSl9fSk7cmV0dXJufXJldHVybiBhd2FpdCBCZShMZSxzZSx7c3VibWlzc2lvbjppZSxwZW5kaW5nRXJyb3I6bGUscHJldmVudFNjcm9sbFJlc2V0OlFlLHJlcGxhY2U6QSYmQS5yZXBsYWNlLGVuYWJsZVZpZXdUcmFuc2l0aW9uOkEmJkEudW5zdGFibGVfdmlld1RyYW5zaXRpb259KX1mdW5jdGlvbiAkZSgpe2lmKEl0KCksY2Uoe3JldmFsaWRhdGlvbjoibG9hZGluZyJ9KSxfLm5hdmlnYXRpb24uc3RhdGUhPT0ic3VibWl0dGluZyIpe2lmKF8ubmF2aWdhdGlvbi5zdGF0ZT09PSJpZGxlIil7QmUoXy5oaXN0b3J5QWN0aW9uLF8ubG9jYXRpb24se3N0YXJ0VW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbjohMH0pO3JldHVybn1CZShFfHxfLmhpc3RvcnlBY3Rpb24sXy5uYXZpZ2F0aW9uLmxvY2F0aW9uLHtvdmVycmlkZU5hdmlnYXRpb246Xy5uYXZpZ2F0aW9ufSl9fWFzeW5jIGZ1bmN0aW9uIEJlKE4sQSx6KXtDJiZDLmFib3J0KCksQz1udWxsLEU9TixqPSh6JiZ6LnN0YXJ0VW5pbnRlcnJ1cHRlZFJldmFsaWRhdGlvbik9PT0hMCx3QyhfLmxvY2F0aW9uLF8ubWF0Y2hlcyksJD0oeiYmei5wcmV2ZW50U2Nyb2xsUmVzZXQpPT09ITAsVD0oeiYmei5lbmFibGVWaWV3VHJhbnNpdGlvbik9PT0hMDtsZXQgRz1zfHxsLGllPXomJnoub3ZlcnJpZGVOYXZpZ2F0aW9uLGxlPXJsKEcsQSxhKTtpZighbGUpe2xldCBJZT1Sbig0MDQse3BhdGhuYW1lOkEucGF0aG5hbWV9KSx7bWF0Y2hlczpwdCxyb3V0ZTpVb309RDAoRyk7T2QoKSxfZShBLHttYXRjaGVzOnB0LGxvYWRlckRhdGE6e30sZXJyb3JzOntbVW8uaWRdOkllfX0pO3JldHVybn1pZihfLmluaXRpYWxpemVkJiYhRiYmV00oXy5sb2NhdGlvbixBKSYmISh6JiZ6LnN1Ym1pc3Npb24mJlluKHouc3VibWlzc2lvbi5mb3JtTWV0aG9kKSkpe19lKEEse21hdGNoZXM6bGV9KTtyZXR1cm59Qz1uZXcgQWJvcnRDb250cm9sbGVyO2xldCBoZT1mcyhlLmhpc3RvcnksQSxDLnNpZ25hbCx6JiZ6LnN1Ym1pc3Npb24pLHNlLG9lO2lmKHomJnoucGVuZGluZ0Vycm9yKW9lPXtbVXMobGUpLnJvdXRlLmlkXTp6LnBlbmRpbmdFcnJvcn07ZWxzZSBpZih6JiZ6LnN1Ym1pc3Npb24mJlluKHouc3VibWlzc2lvbi5mb3JtTWV0aG9kKSl7bGV0IEllPWF3YWl0IFB0KGhlLEEsei5zdWJtaXNzaW9uLGxlLHtyZXBsYWNlOnoucmVwbGFjZX0pO2lmKEllLnNob3J0Q2lyY3VpdGVkKXJldHVybjtzZT1JZS5wZW5kaW5nQWN0aW9uRGF0YSxvZT1JZS5wZW5kaW5nQWN0aW9uRXJyb3IsaWU9QWYoQSx6LnN1Ym1pc3Npb24pLGhlPW5ldyBSZXF1ZXN0KGhlLnVybCx7c2lnbmFsOmhlLnNpZ25hbH0pfWxldHtzaG9ydENpcmN1aXRlZDpMZSxsb2FkZXJEYXRhOlFlLGVycm9yczpFZX09YXdhaXQgc24oaGUsQSxsZSxpZSx6JiZ6LnN1Ym1pc3Npb24seiYmei5mZXRjaGVyU3VibWlzc2lvbix6JiZ6LnJlcGxhY2Usc2Usb2UpO0xlfHwoQz1udWxsLF9lKEEscnQoe21hdGNoZXM6bGV9LHNlP3thY3Rpb25EYXRhOnNlfTp7fSx7bG9hZGVyRGF0YTpRZSxlcnJvcnM6RWV9KSkpfWFzeW5jIGZ1bmN0aW9uIFB0KE4sQSx6LEcsaWUpe2llPT09dm9pZCAwJiYoaWU9e30pLEl0KCk7bGV0IGxlPUtNKEEseik7Y2Uoe25hdmlnYXRpb246bGV9KTtsZXQgaGUsc2U9a3AoRyxBKTtpZighc2Uucm91dGUuYWN0aW9uJiYhc2Uucm91dGUubGF6eSloZT17dHlwZTpzdC5lcnJvcixlcnJvcjpSbig0MDUse21ldGhvZDpOLm1ldGhvZCxwYXRobmFtZTpBLnBhdGhuYW1lLHJvdXRlSWQ6c2Uucm91dGUuaWR9KX07ZWxzZSBpZihoZT1hd2FpdCBkcygiYWN0aW9uIixOLHNlLEcsaSxvLGEpLE4uc2lnbmFsLmFib3J0ZWQpcmV0dXJue3Nob3J0Q2lyY3VpdGVkOiEwfTtpZihwbChoZSkpe2xldCBvZTtyZXR1cm4gaWUmJmllLnJlcGxhY2UhPW51bGw/b2U9aWUucmVwbGFjZTpvZT1oZS5sb2NhdGlvbj09PV8ubG9jYXRpb24ucGF0aG5hbWUrXy5sb2NhdGlvbi5zZWFyY2gsYXdhaXQgX3QoXyxoZSx7c3VibWlzc2lvbjp6LHJlcGxhY2U6b2V9KSx7c2hvcnRDaXJjdWl0ZWQ6ITB9fWlmKFZzKGhlKSl7bGV0IG9lPVVzKEcsc2Uucm91dGUuaWQpO3JldHVybihpZSYmaWUucmVwbGFjZSkhPT0hMCYmKEU9bHQuUHVzaCkse3BlbmRpbmdBY3Rpb25EYXRhOnt9LHBlbmRpbmdBY3Rpb25FcnJvcjp7W29lLnJvdXRlLmlkXTpoZS5lcnJvcn19fWlmKGVpKGhlKSl0aHJvdyBSbig0MDAse3R5cGU6ImRlZmVyLWFjdGlvbiJ9KTtyZXR1cm57cGVuZGluZ0FjdGlvbkRhdGE6e1tzZS5yb3V0ZS5pZF06aGUuZGF0YX19fWFzeW5jIGZ1bmN0aW9uIHNuKE4sQSx6LEcsaWUsbGUsaGUsc2Usb2Upe2xldCBMZT1HfHxBZihBLGllKSxRZT1pZXx8bGV8fGowKExlKSxFZT1zfHxsLFtJZSxwdF09YjAoZS5oaXN0b3J5LF8seixRZSxBLEYsYWUsSCxMLEksRWUsYSxzZSxvZSk7aWYoT2QoQWU9PiEoeiYmei5zb21lKFduPT5Xbi5yb3V0ZS5pZD09PUFlKSl8fEllJiZJZS5zb21lKFduPT5Xbi5yb3V0ZS5pZD09PUFlKSksTz0rK1AsSWUubGVuZ3RoPT09MCYmcHQubGVuZ3RoPT09MCl7bGV0IEFlPWlyKCk7cmV0dXJuIF9lKEEscnQoe21hdGNoZXM6eixsb2FkZXJEYXRhOnt9LGVycm9yczpvZXx8bnVsbH0sc2U/e2FjdGlvbkRhdGE6c2V9Ont9LEFlP3tmZXRjaGVyczpuZXcgTWFwKF8uZmV0Y2hlcnMpfTp7fSkpLHtzaG9ydENpcmN1aXRlZDohMH19aWYoIWope3B0LmZvckVhY2goV249PntsZXQgcXI9Xy5mZXRjaGVycy5nZXQoV24ua2V5KSxpdD1ocyh2b2lkIDAscXI/cXIuZGF0YTp2b2lkIDApO18uZmV0Y2hlcnMuc2V0KFduLmtleSxpdCl9KTtsZXQgQWU9c2V8fF8uYWN0aW9uRGF0YTtjZShydCh7bmF2aWdhdGlvbjpMZX0sQWU/T2JqZWN0LmtleXMoQWUpLmxlbmd0aD09PTA/e2FjdGlvbkRhdGE6bnVsbH06e2FjdGlvbkRhdGE6QWV9Ont9LHB0Lmxlbmd0aD4wP3tmZXRjaGVyczpuZXcgTWFwKF8uZmV0Y2hlcnMpfTp7fSkpfXB0LmZvckVhY2goQWU9PntYLmhhcyhBZS5rZXkpJiZqdChBZS5rZXkpLEFlLmNvbnRyb2xsZXImJlguc2V0KEFlLmtleSxBZS5jb250cm9sbGVyKX0pO2xldCBVbz0oKT0+cHQuZm9yRWFjaChBZT0+anQoQWUua2V5KSk7QyYmQy5zaWduYWwuYWRkRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFVvKTtsZXR7cmVzdWx0czpWbyxsb2FkZXJSZXN1bHRzOkpsLGZldGNoZXJSZXN1bHRzOkFkfT1hd2FpdCBnbihfLm1hdGNoZXMseixJZSxwdCxOKTtpZihOLnNpZ25hbC5hYm9ydGVkKXJldHVybntzaG9ydENpcmN1aXRlZDohMH07QyYmQy5zaWduYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcigiYWJvcnQiLFVvKSxwdC5mb3JFYWNoKEFlPT5YLmRlbGV0ZShBZS5rZXkpKTtsZXQga3I9TDAoVm8pO2lmKGtyKXtpZihrci5pZHg+PUllLmxlbmd0aCl7bGV0IEFlPXB0W2tyLmlkeC1JZS5sZW5ndGhdLmtleTtJLmFkZChBZSl9cmV0dXJuIGF3YWl0IF90KF8sa3IucmVzdWx0LHtyZXBsYWNlOmhlfSkse3Nob3J0Q2lyY3VpdGVkOiEwfX1sZXR7bG9hZGVyRGF0YTpacixlcnJvcnM6VmF9PUEwKF8seixJZSxKbCxvZSxwdCxBZCx5ZSk7eWUuZm9yRWFjaCgoQWUsV24pPT57QWUuc3Vic2NyaWJlKHFyPT57KHFyfHxBZS5kb25lKSYmeWUuZGVsZXRlKFduKX0pfSk7bGV0IE1kPWlyKCksRGQ9V28oTyksTGQ9TWR8fERkfHxwdC5sZW5ndGg+MDtyZXR1cm4gcnQoe2xvYWRlckRhdGE6WnIsZXJyb3JzOlZhfSxMZD97ZmV0Y2hlcnM6bmV3IE1hcChfLmZldGNoZXJzKX06e30pfWZ1bmN0aW9uIGJuKE4pe3JldHVybiB1LnY3X2ZldGNoZXJQZXJzaXN0JiYoVi5zZXQoTiwoVi5nZXQoTil8fDApKzEpLHRlLmhhcyhOKSYmdGUuZGVsZXRlKE4pKSxfLmZldGNoZXJzLmdldChOKXx8RE19ZnVuY3Rpb24gVGUoTixBLHosRyl7aWYocil0aHJvdyBuZXcgRXJyb3IoInJvdXRlci5mZXRjaCgpIHdhcyBjYWxsZWQgZHVyaW5nIHRoZSBzZXJ2ZXIgcmVuZGVyLCBidXQgaXQgc2hvdWxkbid0IGJlLiBZb3UgYXJlIGxpa2VseSBjYWxsaW5nIGEgdXNlRmV0Y2hlcigpIG1ldGhvZCBpbiB0aGUgYm9keSBvZiB5b3VyIGNvbXBvbmVudC4gVHJ5IG1vdmluZyBpdCB0byBhIHVzZUVmZmVjdCBvciBhIGNhbGxiYWNrLiIpO1guaGFzKE4pJiZqdChOKTtsZXQgaWU9c3x8bCxsZT1DcChfLmxvY2F0aW9uLF8ubWF0Y2hlcyxhLHUudjdfcHJlcGVuZEJhc2VuYW1lLHosQSxHPT1udWxsP3ZvaWQgMDpHLnJlbGF0aXZlKSxoZT1ybChpZSxsZSxhKTtpZighaGUpe3d0KE4sQSxSbig0MDQse3BhdGhuYW1lOmxlfSkpO3JldHVybn1sZXR7cGF0aDpzZSxzdWJtaXNzaW9uOm9lLGVycm9yOkxlfT1OMCh1LnY3X25vcm1hbGl6ZUZvcm1NZXRob2QsITAsbGUsRyk7aWYoTGUpe3d0KE4sQSxMZSk7cmV0dXJufWxldCBRZT1rcChoZSxzZSk7aWYoJD0oRyYmRy5wcmV2ZW50U2Nyb2xsUmVzZXQpPT09ITAsb2UmJlluKG9lLmZvcm1NZXRob2QpKXtmdChOLEEsc2UsUWUsaGUsb2UpO3JldHVybn1MLnNldChOLHtyb3V0ZUlkOkEscGF0aDpzZX0pLGh0KE4sQSxzZSxRZSxoZSxvZSl9YXN5bmMgZnVuY3Rpb24gZnQoTixBLHosRyxpZSxsZSl7aWYoSXQoKSxMLmRlbGV0ZShOKSwhRy5yb3V0ZS5hY3Rpb24mJiFHLnJvdXRlLmxhenkpe2xldCBpdD1Sbig0MDUse21ldGhvZDpsZS5mb3JtTWV0aG9kLHBhdGhuYW1lOnoscm91dGVJZDpBfSk7d3QoTixBLGl0KTtyZXR1cm59bGV0IGhlPV8uZmV0Y2hlcnMuZ2V0KE4pLHNlPUdNKGxlLGhlKTtfLmZldGNoZXJzLnNldChOLHNlKSxjZSh7ZmV0Y2hlcnM6bmV3IE1hcChfLmZldGNoZXJzKX0pO2xldCBvZT1uZXcgQWJvcnRDb250cm9sbGVyLExlPWZzKGUuaGlzdG9yeSx6LG9lLnNpZ25hbCxsZSk7WC5zZXQoTixvZSk7bGV0IFFlPVAsRWU9YXdhaXQgZHMoImFjdGlvbiIsTGUsRyxpZSxpLG8sYSk7aWYoTGUuc2lnbmFsLmFib3J0ZWQpe1guZ2V0KE4pPT09b2UmJlguZGVsZXRlKE4pO3JldHVybn1pZih0ZS5oYXMoTikpe18uZmV0Y2hlcnMuc2V0KE4saW8odm9pZCAwKSksY2Uoe2ZldGNoZXJzOm5ldyBNYXAoXy5mZXRjaGVycyl9KTtyZXR1cm59aWYocGwoRWUpKWlmKFguZGVsZXRlKE4pLE8+UWUpe2xldCBpdD1pbyh2b2lkIDApO18uZmV0Y2hlcnMuc2V0KE4saXQpLGNlKHtmZXRjaGVyczpuZXcgTWFwKF8uZmV0Y2hlcnMpfSk7cmV0dXJufWVsc2V7SS5hZGQoTik7bGV0IGl0PWhzKGxlKTtyZXR1cm4gXy5mZXRjaGVycy5zZXQoTixpdCksY2Uoe2ZldGNoZXJzOm5ldyBNYXAoXy5mZXRjaGVycyl9KSxfdChfLEVlLHtmZXRjaGVyU3VibWlzc2lvbjpsZX0pfWlmKFZzKEVlKSl7d3QoTixBLEVlLmVycm9yKTtyZXR1cm59aWYoZWkoRWUpKXRocm93IFJuKDQwMCx7dHlwZToiZGVmZXItYWN0aW9uIn0pO2xldCBJZT1fLm5hdmlnYXRpb24ubG9jYXRpb258fF8ubG9jYXRpb24scHQ9ZnMoZS5oaXN0b3J5LEllLG9lLnNpZ25hbCksVW89c3x8bCxWbz1fLm5hdmlnYXRpb24uc3RhdGUhPT0iaWRsZSI/cmwoVW8sXy5uYXZpZ2F0aW9uLmxvY2F0aW9uLGEpOl8ubWF0Y2hlczt3ZShWbywiRGlkbid0IGZpbmQgYW55IG1hdGNoZXMgYWZ0ZXIgZmV0Y2hlciBhY3Rpb24iKTtsZXQgSmw9KytQO2suc2V0KE4sSmwpO2xldCBBZD1ocyhsZSxFZS5kYXRhKTtfLmZldGNoZXJzLnNldChOLEFkKTtsZXRba3IsWnJdPWIwKGUuaGlzdG9yeSxfLFZvLGxlLEllLEYsYWUsSCxMLEksVW8sYSx7W0cucm91dGUuaWRdOkVlLmRhdGF9LHZvaWQgMCk7WnIuZmlsdGVyKGl0PT5pdC5rZXkhPT1OKS5mb3JFYWNoKGl0PT57bGV0IFpsPWl0LmtleSx6bT1fLmZldGNoZXJzLmdldChabCksRUM9aHModm9pZCAwLHptP3ptLmRhdGE6dm9pZCAwKTtfLmZldGNoZXJzLnNldChabCxFQyksWC5oYXMoWmwpJiZqdChabCksaXQuY29udHJvbGxlciYmWC5zZXQoWmwsaXQuY29udHJvbGxlcil9KSxjZSh7ZmV0Y2hlcnM6bmV3IE1hcChfLmZldGNoZXJzKX0pO2xldCBWYT0oKT0+WnIuZm9yRWFjaChpdD0+anQoaXQua2V5KSk7b2Uuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoImFib3J0IixWYSk7bGV0e3Jlc3VsdHM6TWQsbG9hZGVyUmVzdWx0czpEZCxmZXRjaGVyUmVzdWx0czpMZH09YXdhaXQgZ24oXy5tYXRjaGVzLFZvLGtyLFpyLHB0KTtpZihvZS5zaWduYWwuYWJvcnRlZClyZXR1cm47b2Uuc2lnbmFsLnJlbW92ZUV2ZW50TGlzdGVuZXIoImFib3J0IixWYSksay5kZWxldGUoTiksWC5kZWxldGUoTiksWnIuZm9yRWFjaChpdD0+WC5kZWxldGUoaXQua2V5KSk7bGV0IEFlPUwwKE1kKTtpZihBZSl7aWYoQWUuaWR4Pj1rci5sZW5ndGgpe2xldCBpdD1acltBZS5pZHgta3IubGVuZ3RoXS5rZXk7SS5hZGQoaXQpfXJldHVybiBfdChfLEFlLnJlc3VsdCl9bGV0e2xvYWRlckRhdGE6V24sZXJyb3JzOnFyfT1BMChfLF8ubWF0Y2hlcyxrcixEZCx2b2lkIDAsWnIsTGQseWUpO2lmKF8uZmV0Y2hlcnMuaGFzKE4pKXtsZXQgaXQ9aW8oRWUuZGF0YSk7Xy5mZXRjaGVycy5zZXQoTixpdCl9V28oSmwpLF8ubmF2aWdhdGlvbi5zdGF0ZT09PSJsb2FkaW5nIiYmSmw+Tz8od2UoRSwiRXhwZWN0ZWQgcGVuZGluZyBhY3Rpb24iKSxDJiZDLmFib3J0KCksX2UoXy5uYXZpZ2F0aW9uLmxvY2F0aW9uLHttYXRjaGVzOlZvLGxvYWRlckRhdGE6V24sZXJyb3JzOnFyLGZldGNoZXJzOm5ldyBNYXAoXy5mZXRjaGVycyl9KSk6KGNlKHtlcnJvcnM6cXIsbG9hZGVyRGF0YTpNMChfLmxvYWRlckRhdGEsV24sVm8scXIpLGZldGNoZXJzOm5ldyBNYXAoXy5mZXRjaGVycyl9KSxGPSExKX1hc3luYyBmdW5jdGlvbiBodChOLEEseixHLGllLGxlKXtsZXQgaGU9Xy5mZXRjaGVycy5nZXQoTiksc2U9aHMobGUsaGU/aGUuZGF0YTp2b2lkIDApO18uZmV0Y2hlcnMuc2V0KE4sc2UpLGNlKHtmZXRjaGVyczpuZXcgTWFwKF8uZmV0Y2hlcnMpfSk7bGV0IG9lPW5ldyBBYm9ydENvbnRyb2xsZXIsTGU9ZnMoZS5oaXN0b3J5LHosb2Uuc2lnbmFsKTtYLnNldChOLG9lKTtsZXQgUWU9UCxFZT1hd2FpdCBkcygibG9hZGVyIixMZSxHLGllLGksbyxhKTtpZihlaShFZSkmJihFZT1hd2FpdCBZRShFZSxMZS5zaWduYWwsITApfHxFZSksWC5nZXQoTik9PT1vZSYmWC5kZWxldGUoTiksTGUuc2lnbmFsLmFib3J0ZWQpcmV0dXJuO2lmKHRlLmhhcyhOKSl7Xy5mZXRjaGVycy5zZXQoTixpbyh2b2lkIDApKSxjZSh7ZmV0Y2hlcnM6bmV3IE1hcChfLmZldGNoZXJzKX0pO3JldHVybn1pZihwbChFZSkpaWYoTz5RZSl7bGV0IHB0PWlvKHZvaWQgMCk7Xy5mZXRjaGVycy5zZXQoTixwdCksY2Uoe2ZldGNoZXJzOm5ldyBNYXAoXy5mZXRjaGVycyl9KTtyZXR1cm59ZWxzZXtJLmFkZChOKSxhd2FpdCBfdChfLEVlKTtyZXR1cm59aWYoVnMoRWUpKXt3dChOLEEsRWUuZXJyb3IpO3JldHVybn13ZSghZWkoRWUpLCJVbmhhbmRsZWQgZmV0Y2hlciBkZWZlcnJlZCBkYXRhIik7bGV0IEllPWlvKEVlLmRhdGEpO18uZmV0Y2hlcnMuc2V0KE4sSWUpLGNlKHtmZXRjaGVyczpuZXcgTWFwKF8uZmV0Y2hlcnMpfSl9YXN5bmMgZnVuY3Rpb24gX3QoTixBLHope2xldHtzdWJtaXNzaW9uOkcsZmV0Y2hlclN1Ym1pc3Npb246aWUscmVwbGFjZTpsZX09ej09PXZvaWQgMD97fTp6O0EucmV2YWxpZGF0ZSYmKEY9ITApO2xldCBoZT1TYShOLmxvY2F0aW9uLEEubG9jYXRpb24se19pc1JlZGlyZWN0OiEwfSk7aWYod2UoaGUsIkV4cGVjdGVkIGEgbG9jYXRpb24gb24gdGhlIHJlZGlyZWN0IG5hdmlnYXRpb24iKSxuKXtsZXQgSWU9ITE7aWYoQS5yZWxvYWREb2N1bWVudClJZT0hMDtlbHNlIGlmKFZFLnRlc3QoQS5sb2NhdGlvbikpe2NvbnN0IHB0PWUuaGlzdG9yeS5jcmVhdGVVUkwoQS5sb2NhdGlvbik7SWU9cHQub3JpZ2luIT09dC5sb2NhdGlvbi5vcmlnaW58fEJhKHB0LnBhdGhuYW1lLGEpPT1udWxsfWlmKEllKXtsZT90LmxvY2F0aW9uLnJlcGxhY2UoQS5sb2NhdGlvbik6dC5sb2NhdGlvbi5hc3NpZ24oQS5sb2NhdGlvbik7cmV0dXJufX1DPW51bGw7bGV0IHNlPWxlPT09ITA/bHQuUmVwbGFjZTpsdC5QdXNoLHtmb3JtTWV0aG9kOm9lLGZvcm1BY3Rpb246TGUsZm9ybUVuY1R5cGU6UWV9PU4ubmF2aWdhdGlvbjshRyYmIWllJiZvZSYmTGUmJlFlJiYoRz1qMChOLm5hdmlnYXRpb24pKTtsZXQgRWU9R3x8aWU7aWYoTU0uaGFzKEEuc3RhdHVzKSYmRWUmJlluKEVlLmZvcm1NZXRob2QpKWF3YWl0IEJlKHNlLGhlLHtzdWJtaXNzaW9uOnJ0KHt9LEVlLHtmb3JtQWN0aW9uOkEubG9jYXRpb259KSxwcmV2ZW50U2Nyb2xsUmVzZXQ6JH0pO2Vsc2V7bGV0IEllPUFmKGhlLEcpO2F3YWl0IEJlKHNlLGhlLHtvdmVycmlkZU5hdmlnYXRpb246SWUsZmV0Y2hlclN1Ym1pc3Npb246aWUscHJldmVudFNjcm9sbFJlc2V0OiR9KX19YXN5bmMgZnVuY3Rpb24gZ24oTixBLHosRyxpZSl7bGV0IGxlPWF3YWl0IFByb21pc2UuYWxsKFsuLi56Lm1hcChvZT0+ZHMoImxvYWRlciIsaWUsb2UsQSxpLG8sYSkpLC4uLkcubWFwKG9lPT5vZS5tYXRjaGVzJiZvZS5tYXRjaCYmb2UuY29udHJvbGxlcj9kcygibG9hZGVyIixmcyhlLmhpc3Rvcnksb2UucGF0aCxvZS5jb250cm9sbGVyLnNpZ25hbCksb2UubWF0Y2gsb2UubWF0Y2hlcyxpLG8sYSk6e3R5cGU6c3QuZXJyb3IsZXJyb3I6Um4oNDA0LHtwYXRobmFtZTpvZS5wYXRofSl9KV0pLGhlPWxlLnNsaWNlKDAsei5sZW5ndGgpLHNlPWxlLnNsaWNlKHoubGVuZ3RoKTtyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoW0kwKE4seixoZSxoZS5tYXAoKCk9PmllLnNpZ25hbCksITEsXy5sb2FkZXJEYXRhKSxJMChOLEcubWFwKG9lPT5vZS5tYXRjaCksc2UsRy5tYXAob2U9Pm9lLmNvbnRyb2xsZXI/b2UuY29udHJvbGxlci5zaWduYWw6bnVsbCksITApXSkse3Jlc3VsdHM6bGUsbG9hZGVyUmVzdWx0czpoZSxmZXRjaGVyUmVzdWx0czpzZX19ZnVuY3Rpb24gSXQoKXtGPSEwLGFlLnB1c2goLi4uT2QoKSksTC5mb3JFYWNoKChOLEEpPT57WC5oYXMoQSkmJihILnB1c2goQSksanQoQSkpfSl9ZnVuY3Rpb24gd3QoTixBLHope2xldCBHPVVzKF8ubWF0Y2hlcyxBKTtPdChOKSxjZSh7ZXJyb3JzOntbRy5yb3V0ZS5pZF06en0sZmV0Y2hlcnM6bmV3IE1hcChfLmZldGNoZXJzKX0pfWZ1bmN0aW9uIE90KE4pe2xldCBBPV8uZmV0Y2hlcnMuZ2V0KE4pO1guaGFzKE4pJiYhKEEmJkEuc3RhdGU9PT0ibG9hZGluZyImJmsuaGFzKE4pKSYmanQoTiksTC5kZWxldGUoTiksay5kZWxldGUoTiksSS5kZWxldGUoTiksdGUuZGVsZXRlKE4pLF8uZmV0Y2hlcnMuZGVsZXRlKE4pfWZ1bmN0aW9uIG9yKE4pe2lmKHUudjdfZmV0Y2hlclBlcnNpc3Qpe2xldCBBPShWLmdldChOKXx8MCktMTtBPD0wPyhWLmRlbGV0ZShOKSx0ZS5hZGQoTikpOlYuc2V0KE4sQSl9ZWxzZSBPdChOKTtjZSh7ZmV0Y2hlcnM6bmV3IE1hcChfLmZldGNoZXJzKX0pfWZ1bmN0aW9uIGp0KE4pe2xldCBBPVguZ2V0KE4pO3dlKEEsIkV4cGVjdGVkIGZldGNoIGNvbnRyb2xsZXI6ICIrTiksQS5hYm9ydCgpLFguZGVsZXRlKE4pfWZ1bmN0aW9uIHp0KE4pe2ZvcihsZXQgQSBvZiBOKXtsZXQgej1ibihBKSxHPWlvKHouZGF0YSk7Xy5mZXRjaGVycy5zZXQoQSxHKX19ZnVuY3Rpb24gaXIoKXtsZXQgTj1bXSxBPSExO2ZvcihsZXQgeiBvZiBJKXtsZXQgRz1fLmZldGNoZXJzLmdldCh6KTt3ZShHLCJFeHBlY3RlZCBmZXRjaGVyOiAiK3opLEcuc3RhdGU9PT0ibG9hZGluZyImJihJLmRlbGV0ZSh6KSxOLnB1c2goeiksQT0hMCl9cmV0dXJuIHp0KE4pLEF9ZnVuY3Rpb24gV28oTil7bGV0IEE9W107Zm9yKGxldFt6LEddb2YgaylpZihHPE4pe2xldCBpZT1fLmZldGNoZXJzLmdldCh6KTt3ZShpZSwiRXhwZWN0ZWQgZmV0Y2hlcjogIit6KSxpZS5zdGF0ZT09PSJsb2FkaW5nIiYmKGp0KHopLGsuZGVsZXRlKHopLEEucHVzaCh6KSl9cmV0dXJuIHp0KEEpLEEubGVuZ3RoPjB9ZnVuY3Rpb24gV2EoTixBKXtsZXQgej1fLmJsb2NrZXJzLmdldChOKXx8Y3M7cmV0dXJuIGZlLmdldChOKSE9PUEmJmZlLnNldChOLEEpLHp9ZnVuY3Rpb24gRG0oTil7Xy5ibG9ja2Vycy5kZWxldGUoTiksZmUuZGVsZXRlKE4pfWZ1bmN0aW9uIFVhKE4sQSl7bGV0IHo9Xy5ibG9ja2Vycy5nZXQoTil8fGNzO3dlKHouc3RhdGU9PT0idW5ibG9ja2VkIiYmQS5zdGF0ZT09PSJibG9ja2VkInx8ei5zdGF0ZT09PSJibG9ja2VkIiYmQS5zdGF0ZT09PSJibG9ja2VkInx8ei5zdGF0ZT09PSJibG9ja2VkIiYmQS5zdGF0ZT09PSJwcm9jZWVkaW5nInx8ei5zdGF0ZT09PSJibG9ja2VkIiYmQS5zdGF0ZT09PSJ1bmJsb2NrZWQifHx6LnN0YXRlPT09InByb2NlZWRpbmciJiZBLnN0YXRlPT09InVuYmxvY2tlZCIsIkludmFsaWQgYmxvY2tlciBzdGF0ZSB0cmFuc2l0aW9uOiAiK3ouc3RhdGUrIiAtPiAiK0Euc3RhdGUpO2xldCBHPW5ldyBNYXAoXy5ibG9ja2Vycyk7Ry5zZXQoTixBKSxjZSh7YmxvY2tlcnM6R30pfWZ1bmN0aW9uIExtKE4pe2xldHtjdXJyZW50TG9jYXRpb246QSxuZXh0TG9jYXRpb246eixoaXN0b3J5QWN0aW9uOkd9PU47aWYoZmUuc2l6ZT09PTApcmV0dXJuO2ZlLnNpemU+MSYmdmkoITEsIkEgcm91dGVyIG9ubHkgc3VwcG9ydHMgb25lIGJsb2NrZXIgYXQgYSB0aW1lIik7bGV0IGllPUFycmF5LmZyb20oZmUuZW50cmllcygpKSxbbGUsaGVdPWllW2llLmxlbmd0aC0xXSxzZT1fLmJsb2NrZXJzLmdldChsZSk7aWYoIShzZSYmc2Uuc3RhdGU9PT0icHJvY2VlZGluZyIpJiZoZSh7Y3VycmVudExvY2F0aW9uOkEsbmV4dExvY2F0aW9uOnosaGlzdG9yeUFjdGlvbjpHfSkpcmV0dXJuIGxlfWZ1bmN0aW9uIE9kKE4pe2xldCBBPVtdO3JldHVybiB5ZS5mb3JFYWNoKCh6LEcpPT57KCFOfHxOKEcpKSYmKHouY2FuY2VsKCksQS5wdXNoKEcpLHllLmRlbGV0ZShHKSl9KSxBfWZ1bmN0aW9uIF9DKE4sQSx6KXtpZihmPU4sZz1BLGg9enx8bnVsbCwhbSYmXy5uYXZpZ2F0aW9uPT09T2Ype209ITA7bGV0IEc9am0oXy5sb2NhdGlvbixfLm1hdGNoZXMpO0chPW51bGwmJmNlKHtyZXN0b3JlU2Nyb2xsUG9zaXRpb246R30pfXJldHVybigpPT57Zj1udWxsLGc9bnVsbCxoPW51bGx9fWZ1bmN0aW9uIEltKE4sQSl7cmV0dXJuIGgmJmgoTixBLm1hcChHPT5jTShHLF8ubG9hZGVyRGF0YSkpKXx8Ti5rZXl9ZnVuY3Rpb24gd0MoTixBKXtpZihmJiZnKXtsZXQgej1JbShOLEEpO2Zbel09ZygpfX1mdW5jdGlvbiBqbShOLEEpe2lmKGYpe2xldCB6PUltKE4sQSksRz1mW3pdO2lmKHR5cGVvZiBHPT0ibnVtYmVyIilyZXR1cm4gR31yZXR1cm4gbnVsbH1mdW5jdGlvbiBTQyhOKXtpPXt9LHM9RXAoTixvLHZvaWQgMCxpKX1yZXR1cm4geD17Z2V0IGJhc2VuYW1lKCl7cmV0dXJuIGF9LGdldCBzdGF0ZSgpe3JldHVybiBffSxnZXQgcm91dGVzKCl7cmV0dXJuIGx9LGdldCB3aW5kb3coKXtyZXR1cm4gdH0saW5pdGlhbGl6ZTpiZSxzdWJzY3JpYmU6a2UsZW5hYmxlU2Nyb2xsUmVzdG9yYXRpb246X0MsbmF2aWdhdGU6bWUsZmV0Y2g6VGUscmV2YWxpZGF0ZTokZSxjcmVhdGVIcmVmOk49PmUuaGlzdG9yeS5jcmVhdGVIcmVmKE4pLGVuY29kZUxvY2F0aW9uOk49PmUuaGlzdG9yeS5lbmNvZGVMb2NhdGlvbihOKSxnZXRGZXRjaGVyOmJuLGRlbGV0ZUZldGNoZXI6b3IsZGlzcG9zZTpaLGdldEJsb2NrZXI6V2EsZGVsZXRlQmxvY2tlcjpEbSxfaW50ZXJuYWxGZXRjaENvbnRyb2xsZXJzOlgsX2ludGVybmFsQWN0aXZlRGVmZXJyZWRzOnllLF9pbnRlcm5hbFNldFJvdXRlczpTQ30seH1mdW5jdGlvbiBqTShlKXtyZXR1cm4gZSE9bnVsbCYmKCJmb3JtRGF0YSJpbiBlJiZlLmZvcm1EYXRhIT1udWxsfHwiYm9keSJpbiBlJiZlLmJvZHkhPT12b2lkIDApfWZ1bmN0aW9uIENwKGUsdCxuLHIsbyxpLGwpe2xldCBzLGE7aWYoaSE9bnVsbCYmbCE9PSJwYXRoIil7cz1bXTtmb3IobGV0IGMgb2YgdClpZihzLnB1c2goYyksYy5yb3V0ZS5pZD09PWkpe2E9YzticmVha319ZWxzZSBzPXQsYT10W3QubGVuZ3RoLTFdO2xldCB1PUJFKG98fCIuIiwkbShzKS5tYXAoYz0+Yy5wYXRobmFtZUJhc2UpLEJhKGUucGF0aG5hbWUsbil8fGUucGF0aG5hbWUsbD09PSJwYXRoIik7cmV0dXJuIG89PW51bGwmJih1LnNlYXJjaD1lLnNlYXJjaCx1Lmhhc2g9ZS5oYXNoKSwobz09bnVsbHx8bz09PSIifHxvPT09Ii4iKSYmYSYmYS5yb3V0ZS5pbmRleCYmIVRtKHUuc2VhcmNoKSYmKHUuc2VhcmNoPXUuc2VhcmNoP3Uuc2VhcmNoLnJlcGxhY2UoL15cPy8sIj9pbmRleCYiKToiP2luZGV4IiksciYmbiE9PSIvIiYmKHUucGF0aG5hbWU9dS5wYXRobmFtZT09PSIvIj9uOmtvKFtuLHUucGF0aG5hbWVdKSksRmEodSl9ZnVuY3Rpb24gTjAoZSx0LG4scil7aWYoIXJ8fCFqTShyKSlyZXR1cm57cGF0aDpufTtpZihyLmZvcm1NZXRob2QmJiFITShyLmZvcm1NZXRob2QpKXJldHVybntwYXRoOm4sZXJyb3I6Um4oNDA1LHttZXRob2Q6ci5mb3JtTWV0aG9kfSl9O2xldCBvPSgpPT4oe3BhdGg6bixlcnJvcjpSbig0MDAse3R5cGU6ImludmFsaWQtYm9keSJ9KX0pLGk9ci5mb3JtTWV0aG9kfHwiZ2V0IixsPWU/aS50b1VwcGVyQ2FzZSgpOmkudG9Mb3dlckNhc2UoKSxzPUdFKG4pO2lmKHIuYm9keSE9PXZvaWQgMCl7aWYoci5mb3JtRW5jVHlwZT09PSJ0ZXh0L3BsYWluIil7aWYoIVluKGwpKXJldHVybiBvKCk7bGV0IGY9dHlwZW9mIHIuYm9keT09InN0cmluZyI/ci5ib2R5OnIuYm9keSBpbnN0YW5jZW9mIEZvcm1EYXRhfHxyLmJvZHkgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM/QXJyYXkuZnJvbShyLmJvZHkuZW50cmllcygpKS5yZWR1Y2UoKGgsZyk9PntsZXRbbSxTXT1nO3JldHVybiIiK2grbSsiPSIrUytgCmB9LCIiKTpTdHJpbmcoci5ib2R5KTtyZXR1cm57cGF0aDpuLHN1Ym1pc3Npb246e2Zvcm1NZXRob2Q6bCxmb3JtQWN0aW9uOnMsZm9ybUVuY1R5cGU6ci5mb3JtRW5jVHlwZSxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDpmfX19ZWxzZSBpZihyLmZvcm1FbmNUeXBlPT09ImFwcGxpY2F0aW9uL2pzb24iKXtpZighWW4obCkpcmV0dXJuIG8oKTt0cnl7bGV0IGY9dHlwZW9mIHIuYm9keT09InN0cmluZyI/SlNPTi5wYXJzZShyLmJvZHkpOnIuYm9keTtyZXR1cm57cGF0aDpuLHN1Ym1pc3Npb246e2Zvcm1NZXRob2Q6bCxmb3JtQWN0aW9uOnMsZm9ybUVuY1R5cGU6ci5mb3JtRW5jVHlwZSxmb3JtRGF0YTp2b2lkIDAsanNvbjpmLHRleHQ6dm9pZCAwfX19Y2F0Y2h7cmV0dXJuIG8oKX19fXdlKHR5cGVvZiBGb3JtRGF0YT09ImZ1bmN0aW9uIiwiRm9ybURhdGEgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGlzIGVudmlyb25tZW50Iik7bGV0IGEsdTtpZihyLmZvcm1EYXRhKWE9JHAoci5mb3JtRGF0YSksdT1yLmZvcm1EYXRhO2Vsc2UgaWYoci5ib2R5IGluc3RhbmNlb2YgRm9ybURhdGEpYT0kcChyLmJvZHkpLHU9ci5ib2R5O2Vsc2UgaWYoci5ib2R5IGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zKWE9ci5ib2R5LHU9TzAoYSk7ZWxzZSBpZihyLmJvZHk9PW51bGwpYT1uZXcgVVJMU2VhcmNoUGFyYW1zLHU9bmV3IEZvcm1EYXRhO2Vsc2UgdHJ5e2E9bmV3IFVSTFNlYXJjaFBhcmFtcyhyLmJvZHkpLHU9TzAoYSl9Y2F0Y2h7cmV0dXJuIG8oKX1sZXQgYz17Zm9ybU1ldGhvZDpsLGZvcm1BY3Rpb246cyxmb3JtRW5jVHlwZTpyJiZyLmZvcm1FbmNUeXBlfHwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIixmb3JtRGF0YTp1LGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfTtpZihZbihjLmZvcm1NZXRob2QpKXJldHVybntwYXRoOm4sc3VibWlzc2lvbjpjfTtsZXQgZD1KcihuKTtyZXR1cm4gdCYmZC5zZWFyY2gmJlRtKGQuc2VhcmNoKSYmYS5hcHBlbmQoImluZGV4IiwiIiksZC5zZWFyY2g9Ij8iK2Ese3BhdGg6RmEoZCksc3VibWlzc2lvbjpjfX1mdW5jdGlvbiB6TShlLHQpe2xldCBuPWU7aWYodCl7bGV0IHI9ZS5maW5kSW5kZXgobz0+by5yb3V0ZS5pZD09PXQpO3I+PTAmJihuPWUuc2xpY2UoMCxyKSl9cmV0dXJuIG59ZnVuY3Rpb24gYjAoZSx0LG4scixvLGksbCxzLGEsdSxjLGQsZixoKXtsZXQgZz1oP09iamVjdC52YWx1ZXMoaClbMF06Zj9PYmplY3QudmFsdWVzKGYpWzBdOnZvaWQgMCxtPWUuY3JlYXRlVVJMKHQubG9jYXRpb24pLFM9ZS5jcmVhdGVVUkwobyksdj1oP09iamVjdC5rZXlzKGgpWzBdOnZvaWQgMCx4PXpNKG4sdikuZmlsdGVyKChFLCQpPT57aWYoRS5yb3V0ZS5sYXp5KXJldHVybiEwO2lmKEUucm91dGUubG9hZGVyPT1udWxsKXJldHVybiExO2lmKEZNKHQubG9hZGVyRGF0YSx0Lm1hdGNoZXNbJF0sRSl8fGwuc29tZShNPT5NPT09RS5yb3V0ZS5pZCkpcmV0dXJuITA7bGV0IEM9dC5tYXRjaGVzWyRdLFQ9RTtyZXR1cm4gUjAoRSxydCh7Y3VycmVudFVybDptLGN1cnJlbnRQYXJhbXM6Qy5wYXJhbXMsbmV4dFVybDpTLG5leHRQYXJhbXM6VC5wYXJhbXN9LHIse2FjdGlvblJlc3VsdDpnLGRlZmF1bHRTaG91bGRSZXZhbGlkYXRlOml8fG0ucGF0aG5hbWUrbS5zZWFyY2g9PT1TLnBhdGhuYW1lK1Muc2VhcmNofHxtLnNlYXJjaCE9PVMuc2VhcmNofHxLRShDLFQpfSkpfSksXz1bXTtyZXR1cm4gYS5mb3JFYWNoKChFLCQpPT57aWYoIW4uc29tZShqPT5qLnJvdXRlLmlkPT09RS5yb3V0ZUlkKSlyZXR1cm47bGV0IEM9cmwoYyxFLnBhdGgsZCk7aWYoIUMpe18ucHVzaCh7a2V5OiQscm91dGVJZDpFLnJvdXRlSWQscGF0aDpFLnBhdGgsbWF0Y2hlczpudWxsLG1hdGNoOm51bGwsY29udHJvbGxlcjpudWxsfSk7cmV0dXJufWxldCBUPXQuZmV0Y2hlcnMuZ2V0KCQpLE09a3AoQyxFLnBhdGgpLFI9ITE7dS5oYXMoJCk/Uj0hMTpzLmluY2x1ZGVzKCQpP1I9ITA6VCYmVC5zdGF0ZSE9PSJpZGxlIiYmVC5kYXRhPT09dm9pZCAwP1I9aTpSPVIwKE0scnQoe2N1cnJlbnRVcmw6bSxjdXJyZW50UGFyYW1zOnQubWF0Y2hlc1t0Lm1hdGNoZXMubGVuZ3RoLTFdLnBhcmFtcyxuZXh0VXJsOlMsbmV4dFBhcmFtczpuW24ubGVuZ3RoLTFdLnBhcmFtc30scix7YWN0aW9uUmVzdWx0OmcsZGVmYXVsdFNob3VsZFJldmFsaWRhdGU6aX0pKSxSJiZfLnB1c2goe2tleTokLHJvdXRlSWQ6RS5yb3V0ZUlkLHBhdGg6RS5wYXRoLG1hdGNoZXM6QyxtYXRjaDpNLGNvbnRyb2xsZXI6bmV3IEFib3J0Q29udHJvbGxlcn0pfSksW3gsX119ZnVuY3Rpb24gRk0oZSx0LG4pe2xldCByPSF0fHxuLnJvdXRlLmlkIT09dC5yb3V0ZS5pZCxvPWVbbi5yb3V0ZS5pZF09PT12b2lkIDA7cmV0dXJuIHJ8fG99ZnVuY3Rpb24gS0UoZSx0KXtsZXQgbj1lLnJvdXRlLnBhdGg7cmV0dXJuIGUucGF0aG5hbWUhPT10LnBhdGhuYW1lfHxuIT1udWxsJiZuLmVuZHNXaXRoKCIqIikmJmUucGFyYW1zWyIqIl0hPT10LnBhcmFtc1siKiJdfWZ1bmN0aW9uIFIwKGUsdCl7aWYoZS5yb3V0ZS5zaG91bGRSZXZhbGlkYXRlKXtsZXQgbj1lLnJvdXRlLnNob3VsZFJldmFsaWRhdGUodCk7aWYodHlwZW9mIG49PSJib29sZWFuIilyZXR1cm4gbn1yZXR1cm4gdC5kZWZhdWx0U2hvdWxkUmV2YWxpZGF0ZX1hc3luYyBmdW5jdGlvbiBQMChlLHQsbil7aWYoIWUubGF6eSlyZXR1cm47bGV0IHI9YXdhaXQgZS5sYXp5KCk7aWYoIWUubGF6eSlyZXR1cm47bGV0IG89bltlLmlkXTt3ZShvLCJObyByb3V0ZSBmb3VuZCBpbiBtYW5pZmVzdCIpO2xldCBpPXt9O2ZvcihsZXQgbCBpbiByKXtsZXQgYT1vW2xdIT09dm9pZCAwJiZsIT09Imhhc0Vycm9yQm91bmRhcnkiO3ZpKCFhLCdSb3V0ZSAiJytvLmlkKyciIGhhcyBhIHN0YXRpYyBwcm9wZXJ0eSAiJytsKyciIGRlZmluZWQgYnV0IGl0cyBsYXp5IGZ1bmN0aW9uIGlzIGFsc28gcmV0dXJuaW5nIGEgdmFsdWUgZm9yIHRoaXMgcHJvcGVydHkuICcrKCdUaGUgbGF6eSByb3V0ZSBwcm9wZXJ0eSAiJytsKyciIHdpbGwgYmUgaWdub3JlZC4nKSksIWEmJiFhTS5oYXMobCkmJihpW2xdPXJbbF0pfU9iamVjdC5hc3NpZ24obyxpKSxPYmplY3QuYXNzaWduKG8scnQoe30sdChvKSx7bGF6eTp2b2lkIDB9KSl9YXN5bmMgZnVuY3Rpb24gZHMoZSx0LG4scixvLGksbCxzKXtzPT09dm9pZCAwJiYocz17fSk7bGV0IGEsdSxjLGQ9Zz0+e2xldCBtLFM9bmV3IFByb21pc2UoKHYseSk9Pm09eSk7cmV0dXJuIGM9KCk9Pm0oKSx0LnNpZ25hbC5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsYyksUHJvbWlzZS5yYWNlKFtnKHtyZXF1ZXN0OnQscGFyYW1zOm4ucGFyYW1zLGNvbnRleHQ6cy5yZXF1ZXN0Q29udGV4dH0pLFNdKX07dHJ5e2xldCBnPW4ucm91dGVbZV07aWYobi5yb3V0ZS5sYXp5KWlmKGcpe2xldCBtLFM9YXdhaXQgUHJvbWlzZS5hbGwoW2QoZykuY2F0Y2godj0+e209dn0pLFAwKG4ucm91dGUsaSxvKV0pO2lmKG0pdGhyb3cgbTt1PVNbMF19ZWxzZSBpZihhd2FpdCBQMChuLnJvdXRlLGksbyksZz1uLnJvdXRlW2VdLGcpdT1hd2FpdCBkKGcpO2Vsc2UgaWYoZT09PSJhY3Rpb24iKXtsZXQgbT1uZXcgVVJMKHQudXJsKSxTPW0ucGF0aG5hbWUrbS5zZWFyY2g7dGhyb3cgUm4oNDA1LHttZXRob2Q6dC5tZXRob2QscGF0aG5hbWU6Uyxyb3V0ZUlkOm4ucm91dGUuaWR9KX1lbHNlIHJldHVybnt0eXBlOnN0LmRhdGEsZGF0YTp2b2lkIDB9O2Vsc2UgaWYoZyl1PWF3YWl0IGQoZyk7ZWxzZXtsZXQgbT1uZXcgVVJMKHQudXJsKSxTPW0ucGF0aG5hbWUrbS5zZWFyY2g7dGhyb3cgUm4oNDA0LHtwYXRobmFtZTpTfSl9d2UodSE9PXZvaWQgMCwiWW91IGRlZmluZWQgIisoZT09PSJhY3Rpb24iPyJhbiBhY3Rpb24iOiJhIGxvYWRlciIpKyIgZm9yIHJvdXRlICIrKCciJytuLnJvdXRlLmlkKyJcIiBidXQgZGlkbid0IHJldHVybiBhbnl0aGluZyBmcm9tIHlvdXIgYCIrZSsiYCAiKSsiZnVuY3Rpb24uIFBsZWFzZSByZXR1cm4gYSB2YWx1ZSBvciBgbnVsbGAuIil9Y2F0Y2goZyl7YT1zdC5lcnJvcix1PWd9ZmluYWxseXtjJiZ0LnNpZ25hbC5yZW1vdmVFdmVudExpc3RlbmVyKCJhYm9ydCIsYyl9aWYoVk0odSkpe2xldCBnPXUuc3RhdHVzO2lmKEFNLmhhcyhnKSl7bGV0IHY9dS5oZWFkZXJzLmdldCgiTG9jYXRpb24iKTtpZih3ZSh2LCJSZWRpcmVjdHMgcmV0dXJuZWQvdGhyb3duIGZyb20gbG9hZGVycy9hY3Rpb25zIG11c3QgaGF2ZSBhIExvY2F0aW9uIGhlYWRlciIpLCFWRS50ZXN0KHYpKXY9Q3AobmV3IFVSTCh0LnVybCksci5zbGljZSgwLHIuaW5kZXhPZihuKSsxKSxsLCEwLHYpO2Vsc2UgaWYoIXMuaXNTdGF0aWNSZXF1ZXN0KXtsZXQgeT1uZXcgVVJMKHQudXJsKSx4PXYuc3RhcnRzV2l0aCgiLy8iKT9uZXcgVVJMKHkucHJvdG9jb2wrdik6bmV3IFVSTCh2KSxfPUJhKHgucGF0aG5hbWUsbCkhPW51bGw7eC5vcmlnaW49PT15Lm9yaWdpbiYmXyYmKHY9eC5wYXRobmFtZSt4LnNlYXJjaCt4Lmhhc2gpfWlmKHMuaXNTdGF0aWNSZXF1ZXN0KXRocm93IHUuaGVhZGVycy5zZXQoIkxvY2F0aW9uIix2KSx1O3JldHVybnt0eXBlOnN0LnJlZGlyZWN0LHN0YXR1czpnLGxvY2F0aW9uOnYscmV2YWxpZGF0ZTp1LmhlYWRlcnMuZ2V0KCJYLVJlbWl4LVJldmFsaWRhdGUiKSE9PW51bGwscmVsb2FkRG9jdW1lbnQ6dS5oZWFkZXJzLmdldCgiWC1SZW1peC1SZWxvYWQtRG9jdW1lbnQiKSE9PW51bGx9fWlmKHMuaXNSb3V0ZVJlcXVlc3QpdGhyb3d7dHlwZTphPT09c3QuZXJyb3I/c3QuZXJyb3I6c3QuZGF0YSxyZXNwb25zZTp1fTtsZXQgbSxTPXUuaGVhZGVycy5nZXQoIkNvbnRlbnQtVHlwZSIpO3JldHVybiBTJiYvXGJhcHBsaWNhdGlvblwvanNvblxiLy50ZXN0KFMpP209YXdhaXQgdS5qc29uKCk6bT1hd2FpdCB1LnRleHQoKSxhPT09c3QuZXJyb3I/e3R5cGU6YSxlcnJvcjpuZXcga20oZyx1LnN0YXR1c1RleHQsbSksaGVhZGVyczp1LmhlYWRlcnN9Ont0eXBlOnN0LmRhdGEsZGF0YTptLHN0YXR1c0NvZGU6dS5zdGF0dXMsaGVhZGVyczp1LmhlYWRlcnN9fWlmKGE9PT1zdC5lcnJvcilyZXR1cm57dHlwZTphLGVycm9yOnV9O2lmKFVNKHUpKXt2YXIgZixoO3JldHVybnt0eXBlOnN0LmRlZmVycmVkLGRlZmVycmVkRGF0YTp1LHN0YXR1c0NvZGU6KGY9dS5pbml0KT09bnVsbD92b2lkIDA6Zi5zdGF0dXMsaGVhZGVyczooKGg9dS5pbml0KT09bnVsbD92b2lkIDA6aC5oZWFkZXJzKSYmbmV3IEhlYWRlcnModS5pbml0LmhlYWRlcnMpfX1yZXR1cm57dHlwZTpzdC5kYXRhLGRhdGE6dX19ZnVuY3Rpb24gZnMoZSx0LG4scil7bGV0IG89ZS5jcmVhdGVVUkwoR0UodCkpLnRvU3RyaW5nKCksaT17c2lnbmFsOm59O2lmKHImJlluKHIuZm9ybU1ldGhvZCkpe2xldHtmb3JtTWV0aG9kOmwsZm9ybUVuY1R5cGU6c309cjtpLm1ldGhvZD1sLnRvVXBwZXJDYXNlKCkscz09PSJhcHBsaWNhdGlvbi9qc29uIj8oaS5oZWFkZXJzPW5ldyBIZWFkZXJzKHsiQ29udGVudC1UeXBlIjpzfSksaS5ib2R5PUpTT04uc3RyaW5naWZ5KHIuanNvbikpOnM9PT0idGV4dC9wbGFpbiI/aS5ib2R5PXIudGV4dDpzPT09ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCImJnIuZm9ybURhdGE/aS5ib2R5PSRwKHIuZm9ybURhdGEpOmkuYm9keT1yLmZvcm1EYXRhfXJldHVybiBuZXcgUmVxdWVzdChvLGkpfWZ1bmN0aW9uICRwKGUpe2xldCB0PW5ldyBVUkxTZWFyY2hQYXJhbXM7Zm9yKGxldFtuLHJdb2YgZS5lbnRyaWVzKCkpdC5hcHBlbmQobix0eXBlb2Ygcj09InN0cmluZyI/cjpyLm5hbWUpO3JldHVybiB0fWZ1bmN0aW9uIE8wKGUpe2xldCB0PW5ldyBGb3JtRGF0YTtmb3IobGV0W24scl1vZiBlLmVudHJpZXMoKSl0LmFwcGVuZChuLHIpO3JldHVybiB0fWZ1bmN0aW9uIEJNKGUsdCxuLHIsbyl7bGV0IGk9e30sbD1udWxsLHMsYT0hMSx1PXt9O3JldHVybiBuLmZvckVhY2goKGMsZCk9PntsZXQgZj10W2RdLnJvdXRlLmlkO2lmKHdlKCFwbChjKSwiQ2Fubm90IGhhbmRsZSByZWRpcmVjdCByZXN1bHRzIGluIHByb2Nlc3NMb2FkZXJEYXRhIiksVnMoYykpe2xldCBoPVVzKGUsZiksZz1jLmVycm9yO3ImJihnPU9iamVjdC52YWx1ZXMocilbMF0scj12b2lkIDApLGw9bHx8e30sbFtoLnJvdXRlLmlkXT09bnVsbCYmKGxbaC5yb3V0ZS5pZF09ZyksaVtmXT12b2lkIDAsYXx8KGE9ITAscz1XRShjLmVycm9yKT9jLmVycm9yLnN0YXR1czo1MDApLGMuaGVhZGVycyYmKHVbZl09Yy5oZWFkZXJzKX1lbHNlIGVpKGMpPyhvLnNldChmLGMuZGVmZXJyZWREYXRhKSxpW2ZdPWMuZGVmZXJyZWREYXRhLmRhdGEpOmlbZl09Yy5kYXRhLGMuc3RhdHVzQ29kZSE9bnVsbCYmYy5zdGF0dXNDb2RlIT09MjAwJiYhYSYmKHM9Yy5zdGF0dXNDb2RlKSxjLmhlYWRlcnMmJih1W2ZdPWMuaGVhZGVycyl9KSxyJiYobD1yLGlbT2JqZWN0LmtleXMocilbMF1dPXZvaWQgMCkse2xvYWRlckRhdGE6aSxlcnJvcnM6bCxzdGF0dXNDb2RlOnN8fDIwMCxsb2FkZXJIZWFkZXJzOnV9fWZ1bmN0aW9uIEEwKGUsdCxuLHIsbyxpLGwscyl7bGV0e2xvYWRlckRhdGE6YSxlcnJvcnM6dX09Qk0odCxuLHIsbyxzKTtmb3IobGV0IGM9MDtjPGkubGVuZ3RoO2MrKyl7bGV0e2tleTpkLG1hdGNoOmYsY29udHJvbGxlcjpofT1pW2NdO3dlKGwhPT12b2lkIDAmJmxbY10hPT12b2lkIDAsIkRpZCBub3QgZmluZCBjb3JyZXNwb25kaW5nIGZldGNoZXIgcmVzdWx0Iik7bGV0IGc9bFtjXTtpZighKGgmJmguc2lnbmFsLmFib3J0ZWQpKWlmKFZzKGcpKXtsZXQgbT1VcyhlLm1hdGNoZXMsZj09bnVsbD92b2lkIDA6Zi5yb3V0ZS5pZCk7dSYmdVttLnJvdXRlLmlkXXx8KHU9cnQoe30sdSx7W20ucm91dGUuaWRdOmcuZXJyb3J9KSksZS5mZXRjaGVycy5kZWxldGUoZCl9ZWxzZSBpZihwbChnKSl3ZSghMSwiVW5oYW5kbGVkIGZldGNoZXIgcmV2YWxpZGF0aW9uIHJlZGlyZWN0Iik7ZWxzZSBpZihlaShnKSl3ZSghMSwiVW5oYW5kbGVkIGZldGNoZXIgZGVmZXJyZWQgZGF0YSIpO2Vsc2V7bGV0IG09aW8oZy5kYXRhKTtlLmZldGNoZXJzLnNldChkLG0pfX1yZXR1cm57bG9hZGVyRGF0YTphLGVycm9yczp1fX1mdW5jdGlvbiBNMChlLHQsbixyKXtsZXQgbz1ydCh7fSx0KTtmb3IobGV0IGkgb2Ygbil7bGV0IGw9aS5yb3V0ZS5pZDtpZih0Lmhhc093blByb3BlcnR5KGwpP3RbbF0hPT12b2lkIDAmJihvW2xdPXRbbF0pOmVbbF0hPT12b2lkIDAmJmkucm91dGUubG9hZGVyJiYob1tsXT1lW2xdKSxyJiZyLmhhc093blByb3BlcnR5KGwpKWJyZWFrfXJldHVybiBvfWZ1bmN0aW9uIFVzKGUsdCl7cmV0dXJuKHQ/ZS5zbGljZSgwLGUuZmluZEluZGV4KHI9PnIucm91dGUuaWQ9PT10KSsxKTpbLi4uZV0pLnJldmVyc2UoKS5maW5kKHI9PnIucm91dGUuaGFzRXJyb3JCb3VuZGFyeT09PSEwKXx8ZVswXX1mdW5jdGlvbiBEMChlKXtsZXQgdD1lLmxlbmd0aD09PTE/ZVswXTplLmZpbmQobj0+bi5pbmRleHx8IW4ucGF0aHx8bi5wYXRoPT09Ii8iKXx8e2lkOiJfX3NoaW0tZXJyb3Itcm91dGVfXyJ9O3JldHVybnttYXRjaGVzOlt7cGFyYW1zOnt9LHBhdGhuYW1lOiIiLHBhdGhuYW1lQmFzZToiIixyb3V0ZTp0fV0scm91dGU6dH19ZnVuY3Rpb24gUm4oZSx0KXtsZXR7cGF0aG5hbWU6bixyb3V0ZUlkOnIsbWV0aG9kOm8sdHlwZTppfT10PT09dm9pZCAwP3t9OnQsbD0iVW5rbm93biBTZXJ2ZXIgRXJyb3IiLHM9IlVua25vd24gQHJlbWl4LXJ1bi9yb3V0ZXIgZXJyb3IiO3JldHVybiBlPT09NDAwPyhsPSJCYWQgUmVxdWVzdCIsbyYmbiYmcj9zPSJZb3UgbWFkZSBhICIrbysnIHJlcXVlc3QgdG8gIicrbisnIiBidXQgJysoJ2RpZCBub3QgcHJvdmlkZSBhIGBsb2FkZXJgIGZvciByb3V0ZSAiJytyKyciLCAnKSsic28gdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4iOmk9PT0iZGVmZXItYWN0aW9uIj9zPSJkZWZlcigpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gYWN0aW9ucyI6aT09PSJpbnZhbGlkLWJvZHkiJiYocz0iVW5hYmxlIHRvIGVuY29kZSBzdWJtaXNzaW9uIGJvZHkiKSk6ZT09PTQwMz8obD0iRm9yYmlkZGVuIixzPSdSb3V0ZSAiJytyKyciIGRvZXMgbm90IG1hdGNoIFVSTCAiJytuKyciJyk6ZT09PTQwND8obD0iTm90IEZvdW5kIixzPSdObyByb3V0ZSBtYXRjaGVzIFVSTCAiJytuKyciJyk6ZT09PTQwNSYmKGw9Ik1ldGhvZCBOb3QgQWxsb3dlZCIsbyYmbiYmcj9zPSJZb3UgbWFkZSBhICIrby50b1VwcGVyQ2FzZSgpKycgcmVxdWVzdCB0byAiJytuKyciIGJ1dCAnKygnZGlkIG5vdCBwcm92aWRlIGFuIGBhY3Rpb25gIGZvciByb3V0ZSAiJytyKyciLCAnKSsic28gdGhlcmUgaXMgbm8gd2F5IHRvIGhhbmRsZSB0aGUgcmVxdWVzdC4iOm8mJihzPSdJbnZhbGlkIHJlcXVlc3QgbWV0aG9kICInK28udG9VcHBlckNhc2UoKSsnIicpKSxuZXcga20oZXx8NTAwLGwsbmV3IEVycm9yKHMpLCEwKX1mdW5jdGlvbiBMMChlKXtmb3IobGV0IHQ9ZS5sZW5ndGgtMTt0Pj0wO3QtLSl7bGV0IG49ZVt0XTtpZihwbChuKSlyZXR1cm57cmVzdWx0Om4saWR4OnR9fX1mdW5jdGlvbiBHRShlKXtsZXQgdD10eXBlb2YgZT09InN0cmluZyI/SnIoZSk6ZTtyZXR1cm4gRmEocnQoe30sdCx7aGFzaDoiIn0pKX1mdW5jdGlvbiBXTShlLHQpe3JldHVybiBlLnBhdGhuYW1lIT09dC5wYXRobmFtZXx8ZS5zZWFyY2ghPT10LnNlYXJjaD8hMTplLmhhc2g9PT0iIj90Lmhhc2ghPT0iIjplLmhhc2g9PT10Lmhhc2g/ITA6dC5oYXNoIT09IiJ9ZnVuY3Rpb24gZWkoZSl7cmV0dXJuIGUudHlwZT09PXN0LmRlZmVycmVkfWZ1bmN0aW9uIFZzKGUpe3JldHVybiBlLnR5cGU9PT1zdC5lcnJvcn1mdW5jdGlvbiBwbChlKXtyZXR1cm4oZSYmZS50eXBlKT09PXN0LnJlZGlyZWN0fWZ1bmN0aW9uIFVNKGUpe2xldCB0PWU7cmV0dXJuIHQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmdHlwZW9mIHQuZGF0YT09Im9iamVjdCImJnR5cGVvZiB0LnN1YnNjcmliZT09ImZ1bmN0aW9uIiYmdHlwZW9mIHQuY2FuY2VsPT0iZnVuY3Rpb24iJiZ0eXBlb2YgdC5yZXNvbHZlRGF0YT09ImZ1bmN0aW9uIn1mdW5jdGlvbiBWTShlKXtyZXR1cm4gZSE9bnVsbCYmdHlwZW9mIGUuc3RhdHVzPT0ibnVtYmVyIiYmdHlwZW9mIGUuc3RhdHVzVGV4dD09InN0cmluZyImJnR5cGVvZiBlLmhlYWRlcnM9PSJvYmplY3QiJiZ0eXBlb2YgZS5ib2R5PCJ1In1mdW5jdGlvbiBITShlKXtyZXR1cm4gT00uaGFzKGUudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gWW4oZSl7cmV0dXJuIFJNLmhhcyhlLnRvTG93ZXJDYXNlKCkpfWFzeW5jIGZ1bmN0aW9uIEkwKGUsdCxuLHIsbyxpKXtmb3IobGV0IGw9MDtsPG4ubGVuZ3RoO2wrKyl7bGV0IHM9bltsXSxhPXRbbF07aWYoIWEpY29udGludWU7bGV0IHU9ZS5maW5kKGQ9PmQucm91dGUuaWQ9PT1hLnJvdXRlLmlkKSxjPXUhPW51bGwmJiFLRSh1LGEpJiYoaSYmaVthLnJvdXRlLmlkXSkhPT12b2lkIDA7aWYoZWkocykmJihvfHxjKSl7bGV0IGQ9cltsXTt3ZShkLCJFeHBlY3RlZCBhbiBBYm9ydFNpZ25hbCBmb3IgcmV2YWxpZGF0aW5nIGZldGNoZXIgZGVmZXJyZWQgcmVzdWx0IiksYXdhaXQgWUUocyxkLG8pLnRoZW4oZj0+e2YmJihuW2xdPWZ8fG5bbF0pfSl9fX1hc3luYyBmdW5jdGlvbiBZRShlLHQsbil7aWYobj09PXZvaWQgMCYmKG49ITEpLCFhd2FpdCBlLmRlZmVycmVkRGF0YS5yZXNvbHZlRGF0YSh0KSl7aWYobil0cnl7cmV0dXJue3R5cGU6c3QuZGF0YSxkYXRhOmUuZGVmZXJyZWREYXRhLnVud3JhcHBlZERhdGF9fWNhdGNoKG8pe3JldHVybnt0eXBlOnN0LmVycm9yLGVycm9yOm99fXJldHVybnt0eXBlOnN0LmRhdGEsZGF0YTplLmRlZmVycmVkRGF0YS5kYXRhfX19ZnVuY3Rpb24gVG0oZSl7cmV0dXJuIG5ldyBVUkxTZWFyY2hQYXJhbXMoZSkuZ2V0QWxsKCJpbmRleCIpLnNvbWUodD0+dD09PSIiKX1mdW5jdGlvbiBrcChlLHQpe2xldCBuPXR5cGVvZiB0PT0ic3RyaW5nIj9Kcih0KS5zZWFyY2g6dC5zZWFyY2g7aWYoZVtlLmxlbmd0aC0xXS5yb3V0ZS5pbmRleCYmVG0obnx8IiIpKXJldHVybiBlW2UubGVuZ3RoLTFdO2xldCByPSRtKGUpO3JldHVybiByW3IubGVuZ3RoLTFdfWZ1bmN0aW9uIGowKGUpe2xldHtmb3JtTWV0aG9kOnQsZm9ybUFjdGlvbjpuLGZvcm1FbmNUeXBlOnIsdGV4dDpvLGZvcm1EYXRhOmksanNvbjpsfT1lO2lmKCEoIXR8fCFufHwhcikpe2lmKG8hPW51bGwpcmV0dXJue2Zvcm1NZXRob2Q6dCxmb3JtQWN0aW9uOm4sZm9ybUVuY1R5cGU6cixmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDpvfTtpZihpIT1udWxsKXJldHVybntmb3JtTWV0aG9kOnQsZm9ybUFjdGlvbjpuLGZvcm1FbmNUeXBlOnIsZm9ybURhdGE6aSxqc29uOnZvaWQgMCx0ZXh0OnZvaWQgMH07aWYobCE9PXZvaWQgMClyZXR1cm57Zm9ybU1ldGhvZDp0LGZvcm1BY3Rpb246bixmb3JtRW5jVHlwZTpyLGZvcm1EYXRhOnZvaWQgMCxqc29uOmwsdGV4dDp2b2lkIDB9fX1mdW5jdGlvbiBBZihlLHQpe3JldHVybiB0P3tzdGF0ZToibG9hZGluZyIsbG9jYXRpb246ZSxmb3JtTWV0aG9kOnQuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOnQuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTp0LmZvcm1FbmNUeXBlLGZvcm1EYXRhOnQuZm9ybURhdGEsanNvbjp0Lmpzb24sdGV4dDp0LnRleHR9OntzdGF0ZToibG9hZGluZyIsbG9jYXRpb246ZSxmb3JtTWV0aG9kOnZvaWQgMCxmb3JtQWN0aW9uOnZvaWQgMCxmb3JtRW5jVHlwZTp2b2lkIDAsZm9ybURhdGE6dm9pZCAwLGpzb246dm9pZCAwLHRleHQ6dm9pZCAwfX1mdW5jdGlvbiBLTShlLHQpe3JldHVybntzdGF0ZToic3VibWl0dGluZyIsbG9jYXRpb246ZSxmb3JtTWV0aG9kOnQuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOnQuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTp0LmZvcm1FbmNUeXBlLGZvcm1EYXRhOnQuZm9ybURhdGEsanNvbjp0Lmpzb24sdGV4dDp0LnRleHR9fWZ1bmN0aW9uIGhzKGUsdCl7cmV0dXJuIGU/e3N0YXRlOiJsb2FkaW5nIixmb3JtTWV0aG9kOmUuZm9ybU1ldGhvZCxmb3JtQWN0aW9uOmUuZm9ybUFjdGlvbixmb3JtRW5jVHlwZTplLmZvcm1FbmNUeXBlLGZvcm1EYXRhOmUuZm9ybURhdGEsanNvbjplLmpzb24sdGV4dDplLnRleHQsZGF0YTp0fTp7c3RhdGU6ImxvYWRpbmciLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDAsZGF0YTp0fX1mdW5jdGlvbiBHTShlLHQpe3JldHVybntzdGF0ZToic3VibWl0dGluZyIsZm9ybU1ldGhvZDplLmZvcm1NZXRob2QsZm9ybUFjdGlvbjplLmZvcm1BY3Rpb24sZm9ybUVuY1R5cGU6ZS5mb3JtRW5jVHlwZSxmb3JtRGF0YTplLmZvcm1EYXRhLGpzb246ZS5qc29uLHRleHQ6ZS50ZXh0LGRhdGE6dD90LmRhdGE6dm9pZCAwfX1mdW5jdGlvbiBpbyhlKXtyZXR1cm57c3RhdGU6ImlkbGUiLGZvcm1NZXRob2Q6dm9pZCAwLGZvcm1BY3Rpb246dm9pZCAwLGZvcm1FbmNUeXBlOnZvaWQgMCxmb3JtRGF0YTp2b2lkIDAsanNvbjp2b2lkIDAsdGV4dDp2b2lkIDAsZGF0YTplfX1mdW5jdGlvbiBZTShlLHQpe3RyeXtsZXQgbj1lLnNlc3Npb25TdG9yYWdlLmdldEl0ZW0oSEUpO2lmKG4pe2xldCByPUpTT04ucGFyc2Uobik7Zm9yKGxldFtvLGldb2YgT2JqZWN0LmVudHJpZXMocnx8e30pKWkmJkFycmF5LmlzQXJyYXkoaSkmJnQuc2V0KG8sbmV3IFNldChpfHxbXSkpfX1jYXRjaHt9fWZ1bmN0aW9uIFhNKGUsdCl7aWYodC5zaXplPjApe2xldCBuPXt9O2ZvcihsZXRbcixvXW9mIHQpbltyXT1bLi4ub107dHJ5e2Uuc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShIRSxKU09OLnN0cmluZ2lmeShuKSl9Y2F0Y2gocil7dmkoITEsIkZhaWxlZCB0byBzYXZlIGFwcGxpZWQgdmlldyB0cmFuc2l0aW9ucyBpbiBzZXNzaW9uU3RvcmFnZSAoIityKyIpLiIpfX19LyoqCiAqIFJlYWN0IFJvdXRlciB2Ni4xOC4wCiAqCiAqIENvcHlyaWdodCAoYykgUmVtaXggU29mdHdhcmUgSW5jLgogKgogKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGUKICogTElDRU5TRS5tZCBmaWxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLgogKgogKiBAbGljZW5zZSBNSVQKICovZnVuY3Rpb24gSWMoKXtyZXR1cm4gSWM9T2JqZWN0LmFzc2lnbj9PYmplY3QuYXNzaWduLmJpbmQoKTpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1hcmd1bWVudHNbdF07Zm9yKHZhciByIGluIG4pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4scikmJihlW3JdPW5bcl0pfXJldHVybiBlfSxJYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl9Y29uc3Qga2Q9cC5jcmVhdGVDb250ZXh0KG51bGwpLFhFPXAuY3JlYXRlQ29udGV4dChudWxsKSxUZD1wLmNyZWF0ZUNvbnRleHQobnVsbCksTmQ9cC5jcmVhdGVDb250ZXh0KG51bGwpLFJpPXAuY3JlYXRlQ29udGV4dCh7b3V0bGV0Om51bGwsbWF0Y2hlczpbXSxpc0RhdGFSb3V0ZTohMX0pLFFFPXAuY3JlYXRlQ29udGV4dChudWxsKTtmdW5jdGlvbiBiZCgpe3JldHVybiBwLnVzZUNvbnRleHQoTmQpIT1udWxsfWZ1bmN0aW9uIEpFKCl7cmV0dXJuIGJkKCl8fHdlKCExKSxwLnVzZUNvbnRleHQoTmQpLmxvY2F0aW9ufWZ1bmN0aW9uIFpFKGUpe3AudXNlQ29udGV4dChUZCkuc3RhdGljfHxwLnVzZUxheW91dEVmZmVjdChlKX1mdW5jdGlvbiBObSgpe2xldHtpc0RhdGFSb3V0ZTplfT1wLnVzZUNvbnRleHQoUmkpO3JldHVybiBlP2EzKCk6UU0oKX1mdW5jdGlvbiBRTSgpe2JkKCl8fHdlKCExKTtsZXQgZT1wLnVzZUNvbnRleHQoa2QpLHtiYXNlbmFtZTp0LG5hdmlnYXRvcjpufT1wLnVzZUNvbnRleHQoVGQpLHttYXRjaGVzOnJ9PXAudXNlQ29udGV4dChSaSkse3BhdGhuYW1lOm99PUpFKCksaT1KU09OLnN0cmluZ2lmeSgkbShyKS5tYXAoYT0+YS5wYXRobmFtZUJhc2UpKSxsPXAudXNlUmVmKCExKTtyZXR1cm4gWkUoKCk9PntsLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKGEsdSl7aWYodT09PXZvaWQgMCYmKHU9e30pLCFsLmN1cnJlbnQpcmV0dXJuO2lmKHR5cGVvZiBhPT0ibnVtYmVyIil7bi5nbyhhKTtyZXR1cm59bGV0IGM9QkUoYSxKU09OLnBhcnNlKGkpLG8sdS5yZWxhdGl2ZT09PSJwYXRoIik7ZT09bnVsbCYmdCE9PSIvIiYmKGMucGF0aG5hbWU9Yy5wYXRobmFtZT09PSIvIj90OmtvKFt0LGMucGF0aG5hbWVdKSksKHUucmVwbGFjZT9uLnJlcGxhY2U6bi5wdXNoKShjLHUuc3RhdGUsdSl9LFt0LG4saSxvLGVdKX1mdW5jdGlvbiBKTSgpe2xldHttYXRjaGVzOmV9PXAudXNlQ29udGV4dChSaSksdD1lW2UubGVuZ3RoLTFdO3JldHVybiB0P3QucGFyYW1zOnt9fWZ1bmN0aW9uIFpNKGUsdCxuKXtiZCgpfHx3ZSghMSk7bGV0e25hdmlnYXRvcjpyfT1wLnVzZUNvbnRleHQoVGQpLHttYXRjaGVzOm99PXAudXNlQ29udGV4dChSaSksaT1vW28ubGVuZ3RoLTFdLGw9aT9pLnBhcmFtczp7fTtpJiZpLnBhdGhuYW1lO2xldCBzPWk/aS5wYXRobmFtZUJhc2U6Ii8iO2kmJmkucm91dGU7bGV0IGE9SkUoKSx1O2lmKHQpe3ZhciBjO2xldCBtPXR5cGVvZiB0PT0ic3RyaW5nIj9Kcih0KTp0O3M9PT0iLyJ8fChjPW0ucGF0aG5hbWUpIT1udWxsJiZjLnN0YXJ0c1dpdGgocyl8fHdlKCExKSx1PW19ZWxzZSB1PWE7bGV0IGQ9dS5wYXRobmFtZXx8Ii8iLGY9cz09PSIvIj9kOmQuc2xpY2Uocy5sZW5ndGgpfHwiLyIsaD1ybChlLHtwYXRobmFtZTpmfSksZz1yMyhoJiZoLm1hcChtPT5PYmplY3QuYXNzaWduKHt9LG0se3BhcmFtczpPYmplY3QuYXNzaWduKHt9LGwsbS5wYXJhbXMpLHBhdGhuYW1lOmtvKFtzLHIuZW5jb2RlTG9jYXRpb24/ci5lbmNvZGVMb2NhdGlvbihtLnBhdGhuYW1lKS5wYXRobmFtZTptLnBhdGhuYW1lXSkscGF0aG5hbWVCYXNlOm0ucGF0aG5hbWVCYXNlPT09Ii8iP3M6a28oW3Msci5lbmNvZGVMb2NhdGlvbj9yLmVuY29kZUxvY2F0aW9uKG0ucGF0aG5hbWVCYXNlKS5wYXRobmFtZTptLnBhdGhuYW1lQmFzZV0pfSkpLG8sbik7cmV0dXJuIHQmJmc/cC5jcmVhdGVFbGVtZW50KE5kLlByb3ZpZGVyLHt2YWx1ZTp7bG9jYXRpb246SWMoe3BhdGhuYW1lOiIvIixzZWFyY2g6IiIsaGFzaDoiIixzdGF0ZTpudWxsLGtleToiZGVmYXVsdCJ9LHUpLG5hdmlnYXRpb25UeXBlOmx0LlBvcH19LGcpOmd9ZnVuY3Rpb24gcU0oKXtsZXQgZT1zMygpLHQ9V0UoZSk/ZS5zdGF0dXMrIiAiK2Uuc3RhdHVzVGV4dDplIGluc3RhbmNlb2YgRXJyb3I/ZS5tZXNzYWdlOkpTT04uc3RyaW5naWZ5KGUpLG49ZSBpbnN0YW5jZW9mIEVycm9yP2Uuc3RhY2s6bnVsbCxvPXtwYWRkaW5nOiIwLjVyZW0iLGJhY2tncm91bmRDb2xvcjoicmdiYSgyMDAsMjAwLDIwMCwgMC41KSJ9LGk9bnVsbDtyZXR1cm4gcC5jcmVhdGVFbGVtZW50KHAuRnJhZ21lbnQsbnVsbCxwLmNyZWF0ZUVsZW1lbnQoImgyIixudWxsLCJVbmV4cGVjdGVkIEFwcGxpY2F0aW9uIEVycm9yISIpLHAuY3JlYXRlRWxlbWVudCgiaDMiLHtzdHlsZTp7Zm9udFN0eWxlOiJpdGFsaWMifX0sdCksbj9wLmNyZWF0ZUVsZW1lbnQoInByZSIse3N0eWxlOm99LG4pOm51bGwsaSl9Y29uc3QgZTM9cC5jcmVhdGVFbGVtZW50KHFNLG51bGwpO2NsYXNzIHQzIGV4dGVuZHMgcC5Db21wb25lbnR7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5zdGF0ZT17bG9jYXRpb246dC5sb2NhdGlvbixyZXZhbGlkYXRpb246dC5yZXZhbGlkYXRpb24sZXJyb3I6dC5lcnJvcn19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21FcnJvcih0KXtyZXR1cm57ZXJyb3I6dH19c3RhdGljIGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyh0LG4pe3JldHVybiBuLmxvY2F0aW9uIT09dC5sb2NhdGlvbnx8bi5yZXZhbGlkYXRpb24hPT0iaWRsZSImJnQucmV2YWxpZGF0aW9uPT09ImlkbGUiP3tlcnJvcjp0LmVycm9yLGxvY2F0aW9uOnQubG9jYXRpb24scmV2YWxpZGF0aW9uOnQucmV2YWxpZGF0aW9ufTp7ZXJyb3I6dC5lcnJvcnx8bi5lcnJvcixsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjp0LnJldmFsaWRhdGlvbnx8bi5yZXZhbGlkYXRpb259fWNvbXBvbmVudERpZENhdGNoKHQsbil7Y29uc29sZS5lcnJvcigiUmVhY3QgUm91dGVyIGNhdWdodCB0aGUgZm9sbG93aW5nIGVycm9yIGR1cmluZyByZW5kZXIiLHQsbil9cmVuZGVyKCl7cmV0dXJuIHRoaXMuc3RhdGUuZXJyb3I/cC5jcmVhdGVFbGVtZW50KFJpLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnByb3BzLnJvdXRlQ29udGV4dH0scC5jcmVhdGVFbGVtZW50KFFFLlByb3ZpZGVyLHt2YWx1ZTp0aGlzLnN0YXRlLmVycm9yLGNoaWxkcmVuOnRoaXMucHJvcHMuY29tcG9uZW50fSkpOnRoaXMucHJvcHMuY2hpbGRyZW59fWZ1bmN0aW9uIG4zKGUpe2xldHtyb3V0ZUNvbnRleHQ6dCxtYXRjaDpuLGNoaWxkcmVuOnJ9PWUsbz1wLnVzZUNvbnRleHQoa2QpO3JldHVybiBvJiZvLnN0YXRpYyYmby5zdGF0aWNDb250ZXh0JiYobi5yb3V0ZS5lcnJvckVsZW1lbnR8fG4ucm91dGUuRXJyb3JCb3VuZGFyeSkmJihvLnN0YXRpY0NvbnRleHQuX2RlZXBlc3RSZW5kZXJlZEJvdW5kYXJ5SWQ9bi5yb3V0ZS5pZCkscC5jcmVhdGVFbGVtZW50KFJpLlByb3ZpZGVyLHt2YWx1ZTp0fSxyKX1mdW5jdGlvbiByMyhlLHQsbil7dmFyIHI7aWYodD09PXZvaWQgMCYmKHQ9W10pLG49PT12b2lkIDAmJihuPW51bGwpLGU9PW51bGwpe3ZhciBvO2lmKChvPW4pIT1udWxsJiZvLmVycm9ycyllPW4ubWF0Y2hlcztlbHNlIHJldHVybiBudWxsfWxldCBpPWUsbD0ocj1uKT09bnVsbD92b2lkIDA6ci5lcnJvcnM7aWYobCE9bnVsbCl7bGV0IHM9aS5maW5kSW5kZXgoYT0+YS5yb3V0ZS5pZCYmKGw9PW51bGw/dm9pZCAwOmxbYS5yb3V0ZS5pZF0pKTtzPj0wfHx3ZSghMSksaT1pLnNsaWNlKDAsTWF0aC5taW4oaS5sZW5ndGgscysxKSl9cmV0dXJuIGkucmVkdWNlUmlnaHQoKHMsYSx1KT0+e2xldCBjPWEucm91dGUuaWQ/bD09bnVsbD92b2lkIDA6bFthLnJvdXRlLmlkXTpudWxsLGQ9bnVsbDtuJiYoZD1hLnJvdXRlLmVycm9yRWxlbWVudHx8ZTMpO2xldCBmPXQuY29uY2F0KGkuc2xpY2UoMCx1KzEpKSxoPSgpPT57bGV0IGc7cmV0dXJuIGM/Zz1kOmEucm91dGUuQ29tcG9uZW50P2c9cC5jcmVhdGVFbGVtZW50KGEucm91dGUuQ29tcG9uZW50LG51bGwpOmEucm91dGUuZWxlbWVudD9nPWEucm91dGUuZWxlbWVudDpnPXMscC5jcmVhdGVFbGVtZW50KG4zLHttYXRjaDphLHJvdXRlQ29udGV4dDp7b3V0bGV0OnMsbWF0Y2hlczpmLGlzRGF0YVJvdXRlOm4hPW51bGx9LGNoaWxkcmVuOmd9KX07cmV0dXJuIG4mJihhLnJvdXRlLkVycm9yQm91bmRhcnl8fGEucm91dGUuZXJyb3JFbGVtZW50fHx1PT09MCk/cC5jcmVhdGVFbGVtZW50KHQzLHtsb2NhdGlvbjpuLmxvY2F0aW9uLHJldmFsaWRhdGlvbjpuLnJldmFsaWRhdGlvbixjb21wb25lbnQ6ZCxlcnJvcjpjLGNoaWxkcmVuOmgoKSxyb3V0ZUNvbnRleHQ6e291dGxldDpudWxsLG1hdGNoZXM6Zixpc0RhdGFSb3V0ZTohMH19KTpoKCl9LG51bGwpfXZhciBxRT1mdW5jdGlvbihlKXtyZXR1cm4gZS5Vc2VCbG9ja2VyPSJ1c2VCbG9ja2VyIixlLlVzZVJldmFsaWRhdG9yPSJ1c2VSZXZhbGlkYXRvciIsZS5Vc2VOYXZpZ2F0ZVN0YWJsZT0idXNlTmF2aWdhdGUiLGV9KHFFfHx7fSksamM9ZnVuY3Rpb24oZSl7cmV0dXJuIGUuVXNlQmxvY2tlcj0idXNlQmxvY2tlciIsZS5Vc2VMb2FkZXJEYXRhPSJ1c2VMb2FkZXJEYXRhIixlLlVzZUFjdGlvbkRhdGE9InVzZUFjdGlvbkRhdGEiLGUuVXNlUm91dGVFcnJvcj0idXNlUm91dGVFcnJvciIsZS5Vc2VOYXZpZ2F0aW9uPSJ1c2VOYXZpZ2F0aW9uIixlLlVzZVJvdXRlTG9hZGVyRGF0YT0idXNlUm91dGVMb2FkZXJEYXRhIixlLlVzZU1hdGNoZXM9InVzZU1hdGNoZXMiLGUuVXNlUmV2YWxpZGF0b3I9InVzZVJldmFsaWRhdG9yIixlLlVzZU5hdmlnYXRlU3RhYmxlPSJ1c2VOYXZpZ2F0ZSIsZS5Vc2VSb3V0ZUlkPSJ1c2VSb3V0ZUlkIixlfShqY3x8e30pO2Z1bmN0aW9uIG8zKGUpe2xldCB0PXAudXNlQ29udGV4dChrZCk7cmV0dXJuIHR8fHdlKCExKSx0fWZ1bmN0aW9uIGkzKGUpe2xldCB0PXAudXNlQ29udGV4dChYRSk7cmV0dXJuIHR8fHdlKCExKSx0fWZ1bmN0aW9uIGwzKGUpe2xldCB0PXAudXNlQ29udGV4dChSaSk7cmV0dXJuIHR8fHdlKCExKSx0fWZ1bmN0aW9uIGVDKGUpe2xldCB0PWwzKCksbj10Lm1hdGNoZXNbdC5tYXRjaGVzLmxlbmd0aC0xXTtyZXR1cm4gbi5yb3V0ZS5pZHx8d2UoITEpLG4ucm91dGUuaWR9ZnVuY3Rpb24gczMoKXt2YXIgZTtsZXQgdD1wLnVzZUNvbnRleHQoUUUpLG49aTMoamMuVXNlUm91dGVFcnJvcikscj1lQyhqYy5Vc2VSb3V0ZUVycm9yKTtyZXR1cm4gdHx8KChlPW4uZXJyb3JzKT09bnVsbD92b2lkIDA6ZVtyXSl9ZnVuY3Rpb24gYTMoKXtsZXR7cm91dGVyOmV9PW8zKHFFLlVzZU5hdmlnYXRlU3RhYmxlKSx0PWVDKGpjLlVzZU5hdmlnYXRlU3RhYmxlKSxuPXAudXNlUmVmKCExKTtyZXR1cm4gWkUoKCk9PntuLmN1cnJlbnQ9ITB9KSxwLnVzZUNhbGxiYWNrKGZ1bmN0aW9uKG8saSl7aT09PXZvaWQgMCYmKGk9e30pLG4uY3VycmVudCYmKHR5cGVvZiBvPT0ibnVtYmVyIj9lLm5hdmlnYXRlKG8pOmUubmF2aWdhdGUobyxJYyh7ZnJvbVJvdXRlSWQ6dH0saSkpKX0sW2UsdF0pfWZ1bmN0aW9uIHUzKGUpe2xldHtiYXNlbmFtZTp0PSIvIixjaGlsZHJlbjpuPW51bGwsbG9jYXRpb246cixuYXZpZ2F0aW9uVHlwZTpvPWx0LlBvcCxuYXZpZ2F0b3I6aSxzdGF0aWM6bD0hMX09ZTtiZCgpJiZ3ZSghMSk7bGV0IHM9dC5yZXBsYWNlKC9eXC8qLywiLyIpLGE9cC51c2VNZW1vKCgpPT4oe2Jhc2VuYW1lOnMsbmF2aWdhdG9yOmksc3RhdGljOmx9KSxbcyxpLGxdKTt0eXBlb2Ygcj09InN0cmluZyImJihyPUpyKHIpKTtsZXR7cGF0aG5hbWU6dT0iLyIsc2VhcmNoOmM9IiIsaGFzaDpkPSIiLHN0YXRlOmY9bnVsbCxrZXk6aD0iZGVmYXVsdCJ9PXIsZz1wLnVzZU1lbW8oKCk9PntsZXQgbT1CYSh1LHMpO3JldHVybiBtPT1udWxsP251bGw6e2xvY2F0aW9uOntwYXRobmFtZTptLHNlYXJjaDpjLGhhc2g6ZCxzdGF0ZTpmLGtleTpofSxuYXZpZ2F0aW9uVHlwZTpvfX0sW3MsdSxjLGQsZixoLG9dKTtyZXR1cm4gZz09bnVsbD9udWxsOnAuY3JlYXRlRWxlbWVudChUZC5Qcm92aWRlcix7dmFsdWU6YX0scC5jcmVhdGVFbGVtZW50KE5kLlByb3ZpZGVyLHtjaGlsZHJlbjpuLHZhbHVlOmd9KSl9bmV3IFByb21pc2UoKCk9Pnt9KTtmdW5jdGlvbiBjMyhlKXtsZXQgdD17aGFzRXJyb3JCb3VuZGFyeTplLkVycm9yQm91bmRhcnkhPW51bGx8fGUuZXJyb3JFbGVtZW50IT1udWxsfTtyZXR1cm4gZS5Db21wb25lbnQmJk9iamVjdC5hc3NpZ24odCx7ZWxlbWVudDpwLmNyZWF0ZUVsZW1lbnQoZS5Db21wb25lbnQpLENvbXBvbmVudDp2b2lkIDB9KSxlLkVycm9yQm91bmRhcnkmJk9iamVjdC5hc3NpZ24odCx7ZXJyb3JFbGVtZW50OnAuY3JlYXRlRWxlbWVudChlLkVycm9yQm91bmRhcnkpLEVycm9yQm91bmRhcnk6dm9pZCAwfSksdH1jb25zdCB0Qz1xLmNyZWF0ZUNvbnRleHQobnVsbCksZDM9ZT0+e3ZhciBzLGE7Y29uc3QgdD1xLnVzZUNvbnRleHQodEMpLFtuLHJdPXduLnNwbGl0TW9kdWxlSWRBbmRNb2R1bGVQYXRoKGUpLG89KHM9dD09bnVsbD92b2lkIDA6dFtuXSk9PW51bGw/dm9pZCAwOnMuc291cmNlLGk9KGE9dD09bnVsbD92b2lkIDA6dFtuXSk9PW51bGw/dm9pZCAwOmEuc2NoZW1hO2lmKCFvfHwhaSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbW9kdWxlOiAiK24pO2NvbnN0IGw9d24ucmVzb2x2ZVBhdGgocixvLGkpO3JldHVybnttb2R1bGVJZDpuLG1vZHVsZVNvdXJjZTpsLnNvdXJjZSxtb2R1bGVTY2hlbWE6bC5zY2hlbWF9fSxmMz0oe3ZhbEFwaTplfSk9Pnt2YXIgXyxFO2NvbnN0eyIqIjp0fT1KTSgpLFtuLHJdPXAudXNlU3RhdGUobnVsbCksW28saV09cC51c2VTdGF0ZShudWxsKSxbbCxzXT1wLnVzZVN0YXRlKCksW2FdPWw/d24uc3BsaXRNb2R1bGVJZEFuZE1vZHVsZVBhdGgobCk6W3ZvaWQgMCx2b2lkIDBdLHU9YSYmKChfPW49PW51bGw/dm9pZCAwOm5bYV0pPT1udWxsP3ZvaWQgMDpfLnNvdXJjZSksYz1hJiYoKEU9bj09bnVsbD92b2lkIDA6blthXSk9PW51bGw/dm9pZCAwOkUuc2NoZW1hKSxkPU9iamVjdC5lbnRyaWVzKG58fHt9KS5mbGF0TWFwKChbLCRdKT0+JC5lcnJvcnM/JC5lcnJvcnMuZmF0YWw/JC5lcnJvcnMuZmF0YWw6W106W10pLGY9T2JqZWN0LmVudHJpZXMobnx8e30pLmZsYXRNYXAoKFssJF0pPT4kLmVycm9ycyYmJC5lcnJvcnMudmFsaWRhdGlvbj9bJC5lcnJvcnMudmFsaWRhdGlvbl06W10pO2lmKGQmJmQubGVuZ3RoPjApe2NvbnN0ICQ9ZC5sZW5ndGg9PT0xP2RbMF0ubWVzc2FnZTpgTXVsdGlwbGUgZXJyb3JzIGRldGVjdGVkOgoke2QubWFwKChULE0pPT5gJHtNKzF9LiAke1QubWVzc2FnZX1gKS5qb2luKGAKYCl9CgpTaG93aW5nIHN0YWNrIHRyYWNlIG9mOiAwLiAke2RbMF0ubWVzc2FnZX1gLEM9bmV3IEVycm9yKCQpO3Rocm93IEMuc3RhY2s9ZFswXS5zdGFjayxDfWYmJmYubGVuZ3RoPjAmJmNvbnNvbGUud2FybigiVmFsIGVuY291bnRlcmVkIHZhbGlkYXRpb24gZXJyb3JzOiIsZikscC51c2VFZmZlY3QoKCk9PntzKHQ/YC8ke3R9YDpsKX0sW3RdKTtjb25zdFtoLGddPXAudXNlU3RhdGUobnVsbCk7cC51c2VFZmZlY3QoKCk9Pnt0cnl7bmV3IFdlYlNvY2tldChgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2luLnJlcGxhY2UoImh0dHA6Ly8iLCJ3czovLyIpfS9fbmV4dC93ZWJwYWNrLWhtcmApLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLEM9PntsZXQgVDt0cnl7VD1KU09OLnBhcnNlKEMuZGF0YSl9Y2F0Y2h7Y29uc29sZS5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIEhNUiIpfXR5cGVvZihUPT1udWxsP3ZvaWQgMDpULmhhc2gpPT0ic3RyaW5nIiYmKFQ9PW51bGw/dm9pZCAwOlQuYWN0aW9uKT09PSJidWlsdCImJmcoVC5oYXNoKX0pfWNhdGNoKCQpe2NvbnNvbGUud2FybigiRmFpbGVkIHRvIGluaXRpYWxpemUgSE1SIiwkKX19LFtdKSxwLnVzZUVmZmVjdCgoKT0+e2NvbnNvbGUubG9nKCIoUmUpLWZldGNoaW5nIG1vZHVsZXMiKSxlLmdldE1vZHVsZXMoe3BhdGNoOiEwLGluY2x1ZGVTY2hlbWE6ITAsaW5jbHVkZVNvdXJjZTohMH0pLnRoZW4oJD0+e1BzLmlzT2soJCk/cigkLnZhbHVlLm1vZHVsZXMpOihpKCJDb3VsZCBub3QgbG9hZCBtb2R1bGVzOiAiKyQuZXJyb3IubWVzc2FnZSksY29uc29sZS5lcnJvcigkLmVycm9yKSl9KX0sW2hdKTtjb25zdCBtPU5tKCksW1Msdl09QVAoKTtwLnVzZUVmZmVjdCgoKT0+e2NvbnN0ICQ9Qz0+e2NvbnNvbGUubG9nKCJwb3BzdGF0ZSIsQyl9O3JldHVybiB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLCQpLCgpPT57d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInBvcHN0YXRlIiwkKX19LFtdKTtjb25zdCB5PXEudXNlUmVmKG51bGwpLHg9cC51c2VDYWxsYmFjaygkPT5hc3luYyBDPT57Y29uc3RbVCxNXT13bi5zcGxpdE1vZHVsZUlkQW5kTW9kdWxlUGF0aCgkKSxSPWF3YWl0IEMod24uY3JlYXRlUGF0Y2hKU09OUGF0aChNKSk7cmV0dXJuIGUucG9zdFBhdGNoZXMoVCxSKS50aGVuKGo9PntpZihQcy5pc0VycihqKSl0aHJvdyBqLmVycm9yO2lmKGNvbnNvbGUubG9nKCJzdWJtaXR0ZWQiLFIpLCFoKXJldHVybiBlLmdldE1vZHVsZXMoe3BhdGNoOiEwLGluY2x1ZGVTY2hlbWE6ITAsaW5jbHVkZVNvdXJjZTohMH0pLnRoZW4oRj0+e1BzLmlzT2soRik/cihGLnZhbHVlLm1vZHVsZXMpOihpKCJDb3VsZCBub3QgbG9hZCBtb2R1bGVzOiAiK0YuZXJyb3IubWVzc2FnZSksY29uc29sZS5lcnJvcihGLmVycm9yKSl9KX0pLmNhdGNoKGo9Pntjb25zb2xlLmVycm9yKGopfSl9LFtdKTtyZXR1cm4gdy5qc3goVFMuUHJvdmlkZXIse3ZhbHVlOnt0aGVtZTpTLHNldFRoZW1lOnYsYXBpOmUsZWRpdE1vZGU6ImZ1bGwiLHNlc3Npb246e3N0YXR1czoibm90LWFza2VkIn0saGlnaGxpZ2h0OiExLHNldEhpZ2hsaWdodDooKT0+e30sc2V0RWRpdE1vZGU6KCk9Pnt9LHNldFdpbmRvd1NpemU6KCk9Pnt9fSxjaGlsZHJlbjp3LmpzeHMoImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1jb250YWluZXIiLGNsYXNzTmFtZToicmVsYXRpdmUgZm9udC1zZXJpZiBhbnRpYWxpYXNlZCIsImRhdGEtbW9kZSI6UyxjaGlsZHJlbjpbdy5qc3goImRpdiIse2NsYXNzTmFtZToiZml4ZWQgLXRyYW5zbGF0ZS14LTEvMiB6LW92ZXJsYXkgbGVmdC0xLzIgYm90dG9tLTQiLGNoaWxkcmVuOncuanN4KGJQLHthcGk6ZX0pfSksdy5qc3goImRpdiIse2lkOiJ2YWwtZnVsbHNjcmVlbi1ob3ZlciIscmVmOnl9KSx3LmpzeChuQy5Qcm92aWRlcix7dmFsdWU6e2hvdmVyRWxlbTp5PT1udWxsP3ZvaWQgMDp5LmN1cnJlbnR9LGNoaWxkcmVuOncuanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQtcHJpbWFyeSBiZy1iYWNrZ3JvdW5kIixjaGlsZHJlbjp3LmpzeHMoQXMse2NoaWxkcmVuOlt3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweC00IGgtWzUwcHhdIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIixjaGlsZHJlbjp3LmpzeChERSx7fSl9KSx3LmpzeChPcyx7Y2xhc3NOYW1lOiJweC00IixjaGlsZHJlbjpuP3cuanN4KHczLHtwYXRoczpPYmplY3Qua2V5cyhuKSxzZXRTZWxlY3RlZE1vZHVsZUlkOiQ9PnttKCQpfX0pOiFvJiZ3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJweS00IixjaGlsZHJlbjoiTG9hZGluZy4uLiJ9KX0pLHcuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IHctZnVsbCBoLVs1MHB4XSBnYXAtMiBmb250LXNlcmlmIHRleHQteHMiLGNoaWxkcmVuOlt3LmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e2hpc3RvcnkuYmFjaygpfSxjaGlsZHJlbjp3LmpzeChfUCx7fSl9KSx3LmpzeCgicCIse2NoaWxkcmVuOmx8fCIvIn0pXX0pLHcuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQiLGNoaWxkcmVuOltvJiZ3LmpzeHMoImRpdiIse2NsYXNzTmFtZToidGV4dC1sZyB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQiLGNoaWxkcmVuOlsiRVJST1I6ICIsb119KSxuJiZsJiZhJiZ1IT09dm9pZCAwJiZjIT09dm9pZCAwJiZ3LmpzeCh0Qy5Qcm92aWRlcix7dmFsdWU6bixjaGlsZHJlbjp3LmpzeChwMyx7cGF0aDpsLHNvdXJjZTp1LHNjaGVtYTpjLHNldFNlbGVjdGVkUGF0aDpzLGluaXRPblN1Ym1pdDp4fSl9KV19KV19KX0pfSldfSl9KX0sbkM9cS5jcmVhdGVDb250ZXh0KHtob3ZlckVsZW06bnVsbH0pLGgzPSgpPT5xLnVzZUNvbnRleHQobkMpO2Z1bmN0aW9uIHAzKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0Om99KXtjb25zdFssaV09d24uc3BsaXRNb2R1bGVJZEFuZE1vZHVsZVBhdGgoZSksbD13bi5yZXNvbHZlUGF0aChpLHQsbik7aWYoIWwpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCByZXNvbHZlIG1vZHVsZTogIitlKTtyZXR1cm4gdy5qc3gockMse3BhdGg6ZSxzb3VyY2U6bC5zb3VyY2Usc2NoZW1hOmwuc2NoZW1hLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDpvLHRvcDohMH0pfWZ1bmN0aW9uIHJDKHtwYXRoOmUsc291cmNlOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsZmllbGQ6byxpbml0T25TdWJtaXQ6aSx0b3A6bH0pe3JldHVybiB0PT09bnVsbHx8bi5vcHQ/dy5qc3goeTMse3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixmaWVsZDpvLGluaXRPblN1Ym1pdDppLHNldFNlbGVjdGVkUGF0aDpyfSk6bi50eXBlPT09Im9iamVjdCI/dHlwZW9mIHQhPSJvYmplY3QifHxIcyh0KT93LmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGV4cGVjdGVkIG9iamVjdCwgYnV0IGZvdW5kICIsdHlwZW9mIHRdfSk6dy5qc3gob0Mse3NvdXJjZTp0LHBhdGg6ZSxzY2hlbWE6bixpbml0T25TdWJtaXQ6aSxzZXRTZWxlY3RlZFBhdGg6cix0b3A6bH0pOm4udHlwZT09PSJhcnJheSI/dHlwZW9mIHQhPSJvYmplY3QifHwhSHModCk/dy5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbIkVSUk9SOiBleHBlY3RlZCBhcnJheSwgYnV0IGZvdW5kICIsdHlwZW9mIHRdfSk6dy5qc3goaUMse3NvdXJjZTp0LHBhdGg6ZSxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pOm4udHlwZT09PSJyZWNvcmQiP3R5cGVvZiB0IT0ib2JqZWN0Ij93LmpzeHMoImRpdiIse2NoaWxkcmVuOlsiRVJST1I6IGV4cGVjdGVkIG9iamVjdCBmb3IgIixuLnR5cGUsIiwgYnV0IGZvdW5kICIsdHlwZW9mIHRdfSk6SHModCk/dy5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbIkVSUk9SOiBkaWQgbm90IGV4cGVjdCBhcnJheSBmb3IgIixuLnR5cGVdfSk6dy5qc3goZzMse3NvdXJjZTp0LHBhdGg6ZSxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pOncuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJweS0yIGdhcC15LTQiLGNoaWxkcmVuOlt3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LWxlZnQiLGNoaWxkcmVuOm98fGV9KSx3LmpzeChNRSx7cGF0aDplLGRpc2FibGVkOiExLHNvdXJjZTp0LHNjaGVtYTpuLG9uU3VibWl0OmkoZSl9KV19KX1mdW5jdGlvbiBvQyh7cGF0aDplLHNvdXJjZTp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyLGluaXRPblN1Ym1pdDpvLHRvcDppfSl7cmV0dXJuIHcuanN4KCJkaXYiLHtjbGFzc05hbWU6cmQoImZsZXggZmxleC1jb2wgZ2FwLXktOCIseyJib3JkZXItbC0yIGJvcmRlci1ib3JkZXIgcGwtNiI6IWl9KSxjaGlsZHJlbjpPYmplY3QuZW50cmllcyhuLml0ZW1zKS5tYXAoKFtsLHNdKT0+e2NvbnN0IGE9RWEoZSxsKTtyZXR1cm4gdy5qc3gockMse3BhdGg6YSxzb3VyY2U6dFtsXSxzY2hlbWE6cyxzZXRTZWxlY3RlZFBhdGg6cixmaWVsZDpsLGluaXRPblN1Ym1pdDpvfSxhKX0pfSxlKX1mdW5jdGlvbiBnMyh7cGF0aDplLHNvdXJjZTp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSl7Y29uc3Qgbz1ObSgpO3JldHVybiB3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJmbGV4IGZsZXgtY29sIGdhcC00IHAtMiIsY2hpbGRyZW46T2JqZWN0LmVudHJpZXModCkubWFwKChbaSxsXSk9Pntjb25zdCBzPUVhKGUsaSk7cmV0dXJuIHcuanN4KCJidXR0b24iLHtvbkNsaWNrOigpPT57cihzKSxvKHMpfSxjaGlsZHJlbjp3LmpzeChtMyx7cmVjb3JkS2V5OmkscGF0aDpzLHNvdXJjZTpsLHNjaGVtYTpuLml0ZW19KX0scyl9KX0sZSl9Y29uc3QgVHA9MTcwO2Z1bmN0aW9uIG0zKHtyZWNvcmRLZXk6ZSxwYXRoOnQsc291cmNlOm4sc2NoZW1hOnJ9KXtjb25zdCBvPXEudXNlUmVmKG51bGwpLFtpLGxdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e28uY3VycmVudCYmby5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodD49VHAmJmwoITApfSxbXSksdy5qc3hzKENtLHtyZWY6byxjbGFzc05hbWU6InJlbGF0aXZlIHB4LTQgcHQtMiBwYi00IG92ZXJmbG93LWhpZGRlbiBib3JkZXIgZ2FwLXktMiIsc3R5bGU6e21heEhlaWdodDpUcH0sY2hpbGRyZW46W3cuanN4KCJkaXYiLHtjbGFzc05hbWU6InBiLTQgZm9udC1zZXJpZiB0ZXh0LWxlZnQgdGV4dC1hY2NlbnQiLGNoaWxkcmVuOmV9KSx3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LXhzIixjaGlsZHJlbjp3LmpzeChibSx7cGF0aDp0LHNvdXJjZTpuLHNjaGVtYTpyfSl9KSxpJiZ3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSBib3R0b20tMCBsZWZ0LTAgdy1mdWxsIGgtWzIwcHhdIGJnLWdyYWRpZW50LXRvLWIgZnJvbS10cmFuc3BhcmVudCB0by1iYWNrZ3JvdW5kIn0pXX0sdCl9ZnVuY3Rpb24gaUMoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cn0pe2NvbnN0IG89Tm0oKTtyZXR1cm4gdy5qc3goImRpdiIse2NsYXNzTmFtZToiZmxleCBmbGV4LWNvbCBnYXAtNCBwLTIiLGNoaWxkcmVuOnQubWFwKChpLGwpPT57Y29uc3Qgcz1FYShlLGwpO3JldHVybiB3LmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e3IocyksbyhzKX0sY2hpbGRyZW46dy5qc3godjMse2luZGV4OmwscGF0aDpzLHNvdXJjZTppLHNjaGVtYTpuLml0ZW19LHMpfSxzKX0pfSxlKX1jb25zdCB6MD1UcDtmdW5jdGlvbiB2Myh7aW5kZXg6ZSxwYXRoOnQsc291cmNlOm4sc2NoZW1hOnJ9KXtjb25zdCBvPXEudXNlUmVmKG51bGwpLFtpLGxdPXAudXNlU3RhdGUoITEpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e28uY3VycmVudCYmby5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodD49ejAmJmwoITApfSxbXSksdy5qc3hzKENtLHtyZWY6byxjbGFzc05hbWU6InJlbGF0aXZlIHB4LTQgcHQtMiBwYi00IG92ZXJmbG93LWhpZGRlbiBib3JkZXIgZ2FwLXktMiIsc3R5bGU6e21heEhlaWdodDp6MH0sY2hpbGRyZW46W3cuanN4KCJkaXYiLHtjbGFzc05hbWU6InBiLTQgZm9udC1zZXJpZiB0ZXh0LWxlZnQgdXBwZXJjYXNlIHRleHQtYWNjZW50IixjaGlsZHJlbjplKzE8MTA/YDAke2UrMX1gOmUrMX0pLHcuanN4KCJkaXYiLHtjbGFzc05hbWU6InRleHQteHMiLGNoaWxkcmVuOncuanN4KGJtLHtwYXRoOnQsc291cmNlOm4sc2NoZW1hOnJ9KX0pLGkmJncuanN4KCJkaXYiLHtjbGFzc05hbWU6ImFic29sdXRlIGJvdHRvbS0wIGxlZnQtMCB3LWZ1bGwgaC1bMjBweF0gYmctZ3JhZGllbnQtdG8tYiBmcm9tLXRyYW5zcGFyZW50IHRvLWJhY2tncm91bmQifSldfSl9ZnVuY3Rpb24gRWEoZSx0KXtjb25zdCBuPXduLmNyZWF0ZVZhbFBhdGhPZkl0ZW0oZSx0KTtpZighbil0aHJvdyBFcnJvcihgQ291bGQgbm90IGNyZWF0ZSB2YWwgcGF0aDogJHtlfSBvZiAke3Q9PW51bGw/dm9pZCAwOnQudG9TdHJpbmcoKX1gKTtyZXR1cm4gbn1mdW5jdGlvbiBibSh7cGF0aDplLHNvdXJjZTp0LHNjaGVtYTpufSl7Y29uc3RbcixvXT1wLnVzZVN0YXRlKG51bGwpLHtob3ZlckVsZW06aX09aDMoKTtpZihuLnR5cGU9PT0ib2JqZWN0IilyZXR1cm4gdy5qc3goImRpdiIse2NsYXNzTmFtZToiZ3JpZCBncmlkLWNvbHMtW21pbi1jb250ZW50XzFmcl0gZ2FwLTIgdGV4dC1sZWZ0IixjaGlsZHJlbjpPYmplY3QuZW50cmllcyhuLml0ZW1zKS5tYXAoKFtsXSk9PncuanN4cyhwLkZyYWdtZW50LHtjaGlsZHJlbjpbdy5qc3hzKCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LW11dGVkIixjaGlsZHJlbjpbbCwiOiJdfSksdy5qc3goInNwYW4iLHtjaGlsZHJlbjp3LmpzeChibSx7c291cmNlOih0PT1udWxsP3ZvaWQgMDp0W2xdKT8/bnVsbCxzY2hlbWE6bi5pdGVtc1tsXSxwYXRoOkVhKGUsbCl9KX0pXX0sRWEoZSxsKSkpfSxlKTtpZihuLnR5cGU9PT0iYXJyYXkiKXJldHVybiB0PT09bnVsbD93LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOkFycmF5LmlzQXJyYXkodCk/dy5qc3hzKCJzcGFuIix7Y2hpbGRyZW46W3cuanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46dC5sZW5ndGh9KSx3LmpzeCgic3BhbiIse2NoaWxkcmVuOnQubGVuZ3RoPT09MT8iIGl0ZW0iOiIgaXRlbXMifSldfSxlKTp3LmpzeCgic3BhbiIse2NsYXNzTmFtZToicHgtMiBiZy1kZXN0cnVjdGl2ZSB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQiLGNoaWxkcmVuOiJVbmtub3duIGxlbmd0aCJ9LGUpO2lmKG4udHlwZT09PSJyaWNodGV4dCIpcmV0dXJuIHQ9PT1udWxsP3cuanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sZSk6dHlwZW9mIHQhPSJvYmplY3QiP3cuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJwLTQgdGV4dC1kZXN0cnVjdGl2ZS1mb3JlZ3JvdW5kIGJnLWRlc3RydWN0aXZlIixjaGlsZHJlbjpbIkVSUk9SOiAiLHR5cGVvZiB0LCIgbm90IGFuIG9iamVjdCJdfSxlKTohKEt0IGluIHQpfHx0W0t0XSE9PSJyaWNodGV4dCI/dy5qc3goImRpdiIse2NsYXNzTmFtZToicC00IHRleHQtZGVzdHJ1Y3RpdmUtZm9yZWdyb3VuZCBiZy1kZXN0cnVjdGl2ZSIsY2hpbGRyZW46IkVSUk9SOiBvYmplY3QgaXMgbm90IHJpY2h0ZXh0In0sZSk6dy5qc3goUzMse2NoaWxkcmVuOkJTKHQpfSxlKTtpZihuLnR5cGU9PT0ic3RyaW5nIilyZXR1cm4gdD09PW51bGw/dy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTp3LmpzeCgic3BhbiIse2NoaWxkcmVuOnR9KTtpZihuLnR5cGU9PT0iaW1hZ2UiKXtpZih0PT09bnVsbClyZXR1cm4gdy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjoiRW1wdHkifSxlKTtpZih0eXBlb2YgdCE9Im9iamVjdCIpcmV0dXJuIHcuanN4KCJkaXYiLHtjbGFzc05hbWU6InAtNCB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQgYmctZGVzdHJ1Y3RpdmUiLGNoaWxkcmVuOiJFUlJPUjogbm90IGFuIG9iamVjdCJ9LGUpO2lmKCEoaG4gaW4gdCl8fHR5cGVvZiB0W2huXSE9InN0cmluZyIpcmV0dXJuIHcuanN4KCJkaXYiLHtjbGFzc05hbWU6InAtNCB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQgYmctZGVzdHJ1Y3RpdmUiLGNoaWxkcmVuOiJFUlJPUjogb2JqZWN0IGlzIG5vdCBhbiBpbWFnZSJ9LGUpO2NvbnN0IGw9d24uY29udmVydEZpbGVTb3VyY2UodCkudXJsO3JldHVybiB3LmpzeHMoInNwYW4iLHtvbk1vdXNlT3ZlcjpzPT57byh7eDpzLmNsaWVudFgseTpzLmNsaWVudFl9KX0sb25Nb3VzZUxlYXZlOigpPT57byhudWxsKX0sY2xhc3NOYW1lOiJyZWxhdGl2ZSBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LXN0YXJ0IGdhcC0xIixjaGlsZHJlbjpbdy5qc3goImEiLHtocmVmOmwsY2xhc3NOYW1lOiJvdmVyZmxvdy1oaWRkZW4gdW5kZXJsaW5lIHRydW5jYXRlICIsY2hpbGRyZW46dFtobl19KSxyJiZpJiZIci5jcmVhdGVQb3J0YWwody5qc3goImltZyIse2NsYXNzTmFtZToiYWJzb2x1dGUgei1bNV0gbWF4LXctWzEwdnddIixzdHlsZTp7bGVmdDpyLngrMTAsdG9wOnIueSsxMH0sc3JjOmx9KSxpKV19LGUpfWVsc2V7aWYobi50eXBlPT09ImJvb2xlYW4iKXJldHVybiB0PT09bnVsbD93LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOncuanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46dD8idHJ1ZSI6ImZhbHNlIn0sZSk7aWYobi50eXBlPT09Im51bWJlciIpcmV0dXJuIHQ9PT1udWxsP3cuanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46IkVtcHR5In0sZSk6dy5qc3goInNwYW4iLHtjbGFzc05hbWU6InRleHQtYWNjZW50IixjaGlsZHJlbjp0LnRvU3RyaW5nKCl9KTtpZihuLnR5cGU9PT0ia2V5T2YiKXJldHVybiB0PT09bnVsbD93LmpzeCgic3BhbiIse2NsYXNzTmFtZToidGV4dC1hY2NlbnQiLGNoaWxkcmVuOiJFbXB0eSJ9LGUpOncuanN4KCJzcGFuIix7Y2xhc3NOYW1lOiJ0ZXh0LWFjY2VudCIsY2hpbGRyZW46dC50b1N0cmluZygpfSxlKX1yZXR1cm4gdy5qc3hzKCJkaXYiLHtjaGlsZHJlbjpbIlRPRE86ICIsbi50eXBlXX0sZSl9ZnVuY3Rpb24geTMoe3BhdGg6ZSxzb3VyY2U6dCxzY2hlbWE6bixzZXRTZWxlY3RlZFBhdGg6cixpbml0T25TdWJtaXQ6byxmaWVsZDppfSl7Y29uc3RbbCxzXT1wLnVzZVN0YXRlKHQhPT1udWxsKTtyZXR1cm4gdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggZmxleC1jb2wgZ2FwLXktNiIsY2hpbGRyZW46W2k/dy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktc3RhcnQgZ2FwLXgtNCIsY2hpbGRyZW46W3cuanN4KFNwLHtjaGVja2VkOmwsb25DbGljazooKT0+e3MoYT0+IWEpfX0pLHcuanN4KCJzcGFuIix7Y2hpbGRyZW46aX0pXX0pOncuanN4KFNwLHtjaGVja2VkOmwsb25DbGljazooKT0+e3MoYT0+IWEpfX0pLGwmJncuanN4KHgzLHtzb3VyY2U6dCxzY2hlbWE6bixwYXRoOmUsc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0Om99KV19LGUpfWZ1bmN0aW9uIHgzKHtzb3VyY2U6ZSxwYXRoOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0Om99KXtpZihuLnR5cGU9PT0iYXJyYXkiKXtpZih0eXBlb2YgZT09Im9iamVjdCImJihlPT09bnVsbHx8SHMoZSkpKXJldHVybiB3LmpzeChpQyx7c291cmNlOmU9PT1udWxsP1tdOmUscGF0aDp0LHNjaGVtYTpuLHNldFNlbGVjdGVkUGF0aDpyfSl9ZWxzZSBpZihuLnR5cGU9PT0ib2JqZWN0Iil7aWYodHlwZW9mIGU9PSJvYmplY3QiJiYoZT09PW51bGx8fCFIcyhlKSkpcmV0dXJuIHcuanN4KG9DLHtzb3VyY2U6ZSxwYXRoOnQsc2NoZW1hOm4sc2V0U2VsZWN0ZWRQYXRoOnIsaW5pdE9uU3VibWl0Om99KX1lbHNlIGlmKG4udHlwZT09PSJyaWNodGV4dCJ8fG4udHlwZT09PSJzdHJpbmcifHxuLnR5cGU9PT0iaW1hZ2UifHxuLnR5cGU9PT0ibnVtYmVyInx8bi50eXBlPT09ImtleU9mIilyZXR1cm4gdy5qc3goTUUse3BhdGg6dCxkaXNhYmxlZDohMSxzb3VyY2U6ZSxzY2hlbWE6bixvblN1Ym1pdDpvKHQpfSx0KTtyZXR1cm4gdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6InAtNCBiZy1kZXN0cnVjdGl2ZSB0ZXh0LWRlc3RydWN0aXZlLWZvcmVncm91bmQiLGNoaWxkcmVuOlsiRVJST1I6IHVuZXhwZWN0ZWQgc291cmNlIHR5cGUgIix0eXBlb2YgZSwiIGZvciBzY2hlbWEgdHlwZSIsIiAiLG4udHlwZV19KX1mdW5jdGlvbiBIcyhlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKX1mdW5jdGlvbiBfMyhlKXtjb25zdCB0PXt9O3JldHVybiBlLmZvckVhY2gobj0+e2NvbnN0IHI9bi5zcGxpdCgiLyIpLmZpbHRlcihpPT5pIT09IiIpO2xldCBvPXQ7ci5mb3JFYWNoKGk9PntvW2ldfHwob1tpXT17fSksbz1vW2ldfSl9KSx0fWZ1bmN0aW9uIHczKHtwYXRoczplLHNldFNlbGVjdGVkTW9kdWxlSWQ6dH0pe2NvbnN0IG49XzMoZSk7cmV0dXJuIHcuanN4KE1fLHtjaGlsZHJlbjpPYmplY3QuZW50cmllcyhuKS5tYXAoKFtyLG9dKT0+dy5qc3goImRpdiIse2NsYXNzTmFtZToicHgtNCBweS0yIixjaGlsZHJlbjp3LmpzeChsQyx7bmFtZTpyLHRyZWU6byxtb2R1bGVJZDpgLyR7cn1gLHNldFNlbGVjdGVkTW9kdWxlSWQ6dH0pfSxgLyR7cn1gKSl9KX1mdW5jdGlvbiBsQyh7bmFtZTplLHRyZWU6dCxtb2R1bGVJZDpuLHNldFNlbGVjdGVkTW9kdWxlSWQ6cn0pe3JldHVybiB3LmpzeHMoImRpdiIse2NoaWxkcmVuOlt3LmpzeCgiYnV0dG9uIix7b25DbGljazooKT0+e3Iobil9LGNoaWxkcmVuOmV9KSxPYmplY3QuZW50cmllcyh0KS5tYXAoKFtvLGldKT0+dy5qc3goImRpdiIse2NsYXNzTmFtZToicHgtNCBweS0xIixjaGlsZHJlbjp3LmpzeChsQyx7bmFtZTpvLHRyZWU6aSxtb2R1bGVJZDpgJHtufS8ke299YCxzZXRTZWxlY3RlZE1vZHVsZUlkOnJ9KX0sYCR7bn0vJHtvfWApKV19KX1jb25zdCBGMD17dGFnczp7aDE6ImZvbnQtYm9sZCIsaDI6ImZvbnQtYm9sZCIsaDM6ImZvbnQtYm9sZCIsaDQ6ImZvbnQtYm9sZCIsaDU6ImZvbnQtYm9sZCIsaDY6ImZvbnQtYm9sZCIscDoiIn0sY2xhc3Nlczp7Ym9sZDoiZm9udC1ib2xkIixpdGFsaWM6Iml0YWxpYyIsbGluZVRocm91Z2g6ImxpbmUtdGhyb3VnaCJ9fTtmdW5jdGlvbiBTMyh7Y2hpbGRyZW46ZX0pe2NvbnN0IHQ9ZTtmdW5jdGlvbiBuKGksbCl7Y29uc3Qgcz1GMC50YWdzW2ldO3JldHVybiBzJiZsP1tsLHNdLmpvaW4oIiAiKTpzfHxsfWZ1bmN0aW9uIHIoaSxsKXtjb25zdCBzPUYwLmNsYXNzZXNbaV07cmV0dXJuIHMmJmw/W2wsc10uam9pbigiICIpOnN8fGx9ZnVuY3Rpb24gbyhpLGwpe3ZhciB1LGM7aWYodHlwZW9mIGk9PSJzdHJpbmciKXJldHVybiBpO2lmKGkudGFnPT09InAiKXJldHVybiB3LmpzeCgicCIse2NsYXNzTmFtZTpuKCJwIiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09ImltZyIpcmV0dXJuIHcuanN4KCJpbWciLHtjbGFzc05hbWU6bigiaW1nIiksc3JjOmkuc3JjfSxsKTtpZihpLnRhZz09PSJ1bCIpcmV0dXJuIHcuanN4KCJ1bCIse2NsYXNzTmFtZTpuKCJ1bCIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJvbCIpcmV0dXJuIHcuanN4KCJvbCIse2NsYXNzTmFtZTpuKCJvbCIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJsaSIpcmV0dXJuIHcuanN4KCJsaSIse2NsYXNzTmFtZTpuKCJsaSIpLGNoaWxkcmVuOmkuY2hpbGRyZW4ubWFwKChkLGYpPT5vKGQsZikpfSxsKTtpZihpLnRhZz09PSJzcGFuIilyZXR1cm4gdy5qc3goInNwYW4iLHtjbGFzc05hbWU6aS5jbGFzc2VzLm1hcChkPT57c3dpdGNoKGQpe2Nhc2UiYm9sZCI6cmV0dXJuIHIoImJvbGQiKTtjYXNlImxpbmUtdGhyb3VnaCI6cmV0dXJuIHIoImxpbmVUaHJvdWdoIik7Y2FzZSJpdGFsaWMiOnJldHVybiByKCJpdGFsaWMiKX19KS5qb2luKCIgIiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09ImgxIilyZXR1cm4gdy5qc3goImgxIix7Y2xhc3NOYW1lOm4oImgxIiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09ImgyIilyZXR1cm4gdy5qc3goImgyIix7Y2xhc3NOYW1lOm4oImgyIiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09ImgzIilyZXR1cm4gdy5qc3goImgzIix7Y2xhc3NOYW1lOm4oImgzIiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09Img0IilyZXR1cm4gdy5qc3goImg0Iix7Y2xhc3NOYW1lOm4oImg0IiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09Img1IilyZXR1cm4gdy5qc3goImg1Iix7Y2xhc3NOYW1lOm4oImg1IiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09Img2IilyZXR1cm4gdy5qc3goImg2Iix7Y2xhc3NOYW1lOm4oImg2IiksY2hpbGRyZW46aS5jaGlsZHJlbi5tYXAoKGQsZik9Pm8oZCxmKSl9LGwpO2lmKGkudGFnPT09ImJyIilyZXR1cm4gdy5qc3goImJyIix7fSxsKTtpZihpLnRhZz09PSJhIilyZXR1cm4gdy5qc3goImEiLHtocmVmOmkuaHJlZixjaGlsZHJlbjppLmNoaWxkcmVuLm1hcCgoZCxmKT0+byhkLGYpKX0sbCk7Y29uc29sZS5lcnJvcigiVW5rbm93biB0YWciLGkudGFnKTtjb25zdCBhPWkudGFnO3JldHVybiBhIT1udWxsJiZhLnRhZz9xLmNyZWF0ZUVsZW1lbnQoYS50YWcse2tleTpsLGNsYXNzTmFtZToodT1hLmNsYXNzKT09bnVsbD92b2lkIDA6dS5qb2luKCIgIiksY2hpbGRyZW46KGM9YS5jaGlsZHJlbik9PW51bGw/dm9pZCAwOmMubWFwKG8pfSk6bnVsbH1yZXR1cm4gdy5qc3goInNwYW4iLHsiZGF0YS12YWwtcGF0aCI6dC52YWxQYXRoLGNoaWxkcmVuOnQuY2hpbGRyZW4ubWFwKChpLGwpPT5vKGksbCkpfSl9Y29uc3QgRTM9cC5jcmVhdGVDb250ZXh0KG51bGwpLE1mPXtkaWRDYXRjaDohMSxlcnJvcjpudWxsfTtjbGFzcyBDMyBleHRlbmRzIHAuQ29tcG9uZW50e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMucmVzZXRFcnJvckJvdW5kYXJ5PXRoaXMucmVzZXRFcnJvckJvdW5kYXJ5LmJpbmQodGhpcyksdGhpcy5zdGF0ZT1NZn1zdGF0aWMgZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yKHQpe3JldHVybntkaWRDYXRjaDohMCxlcnJvcjp0fX1yZXNldEVycm9yQm91bmRhcnkoKXtjb25zdHtlcnJvcjp0fT10aGlzLnN0YXRlO2lmKHQhPT1udWxsKXtmb3IodmFyIG4scixvPWFyZ3VtZW50cy5sZW5ndGgsaT1uZXcgQXJyYXkobyksbD0wO2w8bztsKyspaVtsXT1hcmd1bWVudHNbbF07KG49KHI9dGhpcy5wcm9wcykub25SZXNldCk9PT1udWxsfHxuPT09dm9pZCAwfHxuLmNhbGwocix7YXJnczppLHJlYXNvbjoiaW1wZXJhdGl2ZS1hcGkifSksdGhpcy5zZXRTdGF0ZShNZil9fWNvbXBvbmVudERpZENhdGNoKHQsbil7dmFyIHIsbzsocj0obz10aGlzLnByb3BzKS5vbkVycm9yKT09PW51bGx8fHI9PT12b2lkIDB8fHIuY2FsbChvLHQsbil9Y29tcG9uZW50RGlkVXBkYXRlKHQsbil7Y29uc3R7ZGlkQ2F0Y2g6cn09dGhpcy5zdGF0ZSx7cmVzZXRLZXlzOm99PXRoaXMucHJvcHM7aWYociYmbi5lcnJvciE9PW51bGwmJiQzKHQucmVzZXRLZXlzLG8pKXt2YXIgaSxsOyhpPShsPXRoaXMucHJvcHMpLm9uUmVzZXQpPT09bnVsbHx8aT09PXZvaWQgMHx8aS5jYWxsKGwse25leHQ6byxwcmV2OnQucmVzZXRLZXlzLHJlYXNvbjoia2V5cyJ9KSx0aGlzLnNldFN0YXRlKE1mKX19cmVuZGVyKCl7Y29uc3R7Y2hpbGRyZW46dCxmYWxsYmFja1JlbmRlcjpuLEZhbGxiYWNrQ29tcG9uZW50OnIsZmFsbGJhY2s6b309dGhpcy5wcm9wcyx7ZGlkQ2F0Y2g6aSxlcnJvcjpsfT10aGlzLnN0YXRlO2xldCBzPXQ7aWYoaSl7Y29uc3QgYT17ZXJyb3I6bCxyZXNldEVycm9yQm91bmRhcnk6dGhpcy5yZXNldEVycm9yQm91bmRhcnl9O2lmKHAuaXNWYWxpZEVsZW1lbnQobykpcz1vO2Vsc2UgaWYodHlwZW9mIG49PSJmdW5jdGlvbiIpcz1uKGEpO2Vsc2UgaWYocilzPXAuY3JlYXRlRWxlbWVudChyLGEpO2Vsc2UgdGhyb3cgbH1yZXR1cm4gcC5jcmVhdGVFbGVtZW50KEUzLlByb3ZpZGVyLHt2YWx1ZTp7ZGlkQ2F0Y2g6aSxlcnJvcjpsLHJlc2V0RXJyb3JCb3VuZGFyeTp0aGlzLnJlc2V0RXJyb3JCb3VuZGFyeX19LHMpfX1mdW5jdGlvbiAkMygpe2xldCBlPWFyZ3VtZW50cy5sZW5ndGg+MCYmYXJndW1lbnRzWzBdIT09dm9pZCAwP2FyZ3VtZW50c1swXTpbXSx0PWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzWzFdIT09dm9pZCAwP2FyZ3VtZW50c1sxXTpbXTtyZXR1cm4gZS5sZW5ndGghPT10Lmxlbmd0aHx8ZS5zb21lKChuLHIpPT4hT2JqZWN0LmlzKG4sdFtyXSkpfWNvbnN0IHNDPSJDb2xsYXBzaWJsZSIsW2szLGFDXT1DaShzQyksW1QzLFJtXT1rMyhzQyksTjM9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUNvbGxhcHNpYmxlOm4sb3BlbjpyLGRlZmF1bHRPcGVuOm8sZGlzYWJsZWQ6aSxvbk9wZW5DaGFuZ2U6bCwuLi5zfT1lLFthPSExLHVdPWJsKHtwcm9wOnIsZGVmYXVsdFByb3A6byxvbkNoYW5nZTpsfSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChUMyx7c2NvcGU6bixkaXNhYmxlZDppLGNvbnRlbnRJZDp4ZCgpLG9wZW46YSxvbk9wZW5Ub2dnbGU6cC51c2VDYWxsYmFjaygoKT0+dShjPT4hYyksW3VdKX0scC5jcmVhdGVFbGVtZW50KERlLmRpdixlZSh7ImRhdGEtc3RhdGUiOlBtKGEpLCJkYXRhLWRpc2FibGVkIjppPyIiOnZvaWQgMH0scyx7cmVmOnR9KSkpfSksYjM9IkNvbGxhcHNpYmxlVHJpZ2dlciIsUjM9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUNvbGxhcHNpYmxlOm4sLi4ucn09ZSxvPVJtKGIzLG4pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQoRGUuYnV0dG9uLGVlKHt0eXBlOiJidXR0b24iLCJhcmlhLWNvbnRyb2xzIjpvLmNvbnRlbnRJZCwiYXJpYS1leHBhbmRlZCI6by5vcGVufHwhMSwiZGF0YS1zdGF0ZSI6UG0oby5vcGVuKSwiZGF0YS1kaXNhYmxlZCI6by5kaXNhYmxlZD8iIjp2b2lkIDAsZGlzYWJsZWQ6by5kaXNhYmxlZH0scix7cmVmOnQsb25DbGljazpIZShlLm9uQ2xpY2ssby5vbk9wZW5Ub2dnbGUpfSkpfSksdUM9IkNvbGxhcHNpYmxlQ29udGVudCIsUDM9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7Zm9yY2VNb3VudDpuLC4uLnJ9PWUsbz1SbSh1QyxlLl9fc2NvcGVDb2xsYXBzaWJsZSk7cmV0dXJuIHAuY3JlYXRlRWxlbWVudChEbCx7cHJlc2VudDpufHxvLm9wZW59LCh7cHJlc2VudDppfSk9PnAuY3JlYXRlRWxlbWVudChPMyxlZSh7fSxyLHtyZWY6dCxwcmVzZW50Oml9KSkpfSksTzM9cC5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7X19zY29wZUNvbGxhcHNpYmxlOm4scHJlc2VudDpyLGNoaWxkcmVuOm8sLi4uaX09ZSxsPVJtKHVDLG4pLFtzLGFdPXAudXNlU3RhdGUociksdT1wLnVzZVJlZihudWxsKSxjPVhlKHQsdSksZD1wLnVzZVJlZigwKSxmPWQuY3VycmVudCxoPXAudXNlUmVmKDApLGc9aC5jdXJyZW50LG09bC5vcGVufHxzLFM9cC51c2VSZWYobSksdj1wLnVzZVJlZigpO3JldHVybiBwLnVzZUVmZmVjdCgoKT0+e2NvbnN0IHk9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT5TLmN1cnJlbnQ9ITEpO3JldHVybigpPT5jYW5jZWxBbmltYXRpb25GcmFtZSh5KX0sW10pLCRuKCgpPT57Y29uc3QgeT11LmN1cnJlbnQ7aWYoeSl7di5jdXJyZW50PXYuY3VycmVudHx8e3RyYW5zaXRpb25EdXJhdGlvbjp5LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbixhbmltYXRpb25OYW1lOnkuc3R5bGUuYW5pbWF0aW9uTmFtZX0seS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249IjBzIix5LnN0eWxlLmFuaW1hdGlvbk5hbWU9Im5vbmUiO2NvbnN0IHg9eS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtkLmN1cnJlbnQ9eC5oZWlnaHQsaC5jdXJyZW50PXgud2lkdGgsUy5jdXJyZW50fHwoeS5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249di5jdXJyZW50LnRyYW5zaXRpb25EdXJhdGlvbix5LnN0eWxlLmFuaW1hdGlvbk5hbWU9di5jdXJyZW50LmFuaW1hdGlvbk5hbWUpLGEocil9fSxbbC5vcGVuLHJdKSxwLmNyZWF0ZUVsZW1lbnQoRGUuZGl2LGVlKHsiZGF0YS1zdGF0ZSI6UG0obC5vcGVuKSwiZGF0YS1kaXNhYmxlZCI6bC5kaXNhYmxlZD8iIjp2b2lkIDAsaWQ6bC5jb250ZW50SWQsaGlkZGVuOiFtfSxpLHtyZWY6YyxzdHlsZTp7Ii0tcmFkaXgtY29sbGFwc2libGUtY29udGVudC1oZWlnaHQiOmY/YCR7Zn1weGA6dm9pZCAwLCItLXJhZGl4LWNvbGxhcHNpYmxlLWNvbnRlbnQtd2lkdGgiOmc/YCR7Z31weGA6dm9pZCAwLC4uLmUuc3R5bGV9fSksbSYmbyl9KTtmdW5jdGlvbiBQbShlKXtyZXR1cm4gZT8ib3BlbiI6ImNsb3NlZCJ9Y29uc3QgQTM9TjMsTTM9UjMsRDM9UDMsQm89IkFjY29yZGlvbiIsTDM9WyJIb21lIiwiRW5kIiwiQXJyb3dEb3duIiwiQXJyb3dVcCIsIkFycm93TGVmdCIsIkFycm93UmlnaHQiXSxbT20sSTMsajNdPUhTKEJvKSxbUmQseDRdPUNpKEJvLFtqMyxhQ10pLEFtPWFDKCksY0M9cS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dHlwZTpuLC4uLnJ9PWUsbz1yLGk9cjtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KE9tLlByb3ZpZGVyLHtzY29wZTplLl9fc2NvcGVBY2NvcmRpb259LG49PT0ibXVsdGlwbGUiP3EuY3JlYXRlRWxlbWVudChXMyxlZSh7fSxpLHtyZWY6dH0pKTpxLmNyZWF0ZUVsZW1lbnQoQjMsZWUoe30sbyx7cmVmOnR9KSkpfSk7Y0MucHJvcFR5cGVzPXt0eXBlKGUpe2NvbnN0IHQ9ZS52YWx1ZXx8ZS5kZWZhdWx0VmFsdWU7cmV0dXJuIGUudHlwZSYmIVsic2luZ2xlIiwibXVsdGlwbGUiXS5pbmNsdWRlcyhlLnR5cGUpP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgb25lIG9mIGBzaW5nbGUgfCBtdWx0aXBsZWAuIik6ZS50eXBlPT09Im11bHRpcGxlIiYmdHlwZW9mIHQ9PSJzdHJpbmciP25ldyBFcnJvcigiSW52YWxpZCBwcm9wIGB0eXBlYCBzdXBwbGllZCB0byBgQWNjb3JkaW9uYC4gRXhwZWN0ZWQgYHNpbmdsZWAgd2hlbiBgZGVmYXVsdFZhbHVlYCBvciBgdmFsdWVgIGlzIHR5cGUgYHN0cmluZ2AuIik6ZS50eXBlPT09InNpbmdsZSImJkFycmF5LmlzQXJyYXkodCk/bmV3IEVycm9yKCJJbnZhbGlkIHByb3AgYHR5cGVgIHN1cHBsaWVkIHRvIGBBY2NvcmRpb25gLiBFeHBlY3RlZCBgbXVsdGlwbGVgIHdoZW4gYGRlZmF1bHRWYWx1ZWAgb3IgYHZhbHVlYCBpcyB0eXBlIGBzdHJpbmdbXWAuIik6bnVsbH19O2NvbnN0W2RDLHozXT1SZChCbyksW2ZDLEYzXT1SZChCbyx7Y29sbGFwc2libGU6ITF9KSxCMz1xLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHt2YWx1ZTpuLGRlZmF1bHRWYWx1ZTpyLG9uVmFsdWVDaGFuZ2U6bz0oKT0+e30sY29sbGFwc2libGU6aT0hMSwuLi5sfT1lLFtzLGFdPWJsKHtwcm9wOm4sZGVmYXVsdFByb3A6cixvbkNoYW5nZTpvfSk7cmV0dXJuIHEuY3JlYXRlRWxlbWVudChkQyx7c2NvcGU6ZS5fX3Njb3BlQWNjb3JkaW9uLHZhbHVlOnM/W3NdOltdLG9uSXRlbU9wZW46YSxvbkl0ZW1DbG9zZTpxLnVzZUNhbGxiYWNrKCgpPT5pJiZhKCIiKSxbaSxhXSl9LHEuY3JlYXRlRWxlbWVudChmQyx7c2NvcGU6ZS5fX3Njb3BlQWNjb3JkaW9uLGNvbGxhcHNpYmxlOml9LHEuY3JlYXRlRWxlbWVudChoQyxlZSh7fSxsLHtyZWY6dH0pKSkpfSksVzM9cS5mb3J3YXJkUmVmKChlLHQpPT57Y29uc3R7dmFsdWU6bixkZWZhdWx0VmFsdWU6cixvblZhbHVlQ2hhbmdlOm89KCk9Pnt9LC4uLml9PWUsW2w9W10sc109Ymwoe3Byb3A6bixkZWZhdWx0UHJvcDpyLG9uQ2hhbmdlOm99KSxhPXEudXNlQ2FsbGJhY2soYz0+cygoZD1bXSk9PlsuLi5kLGNdKSxbc10pLHU9cS51c2VDYWxsYmFjayhjPT5zKChkPVtdKT0+ZC5maWx0ZXIoZj0+ZiE9PWMpKSxbc10pO3JldHVybiBxLmNyZWF0ZUVsZW1lbnQoZEMse3Njb3BlOmUuX19zY29wZUFjY29yZGlvbix2YWx1ZTpsLG9uSXRlbU9wZW46YSxvbkl0ZW1DbG9zZTp1fSxxLmNyZWF0ZUVsZW1lbnQoZkMse3Njb3BlOmUuX19zY29wZUFjY29yZGlvbixjb2xsYXBzaWJsZTohMH0scS5jcmVhdGVFbGVtZW50KGhDLGVlKHt9LGkse3JlZjp0fSkpKSl9KSxbVTMsUGRdPVJkKEJvKSxoQz1xLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sZGlzYWJsZWQ6cixkaXI6byxvcmllbnRhdGlvbjppPSJ2ZXJ0aWNhbCIsLi4ubH09ZSxzPXEudXNlUmVmKG51bGwpLGE9WGUocyx0KSx1PUkzKG4pLGQ9VGcobyk9PT0ibHRyIixmPUhlKGUub25LZXlEb3duLGg9Pnt2YXIgZztpZighTDMuaW5jbHVkZXMoaC5rZXkpKXJldHVybjtjb25zdCBtPWgudGFyZ2V0LFM9dSgpLmZpbHRlcihNPT57dmFyIFI7cmV0dXJuISgoUj1NLnJlZi5jdXJyZW50KSE9PW51bGwmJlIhPT12b2lkIDAmJlIuZGlzYWJsZWQpfSksdj1TLmZpbmRJbmRleChNPT5NLnJlZi5jdXJyZW50PT09bSkseT1TLmxlbmd0aDtpZih2PT09LTEpcmV0dXJuO2gucHJldmVudERlZmF1bHQoKTtsZXQgeD12O2NvbnN0IF89MCxFPXktMSwkPSgpPT57eD12KzEseD5FJiYoeD1fKX0sQz0oKT0+e3g9di0xLHg8XyYmKHg9RSl9O3N3aXRjaChoLmtleSl7Y2FzZSJIb21lIjp4PV87YnJlYWs7Y2FzZSJFbmQiOng9RTticmVhaztjYXNlIkFycm93UmlnaHQiOmk9PT0iaG9yaXpvbnRhbCImJihkPyQoKTpDKCkpO2JyZWFrO2Nhc2UiQXJyb3dEb3duIjppPT09InZlcnRpY2FsIiYmJCgpO2JyZWFrO2Nhc2UiQXJyb3dMZWZ0IjppPT09Imhvcml6b250YWwiJiYoZD9DKCk6JCgpKTticmVhaztjYXNlIkFycm93VXAiOmk9PT0idmVydGljYWwiJiZDKCk7YnJlYWt9Y29uc3QgVD14JXk7KGc9U1tUXS5yZWYuY3VycmVudCk9PT1udWxsfHxnPT09dm9pZCAwfHxnLmZvY3VzKCl9KTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KFUzLHtzY29wZTpuLGRpc2FibGVkOnIsZGlyZWN0aW9uOm8sb3JpZW50YXRpb246aX0scS5jcmVhdGVFbGVtZW50KE9tLlNsb3Qse3Njb3BlOm59LHEuY3JlYXRlRWxlbWVudChEZS5kaXYsZWUoe30sbCx7ImRhdGEtb3JpZW50YXRpb24iOmkscmVmOmEsb25LZXlEb3duOnI/dm9pZCAwOmZ9KSkpKX0pLE5wPSJBY2NvcmRpb25JdGVtIixbVjMsTW1dPVJkKE5wKSxIMz1xLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sdmFsdWU6ciwuLi5vfT1lLGk9UGQoTnAsbiksbD16MyhOcCxuKSxzPUFtKG4pLGE9eGQoKSx1PXImJmwudmFsdWUuaW5jbHVkZXMocil8fCExLGM9aS5kaXNhYmxlZHx8ZS5kaXNhYmxlZDtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KFYzLHtzY29wZTpuLG9wZW46dSxkaXNhYmxlZDpjLHRyaWdnZXJJZDphfSxxLmNyZWF0ZUVsZW1lbnQoQTMsZWUoeyJkYXRhLW9yaWVudGF0aW9uIjppLm9yaWVudGF0aW9uLCJkYXRhLXN0YXRlIjpwQyh1KX0scyxvLHtyZWY6dCxkaXNhYmxlZDpjLG9wZW46dSxvbk9wZW5DaGFuZ2U6ZD0+e2Q/bC5vbkl0ZW1PcGVuKHIpOmwub25JdGVtQ2xvc2Uocil9fSkpKX0pLEszPSJBY2NvcmRpb25IZWFkZXIiLEczPXEuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVBY2NvcmRpb246biwuLi5yfT1lLG89UGQoQm8sbiksaT1NbShLMyxuKTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KERlLmgzLGVlKHsiZGF0YS1vcmllbnRhdGlvbiI6by5vcmllbnRhdGlvbiwiZGF0YS1zdGF0ZSI6cEMoaS5vcGVuKSwiZGF0YS1kaXNhYmxlZCI6aS5kaXNhYmxlZD8iIjp2b2lkIDB9LHIse3JlZjp0fSkpfSksQjA9IkFjY29yZGlvblRyaWdnZXIiLFkzPXEuZm9yd2FyZFJlZigoZSx0KT0+e2NvbnN0e19fc2NvcGVBY2NvcmRpb246biwuLi5yfT1lLG89UGQoQm8sbiksaT1NbShCMCxuKSxsPUYzKEIwLG4pLHM9QW0obik7cmV0dXJuIHEuY3JlYXRlRWxlbWVudChPbS5JdGVtU2xvdCx7c2NvcGU6bn0scS5jcmVhdGVFbGVtZW50KE0zLGVlKHsiYXJpYS1kaXNhYmxlZCI6aS5vcGVuJiYhbC5jb2xsYXBzaWJsZXx8dm9pZCAwLCJkYXRhLW9yaWVudGF0aW9uIjpvLm9yaWVudGF0aW9uLGlkOmkudHJpZ2dlcklkfSxzLHIse3JlZjp0fSkpKX0pLFgzPSJBY2NvcmRpb25Db250ZW50IixRMz1xLmZvcndhcmRSZWYoKGUsdCk9Pntjb25zdHtfX3Njb3BlQWNjb3JkaW9uOm4sLi4ucn09ZSxvPVBkKEJvLG4pLGk9TW0oWDMsbiksbD1BbShuKTtyZXR1cm4gcS5jcmVhdGVFbGVtZW50KEQzLGVlKHtyb2xlOiJyZWdpb24iLCJhcmlhLWxhYmVsbGVkYnkiOmkudHJpZ2dlcklkLCJkYXRhLW9yaWVudGF0aW9uIjpvLm9yaWVudGF0aW9ufSxsLHIse3JlZjp0LHN0eWxlOnsiLS1yYWRpeC1hY2NvcmRpb24tY29udGVudC1oZWlnaHQiOiJ2YXIoLS1yYWRpeC1jb2xsYXBzaWJsZS1jb250ZW50LWhlaWdodCkiLCItLXJhZGl4LWFjY29yZGlvbi1jb250ZW50LXdpZHRoIjoidmFyKC0tcmFkaXgtY29sbGFwc2libGUtY29udGVudC13aWR0aCkiLC4uLmUuc3R5bGV9fSkpfSk7ZnVuY3Rpb24gcEMoZSl7cmV0dXJuIGU/Im9wZW4iOiJjbG9zZWQifWNvbnN0IEozPWNDLFozPUgzLHEzPUczLGdDPVkzLG1DPVEzLGU0PUozLHZDPXAuZm9yd2FyZFJlZigoe2NsYXNzTmFtZTplLC4uLnR9LG4pPT53LmpzeChaMyx7cmVmOm4sY2xhc3NOYW1lOm90KCJib3JkZXItYiIsZSksLi4udH0pKTt2Qy5kaXNwbGF5TmFtZT0iQWNjb3JkaW9uSXRlbSI7Y29uc3QgeUM9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsY2hpbGRyZW46dCwuLi5ufSxyKT0+dy5qc3gocTMse2NsYXNzTmFtZToiZmxleCIsY2hpbGRyZW46dy5qc3hzKGdDLHtyZWY6cixjbGFzc05hbWU6b3QoImZsZXggZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gcHktNCBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBob3Zlcjp1bmRlcmxpbmUgWyZbZGF0YS1zdGF0ZT1vcGVuXT5zdmddOnJvdGF0ZS0xODAiLGUpLC4uLm4sY2hpbGRyZW46W3Qsdy5qc3goTVMse2NsYXNzTmFtZToidy00IGgtNCB0cmFuc2l0aW9uLXRyYW5zZm9ybSBkdXJhdGlvbi0yMDAgc2hyaW5rLTAifSldfSl9KSk7eUMuZGlzcGxheU5hbWU9Z0MuZGlzcGxheU5hbWU7Y29uc3QgeEM9cC5mb3J3YXJkUmVmKCh7Y2xhc3NOYW1lOmUsY2hpbGRyZW46dCwuLi5ufSxyKT0+dy5qc3gobUMse3JlZjpyLGNsYXNzTmFtZTpvdCgib3ZlcmZsb3ctaGlkZGVuIHRleHQtc20gdHJhbnNpdGlvbi1hbGwgZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLWFjY29yZGlvbi11cCBkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWFjY29yZGlvbi1kb3duIixlKSwuLi5uLGNoaWxkcmVuOncuanN4KCJkaXYiLHtjbGFzc05hbWU6InB0LTAgcGItNCIsY2hpbGRyZW46dH0pfSkpO3hDLmRpc3BsYXlOYW1lPW1DLmRpc3BsYXlOYW1lOy8qKgogKiBSZWFjdCBSb3V0ZXIgRE9NIHY2LjE4LjAKICoKICogQ29weXJpZ2h0IChjKSBSZW1peCBTb2Z0d2FyZSBJbmMuCiAqCiAqIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZQogKiBMSUNFTlNFLm1kIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuCiAqCiAqIEBsaWNlbnNlIE1JVAogKi9mdW5jdGlvbiB6Yygpe3JldHVybiB6Yz1PYmplY3QuYXNzaWduP09iamVjdC5hc3NpZ24uYmluZCgpOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPWFyZ3VtZW50c1t0XTtmb3IodmFyIHIgaW4gbilPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobixyKSYmKGVbcl09bltyXSl9cmV0dXJuIGV9LHpjLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiB0NChlLHQpe3JldHVybiBJTSh7YmFzZW5hbWU6dD09bnVsbD92b2lkIDA6dC5iYXNlbmFtZSxmdXR1cmU6emMoe30sdD09bnVsbD92b2lkIDA6dC5mdXR1cmUse3Y3X3ByZXBlbmRCYXNlbmFtZTohMH0pLGhpc3Rvcnk6aU0oe3dpbmRvdzp0PT1udWxsP3ZvaWQgMDp0LndpbmRvd30pLGh5ZHJhdGlvbkRhdGE6KHQ9PW51bGw/dm9pZCAwOnQuaHlkcmF0aW9uRGF0YSl8fG40KCkscm91dGVzOmUsbWFwUm91dGVQcm9wZXJ0aWVzOmMzLHdpbmRvdzp0PT1udWxsP3ZvaWQgMDp0LndpbmRvd30pLmluaXRpYWxpemUoKX1mdW5jdGlvbiBuNCgpe3ZhciBlO2xldCB0PShlPXdpbmRvdyk9PW51bGw/dm9pZCAwOmUuX19zdGF0aWNSb3V0ZXJIeWRyYXRpb25EYXRhO3JldHVybiB0JiZ0LmVycm9ycyYmKHQ9emMoe30sdCx7ZXJyb3JzOnI0KHQuZXJyb3JzKX0pKSx0fWZ1bmN0aW9uIHI0KGUpe2lmKCFlKXJldHVybiBudWxsO2xldCB0PU9iamVjdC5lbnRyaWVzKGUpLG49e307Zm9yKGxldFtyLG9db2YgdClpZihvJiZvLl9fdHlwZT09PSJSb3V0ZUVycm9yUmVzcG9uc2UiKW5bcl09bmV3IGttKG8uc3RhdHVzLG8uc3RhdHVzVGV4dCxvLmRhdGEsby5pbnRlcm5hbD09PSEwKTtlbHNlIGlmKG8mJm8uX190eXBlPT09IkVycm9yIil7aWYoby5fX3N1YlR5cGUpe2xldCBpPXdpbmRvd1tvLl9fc3ViVHlwZV07aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpdHJ5e2xldCBsPW5ldyBpKG8ubWVzc2FnZSk7bC5zdGFjaz0iIixuW3JdPWx9Y2F0Y2h7fX1pZihuW3JdPT1udWxsKXtsZXQgaT1uZXcgRXJyb3Ioby5tZXNzYWdlKTtpLnN0YWNrPSIiLG5bcl09aX19ZWxzZSBuW3JdPW87cmV0dXJuIG59Y29uc3QgbzQ9cC5jcmVhdGVDb250ZXh0KHtpc1RyYW5zaXRpb25pbmc6ITF9KSxpND1wLmNyZWF0ZUNvbnRleHQobmV3IE1hcCksbDQ9InN0YXJ0VHJhbnNpdGlvbiIsVzA9cTBbbDRdO2Z1bmN0aW9uIHM0KGUpe1cwP1cwKGUpOmUoKX1jbGFzcyBhNHtjb25zdHJ1Y3Rvcigpe3RoaXMuc3RhdHVzPSJwZW5kaW5nIix0aGlzLnByb21pc2U9bmV3IFByb21pc2UoKHQsbik9Pnt0aGlzLnJlc29sdmU9cj0+e3RoaXMuc3RhdHVzPT09InBlbmRpbmciJiYodGhpcy5zdGF0dXM9InJlc29sdmVkIix0KHIpKX0sdGhpcy5yZWplY3Q9cj0+e3RoaXMuc3RhdHVzPT09InBlbmRpbmciJiYodGhpcy5zdGF0dXM9InJlamVjdGVkIixuKHIpKX19KX19ZnVuY3Rpb24gdTQoZSl7bGV0e2ZhbGxiYWNrRWxlbWVudDp0LHJvdXRlcjpuLGZ1dHVyZTpyfT1lLFtvLGldPXAudXNlU3RhdGUobi5zdGF0ZSksW2wsc109cC51c2VTdGF0ZSgpLFthLHVdPXAudXNlU3RhdGUoe2lzVHJhbnNpdGlvbmluZzohMX0pLFtjLGRdPXAudXNlU3RhdGUoKSxbZixoXT1wLnVzZVN0YXRlKCksW2csbV09cC51c2VTdGF0ZSgpLFM9cC51c2VSZWYobmV3IE1hcCkse3Y3X3N0YXJ0VHJhbnNpdGlvbjp2fT1yfHx7fSx5PXAudXNlQ2FsbGJhY2soQz0+e3Y/czQoQyk6QygpfSxbdl0pLHg9cC51c2VDYWxsYmFjaygoQyxUKT0+e2xldHtkZWxldGVkRmV0Y2hlcnM6TSx1bnN0YWJsZV92aWV3VHJhbnNpdGlvbk9wdHM6Un09VDtNLmZvckVhY2goaj0+Uy5jdXJyZW50LmRlbGV0ZShqKSksQy5mZXRjaGVycy5mb3JFYWNoKChqLEYpPT57ai5kYXRhIT09dm9pZCAwJiZTLmN1cnJlbnQuc2V0KEYsai5kYXRhKX0pLCFSfHxuLndpbmRvdz09bnVsbHx8dHlwZW9mIG4ud2luZG93LmRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24hPSJmdW5jdGlvbiI/eSgoKT0+aShDKSk6ZiYmYz8oYy5yZXNvbHZlKCksZi5za2lwVHJhbnNpdGlvbigpLG0oe3N0YXRlOkMsY3VycmVudExvY2F0aW9uOlIuY3VycmVudExvY2F0aW9uLG5leHRMb2NhdGlvbjpSLm5leHRMb2NhdGlvbn0pKToocyhDKSx1KHtpc1RyYW5zaXRpb25pbmc6ITAsY3VycmVudExvY2F0aW9uOlIuY3VycmVudExvY2F0aW9uLG5leHRMb2NhdGlvbjpSLm5leHRMb2NhdGlvbn0pKX0sW24ud2luZG93LGYsYyxTLHldKTtwLnVzZUxheW91dEVmZmVjdCgoKT0+bi5zdWJzY3JpYmUoeCksW24seF0pLHAudXNlRWZmZWN0KCgpPT57YS5pc1RyYW5zaXRpb25pbmcmJmQobmV3IGE0KX0sW2EuaXNUcmFuc2l0aW9uaW5nXSkscC51c2VFZmZlY3QoKCk9PntpZihjJiZsJiZuLndpbmRvdyl7bGV0IEM9bCxUPWMucHJvbWlzZSxNPW4ud2luZG93LmRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oYXN5bmMoKT0+e3koKCk9PmkoQykpLGF3YWl0IFR9KTtNLmZpbmlzaGVkLmZpbmFsbHkoKCk9PntkKHZvaWQgMCksaCh2b2lkIDApLHModm9pZCAwKSx1KHtpc1RyYW5zaXRpb25pbmc6ITF9KX0pLGgoTSl9fSxbeSxsLGMsbi53aW5kb3ddKSxwLnVzZUVmZmVjdCgoKT0+e2MmJmwmJm8ubG9jYXRpb24ua2V5PT09bC5sb2NhdGlvbi5rZXkmJmMucmVzb2x2ZSgpfSxbYyxmLG8ubG9jYXRpb24sbF0pLHAudXNlRWZmZWN0KCgpPT57IWEuaXNUcmFuc2l0aW9uaW5nJiZnJiYocyhnLnN0YXRlKSx1KHtpc1RyYW5zaXRpb25pbmc6ITAsY3VycmVudExvY2F0aW9uOmcuY3VycmVudExvY2F0aW9uLG5leHRMb2NhdGlvbjpnLm5leHRMb2NhdGlvbn0pLG0odm9pZCAwKSl9LFthLmlzVHJhbnNpdGlvbmluZyxnXSk7bGV0IF89cC51c2VNZW1vKCgpPT4oe2NyZWF0ZUhyZWY6bi5jcmVhdGVIcmVmLGVuY29kZUxvY2F0aW9uOm4uZW5jb2RlTG9jYXRpb24sZ286Qz0+bi5uYXZpZ2F0ZShDKSxwdXNoOihDLFQsTSk9Pm4ubmF2aWdhdGUoQyx7c3RhdGU6VCxwcmV2ZW50U2Nyb2xsUmVzZXQ6TT09bnVsbD92b2lkIDA6TS5wcmV2ZW50U2Nyb2xsUmVzZXR9KSxyZXBsYWNlOihDLFQsTSk9Pm4ubmF2aWdhdGUoQyx7cmVwbGFjZTohMCxzdGF0ZTpULHByZXZlbnRTY3JvbGxSZXNldDpNPT1udWxsP3ZvaWQgMDpNLnByZXZlbnRTY3JvbGxSZXNldH0pfSksW25dKSxFPW4uYmFzZW5hbWV8fCIvIiwkPXAudXNlTWVtbygoKT0+KHtyb3V0ZXI6bixuYXZpZ2F0b3I6XyxzdGF0aWM6ITEsYmFzZW5hbWU6RX0pLFtuLF8sRV0pO3JldHVybiBwLmNyZWF0ZUVsZW1lbnQocC5GcmFnbWVudCxudWxsLHAuY3JlYXRlRWxlbWVudChrZC5Qcm92aWRlcix7dmFsdWU6JH0scC5jcmVhdGVFbGVtZW50KFhFLlByb3ZpZGVyLHt2YWx1ZTpvfSxwLmNyZWF0ZUVsZW1lbnQoaTQuUHJvdmlkZXIse3ZhbHVlOlMuY3VycmVudH0scC5jcmVhdGVFbGVtZW50KG80LlByb3ZpZGVyLHt2YWx1ZTphfSxwLmNyZWF0ZUVsZW1lbnQodTMse2Jhc2VuYW1lOkUsbG9jYXRpb246by5sb2NhdGlvbixuYXZpZ2F0aW9uVHlwZTpvLmhpc3RvcnlBY3Rpb24sbmF2aWdhdG9yOl99LG8uaW5pdGlhbGl6ZWQ/cC5jcmVhdGVFbGVtZW50KGM0LHtyb3V0ZXM6bi5yb3V0ZXMsc3RhdGU6b30pOnQpKSkpKSxudWxsKX1mdW5jdGlvbiBjNChlKXtsZXR7cm91dGVzOnQsc3RhdGU6bn09ZTtyZXR1cm4gWk0odCx2b2lkIDAsbil9dmFyIFUwOyhmdW5jdGlvbihlKXtlLlVzZVNjcm9sbFJlc3RvcmF0aW9uPSJ1c2VTY3JvbGxSZXN0b3JhdGlvbiIsZS5Vc2VTdWJtaXQ9InVzZVN1Ym1pdCIsZS5Vc2VTdWJtaXRGZXRjaGVyPSJ1c2VTdWJtaXRGZXRjaGVyIixlLlVzZUZldGNoZXI9InVzZUZldGNoZXIiLGUudXNlVmlld1RyYW5zaXRpb25TdGF0ZT0idXNlVmlld1RyYW5zaXRpb25TdGF0ZSJ9KShVMHx8KFUwPXt9KSk7dmFyIFYwOyhmdW5jdGlvbihlKXtlLlVzZUZldGNoZXI9InVzZUZldGNoZXIiLGUuVXNlRmV0Y2hlcnM9InVzZUZldGNoZXJzIixlLlVzZVNjcm9sbFJlc3RvcmF0aW9uPSJ1c2VTY3JvbGxSZXN0b3JhdGlvbiJ9KShWMHx8KFYwPXt9KSk7ZnVuY3Rpb24gZDQoe2Vycm9yOmUscmVzZXRFcnJvckJvdW5kYXJ5OnR9KXtyZXR1cm4gY29uc29sZS5lcnJvcihlKSx3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJhYnNvbHV0ZSB0b3AtMCBsZWZ0LTAgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdy1zY3JlZW4gaC1zY3JlZW4gYmctY2FyZC1mb3JlZ3JvdW5kIixjaGlsZHJlbjp3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ3LWZ1bGwgaC1mdWxsIHAtMTAiLGNoaWxkcmVuOncuanN4cygiZGl2Iix7Y2xhc3NOYW1lOiJ3LWZ1bGwgaC1mdWxsIHAtMTAgYmctY2FyZCB0ZXh0LXByaW1hcnkiLGNoaWxkcmVuOlt3LmpzeHMoImRpdiIse2NsYXNzTmFtZToiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIixjaGlsZHJlbjpbdy5qc3hzKCJkaXYiLHtjbGFzc05hbWU6ImZsZXggaXRlbXMtY2VudGVyIGdhcC1bMC41ZW1dIHRleHQtbGcgZm9udC1ib2xkIHRleHQtY2VudGVyIHB5LTIiLGNoaWxkcmVuOlt3LmpzeChERSx7fSksIiBlbmNvdW50ZXJlZCBhbiBlcnJvciJdfSksdy5qc3goImJ1dHRvbiIse29uQ2xpY2s6dCxjaGlsZHJlbjp3LmpzeChOUCx7fSl9KV19KSx3LmpzeCgiZGl2Iix7Y2xhc3NOYW1lOiJ0ZXh0LTR4bCBmb250LW5vcm1hbCAiLGNoaWxkcmVuOiJNZXNzYWdlOiJ9KSx3LmpzeCgicHJlIix7Y2hpbGRyZW46ZS5tZXNzYWdlfSksZS5zdGFjayYmdy5qc3goZTQse3R5cGU6InNpbmdsZSIsY2xhc3NOYW1lOiJmb250LXNlcmlmIixjb2xsYXBzaWJsZTohMCxkZWZhdWx0VmFsdWU6ImVycm9yIixjaGlsZHJlbjp3LmpzeHModkMse3ZhbHVlOiJlcnJvciIsY2hpbGRyZW46W3cuanN4KHlDLHtjaGlsZHJlbjoiU3RhY2sgdHJhY2U6In0pLHcuanN4KHhDLHtjbGFzc05hbWU6InAtNCBiZy1wb3BvdmVyIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIixjaGlsZHJlbjplLnN0YWNrJiZ3LmpzeCgicHJlIix7Y2hpbGRyZW46ZS5zdGFja30pfSldfSl9KV19KX0pfSl9ZnVuY3Rpb24gZjQoKXtjb25zdCBlPXQ0KFt7cGF0aDoiLyoiLGVsZW1lbnQ6dy5qc3goQzMse2ZhbGxiYWNrUmVuZGVyOmQ0LGNoaWxkcmVuOncuanN4KGYzLHt2YWxBcGk6bmV3IFVUKCIvYXBpL3ZhbCIpfSl9KX1dLHtiYXNlbmFtZToiL2FwaS92YWwvc3RhdGljL2VkaXQifSk7cmV0dXJuIHcuanN4KHU0LHtyb3V0ZXI6ZX0pfURmLmNyZWF0ZVJvb3QoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJvb3QiKSkucmVuZGVyKHEuY3JlYXRlRWxlbWVudChxLlN0cmljdE1vZGUsbnVsbCxxLmNyZWF0ZUVsZW1lbnQoZjQsbnVsbCkpKTsK","/index.html":"PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KICA8aGVhZD4KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04IiAvPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiIC8+CiAgICA8dGl0bGU+VmFsPC90aXRsZT4KICAgIAogICAgPHNjcmlwdCB0eXBlPSJtb2R1bGUiIGNyb3Nzb3JpZ2luIHNyYz0iL2FwaS92YWwvc3RhdGljL2Fzc2V0cy9pbmRleC01MTNmN2E5Yy5qcyI+PC9zY3JpcHQ+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9hcGkvdmFsL3N0YXRpYy9hc3NldHMvaW5kZXgtMThjZmEyNmMuY3NzIj4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPSJyb290Ij48L2Rpdj4KICA8L2JvZHk+CjwvaHRtbD4K"}`
|
|
5
5
|
);
|
|
6
6
|
function createRequestHandler() {
|
|
7
7
|
if (typeof files !== "object") {
|